为什么许多虚拟机在看起来像是具有C ++功能时用C语言编写?

时间:2009-04-23 01:58:13

标签: c++ c programming-languages vm-implementation

我注意到一些不太老的VM语言,比如用C语言编写的Lua,NekoVM和Potion。

看起来他们正在重新实现许多C ++功能。

用C而不是C ++编写它们有什么好处吗?

9 个答案:

答案 0 :(得分:23)

我对Lua有所了解。

  • Lua是用纯ANSI标准C编写的,可以在任何ANSI平台上编译,没有错误也没有警告。因此, Lua几乎可以在世界上的任何平台上运行,包括Canon PowerShot cameras之类的内容。让C ++在奇怪的小嵌入式平台上运行要困难得多。

  • Lua是一个高性能的虚拟机,由于C无法表达方法调用(可能是虚拟的或可能不是)和运算符重载,因此很容易预测C代码的性能强大>只是通过查看代码。 C ++,特别是模板库,使得在不了解资源的情况下刻录资源有点太容易了。 (Lua的完整实现不仅包括VM,而且库适用于145K的x86目标代码。整个语言甚至适用于256K高速缓存,你可以在Intel i7上的L2和旧芯片上的L1上找到。除非你真的知道什么你正在做的事情,编写C ++并编译成这么小的东西要困难得多。)

这是在C中编写VM的两个很好的理由。

答案 1 :(得分:6)

  

看起来他们正在重新实现许多C ++功能。

您是否建议在C ++中实现多态而不是C?我觉得你错了。

如果用C ++编写VM,就不会在C ++的多态性方面实现多态性。您将滚动自己的虚拟表,将函数名称映射到指针或类似的东西。

答案 2 :(得分:5)

人们已经习惯了C.我必须承认,我更有可能为自己的项目编写C语言,即使我从cfront 1.0开始编写C ++。

如果你想完全控制事物,C会更容易一些。

答案 3 :(得分:5)

一个明显的答案是互操作性。每当语言X必须调用语言Y中定义的函数时,通常要确保X或Y是C(语言C,即)

C ++没有定义ABI,因此从另一种语言调用C ++代码有点棘手。但是调用C代码几乎是微不足道的。这意味着至少部分VM可能必须用C语言编写,然后为什么不能保持一致并用C语言编写整个内容?

C的另一个优点是它很简单。每个人都可以阅读它,并且有很多程序员可以帮助你编写它。无论好坏,C ++都是专家语言。你可以在C ++中做很多令人印象深刻的事情,它可以为你节省大量的工作,但也有更少的程序员真正擅长它。

答案 4 :(得分:3)

在C ++中变得“好”要困难得多,并且在擅长C ++之前,他们会遇到很多错误和问题。现在,特别是在与很多人一起开展大型项目时,其中一个项目不够好的可能性要大得多,因此用C编写项目通常风险较小。还有可移植性问题 - C代码比C ++更容易在编译器之间移植。

答案 5 :(得分:3)

Lua还有很多在Lisp中很容易实现的功能,那么为什么不把它作为基础呢?关键是C只是一个美化的汇编程序代码,只有一层薄的抽象。它就像一块有点抛光的空白石板,您可以在其上构建更高级别的抽象。 C ++就是这样一个建筑。 Lua是一个不同的建筑,如果它必须使用C ++抽象,它将不得不围绕现有的C ++结构弯曲它的意图。从空白平板开始,您可以自由地按照自己的意愿构建它。

答案 6 :(得分:0)

C ++在C中实现。我怀疑每个人都遵循C ++方法。

尽管现代C ++编译器跳过(或隐藏)显式C ++到C转换作为一个离散步骤,但C ++语言具有源于底层C实现的特性。

两个例子。

  • 除引用之外的指针完全是因为C.引用就足够了,这就是Java,Python和Ruby都可以工作的方式。

  • 这些类不是运行时存在的第一类对象,因为该类只是在底层C代码中定义属性和方法函数的一种方法。类对象在Java,Python和Ruby的运行时存在,并且可以被操作。

答案 7 :(得分:0)

在许多情况下,C语言中的代码可能比C ++快得多。例如,stdio.c库中的大多数函数都比iostream快。 scanf比cin快,printf比cout快。

并且虚拟机要求高性能,因此C代码非常有意义,尽管程序很可能需要更长的时间来开发。

答案 8 :(得分:0)

请注意,您应该研究CLR(Rotor-incarnation)和Java源代码,您会注意到它远远超过C ++ - as-C而不是现代或优秀的C ++。所以它在那里是平行的,它是抽象玩具的副作用,并使其在管理语言中为人群带来平均性能。

它还有助于避免天真C ++使用的陷阱。例外和所有其他类型的事情(在促进咨询开始时大卫的位置开始,甚至在他们找到工作之前我们建立音序器和音频采样的时候:)也是一个问题..

Python集成是另一个问题,并且在例如boost中有一个混乱的历史。但对于原始数据类型和接口/互操作和机器抽象,很明显没有什么比C更好。没有编译器问题,它仍然在你得到任何有影响力的东西之前,先引导很多东西。

Stepanov在攻击STL时认识到了这一成就,并且Bjarne用模板钉住了它。这些是值得思考的三件事,因为你没有在流行的托管语言中体现它们,而不是那种表现力和力量。所有这一切超过20年后,这是非常显着的,仍然通过C / C ++引导。善良的遗产(但我不是在捍卫'黑暗时代'C代码c1982-2000,只是这个想法,你可以滥用任何东西)。

相关问题