JPHPを使ってみた
はじめに
JavaVM上で動く言語は数ありますが(JRubyやJython)、PHP版もあったんですね。
ということで、触りだけやってみました。
れっつとらいチュートリアル
チュートリアル用のファイルは公式WikiかGithubから入手できます。
jphp-get-started.zipをダウンロードして解凍します。
解凍したディレクトリの中は次のような構成になっていると思います。
$ tree . ├── build.gradle ├── debug.conf ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src ├── Bootstrap.php └── JPHP-INF ├── .bootstrap.php └── launcher.conf
gradlewに実行権限付与
まずはgradlewに実行権限をつけてあげます。
gradlewはgradle等をインストールしていない環境であっても、
使えるようによしなにインストール等を行ってくれる親切な子です。
$ chmod +x gradlew
「こんにちは世界」
やっぱり最初はみんな大好き「Hello World」を出してみましょう。
と言ってもやることは簡単./gradlew run
これだけです。
チュートリアルではもろもろの準備は既に済ませてくれています。
$ ./gradlew run Downloading https://services.gradle.org/distributions/gradle-2.4-bin.zip ... Download https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.11/slf4j-api-1.7.11.jar Hello World! BUILD SUCCESSFUL Total time: 7 mins 14.523 secs
初回起動はパッケージインストールに少々時間がかかりますが、 無事世界に挨拶出来ました。
ざっくりの動き
build.gradle
JavaやAndroidではすっかりお馴染みのgradleさん。
... dependencies { compile 'org.develnext.jphp:jphp-core:0.8.+' // include jphp with runtime and compiler ... } run { mainClassName = 'php.runtime.launcher.Launcher' jvmArgs += ["-Dfile.encoding=UTF-8"] }
mainClassName
で基底のランチャークラスを指定しています。
(この他にもStandaloneLauncherというのがいます。)
.bootstrap.php
ランチャークラスはまずsrc/JPHP-INF/.bootstrap.php
が実行されます。
<?php Bootstrap::run();
中身はこのようになっており、Bootstrapクラスのクラス関数
が呼ばれているようです。
クラスファイル
デフォルトの設定では、phpのクラス群はsrc
ディレクトリ以下に設置していきます。
build.gradle内にファイル群をどこに置くのか設定しており、以下のように書かれているためです。
sourceSets { main.resources.srcDirs = ['src'] }
こちらで設定したソース以下のファイルは自動的にclasspathに追加され、利用することができます。
(namespace
は設定してあげる必要はあります)
上記を変更することで、任意の場所に変更できますが、特に問題も出ないと思いますのでそのままでも良いと思います。
先ほど出てきたBootstrapクラス
(Bootstrap.php)もsrc
ディレクトリの直下に設置されているため、
すぐに使うことができたわけですね。
その他、ディレクトリを掘ってクラスを起きたい場合は、以下のようにすることで普通に使えます。
例:src/TestDir/Test.php
(もうここはPHPですね)
<?php namespace TestDir; class Test { static function run() { echo "This is Test Class"; } }
先程も述べたとおり、これらのクラスは自動でclasspathに追加され、JavaVM上で動くコードに変換されます。
ですので、利用する際には、例えば.bootstrap.php
を以下のように行を追加するだけです。
<?php use TestDir\A; Bootstrap::run(); A::run(); #useを使うことも TestDir\B::run(); #直接classpath形式で指定することもモチロン可能
配布物をつくる
JPHPはJavaVM上で動くものを作るので、
配布物として生成されるものはやっぱりjarになります。
これを作るのにもgradleを利用します。
$ ./gradlew distZip
$ # または
$ ./gradlew distTar
生成物はbuild/distributions/
以下にzipまたはtarとして出力されます。
中にはbin
とlib
ディレクトリが作られており、
bin
ディレクトリ以下にあるスクリプトを実行することで、
生成物の実行を行うことができます。
他に出来ること
他にも、JPHPではWebサーバを立てる、GUIを扱う(Swing)、マルチスレッド、Androidアプリ開発などなど、
いろいろと出来るようです。
しかし、未だ対応できていない標準関数もあるようですので、そこには注意が必要そうですね。
おわりに
最近ではある言語を別の言語に変換して生成物を動かすことができる組み合わせが増えてきて、
ますます言語間の垣根がじんわり薄くなってきたように感じます。
便利になることはいいこと。良い開発ライフを満喫していきたいものですね。