直观地说,似乎语言的编译器Foo本身不能用Foo编写.更具体地说,语言的第一个编译器Foo不能用Foo编写,但可以编写任何后续的编译器Foo.
但这是真的吗?我对一种语言的阅读非常模糊,这种语言的第一个编译器是用"本身"编写的.这是可能的,如果是这样的话怎么样?
因此,作为一个新的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的缺陷?
因此,如果他们是自己建造的,他们如何保护自己?
我第一次看了Mono的源代码,我想我会找到一堆C或C++代码,而不是我找到了26,192 .cs文件和7个.cpp文件.
我并不是完全震惊,但它让我想到了一个我一直想到的问题:
项目最终是如何以"本身"这样编写的?
单声道更旧c/c ++的旧版本?或者是否有最初的努力来创建某种机器编码编译器...
这里的"诡计"是什么?
只是好奇.这显然不是一个非常好的实际编程解决方案,但是我想在Bless(十六进制编辑器)中创建一个可执行文件.
我的架构是x86.我能制作一个非常简单的程序是什么?你好世界?无限循环?与此问题类似,但在Linux中.
编程语言似乎经历了几个阶段.首先,有人想出了一种新语言Foo Language.编译器/解释器是用另一种语言编写的,通常是C语言或其他一些低级语言.在某些时候,FooL会成熟并逐渐成长,最终某人会在FooL本身为FooL编写编译器和/或解释器.
我的问题是:语言功能的最小子集是什么,有人可以自己实现该语言?
我看过这样写的东西...... C是用C语言编写的,或者ABAP是用ABAP编写的.
我甚至看到有人说这是将语言分类为真正的编程语言的标准之一.
我希望有人向我解释这意味着什么.
提前致谢.
编辑:更改标题:" C使用C "生成" C 使用C 编译 ".
所以这可能是一个愚蠢的问题,但我只是有点困惑.
所以我理解Haskell编译器本身是用Haskell编写的.这是如何运作的?它编译成什么?什么是OCaml编译器?
此外,他们说使用像haskell或OCaml这样的功能语言.当发生这种情况时,有人可以完成正在发生的事情的步骤吗?那么新语言将被编译为haskell,然后将其编译为haskell编译器编译的任何内容?
好的,所以我知道,通常,一种语言是用另一种语言编写的(比如Python是用C语言编写的).
但是,有没有一种语言可以自己编写?显然,他们必须使用该语言的先前版本的编译器/解释器,这意味着,至少在最初,它将被用其他东西编写.
我意识到使用现有语言为新语言开发编译器会非常恼人和毫无意义,只能立即放弃它并用新语言编写新的编译器(然后使用原始编译器编译),但是我真的没有看到为什么不能这样做的原因(尽管如此,我确实知道为什么不这样做).
尽管如此,它曾经发生过吗?
c ×2
interpreter ×2
abap ×1
assembly ×1
c# ×1
c++ ×1
coffeescript ×1
compilation ×1
elf ×1
haskell ×1
linux ×1
mono ×1
recursion ×1