【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
首选语言 :C / C ++,Java和Ruby。
我正在寻找一些有用的书籍/教程,以了解如何仅出于教育目的编写自己的编译器。 我最熟悉C / C ++,Java和Ruby,因此我更喜欢涉及这三种资源之一的资源,但是任何好的资源都是可以接受的。
#1楼
- 这是一个广阔的主题。 不要小看这一点。 并且不要低估我的观点,不要低估它。
- 我听说《 龙书》是一个(“?”)学习的起点。 :)善于搜索,最终将成为您的生活。
- 构建自己的编程语言绝对是一个好练习! 但是要知道,最终它永远不会用于任何实际目的。 例外情况很少, 而且相差很远。
#2楼
您可能想要研究Lex / Yacc(或Flex / Bison,无论您想称呼它们如何)。 Flex是一个词法分析器,它将分析和识别您语言的语义成分(“令牌”),而Bison将用于定义解析每个令牌时发生的情况。 对于可以编译为C的编译器或动态运行指令,这可能是但绝对不限于打印C代码。
#3楼
我认为这是一个非常模糊的问题。 只是因为涉及的话题很深。 但是,编译器可以分解为两个独立的部分。 上半部分和下半部分。 上半部通常采用源语言并将其转换为中间表示,下半部负责平台特定的代码生成。
尽管如此,一种用于实现该主题的简便方法的想法(至少在我们的编译器类中使用了该想法)是在上述两部分中构建编译器。 具体来说,仅通过构建上半部分就可以对整个过程有所了解。
仅做上半部分就可以使您获得编写词法分析器和解析器的经验,并生成一些“代码”(我提到的中间表示形式)。 因此,它将采用您的源程序并将其转换为另一种表示形式,并进行一些优化(如果需要),这是编译器的核心。 然后,下半部分将采用该中间表示形式,并生成在特定体系结构上运行程序所需的字节。 例如,下半部分将采用您的中间表示形式并生成PE可执行文件。
关于该主题的一些书对我特别有用,是《 编译器原理和技巧》 (或《龙书》,这是由于封面上有可爱的龙)。 它有一些很棒的理论,并且确实以一种真正可访问的方式涵盖了上下文无关文法。 同样,为了构建词法分析器和解析器,您可能会使用* nix工具lex和yacc。 不足为奇的是,这本名为《 lex and yacc 》的书在这本《龙书》停下来的地方找到了。
#4楼
一般而言,对于编译器而言,没有五分钟的教程,因为这是一个复杂的主题,编写编译器可能需要几个月的时间。 您将必须进行自己的搜索。
通常会解释Python和Ruby。 也许您也想从翻译开始。 通常比较容易。
第一步是编写正式的语言描述,即您的编程语言的语法。 然后,您必须根据语法将要编译或解释的源代码转换为抽象语法树,这是计算机可以理解并可以对其进行操作的源代码的内部形式。 此步骤通常称为解析,而解析源代码的软件称为解析器。 解析器通常由解析器生成器生成,解析器生成器将形式语法转换为源代码或其他机器代码。 有关解析的一个很好的非数学解释,我建议您使用“解析技术-实用指南”。 Wikipedia对解析器生成器进行了比较,您可以从中选择最适合自己的解析器。 根据您选择的解析器生成器,您可以在Internet上找到教程,对于真正流行的解析器生成器(如GNU bison)也有书籍。
为您的语言编写解析器可能非常困难,但这取决于您的语法。 因此,我建议您保持语法简单(与C ++不同); LISP就是一个很好的例子。
在第二步中,将抽象语法树从树结构转换为线性中间表示。 经常引用Lua的字节码作为一个很好的例子。 但是中间表示确实取决于您的语言。
如果要构建解释器,则只需解释中间表示。 您也可以及时编译它。 我建议使用LLVM和libjit进行即时编译。 为了使该语言可用,您还必须包括一些输入和输出功能以及一个小的标准库。
如果要编译语言,它将更加复杂。 您将不得不为不同的计算机体系结构编写后端,并从这些后端的中间表示形式生成机器代码。 我建议为此任务使用LLVM。
关于此主题的书籍很少,但我不推荐它们作为一般用途。 他们大多数都太学术或太实用。 没有“ 21天之内教自己的编译器编写”,因此,您将必须购买几本书才能对整个主题有一个很好的理解。 如果您搜索Internet,则会发现一些在线书籍和讲义。 也许您附近有一个大学图书馆,您可以在其中借用有关编译器的书籍。
如果您要使您的项目认真,我还建议您具有理论计算机科学和图论方面的良好背景知识。 计算机科学学位也将有所帮助。
#5楼
我记得大约七年前,我刚接触编程时曾问过这个问题。
当我问的时候,我非常小心,令人惊讶的是,我得到的批评没有您来这里的那么多。 但是,他们的确向我指出了“ 龙书 ”的方向,这是一本非常出色的书,它解释了编写编译器所需的一切(当然,您必须精通一两种语言。)语言,更好的语言。)
是的,很多人都说读那本书太疯狂了,您从中学不到任何东西,但是我完全不同意。
许多人还说编写编译器是愚蠢且毫无意义的。 好吧,编译器开发有用的原因有很多:
- 因为很有趣。
- 这是有教育意义的,在学习如何编写编译器时,您将学到很多有关计算机科学和其他技术的知识,这些技术在编写其他应用程序时很有用。
- 如果没有人编写编译器,那么现有的语言将再好不过。
我没有立即编写自己的编译器,但是在询问之后我知道从哪里开始。 而现在,在学习了许多不同的语言并阅读了《龙书》之后,写作并不是什么大问题。 (我也在学习计算机工程atm,但是我对编程的大部分了解都是自学的。)
总之,《龙书》是一个很棒的“教程”。 但是在尝试编写编译器之前,请花一些时间精通一两种语言。 不过,不要期望在未来十年左右的时间里成为编译器专家。
如果您想学习如何编写解析器/解释器,这本书也很好。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3146373