编写编译器……什么是对的,什么是错的? [关闭]

2024-01-18

好吧,在我寻找编写编译器所需的东西的过程中,我遇到了一些障碍。似乎我发现的每一项技术或工具都有一些反对的地方。

我现在使用 Bison 和 Flex,但我感觉这种方法已经过时了。这是真的?这是继续编写成熟的编程语言的良好前向兼容方式吗?

在大量不同的概念和工具(ANTLR、LL(k)、GLR、LALR、LLVM、Flex、Bison)中,编写编译器的当前趋势和最佳实践是什么?龙书过时了吗?


除非您想编写一个真正简单的编译器,否则您的重点是错误的。

编写编译器只是编写解析器的一小部分。拥有一个解析器就像 当问题是攀登珠穆朗玛峰时,攀登喜马拉雅山的山麓。当你到达山顶并抬头仰望时……只剩下 20,000 英尺了,而你只完成了真正容易的部分。您会注意到,到达山顶所需的技术比走完其余路程所需的技术要容易得多。

(仅供参考:目前最好的解析技术是GLR http://en.wikipedia.org/wiki/GLR_parser,这很容易 接受不明确的语法而不破坏语法。 GLR甚至可以轻松解析C++, 这违反了 C++ 难以解析的民间定理。民间定理 来自尝试使用 YACC 和 ANTLR 解析它的人)。

要构建编译器,您需要大量机器:

  • AST大楼
  • 符号表构建
  • 控制流分析
  • 数据流分析
  • 程序代码本质上表示为数据流计算(SSA 或三元组)
  • 目标机器的型号
  • 将程序代码映射到机器指令的方法
  • 寄存器分配
  • 优化:恒定传播、循环展开……

我们甚至还没有接近全局流分析、全局优化或特殊处理 适用于涉及 SIMD 指令或缓存优化的现代指令集。 ... 这样的例子不胜枚举。 Dragon 书对基本主题进行了很好的介绍,但没有涉及任何高级主题。您需要库珀的“工程编译器”和穆奇尼克的“高级编译器设计”作为参考,如果您在开始之前仔细浏览一下它们,那就太好了。

构建一个现代编译器是一项工程壮举。

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

编写编译器……什么是对的,什么是错的? [关闭] 的相关文章

随机推荐

  • 为什么空的 MongoDB 数据库这么大?

    当我使用命令创建新的 mongoDB 数据库实例时 mongod dbpath db where db是我在调用命令的目录中创建的文件夹 运行此命令并检查目录的大小后 我发现一切都结束了300MB大小 当其中没有数据时 这里发生了什么 谢谢
  • 如何配置 Spring Sockjs Java 客户端消息转换器

    我有一个使用 STOMP 的 SockJS Java 客户端 是基于这个https github com rstoyanchev spring websocket portfolio blob master src test java or
  • Ember.js 中的多种布局?

    来自 Rails 背景的您可以拥有多个布局 例如 匿名用户页面和经过身份验证的页面 Ember 可以做到这一点吗 我尝试在我的 UsersRouter 中声明一个新的 templateName 但没有成功 我还检查了本指南 http emb
  • 如何指定或获取 NativeScript 文本字段的资源 ID

    我们在我们的移动应用程序中使用带有 Angular 的 NativeScript 我想使用 Google Play 预发布报告功能 但我们的应用程序需要输入密码 Google Play 允许指定密码 但您需要一个资源名称 以便测试脚本可以识
  • .click() 在 IE11 中拒绝访问

    当尝试调用 click of an anchor tag to auto click网址 该代码在所有浏览器中都可以正常工作 除了Internet Explorer v11 任何帮助将不胜感激 var strContent a b c n1
  • C++ 中读取大型 CSV 文件的性能问题

    我需要读取许多大的 CSV 文件以在 C 中进行处理 范围从几 MB 到数百 MB 首先 我使用 fstream 打开 使用 getline 读取每一行并使用以下函数 分割每一行 template lt class ContainerT g
  • 持续集成时js的最佳打包策略?

    我需要打包所有的 js 但需要将其编辑到源代码管理中 有没有一个很好用的 ccnet 或 nant 插件 它可以让我打包我的 js 并在投入生产时将它们存储在相同的文件中 并不是真正寻找文件合并 只是缩小每个文件 这是我找到的最佳答案 它调
  • C++ std::atomic 变量的线程同步问题

    当下面的程序偶尔打印 坏 输出时 它会给我带来意想不到的行为 两个线程应该使用两个 std atomic 变量 s lock1 和 s lock2 进行同步 在 func2 中 为了将 s var 变量设置为 1 它必须以原子方式在 s l
  • Node.js 是否有相当于 Python 迭代器工具?

    我正在尝试移植一些使用 Python 的代码迭代器工具 https docs python org 2 library itertools html到 Node 但是我没有看到任何类似的东西 我正在专门寻找 itertools combin
  • Windows 服务 - 在“可执行文件的路径”中提供参数

    我不知道如何在 Windows 服务启动时将 常量 参数传递给它 我使用标准 NET 类 例如 ServiceBase 来实现 并使用 ServiceProcessInstaller 和 ServiceInstaller 来安装 我的服务
  • Objective-c 函数指针

    我需要做这样的事情 id myFunction aMethodDeclaredInMyClass self myFunction 任何帮助表示赞赏 如果您提前知道方法 self performSelector selector myMeth
  • 使用 C++ dll 的 C# 应用程序中的堆栈溢出

    我有一个使用 c cli 托管 dll 的 C 程序 该dll包含大量遗留代码 由相当多的win32窗口组成 问题是 dll 中的窗口需要比平均水平多一点的堆栈空间cough 由于这些不是后台进程 而是 win32 api 我需要扩大 GU
  • 在我的 Xampp 本地主机中哪里可以找到 .htaccess 文件

    我这里有一个简单的问题 我是使用 php 和 apache 的初学者 实际上我想修改 htaccess 中的一些配置 但我找不到 任何人都可以告诉我它位于哪里 TIA htaccess设置目录特定设置 它可以进入每个网络目录根据需要更改设置
  • 我真的应该删除 ValueEventListener 吗?

    DatabaseReference Ref FirebaseDatabase getInstance getReference Constants Client path Ref keepSynced true Ref addValueEv
  • 在 asp.net 中使用 SAML2.0 进行 SSO

    我的要求是在asp net中使用SAML2 0实现SSO 我这边确实有 2 个供应商 想要将用户从一个站点传递到另一站点而不登录第二个站点 我以前从未使用过SAML2 0 谁能帮我看看我该如何完成它 首先让我们区分协议和令牌格式 我假设您正
  • 在模态框中打开网页?

    这可能吗 不仅是 html 还有不同的样式表等 同时遮蔽屏幕的其余部分 谢谢你的帮助 Ann 查看Colorbox http colorpowered com colorbox Demo http colorpowered com colo
  • 从 Dart 中的 JavaScript 对象获取任意属性

    Edit 这是一个说明我的问题的最小项目 https github com ahirschberg dart js interop toy您可以通过将其提供给浏览器来查看所描述的错误 pub get然后要么pub serve 飞镖 或pub
  • mysql 按字母顺序排列

    我正在尝试按字母顺序对 mysql 数据进行排序 一个 乙 C D 当我点击 B 时 此查询运行 按 b 从用户顺序中选择名称 但结果显示以 a 或 c 或 d 开头的所有记录 我想显示仅以 b 开头的记录 感谢帮助 我想显示仅以 b 开头
  • “git revert”中的“他们”和“我们”是谁?

    我无法理解谁us and them在这些冲突中git revert 所以我真的不知道这里发生了什么 git revert some commit hash Then git status显示以下冲突 deleted by them path
  • 编写编译器……什么是对的,什么是错的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi