java和PHP的区别

java和PHP的区别

本文章纯属自己记录学习的文章,东西都是查看别人的文章总结的,链接如下:
PHP编译:https://blog.csdn.net/tracywxh/article/details/41147915
JIT即时编译:https://www.cnblogs.com/jueyoq/p/7900232.html

考点:java特性

分析:答题方向——代码编译,模板引擎,多线程

名词解释:

1)静态语言:就是在编译时就知道数据类型的语言(java,c,c++等),动态语言就是运行时才确定数据类型(js,php)

2)JVM:虚拟机

3)JIT:即时编译

知识扩展:

1)java的程序编译过程

java是一种静态语言,但是比较特殊,需要编译,但是并不是在执行之前就编译为本地机器码。所以java编译机制分为两个时期:

  • javac指令讲java源码变成java字节码的静态编译过程
  • java字节码被编译为本地机器码的过程,并且因为这个过程是在程序运行时期完成的所以称之为即时编译。

静态编译过程是javac来完成的,而即时编译是通过JVM(虚拟机)来完成的。即时编译机制是被内嵌于 java字节码执行引擎之中,可以算的上是 jvm的一个内存组件。

jvm的执行引擎中 有 一个解释器用来识别字节码指令,并将字节码指令映射为机器指令 调用操作系统来完成程序的运行。 这样来看,虽然实现了 java的跨平台特性,但是 却以牺牲了极大的的性能为代价。 为了提高java程序的性能,jvm实现了即时编译机制。即,在程序运行期间,根据对热点字节码的探测(运行次数超过某个阀值的代码,这个阈值好像是10000次),将这部分热点代码进行特别的优化,将其直接编译为本地机器码执行。 这个过程由java字节码执行引擎中的 两个编译器完成,C1与C2编辑器,一个用于客户端,一个用于服务器。 c1相比较与c2他的编译优化程度要低一些,c2将针对服务器进行一些激进的优化,以保证代码在服务器运行时性能更加突出。

总结:就是java代码的编译分为两部分,第一部分为静态编译,第二部分为即时编译,而JIT会编译热点代码,提高java程序的性能。

2)PHP程序编译过程

PHP的执行分3个阶段:

  • Parse 语法分析阶段。
  • Compile 编译产出opcode中间码。
  • Execute 运行,动态运行进行输出

由于PHP是个解释型语言,执行的时候先得把程序读进来,然后由Zend引擎编译成opcode。最后Zend虚拟机顺次执行这些opcode(指令)完成操作。因此我们可 以把这个Opcode缓存起来,下次就能避免重新编译了。

总结:php有opcache机制,将对应代码的opcode缓存到内存中。

参考回答:

答题点:java的JIT编译热点代码,PHP的opcache机制,PHP8也支持JIT,
    模板引擎,多线程的运行

PHP暂时还不支持像Java那样JIT运行时编译热点代码,但是PHP具有opcache机制,能够把脚本对应的opcode缓存在内存,PHP7中还支持配置opcache.file_cache导出opcode到文件.第三方的Facebook HHVM也支持JIT.另外PHP官方基于LLVM围绕opcache机制构建的Zend JIT分支也正在开发测试中.在php-src/Zend/bench.php测试显示,PHP JIT分支速度是PHP 5.4的10倍.

PHP的库函数用C实现,而Java核心运行时类库(jdk/jre/lib/rt.jar,大于60MB)用Java编写(jdk/src.zip), 所以Java应用运行的时候,用户编写的代码以及引用的类库和框架都要在JVM上解释执行. Java的HotSpot机制,直到有方法被执行10000次才会触发JIT编译, 在此之前运行在解释模式下,以避免出现JIT编译花费的时间比方法解释执行消耗的时间还要多的情况.

PHP内置模板引擎,自身就是模板语言.而Java Web需要使用JSP容器如Tomcat或第三方模板引擎.

PHP也可以运行在多线程模式下,比如Apache的event MPM和Facebook的HHVM都是多线程架构.不管是多进程还是多线程的PHP Web运行模式,都不需要PHP开发者关心和控制,也就是说PHP开发者不需要写代码参与进程和线程的管理,这些都由PHP-FPM/HHVM/Apache实现.PHP-FPM进程管理和并发实现并不需要PHP开发者关心,而Java多线程编程需要Java开发者编码参与.PHP一个worker进程崩溃,master进程会自动新建一个新的worker进程,并不会导致PHP服务崩溃.而Java多线程编程稍有不慎(比如没有捕获异常)就会导致JVM崩溃退出.对于PHP-FPM和Apache MOD_PHP来说,服务进程常驻内存,但一次请求释放一次资源,这种内存释放非常彻底. PHP基于引用计数的GC甚至都还没发挥作用程序就已经结束了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值