编译原理
“编译原理”是计算机专业非常重要的一门专业课,在计算机教学中有着举足轻重的地位。同时,编译系统是整个计算机系统中极其重要的系统软件,它的作用是把计算机高级语言最终翻译成等价的计算机指令,从而保证高级程序设计语言顺利运行。
工作流程
源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(linker)→ 可执行文件(executables)
机器码和字节码
机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。
字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
JS代码执行:JS代码->解析成 AST (期间伴随词法分析、语法分析)->生成字节码(V8)->生成机器码(编译器)
编译器
编译器是计算机程序中应用比较多的工具,在对编译器进行前端设计时,一定要充分考虑影响因素,还要对词法、语法、语义进行分析。
过程分析
将高级程序设吾言,如C、C++、Java等,翻译成计算机可以执行的机器指令代码流的过程,即是编译的过程。编译过程一般分为6个步骤,即词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成。
1)词法分析
词法分析作为编译过程的第一个阶段,通过读人源程序输入的字符实现:①将输人字符组成词素,生成并输出一个词法单元序列;②过滤掉源程序中的注释和空白;③将编译器生成的错误消息与源程序的位置关联起来。如表达式“sum=3+2;”。
2)语法分析
语法分析作为编译过程的第二个阶段,将分析从词法分析器中提取出的单词序列是否符合相应语言语法的约束,如输入序列中包含左括号“(”,则语法分析器会在“(”后找寻是否存在匹配的右括号“)”,若不存在则提示语法错误。
3)语义分析
语义分析作为编译过程的第三个阶段,一般分为静态语义和动态语义两种。语义分析的作用是在程序语法正确的前提下, 分析关于语法结构含义及使用的规则,如C语言中,加法运算要求“+” 左右操作数为整型数, 若出现类似“1+false”的表达式,语法无误但为语义错误。
编译策略
即时编译(JIT) 跟踪即时编译(英语:Tracing just-in-time compilation)
提前编译(英语:Ahead-of-time compilation)(AOT)
源代码至源代码编译器
动态重编译
知名运行环境
Android Runtime(ART) 通用语言运行库(CLR) crt0 Java虚拟机(JVM)
V8 Node.js PyPy Zend引擎