当前位置: 首页 > 后端技术 > PHP

【开发语言】PHP、Java、C语言的编译执行过程

时间:2023-03-29 21:47:23 PHP

编译型语言和解释型语言从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#include"mymath.h"//自定义头文件intmain(){inta=2;整数b=3;intsum=add(a,b);printf("a=%d,b=%d,a+b=%d\n",a,b,sum);}头文件定义://mymath.h#ifndefMYMATH_H#defineMYMATH_Hintadd(inta,intb);intsum(inta,intb);#endif头文件实现://mymath.cintadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}preprocessingstagepreprocessing展开源代码,插入#include命令指定的所有文件,展开#define声明指定的所有宏。经过预处理,还是得到了文本文件,但是文件体积会大很多。gcc的预处理是由预处理器cpp完成的。可以通过以下命令对test.c进行预处理:gcc-E-I./inctest.c-otest.i或者直接调用cpp命令cpptest。c-I./inc-otest.i上面命令中的-E是让编译器在预处理后退出,不再进行后续的编译过程;-I指定头文件目录,也就是我们自定义的头文件目录;-o指定输出文件名。编译(Compilation)阶段gcc-S-I./inctest.c-otest.s在上面的命令中-S使得编译器在编译后停止,不再进行后续处理。编译过程完成后,会生成程序的汇编代码test.s,也是一个文本文件,内容如下://test.cTheresultassemblyafterassemblytest.s.file"test.c".section.rodata.LC0:.字符串"a=%d,b=%d,a+b=%d\n".text.globlmain.typemain,@functionmain:.LFB0:.cfi_startprocpushl%ebp.cfi_def_cfa_offset8.cfi_offset5,-8movl%esp,%ebp.cfi_def_cfa_register5andl$-16,%espsubl$32,%espmovl$2,20(%esp)movl$3,24(%esp)movl24(%esp),%eaxmovl%eax,4(%esp)movl20(%esp),%eaxmovl%eax,(%esp)呼叫添加movl%eax,28(%esp)movl28(%esp),%eaxmovl%eax,12(%esp)movl24(%esp),%eaxmovl%eax,8(%esp)movl20(%esp),%eaxmovl%eax,4(%esp)movl$.LC0,(%esp)callprintf离开。cfi_restore5.cfi_def_cfa4,4ret.cfi_endproc.LFE0:.sizemain,.-main.ident"GCC:(Ubuntu4.8.2-19ubuntu1)4.8.2".section.note.GNU-stack,"",@前位在汇编(Assemble)阶段,汇编过程将上一步的汇编代码转换成机器码(machinecode)。这一步生成的文件称为目标文件,是二进制格式。gcc的汇编过程是通过as命令完成的:$astest.s-otest.o等价于:gcc-ctest.s-otest.o这一步会为每个源文件生成一个目标文件。因此mymath.c还需要生成一个mymath.o文件。链接(Linking)阶段链接过程将多个目标文件和所需的库文件(.so等)链接成最终的可执行文件(executablefile)。命令大致如下:$ld-otest.outtest.oinc/mymath.o...libraries...几种语言编译执行的本质区别:PHP:Compiletoopcodeduringexecution,and然后zend引擎执行opcodeJava:先编译成字节码,再由JVM虚拟机执行字节码C:直接编译成可执行文件,再由操作系统执行可执行文件参考:http://tina.reeze.cn/book/http://www.laruence.com/2008/...http://rednaxelafx.iteye.com/...http://www.vcgood.com/archive...http://www.cnblogs.com/Carpen...http://blog.csdn.net/cutesour...http://www.nowamagic.net/libr...