编写Python编译器进行练习

Sam*_*amy 9 python compiler-construction

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

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

a = 2
b = 3
c = a + b
print c
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

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

我的问题如下:

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

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

3)您可能知道的任何可以帮助我的资源将不胜感激.

Lin*_*cer 7

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

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

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