一种不使用'C'的语言?

时间:2009-11-16 10:41:14

标签: c compiler-construction programming-languages

好奇。我可能错了,但据我所知,大多数语言是创建的使用'C'来源。

例如:perlphppython,java(?),go ......

是否有任何语言不使用 C 作为低级解释器/编译器? (fortran?)

19 个答案:

答案 0 :(得分:22)

任何早于C的编译语言都有(有?)编译器本身不依赖于C。

有一个旧的Lisp编译器是用Lisp编写的(当Lisp是唯一的Lisp时回来)。

Fortran,Algol,SNOBOL,Forth,Smalltalk,Simula,Pascal,APL,COBOL,MUMPS,LOGO和BCPL也完全没有C。

答案 1 :(得分:16)

如果在A中编写语言B,则可以稍后在B中编写B的编译器 查看Bootstrapping

  

Bootstrapping是一个用于的术语   用计算机科学来形容   写作的技巧   目标中的编译器(或汇编程序)   它是编程语言   打算编译。这种技术是   也称为自托管。

     

大部分节目   语言是自助的,包括    BASIC,C,Pascal,Factor,Haskell,    Modula-2,Oberon,OCaml,Common Lisp,    Scheme,Clojure等。

修改:考虑到评论:

  • Haskell的运行时系统仍然是C
  • 的一大块
  • Clojure尚未(尚未)引导,但它是用Java实现的

答案 2 :(得分:11)

如果您正在寻找某些流行/优秀语言的非C实现,请考虑以下因素:

答案 3 :(得分:7)

答案 4 :(得分:6)

Delphi已写在Pascal中,而AFAIK Pascal(最初)已经写在Fortran中,但之后是在Pascal本身。

答案 5 :(得分:5)

C是大多数现代操作系统编写的语言,因此几乎所有想要在现代操作系统和现代硬件上运行的语言都必​​须具有与C接口的能力,如果它想要与C交互世界其他地方。此外,正因为如此,C编译器无处不在,因此您几乎总是依赖于C编译器可用于您感兴趣的任何平台。出于这两个原因,许多语言都是用C实现的(至少部分是),或编写为C编译(因此编译为C的版本可用于引导)。

也就是说,仍有一些语言与C语言很少接触。Clozure Common Lisp(以前的OpenMCL,在此之前的Macintosh Common Lisp,在Coral Common Lisp之前)完全用Common Lisp编写。您需要为某个平台下载它的二进制文件才能编译它。 Lisp用Lisp编写是很常见的(有时是另一种方言,有时是同一种方言),因为Lisp比C早得多。在1970年代和80年代甚至有Lisp Machines设计用来运行Lisp,整个操作系统和开发环境都写在其中。

有许多语言都有编译器和一些用该语言编写的库,而运行时的一些库和位用C语言编写。例如,CMUCL(及其派生SBCL)主要使用Common Lisp编写,但它们具有较小的C运行时。格拉斯哥Haskell编译器GHC也是如此;它是用Haskell编写的,所以你需要一个现有的Haskell实现来构建它(通常是Hugs,因为它是用C编写的,因此使引导更容易),但它在运行时有一些C代码。

Scheme 48是一个以PreScheme编写的Scheme,这是Scheme的有限方言,可以编译为C,它本身是用Scheme编写的。它编译为C的事实使得自举更容易; Scheme 48发行版附带了已编译为C的代码,因此您只需使用系统C编译器对其进行编译即可启动并运行。

还有许多其他语言也用C语言编写。有Free Pascal,用Pascal编写的Pascal版本。有很多用Java编写的语言,虽然JVM本身大多用C语言编写。Erlang最初用Prolog编写(强烈影响其语法),但不是用C语言编写的。和二郎。

如果您希望它们在实际计算机上运行,​​则必须以某种方式编写所有编程语言。一开始,唯一的选择是直接编写机器代码。不久之后,人们编写汇编程序(最初使用机器代码,后来自己编写汇编程序),以便更轻松地编写机器代码。然后是高级语言; FORTRAN,Lisp,COBOL,ALGOL,以及后来的Simula,Smalltalk,C,Pascal,ML,Prolog。每一件都必须写成某种东西;最早的是用汇编语言编写的,后来有些是用自己编写的,有些是用另一种高级语言编写的。到了80年代,C几乎是主流的系统编程语言,因此它成为了编写新语言的默认选择;这一直持续到今天。但是回想一下以前的语言,你会发现很多用其他语言实现的,甚至是自己。

答案 6 :(得分:5)

使语言启动和运行的过程非常有趣。 FORTH特别有趣的是,语言的核心可以在相当小的空间内实现,然后其他所有东西都可以用于骑行。从我自己的记忆中,你可以在组装中实现@,!,+和 - - 也许是一两个堆栈杂耍运算符,你就完成了。有关详细信息,请参阅here

当引导过程中的事情开始出错时,特别有趣的是什么。很多年前,我读到了一个在大学创建的Pascal编译器作为研究项目。它是用Pascal编写的,使用现有的Pascal编译器并最终取代它。问题是在特定情况下代码生成中存在错误,并且编译器源中的修复导致现有编译器中的错误,使得无法使用常规方法应用。备份到非bug的版本已经过时了。最终,作者最终对现有的编译器进行了非常仔细的二元手术。

