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

2024-01-08

我想做一种编译语言。我目前正在评估后端。 到目前为止,我之所以关注 C,是因为它的执行速度、编译速度以及一个名为 TCC 的小型且易于使用的编译器。

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

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

  1. 汇编:不可移植并且编程非常痛苦。
  2. .NET:感觉真的很慢。 Ironpython 和 Boo 上 5 秒启动,5 秒评估 1+2。没有大库就无法运行。
  3. JVM:感觉有点慢。无法访问二进制库。没有大库就无法运行。
  4. LLVM:不支持 Windows。我听说编译后的可执行文件大小为 16 mb+
  5. C--:看起来不发达。
  6. C++:可能。找不到一个可以捆绑的漂亮的小型免费产品。

你们中有人可以改变我的想法或者有更多内容可以添加到此列表中吗?

Edit

我最近一直在尝试 LLVM。我发现他们有预编译的二进制文件,并且可以编译为本机程序集。

http://www.antlr.org/wiki/display/CS652/Generate+machine+executable+binaries+with+LLVM http://www.antlr.org/wiki/display/CS652/Generating+machine+executable+binaries+with+LLVM

步骤如下:

  1. 在 LLVM 程序集上运行 llvm-as,这会生成 LLVM 字节码文件。
  2. 在 LLVM 字节码文件上运行 llc 以生成汇编文件。
  3. 对汇编文件运行汇编程序以生成目标文件。 (或者运行 llvm-ld ,它似乎依赖于外部安装的 C 编译器)
  4. 使用 gcc 等编译为可执行文件。

你有没有考虑过编写一个前端GCC http://gcc.gnu.org/?我提到这一点只是为了完整起见——据我所知,后端接口相当复杂,代码库庞大且难以理解。

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

就我个人而言,我更喜欢 LLVM(令人兴奋的架构)或 .NET 的 IL:非常非常容易使用,有很好的工具支持(反射器 http://www.red-gate.com/products/reflector/, Cecil http://www.mono-project.com/Cecil, Reflexil http://sebastien.lebreton.free.fr/reflexil/最后但并非最不重要的一点是.NET 反射 API)和两个非常高效的实现(即 Microsoft 的规范实现和 Mono)。

但我不能声称自己拥有任何架构方面的专业知识,因此对这个答案持保留态度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作一门语言,需要一个好的后端 的相关文章

  • 一次绘制一个图形而不关闭旧图形(matplotlib)

    有没有一种方法可以一次绘制一组图形 而不关闭前一个图形 保持对 UI 的控制 并在最后保持图形打开 也许使用更合适的后端 或者使用 OO 风格而不是下面使用的 pyplot pylab 风格来编写它 例如我知道我能做到 plt ioff f
  • 从字符串编译Java源代码? [复制]

    这个问题在这里已经有答案了 有没有办法让正在运行的Java程序编译Java源代码 作为字符串传递 Class newClass Compiler compile class ABC void xyz etc etc 理想情况下 传入源代码引
  • Java 中的匿名类是如何编译的?

    我听说 Java 字节码实际上不支持任何类型的未命名类 javac 如何将未命名的类转换为命名的类 它综合了形式的名称EnclosingClass n 其中 n 是匿名类的计数器EnclosingClass 因为使用 不鼓励使用标识符 这些
  • 如何使用放心发送Content-Type表单数据请求?

    我需要使用 Rest Assured 调用表单数据类型 API 这是我的代码 private Map
  • switch-case 结构是否以二分搜索的形式实现?

    我想知道如何switch case语句执行 Example 假设有以下代码 Scanner sc new Scanner System in int v sc nextInt switch v case 0 System out print
  • 被调用的函数在被调用后如何返回给调用者?

    我读到 当程序进行函数调用时 被调用的函数必须知道如何返回其调用者 我的问题是 被调用的函数如何知道如何返回其调用者 是否有一种机制通过编译器在幕后工作 编译器遵循特定的 调用约定 该约定定义为您所针对的 ABI 的一部分 该调用约定将包括
  • 如何从java程序中编译.java文件[重复]

    这个问题在这里已经有答案了 可能的重复 从 Java 内部编译外部 java 文件 https stackoverflow com questions 10889186 compiling external java files from
  • 接口作为类型约束和接口作为参数之间的区别?

    如果我想创建一个采用实例的方法IList作为参数 或任何其他接口 但让我们使用IList作为一个例子 我可以创建一个带有类型约束的通用方法 例如 public static void Foo1
  • 使用 gcc 的中间 GIMPLE 格式

    根据本文 http en wikipedia org wiki Intermediate languagegcc 在生成代码之前使用多种中间格式 我读到 GIMPLE 格式使用三个地址代码 这似乎是最容易使用的中间语言 但我需要更多细节 因
  • 向 Java 类添加编程注释

    使用示例 我想在类字段上添加一个自定义注释 MyContainer 然后在所有此类字段上自动添加相关的 Hibernate 注释 取决于字段类型和属性 另外 我需要向类添加 JAXB XmlType 注释 并使类型名称基于类名称 我还想根据
  • 警告:格式“%d”需要类型“int *”,但参数 2 的类型为“int”

    所以我是 C 的新手 并且对这个警告发生的情况遇到了麻烦 该警告是什么意思以及我该如何解决它 我写的代码在这里 void main void char name int age 0 printf input your name n scan
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • 我收到此警告: com.sun.org.apache.xml.internal.serialize.OutputFormat 是 Sun 专有 API,可能会在未来版本中删除

    我的代码是 OutputFormat wOf new OutputFormat XML ISO 8859 1 true 帮我解决这个警告 提前致谢 一种解决方案是不使用该类 另一种解决方案是忽略该警告 看看这个类 我怀疑这是唯一可行的解 决
  • dart javascript 编译器 (dart2js) 如何工作?

    Dart 在其自己的 Dart VM 中运行 但您可以将其编译为现代优化的 JavaScript 但这是如何运作的呢 网上有任何文章或论文解释该过程吗 我想知道这是否是一个简单直接的元素与元素匹配 仅耗时开发 处理 或者 Dart 的某些元
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 了解C/C++中函数调用的堆栈框架? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我也是 C C 和汇编语言的新手 这
  • 使用 std::function w/ std::bind 时的 EXC_BAD_ACCESS

    升级到 XCode 5 后 使用 std function 和 std bind 似乎会生成 EXC BAD ACCESS 异常 看起来好像 std function 实现中的 base 指针最终为空 导致访问错误 但我不清楚为什么会出现这

随机推荐

  • Mathematica 中的词法和动态作用域:带有 Module、With 和 Block 的局部变量

    以下代码如您所料返回 14 Block expr expr 2 z f z expr f 7 但如果你改变这一点Block to a Module然后它返回2 z 除了其他变量之外 其他变量似乎并不重要expr你本地化 我以为我理解 Mat
  • jquery val() contains()

    我想知道文本区域值是否包含某个单词 这对我不起作用 var value embedModal textarea val if value contains iframe 尝试 JavaScript if value indexOf ifra
  • 如何在 VBA 中的两个打开的 Excel 实例之间进行复制?

    我想将数据从一个已打开的 Excel 实例复制到 VBA 中的另一个 Excel 实例 我试过 Option Explicit Sub copy paste Dim destination sanitized As String Dim f
  • Objective-C 设置 nil 和释放 nil 的区别

    我了解到 在dealloc you do object release but in viewDidUnload 在 UIViewController 子类中 你做self object nil 真正的区别是什么 因为self object
  • 带有 Youtube API 的 Chrome 扩展程序显示不一致的结果

    我正在构建一个 chrome 扩展来使用 youtube 的 API 它是这样工作的 内容脚本会通过 manifest json 自动注入到每个 YouTube 页面上 permissions tabs http https
  • 脚本内的 match_query ? [弹性搜索]

    我有一个相当复杂的聚合 它的复杂性是由于缺少 has parent 聚合引起的 既然如此 它是使用groovy 实现的 我遇到的唯一问题是过滤聚合中计数的文档 聚合看起来像这样 https gist github com serj p c4
  • 将自定义字段添加到课程 Moodle [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 Moodle 新手 我需要您的建议来创建插件 该插件将在 添加 编辑课程 页面上添加自定义字段 并将输入值存储在mdl cour
  • Angular 2 SVG 未渲染

    我创建了一个组件来渲染我的应用程序中的 SVG 图像 它们是动态加载的 但是 我的演示应用程序仅显示一个更简单的版本 http plnkr co edit g2tZXeUAMJ5zESx2EHT0 p info http plnkr co
  • 如何旋转 UIWebView 嵌入视频

    所以我正在构建的应用程序遇到了这个问题 我无法弄清楚 我的应用程序具有以下结构 UITabBarController gt UIViewController gt UIViewController 最后一个视图控制器包含一个加载整个页面的
  • 如何使用 System.DirectoryServices.Protocol 验证用户名/密码?

    首先 我不能使用活动目录 所以我不能使用System DirectoryServices直接地 这将是一台向 Novell 网络发送查询的 PC 其中仅System DirectoryServices Protocol是支持的 我非常确定我
  • 在 Swift 2 中安排特定时间的本地通知

    我浏览过这些论坛和其他网站 但不断得到一些不合逻辑的答案 本质上 我想创建一个在每个工作日的上午 6 28 中午 12 28 和下午 5 28 触发的通知 我有一些解决方案 但我真的不确定该去哪里 我的设置完全正确吗 任何帮助表示赞赏 le
  • 使用 Swift 创建随机图像生成器

    我试图让随机图像出现在屏幕上 但我是 Swift 新手 不知道如何做到这一点 打开应用程序时 我希望在图像视图中随机显示三张图像 我该怎么做呢 生成 0 到 2 之间的随机数 并通过随机生成的数字显示图像 var random arc4ra
  • ASP.NET 会话 - 使用或不使用电子商务应用程序以及最佳实践

    我在大多数 Intranet 场景中使用过 ASP NET 并且非常熟悉它 但对于诸如购物车或类似会话数据之类的东西 有多种可能性 仅举几例 1 状态服务器会话 2 SQL Server 会话 3 自定义数据库会话 4 饼干 您使用了什么以
  • SymPy 虚数

    我正在编写一些 SymPy 代码来处理带有虚数的符号表达式 首先 我想让它把 x 和 y 作为实数并找到 x iy 的解 所以我可以按如下方式执行此操作 x y sympy symbols x y real True print sympy
  • 如何将连接字符串中的“提供商名称”添加到上下文文件中?

    我正在使用 Entity Framework 5 代码优先方法 这是我的上下文文件 using IMS Domain Inventory using IMS Domain Security using IMS Domain StoredPr
  • 如何重定向“time”命令的输出?

    我尝试重定向 time 命令的输出 但我不能 time ls gt filename real 0m0 000s user 0m0 000s sys 0m0 000s 在文件中我可以看到输出ls命令 而不是time 请解释一下为什么我不能以
  • 如何更改 TabHost 中的选项卡图像

    我在应用程序中使用 TabHost 在应用程序中使用四个选项卡 并且当选择特定选项卡和未选择特定选项卡时 我想在 TabHost 中使用不同的图像 我需要为每个特定选项卡使用不同的图像 当我选择任何选项卡时 图像有点亮 当我切换到另一个选项
  • 为不同平台创建独立的 Java 可执行文件,无需安装

    我使用 jlink 创建了一个 Java 应用程序运行时映像 我希望能够将软件作为可执行文件发送到不同的平台 最好是在一个平台上构建 例如交叉编译 理想情况下 它是一个用户可以双击启动的应用程序文件 而无需安装任何东西 如何才能做到这一点
  • 如何在 SQL Server 中比较两列是否相等?

    我有两列根据某些条件连接在一起 但我还想检查其他两列是否相同 然后返回一个位字段 如果相同 有没有比使用 CASE WHEN 更简单的解决方案 理想情况下我可以使用 SELECT Column1 Column2 AS MyDesiredRe
  • 制作一门语言,需要一个好的后端

    我想做一种编译语言 我目前正在评估后端 到目前为止 我之所以关注 C 是因为它的执行速度 编译速度以及一个名为 TCC 的小型且易于使用的编译器 阅读了这里关于将其用作中间语言的讨论后 我正在尝试思考如何使其与垃圾收集兼容并处理异常 到目前