编译原理 标签

SSA IN GO

  |   0 评论   |   0 浏览

关于源码到语法树的部分编译在 这里 编译阶段 src/cmd/compile/internal/gc/main.go 中 存有如下一段代码 initssaconfig() // Just before compilation, compile itabs found on // the right side of OCONVIFACE so that methods // can be de-virtualized during compilation. Curfn = nil peekitabs() // Phase 8: Compile top level functions. // Don't use range--walk can add functions to xtop. timings.Start("be", "compilefuncs") fcount = 0 for i := 0; i < len(xtop); i++ { n := xtop[i] if n.Op == ODCLFUNC { funccompile(n) fcount++ } } timings....

Go词法语法分析

  |   0 评论   |   0 浏览

词法分析 下列一段代码 package main import ( "fmt" ) func main() { fmt.Println("Hello") } 通过 lex 规则最终解释成 PACKAGE IDENT IMPORT QUOTE IDENT QUOTE IDENT IDENT LPAREN RPAREN LBRACE IDENT DOT IDENT LPAREN QUOTE IDENT QUOTE RPAREN RBRACE 这样将源码翻译成 好多的 token(字符) 这一过程可以理解成词法分析 go 的词法分析最终生成的 Token 列表 src/cmd/compile/internal/syntax/tokens.go // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package syntax type to....

Static Single Assignment Form

  |   0 评论   |   0 浏览

Static Single Assignment Form 静态单一分配形式,每个变量只赋值一次 intermediate representation(IR): 中间代码表示 作用 常数传播(constant propagation) 值域传播(value range propagation) 稀疏有条件的常数传播(sparse conditional constant propagation) 消除无用的程式码(dead code elimination) 全域数值编号(global value numbering) 消除部分的冗余(partial redundancy elimination) 强度折减(strength reduction) 寄存器分配(register allocation) demo x = 1 y = x 变成了 y = 1 转化 { "title": { "text": "Graph 简单示例" }, "tooltip": {}, "animationDurationUpdate": 1500, "animationEasingUpdate": ....

Abstract Syntax Code

  |   0 评论   |   0 浏览

抽象语法树 AST 将代码进行词法分析语法分析后变成树结构以便于生成中间代码的环节 如图所示,该树为 2*3+7 词法分析 比如一段代码 const a = 5; 经过词法分析 [{value: 'const', type: 'keyword'}, {value: 'a', type: 'identifier'}, ...] 语法分析 词法分析的输出是语法分析的输入,将词法分析的结果转化为树 { type: "VariableDeclarator", id: { type: "Identifier", name: "a" }, ... } 当生成树的时候,解析器会删除一些没必要的标识 tokens(比如:不完整的括号),因此 AST 不是 100% 与源码匹配的。 与源代码互相匹配的叫做 具体语法树 关于研究用途拆解包 recast 包可以在 nodejs 中拆解 code 输出词法语法分析后的结果,并且可以进行 inspect 操作等等 拿到抽象语法树之后 Go 语言的编译器会对语法树中定义和使用的类型进行检查 常量、类型和函数名及类型; 变量的赋值和初始化; 函数和闭包的主体....