相信很多理论的解释各位都看腻了比如以下百度百科的
本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
以及各大书本上写的“将计算机语言翻译成计算机能识别的语言”,栏主这几个星期消失的时间段里,从编译原理基础开始,到理解正则,文法,优化,错误处理等各个方面为各位理清,编译究竟做了什么,我们的终极目标是成功编译方舟编译器,从零开始。
由于栏主也是新学,所以这个栏目会持续更新,周期长达6个月,在这不到1000字的内容里,把编译世界之美给各位呈现出来。
c:
int main(){
printf("hello world");
}
从上面的百度百科解释我们知道,从高级语言c/go/c++/java/php 等翻译成计算机可识别的程序那么编译器做了以下几件事情
1.关键字表
关键字 int 0
main 1
printf 2
2.终结符
空格 3
( 4
) 5
{ 6
} 7
; 8
3.正则文法
计算机会一个一个字符从左到右识别单词和符号intmain(){}printf("hello world");}
首先经过编译器的前端第一个步骤:词法分析
词法分析得出的结果int main printf 等都是关键字
第二个步骤:语法分析
这里需要引用一个例子:I`m a teacher 主语:I 谓语be 宾语:teacher 才构成一个合法的句子那么语法分析做的事就是这个
int main printf hello world
传入参数 int 主函数入口 main 函数printf 打印hello world
然后生成抽象语法树:

第三个步骤:语义分析
分析上诉AST是否通达情理
比如
int main(){
printf("hello world");
print(a);
}
变量a并未声明,所以还需要判断错误。
以上这几个步骤在编译器设计当中被称为前端:词法分析->语法分析->语义分析
前端得到的AST语法树需要经过优化层也被称作中间层,转换为介于人可读 与 计算机可读之间的状态
例如上图AST 利用之前的表库 把关键字替换成数字0~N。N取决于高级语言有多少种关键字比如
c语言:
void printf int float
go语言:
go for :=
那么上述AST树就会变成数字+字符+字母的中间状态组合
这里引用金庸的一句话:张三丰教张无忌练习「太极剑」时,要他「忘掉剑招,只记剑意」。
无招:
我了解你的关键词实现原理,go java c c++ php等等这么多高级语言,无非就是在正则,文法之间的不同
有招:
学习关键字 for do while if else switch case
说了这么这么多,无非学习一门语言看“自顶向下”or“自底向上” 各有各的的好处。
注释:以上全是个人主观观点,劣文拙文,全当看个笑话就好。顺便一提栏主编译+逆向同步进行。年后更新
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。