编程语言和编译器

问题描述:

我和我的朋友进行了这个讨论,意识到这可能是问这个问题的最好的地方吗?编程语言和编译器

新语言是如何诞生的?这个新的语言NEW必须用一些旧的语言OLD编写(例如,C++在初始阶段用C编写),或者这是如何创建的? 而且,如果没有编译器,NEW语言如何能够自行工作?那么,它必须有一些编译器?谁为它编写编译器?那么,所有这一切是如何协同工作的,新语言及其编译器,新语言与其旧基本语言的关系如何?

+1

感谢所有这样的快速回复。我想,编译器设计课程就是我需要的。但是,我想知道/好奇你们都可以如此快速地回复,我的意思是1-2分钟内,这是非常惊人的? – 2009-07-23 19:42:59

+2

我们都为信誉点而死。欢迎Upvote我们! :-) – 2009-07-24 00:05:35

+0

@Norman:我是新手,对知名度不太了解。当我有空时,必须检查所有这些。我想你现在快乐了。 :) – 2009-07-24 02:12:43

你写在实现语言,直到编译器可以开始编译新的语言,足以用来实现新的语言的其余部分的编译器。

这就是它的工作原理。

编辑:只是为了澄清,评论者在这个答案也是正确的。除非需要,否则编译器不必使用新语言编写。如前所述,有些人不会走这条路线,并保持原来的实施语言。

Bootstrapping是在计算机科学中用来描述参与撰写的,它旨在编译目标编程语言的编译器(或汇编语言)技术的术语。这种技术也被称为自托管。

您可能要在编程语言设计和编译器设计念起来:

http://dragonbook.stanford.edu/
Bootstrapping (compilers)
http://en.wikipedia.org/wiki/Programming_language
http://www.paulgraham.com/langdes.html

或者采取在当地大学的课程或三个。

任何语言的核心都是链接器和编译器,它是将源代码转换为非常接近机器代码,代码的中间编译器。从这一点来看,连接器被用于将其连接到其他二进制文件,例如库等。在二进制文件链接到所有逻辑文件之后,它们将成为机器代码中的可执行文件(或可翻译的中间代码,与.NET/Java一样)。

从“人类”英语中翻译得最多的是编译器,并且有很多关于如何完成的文章......但是对于大多数文章而言,它处于超自然的领域,因为组织技能需要编写一个工作编译器是巨大的。

您可以通过查看语言定义(Bjarne Stroustrup的“C++编程语言”,Microsoft Press的“C#编程语言”)来查看表面级别的翻译类型并仔细了解编译器的工作方式,附录和贯穿始终是词汇片断或编译器将用来以非常合理的方式将您的文字翻译成机器代码的规则。

我强烈建议你阅读你喜欢的编程语言的语言定义,如果你想了解更多,也对编译器的*文章会给你一个更广泛的理解。

语言(通常)只是一个规范。一种语言的编译器或解释器可以用您选择的任何语言编写。第一个是机器码,因为这就是我们所有的。然后是汇编程序,然后是C等其他语言。从那时起,C(和C++)一直是实现语言的流行选择。然而,C和C++是唯一的选择。

另外值得指出的是,语言通常可以用专门的语言(如yacc和lex)来实现。这些是特定于领域的语言,专门用于根据规范轻松创建编译器。这需要耗费大量的计算机很容易生成的东西,而不用手工编码。您采取规范,通过这些工具运行它并弹出代码来实现您的语言。 Yacc代表Yet Another Compiler-Compiler。它编译一个编译器的规范并生成一个编译器。

其他海报表明,一旦语言足够健壮,编译器可以移植到自己,但这不是必需的。很多语言都是在C语言中编写十年或更久,并且今天继续在C语言中实现。

伟大的问题!

  • 有时新语言的编译器是用旧的语言编写的。

  • 如果编译器为新的语言ň是写在ñ,有很多策略,都牵扯找到某种方式在语言ň运行程序,当你还没有一编译器。

    1. 写一个解释语言ñ,说,在C(你选择的真正的语言),然后用解释来解释编译器在编译本身。

      • 写出ň一个非常可怕的编译器,说,在C,然后用它来编译,编译器的第一个版本。

      • 编译器的第一个版本通常是手工编译为汇编代码或C代码。

我最喜欢的是战略#1,但他们所有的工作。

如果你想看到一个解决这个问题的深入剖析,看看安德鲁阿佩尔的短纸 Axiomatic Bootstrapping: A Guide for Compiler Hackers,这是免费的,从普林斯顿大学网站。这篇文章是数学,但在相关工作部分,您会找到旧论文的参考资料,包括那些显示使用T图的引导过程,许多人都觉得这很直观。