我正在尝试(一次一步)构建我自己的 Forth 副本以在 Mac OS X 上运行。
我目前有一个在 Apache 和 localhost 上以 PHP、Ruby 和 Python 运行的 Forth 版本。
我想用 C 语言制作一个 Forth 版本,它将创建一个 Forth 的本机可执行版本,它可以生成任何已编译 Forth 代码的自己的本机可执行文件。对不起半递归的句子。我的目标是从 C 开始,并以我自己的 Forth 编译器结束(不再在任何 C 代码中运行)。
我的出发点是尝试让一个最小的测试程序作为终端的二进制可执行文件运行。一旦我能够理解现有的 C 编译器在做什么,我就可以根据自己的目的修改它的方法。
我用 C 语言创建了一个小的“hello world”程序,最后得到了一个 8,497 字节的可执行文件,其中大部分由 0x00 数组(可能是缓冲区)组成。我的猜测是包含了整个 stdio 库。
接下来,我创建了我能想到的最小的 C 程序(除了一个完全为空的程序——我希望能够在生成的十六进制中找到我的代码):
int main(void)
{
char testitem;
testitem = 'A';
return -1;
}
这应该给我尽可能少的开销,因为 ASCII A 的存储和所有的返回值都很容易找到。
相反,我最终得到了一个 4,313 字节的文件。0x41(ASCII 'A')有四个位置,但没有一个是 MOV 立即字节指令的一部分。大概 0x41 被存储为常量数据并加载了不同的 MOV 指令。
同样有很多 0x00 数组(3,731 字节,或者除了 402 字节之外的所有)。大概在目标文件中有某种标题数据(它在终端中正确运行并发出信号-1),谁知道还有什么。
目前我并不关心应用程序包——在终端中运行是我的短期目标。一旦我完成了第一步,我就可以继续进行完整的应用程序。
关于如何确定我需要在目标文件中拥有什么才能使其正确用作终端工具的任何建议?