代码改变世界

虚幻4蓝图编译剖析(一)

2016-10-24 22:58  风恋残雪  阅读(8242)  评论(0编辑  收藏  举报

前言

虚幻引擎中的 蓝图 - 可视化脚本系统 是一个完整的游戏脚本系统, 其理念是,在虚幻编辑器中,使用基于节点的界面创建游戏可玩性元素。 和其他一些常见的脚本语言一样,蓝图的用法也是通过定义在引擎中的面向对象的类或者对象。 在使用虚幻 4 的过程中,常常会遇到在蓝图中定义的对象,并且这类对象常常也会被直接称为"蓝图(Blueprint)"。本文从代码的层面讲解虚幻引擎中蓝图的编译(包括编辑部分的代码,使用的版本是UE4 4.13.0),本文假设已经对蓝图已经有一个比较清楚的了解。

编译原理相关术语

编译程序是现代计算机系统的基本组成部分.从功能上看,一个编译程序就是一个语言翻译程序,它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序.

我们这里只是对一些术语进行简单地介绍,如果想系统学习编译原理,那么需要去找一些专业的书籍(如龙书、虎书、鲸书等,用搜索引擎都可以找得到),并且需要实践才能对编译原理有一个比较透彻和了解。

 

一般编译器编译一个程序会分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成这几个阶段来进行。

词法分析

从左至右读字符流的源程序、识别(拼)单词。

  • 单词---token
  • 保留字---reserved word
  • 标识符 ---identifier(user-defined name)

 

示例:

语法分析

功能:层次分析.依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树). 语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析 (syntax analysis ),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树(parse tree)或语法树(syntax tree)。

 

实例:

语义分析

程序的语义就是它的"意思",它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。 这些特征被称作静态语义(static semantic),而语义分析程序的任务就是分析这样的语义(程序的"动态"语义具有只有在程序执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确定)。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程序计算的额外信息(诸如数据类型)被称为属性(attribute),它们通常是作为注释或"装 饰"增加到树中(还可将属性添加到符号表中)。

  • 上下文相关性
  • 类型匹配
  • 类型转换

示例:

语义分析结果:

中间代码生成

源程序的内部(中间)表示:

三元式、四元式、P-Code、C-Code、    U-Code、bytecode

代码优化

  • 中间代码优化
  • 目标代码优化

目标代码生成

目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。

符号表管理

这个数据结构中的信息与标识符有关:函数、变量、常量以及数据类型。符号表几乎与编译器的所有阶段交互:扫描程序、分析程序或将标识符输入到表格中的语义分析程序;语义分析程序将增加数据类型和其他信息;优化阶段和代码生成阶段也将利用由符号表提供的信息选 出恰当的代码。

  • 记录源程序中使用的名字
  • 收集每个名字的各种属性信息

类型、作用域、分配存储信息

出错处理

检查错误、报告出错信息、排错、恢复编译工作。