这一直困扰着我.gcc/g ++如何编译自己?我猜测每个修订版都使用以前构建的修订版进行编译.这是真的?如果是的话,是否意味着最古老的g ++/gcc版本是用汇编语言编写的?
我正在网站http://coffeescript.org/上研究CoffeeScript ,它有文本
CoffeeScript编译器本身是用CoffeeScript编写的
编译器如何编译自己,或者这个语句是什么意思?
我查看了http://referencesource.microsoft.com/上的源代码,看来所有源代码都在C#中.
我还查看了新的C#编译器平台(Roslyn)的源代码,它也在C#中.怎么可能?C#语言编译器是用C#编写的吗?还是我错过了一些明显的东西?如果C#编译器是用C#编写的,那么它是如何工作的?
我听说过引导一种语言的想法,就是为这种语言编写一个编译器/解释器.我想知道如何实现这一点,并且看了一下,看到有人说它只能通过其中任何一个来完成
对我来说,这些似乎都不是真正引导语言,因为它们都需要外部支持.有没有办法用自己的语言编写编译器?
这个问题可能源于我对编译器的误解,但是这里......
人们可以在第一版K&R(第xi页)的序言中找到以下陈述:
操作系统,C编译器和基本上所有UNIX应用程序(包括用于编写本书的所有软件)都是用C语言编写的.
(我的重点)
这是我不明白的事情:C编译器在编译任何C代码之前是否必须自行编译?如果那个C编译器是用C编写的,那么编译它是否需要一个已经存在的C编译器?!
摆脱这种无限回归难题(或鸡与鸡蛋问题)的唯一方法是用K和R编写的用C编写的C编译器实际上是用已经存在的用C语言编写的C编译器编译的.用C编写的C编译器取代了后者.
还是我完全脱了?
第一个C编译器是用C本身编写的吗?然后,它是如何执行和编译的?或者,这个编译器是用汇编语言编写的吗?
因此,作为一个新的Web程序员(背景mostely在C,C++和Python),没有JavaScript的经验(或渴望体验一下吧,根据我所看到的),我一直在做CoffeeScript的一些前兆研究,我真的喜欢什么我知道了.我注意到的一个很酷的细微差别就是CoffeeScript是用CoffeeScript编写的,这很酷......但我真的不明白这是怎么回事.不幸的是,在我上一期的高级计算机科学课程中,我选择使用网络安全而不是编译器.
我听说有人在目标语言编写语言使用现有的编译器用于该语言来诠释,但我不能挖就如何实现这一可能的工作,因为这是第一次执行的任何信息.
我的猜测是,可能照顾放下一些初步框架的构建的嵌入式shell脚本的自我指涉的(没有这个词形容恰当这种行为?)语言?
compiler-construction bootstrapping interpreter coffeescript
我想知道今天的现代编译器,如MS cc,gcc,clang,icc,更新的版本是否使用相同编译器的当前版本构建?
因为当然存在这种风险:
http://scienceblogs.com/goodmath/2007/04/15/strange-loops-dennis-ritchie-a/
http://c2.com/cgi/wiki?TheKenThompsonHack
我确信参与上述编译器开发的每个人都知道这个问题,代码由自身的早期版本注入编译器并无形地传播.
现在真正的问题,实际上并不是后门之一,但更多关于代码生成的正确性不是吗?如果构建链中某处某些变态扭曲是由纯错误引入的,那么今天的编译器会生成错误的代码,即使编译器的源代码看起来不错,因为Ken Thompson的缺陷?
因此,如果他们是自己建造的,他们如何保护自己?
c ×4
c++ ×2
compilation ×2
assembly ×1
c# ×1
coffeescript ×1
interpreter ×1
recursion ×1
roslyn ×1
scala ×1