对比C语言和JavaScript的编译过程
首先在JavaScript中不存在像C语言中那么多的处理过程。
C:预处理-->编译-->汇编-->链接
javascript:语法分析-->预编译-->执行
C语言中的预处理就是进行一些简单的处理:具体包括:
a.宏定义指令:将所有的#define删除,并且展开所有的宏定义。
b.条件编译指令:处理所有的条件预编译指令。
c.头文件包含指令:处理#include 预编译指令。
d.特殊符号指令:预编译器可研识别一些特殊的符号,例如:删除所有注释 “//“。
e.添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
f.保留所有的#pragma编译器指令,因为编译器需要使用它们。
编译:编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。
注意这里C语言的语法分析是在编译里面,而对于JavaScript的语法分析就是在预编译里面了。我们来看一下JavaScript里面的预编译。以一段代码为例:
<script>
var a = 1;
function b(c){
var d = 1;
}
</script>
首先产生GO全局变量,加载script里的内容,加载完毕,分析语法(语法分析有专门的分析器)是否合理。开始预编译:
--查找变量声明,作为GO属性,值赋予undefined
--查找函数声明,作为GO属性,值赋予函数体
伪代码:
GO/window = {
a: undefined;
b: function(c){
var d = 1;
}
}
执行b函数之前发生再次预编译:
创建AO活动对象
查找形参和变量声明,值赋予undefined
实参值赋给形参
查找函数声明,值赋予函数体
AO = {
c: 所赋予的值
d: undefined
}
然后执行这段b函数代码。
这就是javascript里面的编译过程了。
C语言则不然,它会继续汇编,汇编器将汇编代码转变成机器可以执行的命令,根据汇编指令和机器指令的对照表一一翻译即可。
C语言最后一步是链接,通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件。