Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 制作一门语言,需要一个好的后端_Compiler Construction_Backend_Intermediate Language - Fatal编程技术网

Compiler construction 制作一门语言,需要一个好的后端

Compiler construction 制作一门语言,需要一个好的后端,compiler-construction,backend,intermediate-language,Compiler Construction,Backend,Intermediate Language,我想做一种编译语言。我目前正在评估后端。 到目前为止,我正在研究C语言,因为它的执行速度、编译速度以及一个称为TCC的小型易用编译器 在阅读了关于将它用作中间语言的讨论之后,我试图思考如何使它与垃圾收集兼容,以及如何处理异常。到目前为止,我认为我可以解决这两个问题,但开销很大 以下是我对其他可能的后端的一些想法: 汇编:不可移植,编程时非常麻烦 .NET:感觉真的很慢。5秒启动,5秒评估Ironpython和Boo上的1+2。没有大型库,无法运行 JVM:感觉有点慢。无法访问二进制库。没有大型库

我想做一种编译语言。我目前正在评估后端。 到目前为止,我正在研究C语言,因为它的执行速度、编译速度以及一个称为TCC的小型易用编译器

在阅读了关于将它用作中间语言的讨论之后,我试图思考如何使它与垃圾收集兼容,以及如何处理异常。到目前为止,我认为我可以解决这两个问题,但开销很大

以下是我对其他可能的后端的一些想法:

  • 汇编:不可移植,编程时非常麻烦
  • .NET:感觉真的很慢。5秒启动,5秒评估Ironpython和Boo上的1+2。没有大型库,无法运行
  • JVM:感觉有点慢。无法访问二进制库。没有大型库,无法运行
  • LLVM:不支持windows。我听说编译后的可执行文件大小是16MB+
  • 看起来不发达
  • C++:可能。找不到一个好的小的免费的我可以捆绑
  • 你们中有谁能改变我的想法,或者在这个列表中添加更多的内容吗

    编辑

    我最近一直在试验LLVM。我发现他们已经预编译了二进制文件,可以编译成本机程序集

    以下是步骤:

  • 在llvm程序集上运行llvm as,这将生成一个llvm字节码文件
  • 在LLVM字节码文件上运行llc以生成程序集文件
  • 在程序集文件上运行汇编程序以生成对象文件。(或者运行llvm ld,它似乎依赖于外部安装的c编译器)
  • 使用gcc等编译为可执行文件

  • C++不会给你太多,用C来代替。但是如果你想在网络上使用你的语言,可以使用.NET或Java,当然它们的加载速度很慢,但是当它们加载时,它们的速度和C一样快。

    因为我们使用C作为后端


    Tcc对于开发来说是一个非常好的选择——虽然不是最终版本(生成的对象相当于gcc-O0)

    您考虑过为其编写前端吗?我提到这一点只是为了完整性——据我所知,后端接口相当复杂,代码库庞大且难以理解

    另一方面,GCC是一个成熟的产品,许多专家程序员都在使用它。至少,它可能提供了所有备选方案中最坚实的基础

    就我个人而言,我更喜欢LLVM(激动人心的体系结构)或.NET的IL:very,very-very-easy-use,具有强大的工具支持(,最后但并非最不重要的是,.NET反射API)和两个非常高效的实现(即Microsoft的规范实现和Mono)


    但我不能声称自己在任何体系结构方面都有专业知识,因此对此答案持保留态度。

    在这种情况下,LLVM可能是一个更好的选择


    LLVM支持Windows,只需花一些时间编译另一个添加到列表中:Slava最近在一个平台上实现了Smalltalk。我自己还没有试过,但我觉得它会提供更多您想要的功能,更像是高级别的,更像是低级别的。TCC是最好的选择。它是可移植的,并且有一个库,因此可以很容易地用作后端,称为libtcc。可执行文件比GCC小,它是ANSI C.< /P>我喜欢C++,因为它已经有堆栈解卷异常,我可以封装指针,使它们变得更垃圾,不友好,不幸的是编译器可用的似乎非常大,需要更长的时间来编译。你的也是其中之一。您是否很难输出易于垃圾收集的C代码?我们有自己的GC实现,每种类型都有专门的bucket(我们的语言是封闭的;每种类型在编译时都是已知的)。唯一复杂的部分是确保标记每个活动对象:我们在堆栈+寄存器中使用一些标记,为那些需要它的架构进行保存。从目前为止我对它的理解来看,我不想强迫用户安装大型运行时,这需要3 GB来编译。LLVM不是一个运行时,它是一个编译器框架。一旦您的应用程序被编译,它将在windowsI上以任何其他本机二进制文件的形式运行,只阅读提到字节码编译的文档。即使它允许静态编译,我甚至没有3 GB的内存在windows下编译它,也不能指望其他人也能编译。Duplicates@norman,我的问题有更多信息。我不太满意那里的答案。我已经开始使用C++作为后端,所以我不必实现STL容器和OOP。我尝试了TCC,发现它小巧快速,但我听说它编译的代码根本没有经过优化。