问题标签 [compiler-theory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
8791 浏览

compiler-construction - 解析器、解释器和编译器的学习资源

一段时间以来,我一直想尝试编写自己的语言(表面上是为了学习经验),因此需要在解析器、解释器和编译器的构建方面相对扎实。所以:

  • 有谁知道有关构建解析器、解释器和编译器的任何好的资源?

编辑:我不是在寻找编译器编译器/解析器编译器,例如 Lex、Yacc 和 Bison ......

0 投票
3 回答
780 浏览

.net - 如何为 .NET 制作并行编译器

Nikhil Kothari 的Script#很可能是很长一段时间以来我在 JavaScript 领域看到的最令人惊叹的概念之一。这个问题不是关于 JavaScript,而是关于 .NET 运行时中的语言编译。

我一直对如何使用 .NET 平台为已经具有编译器(如 C#)的语言编写编译器非常感兴趣,该编译器将从原始编译器生成单独的输出,同时允许原始编译器生成输出在相同的构建操作期间使用相同的源,同时也引用/使用其他编译器的输出。

我不完全确定我是否足够了解这个过程,可以用正确的细节提出问题,但这是我目前看到这个过程的方式,根据 Script# docs 中的图表。我考虑过许多​​涉及复杂语言设计和编译的事情,这些事情可能能够利用这样的概念,我对其他人对这些概念的看法很感兴趣。

--

编辑:到目前为止,感谢您的评论;您的信息本身就很有趣,我想对其进行更多研究,但我的问题实际上是关于如何编写可以同时在同一源上运行的自己的编译器使用 CLR 产生多种不同类型的(可能)相互依赖的输出。Script# 用作示例,因为它使用相同的 C# 源代码生成 JavaScript 和程序集,同时使编译的程序集与 JavaScript 协作。我很好奇在设计这种性质的东西时各种方法和理论概念是什么。

0 投票
10 回答
1729 浏览

code-generation - 什么是编译的好资源?

不耐烦的总结:我正在寻找关于为通用语言结构生成代码而不是解析的良好参考。

我对编程语言很感兴趣,并尝试尽可能多地阅读文献。但他们中的大多数都从功能和理论的角度涵盖了这个主题,我发现他们很难理解,更不用说实现这些想法了。

所以问题是;对于以更加命令式和实用的方式涵盖该主题的编程语言实现,您建议使用哪些资源?

例如,我发现“ Lua 5.0 的实现”论文很有启发性。

请注意,我不是在寻找有关解析或标记化的文章。

0 投票
4 回答
3211 浏览

algorithm - 递归计算支配树的有效方法?

我正在使用带有路径压缩的 Lengauer 和 Tarjan 算法来计算具有数百万个节点的图的支配树。该算法非常复杂,我不得不承认我没有花时间完全理解它,我只是在使用它。现在我需要计算根节点的直接子节点的支配树,并可能将图形向下递归到某个深度,重复此操作。即,当我为根节点的子节点计算支配树时,我想假装根节点已从图中删除。

我的问题是,是否有一个有效的解决方案,利用已经在初始支配树中为根节点计算的直接支配信息?换句话说,我不想为每个孩子从头开始,因为整个过程非常耗时。

天真地看起来这一定是可能的,因为在图表的深处会有很多节点,它们的 idms 就在它们上方一点点,并且不受图表顶部的变化的影响。

顺便说一句:支配树的主题由编译器人员“拥有”并且在经典图论书籍中没有提到它,这很奇怪。我使用它的应用程序——我的 FindRoots java 堆分析器——与编译器理论无关。

澄清:我在这里谈论有向图。我指的“根”实际上是可达性最大的节点。我已经更新了上面的文本,用“graph”替换了对“tree”的引用。我倾向于将它们视为树木,因为形状主要是树状。该图实际上是 Java 堆中的对象,并且您可以想象它是合理的层次结构。我发现支配树在进行 OOM 泄漏分析时很有用,因为您感兴趣的是“是什么让这个对象保持活力?” 答案最终是它的支配者。支配树可以让你<ahem>看到树林而不是树木。但有时很多垃圾会漂浮到树顶,所以你有一个根,下面有成千上万个孩子。对于这种情况,我想尝试计算以根的每个直接子节点(在原始图中)为根的支配树,然后可能会向下一层等等。(我暂时不担心反向链接的可能性:)

0 投票
6 回答
2994 浏览

c++ - C++ 不能消除 pimpl 成语吗?

据我了解,pimpl 习惯用法的存在只是因为 C++ 强制您将所有私有类成员放在标题中。如果标头仅包含公共接口,理论上,类实现的任何更改都不需要重新编译程序的其余部分。

我想知道的是为什么 C++ 的设计不是为了提供这样的便利。为什么它要求一个类的私有部分在标题中公开显示(不是双关语)?

0 投票
2 回答
5476 浏览

parsing - LR1 解析器和 Epsilon

我试图了解 LR1 解析器是如何工作的,但我遇到了一个奇怪的问题:如果语法包含 Epsilons 怎么办?例如:如果我有语法:

很清楚如何开始:

... 等等

但我不知道如何为这样的语法做:

这样做是否正确:

然后让这个状态在 DFA 中接受?

任何帮助将不胜感激!

0 投票
9 回答
13133 浏览

compiler-theory - (何时)我应该学习编译器吗?

根据这篇http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html 文章,我绝对应该。

引用温和但坚持的执行摘要:如果你不知道编译器是如何工作的,那么你就不知道计算机是如何工作的。如果你不能 100% 确定你是否知道编译器是如何工作的,那么你就不知道它们是如何工作的。

本来觉得是一篇很有意思的文章,应用领域很有用(帮自己一个忙,看一下) 不过话说回来,我见过成功的高级sw工程师,对编译器不是很了解,或者内部机架构,但确实知道以下列表中每个项目的一两件事:

  • 编程范式(OO、函数式……)
  • 一个编程语言 API(C#、Java ..)和至少 2 个非常不同的人说!(Java/哈斯克尔)
  • 一个编程框架(Java、.NET)
  • 一个让您更有效率的 IDE(Eclipse、VisualStudio、Emacs ......)
  • 编程最佳实践(例如,参见 fxcop 规则)
  • 编程原则(DRY、高内聚、低耦合……)
  • 编程方法(TDDMDE
  • 设计模式(结构、行为……)
  • 架构基础(层、层、流程模型(瀑布、敏捷……)
  • 测试工具(单元测试、模型测试……)
  • 一种 GUI 技术(WPF、Swing)
  • 文档工具(Javadoc、Sandcastle..)
  • 一种建模语言(可能还有工具)(UML、VisualParadigm、Rational)
  • (无疑在这里忘记了非常重要的东西)

并非所有这些工具都是成为一名优秀程序员所必需的(就像您不需要它时的 GUI),但大多数都是。编译器从何而来,它们真的那么重要吗,因为,正如我所提到的,许多程序员似乎在不了解它们的情况下做得很好,特别是,成为一名优秀的程序员被视为众多知识领域几乎是一生的成就:- ) ,所以即使编译器非常重要,难道不是总有更重要的东西吗?

或者我今天应该订购'The Unleashed Compilers Unlimited Bible (in 24H..))) 吗?

对于那些已经阅读文章并想立即开始学习的人:

解析器、解释器和编译器的学习资源

0 投票
9 回答
31228 浏览

compiler-theory - 哪些编程语言是上下文无关的?

或者,更准确一点:哪些编程语言是由上下文无关文法定义的?

据我所知,由于宏和模板之类的原因,C++ 不是上下文无关的。我的直觉告诉我,函数式语言可能是上下文无关的,但我没有任何硬数据来支持它。

简洁示例的额外代表:-)

0 投票
4 回答
310 浏览

language-design - 寻找语言设计师和程序员

我想创建一种新的开源语言。
由于很难找到真正处理编译器理论的程序员,我需要一些建议。
你如何让一个人对你的开源项目感兴趣?
你如何把他带到他想贡献的位置?
有没有特别的地方可以找到那些人(sourceforge.net 除外)?

0 投票
9 回答
6701 浏览

c++ - 编译器是否决定何时内联我的函数(在 C++ 中)?

我知道您可以使用 inline 关键字,或者只是将一个方法放在类声明中,比如短 ctor 或 getter 方法,但是编译器是否会最终决定何时内联我的方法?

例如:

如果编译器认为它会使我的代码效率低下,它会忽略我的内联声明吗?

作为一个附带问题,如果我在我的类之外声明了一个 getter 方法,如下所示:

编译器会在幕后内联吗?