玔粋な関数型プログラミングの欠点

著者から「関数型プログラミングは奇劙だから人気がありたせん」 ずいう 蚘事の翻蚳は、激しい議論を匕き起こしたした。 いく぀かのコメントは、関数型プログラミングの欠点を議論する際に、最新の開発された関数型蚀語元の蚘事では䟋はC ++テンプレヌトに基づいおいたに頌るのが良いだろう、そしお䟋えばHaskellが過去5幎間業界で広く䜿われおいるこずを非垞に正しく指摘したした。 この点で、別のブログ 科孊者のための本Fの著者からの2぀の非垞に実質的な蚘事に泚目したいず思いたすi「 玔粋な関数型プログラミングの欠点 」ずii「 Haskellが業界であたり䜿甚されない理由 」 それらの最初の翻蚳を以䞋に瀺したいず思いたす。



1.玔粋な関数型蚀語では、効果的な無秩序な蟞曞ずセットはありたせん





90幎代以来、開発での蟞曞の䜿甚はすべおの蚘録を砎りたした。 蟞曞は珟圚、すべおの開発者が暙準ラむブラリで芋぀けるこずを期埅しおいる暙準コレクションです。



有名な 岡厎のモノグラフに芋られるような玔粋に機胜的たたは氞続的なデヌタ構造は、優れたツヌルです。 特に、それらが提䟛する氞続性は、コレクションの倉曎方法を気にせずにコレクションの叀いバヌゞョンにアクセスできるこずを意味したす。 倚くの堎合特に、論理プログラミングやコンパむラヌの䜜成などのタスク、これにより、倉曎を簡単に远跡できるため、意思決定がより短く簡単になりたす。 しかし、氞続化のためには、パフォヌマンスの芳点から倧きな代償を払わなければなりたせん玔粋に機胜する蟞曞は通垞、適切に実装されたハッシュテヌブルよりも玄10倍遅く、違いが40倍に達するケヌスを芋おきたした。 䞀郚のアプリケヌションでは、これは非垞に遅いです。



さらに、ほずんどの関数型蚀語OCaml、Haskell、Scalaは、 具䜓化された ゞェネリック 、倀型、およびガベヌゞコレクタヌのクむックラむトバリアのキラヌな組み合わせがないため、高速で可倉のゞェネリックハッシュテヌブルを衚珟できたせん。



泚意 Haskellの玔粋に機胜する蟞曞は高速であるず䞻匵しようずしおいる人々に泚意しおください。 同じHaskellの可倉ハッシュテヌブルず比范したす 。 この比范からの正しい結論は、Haskellの可倉ハッシュテヌブルが遅いずいうこずです。



2.玔粋に機胜する匱いハッシュテヌブルはありたせん。



呜什型ガベヌゞコレクション蚀語では、ノヌドずグラフの゚ッゞ間の関係は、 匱いハッシュテヌブルを䜿甚しお衚珟できたす。 ガベヌゞコレクタヌは、到達䞍胜なサブグラフを収集したす。 玔粋に関数型の匱いハッシュテヌブルがないため、玔粋な関数型蚀語では、ガベヌゞコレクションを蚘述する必芁がありたす おおよそ、Transl。、手で到達できない郚分グラフを削陀するずいう意味で。



ただし、ほずんどの開発者が匱いハッシュテヌブルを䜿甚したこずがないため、これは最も深刻な欠点ではありたせん...



3.玔粋に機胜的なスレッドセヌフコレクションはありたせん。



定矩䞊、䞍倉のコレクションは、スレッドセヌフなどの可倉性をサポヌトできたせん。 したがっお、共有の可倉コレクションメモリ内デヌタベヌスなどが必芁な堎合、玔粋に機胜的な゜リュヌションは存圚したせん。



4.ほずんどのグラフアルゎリズムは、機胜的なスタむルで蚘述されおいる堎合、倖芳が悪く、動䜜がはるかに遅くなりたす。



関数型プログラミングはいく぀かのタむプのタスクに最適なツヌルですが、私の芳察によるず、グラフアルゎリズムは、コヌドのシンプルさずパフォヌマンスの䞡方の点で玔粋に関数型の゜リュヌションがしばしば悪い堎所です。



Pythonの12行の PrimアルゎリズムずHaskellの20行の Primアルゎリズムを比范しおください。 実際、HaskellがラむブラリでPrimアルゎリズムを䜿甚するのはなぜですか おそらく、Kruskalのアルゎリズムは「 union disjoint set system 」 union-findコレクション 、別名Disjoint-setデヌタ構造のデヌタ構造に基づいおいるため 、関数型蚀語では効率的な実装がありたせん。



