用C或C ++编写编译器?

时间:2011-01-07 01:27:16

标签: c++ c comparison compiler-theory

我想为自定义标记语言编写一个编译器,我希望获得最佳性能,并且我也希望有一个良好的可扩展设计。

多范式编程语言(C ++)更适合实现现代design patterns,但我认为这会稍微降低性能(例如,考虑RTTI)或多或少会使性能降低C是一个更好的选择。

我想知道什么是最好的语言(C,C ++甚至是客观的C),如果有人想要创建一个快速,高效且良好的现代编译器(在遵守现代软件工程原理作为软件的意义上)设计的。

6 个答案:

答案 0 :(得分:18)

C ++的“昂贵”功能(例如,异常,虚函数,RTTI)在C中根本就不存在。当你用C模拟它们时,你可能最终会得到至少同样昂贵的东西就像它在C ++中一样,但鲜为人知,文档较少等等(让我们面对它:编译器编写者并不愚蠢 - 虽然可能你可以实现比他们“更好”的功能,它是并非特别可能)。

另一方面,模板(例如一个例子)经常使得编写比C中实际更快更快的代码变得相对容易。仅仅为了一个明显的例子,C ++代码使用{{ 1}}通常是使用std::sort的等效C代码的两到三倍。

结论:C ++程序比用C语言编写的等价程序慢的唯一原因是你决定(无论出于何种原因)编写较慢的代码。常见的原因是简单性和可读性 - 在大多数情况下,那些 比执行速度更重要。尽管如此,使用C ++并不一定会带来任何速度惩罚。完全取决于你决定是否做一些可能运行得更慢的事情。

答案 1 :(得分:4)

C ++遵循“仅为您使用的内容付费”政策。由于语言选择,你不会看到性能命中;您的应用程序的性能将完全取决于您的实现。

答案 2 :(得分:3)

您考虑过OCaml吗?函数式语言非常适合编译器编写。模式匹配是一种非常有用的结构,缺乏副作用将使并行化变得容易。

OCaml可以编译为本机代码,其性能可与C和C ++相媲美。它的标准库有点缺乏,但编写编译器并不是很重要。

如果你喜欢.NET环境,F#是一种非常相似的语言。

答案 3 :(得分:1)

以C语言编写编译器作为基本语言的人通常很有意义地使用工具来处理它的某些部分。

具体来说,去了解lex和yacc(在他们的免费实现中,flexbison)。

这个建议几乎肯定适用于您选择的任何其他语言,无论是C ++,Java还是其他任何语言。

答案 4 :(得分:1)

我没有任何链接,但从我听到的和经验来看,C / C ++编写编译器的语言很差。首先,你真的需要它可扩展吗?或者在这个阶段可扩展?特别是对于标记语言?你没有编译60多万亿的源代码,所以我认为你实际上并不需要它可以扩展。

无论如何,对于我的编程语言,我使用bison进行解析器(阅读bison + flex是必须的,尽量避免我的语言没有的所有冲突)。然后我使用C和C ++代码。 C因为bison使用C而我只调用一个简单的C函数,它创建并填充一个结构来创建一个抽象语法树。然后,当它完成时,它调用我的C ++代码,该代码通过AST运行并生成二进制文件。

标准ML假设在创建语言时非常好。如果你不使用它,那么函数式语言是一个很好的选择,因为它符合思维模式(解析可能是从左到右,但你的函数调用不会按顺序)。所以我建议如果你不使用野牛(或者知道如何使用C / C ++和野牛来调用它)。

注意:我尝试过编写两次编译器。第一次在C没有野牛第二次与野牛。毫无疑问,由于野牛为我找到冲突并且我在调试土地上没有注定的事实,它会花费指数更长的时间(我可能实际上试图找到一种方法来报告冲突然后我编写代码这正是野牛所做的事情)

答案 5 :(得分:1)

忘掉你使用的编程语言&鉴于你在这些现代计算机时代拥有巨大的内存支持,你可以写出好的&快速程序使用解释语言,也非常糟糕&使用C / C ++(编译语言)& amp;反之亦然。

重要的是使用正确的数据结构和算法&遵循用于实现它的编程语言的样式/模式。请记住,有人说“OO不是灵丹妙药”&另一方面,其他人也说“显示你的数据结构,我会为你想要解决的问题编写算法代码”。