Compiler construction Scalas/Haskells解析器组合器是否足够?

我想知道Scalas/Haskells解析器组合器是否足以解析编程语言。更具体地说,是MiniJava语言。我目前正在阅读编译器构造,使用jflex和java cup非常痛苦,因此我想知道是否可以/应该使用解析器组合器。 MiniJava语法非常小。 MiniJavas BNF:我没有讨论Scala或Haskell解析器组合器库,但看起来语法应该很好。(第647页)说: 它(Scala的parser combinator框架)比解析器生成器更容易理解和适应,并且在实践中速度的差异通常并不重要,除

Compiler construction 为什么编译器更喜欢词法作用域?

词法作用域如何帮助编译器?它对编译或优化有帮助吗?词法范围对编译器或优化代码没有帮助。这是一个语言设计决策。请参阅以获得更多解释。我确实认为词法范围有助于编译器和优化。这取决于你所说的帮助是什么意思 词法或静态作用域允许编译器在本地引用变量时证明变量的可用性,这意味着在其词法上下文中。它必须在引用变量的方法的范围内 要在动态范围环境中这样做,必须考虑所有调用上下文,因为函数知道其调用上下文也知道的所有变量。为了确保变量可供引用,在编译时需要对所有调用上下文进行递归回溯 因为这非常复杂,所以在编译

Compiler construction 修理的定义?

我在Python Lisp编译器和一些C链接器的源代码中看到了这个术语 我的猜测是,修复只是一个组装例程的包装,它确保对齐是正确的,但我对这里的任何内容都不确定。修复是一个链接器术语。这里有一个很好的讨论: 每当对象文件(.o、.obj)引用某个外部符号时,它都会输出占位符代码,如“将地址0放入寄存器5”和一条注释,上面写着“用符号“foo”的实际地址填充该0”。其他一些对象文件将定义“foo”,链接器将返回并“修复”0,使其成为正确的地址 顺便说一下,如果没有人定义“Foo”,你会得到复古5

Compiler construction ccs编译器多编译单元功能

