通过包含源模块与编译模块管理可复用过程
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgSourceCompiledModule
- 最后更新: 2021-10-29
如何通过包含源模块与编译模块来管理 FreeBASIC 可复用过程。
(在 Josep Roca 帖子的帮助下编写)
前言:
使用旧操作系统(如 DOS)时,只要程序不是很短就必须按模块分别编译,因为编译器可用内存很小(Quick Basic 4.5 约为 200 KB)。
现在,使用现代 PC 和操作系统,这个编译限制提高了约 10000 倍,大文件一次性编译的时间已经可以接受,在 FreeBASIC 中尤为如此。
这允许使用另一种方法(而不是已编译文件的库)来管理可复用的用户过程。
首先,将可复用的用户过程源代码按功能分组到不同的源模块中。
然后,根据使用的每种方法,流程会有所不同。
为了简化下面的说明,假设只有一个包含主程序的源文件,它调用源模块中的各种可复用用户过程。
但可以轻松扩展这些方法,以考虑分布在多个源文件中的主程序。
第一种方法:存储在库文件中的编译模块在链接过程中与编译后的主程序一起包含
该方法的原则是只访问已编译的用户过程。
将不同的模块(包含要复用的用户过程源代码)转换为目标文件,然后存储到库文件中(使用 -lib 编译选项)。
最后编译主程序的源文件,然后与库链接,生成可执行文件(使用 -l <libname> 编译选项,或在主程序源代码开头放置 #inclib "libname" 指令)。
对于每个编译的模块,如果至少调用了一个过程,则整个模块将被添加到最终的可执行文件中。
因此,添加到可执行文件的代码粒度在模块级别(粗粒度)。
第二种方法:将源模块直接包含到主源程序中一次性编译
该方法的原则是完全访问用户过程的源代码。
将不同的模块(包含要复用的用户过程源代码)直接包含到主程序源代码中(对每个模块使用 #include "file" 指令,放在主程序源代码的开头)。
最后,将产生的大源文件一次性编译为可执行文件。
由于编译器处理单个源文件,所有可复用的用户过程都可以声明为 Private(使用库显然是不可能的,因为链接过程中需要外部链接)。
因此,只有真正被调用的 Private 过程才会保留在可执行文件中。
因此,添加到可执行文件的代码粒度在基本过程级别(细粒度)。
注意:
编译器会移除未被调用的 Private 过程,但目前对于仅被其他未被调用的 Private 过程调用的 Private 过程无效,因为第一类过程看起来是被调用的。
问题在于单遍编译器只使用一个简单标志来跟踪过程的"使用"状态,该标志在过程被访问时就会被设置,无论从何处访问。
参见
返回 目录