编写Python编译器进行练习

时间:2013-01-13 17:43:06

标签: python compiler-construction

最近我一直在阅读有关CPU和架构的内容;主要是操作码,集成电路等。几年来我一直是一名python开发人员,我想在编写机器码时做一些练习。

我觉得很有趣我会将一个非常简单的python脚本编译成机器码,作为练习它的一种方式。脚本如下:

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

我在python中编写编译器,因为我不像C在py上那么擅长。我看了一下,我有以下python库供我使用,这可能会有所帮助,即

binascii.hexify(hex(2))  <-- should convert 2 to binary, correct?

file = open('/usr/local/bin/my_sample_program','wb') <-- should write the resulting binary file

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

我的问题如下:

1)如何将操作码写入文件?换句话说,假设用于设置寄存器以包含值2的操作码是 0010 我该怎么写这个作为程序第一行执行中的前四个数字?

2)如何告诉操作系统(OS X或Ubuntu)将程序加载到物理内存中?我假设编译器做的第一件事就是将操作系统的指令写入生成的二进制文件中?

3)您可能知道的任何可以帮助我的资源都将受到赞赏。

2 个答案:

答案 0 :(得分:7)

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

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

编辑:编译器或汇编程序的输出通常是目标文件。稍后通过链接器将其与其他目标文件组合。编写整个工具链,编译器,汇编器,链接器和其他相关工具很容易就能完成多个人工年。有鉴于此,我认为您不应该看到像使用现有的汇编器和链接器那样直截了当的解决方案。

答案 1 :(得分:3)

编译python并不容易。您可以查看具有即时编译器的pypy

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

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