关于中文编程的一些思考( 二 )


3.翻译 + 解析型语言(Java、C# ......)
大致执行流程:源代码->中间代码->虚拟机->机器码->CPU执行
首先 , 需要说明的是:上面几种分类包含的语言 , 都是属于自然语言的范畴 。 其次 , 计算机最终执行的 , 都是由01组成的机器语言 。
不知道 , 你有没有跟笔者一样想过这样一个问题:这些自然语言最终是怎么在计算机上跑起来的?
2.1 编译器编译器(compiler)是一种计算机程序 , 它会将某种编程语言写成的源代码(原始语言)转换成另一种编程语言(目标语言) 。
它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序 , 翻译为计算机能解读、运行的低阶机器语言的程序 , 也就是可执行文件 。 编译器将原始程序(source program)作为输入 , 翻译产生使用目标语言(target language)的等价程序 。 源代码一般为高级语言(High-level language) , 如Pascal、C、C++、C# 、Java等 , 而目标语言则是汇编语言或目标机器的目标代码(Object code) , 有时也称作机器代码(Machine code) 。
一个现代编译器的主要工作流程如下:源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(linker)→ 可执行文件(executables) , 最后打包好的文件就可以给计算机去运行了 。
关于中文编程的一些思考文章插图
[ 现代编译器的主要工作流程 ]
2.2 编译过程编译器一般分为:前端和后端 。
编译器的前端一般承担着词法分析、语法分析、类型检查和中间代码生成几部分工作(该部分也是设计一门新的编程语言 , 需要重点关注的部分 。 同时 , 也是各种编程语言差异化最大的部分) 。 而编译器后端主要负责目标代码的生成和优化 , 也就是将中间代码翻译成目标机器能够运行的机器码 。
关于中文编程的一些思考文章插图
对应步骤所起到的作用为:
?词法分析 通过词法分析器识别出最小的语法单位 , 并用对应token表示其词性 。 (源程序字符串 → 单词符号)
?语法分析 通过语法分析器根据单词词性 , 分析语法 。 (单词符号 → 语法单位)
?语义分析与中间代码生成 根据单词值分析语义是否正确 , 生成中间代码 。 (语法单位 → 中间代码)
?代码优化 对中间代码进行优化 , 以期产生更高效的目标代码 。 (中间代码 → 优化后的中间代码)
?目标代码生成 将中间代码转换成低级语言代码 。 (中间代码 → 目标代码)
关于中文编程的一些思考文章插图
各种语言都有上述步骤 , 底层的实现也基本相似 。
3. PHP词法分析笔者这里使用PHP语言 , 来一步步分析其实现中文编程代码的原理 。
3.1 PHP执行过程从编程语言分类来看 , PHP属于解释型语言 , 对于解释型语言来说 , 都会有一个解释器(php的解释器为zend引擎 , zend这个词汇来源于最初两位核心开发者的名字组合的单词 , 后来成立了zend公司) 。 PHP源码的执行过程 , 大概分为下面几个步骤:
1.词法分析 (此处是本文重点)2.语法分析3.生成抽象语法树AST4.生成中间码opcode5.zend引擎执行opcode
关于中文编程的一些思考文章插图
[ PHP源码执行过程 ]
opcode在笔者看来是有点类似于汇编码的中间码 , 不过这里的中间码是被zend引擎执行的 。
关于中文编程的一些思考文章插图