基本塊
在電腦編譯器架構中,基本塊(basic block)是一段線性的程式碼,只能從這段程式碼開始處進入這段程式,沒有其他程式碼會跳躍進入這段程式,只能從這段程式碼最後一行離開這段程式,中間沒有其他程式碼會跳躍離開這段程式。這種程式的限制使得基本塊非常好分析。編譯器處理程式時,會在分析程序中,將程式分解為所有基本塊的組合。在控制流圖中,基本塊是控制流圖中的節點。 以下是一段QuickBASIC程式,程式中的前二行(DO之前的程式碼)即為基本塊…
共 47 篇文章
在電腦編譯器架構中,基本塊(basic block)是一段線性的程式碼,只能從這段程式碼開始處進入這段程式,沒有其他程式碼會跳躍進入這段程式,只能從這段程式碼最後一行離開這段程式,中間沒有其他程式碼會跳躍離開這段程式。這種程式的限制使得基本塊非常好分析。編譯器處理程式時,會在分析程序中,將程式分解為所有基本塊的組合。在控制流圖中,基本塊是控制流圖中的節點。 以下是一段QuickBASIC程式,程式中的前二行(DO之前的程式碼)即為基本塊…
死程式碼(dead code)有幾種不同的定義。有一種定義是指程式運行時永遠不會執行到的程式碼(記憶體裡的指令)。在一些程序设计的領域中,死程式碼是指源代码中有執行,但其他程式沒有使用該執行結果的程式。死程式碼會浪費記憶體,若是有執行的死程式碼,還會浪費執行時間。 死程式碼的結果雖然不會被其他程式使用,但程式碼可能會抛出异常或是影響全域變數,因此移除死程式碼有可能會影響程式輸出並引入未預期的程序错误。編譯器在進行死碼刪除時,若某程式不確…
在计算机科学中,数据的抽象句法()是将其结构描述为数据类型(可能但不一定是抽象数据类型),独立于任何特定的表示或编码。 这特别用于计算机语言中文本的表示,这些语言通常存储在树结构中作为抽象语法树。对比仅由数据结构组成的抽象语法与具体句法,具体语法还包括有关表示的信息。 例如,具体句法包括括号(用于分组)或逗号(用于列表)等功能,这些功能不包含在抽象句法中,因为它们已经隐含在结构中。 如果结构是抽象的但名字(标识符)仍然是具体的(因此需要…
生成器(Generator),是计算机科学中特殊的子程序。实际上,所有生成器都是迭代器。生成器非常类似于返回数组的函数,都是具有参数、可被调用、产生一系列的值。但是生成器不是构造出数组包含所有的值并一次性返回,而是每次产生一个值,因此生成器看起来像函数,但行为像迭代器。 生成器可以用更有表达力的控制流结构实现,如协程或头等續體。生成器,也被称作半协程(semicoroutine),是特殊的、能力更弱的协程,总是在传回一个值时把控制交还给…
在计算机科学中,代码生成是代码编译过程中的其中一个环节。在这个环节中,代码生成器会将某中間語言(IR)转换为机器可以执行的形式如机器码,或者另一门语言,如C语言代码。 工业级的编译器一般存在多个编译环节(Compiler pass)。第一个环节通常会将源代码转换成抽象语法树,而抽象语法树随后又会被转换成某种中间语言(IR)。编译器的中间环节会对这门中间语言进行各种变换以优化程序的性能。这种具有阶段性的编译方式,其优势在于允许编译器开发者…
控制表是一個決定控制流程或是主要影響控制流程的表。關於控制表的結構或內容沒有硬性的規定,其特點是其可以影響控制流程的能力。這類表格的設計有時稱為「表格驅動設計」(不過後者多半是指由外部的表格自動生成程式碼,而不是在程式中的表格)。以有限狀態機為基礎的自动机编程有時會用控制表為其實現方式。若控制表有幾個不同的層次,其行為就類似。 控制表有時會以的方式表示,其中會有對應的條件表示式及子程序。控制表可以簡化一些類似的程式敘述,而且若是二維的控…
在自动机理论中,下推自动机()是使用了包含数据的栈的有限自动机。 综述 下推自动机比有限自动机复杂:除了有限状态组成部分外,还包括一个长度不受限制的栈;下推自动机的状态迁移不但要参考有限状态部分,也要参照栈当前的状态;状态迁移不但包括有限状态的变迁,还包括一个栈的出栈或入栈过程。下推自动机可以形象的理解为,藉由加上读取一个容量无限栈的能力,扩充一个能做\epsilon-转移的非确定有限自动机。 下推自动机存在“确定”与“非确定”两种形式…
GNU cflow是GNU計劃中的一款流程图生成器,其读取一系列C语言源文件并生成外部引用的流程图。此软件仅需读取源码而无需运行代码编译后的软件。 历史 其起初为UNIX实用工具cflow的实现。 cflow(UNIX实用工具) cflow是一个生成C语言流程图的Unix命令。 除了GNU以外,还存在其他对cflow的实现(如为打造的版本)。 参考文献 外部链接 GNU Savannah平台上的[http://savannah.gnu.…
在计算机科学和语言学中,语法分析(,也叫 )是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。 语法分析器(parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析…
在计算机科学領域,解析表达文法,简称PEG(),是一种分析型形式文法。PEG在2004年由布莱恩·福特(Bryan Ford)推出,它与20世纪70年代初引入的家族密切相关。 在语法上,PEG很接近上下文无关文法(CFG),但是他們採用了不同的解釋:例如PEG中的选择操作符總是会选中第一个匹配项,而在CFG中则是不明确的。这更接近于字符串识别在实际中的应用,例如使用递归下降解析器的情況。另外不像CFG,PEG不能有:在解析一个字符串的时…
暫存器傳遞語言(,縮寫為 RTL),又譯為暫-{}-存器轉換語言、寄-{}-存器轉換語言,一種中間語言,使用於編譯器中。與組合語言很接近。寄存器传递语言被用于描述一个架构中寄存器传输级上的数据流。 在學術論文和教科书中,暫存器傳遞語言被認為是一種與架構無關的組合語言。GCC的中間語言,也被稱為暫存器傳遞語言(RTL),風格類似於LISP。GCC的前端(frontend)會先將程式語言轉譯成RTL,之後再利用後端(backend)轉化成機…
三位址碼(,經常被縮寫為TAC 或 3AC),一種中間語言,編譯器使用它來改進程式碼轉換效率。每個三位址碼指令,都可以被分解為一個四元組(4-tuple):(運算子,運算元1,運算元2,結果)。因為每個陳述都包含了至多三個(如:goto语句,仅含一个变数)變數,所以它被稱為三位址碼。 相關條目 *中間語言
中間語言(),在計算機科學中,是指一種應用於抽象機器(abstract machine)的程式語言,它設計的目的,是用來幫助我們分析计算机程序。這個術語源自於編譯器,在編譯器將原始碼編譯為目的碼的過程中,會先將原始碼轉換為一個或多個的中間表述,以方便編譯器進行最佳化,並產生出目的機器的机器语言。通常,中間語言的設計與一般的机器语言有三個不同之處: 每個指令代表僅有一個基本的操作。舉例來說,在微处理器中出現的shift-add定址模式在中…
在自动机理论中,确定下推自动机(,縮寫:DPDA)是可以使用了持有数据的栈的确定有限状态自动机。术语“下推”来自原型机械自动机物理上接触穿孔卡片来阅读其内容的下推动作。术语“确定下推自动机”当前指称识别确定上下文无关语言的抽象计算设备。 确定下推自动机是减弱版本的下推自动机。 定义 一个下推自动机(PDA) M 可以定义为一个 7-元组: M=(Q,\Sigma,\Gamma,q_0,Z_0,A,\delta) 这里的 Q 是状态的有限…
伪代码(),又称为-{zh-cn:虚拟代码; zh-tw:偽代碼; zh-hk:虛擬代碼;}-,是一种高层次描述算法的方法。它不是现实存在的编程语言(已经出现了类似伪代码的语言,参见Nuva);它可能综合使用多种编程语言的语法、保留字,甚至会用到自然语言。 它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java、C++、C、Delphi 等等)它更类似自然语言。它是-{zh-hans:半形式化;zh-hant:半形式化}-、…
在计算机科学中,自举是一种自生成编译器的技术——也就是,某个编程语言的编译器(或汇编器)是由该语言编写的。最初的核心编译器(自举编译器)是由其他编程语言生成的(可以是使用汇编语言),而之后版本的编译器则是使用该语言的最小子集编写而成。自生成编译器的编译问题被称为编译器设计的先有鸡还是先有蛋问题,而自举则是这个问题的解决方法。 自举对于创建一个新的编程语言是很普遍的做法,有很多编程语言已经实现了自举。 步骤 一个典型的编辑器自举过程分三到…
LR剖析器是一種由下而上(bottom-up)的上下文無關語法剖析器。LR意指由左(Left)至右處理輸入字串,並以最右邊優先衍生(Right derivation)的推導順序(相對於LL剖析器)建構語法樹。能以此方式剖析的語法稱為LR語法。而在LR(k)這樣的名稱中,k代表的是剖析時所需前瞻符號(lookahead symbol)的數量,也就是除了目前處理到的輸入符號之外,還得再向右參照幾個符號之意;省略 (k)時即視為LR(1),而…
别名(Aliasing)是指内存中的一个数据位置可以通过程序中的多个名稱来访问。通过某一個名稱修改数据,其他别名关联的值也會改变,這是程式設計師可能不會預期到的。别名的存在使得程式的理解、分析及优化程序变得困难。别名分析可以分析处理程序中有關别名的信息。 例子 缓冲区溢出 大部份C語言的實現都不會有陣列索引的边界检查。因此,可以利用此一漏洞,寫入在陣列範圍外的資料(缓冲区溢出),根據C語言的標準,這是未定义行为,但在大部份沒有陣列索引边…
在计算理论中,非确定有限状态自动机或非确定有限自动机(NFA)是对每个状态和输入符号对可以有多个可能的下一个状态的有限状态自动机。这区别于确定有限状态自动机(DFA),它的下一个可能状态是唯一确定的。尽管DFA和NFA有不同的定义,在形式理论中可以证明它们是等价的;就是说,对于任何给定NFA,都可以构造一个等价的DFA,反之亦然:通过使用幂集构造。两种类型的自动机只识别正则语言。非确定有限自动机有时被称为有限类型的子移位(subshif…
在计算理论中,幂集构造是转换非确定有限状态自动机(NFA)到识别同样语言的确定有限状态自动机(DFA)的标准方法。它在理论上的重要性源于它确立了NFA尽管有额外的灵活性,它不能识别不能被任何DFA识别的任何语言。在实践中的重要性源于它把易于构造的NFA转换成了更有效执行的DFA。但是如果NFA有n个状态,结果的DFA可能有最多2n个状态,这种指数增长有时使这种构造对于大NFA而言是不实际的。 动机 回想一下,NFA除了特定节点可能有“分…