用C ++编写的* any *流行编程语言解释器的主要实现是什么?

时间:2010-07-06 10:56:54

标签: c++ c interpreter

目前我正在考虑是否重写我在C ++中维护的编程语言解释器。解释器目前在C。

中实现

但我想知道,是主要的实现 - 因为当然,人们已经使用除了原作者所使用的语言以外的任何流行语言制作了许多解释器的版本目前使用的编程语言解释器今天用C ++编写?

如果没有,是否有充分的理由不在C ++中编写解释器?我的理解是,如果编写正确,C ++代码可以非常轻松,并且可以编译运行,就像执行相同操作的编译C代码一样快。

10 个答案:

答案 0 :(得分:8)

我用C ++编写了一个解释器(经过多年的C语言编写),我认为C ++是一种不错的语言。关于实现我只会及时回顾并改变我实现同时运行几个不同解释器(每个多线程)的可能性的选择,因为它使代码更复杂并且它从未使用过。多线程非常有用,但解释器的多个实例毫无意义......

然而现在我的遗憾确实是我写的那个解释器的事实,因为现在它已经在生产中使用了相当数量的代码和受过培训的人,并且因为语言非常丑陋并且功能不如python ......但现在切换到python会增加成本。它没有我知道的错误...但它比python更糟糕,这是一个错误(除了已经付出了无缘无故支付费用的错误之外)。

我最初应该使用python(或lua或任何其他现成的解释器,可以很容易地嵌入并且具有合理的许可)...我唯一的借口是我不知道python或那时的卢阿。

虽然编写口译员作为一项编程练习是一件很有意思的事情,但我建议你不要自己编写自己的作品,特别是(如果低级别复杂性要求的护理出来的话,请不要亲自去做)你的触及范围(我发现例如存在几个内存泄漏非常令人震惊)。

C ++仍然是一种低级语言,虽然你可以在内存处理方面获得一些帮助,但语言的主要假设是你的代码100%正确,因为没有运行时错误将帮助你(只有未定义的行为守护进程)。

如果你错过了100%正确的C代码(一种更简单的语言)的假设,那么我看不出你怎么能相信你会用C ++编写正确的代码(比较复杂的怪物)。我怀疑你最终会得到另一个你必须扔掉的错误翻译。

答案 1 :(得分:5)

如果您编写了当前的实现,并且 - 您在评论中说 - 它有:

  笨拙的符号处理和众多   内存泄漏

然后用c ++重写不会对你有所帮助。首先尝试理解当前实现出错的原因。另一方面,如果您不是原始开发人员,那么只需选择您最熟悉的语言并移植。

<强>更新 我认为sth's comment正确解释了为什么许多语言是用C而不是C ++实现的。关于完全重写的主题,heed the words of Joel Spolsky

答案 2 :(得分:4)

是的,很多都是。 IIRC Hotspot Java VM是用C ++编写的,Haskells ghc,...

正如许多人已经注意到的那样你应该真正了解LLVM,它是一个用于构建编译器,解释器和虚拟机的工具包。你基本上做了前端工作(即解析你的语言+ LLVM IR中的语义分析+ codegen),LLVM将立即为你建立不同的平台,jit,优化,编译为本机代码,...... 它还有一些用于解析和AST,错误处理和通知的工具(但可能是Clang子项目的一部分。)

答案 3 :(得分:2)

在有许多优秀的C ++编译器可用之前,大多数流行的编程语言都已开始创建。因此,这些语言的主要解释器并不是从C ++开始的,一旦你将大量的工作投入到一个有效的解释器中,你通常不会因为它现在也可以用C ++编写而抛弃它。

如果您为使用C ++编写的解释器启动一个新项目,那么必须要有很长的路要走,才能成为主要的实现。

答案 4 :(得分:2)

Google Chrome V8 Javascript引擎实现了ECMA-262,速度非常快。也许你可以用C ++重写它,但是你要考虑其他功能,比如实现字节码规范,而不是用C ++重写自动化。重写它只会有助于组织代码(对于小组工作来说这是一件很棒的事情),但在性能上没什么。

答案 5 :(得分:1)

GNU基金会刚刚宣布所有新版本的gcc都将用c ++编写。

答案 6 :(得分:1)

Tamarin - Adob​​e和Mozilla ECMAScript解释器是用C ++编写的。作为原始语言作者负责的那个,它可能被认为是主要的一个(IIRC ECMA参考实现是用OCaml编写的,但实际上并没有使用,除非作为参考)

答案 7 :(得分:1)

如果内存泄漏是您当前程序的唯一问题,请尝试使用valgrind。我的软件中从来没有内存泄漏,valgrind无法跟踪我。事实上,它已经在很多场合拯救了我的屁股。

这是一个教程

http://www.cprogramming.com/debugging/valgrind.html

答案 8 :(得分:0)

Sun的Java实现似乎主要是用C ++编写的。

答案 9 :(得分:0)

我认为我不能(或想要)给予这个“是”。我认为这是实用主义与个人语言需求相结合的问题,也取决于它是编译语言(或字节码编译)还是解释,或者......

如果您正在尝试编写跨平台代码,您会发现最低的公分母通常是C编译器(由于不同的CPU架构,汇编程序不适合部署到许多平台)。由于C ++被编码为位于大多数C基础结构之上(例如使用名称修改以使类型重载符合C链接器所理解的内容),因此它通常是即使在嵌入式系统上也可用的最低通用分母OO语言。这使得它成为那些希望以高水平,可维护的方式编写语言的人们的热门选择。

此外,大多数编程语言都有存在的理由,希望以不同的方式解决问题(毕竟,更好必然意味着不同),这意味着他们对于代码需要能够做什么有相当不寻常的需求,并且不要使用其他实现语言提供的许多支持工具,因为他们没有足够的控制权。所以,鉴于你要重新实现很多,例如无论如何,对象模型和数据类型,C ++的低级方面实际上是一个优势。

也就是说,许多语言的第一个版本是用C ++编写的,例如第一个简单的编译器,然后在那个简单版本中编写下一个版本(“bootstrapping”)。这样做的好处是您可以使用自己的语言来扩展它。为了移植它,他们然后只修改他们的编译器以交叉编译到所需的平台,然后使用这个交叉编译器构建编译器,结果是新平台的完整语言的本机版本。

倾向于不这样做的语言通常主要是脚本语言,它们往往仍然是解释为C ++的语言(尽管其他人提到了流行的例外)。

选择C ++的另一个常见原因是现有基础架构。例如。如果要绑定到现有的系统框架,通常需要下拉到C ++,或者如果要利用现有的编译器后端(如用C ++编写的LLVM),或者即使它们只使用C,也经常需要C ++是最适合类似OO的实现语言,可以轻松地与系统的C部分通信。

所以你想问自己的问题很可能是:我的需求是什么,最适合的语言是什么?

有些语言只是另一种语言的预处理程序(C ++和Objective-C都是作为C之上的预处理程序开始的)。他们添加自己的语法或功能,将它们转换为实现语言,然后使用现有编译器编译修改后的代码。如果一种语言已经完成了你想要的一切,那么这可能是一种更好的方法,并且让你利用工作在其他语言上的工程师的经验,将你的工作时间与你自己提供的工作时间结合起来。