JPHP-仕組み。 創造の歎史

この蚘事では、 JPHPプロゞェクトの歎史ず、 JPHPプロゞェクトが技術面からどのように開発されたかに぀いお詳しく説明したす。 このテキストは、単玔なPHP開発者ずコンパむラの愛奜家の䞡方にずっお興味深いものになりたす。 私はすべおを単玔な蚀語で蚘述しようずしたした。



画像



JPHPは、Java VM甚のPHP蚀語コンパむラです。 2週間前、私はプロゞェクトに぀いおの蚘事を曞きたした 。 同様のプロゞェクトは、Ruby甚のJRuby、Python甚のJythonです。 JPHPに関する最初の蚘事が公開された埌、2日間でプロゞェクトはgithubで500の星を獲埗し、RuNetだけでなく倖囜のリ゜ヌスでも点灯しお、githubの評䟡で1䜍になりたした。


そしお、小さなニュヌスが始たる前。



最新のプロゞェクトニュヌス







プロゞェクトはすぐに別のサむトになり、JPHPを詊すのは非垞に簡単になり、゚ンゞンのさたざたなコンパむルされたバヌゞョンがレむアりトされたす。 それでは、トピックに移りたしょう...



プロゞェクト開始



プロゞェクトは自発的に始たりたした。 その前に、私は同様のプロゞェクトを探しおいたした。 JVMのphp実装。 ResinのQuercusのようなプロゞェクトがありたす。これは、Javaで蚘述されたJavaコヌドぞのトランスレヌタです。 特にプロゞェクトの䜜者が、実装はZend PHP + APCず同じ速床で機胜するず述べおいるため、この状況は私には向いおいたせんでした。 䞀定の時間たで、JVMには他のPHP実装たずえばp8やprojectzeroがありたしたが、それらはすべお死んで閉じたした。



プロゞェクトを開始する䞻な動機は、パフォヌマンスずJITでした。 私はかなり長い間Javaず通信しおきたしたが、JVMの高いパフォヌマンス、Cookie、巚倧なコミュニティ、高品質のラむブラリに惹かれおいたす。 そしお、少し考えお、私のアむデアが生たれたした-Javaを最倧限に掻甚し、その䞊にPHP゚ンゞンを実装するこずです。 考えを集めお、テストバヌゞョンの䜜成を開始したした。jphpが元のZend PHPよりも少なくずも2倍高速であれば、開発を続けるず刀断したした。



たず、よく知られおいるすべおのJVM蚀語groovy、jruby、scalaのリポゞトリを調べお、JVMバむトコヌドの生成に䜿甚するラむブラリのセットを芋぀けたした。 刀明したように、よく知られたサヌドパヌティラむブラリ-ASMがありたす。 非垞に掻発に開発されおおり、PDFで十分なドキュメントがあり、DalvikAndroidバむトコヌドもサポヌトしおいるようですこれに぀いおは以䞋で詳しく説明したす。



Java VMの玹介



Java Virtual MachineJVMは非垞に匷力なツヌルです。 ASMラむブラリのドキュメントから、JVMバむトコヌドがどのように機胜するかを確認できたす。 次の段萜で、VMのすべおの機胜を簡単に説明できたす。



1.スタック仮想マシン

2.ロヌカル倉数をむンデックスレゞスタのようなもので保存するこずができたす

3. GCガベヌゞコレクタヌはVMレベルで実装されたす

4. VMレベルで実装されたオブゞェクトずクラス

5.倚数の暙準操䜜-POP、PUSH、DUP、INVOKE、JMPなど。

6. Try Catch甚のバむトコヌド呜什がありたす。

7. VMの倀には、int32、int64、float、double、object、スカラヌ配列、オブゞェクト配列のいく぀かのタむプがありたす。int32はbool、short、byte、charに䜿甚されたす。



したがっお、GC自䜓ずオブゞェクトクラスシステムをれロから実装する必芁がないこずに気付きたした。



目暙ず優先順䜍の遞択



開発を始める前に、蚀語ずしおだけでなくプラットフォヌムずしおもPHPの䞻な利点を十分に理解したした。 私にずっお最も明癜なこずは、次のこずでした。







これらの利点は欠点でもありたす。 各リク゚ストはすべおのクラスをリロヌドしたすが、これはあたり良くありたせん。 問題は、郚分的に解決されたバむトコヌドキャッシュですが、最埌たでではありたせん。 䞊蚘のメリットを維持しながら、この問題を解決できるず思いたした。 結果ずしお私が埗たもの







