Elixir、Erlang、FP、およびOOPに関するJoe Armstrong

過去数日で、Habréにいくつかの記事が公開されましたが、その一般的なライトモチーフ(特にコメント)は、PLOに対するFPの支持者である鈍い人と先の尖った人との対立でしたが、主張しないように促されました。 Erlangは時々議論されましたが、それに関連して、2018年の終わりに言語パラダイムに関する質問に答えて彼がElixirフォーラムで書いた、この言語の作成者の1人であるJoe Armstrongからのトピックに関する短い投稿を思い出しました。 彼のコメントは面白いと思う。







ジョーアームストロング2018年9月12日



Elixir(およびErlang)の優れた点はすべて、並行処理に関連しています。独立したプロセスとメッセージングを作成するだけです。 Alan Kayが繰り返し指摘しているように、これはまさにオブジェクト指向プログラミングの本質です。







OOPはオブジェクト専用です。 オブジェクトはメッセージに応答します(または応答する必要があります)。何かを実行したい場合は、オブジェクトにメッセージを送信します。メッセージの処理方法は完全に無関係です。 オブジェクトを「ブラックボックス」と考えてください。オブジェクトから何かが必要な場合は、メッセージを送信するだけで、応答としてメッセージが送信されます。







ブラックボックス内のコードが機能的であるか必須であるかは、内部ですべてをどのように配置するかは関係ありません。正確に何をすべきかだけが重要です。







残念ながら、このモデル(Smalltalk)に基づいた最初の成功したオブジェクト指向言語は「オブジェクト」と「メッセージ」の概念で動作しましたが、Smalltalkの後者は実際のメッセージではなく、同期関数呼び出しを偽装しただけです。 同じエラーがC ++でもJavaでも繰り返され、OOPの主な概念は、コードをクラスとメソッドに編成するための奇妙なパラダイムに退化しました。







ErlangとElixirを使用すると、何百万もの孤立したプロセスを簡単に作成でき、それらの間でメッセージを送信することですべてが機能します。 システムのアーキテクチャは、必要な並列処理のレベルと、その後のプロセスへの直接のマッピングによって決まります。







10,000ユーザーのElixir Webサーバーは、「ApacheやJigsawなどのように10,000ユーザーのWebサーバー1つ」ではありませんが、「ユーザーごとに10,000 Webサーバー」です。従来のモデルからの脱却。







Erlang / Elixirプロセスモデルを記述するために単純な関数型言語が使用されたという事実は、ほとんど偶然です。 それはすべて論理プログラミングシステム(Prolog)で始まり、たとえばCノードのようなものはどの言語でも書くことができます。 Elixir(およびその他のBEAM言語)にとって本当に重要なことは、非常に多数の並列プロセスで動作する仮想マシンの能力です。







長い間、「アーランは唯一のオブジェクト指向言語です」と言っていました。 これでElixirに追加できると思います。







OOPの場合、基本的なことは次のとおりです。









それほど重要ではない:









システムを相互に通信する多数の小さなプロセスに分割した後、他のすべては(比較的)簡単になります。各プロセスは非常にシンプルで、かなりの処理ができる必要があり、プログラミングが大幅に簡素化されます。







Erlang(およびElixir)がプログラミングにもたらしたのは、コミュニケーション(リンク-翻訳者のコメント)のアイデアでした。 Mike Williamsが最初に提案したのは、エラーを処理する機能を拡張し、プロセスの境界外で実行できるようにすることです。 これにより、スーパーバイザーツリーの構築などに必要なすべてのツールを入手できました。







スーパーバイザー、gen_server、およびそのすべてのジャズは、ユーザーから一部の詳細を隠す単なるライブラリです。 内部はシンプルで、同じツールを使用して記述されています-並列プロセスとそれらの関係。







Erlangは、機能的なプログラミング言語としてではなく、長寿命のフォールトトレラントシステムを作成するためのツールとして開発されました。







フォールトトレランスの中心的な要素は、リモートエラー処理の概念です。 システム全体に障害が発生した場合、別のマシンで誤動作を修正(補償)する必要があります。ローカルで実行することはすでに不可能であるため、ローカルコンピューターは機能していません。







つまり、フォールトトレラントシステムのプログラミングには、使いやすいツールであるディストリビューション(プロセス)とメッセージングが必要です。そのため、原則として、フォールトトレラントアーキテクチャは最終的にErlangに似ています。







Erlangを作成する全体のポイントは、フォールトトレラントシステムのプログラミングを簡素化することでした。その副作用は、スケーラブルなシステムのプログラミングの容易さでした。







ErlangとElixirと「その他すべて」の違いは、並行性とフォールトトレランスを確保するためのメカニズムにあり、これはFPのモナド、構文、または「純度」に関するものではありません。







質問は次のとおりです-コールバックを使用して1つのスレッドで10,000人のユーザーを処理して同時実行をエミュレートしますか、それとも10,000の並列プロセスを作成しますか?各プロセスは単純で、コールバックはまったく必要ありませんか?







各プロセスは、関心のあるメッセージを待ってから計算を実行し、次のメッセージを見越してスリープ状態になります。







Erlang / Elixirを推進する上での大きな問題は、多くの並列プロセスが特定の問題の解決にどのように役立つかを説明する必要があると思います。 他の一般的な言語は当初、並列プログラミングを目的としておらず、意味のある方法でそれを促進するものではないため、人々にとっての並列プログラミングの必要性は完全には理解されていません。







「しかし、1つのスレッドでコールバックのすべてを実行できます」と彼らは言います。 そして、彼らはそれをします、そしてそれは痛々しいほど困難です。 そして、「コールバックがループに入ったり、例外をスローした場合はどうなりますか?」と尋ねます。そして、質問を理解していない場合は、一生懸命働いて問題を説明する必要があります。 しかし、質問が明確な場合は、並行性をプログラムするためにコールバックが不要な遠い国があることを伝えます。







上記のすべてを次のように減らすことができるようです:Elixirを関数型プログラミング言語として宣伝しないでください-そうではありません。 これは、並列プログラミング言語(CPL、並行プログラミング言語)です。







「私の関数型言語はあなたの関数型言語よりも機能的です」などの引数に応答しないでください。 そして、モナドについて話すことさえ気にせず、すぐに主題を変えてください。







「-CPLとは?」

「ご存知のように、これがWhatsAppの作成対象です...」







翻訳者から



まず、ジョー・アームストロングの突然の死に遺atの意を表したいと思います。彼は2019年4月20日に亡くなりました。 業界の発展に対する彼の貢献と、人気者としての才能(本、スピーチ、ErlangおよびElixirコミュニティでの活発な仕事)を過小評価することは困難です。







便利なリンク:










All Articles