标签:#编译原理

共 47 篇文章

即時編譯

在计算机技术中,即时编译(,缩写为JIT;又译及时编译、实-{}-时编译),也称为动态翻译或运行时编译,是一种执行计算机代码的方法,这种方法设计在程序执行过程中(在執行期)而不是在执行之前进行编译。通常,这包括源代码或更常见的字节码到机器码的转换,然后直接执行。实现 JIT 编译器的系统通常会不断地分析正在执行的代码,并确定代码中可被即时编译加速的部分,在这些部分中,由编译或重新编译带来的性能提高将超过编译该代码的开销。 JIT编译是两…

函式呼叫圖

函式呼叫圖(call graph,也稱為call multigraph),屬於控制流圖,可以展示计算机程序中函式之間的關係。每一個節點是一個函式,每一個邊(f, g)表示函式f呼叫函式g。若其中有出現互相呼叫的環,表示程式中可能有遞迴呼叫。 基本概念 函式呼叫圖可以由動態程式分析產生(動態函式呼叫圖),也可以由靜態程式分析產生(靜態函式呼叫圖)。動態函式呼叫圖是程式執行過程的記錄,可能是效能分析工具所輸出的。動態函式呼叫圖可以準確的描述…

Load-link/store-conditional

在電腦科學中,load-linked/store-conditional(LL/SC),也會被稱作load-reserved/store-conditional (LR/SC),load-link与store-conditional (LL/SC)是一对用于并发同步访问内存的CPU指令。Load-link返回内存位置处的当前值,随后的store-conditional在该内存位置处保存新值(如果从load-link后没有被修改)。这被用…

字节码

位元組碼()通常指的是已經經過編譯,但與特定機器碼無關,需要直譯器轉譯後才能成為機器碼的中間代碼。位元組碼通常不像源碼一樣可以讓人閱讀,而是編碼後的數值常量、引用、指令等構成的序列。 位元組碼主要為了實現特定軟體運行和軟體環境、與硬體環境無關。位元組碼的實現方式是通過編譯器和虛擬機器。編譯器將源碼編譯成位元組碼,特定平臺上的虛擬機器將位元組碼轉譯為可以直接執行的指令。位元組碼的典型應用為Java bytecode。 参见 Java by…

链接期

链接期(link time)是指程序设计中,链接器把目标文件链接产生可执行文件时的行为。通常包括外部引用对象与函数的定址、不同种类的跨模块检查(类型检查、模板实例化之后的合并等)、某些程序优化等。 程序设计语言可能会指明一些源程序在链接期必须满足的要求。如名字的可见性。 有些语言或系统,链接的工作放在了运行期,如晚绑定。

名字解析 (程序设计)

计算机程序设计语言中,名字解析是指把程序表达式中的标记()对应解析到程序成分()。 概述 不同语言的名字解析算法的复杂度不同。例如,汇编语言的名字解析只需要简单地查。而C++的名字解析就非常复杂,受命名空间、作用域、可见性规则()、函数重载、可访问性()影响。 静态解析与动态解析 编译时完成的称静态名字解析;运行时完成的称动态名字解析。 动态类型并不意味着动态名字解析。例如,Erlang是动态类型但静态名字解析。 下述Python程序:…

编译期

编译期(compile time)是指程序设计中,编译器在编译源代码时的行为。包括语法分析、语义分析、类型检查(type check)、模板实例化、代码生成等。 程序设计语言通常指出源程序必须满足的编译期要求。 程序的一些性质在编译期可推导,如数组越界、无死锁、分时时间片等。 有些程序设计语言在链接期或运行期才执行一部分编译。如即时编译(Just-in-time compilation)。 参见 链接期 运行时

上下文无关文法

上下文无关文法(,縮寫為CFG),在计算机科学中,若一个形式文法 G = (V, Σ, P, S) 的产生式规则都取如下的形式:A -> α,則謂之。其中 A∈V ,α∈(V∪Σ) 。上下文无关文法取名为“上下文无关”的原因就是因为字符 A 总可以被字串 α 自由替换,而无需考虑字符 A 出现的上下文。如果一个形式语言是由上下文无关文法生成的,那么可以说这个形式语言是上下文无关的。(条目上下文无关语言)。 上下文无关文法重要的原因在于它…

名字修饰

名字修饰(name decoration),也称为名字重整、名字改编(name mangling),是现代计算机程序设计语言的编译器用于解决由于程序实体的名字必须唯一而导致的问题的一种技术。 它提供了在函数、结构体、类或其它的数据类型的名字中编码附加信息一种方法,用于从编译器中向链接器传递更多语义信息。 该需求产生于程序设计语言允许不同的条目使用相同的标识符,包括它们占据不同的命名空间(典型的命名空间是由一个模块、一个类或显式的name…

内存排序

内存排序是指CPU访问主存时的顺序。可以是编译器在编译时产生,也可以是CPU在运行时产生。反映了内存操作重排序,乱序执行,从而充分利用不同内存的总线带宽。 现代处理器大都是乱序执行。因此需要内存屏障以确保多线程的同步。 编译时内存排序 编译时内存屏障 这些内存屏障阻止编译器在编译时乱序指令,但在运行时无效。 GNU内联汇编语句 asm volatile("" ::: "memory"); 或者 asm volatile ("" ::: …

控制流圖

控制流圖(control-flow graph)簡稱CFG,是计算机科学中的一種形式化表示,利用數學中图的表示方式,標示计算机程序執行過程中可能經過的所有路徑。控制流圖是由法兰·艾伦所建立,他提出曾將邻接矩阵用在流分析上。 CFG是許多編譯器最佳化及靜態程序分析工具中的核心技術。 定義 控制流圖中的每個顶点都對應一個程式基本塊,也就是一段沒有分支指令,也沒有分支目的(如goto標籤)的程式碼。基本塊的開始是分支目的,而基本塊會以分支為結…

静态单赋值形式

在編譯器的設計中,靜態單賦值形式(static single assignment form,通常簡寫為SSA form或是SSA)是中間表示(IR,intermediate representation)的特性,每個變數僅被賦值一次。在原始的IR中,已存在的變數可被分割成許多不同的版本,在許多教科書當中通常會將舊的變數名稱加上一個下標而成為新的變數名稱,以至於標明每個變數及其不同版本。在SSA中,(use-define chain,賦…

词法分析

词法分析()是计算机科学中将字符序列转换为序列的过程。进行词法分析的程序或者函数叫作词法分析器(lexical analyzer,简称lexer),也叫扫描器(scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。 记号 这里的记号是一个字串,是构成源代码的最小单位。从输入字符流中生成记号的过程叫作记号化(tokenization),在这个过程中,词法分析器还会对记号进行分类。 词法分析器通常不会关心记号之间的关系(属于语…

有限状态机

有限状态机(,缩写:FSM)又称有限状态自动机(,缩写:FSA),简称状态机,是表示有限个以及在这些状态之间的转移和动作等行为的数学计算模型。它是一台(真实或假设的)机器,其对于输入(input)的响应(或输出)形成于一组状态(state)和一组用于从某状态传递到另一状态的规则(rules)。 概念和术语 状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化。转移指示状态变更,并且用必须满足确使转移发生的条件来描述它。动…

确定有限状态自动机

在计算理论中,确定有限状态自动机或确定有限自动机()是一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表\Sigma的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。 基础概念 定义 确定有限状态自动机\mathcal{A}是由 一个非空有限的状态集合Q 一个输入字母表\Sigma(非空有限的字符集合) 一个转移函数\delta: Q \times \Sigma \ra…

编译器递归测试

男人抑或男孩测试,由计算机科学家高德纳在1964年提出,是用來评价ALGOL 60编程语言实现的一个手段。该测试的目的是区分出编译器能否正确实现“递归和”。 ALGOL语言表述 Donald Knuth在1964年发表的算法语言ALGOL 60代码: begin real procedure A(k, x1, x2, x3, x4, x5); value k; integer k; real x1, x2, x3, x4, x5; be…

数据结构对齐

数据结构对齐是程式编译后資料在記憶體內的佈局与使用方式。包括三方面内容:数据对齐、数据结构填充(padding)与包入(packing)。 现代计算机CPU一般是以32位元或64位元大小作地址对齐,以32位元架構的計算機舉例,每次以連續的4位元組為一個區間,第一個位元組的位址位在每次CPU抓取資料大小的邊界上,除此之外,如果要访问的变量没有对齐,可能会触发总线错误。 当資料小于计算机的字(word)尺寸,可能把几个資料放在一个字中,称为…

编译原理 (教材)

《编译器:原理、技术和工具》(),中译本名为《编译原理》,是一部由阿尔佛雷德·艾侯、、和杰弗瑞·乌尔曼合著的计算机科学教材,探讨了编译器设计方面的若干重要课题,被视为编译原理领域的经典教材之一。该书的第一版出版于1986年,第二版出版于2006年;因两版封面均绘有屠龙勇士和恶龙搏斗的画面而被几代计算机科学工作者昵称为《龙书》()。 内容 《编译原理》第一版介绍了下列内容: #编译器的构成 #词法分析(含正则表达式与有限状态机) #语法分…

Visual C++名字修饰

Name mangling,或者Decorated Name,是指程序设计语言中具有存储性质的对象的名字被编译器改写,以适合编译器、链接器(linker)、汇编器(assembler)使用。所谓的具有存储性质的对象,即lvalue对象,是指要实际占用内存空间、有内存地址的那些实体对象,例如:变量(variables)、函数、函数指针等。C++中的纯虚函数作为特例也属于这一范畴。而数据类型(data type)就不属于具有存储性质的对象。…

目标代码

目标代码()指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。目标文件()即存放目标代码的计算机文件,它常被称作二进制文件()。 目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据,如重定位信息,如用于链接或调试的程序符号(变量和函数的名字),此外还包括其他调试信息。目标文件是从源代码文件产生程序文件这一过程的中间产物,链接器正是通过把目标文件链接在一起来生成…