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

前言

虚幻引擎中的 蓝图 - 可视化脚本系统 是一个完整的游戏脚本系统, 其理念是,在虚幻编辑器中,使用基于节点的界面创建游戏可玩性元素。 和其他一些常见的脚本语言一样,蓝图的用法也是通过定义在引擎中的面向对象的类或者对象。 在使用虚幻 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

代码优化

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

目标代码生成

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

符号表管理

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

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

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

出错处理

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

时间: 2024-10-12 15:12:37

虚幻4蓝图编译剖析(一)的相关文章

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

虚幻4编译相关术语和类图 虚幻引擎中的蓝图编译跟常规的程序编译多少是有一些不同的地方,但是基本原理是相通的.我们以普通的类蓝图为例,一个类中包含多个图,每个图中又可以包含一些子图.一个图会包含很多的节点(UEdGraphNode),每个节点可以包含若干引脚(UEdGraphPin)用来连接两个节点.节点又分为执行节点和纯节点(Pure node,上面没有执行引脚).还有一个模式类(UEdGraphSchema)用于验证语法是否正确等.类图如下所示: 图(UEdGraph) 虚幻4中许多其它的也是

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

编译 上面基本的术语已经介绍完了,下面我们进入来进入蓝图编译过程分析.蓝图的编译过程都在FKismetCompilerContext::Compile()函数中.它根据编译的类型不同(上文编译选项中提到的只编译Skeleton.只生成字节码.只生成cpp代码等等)会走不同的分支.我们这里以完全编译来讲解.此处为大概的流程,若想看详细的流程,请参照流程图以及代码. 清除类 类是就地编译的,这意味着同一个UBlueprintGeneratedClass在每次编译的时候都会被清理,并且会重复利用,这样

虚幻4蓝图虚拟机剖析

前言 这里,我们打算对虚幻4 中蓝图虚拟机的实现做一个大概的讲解,如果对其它的脚本语言的实现有比较清楚的认识,理解起来会容易很多,我们先会对相关术语进行一个简单的介绍,然后会对蓝图虚拟机的实现做一个讲解. 术语 编程语言一般分为编译语言和解释型语言. 编译型语言 程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了.程序执行效率高,依赖编译器,跨平台性差些.如C.C++.Delphi等. 解释性语言 编写的程序不进行预先编译,以文本

虚幻4蓝图跑酷游戏制作公开课

#虚幻4# 蓝图跑酷游戏制作公开课,持续更新中. 油管地址:http://t.cn/Rczx3Jv 国内地址:http://t.cn/Rczx3JP 本课程是免费课程,赞助随意,一杯咖啡钱即可,几杯也行,慢慢喝--

虚幻4蓝图快速入门(四)

蓝图跟C++交互 概述 蓝图可以继承C++类,从而使得程序员可以在代码中创建新的游戏性类,而关卡设计人员可以使用蓝图来继承该类并对其进行修改. 有很多种修饰符可以改变C++类和蓝图系统间交互方式,其中某些修饰符会在本示例中突出介绍. 可以通过查看以下内容来快速了解: 虚幻引擎快速入门视频教程第五章,见引用[1] 官方文档 类设置 在类设置的第一部分中,使用C++类向导创建一个名称为LightSwitchBoth 的类. LightSwitchBoth类中的大部分代码设置都和 仅使用C++的Lig

虚幻4蓝图快速入门(一)

蓝图快速入门 序言 本文依据官方教程总结而来,只是带你对蓝图有一个快速的认识,如果想对蓝图有一个比较深入的了解,那么可以看官方的视频或者是做一些小项目练手,如果你有编程经验的话,上手还是很容易的. 蓝图快速入门 什么是蓝图 虚幻引擎中的蓝图可视化系统是一个完整的游戏脚本系统,其理念是使用基于节点的界面从虚幻编辑器中创建游戏可玩性元素,该系统非常灵活且非常强大,因为它为设计人员提供了一般仅供程序员使用的所有概念及工具.它是一种特殊类型的资源,为关卡设计师和游戏开发人员提供了一种在编辑器中快速创建及

虚幻4蓝图快速入门(三)

数学表达式节点 概述 要想创建一个数学表达式节点,请右击图表并从关联菜单中选择 Add Math Expression(添加数学表达式)... . 数学表达式节点就像一个合并的图表.它是一个独立的节点,您可以双击它来打开构成其功能的子图表. 最初,该名称/表达式是空的.任何时候,当您重命名该节点时,都将会解析新表达式并生成新的子图表. 变量 变量命名非常灵活,但是记住以下几点非常重要: 变量名称本身可以包含数字,但是不能以数字开头. 变量名称不能和隐藏的蓝图变量名称一样. 确保您正在使用正确的变

虚幻4蓝图快速入门(二)

蓝图用户指南 由于蓝图就是个可视化的脚本系统,那么一个程序语言中的基本概念也就都存在.下面我们简单来介绍下蓝图中的一些基本概念. 变量 概述 Variables(变量) 是存放一个值或引用世界中的一个Object或Actor的属性.这些用户界面 内部访问,或者通过设置使得可以在外部进行访问, 以便应用放置在关卡中的蓝图实例的设计人员可以修改它们的 值. 变量显示为圆角方框,方框内包含了变量的名称: 变量类型 您可以创建各种类型的变量,包括数据类型的变量(比如布尔型.整型及浮点型)及用于存放类似于

虚幻4垃圾回收剖析

上一个系列的文章我们已经对虚幻4中的反射实现原理进行了一个简单得讲解,反射的用途非常多,其中一个就是用来做垃圾回收用的,我们这个系列就对虚幻4中的垃圾回收机制做一个讲解.注:本系列文章对应的虚幻4版本是4.14.1 垃圾回收 在计算机科学中,垃圾回收(garbage collection, 缩写GC)是一种自动的内存管理机制.当一个电脑上的动态内存不需要时,就应该予以释放,这种自动内存的资源管理,称为垃圾回收.垃圾回收可以减少程序员的负担,也能减少程序员犯错的机会.最早起源于LISP语言.目前许