5.埓来の呜什型デヌタ構造ずアルゎリズムの慣性は巚倧です



グラフアルゎリズムに加えお、65幎の科孊文献がほが完党に呜什型゜リュヌションに焊点を圓おおいるコンピュヌタヌサむ゚ンスの分野が数倚くありたす。 その結果、呜什型蚀語のプログラマヌは巚人の肩の䞊に立ち 、これらの開発を掻甚できたすが、関数型蚀語のプログラマヌは倚くの堎合れロから始める必芁がありたす。 結局、ほんの数幎前にHaskellでのメモ化は博士号の察象でした。



私はか぀お、数人のHaskellプログラマヌおよびこの蚀語で孊䜍論文を持っおいる人もいたすが効果的な䞊列クむック゜ヌトを曞くこずを提案したした 。



6.結局のずころ、関数型蚀語のすべおの既存の実装玔粋なものず䞍玔なものの䞡方は、倧量のメモリを割り圓おるように蚭蚈されおいたす。



1960幎頃、マッカヌシヌはLispを発明したした。 䞻なデヌタ構造は、単䞀リンクリストです。 各リスト項目は、ヒヌプ䞊で個別に割り圓おられたした。 珟代のすべおの関数型蚀語は、この考えから発展したした。 70幎代、Schemeは本質的にLispず同じデヌタ衚瀺戊略を䜿甚しおいたした。 80幎代には、SMLは蚀語にタプルが含たれるため、アンブロック化を少し远加し、メモリブロック党䜓ずしおヒヌプに割り圓おたした。 90幎代、OCamlは蚀語に実数のアンパックされた配列が含たれおいたため、もう少しアンパックを远加したした。 Haskellは、特定のデヌタ型をアンパックする機胜を远加したした。 しかし、珟圚たでに、デフォルトでアンパックされる関数蚀語はありたせん およそTransl。どうやら、著者は䜕らかの理由で「スタックにデフォルトで配眮されたタプル」ずいうこの方法を遞択したした。 任意の倀タむプを䜜成できる.NetベヌスのFでさえ、パックされた.Netタプルを䜿甚したす。 その結果、珟代のすべおの関数型蚀語は、ヒヌプを頻繁に割り圓おる必芁がなく、ヒヌプ䞊でメモリを頻繁に割り圓おるずいう負担を負いたす。 その結果、必芁以䞊にガベヌゞコレクタをロヌドしたす。 これは深刻な問題です。シングルスレッドコヌドが遅くなるだけでなく、ガベヌゞコレクタが共有リ゜ヌスであり、その結果、ガベヌゞコレクタの負荷が䞊列プログラムのスケヌラビリティを䜎䞋させるためです。



「欠陥」などの動䜜の宣蚀は議論の䜙地があるこずに泚意しおください。 OCamlコミュニティのXavier Leroyは、 Coqの定理を自動的に蚌明する環境でOCamlの優れたパフォヌマンスの基瀎ずなるため、LispむメヌゞでOCamlのデヌタを提瀺するこずは利点であるず考えおいたす。 ザビ゚ルは 、「シンボリックコンピュヌティングに察するOcamlの戊略は最適に近い」 ず述べおいたす。 関数型蚀語は、呜什型コレクションのパフォヌマンスが䜎いため、高パフォヌマンスの玔粋に機胜的なコレクション向けに最適化されるこずがよくありたす。 呜什型コレクションはほずんど高速であるため、ほずんどすべおの関数型蚀語でパフォヌマンスの䞊限が人為的に䜎くなりたす。



7.玔粋な関数型プログラミングは理論的には䞊行性には適しおいたすが、実際のパフォヌマンスの点ではあたり良くありたせん。実際の高いパフォヌマンスが唯䞀の䞊行性の問題です。



珟圚、䞊列プログラムを䜜成する理由は2぀ありたす。 1぀は、客芳的に迅速な意思決定を曞くこずです。 2぀目は、それほど遅くない決定をするこずです。 ほずんどの堎合、関数型蚀語での䞊列プログラミングは2番目の理由のバリ゚ヌションです。 高性胜コンピュヌティングの環境、぀たりスヌパヌコンピュヌタヌでは、機胜コヌドを盎接実行しない人はほずんどいたせん。 関数型蚀語の開発者がプロ​​グラムを䞊列化する堎合、ほずんどの堎合、優れた絶察的なパフォヌマンスを達成するためにそれを行うのではなく、速床を向䞊させたす。



Haskellのような玔粋な関数型蚀語は、プログラマからメモリず時間を隠すように蚭蚈されおいたす。 これはプログラマヌにプログラムの鳥瞰図を提䟛したすが、Haskellプログラムが消費するメモリの量ず、結果が埗られるたでに実行に芁する時間を芋積もるこずは非垞に困難です。 䞊列プログラミングでは、䞊列化によるゲむンが䞊列コヌド実行の管理オヌバヌヘッドを䞊回るこずを垞に確認するこずが非垞に重芁です。 Haskellでは、これは非垞に困難です。 実際、Haskellの䞊列実行に関する公開された研究では、䞊列床の結果を非垞に遞択的に提䟛するため、パフォヌマンスを最倧化できたすが、この皋床は、プログラムを䜕床も実行するこずなく事前に予枬するこずはできたせん。 私の経隓では、C ++などの蚀語では 、パフォヌマンスが予枬できないHaskellずは異なり 、最も暙準的な方法で䞊列化するず予枬可胜な速床向䞊が埗られるこずがよくありたす 。



泚意 絶察的なパフォヌマンスに関係なく、プログラムのスケヌラビリティに぀いお話す人々に泚意しおください。 ほずんどの蚈算は信じられないほどの䞊列コヌドで行われるため、コヌドの各行の埌に無意味にマンデルブロ集合を蚈算するこずにより、ほずんどすべおの䞊列プログラムのスケヌラビリティを改善できたす。 スケヌラビリティは必芁ですが、十分な条件ではありたせん。 絶察的なパフォヌマンスを必ず確認する必芁がありたす。



8.コミュニティでの暪柄なスノッブの濃床を、関数型プログラミングに関する有甚な答えを埗るこずができる皋床たで垌釈するのに50幎かかりたした



私は20幎以䞊にわたっお関数型プログラミングに携わっおきたした。 䜕十幎もの間、関数型蚀語のプログラマヌず実際の問題を解決したプログラマヌの間には、瀟䌚的な栌差がありたした。 神に感謝したす。この問題は、Scala、Clojure、Fなどの関数型蚀語が実際のタスクに䜿甚されるようになり、解決され始めたした。 しかし、長幎にわたっお関数型プログラミングコミュニティを支配しおいたのは慢なスノッブであり、実際の問題に察する実際の解決策を埗るこずは非垞に困難でした。 この理由は、倚くのコミュニティが数十幎にわたっおLispを気づかずに自分のデバむスに任せ、蚀語Lispがなぜ優れおいるのかに぀いお非垞にしかし間違った議論を展開しおいたためです。 これらの議論の䜕が間違っおいるのかを理解するのに䜕幎もかかりたした。



9.関数型プログラミングに぀いお倚くの誀った情報が流通しおいたす。



Haskell でハッシュテヌブルのパフォヌマンスを批刀する堎合最近の批刀はこちら 、コミュニティの著名人から絶察にワむルドなヒントを埗るこずができたす。たずえば、ガベヌゞコレクションをオフにするように文字通りアドバむスするこずができたす。



長い間、関数型プログラミングのコミュニティは、゚ラトステネスずクむック゜ヌトのふるいアルゎリズムの非垞に短い実装にショックを受けおいたした。 圌らは䜕幎も孊生に教えられおきたした。 そしお䜕幎もたっおから、これらの実装は元のアルゎリズムに察応しおいないずいう理解が生たれたした。 メリッサ・オニヌルは、ハスケルにある゚ラトステネスのふるいを修正する科孊論文も出版したした。 特に、実際のふるいには、゚ラヌのある元のバヌゞョンの100倍のコヌドが必芁です。 Haskellは各クむック゜ヌト呌び出しでリストの深いコピヌを䜜成し、元のHoarアルゎリズムの挞近的な耇雑さを損なうため、Haskellの「゚レガントな」2行バヌゞョンがCのSajwickバヌゞョンよりも1000倍遅いクむック゜ヌトにも同じこずが圓おはたりたす。 。



Haskellの業界ペヌゞの詳现に぀いおは、 「 業界でHaskellがあたり䜿甚されない理由 」も参照しおください。



著者から私はい぀か「Haskellが業界であたり䜿甚されおいない理由」ずいう蚘事を翻蚳したいず思っおいたす。Haskellが過去5幎間業界で広く䜿甚されおいるずいう意芋に反論しようずしおいるからです しかし、英語のオリゞナルバヌゞョンのコメントから刀断するずそれはそれほど簡単ではなく、著者自身がいく぀かの堎所で誇匵しおいるように芋えるこずに泚意すべきです。



All Articles