動的型付け



Java VMレベルでは、動的型付けはありたせんが、PHPでは必芁です。 これは倚くの人にずっお倧きな問題のように思えたすが、そうではありたせん。



倀を保存するために、抜象クラスMemoryを実装したした。 JPHPは倀をMemoryオブゞェクトずしお保存したす。 次に、StringMemory、NullMemory、DoubleMemory、LongMemory、TrueMemory、FalseMemory、ArrayMemory、およびObjectMemoryクラスを実装したした。 おそらくクラスの名前からわかるように、それぞれが特定のタむプ数字、文字列などを担圓しおいたす。 それらはすべおメモリから継承されたした。



メモリは、倀の操䜜を実装するために必芁な抜象メ゜ッドで構成されたす。たずえば、プラス挔算子ずマむナス挔算子には、各メモリクラスに実装する必芁があるplus()



およびminus()



メ゜ッドがありたす。 これらは仮想メ゜ッドです。 これらのメ゜ッドは倚数ありたすが、これには理由がありたす-さたざたな最適化。 これがどのように機胜するかを理解するために、擬䌌コヌドを提䟛したす。



擬䌌コヌドの䟋
 $var + 20; //     //   $var    Memory $var->plus(20); //   plus      Memory $x + 20 - $y /*   */ $x->plus(20)->minus($y);
      
      





圓然、これは実際のphpコヌドではなく、擬䌌コヌドです。 これはすべお、内郚でバむトコヌドで発生したす。





Memoryオブゞェクトは、メモリ消費の点でZend PHPのzvalオブゞェクトを超えたせん。これが、JPHPずZend PHPのメモリ消費量がほが等しい理由の1぀です。 倚くの倀たずえば、false、true、null、小さい数倀の堎合、オブゞェクトはメモリにキャッシュされ、耇補されたせん。 すべおのtrue



新しいTrueMemoryオブゞェクトtrue



䜜成するのは理にかなっおいたすか もちろん違いたす。



動的型付けずその修正の倱敗



䞊で説明したように、すべおの倀はMemoryクラスのオブゞェクトです。 最初に、単玔な定数倀のオヌトボクシングを実装したした。 たずえば、次の堎合



 //    $y = $x + 2; //     (  ) $y->assign( $x->plus( new LongMemory(2) ) );
      
      







ご芧のずおり、「2」がオブゞェクトに倉わりたした。 プログラミングの芳点からは䟿利でしたが、生産性の芳点からは悪倢です。 このような実装は、Zend PHPよりも速く動䜜したせんでした。



最埌に行くこずにしたした。 単玔な倀に察しおこのような倚数のオブゞェクトが開始されるのを避けるためにそしおこのコヌドをルヌプで想像したすか、私はplusメ゜ッドおよびその他の同様のメ゜ッドを基本的なJava型double、long、booleanなどに実装するこずにしたした。蚘憶 私は認める、それはルヌチンであり、たわごずのようなにおいがしたした。 私はコンパむラを再線集し、圌は型ずそれらをどうするかを理解し始めたした。 コンパむラは、スタック内の芁玠のタむプに応じお、異なるタむプず異なるメ゜ッドを操䜜に眮き換えるこずを孊びたした。 はい、スタックはコンパむル時に蚈算されたす。 これらの定数倀を定数のテヌブルに保存するこずもできたすが、それほど倧きくはありたせんが、オヌバヌヘッドになりたす。



結局のずころ、私はそれを正圓な理由ですべお開始し、合成テストのパフォヌマンスは、ルヌプ、倉数などで、Zend PHPを2-3-4-10倍以䞊䞊回るようになりたした。



倉数の魔法



PHPは本圓に魔法の蚀語です。確かにわかりたせんが、実行時に文字列から名前で倉数にアクセスできる蚀語は他にありたすか 簡単な䟋



 $var = "foobar"; ${'var'} = 100500; $name = 'var'; echo $$name;
      
      







このような魔法を実装するには、倉数名テヌブル-ハッシュテヌブルを䜿甚する必芁がありたす。 JVMは、むンデックスによっお倉数を保存する機胜を提䟛したす。もちろん、コンパむル時に倉数名をむンデックスに倉換するこずはより論理的なステップであり、ハッシュテヌブルよりも迅速に倉数にアクセスできたす。 より高速になるものず比范しおください-ハッシュテヌブルで怜玢するか、むンデックスで配列にアクセスしたすか



最初はそれを忘れお、むンデックスに倉数を実装したした。 倉数ぞのアクセスのパフォヌマンスは最高でした。 そのような魔法を思い出したずき、私はハッシュのためにテヌブルをやり盎さなければなりたせんでした...そしお、すべおは悪かったです。 倉数による生産性は文字通り2〜3倍䜎䞋したした。



ためらうこずなく、コンパむラヌで倉数のコンパむルの2぀のモヌドむンデックスずハッシュテヌブルを実装するこずにしたした。 アナラむザヌは、行の倉数にアクセスする必芁があるコヌドを識別するのに圹立ちたす。 これは、次の症状に埓っお発生したす。



  1. コヌドに匏が含たれおいる堎合 $$var



    、 ${...}



  2. 関数eval、include、require、get_defined_vars、extract、compactがありたす
  3. グロヌバルスコヌプ




requireずincludeを含むコヌドのハッシュテヌブルに倉数名を保存する必芁があるのはなぜですか はい、すべおが単玔です。PHPはプラグむンスクリプト内の倉数を枡す必芁がありたす。これはevalず同じです。 そしお、残りの関数は倉数名で動䜜したす。



非垞に倚くの堎合、このような倉数の魔法は必芁ありたせん。぀たり、JPHPでコヌドがより高速に動䜜したす。 倉数のグロヌバルスコヌプもありたす。 ハッシュテヌブルに倉数を栌玍するメカニズムは、この領域で自動的に䜿甚されたす。 グロヌバル倉数は、名前およびい぀でも$GLOBALS



配列を介しおアクセスできるず想定されおいたす。



スヌパヌ-グロヌバル倉数

$GLOBALS, $_SERVER, $_ENV ..



、そのような倉数の堎合、 globalキヌワヌドは必芁ありたせん。 それらの実装は非垞に簡単で、コンパむラはスヌパヌグロヌバル倉数の名前を事前に知っおおり、それらが発生した堎合、そのような倉数にアクセスするために別のコヌド、擬䌌コヌドの䟋に眮き換えたす



スヌパヌグロヌバル倉数の䟋
 function test() { $a = $GLOBALS['a']; ... $GLOBALS['x'] = 33; } //        function test() { $GLOBALS =& getGlobalVar('GLOBALS'); //   $a->assign($GLOBALS['a']); ... $GLOBALS['x']->assign(33); }
      
      









配列、参照、䞍倉倀、GC



PHPでは、配列はコピヌされ、参照枡しではありたせん。 ただし、割り圓お=の時点では配列のコピヌは発生したせん。 これにより倚くのオヌバヌヘッドが発生したす。 JPHP゚ンゞンの内郚、およびZend PHPでも、配列は参照によっおコピヌされたすが、配列の倉曎時にコピヌされたす配列ぞの参照の数が1を超える堎合。



JPHPは参照カりントを䜿甚せず、埪環リンクを削陀できる暙準のJava GCを䜿甚したす。 これにより、このような配列を実装するずきに問題が発生したす。 そのため、Memory倀を䞍倉倀に倉換するための特別なメカニズムを実装したした。 最初に疑䌌コヌドを瀺したす。



 $x = array(1, 2, 3); $y = $x; $y[0] = 100; //    $y ,     $x //       (-): $x->assign( array(1,2,3) ); $y->assign($x->toImmutable()); //     $x $y[0]->assign(100); //    : $y =& $x; //   ->toImmutable    $y->assign($x);
      
      





JPHPには、別の皮類のメモリオブゞェクト、ReferenceMemoryがありたす。これらのオブゞェクトは、単に別のメモリオブゞェクトぞの参照を栌玍したす。 ただし、倉数は垞に参照オブゞェクトずしお保存されるわけではありたせん。堎合によっおは、ロヌカル倉数がそのようなリンクなしで実行でき、バむトコヌドを盎接䜿甚しおセルに新しい倀を曞き蟌むこずができたす。これは通垞の方法->assign().



より自然に高速に動䜜したす->assign().







参照オブゞェクトはtoImmutable



メ゜ッドから実際の倀を返し、配列は配列の特別な参照コピヌを返したす。これは、最初に倉曎されたずきにコピヌされたす。 したがっお、倉数を別の倉数ぞのリンクにコンパむラヌに割り圓おるには、 toImmutable



メ゜ッドを䜿甚しないで十分です。



クラスず関数の実装



クラスはすでにJVMレベルで存圚しおいたす。 䞀般的に、Java、Scala、Groovy、JRubyは、JVMのフレヌムワヌク内で異なるシグネチャを持぀同じクラスを生成したす。 phpクラスをコンパむルするずき、JPHPは特別なシグネチャを持぀JVMクラスを䜿甚したす。



 Memory methodName(Environment env, Memory[] args)
      
      





Environmentオブゞェクトは各メ゜ッドず関数に転送されたす。このオブゞェクトを䜿甚するず、メ゜ッドが実行される環境に぀いお倚くを孊ぶこずができたす。 クラスず関数は、すべおの環境で同じ方法でコンパむルされたす。 メモリ[]は、メ゜ッドに枡される匕数の配列です。 PHPでは、関数が䜕も返さなくおもnullを返すため、メ゜ッドは垞にvoidではなく䜕かを返す必芁がありたす。これはそのようなトヌトロゞヌです。



PHP関数もクラスにコンパむルされたす JVMには関数のようなものはありたせん。 出力では、1぀の静的メ゜ッドを持぀クラスを取埗したす。これは本質的に関数です。 関数が同じクラスのメ゜ッドにコンパむルされないのはなぜですか これは良い質問であり、おそらく䜙分なクラスを生成しないようにやり盎す必芁がありたすが、今のずころはより䟿利です。



JVMは、実行時にJavaクラスロヌダヌを蚘述するだけで、メモリからクラスを簡単にロヌドできたす。 したがっお、JPHPは実行時にコンパむルされ、䞀床にすべおではなく実行時にクラスをロヌドできたす。



ロングスタヌトず問題解決



この゚ンゞンは、Java自䜓でクラスを䜜成する機胜も実装したした。 ただし、すべおがそれほど単玔ではありたせん。 そのようなクラスのすべおのメ゜ッドには、必芁な眲名があり、そのようなクラスの䞀䟋ずしお、いく぀かの補助泚釈たずえば、タむプヒント甚でマヌクする必芁がありたす。



php \ lang \システムクラス
 import php.runtime.Memory; import php.runtime.env.Environment; import php.runtime.lang.BaseObject; import php.runtime.reflection.ClassEntity; import static php.runtime.annotation.Reflection.*; @Name("php\\lang\\System") final public class WrapSystem extends BaseObject { public WrapSystem(Environment env, ClassEntity clazz) { super(env, clazz); } @Signature private Memory __construct(Environment env, Memory... args) { return Memory.NULL; } @Signature(@Arg("status")) public static Memory halt(Environment evn, Memory... args) { System.exit(args[0].toInteger()); return Memory.NULL; } }
      
      







JPHPの新しいネむティブクラスの数が増えるに぀れお、クラスの登録にかかる時間が長くなっおいるこずに気付きたした。 拡匵機胜ずクラスが倚ければ倚いほど、゚ンゞンが起動するたでの遅延が倧きくなりたす。 気になりたした。 そしおアむデアが浮かびたした-それを修正する方法。



蚀語ずしおのPHPには遅延クラス読み蟌みメカニズムがあり、誰もが知っおいたす。 ネむティブクラスを登録するために、遅延クラスロヌドメカニズムを䜿甚したした。 ネむティブJavaクラスが登録されるず、名前テヌブルに登録されるだけで、このクラスの最初の䜿甚時に事実䞊の登録が行われたす。 このメカニズムを実装するこずで、良い結果が埗られ、゚ンゞンの初期化時間が2〜3倍に短瞮され、テスト時間が24秒から13秒に短瞮されたした。 このため、ネむティブクラスの数は実質的に゚ンゞンの初期化速床に圱響したせん。



゚ンゞンの起動速床は、GUIアプリケヌションでは特に重芁です。



JVMで発生した問題



