示例编译器

8

我正在寻找一个编译器的源代码,它能够从一个编程语言的输入程序中创建Win32程序(不管是哪种语言,也许越简单越好)。

但是我找不到适合我的东西,像GCC这样的大型编译器让我感到非常困惑,因为它们拥有很多功能,我不知道从哪里开始。

  • 是否有开源的Win32微型编译器可以供我参考?

3
请查看这个问题:https://dev59.com/x3VD5IYBdhLWcg3wXaed - Firas Assaad
实际上,我正在为Win32平台开发一种编译器。我建议你阅读PE头文件,并获取x86英特尔参考手册的副本以实现操作码。然后,您应该创建一些“抽象”执行层,并使用此模型来预测处理器状态以生成有效的汇编代码。 - Pindatjuh
一个书单,其中可能包含许多示例编译器。 - Matti Virkkunen
不是第一个答案列出了关于编译器构建和理论的好书、文章、网页等,还有许多完全适合您问题的答案。 - mctylr
7个回答

4

这些编译器对我没有任何帮助。你怎么能指望我挖掘一万行代码,才能找到基本信息呢? - saf
你认为是否有编译器的代码行数少于1万行?我感觉没有这样的编译器。 - Andrey
有很多这样的编译器。如果去除复杂的语法和优化,编译器其实并不那么复杂。当然,像这样的编译器对于实际的编程工作来说并不是很有用,但对于学习编译器的基础知识来说非常理想。 - Matti Virkkunen

2
我建议你去找一本编译器教材。它们会解释编译器的所有必要组件,并且通常会从头到尾开发一个编译器。
我有一本Java现代编译器实现,是我在学习编译器课程时购买的,我非常满意它。

2

你是想了解如何构建编译器,还是想了解Win32可执行文件的内部结构?

如果是前者,阅读关于如何创建编译器的书籍将比尝试逆向工程源代码更有效。编译器与您以往见过的任何东西都不同,有作者引导您了解原理、常用技术和工具会非常有帮助。值得指出的是,编译器是分阶段构建的,只有在实现的后期才需要了解目标CPU和操作系统。如果您是编译器构建新手,则需要学习很多内容,才能到达那个阶段。

然而,如果您想了解Win32可执行文件的格式,则需要了解x86(或x64)汇编代码和便携式执行(PE)文件格式(Windows用于可执行文件)。对于x86汇编代码的介绍,我建议阅读Paul Carter博士的优秀免费电子书“PC Assembly Language” http://www.drpaulcarter.com/pcasm/,对于PE,我建议从这里开始 http://msdn.microsoft.com/en-us/magazine/cc301805.aspxhttp://msdn.microsoft.com/en-us/magazine/cc301808.aspx


0

gas 可以将汇编语言转换为目标代码,然后 ld 可以将其与适当的运行时链接以生成程序。


3
两者都不是编译器。 - WhirlWind
赞同WhirlWind的观点,给你点个踩。 - Kawa
汇编语言是一种编译器,根据定义。赞同不同意见者的反对意见。如果你正在实现一个编译器,那么你不应该被PE文件格式所困扰——这不是编译器的工作,而是链接器的工作。 - SK-logic

0
如果你的目标是学习编译器的工作原理和/或如何编码,那么你真的应该阅读一本有关这方面的书籍。然而,在寻找源代码示例时,可以尝试使用 Pascal 编译器示例,例如 this one
Pascal 具有相对简单的语法,并且在许多书籍中都有实现。

0

最简单的编程语言是汇编语言,具体来说是x86汇编语言。最著名的汇编器NASM是开源的,您可以在此处查看它的源代码:

http://repo.or.cz/w/nasm.git

NASM有宏,这些宏确实被“编译”成汇编语句。虽然它不是一个完整的语言,但它专注于基础知识。


0

我建议寻找适用于 MS-DOS(16 位)的 Pascal、C 或SmallC编译器源代码。特别是如果它们限制自己在 16 位平面实模式(≤64KB 存储器模式)内,它们应该相当简单。

支持分段实模式会增加很多复杂性,最好避免使用,对于非操作系统的 32 位平面保护模式程序无关紧要。

对于非 x86 处理器,Jack Crenshaw 的文章系列 "Let's Build a Compiler" 中的示例程序是一种类 Pascal 语法编译器,针对 Motorola MC68000 16/32 位处理器。还有 Marcel Hendrix 在 win32 上用 Forth 编写的 版本

还有TCC - Tiny C Compiler,支持 PE-i386 输出(即 Win32)。

虽然如果您不想读Firas Assaad在评论中提供的整个SO链接,该链接包含了除了一个之外的所有这些链接,我相信您会发现编译器的源代码非常长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接