为什么所有流行的脚本语言的解释器都是用C语言编写的(如果不是C语言,至少不是用C ++编写的)?

时间:2010-04-10 19:59:31

标签: interpreter scripting-language

我最近问了一个关于从C ++转换到C来为速度编写解释器的问题,我得到了一个人的评论,问我为什么要切换到C语言。

所以我发现我实际上不知道为什么 - 除了C ++面向对象的系统具有更高的抽象,因此更慢。

  • 为什么所有流行的脚本语言的解释器都是用C语言而不是用C ++编写的?

如果您想告诉我其他语言的解释程序不在C中,请将此问题中popular scripting languages的所有出现替换为Ruby, Python, Perl and PHP

8 个答案:

答案 0 :(得分:13)

C是一种非常古老的语言,几乎支持所有可用的系统。因此,对于任何需要移植到任何地方的项目来说,它都是一个不错的选择。

答案 1 :(得分:10)

Ruby可以追溯到1995年。如果你在1995年写一个翻译,你有什么选择? Java于同年发布。 (并且在v1.0中并且在很多方面都非常缓慢,并不值得使用)

C ++尚未标准化,编译器支持非常粗略。 (它还没有转换到我们今天使用的“现代C ++”。我认为STL在这个时候也被提议用于标准化。它实际上并没有被添加到标准直到几年之后。甚至在它被添加之后,1)编译器需要花费几年时间才能赶上,以及2)人们习惯这种通用编程风格。那时候,C ++首先是一种OOP语言,并且在很多情况下,C ++ 的样式比C慢得多。(在现代C ++代码中,性能差异几乎被消除了,部分通过更好的编译器,部分通过更好的编码风格,减少对OOP结构的依赖,更多地依赖模板和通用编程)

Python始于1991年.Perl甚至更早(1987年)

PHP也是从1995年开始的,但另外,重要的是,是由一个几乎不了解编程的人创建的。 (是的,当然这在许多重要方面塑造了语言)

您提到的语言是在C语言中启动的,因为C是当时便携式,面向未来的平台的最佳选择。

虽然我没有看过这个,但是我愿意打赌除了PHP案例之外,其他语言的语言设计者选择C语言因为他们已经知道了。所以也许教训不是“C是最好的”,而是“你已经知道的语言是最好的”

经常选择C还有其他原因:

  • 经验和可访问性:C是一种相当容易上手的简单语言,降低了进入门槛。它也很受欢迎,并且有很多经验丰富的C程序员。这些语言变得流行的一个原因可能就是很容易找到程序员来帮助开发解释器。学习和使用C ++更复杂。今天,这可能不是一个问题,但10年或15年前呢?
  • 互操作性:大多数语言通过C接口进行通信。由于你喜欢的新语言将依赖于用其他语言编写的组件(特别是在语言本身有限并且库很少的早期版本中),因此调用C函数总是很好而且简单。因为我们要去无论如何都有一些 C代码,它可能很容易一直走,只是用C写完整个东西。
  • 表现:C不会妨碍你。它并没有神奇地使你的代码快速,但它可以让你获得良好的性能。当然,C ++或许多其他语言也是如此。但对于C来说也是如此。
  • 可移植性:实际上每个平台都有一个C编译器。直到最近,C ++编译器才更受欢迎。

这些原因并不意味着C实际上是编写口译员(或其他任何东西)的优秀语言,他们只是解释了导致其他人用C语言写作的一些动机。

答案 2 :(得分:7)

我猜这是因为C几乎是现有几乎所有平台都有合理标准编译器的唯一语言。

答案 3 :(得分:3)

我猜测这部分是由于1998 C ++直到1998年才standardized,这使得实现可移植性变得更加困难。

您列出的所有语言都是在标准化之前开发的。

答案 4 :(得分:3)

  

为什么所有流行脚本语言的解释器都是用C语言而不是用C ++编写的?

是什么让你认为它们是用C语言编写的?根据我的经验,大多数脚本语言的大多数实现都是用其他而不是C语言编写的。

以下是几个例子:

红宝石

  • BlueRuby:用ABAP编写
  • HotRuby:JavaScript
  • Red Sun:ActionScript
  • SmallRuby:Smalltalk / X
  • MagLev:Ruby,GemStone Smalltalk
  • Smalltalk.rb:Smalltalk
  • 氧化铝:Smalltalk
  • 红衣主教:PIR,NQP,PGE
  • RubyGoLightly:Go
  • YARI:Io
  • JRuby:Java
  • XRuby:Java
  • Microsoft IronRuby:C#
  • Wilco Bauwer的原始IronRuby:C#
  • Ruby.NET:C#
  • NETRuby:C#
  • MacRuby:Objective-C
  • Rubinius:Ruby,C ++
  • MetaRuby:Ruby
  • RubyVM:Ruby

的Python

  • IronPython:C#
  • Jython:Java
  • Pynie:PIR,NQP,PGE
  • PyPy:Python,RPython

PHP

  • P8:Java
  • Quercus:Java
  • Phalanger:C#

Perl6

  • Rakudo:Perl6,PIR,NQP,PGE
  • 哈巴狗:哈斯克尔
  • Sprixel:JavaScript
  • v6.pm:Perl5
  • 精灵:CommonLisp

的JavaScript

  • Narcissus:JavaScript
  • Ejacs:ELisp
  • Jint:C#
  • IronJS:F#
  • Rhino:Java
  • 睫毛膏(ECMAScript Harmony Reference Implementation):Python
  • ECMAScript 4参考实施:标准ML

HotSpot JVM是用C ++编写的,Animorphic Smalltalk VM(从中派生出HotSpot和V8)是用C ++编写的,Self VM(Animorphic Smalltalk VM所基于的)是用C ++编写的。

有趣的是,在上述许多情况下,用C语言编写的的实现实际上比用C语言编写的更快

作为用C语言编写的 的两个实现的示例,请使用Lua和CPython。在这两种情况下,它们实际上是用很旧版本的C的一小部分编写的。原因是它们希望具有高度可移植性。例如,CPython在平台上运行,而C ++编译器甚至不存在存在。此外,Perl写于1989年,CPython是1990年,Lua是1993年,SpiderMonkey是1995年.C ++直到1998年才被标准化。

答案 5 :(得分:2)

与C语言相比,C ++的复杂性很高 - 许多人认为它是存在的最复杂且容易出错的语言之一。

C ++的许多功能也存在问题 - 多年前STL已经标准化,但仍然没有一个很好的实现。

OOP当然很棒,但在许多场景中它并没有超过C ++的不足。

答案 6 :(得分:1)

大多数已知的编译器书籍都是用C语言编写的。 另外两个主要工具lexx(构建词法分析器)和yacc(将语法翻译为C)都支持C语言。

答案 7 :(得分:0)

如果问题是关于为什么C而不是C ++,答案归结为这样一个事实:当你实现脚本语言时,C ++对象模型就会出现。它受到限制,你将无法将它用于你自己的物体。

所以你只能在内部使用它,而在那里你通常没有从C ++中获得足够的好处而不是更简单的C语言,这使得它更容易移植和分发。

在C中实现脚本语言时唯一的问题是缺少协程支持(你必须以某种方式切换堆栈指针),最重要的是没有办法在没有大量开销的情况下进行异常处理(与C ++相比) 。