当为特定语言创建编译器时,开发编译器的人是否从头开始定义语言及其命令,就像语言从未存在一样(这看起来不真实)?或者有没有办法使用以前的编译器?或者他们怎么做呢?
答案 0 :(得分:3)
他们定义[特定领域]语言或实现一些已有的语言。
语言通常以称为BNF
的特定形式编写创建编译器(或至少是词法分析器和解析器)的一种方法是使用工具,有几个工具,如yacc / lex,ANTLR等,可用于为编译器生成原始管道,标记文件并解析令牌。查看antlr.org以获取生成C#,Java或C代码解析器/词法分析器的非常易于使用的工具的一些示例。
答案 1 :(得分:2)
我猜你假设编译器是用它编译的同一种语言编写的。不是这种情况。该过程称为 bootstrapping 。第一个C#编译器是用C ++编写的。第一个C ++编译器是用C语言编写的。第一个C编译器是用B编写的。第一个B编译器是用BCPL编写的。除此之外,它变得模糊,古老的历史和所有这一切。这最终会回到有人将程序输入到具有切换开关的机器中。
解决问题的第一部分:是的。没有人在没有非常强烈的语言语法定义的情况下编写编译器。这可以在纸上解决。
答案 2 :(得分:0)
这完全取决于语言。如果该语言不存在(并且记住在开头没有这样做的话)那么它当然必须在编译器之前设计。但是,如果您只想对现有语言进行更改,则可能更容易使用现有编译器并进行所需的更改。
我亲自为little languages编写了一些编程器,我自己想到了,并从头开始创建编译器。有时使用lex和Yacc等工具,有时会手工编码。
答案 3 :(得分:0)
语言的评估从计算机诞生开始,第一个优化编译器在20世纪60年代出现。
对您的问题最简单的答案是首先出现语言设计,然后编译器开发人员按照标准开发编译器。然后语言设计者从用户社区获得反馈,并对语言标准进行更改,并且编译器开发人员再次使用此新标准。
compiler support for C++0x standard
通常,编译器开发人员开发新的语言功能支持仅使用编译器已经支持的功能。