C或C++写编译器?

f1tvaqid  于 2023-11-19  发布在  其他
关注(0)|答案(6)|浏览(115)

我想写一个自定义标记语言的编译器,我想获得最佳性能,我也想有一个良好的可扩展设计。
多范式编程语言(C++)更适合实现现代design patterns,但我认为这会降低性能(例如RTTI),这或多或少可能使C成为更好的选择。
我想知道,如果有人想创建一个快速、高效、设计良好的现代编译器(从遵守现代软件工程原则的意义上说,作为一个软件),什么是最好的语言(C、C++甚至是目标C)。

esyap4oy

esyap4oy1#

C的“昂贵”特性当你在C中模拟它们的时候,你可能最终得到的东西至少和C中一样昂贵,但是不太为人所知,文档较少,等等。(让我们面对现实:编译器编写者并不愚蠢--虽然你有可能比他们更好地实现一个功能,但这并不是特别可能)。
在另一个方向上,模板(举个例子)通常可以相对容易地编写比C实际速度快得多的代码。举个明显的例子,使用std::sort的C代码通常比使用qsort的等效C代码快两到三倍。
底线是:C
程序比用C编写的等效程序慢的唯一原因是,(不管出于什么原因)写得更慢的代码。常见的原因是简单性和可读性--在大多数情况下,这些比执行速度更重要。尽管如此,使用C++并不一定会带来任何速度损失。完全由你决定是否做一些可能会运行得更慢的事情。

hs1ihplo

hs1ihplo2#

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

bqujaahr

bqujaahr3#

你考虑过OCaml吗?函数式语言非常适合编译器的编写。模式匹配是一个非常有用的构造,并且没有副作用,这使得并行化变得容易。
OCaml可以被编译成本机代码,它的性能与C和C++相当。它的标准库有点缺乏,但你真的没有太多的东西来编写编译器。
如果你喜欢.NET环境,F#是一种非常相似的语言。

8xiog9wr

8xiog9wr4#

用C作为基本语言编写编译器的人通常有很好的意识,可以使用工具来完成某些部分。
具体来说,去了解lex和yacc(在它们的免费实现中,flexbison)。
这个建议几乎可以肯定适用于你选择的任何其他语言,无论是C++,Java还是其他语言。

o0lyfsai

o0lyfsai5#

我没有任何链接,但从我所听到的和经验的C/C是一个穷人的语言编写编译器。首先,你真的真的需要它是可伸缩的?或可伸缩的在这个阶段?特别是对于标记语言?你没有编译60+ MB的源代码,所以我不认为你实际上需要它是可伸缩的。
无论如何,对于我的编程语言,我使用野牛作为解析器(阅读野牛+flex是必须的,然后我使用C和C
的代码。C因为野牛使用C,我只是调用一个简单的C函数,它创建并填充一个结构来创建一个抽象语法树。然后当它完成时,它调用我的C运行AST并生成二进制文件的代码。
标准ML被认为非常适合创建语言。如果你不使用,函数式语言是一个很好的选择,因为它符合思维方式(解析可能是从左到右,但你的函数调用不会按照这个顺序)。所以我建议如果你不使用野牛(或者知道如何使用C/C
和野牛调用它)。
注意事项:我试着写了两次编译器。第一次用C,没有野牛,第二次用野牛。毫无疑问,它会花我成倍的时间,因为事实上,野牛为我找到了冲突,我并没有注定在调试土地(我可能会尝试找出一种方法来报告冲突之前,我写的代码,这正是野牛所做的)

mwngjboj

mwngjboj6#

忘记你使用的编程语言吧,在现代计算机时代,你有巨大的内存支持,你可以使用解释语言编写好的和快速的程序,也可以使用C/C++(编译语言)编写非常差的和运行缓慢的程序,反之亦然。
重要的是使用正确的数据结构和算法,并遵循你用来实现它的编程语言的风格/模式。记住,有人说“OO不是万能药”,另一方面,也有人说“展示你的数据结构,我会为你试图解决的问题编写算法”。

相关问题