SPIR-V 研究:编译器基本原理(一)

前面转过两篇关于SPIR-V 中间语言的介绍;接下来笔者准备深入学习一下SPIR-V的标准。根据标准,SPIR-V是以一种二进制格式存在的,并且函数还是以控制流图CFG的形式存在;数据结构也保留了高级语言里的层级关系。(https://en.wikipedia.org/wiki/Standard_Portable_Intermediate_Representation)
这样做的目的是为了更好的在目标平台上进行优化;同时Khronos也放出了官方标准的开源编译器Glslang。 所以,为了更好的了解SPIR-V,我们有必要先温习一下编译器的基本原理,特别是前端的词法分析、语法分析、语义分析和中间语言生成。


编译器基本结构

下图是一个一般编译器的编译高级语言的过程。

基本上就是预处理(比如C/C++里宏汇编),编译并汇编(每个源码文件都生成对应的.o文件,这时的代码是relocatable的),链接生成可执行文件(linker,把许多.o文件以及用到的库函数.lib文件合并并作全局优化),最后OS的加载器会加载可执行文件并运行之(Windows上是PE格式,Linux上市ELF格式)。具体细节可以参考Linkers and Loaders 这本书。

下面我们重点看编译器的结构。

这是一般编译器的结构,主要分前端和后端,以中间语言生成为界限。前端主要是分析语法语义并生成代码的中间表示,这主要包括lexer 和 parser,以及语义分析;后端主要是生成目标机器代码,包括分析并优化,寄存器分配等。
下图是编译器的主要编译过程(phase)。

这里我们研究的目标SPIR-V就是一种标准化的中间语言表示。所以我们更关心的是前端的研究,这也是编译器里比较成熟,相对简单的部分。以前的OpenGL里,GLSL写成的Shader是高级语言(相当于C++),OpenGL的驱动会把它编译成显卡GPU对应的机器码。所以各家会有不同的中间表示;Vulkan会统一标准用SPIR-V了。

计算机语言

计算机科学里的语言可以看作是一个字母表(alphabet )上的某些有限长字符串的集合;这一般可以包含无限多个字符串,也就是无限集合(Infinite Sets)。这里有限长字符串就是“sentences”;sentences是word(或token)组成,它有一定的结构;token则是letter由一定规则组成;letter个数是有限的,它们全部取自字母表(alphabet )。
这是个有层次的定义。

Layer 分析对象 组成元素
词法(Lexical structure ) token letter
语法(Syntactic structure) sentences token
语义(Semantics) 语法树

语言是有一定的语法规则的(grammar)。而grammar是一组有限的规则的集合;计算机语言里的grammar是不同于一般自然语言的语法,它可以构造出所有可能的sentences。所以这是一个利用有限规则来产生无限的合法语句的问题。
而grammar又可以用正则表达式来定义;比如GLSL的语法glslang.y。

SPIR-V 研究:编译器基本原理(一)相关推荐

  1. SPIR-V 研究:编译器基本原理

    http://blog.csdn.net/qwertyu1234/article/details/50163847 前面转过两篇关于SPIR-V 中间语言的介绍:接下来笔者准备深入学习一下SPIR-V ...

  2. JVM性能优化, Part 2 ―― 编译器

    2019独角兽企业重金招聘Python工程师标准>>> ImportNew注:本文是JVM性能优化 – 第2篇 <JVM性能优化, Part 2 ―― 编译器>第一篇 & ...

  3. GCC编译器原理(二)------编译原理一:目标文件

    一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和 ...

  4. 零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]

    原创首发于CSDN,转载请注明出处,谢谢! 文章目录 为何会在Linux下开发单片机 个人系统环境与所用开发板 安装开源编译器 sdcc STC MCU ISP 闪存工具 stcgal 的安装 单片机 ...

  5. Linux C语言编程基本原理与实践

    重识C语言 C语言是一种通用的, 面向过程的编程语言, 在系统与应用软件的开发应用较广 是人类和计算机交流的一种方式 ANSI C: 是C语言的标准, 为了避免各开发商用的C语言语法的差异 C语言的特 ...

  6. c/c++编译器的安装

    MinGW(Minimalist GNU For Windows)是个精简的Windows平台C/C++.ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便. MinGW最 ...

  7. 编译原理大作业-PL0语言编译器

    编译原理大作业-PL0语言编译器 一.实验目的 二.源码说明 1.头文件pl0.h (1 词法分析主要数据结构(通过enum symbol类实现) 1.保留字(13+4个): 2.运算符及界符(16+ ...

  8. freepascal linux 界面,FreePascal中的编译器选项

    编译器选项: 普通选项: -h 该选项将把所有的命令行选项列出来,然后退出程序 -? 同-H一样的,在分屏显示 -i 这个选项显示编译器版权信息,你能给一个选项,类似下面 -ixxx D      返 ...

  9. 赞美是感情生活的“保鲜剂”:关于赞美分享的fMRI研究

    导读 爱可能是一个人经历过的最迷人的感觉.然而,人们对浪漫情侣的大脑中究竟发生了什么知之甚少--这是成年时期最核心和最突出的关系.为了深入了解近乎自然的情侣互动,本研究在两个fMRI扫描仪中同时收集了 ...

  10. 编译器设计(十)——数据流分析

    文章目录 一.概述 二.迭代数据流分析 2.1 支配性 2.2 活跃变量分析 2.3 数据流分析的局限性 2.4 其他数据流问题 2.4.1 可用表达式 2.4.2 可达定义 2.4.3 可预测表达式 ...

最新文章

  1. mysql大表迁移_MySQL 大表迁移
  2. putty完全使用手册--多窗口---git提交---连接数据库--自动日志显示
  3. 【深度学习】眼底图像的视杯和视盘分割解析
  4. python 命令-Python中执行系统命令的四种方法
  5. 北交大计算机学院教授,北京交通大学计算机与信息技术学院研究生导师:鲁凌云...
  6. 新手应该如何有效地学习.net
  7. Could not get unknown property 'ANDROID_BUILD_SDK_VERSION'
  8. postgresql 创建用户_Liunx系统安装PostgreSQL数据库教程,值得程序员收藏pg安装教程
  9. 前端共享桌面_2020 前端学习路线总结,哎呦,不错哦!
  10. 在UE中自由绘制基本图元的几种方法
  11. 他无一纸文凭,何以成为清华教授,被誉为“三百年才出一个的大师”?
  12. 护航Lazada双11购物节 阿里云CDN全球化火力全开
  13. 看故事学知识,这篇Java代理的文章妙啊!
  14. 【C++】教大家在七夕new一个对象
  15. 1500个javascript特效
  16. 计算机高级工程师如何评正高,如何评高级职称
  17. 前一个问题的答案后续
  18. 赛博朋克式炼狱:电子垃圾在印度
  19. 下载tensorflow时遇到的问题
  20. 计算梯形面积的程序html,如何利用几何画板计算梯形的面积

热门文章

  1. DRM破解再升级 支持新版WM11
  2. WEB通信之 长连接、长轮询(long polling)
  3. 计算机桌面图标的使用,电脑桌面图标不见了怎么恢复 如何规范使用电脑
  4. 菜鸟和计算机高手的差别
  5. 爬虫js逆向实战--中通快递轨迹查询接口(验证码)
  6. c语言中比较两束大小,【 C 语言吧 · 文学 · 西游记 】
  7. 八爪鱼抓取html,网页数据爬取方法详解 - 八爪鱼采集器
  8. easyphp 登陆mysql_EasyPHP 16.1.1无法启动MySQL
  9. CentOS8 多网卡BondingTeam
  10. vue+websocket+nodejs实现聊天室 -一对多、一对一聊天