编译型语言和解释型语言从PHP、Java、C语言的编译和执行过程中,可以先解释一下编译型语言和解释型语言。编译型语言程序在执行前需要经过特殊的编译过程。程序被编译成机器语言文件。运行时无需重新编译,直接使用编译结果。程序执行效率高,依赖编译器,跨平台性能差。如C、C++、Delphi等。解释型语言程序不需要编译,程序在运行时被翻译成机器语言,每次执行都要翻译一次。因此,效率相对较低。例如Basic语言有一个解释器可以直接执行Basic程序,每条语句在执行时都会进行翻译。(在程序运行时翻译,有专门的解释器翻译,每条语句在执行时翻译,效率比较低,依赖解释器,跨平台性能好。)PHP语言编译执行过程如下鸟哥博客内容:深入理解PHP原理opcodehello.phpZend引擎对这个hello.php文件进行词法分析,语法分析,编译成opcode,执行opcode。这个Zend引擎是在安装PHP的时候安装的。看看这个文件是如何工作的,它会经历以下四个阶段:phphello.php1.Scanning(Lexing),将PHP代码转换成语言片段(Tokens)2.解析,将Tokens转换成简单有意义的表达式3.编译,将表达式编译成Opocdes4.Execution,依次执行Opcodes,一次一个,从而实现PHP脚本的功能。在操作系统中执行php命令就是运行Zend引擎,然后Zend引擎得到hello.php文件。乐行是什么?词法分析的基础表。Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l(Lex文件)对输入的PHP代码进行词法分析,从而得到一个一个的“词”。PHP4.2开始提供了一个叫做token_get_all的函数,可以将一段PHP代码扫描成Tokens;如果你用这个函数来处理我们一开始提到的PHP代码,你会得到如下结果:Array([0]=>Array([0]=>367[1]=>Array([0]=>316[1]=>echo)[2]=>Array([0]=>370[1]=>)[3]=>Array([0]=>315[1]=>"HelloWorld")[4]=>;[5]=>数组([0]=>370[1]=>)[6]=>=[7]=>数组([0]=>370[1]=>)[8]=>数组([0]=>305[1]=>1)[9]=>数组([0]=>370[1]=>)[10]=>+[11]=>数组([0]=>370[1]=>)[12]=>数组([0]=>305[1]=>1)[13]=>;[14]=>数组([0]=>370[1]=>)[15]=>数组([0]=>316[1]=>回显)[16]=>数组([0]=>370[1]=>)[17]=>;)parsethisreturns结果我们可以发现源码中的字符串、字符、空格都会原样返回每个源码中的字符,并且它们将以相应的顺序出现。但是其他的东西比如标签、运算符、语句都会被转换成一个Array,包含两部分:TokenID(也就是Zend内部变化的Token对应的代码,比如T_ECHO、T_STRING),和原来的源代码内容。接下来,是Parsing阶段。Parsing会先丢弃Tokens数组中多余的空格,然后将剩余的Tokens一个一个的转换成简单的表达式>1.echo一个常量字符串>2.将两个数相加>3.将前面表达式的结果存入一个variable>4.echoavariable1.Opcode编号标识,表示每个op_array的操作类型,如add,echo2。result存放Opcode3的结果。Operand1给OpcodeNumber4的运算。Operand25。扩展值1整数,用来区分重载的运算符,然后转入Compilation阶段,将Tokens编译成op_arrays,每个op_array包含以下5个部分,其中opcode编号标识符号对应zend_vm_opcode.h中的指令。参考laruence:opcodelist比如我们的PHP代码会被解析成:*ZEND_ECHO'HelloWorld'*ZEND_ADD~011*ZEND_ASSIGN!0~0*ZEND_ECHO!0Java语言编译执行过程JVM执行一个程序的过程程序:I.加载.class文件II.管理和分配内存III.执行垃圾回收他也是操作系统的一个进程,所以他也有自己的运行生命周期,也有自己的代码和数据空间。JVM处于整个jdk的最底层,负责与操作系统的交互。它用来屏蔽操作系统环境,提供完整的Java运行环境,所以也是虚拟计算机。操作系统通过jdk中的Java.exe加载到JVM中。完成,通过以下4个步骤完成JVM环境。1.创建JVM加载环境和配置2.加载JVM.dll3.初始化JVM.dll并hook到JNIENV(JNI调用接口)实例4.调用JNIEnv实例加载和处理类。C语言编译执行过程参考原文:C语言编译过程详解熟悉到大家都觉得编译事件是一件简单的事情。这是真的吗?让我们仔细看看C语言的编译过程。上面的gcc命令实际上依次执行了四个步骤:1.预处理(Preprocessing)2.编译(Compilation)3.汇编(Assemble)4.链接(Linking)示例代码://test.c#include
