问题标签 [compiler-development]

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 投票
9 回答
4430 浏览

c++ - 如何让我自己的 C++ 编译器理解模板、嵌套类等 C++ 的强大特性?

编写类 C 语言的编译器是我小组的一项大学任务。当然,我将实现我们心爱的 C++ 的一小部分。
确切的任务是绝对愚蠢的,讲师告诉我们它需要是自编译的(应该能够自己编译)——所以,他的意思是不要使用诸如 Boost 和 STL 之类的库。
他也不希望我们使用模板,因为它很难实现。
问题是 - 这对我来说是真的吗,因为我将自己编写这个项目,截止日期为 5 月底 - 6 月中旬(今年),不仅要实现模板,还要实现嵌套语法分析级别的类、命名空间、虚函数表?
PS 我不是 C++ 中的菜鸟

0 投票
5 回答
785 浏览

optimization - 编译器优化问题

  1. 编译器消除重复子表达式重新计算的方法有哪些?你如何跟踪子表达式?你如何识别重复的?
  2. 除了按位运算符的使用之外,常见的编译器还使用了哪些强度降低技术?
0 投票
3 回答
218 浏览

compiler-construction - 环裂变是否在单核中工作?

如果我为单核处理器编译,什么时候使用循环裂变/分布有意义?

0 投票
2 回答
3169 浏览

compiler-construction - 什么是 A 范式?

我正在阅读各种中间形式,但除了类似 wiki 的条目之外,我无法获得有关 A-normal 形式的信息。这里有人知道这件事或有很好的资源吗?

0 投票
2 回答
992 浏览

parsing - 如何在编译器中实现前向引用?

我正在使用 Lex 和 YACC(实际上是 Flex 和 Bison)创建一个编译器。该语言允许无限前向引用任何符号(如 C#)。问题是在不知道标识符是什么的情况下解析语言是不可能的。

我所知道的唯一解决方案是对整个源进行 lex,然后进行“广度优先”解析,因此类声明和函数声明等更高级别的内容在使用它们的函数之前得到解析。但是,对于大文件,这会占用大量内存,并且很难用 YACC 处理(我必须为每种类型的声明/正文创建单独的语法)。我还必须手写词法分析器(这不是什么大问题)。

我不太关心效率(尽管它仍然很重要),因为一旦我完成它,我将自己重写编译器,但我希望那个版本很快(所以如果有任何快速通用的不能在 Lex/YACC 中完成但可以手工完成的技术,也请提出建议)。所以现在,易于开发是最重要的因素。

这个问题有什么好的解决方案吗?这通常如何在 C# 或 Java 等语言的编译器中完成?

0 投票
6 回答
812 浏览

language-agnostic - 识别不同语言并将它们发送到相应编译器的编译器。可能的?

我在想是否可以将 asp.net、php 和 java 桥接成一个页面。

其实我现在不需要任何这样的东西。这只是一个想法,因为某些语言的某些功能很好,某些功能或其他一些语言很好,所以我在想如果我将所有这些功能组合成一个会怎么样

我的意思是,我正在创建一个页面,其中包含来自所有 3 种语言 asp.net php 和 java 的代码。

或者

或类似的编译器识别不同的代码段并将它们发送到他们的编译器上运行以执行。并且输出可以被XML中的其他语言识别和使用

我并不是说所有语言都可以相互交互。虽然它们可以通过 XML 相互交互。但我只想说文件被编译为具有不同编程语言代码的单个实体,这些代码被发送到各自的编译器以执行并最终返回到父编译器

我正在考虑一个可以开发的编译器,它可以识别不同的语言代码并将它们发送到他们的编译器,就像 .net 框架所做的那样,例如 MSIL

0 投票
1 回答
589 浏览

lexical-analysis - 什么是面向对象的扫描器(词法分析)?

最近我遇到了一个叫做“面向对象的扫描器”的词法分析的概念,但我无法将它与普通的扫描技术区分开来。面向对象的扫描仪中可能有什么额外的东西,请帮助我理解这个概念......在词法分析方面什么是面向对象的?

0 投票
1 回答
326 浏览

optimization - 减少临时变量的数量

我正在编写类似编译器的东西。问题如下:我有一个代码,由一系列分配组成:

大多数“t”变量都是临时的。我想减少临时变量的数量,尽可能多地重复使用它们。所以,我需要重新排列代码,对表达式进行分组,让一些变量接近变量赋值,所以在计算这些表达式之后,变量可以被重用。当然,我想在此过程中保留代码逻辑。执行此操作的最佳算法是什么?

0 投票
2 回答
210 浏览

compiler-construction - 开始编译器项目之前的自述文件

基本上,这首先是一个梦想……有一天我可能拥有自己的编程语言!,但它很快就会变成一场噩梦,就在你寻找如何构建编译器?.

像你们大多数人一样,我花了太多时间阅读龙书以及许多其他文章、资源、论坛和问答。我最终想到的是大量了解许多不必要的东西,例如所有主要的解析技术甚至编译器优化,但仍然不清楚我最终需要用我的编译器项目做什么。

问题在于你需要从一开始就理解(和掌握)整个事情的所有书籍和其他资源!您需要理解和实现解析器,而您仍然不知道接下来应该做什么。顺便说一句,我假设您是该主题的真正初学者,但是我知道对于某些人来说并非如此。

总有一天我会停止阅读这些材料。我说了解每一个细节就足够了,我想做一些真实的事情。所以,我开始问这样的问题:编译器的目标是什么?好吧,我的答案是为处理器生成可理解的二进制代码。所以,我说那应该怎么样?好吧,类似这样的事情,仅此statement1; statement2;而已0xAABBCCDD

然后我从头开始一切。我从最简单的语法和机器代码开始。我最终拥有的是一个能够为英特尔生成纯二进制代码的工作编译器。它只理解一些指令,但它是一个真正的工作编译器,但是一个非常简单的编译器。

后来我改进了解析器等,从那以后我感觉更快乐了。现在,我在需要时使用所有这些材料。我的问题是我非常努力地理解和掌握一切,因为我认为(大多数人都说)如果不阅读所有这些书籍和文章,我就无法制作编译器,即使是简单的编译器。

在这里,我想请您列出在开始任何编译器项目之前您认为有必要了解的想法和概念。你认为它们足够简单,初学者可以阅读和理解,更好地描绘整个项目,然后继续编写实际代码并感受真正的编译器是如何工作的。

作为一个例子,请参见我的答案!

PS 顺便说一句,在你否决这个问题之前,让我再次澄清一下,我并不是说这些材料不好。我只是说这个主题非常模糊。错误的方法是一次完成所有事情。更智能的解决方案是从Hello World 开始!例如,而不是与 GCC 等具有相同功能的项目。

0 投票
1 回答
659 浏览

compiler-construction - LLVM中的部分应用

我正在尝试创建一个可以应用于单个参数的函数“add”,然后是另一个。我不知道如何用 LLVM IR 表示这一点,因为我不明白如何使用单个值调用函数,然后将值保存在内存中的某个位置并返回另一个应用于该 val 的函数。我需要 LLVM 中的某种关闭机制。

我已经在 C 中搜索了它的实现,以便我可以通过 clang 查看发出的 LLVM,但我发现的解决方案非常复杂,所以我想我可以直接研究 LLVM。

这将是未经处理的版本

不知何故,我想add(1)返回一个i8 (i8)类型。我想我必须以某种方式拆分功能。

附言。我正在研究这个,因为我正在为一种小型功能语言开发编译器,所以我正在寻找任何关于在编译器设计中实现部分应用程序/currying 的建议。

更新:我现在可以使用以下代码,但它非常复杂,我认为自动生成并不容易