编写一个Python编译器来练习

2024-09-25 00:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我读了很多关于CPU和架构的书,主要是操作码,集成电路等等。我做了几年python开发人员,我想在编写machinecode方面得到一些实践。在

为了好玩,我想把一个非常简单的python脚本编译成machinecode来练习它。脚本如下:

a = 2
b = 3
c = a + b
print c

我用python编写编译器,因为我在C语言方面不如python好。我已经查了一下,下面的python库可以使用,这可能会有帮助,即

^{pr2}$

我仍然需要找到英特尔酷睿i5的操作码,但这应该很容易。在

我的问题如下:

1)如何将操作码写入文件?换言之,假设将寄存器设置为包含值2的操作码是0010如何将其作为程序执行第一行的前四个数字写入?在

2)如何告诉操作系统,无论是OSX还是Ubuntu,将程序加载到物理内存中?我假设编译器要做的第一件事就是把操作系统的指令写到结果二进制文件中?在

3)如果您知道任何可以帮助我的资源,我们将不胜感激。在


Tags: 文件脚本编译器开发人员架构数字cpu寄存器
2条回答

编译python并不容易。您可以看看pypy,它有一个实时编译器。在

另一个选择是从python bytecode开始,如果python程序是由标准Cpython解释器运行的,则该文件保存在.pyc文件中。 这有有限数量的指令,你必须为你的CPU生成汇编/可执行代码。在

请注意,您还必须编写大量的代码来实现所有内置类型和函数!在

你在那儿计划的项目可真是个大工程。除了学习编译器的工作原理外,您还需要阅读诸如ELF之类的可加载文件格式,以及大量有关操作系统详细信息的信息。在

我建议您将发出一个汇编文件作为编译器的输出。然后可以使用现有的汇编程序将文件转换为机器代码。事实上,这是大多数C编译器(包括GCC)在“表面之下”所做的事情。在

编辑:编译器或汇编程序的输出通常是对象文件。稍后,链接器会将其与其他对象文件相结合。编写整个工具链、编译器、汇编程序、链接器和其他相关工具很容易就要花费数个人年的时间。从这个角度看,我不认为你应该看到一个直接的解决方案,如使用现有的汇编程序和链接器是作弊。在

相关问题 更多 >