Vacietis,一个针对Common Lisp的C编译器

2020-12-26 00:13:07

Vacietis是Common Lisp系统的C编译器.Vacietis的工作原理是将C代码加载到Common Lisp运行时中,就像Lisp代码一样,然后可以在其中进行编译或回避。重载的C代码具有与常规CL代码相同的函数调用约定,并使用相同的数字表示形式。 C内存由regularCommon Lisp数组支持。Vacietis带有在便携式Common Lisp中实现的libc。*安装:----------您可以从github:git clone https://github.com/获得Vacietis。 vsedach / Vacietis.git所有Vacietis依赖项都可以通过Quicklisp(http://www.quicklisp.org/)获得。如果您将Vacietis inquicklisp / local-projects /放在其中,则可以使用(ql:quickload" vacietis")*加载它:用法:----- C代码的读取方式与常规Lisp代码相同通过使用readtables :(让(((* readtable * vacietis:c-readtable)(vacietis:* compiler-state *(vacietis:make-compiler-state))))(read< some stream>))Vacietis阅读器会跟踪由* compiler-state *绑定的编译器状态对象中的type和preprocessormacro声明。公开了这种机制,使创建C REPL之类的东西成为可能。为简化C文件的加载,提供了一个便捷函数,该函数在调用LOAD:(vacietis:load-c-file&#之前设置了readtable,编译器状态和其他调试信息34; /foo/bar/file.c")*编译器可执行:-------------------系统vacietis.vcc产生一个玩具C编译器可执行文件一个单文件C程序并生成一个可执行程序。当前,它需要CCL,CLISP或SBCL才能工作。运行示例(ql:quickload" vacietis.vcc")将在Vacietis源目录中生成可执行文件vcc / vcc。$ ./vcc ../test/programs/hanly-83-scanf/main.c $。/ a.out输入8个数字,用空格或< return> s> *分隔*数字技术细节:-----------------照原样使用Common Lisp的内存模型,因此原始数据类型(char,int,float等)的sizeof全部为1。这对于大多数C代码来说都不是问题,但是某些C程序声称可移植而假设可以将事物转换为要操纵的字符数组。这些程序无法在Vacietis下工作。Vacietis运行时和内存模型的基本思想来自Scott L. Burson的Lisp机器的Zeta-C编译器:http://www.bitsavers.org/bits/ TI / Explorer / zeta-c / Oleg Kiselyov首次演示了表示指向任意C lvalue封闭式的指针的技术:http://okmij.org/ftp/Scheme/pointer-as-closure.txt通过Fabrice Bellard的TCC传递预处理器/令牌生成器/解析器:http://bellard.org/tcc/*获取代码和帮助:------------------- ----官方的Vacietis存储库位于:https://github.com/vsedach/vacietis网络上有Vacietis邮件列表:http://groups.google.com/group/vacietis错误报告可以发送到邮件列表:http://groups.google.com/group/vacietisthe github问题跟踪器:https://github.com/vsedach/vacietis或直接发送给作者:[email protected]*单元测试:----- -----(ql:quickload" vacietis.test")(vacietis.test:run-tests)The Va cietis测试套件包括用于测试编译器和libc的各种代码。* TODO:-----指针缩放-枚举:为枚举标签分配任意值-通过值传递结构调用-main()的传递参数-实现重载类范围正确(请参阅H& S 147)-libc stdio:二进制流-libc stddef:offsetof- libc signal- libc stdlib:div / ldiv,srand,exit clean,bsearch,qsort- libc time- libc setjmp *支持的东西可能会赢: ----------------------------------------尝试将字符数组转换为其他类型( mmap)-任何类型的GCC扩展*许可信息--------------------- Vacietis由Vladimir Sedach< [email protected]>创作;最新的版权年是2012年。Vacietis已获得LLGPL的许可(有关详细信息,请参见分发中包含的文件LICENSE)。Vacietis libc的某些部分可能来自Zeta-C(其作者Scott L. Burson向公共领域发行)。和ErikAndersen的< [email protected]> LGPL许可的uClibc(http://www.uclibc.org/)