他们用什么语言建立其他语言?

用什么语言来构建像c ++和java这样的低级语言?

你怎么能建立没有语言的第一语言?

在编译器的上下文中,此操作通常称为引导 。 特别是,请参阅“鸡和鸡蛋问题”部分,直接回答您的问题。

一个编译器是用汇编语言手写的。 如果您的下一个问题是“第一个汇编程序是如何编写的?” 那么答案就是第一个汇编程序是用二进制机器代码手写的,可能还有前面板切换开关 。 这无疑是对真实情况的简化,但概念是一样的。

Ken Thompson还有一篇题为“信任信任的思考”的优秀文章,关于使用编译器为语言构建该语言编译器的风险。

你没有构建一种语言,但你构建了一个编译器或一个解释器 ……为此,你可以选择任何语言,甚至是你想要编译的语言……

第一个自托管编译器 – 能够以高级语言编译自己的源代码 – 是为Lisp创建的…自20世纪70年代以来,通常使用它编译的语言实现编译器,尽管Pascal和C一直是实现语言的流行选择。 http://en.wikipedia.org/wiki/Compiler

很多此类事情都是用C语言完成的。

第一个C编译器不是用C语言编写的; 它是PDP-11汇编程序。 其他早期的C编译器已经用各种汇编语言编写。

但是所有后续的C编译器实际上都是用C编写的,基于早期的“Portable C Compiler”。 是的,这是循环的。 但版本x编译器可用于构建版本x + 1编译器。

我认为你的问题的关键见解是引导捆绑的概念。 该链接将描述语言如何自我托管。

它在Lisp社区中相对常见。 例如,一些大学课程将使用Scheme来编写语言子集(这不是编译器类活动)。

也就是说,许多编译器都是用其他语言编写的。 例如, PUGS (Perl 6)是用Haskell编写的。 Ruby可以用C或Java(作为JRuby )。

有几个选项,您可以使用目标主机上可用的语言实现整个语言,如C或Ocaml,无论它是什么。 一旦你有了这个实现,你可以用语言本身编写一个编译器/解释器,构建它,现在语言自己运行。 这个过程叫做’ bootstrapping ‘。

没有“没有语言”这样的东西。 中央处理单元对一系列信号进行操作,我们称之为比特或1和0(技术上,电流的变化)。 在50年代,编码直接在CPU可以“理解”的地方完成,编程的速度每天最多约20个汇编命令。

正如其他海报所提到的,你几乎可以用任何语言编写一种语言,并且通常用语言编写的第一个程序之一就是语言本身的编译器。

但是,有些语言专门用于编写计算机语言 – 即lex,yacc,flex,bison(lex和yacc的更新版本)。 这些允许您以一种可以编译成有效语言识别器的forms表示某些语言的词汇和语法规范(我相信LLR或LALR)。

您仍然必须自己编写语言编译器/解释器的其他部分,即语义分析,代码生成。

看到

http://dinosaur.compilertools.net/

通常使用另一台机器或另一种语言来编写第一个汇编程序和第一个编译器。

只要工作计算机和工作语言可用,即使相当不同,问题也可以分两步解决。

  1. 在计算机(urk) a上用语言z编写计算机y的目标语言x

  2. 用语言x为计算机y编写目标语言x 。 现在,a上的单个编译将生成可以在y上运行的转换器,然后第二个编译可以在具有完全引导系统的y上运行。

如果语言或机器没有区别,问题会变得更简单。

引导也可以逐步完成,也许这在50年前更常见。

  • 在机器代码中编写更强大的虚拟机(可能是堆栈机器或带字符串的东西)
  • 现在,写入VM的字节码,写一些更接近语言的东西

像福斯这样的东西可能会成为一个很好的中间步骤。