我给自己设定了一个挑战:在 10 小时内编写一个自托管 C 编译器。这就是结果,加上大量的清理工作(检查 10 小时版本的“releases”)。
执行:
语言:
if
, while
, do``while
, return
。=
, ?:
(三元), ||
, &&
, ==
, !=
, <
, >=
, +
, -
, *
, ++
, --
(操作后), !
, -
(一元), []
, ()
true
和false
文字。字符串文字,具有自动连接功能。总体理念是:仅包含可减少总代码大小的功能。这在insane
分支中被发挥到了极致。
git clone http://github.com/Fedjmike/mini-c
cd mini-c
make selftest
这将首先通过用 GCC 编译 mini-c 来生成cc
。然后它通过用cc
编译 mini-c 来生成ccself
。最后,它使用ccself
进行test/triangular
,并检查结果。你应该得到这样的东西:
$ make selftest
gcc -std=c11 -Werror -Wall cc.c -o cc
cc cc.c
gcc -m32 a.s -o ccself
ccself tests/triangular.c
gcc -m32 a.s -o triangular; triangular 5; [ $? -eq 15 ]
如果您使用的是 Windows,则需要签出windows
分支。在 64 位 Linux 上,您可能需要sudo apt-get install gcc-multilib
才能编译和运行 32 位代码。
另一个微观 C 编译器是rswier
的 c4。他实现了更多的 C,但我想说我的更简单:)。此外,c4 为其自己的 VM 生成代码,而我的 VM 在使用 x86 汇编和 cdecl 方面存在很大困难。
我编写了另一个更高级的 C 编译器。一探究竟。它也是自托管的,但具有更完整的功能集,甚至还添加了一些实验性的内容,例如 lambda。
版权所有 (c) 2015 萨姆·尼普斯
特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地使用本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或销售软件的副本,并允许向其提供软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有者均不对因本软件或本软件中的使用或其他交易而产生或与之相关的任何索赔、损害或其他责任负责,无论是合同、侵权行为还是其他行为。软件。