ホームページ >バックエンド開発 >PHPチュートリアル >HHVMのPHP交換であるハックを見てください

HHVMのPHP交換であるハックを見てください

Christopher Nolan
Christopher Nolanオリジナル
2025-02-22 08:29:10314ブラウズ

A Look at Hack, the PHP Replacement in HHVM

HHVMのPHP交換であるハックを見てください

以前に作成したVagrantボックスを使用して、この記事からコードスニペットを実行できます。

キーテイクアウト

HHVMのPHP置換である
    ハックは、静的に型付けられた言語です。つまり、アプリケーション内のすべての変数にタイプを提供する必要があります。ただし、Hackは「Strict」モードでのみタイプが予想される「段階的なタイピング」システムを使用します。それでも、Hackはローカル変数タイプを推測するのに十分スマートです。
  • Hackは、Facebookの注釈の実装であるユーザー属性を含むPHPを改善するいくつかの機能を導入します。XHPは、XMLドキュメントフラグメントが有効なPHP式になるように言語の構文を増強するPHP拡張です。
  • ハックとHHVMの利点にもかかわらず、PECL拡張のサポートの欠如やHHVMがFacebookのみに支えられているという事実など、採用にはまだ障害があります。ただし、FacebookにはHHVMターゲットのPHP拡張機能を自動的にコンパイルできるツールがあり、HHVMの拡張機能を開発することは、PHPの開発よりも簡単です。
  • なぜタイプ?
  • 記事の最初の部分では、ハックが実際に静的にタイプされていることがわかりました。これは、アプリケーション内のすべての変数にタイプを提供する必要があることを意味します。リマインダーとして、PHPは動的にタイプされているため、機能引数にタイプヒントを使用できますが、変数を入力する必要はありません。
しかし、それはあなたがあなたのアプリケーションのすべての変数にタイプを提供しなければならないことを意味しますか?正確ではありません、そして私たちは詳細を見るつもりです。

Facebookのコードベースは、数億回のコードで構成されており、ハッキングに切り替える前にどこにでもタイプを追加することは本当の負担でした。したがって、「段階的なタイピング」が付属しています。ハックは、「厳格な」モードのみでタイプを期待しています。非ストリクトモードでは、それらが存在する場合にのみ考慮されます。

Strictモードの入力は、厳密なモードであっても、すべての変数に注釈を付ける必要はありません。これは、ハックがローカル変数タイプを推測するのに十分スマートであるためです。タイプの注釈は、クラスのプロパティ、関数引数、および戻り値にのみ必要です。そうでなければ、あなたのコードの理解に役立つ可能性がある場合は、ローカル変数に注釈を付けることをお勧めします。 例を見てみましょう:

このセクションのサンプルコードはwww/type-checker/index.phpにあり、ブラウザをhttp:// localhost:8080/type-checker/。

>>。

最初のエラーメッセージは驚くことではありません:add(1、 "a")を呼び出して、add()が整数であると予想されるため、エラーが生成されます。

2番目のエラーメッセージはより予想外です。Add_Array([1、 "a"])を呼び出すことでエラーは生成されません。実際には、エラーを生成するAdd_array()の内側に(1、 "a")を追加する呼び出しです! [1、 "a"]がエラーがトリガーされると予想できたはずです。

問題は、HHVMランタイムチェックがパフォーマンスに影響を与えないためにまばらであるということです。オブジェクトを繰り返しません。この時点で、おそらくハックタイプシステムの有用性に疑問を呈するでしょう!しかし、心配しないでください、簡単な答え、「タイプチェッカー」:前の例のものを含む任意のタイプの不一致をキャッチします。 HHVMリポジトリで探してはいけませんが、Facebookからまだリリースされていません。

タイプチェッカーは、変更のためにファイルを監視するサーバーとして実装されます。変更を検出するたびに、変更されたファイルをスキャンしてエラーの依存関係をスキャンします。エラーはリアルタイムで報告されるため、コードを実行する必要さえありません。 FBのスケールでも非常に速く動作するように設計されています。

今、あなたはタイプシステムがうまく機能することを確信すべきですが、利点は何ですか?開発者エラーをリアルタイムでキャッチし、より効率的なコードを作成することができます。PHPADD()関数は、最初に$ Aと$ B(つまり、文字列、null、…)のタイプをチェックする必要があります。追加を実行します。一方、上記のadd()関数は、アセンブリ言語で非常に高速な動作である2つの非ヌル整数を追加します(HHVM JITによって生成されます)。

開発者として、すでにPHPタイプのヒントとPHPDOCアノテーションを使用している場合、厳密なモードに切り替えることは簡単です。コードはより安全かつ高速になります。スクーチナイザーのような既存のQAツールの一部は、リアルタイムではありませんが、コードをチェックするためにタイプの推論をすでに使用していることに注意してください。

動的に型付けされた性質のためにPHPを主に使用する場合、おそらく非強制モードに固執したいと思うでしょう。

ユーザー属性

過去数年間、注釈の使用はPHPの世界で劇的に増加しました。注釈に精通していない人にとっては、クラス、インターフェイス、特性、変数、機能/方法に追加できるメタデータです。

教義ORMは、おそらく注釈を広範囲に使用した最初のPHPプロジェクトの1つです。以下は、教義のドキュメントからのモデル構成の例です。

PHPは、他の多くの言語とは異なり、注釈のサポートが組み込まれていません。ただし、Doctrine Annotation Libraryは、Docblocksからメタデータを抽出するために広く使用されています。 PHPでの注釈のための組み込みサポートを提案するRFCは、2011年に拒否されました。

ユーザー属性は、AnnotationsのFacebook実装です。それらは>に囲まれており、それらの構文は教義の注釈とは少し異なります:

<span><span><?hh // strict
</span></span><span>
</span><span><span>require "/vagrant/www/xhp/php-lib/init.php";
</span></span><span>
</span><span><span>// ...
</span></span><span>
</span><span><span>function add(int $a, int $b): int {
</span></span><span>    <span>return $a + $b;
</span></span><span><span>}
</span></span><span>
</span><span><span>// ERROR(calling "add()" on l.17) : Argument 2 passed to add() must be an
</span></span><span><span>// instance of int, string given
</span></span><span><span>echo <p>add(1, "a") = {add(1, "a")}</p>;
</span></span><span>
</span><span><span>// ERROR(calling "add()" on l.22) : Argument 2 passed to add() must be an
</span></span><span><span>// instance of int, string given
</span></span><span><span>function add_array(array<int> $a): int {
</span></span><span>    <span>return array_reduce($a, "add", 0);
</span></span><span><span>}
</span></span><span>
</span><span><span>echo <p>add_array([1, "a"]) = {add_array([1, "a"])}</p>;</span></span>

ユーザー属性は、当然のことながら、反射APIからアクセスされることに注意する必要があります。また、クラスのプロパティに注釈を付けるためのサポートはまだ実装されていることに注意してください。 このセクションのサンプルコードはwww/attributes/index.phpにあり、ブラウザをhttp:// localhost:8080/attributes/。

に向けて出力を見ることができます。

xhp

この記事の最初のコード例から使用しているように、今ではXHPが何であるかの前兆があるはずです。 Facebookを引用して、より完全な定義については、「XHPは、XMLドキュメントフラグメントが有効なPHP式になるように言語の構文を補強するPHP拡張機能です。」。 XHPはPHP拡張機能として利用可能であり、HHVMにはネイティブサポートがあることに注意してください。 {$ hello} を使用できます。前の例は些細なものですが、XHPにはもっと提供されています:

マークアップを検証して、無効なHTMLを記述できないようにします - 閉鎖タグを欠いている、パラメーター名のタイプミスを見逃していると考えてください。

ある程度のコンテキストエスケープを提供します。エンジンがあなたのレンダリングを認識しているため、XSS攻撃を防ぐためにHTMLと属性値を適切に逃れることができます。

既存のタグを拡張またはラップすることで、独自のタグを作成できます。

    例を見てみましょう:
  • このセクションの完全なサンプルコードはwww/hhxhp/index.phpにあり、ブラウザをhttp:// localhost:8080/hhxhp/。
  • > この例では、タグをレンダリングするカスタムタグを定義することから始めます。これは、クラス:tuto:examplesを宣言することによって行われます。私たちのカスタムタグには、例と現在の2つの属性が必要ですが、子供を持つことは許可されていません(子供は空です;)。
  • ベースを拡張しているので、x:要素、render()メソッドをオーバーライドして、カスタムマークアップをXHPとして返す必要があります。
  • Facebookは、XHP言語をUIライブラリの基礎として使用しており、最終的にはオープンソースになります。 非同期コード実行
HHVMリポジトリでいくつかのテストを見た後、非同期コードの実行に関するセクションを書く予定がありました。しかし、私は実用的な例を持っていませんでした。これは、トピックを少し理解していないことや、Facebookが関連するすべてのコードをまだリリースしていないという事実によるものかもしれません。 Facebookがいくつかのドキュメントをリリースしたら、これについて書くかもしれません。

その他の機能

<span><span><?php
</span></span><span><span>/** @Entity */
</span></span><span><span>class Message
</span></span><span><span>{
</span></span><span>    <span>/** @Column(type="integer") */
</span></span><span>    <span>private $id;
</span></span><span>    <span>/** @Column(length=140) */
</span></span><span>    <span>private $text;
</span></span><span>    <span>/** @Column(type="datetime", name="posted_at") */
</span></span><span>    <span>private $postedAt;
</span></span><span><span>}</span></span>
この記事でカバーされていないHHVMエコシステムについては、何を含めるかを選択しなければならなかったため、Facebookはまだすべてのコードとドキュメントをリリースしていないためです。

言及する価値があるいくつかのことは、FastCGIと統合デバッガーの最近のサポートです。

Facebookは、自動完了、構文の強調表示、共同編集などを特徴とするWebベースのIDEである「FBIDE」も紹介しています。後で利用できると予想されます。

外部ressources

この記事を準備するために使用したFacebookチームのいくつかの講演やスライドで詳細情報を見つけることができます。キース・アダムスからの「PHPを真剣に受け止める」講演を聞いて、ジュリアン・ヴェルラゲットからの別の素晴らしい講演を聞いて、ハックのことを初めて聞きました。 Sara Golemonの素敵なスライドも私には本当に役に立ちました。

結論

Facebookは、HHVMのPHPで機能パリティを提供することを約束しています。昨年末までに、HHVMは、最も人気のある20のPHPフレームワークの単体テストの98.5%をすでに合格することができました。それ以来、状況はわずかに改善されています

今日の時点で、HHVMは、より少ないメモリを消費しながら、PHPよりも速くPHPコードを実行します。これは、パリティが最終的に達成されたときに、HHVMを支持する上で大きな利点になります。それに加えて、タイプチェッカーの助けを借りてさらにパフォーマンスを獲得し、コードの安全性を向上させるためにハックの導入を開始できます。漸進的なタイピングとハックの事実のおかげで、コードベース全体を一度に変換する必要がないことを忘れないでくださいPHPは相互運用可能です。

今から数か月後、Facebookからより多くのドキュメントとツールが期待できます。 Githubでプロジェクトに貢献することで支援することもできます。

PHPコミュニティが報告した問題の1つは、おそらく採用の大きな障害であることです。PECL拡張のサポートがないことです。これを緩和するために、FacebookにはHHVMターゲットのPHP拡張機能を自動的にコンパイルできるツールがあります。ただし、成功率は100%からはほど遠いものです。ここで役立つもう1つのことは、HHVMの拡張機能を開発することは、PHPの開発よりもはるかに簡単であるということです。

HHVMがFacebookだけで裏付けられているという事実と、HHVMに貢献する前にCLAに署名する必要性は、他の人に厄介に思えます。

私は個人的に、かなりの量の競争がPHPの将来にとって素晴らしいことだと思います。

結論として、Facebookチームが彼らが行った素晴らしい仕事に感謝し、それをオープンソースにしたいと思います。将来のHHVMとハックに関するSitePointの記事をもっと見たい場合は、以下にコメントを追加することでトピックを提案することをheしないでください。 ハックPHP交換HHVM

に関するよくある質問(FAQ)

HACK PHP交換HHVMとは何ですか?

HACK PHP置換HHVMは、HIPHOP仮想マシンとしても知られており、ハックとPHPで書かれたプログラムを実行するために設計されたオープンソース仮想マシンです。 HHVMは、PHPが提供する開発の柔軟性を維持しながら、ジャストインタイム(JIT)コンピレーションアプローチを使用して優れたパフォーマンスを実現します。

HHVMは従来のPHPとどのように異なりますか?

HHVMは、その実行において従来のPHPとは異なります。 PHPは実行時にコードを解釈しますが、HHVMはPHPまたはハックコードを高レベルのバイトコードにコンパイルし、その後マシンコードに変換されます。このプロセスにより、パフォーマンスと効率が向上することができます。

ハッキングプログラミング言語は何ですか?

ハックは、Facebookが発明したHIPHOP仮想マシン(HHVM)のプログラミング言語です。これはPHPの方言であり、静的タイピング、タイプアノテーション、ジェネリックなどの新機能が含まれています。これらは従来のPHPでは利用できません。 PHPを改善するいくつかの機能。潜在的なランタイムエラーを防ぐことができる静的タイピングが含まれています。また、非同期プログラミングをサポートし、I/O操作のより効率的な取り扱いを可能にします。さらに、ハックには、高性能で強力なデータ構造であるコレクションが含まれています。 JITコンピレーションプロセスの性質により、いくつかの違いがあります。ただし、HHVMは「HHVM-Autoload」と呼ばれるツールを提供します。これは、既存のPHPコードをHHVMに移行するのに役立ちます。

HHVMはパフォーマンスをどのように改善しますか? -time(jit)コンピレーションアプローチ。これは、実行時にPHPコードを解釈する代わりに、HHVMがコードを高レベルのバイトコードにコンパイルし、その後マシンコードに変換されることを意味します。このプロセスにより、実行と効率の向上が可能になります。

HHVMなしでハッキングを使用できますか?

いいえ、ハックはHIPHOP仮想マシン(HHVM)専用に設計されたプログラミング言語です。したがって、ハックを使用するには、hHVMをインストールする必要があります。

ハックは静的に型付けの言語ですか?これは、変数のタイプがコンパイル時にチェックされ、潜在的なランタイムエラーを防ぐのに役立つことを意味します。 、静的タイピング、非同期プログラミング、コレクションを含む。これらの機能は、コードの安全性、効率、パフォーマンスを改善するのに役立ちます。

HHVMとハックの使用を開始するにはどうすればよいですか?

HHVMとハックの使用を開始するには、システムにHHVMをインストールする必要があります。インストールしたら、HHVMランタイムを使用してコードをハッキングして実行できます。また、いくつかのリソースとチュートリアルもオンラインで入手できます。

以上がHHVMのPHP交換であるハックを見てくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。