import语句

库、名字空间体系使aardio程序能更好的支持的模块化编程。请参考:名字空间

导入库

import语句将一个外部名字空间导入到当前名字空间,import 语句首先会在当前名字空间下查找同名对象是否存在,查找时不会触发名字空间的元方法,如果同名对象已经存在并且不是指向相同的库 - 则会报错。import保证不会在同一线程重复加载相同的库。外部库内的代码在一个线程中仅运行一次。

例如:

import a.b.c //将外部库a.b.c导入当前名字空间

import 语句内使用的库名字空间第一个字符不能为下划线(_)。

aardio的库有三种:


在发布exe文件时,编译器将会自动分析程序中引用到的库并加入目标程序中。并丢弃未引用的库。

1、如果希望引用一个库,但发布EXE时希望排除该库(不添加到目标程序),请使用 global.import 导入库 - 以告知发布程序你希望引用一个库,但是不希望添加到目标程序。

2、如果应用程序不希望引用某个库,但是发布后的EXE可能在将来通过动态加载aardio代码引用该库,这时候可以将 import 语句移到注释中 - 告知发布程序你不希望引用某个库,但是希望添加到目标程序中。

3、在开发环境中调试运行时,aardio 为了调试与优化的需要可能会加载一些你编写的代码中并没有引用的库,例如标准库 win.ui 默认会加载 win.ui.ctrl 名字空间下的一些基础控件库,而这些库又会引用一些基他的标准库。aardio 为了优化启动速度,只有在发布生成EXE时才会完全排除未引用的库。 你完全可以像其他开发工具一样,每次都先生成 EXE 后再运行,当然这很慢。当然你也可以使用 aardio 提供的快捷调试方式,但要明确有极少的库只有在发布后运行才能检测到是否缺少 import 语句。

详解import导入库的过程

import导入库时查找顺序为“内核库->标准库->用户库”。
外部库文件的物理路径与名字空间路径保持一致(将物理路径中的斜杠替换为圆点就是名字空间路径)。

我们以下面的import语句为例详解导入库的过程:

import time.ole //将外部库time.ole导入当前名字空间


1、查询库缓存

已导入的库会直接加载到当前名字空间,不会重复导入相同的库,否则继续下面的过程。

2、查询内核库

如果内核库中存在该库,导入库,否则继续下面的过程。

3、查找编译嵌入EXE的库文件

aardio会优先加载编译发布EXE时嵌入EXE文件的库模块。

4、查询标准库

如果仍然没有找到库。在启动当前进程的EXE文件根目录下的的lib目录下查询库文件,从根目录逐渐向下层子目录开始搜索,查找顺序如下(按查找顺序先后排列):

~\lib\time.ole.aardio
~\lib\time\ole.aardio
~\lib\time\ole\_.aardio

如果找到aardio代码文件或编译后的二进制aardio文件,加载并运行,并将文件路径作为参数传递给目标文件。


5、查询用户库

如果仍然没有找到,按第三步的过程,在当前工程目录\lib目录,或启动文件所在目录\lib目录下查找用户库, 查找顺序如下(按查找顺序先后排列):

\lib\time.ole.aardio
\lib\time\ole.aardio
\lib\time\ole\_.aardio

如果找到aardio代码文件或编译后的二进制aardio文件,加载并运行,并将文件路径作为参数传递给目标文件。


注意在aardio开发环境中 "~\lib\" 表示aardio.exe所在目录下的标准 库,而 "\lib\"表示虚拟根目录下的用户库。对于一个工程来说工程目录就是虚拟根目录,对于一个在工程之外单独运行的aardio文件 - 文件所在的目录就是虚拟根目录。对于发布后的EXE文件来说,"\lib\"与"~\lib\"默认都是指EXE文件启动目录,在创建线程、协程时 - 可以在参数中改变虚拟根目录


6、查询扩展库

如果当前是运行在aardio开发环境中,仍然没有找到匹配的库文件,aardio会检查扩展库列表并安装扩展库。

6、检查库是否加载成功

最后aardio检查目标文件是否成功运行,
目标文件是否创建了新的名字空间全局名字空间..time.ole。
如果导入名字空间成功,则导入当前名字空间( self 名字空间 )。