3

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

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

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

4

6 回答 6

21

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

另一方面,模板(例如)通常可以相对容易地编写比 C 中实际速度快得多的代码。仅举一个明显的示例,使用 C++ 代码std::sort的速度通常是等效 C 的两到三倍代码使用qsort.

底线:C++ 程序比用 C 编写的等效程序慢的唯一原因是,如果您决定(无论出于何种原因)编写较慢的代码。常见的原因是简单性和可读性——在大多数情况下,这些执行速度更重要。尽管如此,使用 C++ 并不一定会带来任何速度损失。是否做一些可能运行得更慢的事情完全由您决定。

于 2011-01-07T01:47:57.117 回答
4

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

OCaml 可以编译为本机代码,其性能可与 C 和 C++ 媲美。它的标准库有些欠缺,但是您实际上并没有太多其他东西可以编写编译器。

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

于 2011-01-07T01:45:42.687 回答
4

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

于 2011-01-07T01:30:14.227 回答
1

忘记您使用的编程语言,并且考虑到您在这些现代计算机时代拥有巨大的内存支持,您可以使用解释语言编写好的和快速的程序,也可以使用 C/C++(编译语言)编写非常糟糕和慢速运行的程序,反之亦然。

重要的是使用正确的数据结构和算法并遵循您用来实现它的编程语言的风格/模式。请记住,有人说“OO 不是灵丹妙药”,而另一方面,其他人也说“显示您的数据结构,我将为您尝试解决的问题编写算法”。

于 2011-01-07T08:29:28.373 回答
1

用 C 作为基本语言编写编译器的人通常很清楚使用工具来处理其中的某些部分。

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

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

于 2011-01-07T01:48:22.450 回答
1

我没有任何链接,但从我听到的和经验来看,C/C++ 是一种编写编译器的糟糕语言。首先,你真的需要它是可扩展的吗?还是现阶段可扩展?特别是对于标记语言?您没有编译 60+ mb 的源代码,所以我认为您实际上并不需要它是可扩展的。

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

标准 ML 被认为非常适合创建一种语言。如果你不使用函数式语言是一个不错的选择,因为它符合心态(解析可能是从左到右,但你的函数调用不会按这个顺序)。所以我建议如果你不使用野牛(或者知道如何使用 C/C++ 和野牛来调用它)。

注意:我尝试编写了两次编译器。第一次在 C 中没有野牛,第二次使用野牛。毫无疑问,由于野牛会为我找到冲突,而且我不会注定要在调试领域中失败(实际上我可能会在编写代码之前尝试找出一种报告冲突的方法)这正是野牛所做的)

于 2011-01-07T01:52:29.063 回答