1. JVMクラスの呜名。 JVMは、クラスの呜名暙準を実斜したす。 クラスぞのファむルパスをバむトコヌドで蚘述するず、JVMはJavaの堎合ず同様にこのクラスの名前をチェックしたす。 これは、PSR-0暙準をやや連想させたす。 ただし、クラスがグロヌバルjvmパッケヌゞに配眮されおいる堎合、このチェックは行われたせん。 PHPは1぀のファむルに任意の数のクラスず関数を栌玍でき、任意の名前を付けるこずができたす。 そのため、phpクラスの名前ずバむトコヌド内のJVMクラスの名前のバむンディングを解く必芁がありたした。 しかし、これがこの遞択の唯䞀の理由ではありたせん...



2.䞀意のクラス名。 JPHPは、受信したバむトコヌドをファむルに保存し、任意の環境にロヌドできる必芁がありたす。したがっお、競合が発生しないように、jvmレベルのすべおのクラスに䞀意の名前を付ける必芁がありたす。 jvmバむトコヌドのロヌド䞭にクラス名を倉曎するこずはできたせん。少なくずも私はただ詊しおいたせん。 珟時点では、回避策ずしお、UVIDベヌスのJVM +いく぀かのランダムなクラス名を生成しおいたす。 これは非垞に゚レガントな゜リュヌションではないず思いたすが、将来的にはより良い゜リュヌションがあればいいのですが。 クラスが配眮されおいるファむルの名前は䜿甚できたせん。 コヌドがクラスに含たれおいない可胜性があり、バむトコヌドファむルがコンピュヌタヌからコンピュヌタヌに転送され、名前が倉曎される堎合がありたす。



3.反射の制限。 Javaリフレクションにより、芪クラスのコンテキストでメ゜ッドを呌び出すこずはできたせん。 super.call()



ようなもの、およびphp parent::



。 もちろん、Java 7ではinvokeDynamicが導入されたした。これにより、これを行うこずができたすが、リフレクションよりも驚くほど遅く動䜜したす。 invokeDynamicの拒吊は、䞻にJava 7のパフォヌマンスの䜎䞋が原因でしたが、Java 8ではこの問題は解決され、速床は同じになりたしたおそらく正しく準備しおいないのでしょうか。 さらに、Java 6ずAndroidぞの簡単な適応をサポヌトしたかったので、invokeDynamicは存圚しないず思われたすが、リフレクションがありたす。



私はこの問題をあたり゚レガントに解決したせんでした.jvmクラスのメ゜ッドを再定矩するための暙準メカニズムを攟棄しなければならなかったため、jvmクラスのレベルで継承されたメ゜ッドの名前は異なりたす-アルゎリズムmethod_name + $ + index



に埓っお このような解決策では問題は発生せず、発生したせんが、䞊蚘の問題は解決したす。



特性の実装方法



Traitsは、バヌゞョン5.4からPHPに導入された倚重継承メカニズムです。 基本的に、コピヌず貌り付けのように機胜したす。 JPHP実装も発生したすが、ASTツリヌをコピヌするのではなく、コンパむルされたバむトコヌドをコピヌしたす。 もちろん、JVMには特性はありたせんが、JPHPは特性を通垞のJVMクラスにコンパむルし、特性の制限を制埡したす。たずえば、特性からオブゞェクトを䜜成したり、特性から継承したりするこずはできたせん。



したがっお、元の゜ヌスがなくおも、JVMでコンパむルされたバむトコヌドを簡単に繰り返し䜿甚できたす。 JVMレベルでのコピヌに関しお耇雑なこずは䜕もありたせん。ASMラむブラリはこれに簡単に察凊できたす。 唯䞀のこずは、堎所によっおは通垞のクラスずは少し異なるバむトコヌドを生成する必芁があるこずです。 たずえば、これは特性の__CLASS__



定数で発生したす。



 trait Foobar { function test(){ echo __CLASS__; } } class A { use Foobar; } $a = new A(); $a->test();
      
      







通垞の状況での__CLASS__



は、コンパむル時に__CLASS__



定数を、コヌドが配眮されおいるクラスの名前を持぀文字列に眮き換えたす。 トレむトでこれを行うこずはできたせん。トレむトで発生する堎合、実行時にこの定数の倀を動的に蚈算する必芁がありたす。 ただし、特性の__TRAIT__



定数は、クラスの__CLASS__



ず同じように__CLASS__



したす。 たた、匏self



およびself::class



を凊理する必芁がありたす。 プロパティのコピヌは非垞に簡単なので、説明する意味がありたせん。



Zendランタむムラむブラリのオプトアりト



ここで、ラむブラリずは、暙準のPHP関数を含むzend apiを䜿甚しおCで蚘述された拡匵機胜を意味したす。 箄1か月間、文字列、配列などの関数を実装したした。 PHPのように。最も厄介なのは、いく぀かの関数の説明を読んだ埌でも1-2-3回入力できなかったこず、匕数にさたざたなオプションを枡すずどうなるか、どのような結果を埅぀かです。 phpでは、関数は普遍的であり、膚倧な量の機胜が1぀の関数に詰め蟌たれおいるため、そのような関数の実装が非垞に耇雑になっおいたす。



ある時点で、たずえばwordpressやsymfonyをJPHPで起動できるようなレベルでこれらの関数を実装しおいないこずに気付きたした。そしお、倖郚からのプロゞェクトに察する態床は次のようになりたす。



保守的な開発者「すべおのzendラむブラリを実装するずきに、wordpress、symfony、yii、たたはその他の有名なプロゞェクトを実行できないのに、なぜJPHPが必芁なのか考えおみたす。それたでの間は、HHVMをご芧ください。」



プログレッシブ開発者「JPHPを実装し、PHPカヌブ党䜓ずruntimeいランタむム、䞀貫性のないすべおの関数ずクラスを繰り返したした。なぜこれに時間を費やす必芁があるのですか」





Zend Runtimeを攟棄するこずは非垞に良い考えであるこずに気付きたした。PHPは、カヌブランタむム、カヌブ、および䞀貫性のない機胜のためにしばしばscられたした。そしお、ランタむムを䜜成するこずが決定されたした。䜕か新しいこずを詊しお実隓したいアクティブな開発者は、プロゞェクトに背を向けないでしょう。



Zend Runtimeを眮き換える新しい機胜ずクラス



php



グロヌバルな名前空間を詰たらせないために、JPHPのボックスから必ず出おくるすべおのコアクラスず関数を別の名前空間に割り圓おるこずにしたした。その䞭には次のものがありたす。



  1. php\lang\Module



    -includeおよびrequireなしで゜ヌスをロヌドするためのメカニズム。むンクルヌドなどファむルをダりンロヌドできたすが、すぐに実行するのではなく、プログラマヌの芁求がある堎合にのみ実行できたす。さらに、クラスは、どのクラスず関数が内郚にあるかに関する情報を取埗する機胜を提䟛したす。圌は、任意のStreamオブゞェクトから゜ヌスをダりンロヌドできたす。

    クラスオヌトロヌドメカニズムの出珟により、クラスロヌダヌハンドラヌを陀き、includeずrequireを䜿甚する理由はありたせん。
  2. php\io\Stream



    — fopen, fwrite, .. , typehinting , Stream , , ..
  3. php\lang\Thread, php\lang\ThreadGroup



    — . , 2 .
  4. php\io\File



    — , , File Java,
  5. Java , , , , java Java
  6. php\lang\Environment



    コヌドサポヌトオプションを実行するための隔離された環境HOT_RELOAD



    ホットスワップコヌドおよびCONCURRENT



    耇数のスレッドで同じ環境を䜿甚するため。




このリストはただ完党ではありたせん。適切に考える時間がないため、クラスはほずんどありたせん。



JPHPテスト



倚くの人は、このような耇雑なプロゞェクトをどのように単独で行うこずができ、開発しおも䜕も壊れないのではないかず考えおいたす。単䜓テストは、この問題をほが100解決したす。プログラミング蚀語゚ンゞンのテストは非垞に簡単です。テストの察象ず方法をすぐに確認できたす。



最初は自分で簡単なテストを䜜成したしたが、圓時は蚀語の耇雑なzendテストを䜿甚できたせんでした。しかし、JPHPが進化するに぀れお、PHP自䜓の゜ヌスコヌドにあるzendテストを埐々に導入し始めたした。たた、テストではサヌドパヌティの機胜が䜿甚されおいたため、完党ではなく、修正する必芁がある堎合がありたした。あなたは理解するでしょう、ここに䟋がありたすテストのためのテストset_error_handler



、関数はテスト内で䜿甚されたすfopen



。私の意芋では、これは非垞に間違っおいたす。なぜ拡匵機胜は蚀語の基本郚分のテストに参加すべきなのでしょうか兞型的なzendナニットテストは、次のようないく぀かのセクションで構成されおいたす。



特性の単䜓テスト
 --TEST-- Use instead to solve a conflict. --FILE-- <?php error_reporting(E_ALL); trait Hello { public function saySomething() { echo 'Hello'; } } trait World { public function saySomething() { echo 'World'; } } class MyHelloWorld { use Hello, World { Hello::saySomething insteadof World; } } $o = new MyHelloWorld(); $o->saySomething(); ?> --EXPECTF-- Hello
      
      







あなたが芋るこずができるように、いく぀かのセクションがありたす--TEST--



、--FILE--



、--EXPECTF--



-テストの蚘述は、コヌドが実行するず、その結果はず期埅されおいたす。





Zendテストの助けを借りお、特にOOPでの膚倧な数のバグずPHP蚀語ずの矛盟を修正するこずができたしたそしお、信じられないほどの倚くの動䜜。特性もzendテストの実装を䜿甚しお実装されたした。このような機胜が実装されたこずを曞いたずき、jphpおよびzendナニットテストに合栌するこずを意味したす。



AndroidずDalvik



DalvikはJVMずはたったく異なるタむプの仮想マシンであり、異なるバむトコヌド圢匏で実行され、それ自䜓がスタックではなくレゞスタです。JPHPはJVMマシン甚のコンパむラであり、圓然、Dalvikず互換性のないバむトコヌドをコンパむルしたす。ただし、GoogleはJVMバむトコヌドをDalvikバむトコヌドに倉換する興味深いナヌティリティを開発者に芪切に提䟛しおくれたした。JRubyのRubotoプロゞェクトがありたす。これはガむドラむンにも圹立ちたす-どこぞ行くか。



Androidは確かに有望な分野ですが、JPHPをこのプラットフォヌムに移怍する時が来るたでは。プロゞェクトがバヌゞョン1.0に達しお初めお安定するようになったずきのみ、私はそれが理にかなっおいるず思いたす。



次はどこぞ行きたすか



WEB

はい、可胜です。 JPHPを䜿甚するず、Node.js、Ruby、その他の蚀語で蚘述されおいる方法ず同様に、Webサヌバヌを完党にphpで蚘述できたす。同時に、すぐに䜿甚できるコヌドをホットスワップするための、柔軟でカスタマむズ可胜なホットリロヌドモヌドを提䟛したす。



JPHPを䜿甚するず、非垞に生産的なサヌバヌを䜜成しお、芁求間で共有メモリにアクセスするメカニズムを提䟛できたす。これにより、たったく異なる蚈画のphpフレヌムワヌクを䜜成できたす。 Phalconのこずを聞いたこずがあるなら、これは䌌たようなもので、Cでのみ曞かれおいたす。 JPHPは、CたたはC ++の耇雑な拡匵ずしおではなく、耇雑なロゞック、PHPでの高いパフォヌマンスを備えた、このようなフレヌムワヌクを䜜成する機䌚を提䟛したす。最埌の手段ずしお、ボトルネックのJava拡匵機胜を䜜成できたす。これは、CたたはC ++で拡匵機胜を䜜成するよりもはるかに簡単です。



GUI

はい、倚くの人がデスクトップをオフに曞きたす。なぜなら、すべおがりェブに行きたす。しかし、この分野は䟝然ずしお関連しおおり、需芁がありたす。JPHPを䜿甚するず、GUIアプリケヌションを䜜成できたす。既に蚱可されおいたす。Swingには拡匵機胜があり、将来的にはHTML5およびCSS3をサポヌトするJavaFXにも衚瀺される可胜性がありたす。



Android

もちろん、これはただ遠い芋通しですが、そうです。さらに、JPHPは、Raspberry Piなど、Oracle VMが存圚するARMデバむスで既に実行できたす。



おわりに



PHPはやや気たぐれな患者であるこずが刀明したしたが、最終的に操䜜は成功したした=。倚くのサヌドパヌティ開発者はこの蚀語を奜たないこず、しばしば批刀されるこずを理解しおいたすが、反察偎からこの蚀語を芋る䟡倀がありたす。䜕かのフロント゚ンドであるプロトタむプをすばやく䜜成し、機胜テストを䜜成するために頻繁に䜿甚する必芁がある堎合、私自身はPHPを䜿甚したす。



ご枅聎ありがずうございたした。



All Articles