Compiler construction 编写编程语言的建议?

Compiler construction 编写编程语言的建议?,compiler-construction,programming-languages,interpreter,scripting-language,Compiler Construction,Programming Languages,Interpreter,Scripting Language,对于希望编写编程或脚本语言的人,您可以给他们什么提示?我 我并不担心如何编程或设计编译器,而是担心如何使用工具和代码生成器快速开发编译器 上次我尝试用C++编码,状态和语法几乎和写实际的逻辑一样长。我知道下面的工具会有帮助 我想我可以生成C++代码,并编译GCC。使用上述工具,您估计编写程序或脚本语言需要多长时间 早在2000年,人们就反复提出了关于这个问题的各种说法。关于这个话题。估计这样的事情可能需要多长时间取决于许多不同的因素。例如,一个有经验的程序员可以通过单元测试在几个小时内轻松完成

对于希望编写编程或脚本语言的人,您可以给他们什么提示?我 我并不担心如何编程或设计编译器,而是担心如何使用工具和代码生成器快速开发编译器

上次我尝试用C++编码,状态和语法几乎和写实际的逻辑一样长。我知道下面的工具会有帮助

我想我可以生成C++代码,并编译GCC。使用上述工具,您估计编写程序或脚本语言需要多长时间



早在2000年,人们就反复提出了关于这个问题的各种说法。关于这个话题。

估计这样的事情可能需要多长时间取决于许多不同的因素。例如,一个有经验的程序员可以通过单元测试在几个小时内轻松完成一个简单的算术表达式计算器。但是新手程序员可能需要学习解析技术、递归下降、表达式树的抽象表示、树行走策略等等。仅仅对于算术表达式来说,这可能需要数周或更长的时间

但是,不要因此而气馁。正如Jeff和Joel在一次会议上与Eric Sink讨论的那样,编写编译器是了解编程的许多不同方面的一个极好的方法。我已经构建了一些编译器,它们是我最难忘的编程项目之一

关于构建编译器的一些经典书籍有:

  • (又称龙书)
  • (也称为SICP)

    • 关于编译器设计的经典书籍有

      阿尔弗雷德·V·阿霍和杰弗里·D·厄尔曼的《编译器设计原理》。它已经存在了相当长的一段时间了,它的《粉红骑士》和《绿龙》至少为几代CS学生所熟知

      还有

      “编译器:原理、技术和工具”,作者Alfred V.Aho、Monica S.Lam、Ravi Sethi、Jeffrey D.Ullman

      如果您对编写编译器感兴趣,那么这些无疑是最好的起点

      作为一个非常了解C++的人, 你能给一个 是想写一种编程语言还是脚本语言

      不要这样做。(或者至少在开始之前好好想想!)


      如果您试图编写一种脚本语言来公开某些自定义编写对象的方法/属性,那么最好在Java(或.NET/VB或所有那些讨厌的MicrosoftSMS)中实现这些方法/属性,然后使用其中一种语言作为脚本语言。(无论微软端有什么等价物。)

      我强烈建议查看现有的字节码解释器。如果你能使你的语言适合CIL(.NET)或Java(甚至其他语言,如Python或Parrot),你就可以省去所有创建一个可行的支持环境的努力,并且可以继续尝试语言概念。

      任何关于编译器的问题都会有一个答案“去读龙书,读那本书,这本书…”就这样不管他们的内容在几分钟内。所以我跳过了那部分(就像我一开始说的那样)。阅读这些书来学习如何使用你想要的工具,就像阅读角动量来学习如何骑自行车一样有用

      因此,为了回答您的问题,不必质疑您的意图,我可以很容易地向初学者推荐antlr和antlrworks。您可以轻松地生成AST(我认为真正神奇的地方)并可视化地调试语法。它为您生成了一个良好的编译器

      如果您了解自己的东西,并且希望拥有更多的控制权,或者不喜欢antlr,那么可以同时使用解析器生成器和状态机编译器(对词法分析有特殊支持)

      如果您不需要太多的性能,并且因为您计划生成C/C++代码,那么您可以跳过自己进行的任何优化,并将这些工作留给您的C/C++编译器


      如果您可以忍受运行速度较慢的环境,那么您可以进一步缩短开发工作,只需执行解释,因为这样通常更容易实现动态功能。

      如果您计划编写解释程序或编译器,请不要这样做,因为您想编写下一个重要的东西。写它,因为你已经有了一个目标,在脑海中或学习。如果你这样做,你可能会发现你无意中写下了一件大事。

      < P > Dave Hanson,他和Chris Fraser共建了10年的建筑,曾经告诉我,他从经验中学到的一个主要的东西不是尝试用C或C++编写编译器。p> 如果你想快速开发一些东西,不要生成本机代码;以现有虚拟机(如CLR、JVM或虚拟机)为目标。使用最大munch生成代码

      如果您正在编写解释器,另一个好的选择就是使用内存管理和底层编程语言的其他功能。解析到AST,然后通过AST的树遍历进行解释。这会让你很快离开地面。性能不是最好的,但可以接受。(使用这种技术,我曾经在Modula-3中编写了一个PostScript解释器。第一次实现花了一周时间,尽管它后来进行了一些性能调整,主要是在lexer中,但它从未被替换过。)


      避免使用LALR解析器生成器;使用一些节省时间的工具,比如ANTLR或GLR解析器生成器

      我用于LALR的一个好工具是。它是免费的,语法是Backus-Naur形式,并且有多个示例,包括用C#、VB.NET、Java和其他语言编写的引擎。这允许您编写语法,将语法编译为文件,然后使用引擎解析语法

      如上所述,我建议将目标锁定为某种字节码,如IL。这将允许您利用大量现有框架


      如果你不想进入wri,祝你好运