在使用CCS编译器的多编译单元功能时,我偶然发现了一个非常严重的错误: 该设置是一个头文件,在一个字节中定义一个位,两个编译单元,包括对头文件进行编译和引用所述位的函数 似乎函数的代码(特别是使用所述#位的正确地址)取决于所述函数与main()函数驻留在同一编译单元中 有什么想法吗 对于编译器来说,CCS的bug发生率很高(我已经使用它很多年了)。他们还大约每月发布一次更新版本。这可能很容易成为一个bug,多编译单元是CCS编译器中相对较新的功能 将您的问题反映到他们的支持上并通过电子邮件发送给

Compiler construction clojure编译器会在编译时自动计算文本表达式吗?

这可能是一个愚蠢的问题,但: 假设一个表达式仅依赖于文字,或者依赖于其他也仅依赖于文字的表达式;编译器会在编译时对此进行计算吗 假设我有 (def a (some-time-consuming-function some-literal)) (def b (some-other-time-consuming-function a)) b和a是否会在编译时被完全评估,这样用户就不会受到影响 编辑:非常感谢,所有的答案都很有帮助 编辑6.6.2011:结果表明,如果您尝试使用此技术预计算非常大的

Compiler construction Makefile变量替换有时被忽略

编译一个支持CUDA的aircrack ng版本已经有一段时间没有修复错误了,因此需要进行一些修补才能大部分实现 基本上,make找不到这段代码的相关编译器(nvcc) 相关生成文件部分 如您所见,make似乎正在删除环境变量“CUDA_BIN” echo$CUDA\u BIN的输出 哪个nvcc的输出 我不是一个制造大师,所以如果我做了一些明显错误的事情,请原谅我 在尝试用完整路径硬编码nvcc标志后,该部分会编译,但当涉及到加密部分(涉及libssl)时,它找不到必要的库,并且以与上述类似的

Compiler construction 如何支持导入语句?

我正在手工设计一个编译器(不要问) 这种新语言的源文件可以导入它希望与之一起使用的包p中的类T import P.T; 或者,它可以使用import-on-demand语句访问包p中的所有类 import P.*; 类类型声明中出现的标识符(即声明MyClass x=…)由以下规则解析: 它可以是当前包中声明的类 它可以是显式导入的类 它可以是隐式导入的类(按需导入) 我不知道真正的编译器是如何处理这种情况的。我正在寻找一种在miniJava程序中使用import语句实现类类型标识的方法。在

Compiler construction 计算机如何区分两条数据?

我想知道计算机以1s和0s/低电压和高电压的形式存储所有信息,yada-yada…但是当我们编译程序时,它-或者只是存储在comp上的任何数据-是二进制形式…那么计算机如何区分两个数据段,因为它包含的是一个0和1的流…为了让我的问题更清楚,让我们从C:中获取一个荒谬的简单代码。 void main() { int A = 0; int* pA = &A; char c = 'c'; char* pC = &c; return; } 它什么

Compiler construction 寻找BNF到DFA转换工具

是否有一个工具可以接收BNF语法作为输入并从中生成DFA? 我已经在这里找到了“hackingoff”工具: 但它更多的是一种测试工具,不适用于大型语法 DFA没有足够的能力来实现上下文无关的解析器,例如,您可以用BNF表达什么。没有这样的工具 指定的网站也不提供任何此类工具。确切地说+1您应该寻找的是BNF到DPDA的转换。您所发现的并没有将BNF转换为DFA(原因在答案中解释)。它对BNF语法所做的唯一一件事就是为LL(1)解析器做一些必要的预处理。DFA由lexer生成器和regex实现生

Compiler construction 约束求解器在编程语言和编译器中的使用

任何或多或少实用的编程语言和编译器都必须处理约束。最常见的约束是类型。通常,类型派生和统一是通过一个简单的算法来完成的(例如),在这个算法中,程序中的所有术语最终都被指定为唯一的类型。如果没有发生,则会出现错误指示 编译器中可能存在更复杂的约束,不可能完全统一,解决方案只存在于某些约束下。可能的例子有 数据流分析。仿射等式约束的解可用于循环向量化 内存管理。如果我们对引用和数据访问模式有一些限制,编译器可以从优化引用计数和垃圾收集中获益 从另一个角度来看,约束求解器,如Z3或Yices,在为

Compiler construction clang(和LLVM)和gcc/g++;? GCC和G++是传统的C和C++代码的GNU编译器。最近,使用LLVM的clang(和clang++)作为替代编译器越来越流行

clang和gcc/g++之间有什么区别?使用clang有什么好处吗?GCC是一大袋软件。据我所知,典型的过程是GCC前端到lex并解析代码,转换到GCC的内部寄存器传输语言,然后后端写出本机代码 所以一个典型的流程是:C代码-->GCC的C前端-->RTL-->GCC的x86后端-->x86机器代码 支持GC、C++、java、ObjialCo、GO和FORTRAN。 GCC支持多个后端:32位x86、64位x86、little-endian ARM、big-endian ARM、MIPS、S

Compiler construction 将条件分支转换为跳转的优化过程

在优化编译器中,冗余代码可以通过不同的算法多次检测和消除,如值编号、稀疏条件常数传播等。在这种情况下,我感兴趣的是检测冗余分支。假设目标代码是 block1: cmp r1, r2 jne block3 block2: cmp r1, r2 je block4 block3: ... block4: ... ... 在这种情况下,如果控制达到block2,则意味着r1和r2相等,因此je block4可以替换为jmp bl

Compiler construction 野牛减少/减少冲突(如果有其他情况)

我本来希望if-else使用shift/reduce-conlict,但它在“if”(“boolean_语句”)行上给出了reduce/reduce冲突块 以下是一些可能有助于解释以下代码的信息: BOOL是每行开头使用的关键字的标记,表示行是布尔运算 布尔值为“真”或“假”值 我正在使用这个编译器将一种语言转换成C代码,这种语言可以包含像a,b,C=d+2这样的语句,这相当于C中的a=b=C=d+2;和boole=f*.N。g+h,相当于e=f&&!g | | h statements:

Compiler construction C编译器如何提供对多个内存的访问?

如果一台计算机有多个用于数据的地址空间,C编译器如何提供对这些地址空间的访问 上下文 我正在考虑的一些现实体系结构: KR580VM1或κМ580М1 这基本上是一个Intel 8080,添加了几个寄存器和一个第17个地址行。指令前缀在提取操作码后断言第17个地址行,直到指令结束;由于指针仍然只有16位宽,这自然会将地址空间分成两半。地址空间的下半部分可能包含代码,两部分可能包含数据 CDC 6000的外围处理器 它们有一个12位地址总线,因此可以访问4096个本地内存机器字。它们还有一个18位

Compiler construction 用于定制SOC的Llvm

我正在寻找编写一个自定义SOC的llvm后端。问题是它有一些非标准的dma数据指令、缓存操作等 除了使用intrinsic之外,是否还有其他方法可以为定制soc开发工具链后端。一般来说,我对其他方法持开放态度,这些方法可以为我提供程序的高级表示,并可以将其转换为SOC指令。如果它只是一些已经支持的ISA上的额外指令,那么根据设计,您应该使用内部指令。或者,如果您的汇编器支持所需的指令,则可以使用内联程序集 如果整个ISA都是新的,构建新LLVM后端的最常见方法仍然是启动一个与您的后端足够接近的现

Compiler construction 电子书到exe应用程序如何编译成自包含的可执行文件?

我试图理解在运行exe时,各种电子书应用程序如何将其输出编译成一个独立的可执行文件,而不依赖于任何文件。 怎样才能做到呢?他们使用真正的嵌入式编译器吗 它们只是包含电子书的加载程序/查看器,该加载程序/查看器与可执行文件中的电子书数据本身配对 有很多方法可以做到这一点,首先你应该了解二进制文件是否真的没有依赖关系,或者它是否搜索库(例如acrobat库),然后你可以编程一个查看器,直接从二进制文件加载数据,或者在基于向量的视图(较小)中,或者在基于图像的视图中(比如没有ocr文本的PDF) 我假

Compiler construction 内存中的静态方法和实例方法

如何在内存中处理这些不同的方法类型 我发现了两种不同的解释: 静态方法在内存中只存在一次,而实例方法在内存中存在多次,每个实例一次,以正确处理每个实例中对membervariables的引用 所有方法在内存中只有一次,实例方法只获取对象的实例作为参数 不同的编译器使用的是什么方式?它们都只在内存中存在一次。唯一的区别是实例方法得到另一个第一个参数:类本身的实例 内存中多次存在的(至少对于.NET)是泛型类及其各自的特定用途。如果同时使用列表和列表,那么最终将得到两个代码的JITted副本,一个特

Compiler construction SUNWspro编译文件-检测编译器的验证

我有一个文件,由SUNWspro(Sun pro complier)为SPARC/Solaris编译。如何检测用于构建此二进制文件的编译器版本?嗯,它就像一个“DevPro SC4.0 fortran编译器”“strings-a file.exe|grep-I sun”给出了@(#)sunmath.h1.10 93/11/14.SUNW_版本/[作者的主页目录]/opt/SUNWspro/bin/。/SC4.0/bin/F77另一个grep:“acomp:SC4.0 1995年10月18日c4.

Compiler construction ANTLR lexer不匹配令牌

我有一个简单的ANTLR语法,我已经把它剥离到最基本的部分来说明我遇到的这个问题。我使用的是ANTLRworks 1.3.1 grammar sample; assignment : IDENT ':=' NUM ';' ; IDENT : ('a'..'z')+ ; NUM : ('0'..'9')+ ; WS : (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ; 显然,这句话被语法所接受:

Compiler construction ll(k)到ll(1)转换器的实现!

是否实现了ll(k)到ll(1)转换器?IIRC;一般来说,没有,因为有些语言有ll(k)语法,但没有ll(1)语法。所以,除非我弄错了,否则不是所有的ll(k)都可以转换为ll(1)。然而,这并没有说明这样一种工具是否有可能在可以做到的情况下发挥作用 左因子分解的规则是: A := A B | A C | D | E ; 变成: A := (D | E) (B | C)* 或者如果您不允许()组和*: A := D A' E A' A' := B

Compiler construction 共享库和静态库之间的技术差异?

静态库和共享库的组合方式有什么不同吗?例如,是否可以像静态库一样,在编译/链接时而不是在运行时将共享库中的代码加载到可执行文件中 静态库和共享库的组合方式有什么不同吗 绝对的;它们是非常不同的动物。一个主要的区别是,使用归档库,您只链接您使用的内容,而使用共享库,您可以获得全部内容 共享库中的代码是否可以在编译/链接时而不是运行时加载到可执行文件中 不容易,但确实存在 就像静态库一样 我不会称之为“就像一个静态库”——机制和最终结果是非常不同的。可能的重复

Compiler construction 类似c语言的良好AST设计(用于llvm)

我正在尝试使用llvm实现一种简单、愚蠢的c语言。 而且我在设计一个好的AST方面很笨拙 例如,我想知道将一个变量分成两类节点是否是一个好主意: 一个用于分配,一个用于加载。我试过了,但遇到了一些障碍: Foo = asd = 3; 在这种情况下,Foo和add将是一个分配,而add也将是一个加载。 但是ast节点通过其code()方法连接 在设计ast方面有什么好的资源吗? (我试图找到clang的,但从它的源文件中很容易理解它有点复杂。)在大多数允许这种输入的语言中,这将被解析为 Foo

Compiler construction 为ARM架构编译Ada

有谁知道会在ARM(Linux)上编译Ada的编译器吗?最好是至少在2005年进行汇编 这里有一个选项: Debian 6.0(挤压版)包含GCC 4.4和GNAT Ada(apt get install GNAT),可从armel(ARM EABI)获得。GCC4.4支持Ada 2005。我只听说过ARM Android target。查看更多详细信息。也通过谷歌发现了这一点。不幸的是,它只在Nucleus操作系统上为ARM编译,而不是Linux。@Jeff在安装了gnat之后,您应该能够执行

Compiler construction 带参考计数的混合标记和扫描

我正在设计一个非常简单的编译器(某种学术研究),我正在考虑实现一个简单的引用计数GC和一个标记和扫描。其思想是,引用计数可以在没有循环的情况下很早释放死对象,这也就留给了以下想法:标记和扫描通常涉及一些暂停,因为标记和扫描过程必须遍历大量引用,所以:previuos引用计数不应该使标记和扫描更快(元素更少)? 这个想法是胡说八道吗?我以前从未实现过如此复杂的事情,我不想为了发现这是一个非常糟糕的想法而做很多工作 起初我直觉上同意,但我得出结论,这种直觉是错误的。虽然ref计数将在标记和扫描GC之

Compiler construction TypeScript编译错误TS5037:无法编译外部模块,除非'--模块';提供旗帜

无法编译任何TS+node.js项目,包括示例中列出的项目 始终获取以下错误: 错误TS5037:除非提供“--module”标志,否则无法编译外部模块 编译器版本:0.9.1.0 例如,该项目仅由单个文件app.ts组成: 如上所述,使用模块标志编译,例如,如果您的文件名为myfile.ts: tsc myfile.ts --module "commonjs" 原因是从TSC 0.9.1开始,默认的模块选项是amd(例如requirejs),这是客户端javascript代码最常见的模块

Compiler construction LESS:合并并缩小所有导入文件的编译器

我有一个由.less文件组成的复杂嵌套树,它被组织为一个main.less文件,该文件使用@import子句导入其他几个辅助文件。在某些情况下,这些文件会导入其他文件 目前我处于开发模式,文件在运行时由LESS.JS编译器编译,但在生产环境中,我希望编译一次所有文件,并可能合并所有文件。如何获得这个 我的意图是: 当我准备好进行生产时,将main.less路径传递给编译器 编译器分析main.less,如果遇到@import子句,则跟随链接并编译导入的文件 这应该对所有文件进行迭代 最后,我希望

Compiler construction 指数表达式Flex/Bison

我正在用Flex/Bison制作一个基本的计算器,我想做指数运算(^),但我当前的实现不起作用,有人能告诉我为什么不行以及如何修复它吗 %{ #include <stdio.h> #include <math.h> void yyerror(char *); int yylex(void); int symbol; %} %token INTEGER VARIABLE %left '+' '-' '*' '/' '^' %%

Compiler construction 编译器如何知道使用哪种寻址模式

体系结构具有不同的寻址模式,其中一些寻址模式在可处理的位移量方面受到限制。设想一个体系结构有两条指令: #1 ldw reg, signed imm7(reg) # max displacement = 64 (2^6) #2 ldw reg, (index-reg, base-reg) # no limit on amount of displacement 我很难理解的是:编译器如何在这两条指令之间进行选择。在连接时间之前,通常不知道所需的位移 编译器是否总是采取保守的方法,并且仅在知道

Compiler construction Pyre内部使用什么变量重命名规程?

我查看了Pyre(Python的类型检查器)的内部,以了解它如何处理类型变量,并且,iuc,它使用单项式()的munging度做了一些事情 我希望看到像巴伦德雷格特公约或德布鲁金指数这样的东西。当带有类型变量的函数应用于参数时,Pyre如何避免捕获和保留绑定结构

Compiler construction PIC16C编译器

我正在为PIC16系列寻找一个好的C编译器,在Windows上工作 一些同事使用bknudc,但有些人似乎不喜欢。显然,您无法有效地使用链接器,而事实证明,最好是在include文件中设置所有代码 SDCC看起来不错,但它似乎仍处于测试阶段,不容易安装或处理 还有相当多的其他选择,所有的都是最好的,根据自己。我发现一些论坛在讨论这个话题,但似乎没有人同意彼此的观点,(昂贵),BoostC 我想要一些关于什么是好的什么是坏的真实信息 如果我没弄错的话,PIC16体系结构不是真正的C友好型? 有

Compiler construction 寻找有关编译面向对象代码的早期论文

我记得很久以前读过一篇关于面向对象编程的论文。我相信这是从80年代初开始的,甚至可能是在那之前 当时,面向对象编程仍然是通过预处理器完成的,我一直坚持的一点是:它认为您可以以过程或面向对象的方式编写代码,在预处理/编译之后,您将得到完全相同的机器代码 有人知道我说的是哪篇论文吗?比亚恩·斯特劳斯特鲁普写的大致相同。我有点怀疑这是你正在考虑的论文,因为它直到1999年才出版,但也许它还是有用的。80年代早期的面向对象编程不是通过预处理器完成的,Simula和Smalltalk都没有使用过这样的东西

Compiler construction 使宏和函数更无缝地集成

好的,我非常了解如何使用函数和宏 我很好奇为什么编译器在整合这两个编译器时不能更聪明一点,例如考虑Culjule:< /P> (defmacro wonky-add [a b] `(+ ~a (* 2 ~b))) (defn wonky-increment [a] (apply wonky-add a 1)) => Error: can't take value of a macro 是的,我知道我可以通过去掉“apply”来实现这一点,但是为什么编译器自己不能弄清楚如何实现这一点呢

Compiler construction XCode 4构建问题

在我的一个项目中,一切都运行得很好,我在我的应用程序中设置了代码签名,并将项目文件提交到我的本地Git存储库。现在我得到了附加屏幕截图中显示的错误。这些错误只发生在调试配置上,因为我可以毫无问题地进行测试或归档(使用发布配置) 有什么想法吗?我被难住了。显然,XCode在将编译后的二进制文件写入派生数据文件夹时遇到了问题,但我不确定如何解决这个问题。这与Git有关吗?我对XCode相当陌生,这是我第一次尝试使用Git的项目,所以我对它也不是很熟悉 提前感谢您的帮助 您是否验证了它提到的路径的权限

Compiler construction 如何用T图解释重定位和重定目标?

我目前正在学习关于编译器的考试,发现了以下问题: 下午3点。引导:解释重定位和重定位的概念。使用T形图 据我所知,重新宿主意味着为另一个平台主机编译一个编译器,因此它应该如下所示: ------------- | a b | -------------- ----- ----- | a b | | c |------------- ------ -----| c x || x | ----- -

Compiler construction AptanaStudio 3支持更少的css编译吗?

我想知道AptanaStudio 3是否有更少的css编译器功能。我使用Simpless的程序,但我没有偶然打开Simpless。我编辑并保存了less文件,并自动创建了一个css文件。我搜索了谷歌,但没有找到它有这个功能。 我甚至将Simpless移动到了其他驱动器,但它可以工作。一年多前,它似乎需要支持更少的驱动器。我没有发现比那篇讨论帖子更正式的东西来证实 ,但似乎更多地处理一些编辑器功能,而不是实际编译 然而,仅仅通过你的证词,它正在发挥作用,似乎就能回答你的问题。如果让它工作的改变实际

Compiler construction 编者考试说明

我正在准备编译器考试,我在过去的论文中发现了以下两个我不知道如何回答的问题: 1. Array bounds checking requires code to check each array subscript to ensure it falls within the array's declared range. How could induction variable analysis be used to avoid repeated bounds checks in "for" l

Compiler construction 仅在执行路径上应用过程

我有一个分析整个模块的过程(使用runOnFunction())。但我想在每个执行路径上应用它。我所说的执行路径是指从程序中的一个点(用start注释)到程序的一个终止点(用end注释)的指令序列 我假设我必须通过构造调用图将模块划分为函数,然后通过在前面提到的调用图的节点中构造CFG-s将每个函数划分为指令。我假设来自我选择的节点的执行路径是调用图叶子中完成的所有路径(我应该能够在CFG-s之间通信)。通过使用图搜索算法,我可以从该节点看到所有路径 是否可以将runOnFunction()/r

Compiler construction 编译linux内核模块时,makefile中的KBUILD\u CFLAGS不起作用

我运行make文件,并在Makefile中添加以下行 KBUILD_CFLAGS += -DXFLAGS 在我的.c文件中,我有: #ifdef XFLAGS printk(...); #endif make编译成功,但是,我无法在日志文件中看到消息,如/var/log/syslog。 我想知道是什么导致了这个问题?(无法设置标志) 注意,printk内部没有问题。正如我对#ifdef和printk进行了注释一样,printk工作得很好。仅仅向makefile添加一个新的变量赋值没有任何作用

Compiler construction 用替换、因子分解和左递归移除构造LL(1)文法

使用任何技术(替换、因子分解、左递归移除), 构造一个LL(1)语法,接受与G相同的语言 G over Σ = {0, 1, 2}: S → Y | 1X X → 1X | 0 Y → Y0 | 1X1 | 2X2 到目前为止,我做到了: X是左递归的,因此: X -> 1F | 0F F -> 1F | e 我还需要做什么来构造LL(1),我可以因子Y吗?首先,X不是左递归的,因为它的RHS不是以X开头的。相反,它是尾部递归的,它是正确的。但是Y->Y0

Compiler construction 使用lex工具构建词法分析器

我试图学习如何使用lex工具创建词法分析器。现在我下载了几个文件,上面写着LEX或FLEX,但我甚至启动它们都有困难,最好的部分是,网站根本没有解释。然后我试着在谷歌上搜索任何可以帮助我构建词法分析器的lex工具,我一直在用adobe的flex来创建移动应用程序。 现在我的问题有两个:我在哪里可以找到一个Lex工具开始工作,我可以得到任何基于IDE的教程,或者不仅仅是让我开始做一些事情。 谢谢。这个问题已经在@MarcinŁoś和@Thomas Padron McCarthy的评论中得到了回答,

Compiler construction 编译器输出的代码生成器

我正在编写一个代码生成器,但没有足够的资源来完成。我只有一个旧软件,它有一个ST语言的编译器。 我要做的是从这个编译器的输出,编写我的代码生成器,也许不是最好的方法,但这是我能做的最好的方法 我的问题是,有人知道.4asm扩展是什么意思吗?我该如何为它编写代码生成器 ps:一些输出代码: .prg program1 clssid 13 var bool rst var u295_initvar inizializzazioni var u295_cicloprova ciclo

Compiler construction 什么是绝对代码?为什么在编译时知道它?

在学习操作系统概念期末考试时,我偶然发现 Compile time: If memory location knows, **absolute code** can be generated; must recompile code if starting location changes 绝对代码的例子是中断向量表。我想知道这句话到底是什么意思,为什么中断向量表在编译时是已知的?它指的是在已知的固定内存地址加载的代码。由于该地址是固定的,因此可以编译跳转以直接指向其目标内存地址,而无需使用相

Compiler construction flex/bison在缺失时接受开口支撑

我正在研究flex/bison 问题是当我输入if(a您确定输入是可接受的,然后从S->ST的缩减操作中调用exit(0)。在解析器注意到它不在输入末尾之前,这种缩减可能发生。(这是大多数LALR解析器生成器实现的解析表优化。) 因此,如果(a您确定输入是可接受的,那么解析器会识别,然后从S->ST的缩减操作中调用exit(0)。在解析器注意到它不在输入的末尾之前,可以进行缩减。(这是大多数LALR解析器生成器实现的解析表优化。) 因此解析器识别if(a“({return OB;}”)“{ret

Compiler construction 柴丁';寄存器分配的s算法:R寄存器使用多少种颜色?

在我关于寄存器分配/Chaitin算法的讲座中,我们似乎构造了一个干扰图,然后试图找到该图的k-着色,其中k=R,如果我们可以在目标体系结构中使用R个寄存器。然而,如果我们溢出一个值,这难道不意味着我们需要一个额外的寄存器在指令中使用之前从内存中加载值,因此只能在Chaitin的算法中使用k=R-1值吗?您仍然可以使用k=R。溢出一个值时,您会添加存储和检索该值的溢出代码(通常在堆栈上,但存在其他替代方案)。这将用大量新的虚拟寄存器取代原始虚拟寄存器,这些虚拟寄存器只存在很短的时间(希望如此)有

上一页 1 2  3   4   5   6    7   8   9  ... 下一页 最后一页 共 49 页