7

我最近问了一个关于从 C++ 切换到 C 以编写解释器以提高速度的问题,我收到了一个评论,有人问我到底为什么要切换到 C。

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

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

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

4

8 回答 8

13

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

于 2010-04-10T20:02:39.197 回答
9

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 编写的一些动机。

于 2010-04-11T02:21:43.230 回答
7

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

于 2010-04-10T20:02:05.700 回答
3

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

是什么让您认为它们是用 C 编写的?根据我的经验,大多数脚本语言的大多数实现都是用C 以外的语言编写的。

这里有几个例子:

红宝石

  • BlueRuby:用 ABAP 编写
  • 热红宝石:JavaScript
  • 红太阳:动作脚本
  • SmallRuby:Smalltalk/X
  • MagLev:红宝石、宝石 Smalltalk
  • Smalltalk.rb: Smalltalk
  • 氧化铝:Smalltalk
  • 红衣主教:PIR、NQP、PGE
  • RubyGoLightly:去
  • 亚里:艾欧
  • JRuby:Java
  • XRuby:Java
  • 微软 IronRuby:C#
  • Wilco Bauwer 的 IronRuby 原版:C#
  • Ruby.NET:C#
  • NETRuby:C#
  • MacRuby:Objective-C
  • 鲁比尼乌斯:Ruby、C++
  • 元红宝石:红宝石
  • RubyVM:红宝石

Python

  • IronPython:C#
  • Jython:Java
  • 派尼:PIR、NQP、PGE
  • PyPy:Python、RPython

PHP

  • P8:Java
  • 栎树:Java
  • 法郎:C#

Perl6

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

JavaScript

  • 水仙:JavaScript
  • 射精:ELisp
  • 金特:C#
  • IronJS:F#
  • 犀牛:爪哇
  • 睫毛膏(ECMAScript Harmony 参考实现):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 年才被标准化。

于 2010-04-10T22:42:48.190 回答
3

我会大胆猜测,部分原因是 1998 年的 C++ 直到 1998 年才被标准化,这使得实现可移植性变得更加困难。

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

于 2010-04-10T20:15:27.120 回答
2

与 C 相比,C++ 的复杂性很大——许多人认为它是现有的最复杂和最容易出错的语言之一。

C++ 的许多特性也存在问题——STL 多年前就已标准化,但它仍然缺乏一个很好的实现。

OOP 固然很棒,但在很多场景下它并没有超过 C++ 的不足之处。

于 2010-04-10T20:16:21.850 回答
1

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

于 2010-04-10T21:50:43.843 回答
0

如果问题是关于为什么是 C 而不是 C++,那么答案归结为这样一个事实,即当您实现脚本语言时,C++ 对象模型就会出现在您的面前。它非常受限制,您将无法将其用于您自己的对象。

因此,您只能将其用于内部,并且它们通常不会从 C++ 中获得足够的好处,而不是更简单的 C 语言,这使得移植和分发更容易。

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

于 2010-08-13T11:03:27.187 回答