Files
playbook/docs/tsl/syntax_book/function/09_compiler.md
T
2026-01-11 12:58:27 +08:00

774 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### TSL编译工具
#### 内容
- 功能简介
- 应用场景
- 特性
- 编译范围
- TSL指令
- 调用效率的测试
- 依赖关系
#### 功能简介
将TSL代码编译成为可执行文件和动态库文件,支持windows与linux环境。
编译成为可执行文件,即开发的程序与应用可作为一个独立运行的小程序,不需要依赖天软客户端或天软解释器。
编译动态库文件,可将天软函数包编译成动态链接库,方便其它开发工具如C++等进行调用,为第三方开发工具提供支撑,如由TSL开发的算法等,让TSL语言程序可被更广泛地应用。
#### 应用场景
##### 内容
- 编译可执行文件
- 编译动态库
##### 编译可执行文件
此前,天软语言只支持脚本方式运行,即在.NET平台、本地解释器或.web平台中进行执行。若只作为天软的建模语言,已经满足了一般需求,然而,随着天软语言支持功能的扩展,其应用也越来越广泛,如用来开发编译桌面应用的天软TSL语言桌面开发工具,开发好的应用是需要通过TSL.exe去执行这个桌面应用的,这种方式不利于这些应用的发布,由此,编译成为可执行文件就显的很有必要。
另外,天软还提供了信创版的客户端,该客户端也是基于TSL语言的开发程,支持编译成可执行文件后,就可以将这些已开发的应用直接编译成windows或linux的可执行程序,用起来就会非常方便。
除此之外,还有例如一些管理工具,业务的应用的小程序等,都可生成为一个独立的可执行文件。
##### 编译动态库
可将天软TSL语言函数包创建成一个动态链接库(即DLL文件),并将该函数包进行输出。如此,在第三方工具如C++中,只需将生成的该动态库进行引入后,就可直接调用,不再需要天软TSSVRAPI等包的支持。
还可以将一些复杂的算法,通过TSL语言进行开发后编译成动态库,放入到其它语言工具中,就可以直接进行调用,不需要重复开发。
#### 特性
TSL编译工具的三特性:
其中,
独立编译:目前,除Linux中编译动态库还需依赖GCC相关功能才能完成外,其它编译工作,如windows中编译可执行文件与动态库,及Linux中编译可执行文件等,都已实现不依赖其它编译工具就可独立完成。
线程安全:输出的动态库可被多线程并发,且线程安全。
接口高效:利用TSL编译出来的动态库,接口调用所花费的时间消耗在亚微秒级别,效率非常高,大概一秒钟可以调用107次,能适用于交易级别的应用。
#### 编译范围
编译工具可将TSL语言的源代码与函数库,以及相关的资源文件,如配置类.ini文件,桌面开发工具中的窗体.dfm文件、窗口资源文件等,都可以通过天软编译工具生成一个单一的目标文件(即单一的可执行文件或.so或.dll),该文件的运行仅依赖天软运行环境的动态库,可方便程序的直接运行与业务应用的安装发布。
#### TSL指令
根据编译目标大致可分为三块指令:
可执行文件(.exe),编译命--buildexe=
可选项一: -buildgui,用来指定编译出来的目标是Windows
UI应用程序,默认为控制台应用程序。
可选项二:--buildico=,用来指定Windows icon图标。
以上两个可选项只在Windows下有效,在Linux中不生效。
动态库(.dll/.so),编译命--buildlib=
可选项一--exports=,可以指定输出的函数。
包文件,编译命令--build=
另外,还新增了对包执行等相关命令
如执行包文件,命令为:--runpkg=
加载包文件,命令为:--pkg=
等等,详情可参考TSL命令集列表。
目前提供的指令功能分布大致如下:
如,将TSLDemo01.tsl程序编译成可执行文件,操作如下:
在文件路径下进入控制台,执行以下命令:
tsl --buildexe=TSLDemo01.tsl --output=test01.exe
执行完后在当前路径中会新增一个test01.exe可执行文件,如下所示:
双击test01.exe即可启动运行该程序。
##### 内容
- TSL命令集列表
- 命令集详细解析
##### TSL命令集列表
执行命令行的命令为:tsl xxx
Windows命令集
| 命令 | 功能说明 | 备注 |
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| tsl.exe /? | 查看命令列表帮助,或TSL /? | 注意/前有一个空格 |
| -COMPILE\|-COMPILEC [/S] [-S] tslfiename | 将tsl/tsf文件编译为二进制格式文件。<br>-COMPILE命令生成的文件后缀为.TSB<br>- COMPILEC命令生成的文件后缀为.TSC<br>可选项<br>/S:递归模式,即加上该可选命令后,会从子目录中查找该函数。默认只在当前目录下查找。<br>-S:安静模式,不打印执行结果的信息 | 默认生成的文件与原文件同目录,如:<br>Tsl -COMPILE TsfDemo01.tsf<br>作用:编译成二进制文件后,函数与脚本照样可以正常调用,可以用于隐藏源代码。 |
| 编译指令 | | |
| --buildexe=tslfilename | 将指定tsl文件编译成可执行(.exe)文件,默认生成文件名为default.exe,可执行文件默认图标为tsl编译器图标 | |
| 其可选项 | -buildgui<br>指定编译的可执行文件为Windows UI应用程序 | 默认为控制台应用程序 |
| | --buildico=xxx.ico<br>指定可执行文件的图标 | 默认为TSL.exe的图标 |
| --buildlib=tsl(tsf)filename | 将指定tsl/tsf文件编译成动态库(.dll)文件 | 默认生成文件名为default.dll |
| 其可选项 | `--exports=func1[:exp1][,…]`<br>将指定函数名输出在动态库中 | 指定多个函数用逗号分割 |
| --build=tslfilename | 将指定tsl文件编译成.tsg包文件,默认生成文件名为default.tsg | 可以通过函数获取包中资源内容rs:<br>getglobalcache("@@tsl-resource@@",rs) |
| 编译指令的可选项 | --buildexe\|--buildlib\|--build通用的可选项 | |
| --output=filename | 给输出目标指定文件路径与名称 | 默认为<br>default.exe\|default.dll\|default.tsg<br>默认生成在当前路径下 |
| -strong | 编译所有引用,将所有依赖的引用都进行编译<br>缺省为仅编译调用的 | 解决调用了某些动态库不能被检测到的函数。 |
| --depends=fun1,fun2,… | 指定额外需要编译的函数列表 | 多个函数或路径用,分隔 |
| --dependsdir=dir1,dir2,… | 指定额外需要编译的函数路径 | |
| --excludes=fun1,fun2,… | 不编译某些函数 | |
| --resourcedir=foldername | 指定编译资源文件目录 | |
| --resourcepat=pat1,pat2,… | 指定资源文件的匹配串 | 需要搭配--resourcedir=一起使用 |
| -resourcekeepdir | 资源名保留相对路径 | |
| --extresource=filename1<br>[:keyname1],filename2… | 指定额外的资源 | |
| 运行指令 | | |
| --runpkg=packagename | 执行包文件 | 如:tsl --runpkg=runpkg.tsg |
| -eval tslstring | 执行TSL脚本串 | 如:tsl -eval “inttostr(100)” |
| tslfilename | 执行TSL脚本文件 | 如:tsl test.tsl |
| 其可选项 | -LIBPATH | 扩展函数查找路径 |
| | -TESTMULTITHREAD N | 线程调用,N为线程数 |
| | -NODEBUGSERVER | 不启用调试服务器 |
| | -DEBUGSERVER | 开启调试服务器 |
| | -DEBUGPORT port | 指定调试监听端口 |
| | -DEBUGLISTEN ip | 指定调试监听地址 |
| | -DEBUGTHREADS N | 指定调试用于网络通信的线程数 |
| | -WAITATTACH | 运行时等待调试程序连接 |
| | -DEBUGLOGIN 1\|0 | 是否需要进行用户登陆 |
| | --data-dir=datapath | 使用指定文件夹中的配置文件 |
| | --pkg=pgk1,pkg2… | 加载指定包中的函数 |
| 其它指令 | | |
| -ENCODE configstring | 生成加密串 | 用于数据库配置串加密 |
| -ENCODEDEBUGPASS | 生成密码串的加密串 | 用于远程调试配置中密码的加密 |
Linux命令集
| 命令 | 说明 | 备注 |
| ------------------------------------- | ---------------- | ------------------- |
| TSL /? | 查看命令列表帮助 | 注意TSL后有一个空格 |
| 其它命令参考Windows命令集,注意大小写 | | |
##### 命令集详细解析
提示:以下命令的操作展示都是在windows操作系统中完成的。
###### 内容
- 查看命令帮助
- 编译成二进制文件
- 编译成可执行文件
- 编译动态库
- 编译包文件
- 编译命令的其它可选项
- 执行包文件(.tsg)
- 生成加密串
- 执行TSL代码串
- 加密密码串
- 执行TSL脚本
###### 查看命令帮助
进入cmd中,执行:tsl /?
展示所有命令及其帮助说明,显示如下:
###### 编译成二进制文件
语法:-COMPILE|-COMPILEC [/S] [-S] tslfilename
功能:将指定脚本文件编译成二进制文件。
场景一:默认方式下将tsf文件生成二进制文件
输入:
tsl -COMPILE C:\DoTSL\CompileToExe\TsfDemo01.tsf
输出:在tsf文件同目录下生成.TSB文件。
新增文件如下:
####### 内容
- 可选项:/S 递归模式
- 可选项:-S 安静模式
####### 可选项:/S 递归模式
功能:编译时,若当前目录下无目标文件,会查找子目录下的目标进行编译
如:被编译的文件TsfFuncB.tsf在C:\DoTSL\CompileToExe\AAA目录下,命令运行当前路径是在C:\DoTSL\CompileToExe\,执行以下操作进行对比:
| 执行命令 | 结果说明 |
| ------------------------------------------------------------ | -------------------------------------------------------------------- |
| 默认情况下进行编译<br>命令行:tsl -COMPILE TsfFuncB.tsf | 执行结果:编译失败,找不到目标文件,原因是默认只在当前路径下查找。 |
| 在递归模式下进行编译<br>命令行:tsl -COMPILE /S TsfFuncB.tsf | 执行结果:编译成功,递归模式下,还会在当前目录下的子目录下进行查找。 |
执行具体表现如下:
####### 可选项:-S 安静模式
功能:安静模式,不打印执行结果的信息。
如:安静模式命令:tsl -COMPILE -S TsfFuncA.tsf
默认情况下的命令:tsl -COMPILE TsfFuncA.tsf
对比结果如下,安静模式下,不打印执行是否成功的提示信息。
###### 编译成可执行文件
命令:--buildexe=tslfilename
功能:将指定tsl脚本文件编译成可执行文件,同时会编译该函数的相关依赖。
场景:将目标文件编译成.exe可执行文件,默认文件名为default.exe
输入:tsl --buildexe=TD_TSL_ExePath.tsl
输出:在tsl文件同目录下生成.exe可执行文件。默认是一个控制台应用
运行结果和新增文件如下:
默认图标为天软客户端图标。
####### 内容
- 可选项:-buildgui 指定为Windows UI应用程序
- 可选项:--buildico= 指定图标
####### 可选项:-buildgui 指定为Windows UI应用程序
命令:-buildgui
功能:指定编译的可执行文件为Windows UI应用程序。
场景:将创建了界面的脚本编译成带有图形界面的.exe可执行文件,指定文件名为buildgui.exe
输入:tsl --buildexe=Test_GUIexe.tsl --output=buildgui.exe -buildgui
输出:在tsl文件同目录下生成一个带有图形界面的buildgui.exe可执行文件。
新增文件以及buildgui.exe执行结果如下:
以下是上述Test_GUIexe.tsl文件中的代码,仅供参考。执行下述案例中用到了界面tslvcl工具包。
```tsl
uses tslvcl;
app := initializeapplication();
app.createform(class(tfm), fm);
fm.show();
app.run();
type tfm = class(TVCForm)
uses tslvcl;
function Create(AOwner);
begin
inherited;
end;
end;
```
####### 可选项:--buildico= 指定图标
命令:--buildico=iconfile
功能:指定输出文件的图标,默认为天软可执行文件的图标。
场景:将输出的可执行文件的图标指定为ts.ico图标,文件名为buildico.exe
输入:tsl --buildexe=TD_TSL_ExePath.tsl --output=buildico.exe --buildico=ts.ico
输出:在tsl文件同目录下生成一个带有自定义图标的buildico.exe可执行文件。
注:自定义图标文件只能为.ico格式图片,否则编译时打印错误信息,但不会影响编译。
如发现编译后的可执行文件图标没有更改,可能是windows存有缓存。
###### 编译动态库
命令:--buildlib=tsl(tsf)filename
功能:将tsl/tsf文件编译成动态库, 同时会编译该函数或脚本中的相关依赖
场景:将指定的tsl文件及相关依赖编译到一个.dll动态库文件中
输入:tsl --buildlib=TD_TSL_ExePath.tsl
输出:在tsl文件同目录下生成.dll文件。tsl文件及其依赖会编译至单个文件中。
运行结果和新增文件如下:
####### 内容
- 可选项:--exports 输出指定函数名
####### 可选项:--exports 输出指定函数名
命令:--exports=func1[:exp1],…
功能:将指定函数输出在动态库中,多个函数用逗号分割
场景:将目标文件编译成动态库文件,并在动态库的函数列表中暴露函数TD_TSL_ExePath,别名为
ExePath
输入:tsl --buildlib=TD_TSL_ExePath.tsl --exports=TD_TSL_ExePath:ExePath
输出:在tsl文件同目录下生成.dll文件。
执行上述语句打印信息如下:
可以通过visual studio自带工具可以查看.dll文件暴露出的方法,如下所示:
###### 编译包文件
命令:--build=tslfilename
功能:将tsl/tsf文件编译成.tsg包文件, 同时会编译目标函数或脚本中的相关依赖
场景:将指定的tsl文件编译成.tsg包文件
输入:tsl --build=TD_TSL_ExePath.tsl
输出:在tsl文件同目录下生成.tsg包文件。
运行结果和新增文件如下:
###### 编译命令的其它可选项
在执行--build| --buildexe| --buildlib编译命令时,可添加的可选项的使用样例。
在不添加可选项时,编译默认会包含tsl文件中调用的tsf函数文件。不加额外参数的情况下,默认编译文件名为default.xxx,且文件生成在当前路径下。
####### 内容
- --output= 输出目标文件的名称与路径
- -strong 编译所有引用
- --depends= 指定函数列表
- --dependsdir= 函数扩展路径
- --excludes= 不编译指定函数
- --resourcedir= 资源扩展路径
- --resourcepat= 指定资源匹配串
- -resourcekeepdir 保留相对路径
- --extresource= 指定额外资源
####### --output= 输出目标文件的名称与路径
可选命令:--output=filename
功能:给输出目标指定文件路径与名称
场景:将目标文件编译成名为test.tsg的包文件,并且指定输出目录为子目录output
输入:tsl --build=TD_TSL_ExePath.tsl --output=.\output\test.tsg
输出:在当前运行目录下的output子文件夹中生成test.tsg文件。
####### -strong 编译所有引用
命令:-strong
功能:将所有依赖的引用都进行编译
场景:目标文件中调用了单元方法,单元中其它方法还调用了其它函数,将目标文件编译成.exe可执行文件,且将所有没有被调用到的引用也编译至生成文件中
输入:tsl--buildexe=TestDemo01.tsl -strong
输出:在tsl文件同目录下生成.exe可执行文件。
展示如下(包括不加该选项的对照):
其中,TestDemo01.tsl?的源代码如下:
```tsl
uses TSLUnitDemo01;
a := 10;
t := FuncA(a);
echo "TSLUnitDemo01.FuncA", t;
sleep(10 * 1000);
return t;
```
TSLUnitDemo01单元的源代码如下:
```tsl
unit TSLUnitDemo01;
interface
function FuncA(a);
function FuncB(a);
implementation
function FuncA(a);
begin
return a + 20;
end;
function FuncB(a);
begin
a := TD_Test(a);
return a * a;
end;
Initialization
FuncA(2);
Finalizationend.
```
####### --depends= 指定函数列表
命令:--depends=fun1,fun2,…
功能:指定额外的需要一起编译的函数列表,多个函数用,分隔
场景:目标函数不依赖该函数的情况下,将该函数与目标文件一起编译至动态库中
输入:tsl --buildlib=Test_depends.tsl --depends=Test01_TD
输出:在tsl文件同目录下生成.dll文件。
####### --dependsdir= 函数扩展路径
命令:--dependsdir=dir1,dir2,…
功能:指定其它需要被编译的函数路径
场景:将指定文件夹(子目录\test)中的所有函数一起编译至动态库中
输入:tsl --buildlib=Test_dependsdir.tsl --dependsdir=test
输出:在tsl文件同目录下生成.dll文件,该dll中包含指定路径下的所有文件。
####### --excludes= 不编译指定函数
命令:--excludes=fun1,fun2,…
功能:不编译指定函数,一般用于在依赖范围内时需要不被编译的场景
场景:将一个调用了Test01_TD函数的脚本文件编译成可执行文件,并且指定Test01_TD函数不被编译。
输入:tsl --buildexe=Test_depends.tsl --excludes=Test01_TD
输出:生成可执行文件,该文件中不包含Test01_TD函数
其生成过程的表及与运行该可执行文件的表现如下:运行会报找不到Test01_TD函数的错,说明打包中没有该模型。
注:编译过程中的打印信息是指分析到的依赖关系或资源文件,像上面Test01_TD这种被依赖但是不需要编译的文件还是会被打印在提示信息中。
####### --resourcedir= 资源扩展路径
命令:--resourcedir=foldername
功能:指定其它需要被编译的资源路径。
场景:在编译动态库文件时,指定子目录\ resourcedir\下的文件一起编译至动态库中
输入:tsl --buildlib=Test_resourcedir.tsl --resourcedir=resource
执行上述语句,打印信息如下:
资源文件夹中文件如下:
####### --resourcepat= 指定资源匹配串
命令:--resourcepat=pat1,pat2,…
功能:将指定目录下的符合匹配串的文件编译进目标文件中,需要通过--resourcedir=进行指定目录,指定当前目录时,用--resourcedir=.\。
场景01:在编译成可执行文件时,将\ resource
\目录下的所有.ini文件编译至生成文件中。
输入:tsl --buildexe=Test_resourcepat.tsl --resourcedir=resource
--resourcepat="\*.ini"
输出:在同目录下生成了.exe文件,并一起编译了\ resource \目录下的ini文件
子目录\ resource
\文件夹如下:可以看出上面的命令中只编译了两个ini,其它文件没有被编译。
Test_resourcepat.tsl中代码如下:
```tsl
echo "\r\n";
echo "Running!!\r\n";
getglobalcache("@@tsl-resource@@", rs); // 获取可执行文件中的所有资源文件信息
echo tostn(rs);
sleep(20 * 1000);
return 1;
```
执行目标文件打印如下:可以到符合条件的ini文件信息
场景02:编译可执行文件时,将当前路径及其子路径下的pat.ini文件一起编译。
输入:tsl --buildexe=Test_resourcepat.tsl --resourcedir=.\
--resourcepat="pat.ini"
输出:生成.exe文件,并编译了两个路径下的pat.ini文件
执行命令目录下的pat.ini文件展示如下:
####### -resourcekeepdir 保留相对路径
命令:-resourcekeepdir
功能:资源文件名中保留文件的相对路径
场景:编译可执行文件时,编译pat.ini文件,并保留相对路径,目标源代码中输出当前资源数据。
输入:tsl --buildexe=Test_resourcekeepdir.tsl --resourcedir=.\
--resourcepat=pat.ini -resourcekeepdir
输出:生成可执行文件。
执行可执行文件:资源文件名中加入了相对路径
下面是不加相对路径命令的生成结果:可对比查看差异
####### --extresource= 指定额外资源
命令:--extresource=filename1[:keyname1],filename2…
功能:将指定资源加入编译,一般用于需要额外加入资源文件时使用,支持相对路径的指定
场景:在编译可执行文件时,将ts.ico图标文件一起编译
输入:tsl--buildexe=Test01_TD.tsl?--extresource=ts.ico
输出:生成.exe文件
执行编译与运行可执行文件展示:资源包中存在ts.ico文件
其中Test01_TD.tsl?的源程序如下:
```tsl
echo "\r\n";
echo "Running!!\r\n";
getglobalcache("@@tsl-resource@@", rs); // 获取包中的资源文件信息
echo tostn(rs);
sleep(20 * 1000);
return 1;
```
###### 执行包文件(.tsg)
命令:--runpkg=packagename
功能:执行包文件
场景:执行一个写入本地test_runpkg.txt文件中的包文件
输入:tsl --runpkg=runpkg.tsg
输出:运行.tsg包文件,在本地新增test_runpkg.txt文件,并写入内容
其中,包中目标文件的的源代码如下:
```tsl
content := "test_runpkg";
writefile(rwraw(), "", "D:\\test\\tslCmdTest\\runpkg\\test_runpkg.txt", 0, 1000, content);
return 1;
```
####### 内容
- 可选项:--pkg= 加载指定资源包
####### 可选项:--pkg= 加载指定资源包
命令:--pkg=pkg1,pkg2…
功能:执行包文件的同时,加载指定包文件。
场景:执行包文件,加载并调用指定包中的函数
输入:tsl --runpkg=main.tsg --pkg=data.tsg,SumVol.tsg
输出:运行结果如下
注:
包main.tsg对应的TSL代码如下:
```tsl
echo evalData(0);
function evalData(n)
begin
data := data();
ret :=
case n of
0:SumVol(data);
1:AvgVol(data);
2:SumAmount(data);
3:AvgAmount(data);
end;
return ret;
end;
```
包data.tsg对应的TSL代码如下:
```tsl
function data()
begin
return array(
("StockID":"SZ000002", "收盘价":7.79, "成交量":189366181.0, "成交金额":1482908609.8),
("StockID":"SZ000002", "收盘价":7.64, "成交量":145843421.0, "成交金额":1110094218.41),
("StockID":"SZ000002", "收盘价":7.53, "成交量":136469106.0, "成交金额":1027113710.84),
("StockID":"SZ000002", "收盘价":7.77, "成交量":211713302.0, "成交金额":1624520449.34),
("StockID":"SZ000002", "收盘价":7.53, "成交量":159372804.0, "成交金额":1205270122.69),
("StockID":"SZ000002", "收盘价":7.48, "成交量":97780993.0, "成交金额":732008884.19)
);
end;
```
包SumVol.tsg对应的TSL代码如下:
```tsl
function SumVol(data)
begin
return sum(data[:, "成交量"]);
end;
```
###### 生成加密串
命令:-ENCODE configstring
功能:生成指定字符串的加密串,可用于数据库配置串的加密处理。
场景:对数据库的连接串进行加密处理
输入:tsl -encode "Server=127.0.0.1;Database=tsBase;Uid=TinySoft;Pwd=admin;"
输出:返回加密串
###### 执行TSL代码串
命令:-eval tslstring
功能:执行TSL语言代码串
场景:执行字符串” datetostr(20231106T)”
输入:tsl -eval "datetostr(20231106T)"
输出:返回串执行的结果
###### 加密密码串
命令:-ENCODEDEBUGPASS password
功能:生成密码串加密后的串,用于远程调试配置中对密码信息的加密隐藏
场景:生成密码“admin”的加密串
输入:tsl -encodedebugpass admin
输出:得到加密后的密码串
###### 执行TSL脚本
命令:tsl filename
功能:执行指定tsl程序,若不在当前路径下,需要加上路径信息。
场景:执行TSLDemo01.tsl
输入:tsl TSLDemo01.tsl
####### 内容
- 可选项:-LIBPATH 扩展函数查找路径
- 可选项:-TESTMULTITHREAD多线程执行
- 可选项:--pkg= 加载指定资源包
####### 可选项:-LIBPATH 扩展函数查找路径
命令:-LIBPATH libpath
功能:设置函数(.tsf)的搜索路径,多个路径用分号分割,当前路径为.场景:执行TSLDemo01.tsl脚本,程序中有调用函数TsfFuncA(),且该函数不在当前目录下
输入:tsl TSLDemo01.tsl -libpath .\aaa\
输出:如下图所示,成功调用TsfFuncA ()函数
TsfFuncA函数的路径如下:
####### 可选项:-TESTMULTITHREAD多线程执行
命令:-TESTMULTITHREAD N
功能:指定N个线程调用脚本
场景:起用5个线程调用testMultiThread.tsl,该脚本中执行打印当前线程的id号
输入:tsl testMultiThread.tsl -TestMultiThread 5
输出:如下图,打印了5个不同线程的id号,说明函数被调用了5次
其它更多请查看命令列表的介绍。
####### 可选项:--pkg= 加载指定资源包
命令:--pkg=pkg1,pkg2…
功能:加载包文件。
场景:执行调用包中的函数的脚本
输入:tsl TestAAA.tsl--pkg=TestB.tsg
输出:运行结果如下
注:上述中给出了不加载包时执行的结果,方便功能体现。
#### 调用效率的测试
通过上述测试可以看出:调用TSL编译的动态库1千万次,只花费了1.9秒,属于亚微秒级别的调用,可用于交易级别的开发中。
#### 依赖关系
##### 内容
- 查找执行文件的依赖关系
- SysGetFuncdepends
##### 查找执行文件的依赖关系
在实现编译成可执行文件以及动态库的过程中,有一个重要的过程,即查找执行文件的依赖关系。
因此,天软提供了SysGetFuncdepends模型,专门获取指定目标的依赖关系。
查找的依赖关系范围包括如下:
##### SysGetFuncdepends
范例
范例01:查找函数的依赖关系
```tsl
obj := Findfunction("stockzf");
v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2);
return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2);
```
其中,依赖的函数信息结果截图如下:
二进制函数信息截图如下:
范例02:查找类相关函数的依赖关系
```tsl
obj := Findfunction("getPYStringList");
v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2);
return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2);
```
其中,函数getPYStringList调用了天软内置类THashedStringList。
返回:
其中,二进制类信息展开如下: