本文目的和学习目标
目的
本文展示了如何编译和使用洛书编程语言内核。
学习目标
- 学会使用lpt拉取内核源码
- 学会使用GCC工具链中的make来编译内核
- 意识到洛书的本体是内核,交互式界面也依靠调用内核工作
前置知识
洛书内核一般随版本而发表,所以仓库中不支持使用install命令直接下载编译好的内核,但是支持使用source命令拉取内核源码并编译。stdlib系列模块也是如此。
使用lpt拉取内核源码
lpt提供了源码拉取功能,使用source命令。拉取源码的命令如下
losu -r source losu_core
之后工作目录下就会出现一个名为losu_core的目录,里面即是洛书内核源码。
lpt会自动处理平台和架构信息。当然,这依赖于lpt的配置文件。
使用make编译内核源码
在losu_core目录下打开命令行,调用make
make
Linux系统直接输入这行命令即可。如果是Windows下的mingw32编译器,make的名称发生了变化,这时应输入
mingw32-make
其他实现中make的调用方式视具体而定。
之后make会查找losu_core目录下的makefile文件,根据其中的配置信息编译内核。最后生成的内核文件是名为为libeasylosu的动态库。在Linux系统下的具体名称为libeasylosu.so,在Windows下的具体名称为libeasylosu.dll。
内核的使用方式
替换洛书交互界面的内核版本
洛书交互界面,即在命令行中输入losu运行的那个文件,本质上只是个用户友好的操作接口,它依然靠调用洛书内核工作。
在洛书的工作根目录中可以发现一个洛书内核。将自己编译的内核替换掉这个内核即可。
至于为何要替换掉内核,因为在自己机器上编译的内核可能比官方发布的运行速度快,但只是可能,并且一般快不了多少。
在编译模块时链接到内核
洛书模块的编译过程中,除了包含els.h文件,就是链接洛书内核。洛书内核本质上是一个动态库,模块运行时要使用洛书C API,本质上也是调用内核中的代码。
不建议将内核编译静态编译入模块中,这会带来严重的内核版本间不兼容问题。使用链接动态库的方式,可以保证在一个洛书脚本运行过程中调用的内核代码只有一份版本。
实现洛书嵌入C/C++工程
前文说到,洛书交互界面的本质也是调用洛书内核。换言之,洛书内核才是洛书编程语言的本体。在C/C++项目中使用洛书内核,调用vm_dostring等洛书C API,就可以实现洛书嵌入C/C++项目。
关于编译过程中的warning
编译过程中,gcc可能会报一些warning,尤以Windows最多(小小吐槽一下)。这是因为内核代码中使用了部分GNU扩展函数,但这些warning并不影响内核的可靠性。
实际上,本文介绍的方法,也是洛书开发者日常编译洛书内核的方法,只是他不用拉取源码而已。