compiler-construction相关内容
我想知道如何在bison+flex中将缩进实现为块分隔符。就像巨蟒一样。我正在编写自己的编程语言(主要是为了好玩,但我打算将其与游戏引擎一起使用),我会尝试想出一些特殊的东西,使样板程序最小化,开发速度最大化。 我已经用C编写了一个编译器(实际上是`langToy‘到Nasm的转换器),但失败了。由于某种原因,它只能处理整个源文件中的一个字符串(嗯,我已经醒了超过48小时-所以……你知道,大
..
我已经学习了编译器和汇编语言,所以我想编写自己的汇编器作为练习。但我有几个问题; 如何计算@DATA或LIKE OFFSET/ADDR VARA等段的地址? 以一个简单的汇编程序为例: .model small .stack 1024 .data msg db 128 dup('A') .code start:
..
处理一个游戏项目,该项目涉及一种脚本语言,我希望将其解释为可以直接执行的虚拟机代码。我已经将语法包括在下面。所有的词法分析器规则都正确地显示在语法图中,但是当我点击任何解析器规则的主体时,对于给定的解析器规则X,我得到“无法显示规则X”,因为没有找到起始状态。 我真的不确定为什么ANTLR会抱怨没有开始状态。语法应该明确地从代码行开始,它不会被任何其他解析器规则引用。此外,右上角的框为绿色,
..
在LLVM中,BasicBlock具有属性getSinglePredecessor()和getSingleSuccessor(),但我需要获取基本块的后继者和前置者的完整列表。如何在llvm中实现这一点? 我的代码是 virtual bool runOnFunction(Function &F) { for (Function::iterator b
..
在Blandy和Orendorff的Programming Rust的第322页上是这样的声明: ...Rust...认识到有一种更简单的方法将数字从1加到n:总和始终等于n * (n+1) / 2。 这当然是众所周知的等价物,但是编译器如何识别它呢?我猜它是在LLVM优化过程中进行的,但是LLVM是以某种方式从基本原理中推导出等价性,还是它只有一组可以简化为算术运算的“公共循环计算”?
..
我想知道Java虚拟机是否避免了零乘。谢谢 推荐答案 根据Java Language Spec,“在执行操作本身的任何部分之前,运算符的每个操作数(条件运算符&;&;、||和?:除外)似乎都已完全求值。” 因此,即使编译器或运行时可以检测到一个因素为零,如果另一个因素可能有副作用,它仍然必须评估另一个因素。
..
据我所知,如果输入流中有错误,跟随集会在第一个可能的时刻告诉我。对吗? 因为不然的话,我想知道你到底需要它做什么。考虑到您的解析器在堆栈的顶部有一个非终结点(在我们的类中,我们使用了一个堆栈作为LL解析器的抽象) 即 [TOP] X...[BOTTOM] 下一步将替换X,因为它位于堆栈的顶部。因此,解析器询问解析表对X使用什么派生。 + b 其中+和b都是终端。
..
我想知道Mac OS X、Windows和Linux上的编译器如何知道在哪里可以找到C头文件。 具体地说,我想知道它如何知道在哪里可以找到带有括号的#Include。 #include "/Users/Brock/Desktop/Myfile.h" // absolute reference #include
..
我最近一直在研究编译器设计。我已经很好地掌握了解析阶段,但在理解代码生成如何工作时遇到了一些问题。 据我所知,代码生成阶段似乎有3个主要步骤: 指令选择(贪婪平铺) 指令调度 寄存器分配 现在,指令调度有点超出了我目前正在尝试做的事情,我认为通过更多的研究和原型设计,我可能会考虑用于寄存器分配的图着色算法。 难住我的是第一步,指令选择。根据我所读到的内容,目标机器语言中的每
..
谁能告诉我这两种优化技术是相同还是不同? 另外,这是程序员还是编译器的责任? 推荐答案 这两种技术不同。请参阅Loop unrolling和Loop tiling的说明。 循环展开是为了消除循环开销。它(通常)仅对迭代次数较少且在编译时已知的相当小的循环有用。这主要是由编译器完成的。 在计算机速度较慢、编译器更原始的旧时代,程序员会手动展开循环,但现在程序员这样做将不
..
我正在学习巴别塔,我想了解如何配置巴别塔。我发现了两种配置babel的方法:通过创建babel.config.js和.babelrc文件。在什么情况下,我们应该优先选择一个配置文件? 推荐答案 来自文档 https://babeljs.io/docs/en/config-files#project-wide-configuration Babel有两种并行配置文件格式,可以一起使
..
我正在为 PIC 16 系列寻找一个好的 C 编译器,在 Windows 上工作. 一些同事使用 bknudc,但有些人似乎不喜欢它.显然你不能有效地使用链接器,事实证明最好的方法是将所有代码设置在包含文件中. SDCC 看起来不错,但看起来仍处于测试阶段,而且不容易设置或必须处理. 还有很多其他的选择,根据自己的情况,都是最好的.我发现一些论坛讨论这个话题,似乎没有人同意彼此.
..
如果类的类型在编译时已知(例如,如果没有通过引用或指针使用类实例,如案例 1) 下面). 但是,我观察到 Visual Studio 2010 的 C++ 编译器有一个奇怪的行为,我想知道编译器是否有任何理由在类的实例时不将调用静态绑定到“正确的"虚函数带有虚函数的是结构中的成员,通过引用访问. 我是否应该期望编译器在下面的情况 2) 中静态绑定对 f() 的调用?即使 a 是 A 而
..
是否有一种语言可以编译为 Java 代码(不是字节代码,而是 Java .. 所以没有 Groovy、Scala、Jython、JRuby 等)? 换句话说,是否有适用于 Java 的 CoffeeScript? 我对 Java 的主要缺陷之一是它非常冗长而且它没有多重继承.似乎可以合理地通过代码生成来清理添加 mixins/traits 和闭包的语法. 是的,它并不优雅,但 c
..
不久前,我决定升级到 GCC 4.8,以便尽早开始使用一些 c++11 功能.不过,我有点走神了,直到几天前的一个项目才真正使用任何新功能(新编译器似乎工作正常,但这可能只是因为我没有使用任何新功能.) 在这个新项目中,当我使用 =std=c++11 标志编译时,我没有遇到任何问题.但是,在运行时,我收到错误: ./main:/usr/lib/i386-linux-gnu/libstd
..
我终于绝望了.因此,在我的 c++ 课程中,我们被指示使用类.我们会让头文件声明类和函数,而单独的 .cpp 文件实现它.事情应该是有效的,但他们没有,而且网络上没有任何解决方案似乎对我有用.为此,我在 linux 上使用 G++ 编译器,它似乎不适用于 IDE 或普通命令行. 我在 TBook.h 中遇到的错误是: /usr/lib/gcc/x86_64-linux-gnu/4.6/..
..
我刚刚在我的 Ubuntu 上发现,有两种不同的 C++ 编译器:/usr/bin/g++ 和 /usr/bin/c++.我对后者不熟悉,但 man c++ 只是跳转到 gcc 的手册页.我想知道它们作为 C++ 编译器有什么区别? 解决方案 这是典型的 Ubuntu 符号链接混乱. 如果你ls -l/usr/bin/c++,你会发现它实际上是一个符号链接.到: /etc/alte
..
谁能知道 g++ 何时将 __FUNCTION__ 'macro' 替换为包含函数名称的字符串?在检查源代码的语法正确性之前,它似乎可以替换它,即以下内容将不起作用 #include #define DBG_WHEREAMI __FUNCTION__ __FILE__ __LINE__int main(int argc, char* argv){printf(DBG_W
..
我目前参与了一些有趣的编程语言研究,到目前为止,该研究的重点是扩展即将推出的 Java 7.0 编译器,并提供一些非常强大的基于程序员生产力的功能.这项工作应该同样适用于相关的编程语言,例如 C#. 我目前正在确定用于对功能的 C# 端口进行原型设计的选项.我更喜欢开源选项,以便可以与最广泛的受众分享这项工作的成果.因此,Mono C# 编译器似乎是最明显的起点.我是一位经验丰富的 C# 开
..
我有一个非常连线的错误,我的一个自定义控件似乎是创建两个编译文件,当我尝试使用 LoadControl() 动态加载它时失败,因为无法转换一个对另一个 - 即使它们完全相同.我写消息看看,都是一样的,只是改了编译好的dll. System.Web.HttpUnhandledException (0x80004005):引发了“System.Web.HttpUnhandledException"类
..