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