前两天还在想,像Quercus只封装了PHP在Java上的Web接口,有没有实现了完整的JVM语言特性的东东,这不,来了。

JPHP是一个面向Java虚拟机的PHP实现,支持PHP(5.3+)的很多特性。JPHP负责将PHP源代码编译为JVM字节码,使其能够运行在JVM上,这一点和JRuby、Jython等实现类似。它支持JDK 1.6及以上版本。该项目发起于去年10月。

JPHP无意替代Zend PHP引擎或Facebook HHVM(HHVM的思路是将PHP编译为一种中间字节码,再通过JIT将字节码编译为x64机器码)。出于以下原因,设计者不打算为JPHP实现Zend运行时库(如Curl、PRCE等):

  • 能够在PHP中使用Java类库
  • 通过JIT和JVM提升性能
  • 使用更好的运行时库替换Zend PHP丑陋的运行时库
  • 将PHP语言的使用范围扩充到Web之外
  • JVM对Unicode字符串和线程支持更好

JPHP有如下功能:

  • JIT(比PHP 5.4快2-10倍)
  • 优化器(优化常量表达式、内联函数等)
  • 可以在PHP代码中使用Java的类库和类
  • Unicode字符串(类似Java中的UTF-16)
  • 线程、套接字
  • 环境架构(类似runkit zend扩展中的沙盒对象)
  • 支持GUI,基于Swing实现而且有所改进,提供了更为灵活的布局
  • 面向类和函数的内嵌缓存系统
  • 面向类和函数的可选热更新(Optional Hot Reloading)机制

语言方面的特性包括:

  • 完全支持PHP 5.2+(包括OOP)
  • 闭包(PHP 5.3),在闭包中自动绑定$this(PHP 5.4)
  • 完全支持命名空间(PHP 5.3)
  • 类的spl自动加载(PHP 5.3)
  • Iterators、ArrayAccess和Serializable
  • 类、数组和callable的类型约束(PHP 5.4)
  • 数组短语法(PHP 5.4)
  • 针对循环引用的GC(PHP 5.3)

更多特性可以查看该项目的README文件。

此外,JPHP还提供了一些PHP不支持的特性,比如在__toString方法中可以使用异常、对标量的类型约束等。

JPHP并非改进PHP性能的第一次尝试,到底效果如何,我们拭目以待。感兴趣的读者可以下载并动手尝试一下

写GUI:

<?php
namespace { use php\lang\System;
use php\lang\Thread;
use php\swing\SwingUtilities;
use php\swing\UIForm;
use php\swing\UIManager;
use php\swing\UIProgress; UIManager::setLookAndFeel(UIManager::getSystemLookAndFeel()); SwingUtilities::invokeLater(function(){
$form = new UIForm();
$form->size = [500, 500];
$form->moveToCenter();
$form->visible = true; $p = new UIProgress();
$p->size = [300, 40];
$p->position = [100, 100];
$p->value = 50;
$form->add($p); $form->on('windowClosing', function(){
System::halt(0);
});
});
}

转 PHP在JVM上的实现JPHP的更多相关文章

  1. 为什么很多语言选择在JVM上实现

    非常经济地实现跨平台.你的语言编译器后端只需要输出 JVM 字节码就可以.跨平台需要极大的工作量,举个例子,只是独立开发生成本地代码,就需要花费大量精力去针对不同平台和处理器进行优化(比如 Firef ...

  2. JVM上的响应式流 — Reactor简介

    强烈建议先阅读下JVM平台上的响应式流(Reactive Streams)规范,如果没读过的话. 官方文档:https://projectreactor.io/. 响应式编程 作为响应式编程方向上的第 ...

  3. CentOS7 Tomcat 启动过程很慢,JVM上的随机数与熵池策略

    1. CentOS7 Tomcat 启动过程很慢 在centos启动官方的tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的: <co ...

  4. ZooKeeper服务器是用Java创建的,它在JVM上运行。

    ZooKeeper服务器是用Java创建的,它在JVM上运行. 创建配置文件 使用命令 vi conf/zoo.cfg 和所有以下参数设置为起点,打开名为 conf/zoo.cfg 的配置文件. $ ...

  5. 牛逼了,教你用九种语言在JVM上输出HelloWorld

    我们在<深入分析Java的编译原理>中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode). 有 ...

  6. JVM上的随机数与熵池策略

    在apache-tomcat官方文档:如何让tomcat启动更快里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的“熵源”(entropy source)的策略. 他提到tomcat7的 ...

  7. 深入理解 JVM(上)

    菜鸟拙见,望请纠正(首先:推荐一本书[链接:https://pan.baidu.com/s/15I062n5LPYtRmueAAUFuFA 密码:kyo1]) 一:JVM体系概述 1:JVM是运行在操 ...

  8. JVM上的下一个Java——Scala

    Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言.Scala编程语言近来抓住了很多开发者的眼球.它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格. ...

  9. Springboot程序启动慢及JVM上的随机数与熵池策略

    问题描述 线上环境中很容易出现一个java应用启动非常耗时的情况,在日志中可以发现是session引起的随机数问题导致的 o.a.c.util.SessionIdGeneratorBase : Cre ...

随机推荐

  1. SQL Server Profiler:使用方法和指标说明

    SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接.感觉这个工具的作用还是很大的,给大家分享一 ...

  2. Spring Boot 之 HelloWorld详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “以前是人放狗看家,现在是狗牵着人散步” — 随笔 一.Spring Boot 自述 世界上最好 ...

  3. 为应用程序池 'DefaultAppPool' 提供服务的进程无法响应Ping

    打开Windows 2008 的事件查看器,应用警告提示: 为应用程序池 'DefaultAppPool' 提供服务的进程无法响应 Ping.进程 ID 是 '2144'. 注意: 需要重新注册一vb ...

  4. css3 keyframes在yuicompressor下压缩问题

    @keyframes proBackAction { 0% { opacity:; } 100% { opacity: .8; } } @keyframes proBackAction { 0{ op ...

  5. php -- php读取sqlserver2005的数据实现分页查询

    --php5.2 --sqlserver2005 php读取sqlserver多条数据时,有时因为数据太多,需要进行分页查询. 例如,按价格的顺序,读取同一类型的产品的第30到第48条记录 $star ...

  6. java io系列01之 "目录"

    java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...

  7. 基于 Markdown 的开源的 Node.js 知识库平台

    Raneto 是一个免费,开源的 Node.js 知识库平台,基于静态 Markdown 文件实现. Raneto 可以被称为静态网站生成器,因为它并不需要数据库支持.所有的内容都存储在 Markdo ...

  8. nodeJS 菜鸟入门

    从一个简单的 HTTP 服务开始旅程-- 创建一个 server.js 文件,写入: //最简单的 http 服务例子 var http = require("http"); ht ...

  9. [C#] 语法之Attribute

    在c#中,定义类的成员,可以定义Property称为属性.Attribute就称为特性. 在FCL中,有内置的Attribute.如: Condition[Attribute]:在什么条件可以调用.( ...

  10. Sprint第三个冲刺(第三天)

    一.Sprint介绍 任务进度: 二.Sprint周期 看板: 燃尽图: