FacebookがPHPコードをC ++に変換するのはなぜですか?[閉まっている]


42

FacebookはPHPで始まり、速度を上げるために、PHPをC ++コードとしてコンパイルするようになりました。もしそうなら、なぜそうしないのですか:

  1. C ++でプログラムするだけですか?PHPをc ++コードに移植する魔法のコンパイラボタンを押すと、間違いなくいくつかのエラー/バグがあるはずですよね?

  2. この印象的なコンバーターが非常にうまく機能するのであれば、なぜPHPにこだわるのでしょうか?RubyやPythonなどを使用しないのはなぜですか?注-これら2つをランダムに選択しましたが、ほとんどのがこれらの言語でのコーディングは「喜び」と言っているためです。それでは、なぜ素晴らしい言語で開発してから、魔法のc ++コンパイルボタンを押してみませんか?


12
どちらの選択肢も、すべてのPHPコード、PHP固有のツールと専門知識、サポートインフラストラクチャの半分など、すでに存在し、ゼロから始めることを意味します。

どうして?コードをC ++に変換できれば、誰でも自分の好きな言語を使用し、変換ボタンを押して、C ++コードベースにコミットさせることができます。番号?
user72245

7
いいえ。コンパイラは、概して、動作するがbutく不自然なコードを生成し、あらゆる種類の抽象化は言うまでもなく、変数名、コメントなどを取り除きます。かなりの程度まで、これは避けられません。別の言語で保守可能なコードベースに実際に翻訳することを目的とするプロジェクトがいくつかありますが、特に広く異なる言語では、問題ははるかに困難です。また、完全に慣用的なC ++が出てくると仮定しても、コードベースで作業している全員がC ++を学ぶか、解雇されてC ++を知っている人々に置き換えられなければなりません。そして、あなたはまだツールに対処していません。

1
また、(私は自分でこれを発見しましたが、私の直感と他の動的言語実装の経験と一致しています)、PHP-to-C ++コンパイラが段階的に廃止され、バイトコードインタープリター+ HHVMと呼ばれるJITに置き換えられていることに注意してください(後で同じ傘プロジェクトの一部として開発されました)これは、それよりもはるかに優れており、制限が少なくなっています。github.com/facebook/hiphop-php/wiki

@Delnan:悪いコンパイラはく不自然なコードを生成します。しかし、それはほとんど避けられません。見ていスマート JavaScriptにコンパイルダウン、。もちろん、難読化や縮小化をオンにしない限り、出力は非常に読みやすくなります。 <snark>(JS限りにおいては、これまでである、「読みやすい」と呼ぶことができる。)</snark>
メイソンウィーラー

回答:


65

彼らはしません。少なくとも、そうではありません。そのようにすると、デプロイメントの頭痛やそもそもスクリプト言語を使用することの主要な利点の1つである再コンパイルを必要とせずにスクリプトを変更できるため、HipHopシステムを刷新するなど、非常に多くの問題が発生します透過的なJITフェーズを備えたVMアーキテクチャ、およびC ++コンパイラの廃止。

興味深いことに、この方法で実行すると、元のC ++トランスコンパイルアプローチの約2倍の速度(パフォーマンス)になります。


4
これから得られるのは、Facebookがビジネスニーズと開発者の能力のバランスをとるのが難しいということです。興味深いことに、ネイティブのJITソリューションよりもJITソリューションの方がパフォーマンスが向上するということは、PHP-> C ++のjiggerypokeryが実際にはズボンだったということです。
ジェームズ

7
@James「HipHopc」は史上最高の最適化コンパイラーではなかったと思いますが、その特定の結果はコンパイラーを書くのが面倒くさいことを示しているわけではありません。最適化コンパイラの作成方法を確実に知っている人々によって、これは繰り返し真実であることが判明しました。JITコンパイラーは、豊富な最適化を簡単に実行できます。AOTコンパイラ(非常に高価なプログラム全体の分析なし)は、実際に動的性を削除することなく、解釈自体のオーバーヘッドを削除する以上のことはほとんどありません。

2
@delnanええ、はい、AOTコンパイラーの全体のポイント(分析に多くの時間を費やしている)を指摘してAOTコンパイラー(プログラム全体の分析)の主な利点を損なう場合、確かに、それは比較されませんJITが得意なことを行うJITに(迅速なピークホール最適化)。しかし、それはほとんど公平ではありません。
アリス14年

