我最近问了一个关于从 C++ 切换到 C 以编写解释器以提高速度的问题,我收到了一个评论,有人问我到底为什么要切换到 C。
所以我发现我实际上不知道为什么——除了 C++ 面向对象系统有更高的抽象,因此更慢。
- 为什么所有流行脚本语言的解释器都是用 C 而不是 C++ 编写的?
如果您想告诉我其他一些语言的解释器不在 C 语言中,请popular scripting languages
将此问题中所有出现的 . 替换为Ruby, Python, Perl and PHP
.
我最近问了一个关于从 C++ 切换到 C 以编写解释器以提高速度的问题,我收到了一个评论,有人问我到底为什么要切换到 C。
所以我发现我实际上不知道为什么——除了 C++ 面向对象系统有更高的抽象,因此更慢。
如果您想告诉我其他一些语言的解释器不在 C 语言中,请popular scripting languages
将此问题中所有出现的 . 替换为Ruby, Python, Perl and PHP
.
C 是一种非常古老的语言,因此几乎所有可用的系统都支持。因此,对于任何需要移植到任何地方的项目来说,它都是一个不错的选择。
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 几乎是唯一一种为几乎所有现有平台提供合理标准编译器的语言。
为什么所有流行脚本语言的解释器都是用 C 而不是 C++ 编写的?
是什么让您认为它们是用 C 编写的?根据我的经验,大多数脚本语言的大多数实现都是用C 以外的语言编写的。
这里有几个例子:
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 年才被标准化。
我会大胆猜测,部分原因是 1998 年的 C++ 直到 1998 年才被标准化,这使得实现可移植性变得更加困难。
您列出的所有这些语言都是在该标准化之前开发的。
与 C 相比,C++ 的复杂性很大——许多人认为它是现有的最复杂和最容易出错的语言之一。
C++ 的许多特性也存在问题——STL 多年前就已标准化,但它仍然缺乏一个很好的实现。
OOP 固然很棒,但在很多场景下它并没有超过 C++ 的不足之处。
大多数著名的编译器书籍都是用 C 语言编写的示例。另外两个主要工具 lexx(构建词法分析器)和 yacc(将语法转换为 C)支持 C。
如果问题是关于为什么是 C 而不是 C++,那么答案归结为这样一个事实,即当您实现脚本语言时,C++ 对象模型就会出现在您的面前。它非常受限制,您将无法将其用于您自己的对象。
因此,您只能将其用于内部,并且它们通常不会从 C++ 中获得足够的好处,而不是更简单的 C 语言,这使得移植和分发更容易。
在 C 中实现脚本语言的唯一问题是缺少协程支持(您必须以某种方式切换堆栈指针),最重要的是,没有大量开销(与 C++ 相比)无法进行异常处理。