Skip to content

编译原理

可以了解PostCSS、Babel、Vue模板编译等原理

《编码》

这本书非常好

《两周自制脚本语言》读书笔记

一些概念

机器语言写成的程序本质上是一个位数很长的二进制数字。由于它不易于阅读,人们常通过汇编语言程序来表述这个巨大的数字,使其更易于理解。

因此,如果要执行汇编语言写成的程序,用户通常需要使用软件将其转换为机器语言。这种软件称为汇编程序(assembler)。汇编程序可以说是一种最基本的语言处理器

语言处理器可大致分为解释器与编译器两种

  • 解释器,解释器根据程序中的算法执行运算
  • 编译器,编译器能将某种语言写成的程序转换为另一种语言的程序,通常它会将原程序转换为机器语言程序

C 语言通常直接通过编译器转换为机器语言执行。转换后得到的机器语言程序会暂时保存至某个文件,需要借助操作系统来执行

Java 语言首先会通过编译器把源代码转换为 Java 二进制代码,并将这种虚拟的机器语言保存在文件中。之后,Java 虚拟机的解释器将执行这段代码。为了提高性能,大部分JVM会在执行过程中通过编译器将一部分 Java 二进制代码直接转换为机器语言使用,执行过程中进行的机器语言转换称为动态编译或 JIT 编译(Just-In-Time compile)

计算机基于二进制,运行在计算机上的程序和数据本质上都是二进制的

二进制编写程序难度太大,因此人们发明了高级编程语言,使用高级编程语言需要通过编译器或解释器,将源码翻译成计算机可执行的二进制文件,可以在计算机上直接执行的二进制文件被称为可执行文件

参考:

编译一般分为四步:预处理(Preprocess)、编译(Compile)、汇编(Assembly)和链接(Link)

预处理主要进行主要处理规则如下:

  • 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。这是一个递归的过程,如果被包含的文件还包含了其他文件,会递归地完成这个过程。
  • 处理条件预编译指令,比如#if、#ifdef、#elif、#else、#endif。
  • 删除#define,展开所有宏定义。
  • 添加行号和文件名标识,以便于在编译过程中产生编译错误或者调试时都能够生成行号信息。

编译的过程主要是进行词法分析、语法分析、语义分析

make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序

CMake允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件

因此,具体的步骤为:通过CMake生成一个Makefile,然后使用make命令结合这个Makefile文件进行编译等工作

设计语言功能

支持四则运算、字符串、变量