2
@delnanこれは単に真実ではない、または少なくとも知的に不正です。JITは、AOTと比較して最適化を行うための時間が非常に限られています。Javaはレジスターアロケーターに関する論文を書きました。これは理想的ではありませんが、JITの使用には十分な速さです。SSAを使用すると、ほとんどのJITが追いつくのに苦労する膨大な量の最適化を無料で行うことができます。AOTは実績のある型推論アルゴリズム(Hindley–MilnerおよびアルゴリズムW)を使用できますが、これは複雑ではありませんが、JITは絶対に無料ではなく、メモリの観点からコストを支払います。JITはいくつかの最適化をよりうまく行うことができ、AOTもできます。
アリス14年

1
@アリス私たちは非常に動的な言語について話している。PythonやJavaScriptなどの言語用の単純で効果的なAOT(静的)型推論アルゴリズムはありません。複雑なオンライン/ランタイムアルゴリズム(たとえばSpiderMonkeyで使用されている)が有効であり、複雑なAOTアルゴリズム(例:Starkiller)が有効であることが証明されていません。アルゴリズムWは、動的言語の複雑さにも対処し始めません。

34

FacebookのシニアエンジニアHaiping Zhaoは、おそらくあなたの質問に最もよく答えます

  1. HipHopはプログラムでPHPソースコードを高度に最適化されたC ++に変換し、g ++を使用してコンパイルします。HipHopは、意味的に同等の方法でソースコードを実行し、パフォーマンスの向上と引き換えに、eval()などのほとんど使用されない機能を犠牲にします。

  2. これらの非効率性に対処する一般的な方法の1つは、PHPアプリケーションのより複雑な部分をC ++でPHP拡張機能として直接書き換えることです。これにより、PHPがフロントエンドHTMLとC ++のアプリケーションロジックの間のグルー言語に大きく変わります。技術的な観点からは、これはうまく機能しますが、アプリケーション全体で作業できるエンジニアの数を大幅に減らします。

ブログ投稿の残りの部分は読みやすいので、お勧めします。Facebookが対処するプログラミングの課題と、それらがこれらの問題にどのように対処しようとしているのかについての洞察を提供します。


7
これは廃止されていることに注意してください。それは彼らの最初の試みでしたが、Facebookはもはやこのようにしません。以下の私の答えをご覧ください。
メイソンウィーラー

@MasonWheeler-素晴らしいリンクとアップデート。

19

C ++でプログラムするだけですか?PHPをc ++コードに移植する魔法のコンパイラボタンを押すと、間違いなくいくつかのエラー/バグがあるはずですよね?

しかし、C ++でのプログラミングでは、既存のコードベース全体を置き換える必要があります。これは、まったく馬鹿で破壊的なことで世界的に有名です。

この印象的なコンバーターが非常にうまく機能するのであれば、なぜPHPにこだわるのでしょうか?RubyやPythonなどを使用しないのはなぜですか?注-これら2つをランダムに選択しましたが、ほとんどの人がこれらの言語でのコーディングは「喜び」だと言っているためです。それでは、なぜ素晴らしい言語で開発してから、魔法のc ++コンパイルボタンを押してみませんか?

繰り返しますが、既存のPHPコードベースを置き換える必要があるためです。

理想的な世界では、彼らは単にC ++でゼロからコーディングします。残念ながら、PHPには既存のコードが大量にあるため、それは不可能です。代わりに、彼らは問題を回避します。ずっと安いです。


2
+1:「その代わりに、彼らは問題を回避します。それははるかに安いです。」本当です-3500人のエンジニアが製品に取り組んでいる場合、エンジニアリングチーム全体が6年分のコードを書き直すよりも、優れたPHP-> C ++コンパイラの作成に専念する5〜50人の小さなチームを獲得する方が安価です。 。
スマン

すみません、私は混乱しています。なぜ彼らはそれ書き換えなければならないのでしょうか。あなたは自分で言ったばかりです-HipHopはすべてのコードをC ++に変換します。それを変換して、C ++に固執するだけです。
user72245

16
@ user72245 C ++に変換するからといって、読み取り可能または保守可能なC ++に変換するわけではありません
-Mr.Mindor

これはなぜthey hack around the problemですか?C ++またはアセンブリを使用したコードの最適化はまったく新しいものではなく、PCが登場する前から最適化を行っています。
スティーブ

FacebookプログラマーはPHPプログラマーであることも念頭に置いてください。確かにC ++に変換してC ++でプログラミングを開始できますが、既存のプログラマーはこの言語の経験がありません。開発を継続するには、それらを再訓練するか、新しいプログラマを雇う必要があります。
ギャビンコーツ

8

「実際、C ++コードは最終的に機械語命令に変換されるので、アセンブリで直接動作しないのはなぜですか?」

–それは、本質的には、議論が縮小するものです。そして、うまくいけば、なぜそうしないのかが明らかになるでしょう:

  • アセンブリ(C ++)でプログラミングするには、C ++(PHP)よりも(非常に!)異なるスキルセットが必要です。
  • さまざまな理由で、プログラミングがはるかに難しい可能性があります
  • アセンブラー/コンパイラーによって生成されたコード、最初からアセンブリー(C ++)で読み取り可能なプログラムを作成できる場合でも、人間が読み取れない(話す:保守可能)場合あります。

2
私はかつて、1970年代に考案されたアセンブリで書かれた保険申請書を維持しました。10月に、「Happy Holidays」に相当する「手紙」の挨拶を変更するように依頼されました。複雑なため、翌年の2月に完成しました。数千行を超えない限り、アセンブリに非常に精通し、最適なコードを書くことができました。しかし、COBOLコンパイラとCコンパイラは、特に100万行を超えるアセンブリのシステムで、実行中のプラットフォームに最適なコードを生成してくれました。それはビジネスに意味がありません。
bloudraak

5

私はFacebookにいるわけではありませんが、動機に対する私の最善の推測は「重大なリスクを回避する」ことです。この時点で、異なる言語への切り替えはもはや技術的な決定ではありません。何よりも、ビジネス上の決定です。

組織的にFBの規模にまで成長した大企業の場合、プログラミングプラットフォーム(FBの場合はPHP)の専門知識を習得する人々を徐々に惹きつけます。PHPの専門知識を備えた数千人の従業員を1人ずつ取得します。この時点で、他の言語への切り替えは非常に危険になります:エンジニアは新しいエコシステムに追いつくことができず、スキルの向上は言うまでもなく、現在の仕事で要求されるレベルの専門知識を達成するのにかなりの時間が必要になる場合があります。

PHPと代替言語の相対的なメリットを別にすれば、FBがPHPテクノロジーに投資した投資額を考えれば、スイッチを試しても痛みがなく愚かすぎると考えるのは慢すぎるでしょう。ビジネスでは、テクノロジーは目的を達成するための手段であるため、プログラミングの「喜び」は議論にさえ入らない。


4

C ++で実装された主要なWebサイトは1つしか考えられません。H2G2

その場合でも、現在の実装は実際には多数のテキストおよびデータベース操作関数が組み込まれたインタープリターです(少し初期のPHPのようには聞こえません:-))。

FacebookはWebサイトの機能に非常に満足しています。彼らは、PHPが処理するボリュームをバニラPHPがサポートできない程度まで成長しました。したがって、PHPをC ++のマシンコードにコンパイルします。PHP用の完全なコンパイラを作成できたかもしれませんが、gccコンパイラスタックに組み込まれた20年間の微妙な最適化を逃していたでしょう。重要なのは、「C ++」コードは人間が読めるようにしたり保守したりすることを意図したものではなく、コードを機械化するための途中段階にすぎないということです。

このサイトの多くのプログラマーのように、既存のアプリケーションに組み込まれたビジネスロジックと機能に投資する作業量を過小評価し、コード自体を評価していると感じています。


WTが成功した今、私は数十を考えることができます。
アリス14年

@アリス-面白い!しかし、大規模なサイトでこれを使用している人を見つけることができません。さらに、hello world 30のコード行が5行のPHPコードを実行します。
ジェームズアンダーソン14年

「hello world」の例を比較するのは、とんでもないことです。100行未満で、WebSocket対応、ロングポーリングフォールバック、最適なSEOを備えた段階的に強化されたウィジェット、AJAXを使用したフルページロードなしの自動クリーンURL、および小さなCPU / RAMフットプリントを設定できます。PHPは、少なくとも典型的な構成では、websocket、ロングポーリング、ヘルプなしでURLをクリーンアップ、AJAXを使用してURLをクリーンアップできず、間違いなく膨大な(比較的)量のRAM / CPUを使用します。単純な例ではなくwebappの場合、WTとC ++は劇的に優れており、C ++ 11では長さが同等です。
アリス14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.