Tea-模块化编程

优质
小牛编辑
132浏览
2023-12-01

在 Tea 中,一个源文件被称为一个编译单元(sourceunit)。 多个源码组成一个模块(module)。 多个模块组成一个项目(project)。 一个独立的模块可以编译为一个可执行文件、动态链接库或静态链接库。

文件夹结构规范

pkg1/
    bin/                  生成的二进制文件
        debug/            调试版本的生成文件
            hello.exe
        release/          非调试版本的生成文件
        publish/          发布版本的文件(安装文件)
        obj/              编译器使用的临时生成文件
    src/                  源码
    libs/                 依赖的第三方库
        zlib/    
            zlib.tpkg
    docs/                 文档
    branches/             当前包的历史版本
        1.0/
            hello.tpkg
    hello.tpkg
pkg2/
pkg3/
hello.tproj 

文件格式列表

.tea           源码文件         
.tpkg          模块文件         
.tproj         项目文件    
.tdoc          文档文件 
.tml           数据文件         取代    .res, .xml, .ini, .json
.tlib          库文件(模块编译所得)           可直接转换为    .s(汇编)    .obj(win)  .o(linux)   .a(mac)   .lib(win 静态库)    .dll(win 动态库)      .exe(win)    
.ts            TeaScript 源码文件

源码级别依赖

在 Tea 源码中可以直接导入另一个源码的文件。

假设有如下目录

folder/
    folder/sub/
        folder/sub/c.tea
        folder/sub/d.tea
    folder/a.tea
    folder/b.tea

如果文件 a.tea 需要依赖 b.tea ,那么在 a.tea 中,使用如下代码:

import "b.tea"; // 其中 .tea 可以省略。

如果文件 b.tea 需要依赖 folder/sub/ 中的所有源码,那么在 b.tea 中,使用如下代码:

import "sub/";  // 其中末尾的 / 可以省略。

模块级别依赖

一个项目往往有上百个源码,如果每个源码都通过源码方式依赖,则势必非常繁琐。因此 Tea 来允许通过包方式来统一组织源码。 首先,新建一个包定义文件,它是一个以 .teapkg 为扩展名的文件,文件内容可以为空。

folder/
    folder/sub/
        folder/sub/c.tea
        folder/sub/d.tea
    folder/a.tea
    folder/b.tea
    folder/mypkg.teapkg

那么,所有 folder 文件夹下的文件都被认为属于同一个包。它们之间无需额外地代码就可以直接互相依赖。

模块冲突

如果依赖的两个模块包含了同名的对象。那么直接同时依这赖两个模块将引起歧义。

a.tea:

class Obj {};

b.tea:

class Obj {};

c.tea:

import "a.tea";
import "b.tea";

class MyObj : Obj {} // 错误: Obj 具体指哪个模块有歧义。

解决方法:c.tea:

import "a.tea";
import B = "b.tea";

class MyObj : Obj {} 
class MyObj : B.Obj {}

同一个模块内不允许有相同的对象。如果是模块内的源码和模块外的源码冲突,则优先使用模块内的源码。

系统内置模块

在路径中,~代表系统库所在位置。系统库的位置默认是编译器所在目录的 libs 文件夹的位置。也可以在编译时通过 -stdlib 命令指定。
其中, "~/system" 模块会被编译器自动导入,因为它包含了编译器自动生成的函数的源码。