好奇。我可能错了,但据我所知,大多数语言是创建的使用'C'来源。
例如:perl,php,python,java(?),go ......
是否有任何语言不使用 C 作为低级解释器/编译器? (fortran?)
答案 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等。
修改:考虑到评论:
答案 2 :(得分:11)
如果您正在寻找某些流行/优秀语言的非C实现,请考虑以下因素:
答案 3 :(得分:7)
答案 4 :(得分:6)
答案 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)
我相信Green Hills Software C编译器最早是在1980年代早期的Pascal中编写的。该公司现在是航空航天和军用合格嵌入式产品的大型供应商,编译器可能仍在使用Pascal。但是,我认为他们也有一个Pascal-to-C翻译器,所以我猜他们本可以迁移。
P系统使用了为虚拟机生成代码的编译器。我相信编译器本身是用Pascal编写的。您可以通过移植VM来移植整个事物。该系统影响了后来的Java / JVM开发。
答案 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的实现。