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