虽然C是主导系统语言,但它肯定不是创建其他语言的基础语言。早期的Macintosh机器是用Pascal创建的,大多数第一批工具和语言都是基于Pascal(或汇编)的。

答案 7 :(得分:4)

FreePascal是自编译的。在某些时候,我会打算玩它。我还记得Turbo Pascal的辉煌岁月。

事实上,我刚刚在Karmic Koala Synaptic存储库中注意到它,所以我现在正在下载它和Lazarus IDE。

很好,另一个周末下来: - )

答案 8 :(得分:4)

更多的经验法则而不是自然法则:编译语言的编译器通常用语言本身编写。 (例子包括Pascal,OCaml,Haskell,......)有些语言使用C编译器作为后端这一事实有时会掩盖这一点。这对于新语言来说非常普遍:例如: Glasgow Haskell编译器是用Haskell编写的,但它创建的中间C代码比编译为本机代码,从而为程序员节省了为多个平台生成本机代码的繁琐任务。 BTW:Java和C#也属于这一类。 javac编译器是用Java编写的,C#中的C#编译器。运行时/ VM的一部分是用C编写的,而不是编译器。

另一方面,解释语言的解释器通常(但并非总是)用另一种语言编写。示例包括您提到的语言。反例包括Lisp或PyPy。我想用另一种语言实现解释器的主要原因是为了获得更快的解释器,这也可以解释为什么C在这里是常见的选择(因为C具有导致快速代码的声誉)。

答案 9 :(得分:4)

bootstrapping compilers。第一个Pascal编译器是用Fortran编写的,它用于编译用Pascal编写的Pascal编译器。

C ++是C的超集,因此基本的C ++编译器可以用C编写,然后使用C ++特定功能进行增强(并使用以前版本的自身编译)。

我不知道编写MS编译器的语言是什么,但我不会对它们使用C ++感到惊讶。 Apple的Clang使用C ++,目标是LLVM,它也是用C ++编写的。

此外,许多Lisp语言都可以自行编译。

有些编译器会使用C作为程序集的可移植版本,但这只是为了方便起见。

答案 10 :(得分:4)

BASIC或Pascal怎么样?

答案 11 :(得分:3)

是..... PL / 1旧的IBM大型机程序(PL / 1代表程序设计语言1)

还有其他人:汇编程序?

此致      Sigersted

答案 12 :(得分:3)

甚至有一个当前的C编译器最初没有用C

编写

我相信Green Hills Software C编译器最早是在1980年代早期的Pascal中编写的。该公司现在是航空航天和军用合格嵌入式产品的大型供应商,编译器可能仍在使用Pascal。但是,我认为他们也有一个Pascal-to-C翻译器,所以我猜他们本可以迁移。

UCSD Pascal

P系统使用了为虚拟机生成代码的编译器。我相信编译器本身是用Pascal编写的。您可以通过移植VM来移植整个事物。该系统影响了后来的Java / JVM开发。

所有其他旧东西

自20世纪70年代初以来,C只出现过,自1980年代初以来才流行起来。之前的所有事情都必须与之前的其他东西相关,或者将其自身编译成自我编译。

答案 13 :(得分:2)

JRuby是Ruby的一个实现,它使用Java虚拟机。可以说Java虚拟机是用C,C ++或其他一些低级语言编写的,但最终直接与硬件对话的东西都是用C,C ++,汇编程序或其他一些低级语言编写的。

答案 14 :(得分:2)

Dylan编译器是用Dylan编写的。

答案 15 :(得分:2)

据我所知的gcc,大多数编译器都是从java / fortran / ada /到目标代码,然后它们都使用相同的链接器。我想联系人在C中,但汇编程序可能不是。

答案 16 :(得分:2)

已经有多个项目开始实施Perl 6,主要区别在于他们选择的实现语言。最初,主要竞争者(其名称逃脱了我)是用Perl 5编写的.Perl 6目前主要关注的是Rakudo,正如我所理解的那样,正在Parrot上使用一种叫做PIR的语言。 (我假设Parrot是用C编写的,不知道Rakudo是否使用C和PIR;参与Perl 6开发的任何人都被邀请编辑我的答案并填写这些细节。)

原则上,任何图灵完备语言都可以用来编写自己的编译器。尽管在所有情况下都没有这样做,但似乎只有“因为我们能”才能完成。

答案 17 :(得分:1)

您需要通过“低级别”来定义您的意思。几乎所有语言都会间接使用C,因为大多数操作系统都是用C或C ++编写的。要进行任何系统调用(打开文件,网络套接字),您将不得不与C进行交互。

据说有人试图用其他语言编写操作系统 最值得注意的是OCaml和Lisp。

可以肯定这已经在Lisp(谷歌Lisp机器)中完成。

所以Lisp将是最显着(非死亡)的语言,已经成功完成了C.

答案 18 :(得分:1)

PyPy是用Python编写的Python的实现。