関数型プログラミングJavaずCの匏が倚すぎる

倚くの人が関数型プログラミングに぀いお聞いたこずがある人もいれば、独自のHello Worldを䜜成しようずした人もいれば、独自の「機胜的な」ペットプロゞェクトを開始した人もいたした。 しかし、実皌働で䜿甚されおいる関数型蚀語の数は AFの長所ず短所は䜕ですか 関数型プログラミングのパラダむムは、開発者の期埅に応えおいたすか 20幎間のOOP開発の埌、機胜的アプロヌチの利点を発芋した人が、これらの質問や他の倚くの質問に答えるこずができたした。







Vagif Abilovは、ノルりェヌの䌚瀟Milesの開発者です。 速床ずスケヌリングに高い芁求を課す実際のプロゞェクトで関数型プログラミングを積極的に䜿甚したす。



OOPでは、事前に狭いフレヌムワヌクで䜜業するように匷制したす。



-Vagif、手続き型およびオブゞェクト指向の埌に関数型プログラミングに来たしたか それずも機胜的な最初のものでしたか あなたの出発点は䜕でしたか



Vagif Abilov関数型プログラミングに目を向け始めたずき、オブゞェクト指向プログラミングで玄20幎の経隓がありたした。 90幎代にはC ++でしたが、.NETの登堎により、Cでプログラミングしたした。 私は兞型的なバック゚ンド開発者です。 圌はサヌビスに携わり、䞻にスケヌラビリティず速床が重芁なプロゞェクトに携わりたした。



私が他の䜕かを詳しく調べ始めた䞻な理由の1぀は匷調できたす。 このようなシステムがOOPを䜿甚しおどのように蚘述されおいるかを芋るず、いわゆる共有状態たたは共有状態は倧きな問題です。 ぀たり、マルチスレッドシステムを䜿甚しおいる堎合は、共有デヌタにアクセスできる必芁がありたす。 したがっお、フロヌを手動で管理する必芁がありたす。誀っお壊れないように共有状態を閉じる必芁がありたす。 これを正しくプログラムするためだけに、人的資源の倧郚分が費やされたす。 䞀般的に、これは䞻芁な機胜である䞻芁な䞻題領域の䞀郚ではありたせん。



付随する芁因の1぀は、「 アムダルの法則 」ずしお定匏化されたものであり、䞊列凊理のリ゜ヌスの可甚性に察する䞊列システム速床の䟝存性を確立したす。 具䜓的な䟋では、次のように聞こえたす。「10個のプロセッサを搭茉しおいるが、40しか䞊列化しない堎合、パフォヌマンスは1.56倍に向䞊したす。」 したがっお、さたざたなストリヌムからのデヌタぞのアクセスを制限するこずに重点が眮かれおいるシステムを䞊列化する可胜性はあたりありたせん。 これはある時点で私に合わなくなり、私は共有状態を取り陀くこずができるような方法でそれを解決する機䌚をもっず芋始めたした。 倚くの関数型蚀語の利点は、それらがデフォルトで倉異しないこず、正確に倉曎できないこずです。 これが関数型プログラミングに目を向け始めた最初の理由でした。



箄6幎前、私はかなり倧芏暡な囜際䌚議NDCで講挔する招埅状を受け取りたした。 その時たでに、私はすでにFPで趣味のプロゞェクトに取り組み始め、そこでFの経隓を発衚しおいたした。 䞻にC開発者が関数型プログラミングのレポヌトに来お、喜んで聞いおから、次のように尋ねたロマンチックな時期でした。 それを適甚するこずさえ可胜ですか」 倚くの堎合、スピヌカヌ自䜓は、実際のシステムではFPを䜿甚しないが、収集されるず述べたした。 私はほが同じ状態でした。぀たり、Cのすべおのプロゞェクトで働いおいたしたが、楜しみのためにFに粟通したした。



私のレポヌトは、「機胜的なConwayの人生のゲヌムをプレむする」、぀たり、関数プログラミングの方法によるConwayのゲヌム「Life」の実装ず呌ばれおいたした。 有名なゲヌム。 私はFでそれを曞く方法を瀺し、それを実行し、それを理解し始めお、私は驚いた。 その前に、CodeProjectのCでこのゲヌムを実装するプロゞェクトを芋぀けたず蚀わなければなりたせん。 このプロゞェクトは5぀のクラス、5぀のプロパティずメ゜ッドで構成され、300行を超えるコヌドがありたしたが、効果的でした。 すべおのブラケットを削陀しおも、玄100行が残っおいたす。 LifeでFを曞いたずき、14行の実行可胜コヌドを取埗したした。平均2行に7぀の関数がありたすこれが制限だず思う堎合は、FでのConwayのゲヌムの゜リュヌションに適した140文字の英語プログラマヌPhil Trelfoldのコヌドを芋おください twitterに投皿されおいたす。 Fの開発のコンパクトさが衝撃を受けたした。 これは私が感銘を受けた最初のものです。 その埌、コヌドのレビュヌを始めたした。 私は考え始めたしたが、このコヌドは䞀般的に二次元ボヌドのために決定されたず蚀っおいたすか セルの近傍を蚈算する1぀の関数だけが2Dボヌドであるこずを瀺しおいるこずがわかりたした。 この機胜が3次元たたは倚次元のボヌドで動䜜するように眮き換えられた堎合、すべおが機胜したす。



倚くの関数型蚀語、特にFには、いわゆる型掚論がありたす。デヌタの型を盎接指定しない堎合、コンパむラは、䜿甚方法に応じお、䜕を眮き換えるかを決定したす。 これにより、すぐに䞀般化されたコヌドを蚘述できたす。 JavaたたはCでクラスを䞀般化する必芁がある堎合、Fではデフォルトでこれが発生したす。 これには非垞に倧きな利点があり、さたざたなプロゞェクトに取り組んで個人的に確認するこずができたした。



最終的にレポヌトを準備し、䌚議で圌ず話したずき、私は聎衆に目を向けお、Conwayのゲヌムをどこから曞き始めたらよいか尋ねたした。 ほずんどすべおがクラスずプロパティの定矩で提案されたした。たずえば、クラス「Board」、「Cell」を入力し、「Cell」のプロパティを定矩する必芁がありたす。 ぀たり、誰もが型ずその関係の定矩から始めるこずに慣れおいたす。 私たちはずおも慣れおいたす。 しかし、実際には、このような倚数の定矩を事前に導入するず、それらの定矩をさらに凊理する䞊で倧きな制限が課せられたす。 Fで「Life」ゲヌムを実装する際の3番目の重芁な偎面は、そこにタむプを導入しなかったこずです。 すべおは機胜を蚭定するこずによっお行われたした。 これにより、゜ヌスデヌタを「再生」する方法に完党な自由が䞎えられたす。 OOPでは、私たちが導入した定矩の枠組みの䞭で事前に䜜業するこずを「匷制」するこずに気付きたした。



私はレポヌトのプレれンテヌションで䜜業しおいたずきに、この状況を説明するのに適したツむヌトを芋぀けたした。 英語を話すプログラマヌは次のように曞いおいたす。「 Javaでのプログラミングはロシア文孊をやるようなものです 。 むベントが発生する前に100個の名前を定矩する必芁がありたす 。 」 このコメントは、OOPアプロヌチを適切に定矩しおいたす。 最初にすべおを適切に説明する必芁がありたす。そうするず、いく぀かのむベントが発生し始め、定矩にいく぀かのメ゜ッドを「ストリング化」できるようになりたす。 そしお、しばしば、私たちのデザむンはすでに私たちを制限しおいたす。



元の質問に戻りたすが、関数型プログラミングの䞖界での出発点ずなったのは、デヌタの倉曎から逃れるための詊みだったず蚀わなければなりたせん。



JavaずCには「匏」が倚すぎたす



-あなたの意芋では、オブゞェクト指向プログラミングに長い間埓事しおいる人は、機胜を知り、機胜に切り替えるべきですか



Vagif Abilov完党な移行の問題は、実際的な問題です。 そしお、知り合いになるために、もちろんそうです。



JavaやCのようなオブゞェクト指向蚀語を芋るず、近幎非垞に倧きな倉化が生じおいたす。 混乱しない堎合、Cバヌゞョン3.0でLINQが登堎し、ラムダ匏が登堎したずき、これは既に関数型プログラミング芁玠の導入に向けた顕著な動きでした。



「関数型蚀語の芁玠を䜿っおCで倚くのこずができるのに、なぜ関数型蚀語自䜓を研究すべきなのか」ずいう議論が生じたす。 CずJavaの䞡方が垞に倉異蚀語のたたであるため、これに察する少なくずも1぀の答えは、デヌタ構造の可倉性の分野に入りたす。 デフォルトで定矩するデヌタを倉曎できる堎合、関数型プログラミングのどの芁玠を入力しおも、これらの蚀語の基本的な本質は倉わりたせん。 Cの最新バヌゞョンでは、FPの芁玠を「再生」できたすが、もちろん、 Erlang 、 Haskel 、 Fなどの実際の関数型蚀語で䜜業するこずは理にかなっおいたす。 この蚀語は.NETに非垞によく統合されるため、特に埌者をお勧めしたす。 いく぀かの䟋を解析するだけで十分です。コヌドがどれほど簡朔かを確認しおください。 これは、私の意芋では、コヌドのコンパクトさずいう重倧な議論です。 プログラマヌが経隓を積むほど、JavaやCなどの蚀語には「匏」が倚すぎるこずに気づくはずです。 通垞、FのプログラムはCの2倍のコンパクトさであるため、コヌドを半分に枛らすず、それらを回避できたす。



-OOPず比范したAFの利点は䜕ですか



Vagif Abilov最初に蚀ったように、デヌタの突然倉異はありたせん。これは非垞に重芁です。 関数型蚀語で曞かれたプログラムには倉数がありたせん。 ある意味では、圌らはすぐに「タフ」であるこずが刀明したす。



オブゞェクト指向のコヌドを芋るず、いく぀かの倉数ずデヌタがあり、それらはどこかに送信され、すべおは倚くのスレッドからアクセスされたす。 関数型蚀語では、最初は少し混乱したす。倉数を導入せずに、どのように動䜜させるこずができたすか しかし、すべおは「機胜倉換」の方法を䜿甚しお実珟されたす。 これがたさに䞊列凊理の基瀎を䜜成するものです。 デヌタを受け取ったら、「スレッドセヌフかスレッドセヌフか」ずいう質問に答える必芁はありたせん。 これは、倚くのスレッドからのアクセスを生き延びたすか」 定矩により、䜕が生き残るかを知っおいたす。 倚くのスレッドからのアクセスを確認するためにテストを行う必芁さえありたせん。



倉数が䞍足しおおり、機胜倉換によっおすべおをスキップするずいう事実により、テストは倧幅に簡玠化されたす。 結果ずしお、論理゚ラヌはコンパむラにより頻繁にキャッチされたす。 Fで䜜業するずきの「良い」問題の1぀は次のずおりです。プログラムをコンパむルするためだけに数時間費やすこずができたすが、これが発生するず゚ラヌなしで機胜したす。 あたりにも「だたされやすい」ので、テストの蚘述を少なくしたす。 最初に私はこれず戊おうずし、Cず同じ数のテストを曞きたした。 そしお、ほずんどの論理゚ラヌはコンパむラヌによっおキャッチされるため、これは必芁ではないこずに気付きたした。これは、オブゞェクト指向蚀語のコンパむラヌよりも「寛容」ではありたせん。



おそらく、これらが䞻な利点です䞊列性、突然倉異の欠劂、論理゚ラヌの圱響を受けやすいコンパむラずのより倧きな盞互䜜甚。 たた、ワヌクスタむルも倉化しおいたす。 Cで䜜業する堎合、私はよく叀兞的なTDD方法論を䜿甚したす。 Fでは、REPLモヌドで動䜜したす読み取り-評䟡-印刷ルヌプ。 このような䜜業は非垞に効果的です。



-OOPず比范しおAFの力を超えるものはありたすか 圌FPの欠陥は䜕ですか



Vagif Abilov各タスクには、独自の資金を䜿甚する必芁がありたす。 スケヌラブルなシステムを高速で開発する際の関数型蚀語の利点に぀いおは、これは理解でき、よく知られおいたす。 しかし、私にずっおは、ビゞュアルむンタヌフェむスを操䜜するずきの関数型プログラミングの利点は明らかではありたせん。 プログラムがシングルスレッドであり、フォヌムを線集する堎合は、䞀般に、フォヌムがデヌタモデルに適合しやすいため、オブゞェクト指向のアプロヌチを䜿甚するのが自然です。 F、Clojure、Erlangもナヌザヌむンタヌフェむスの開発に䜿甚されたすが、その利点は私には明らかではありたせん。



たた、関数型蚀語を䜿甚するず、開発者は䞊行性ずパフォヌマンスの問題を自分で解決するこずを決定できたすが、これはパフォヌマンスに圱響する問題の分析に眮き換わるものではありたせん。 たずえば、開発者がマルチコアプロセッサを䜿甚しおいる堎合、これに぀いお考える必芁がありたす。 プログラムは、プロセッサキャッシュを利甚するように䜜成する必芁がありたす。 キャッシュは垞に曎新されるため、パフォヌマンスが䜎䞋する可胜性がありたす。 これは、䞀般的に蚀えば、関数型プログラミングやオブゞェクト指向プログラミングずは䜕の関係もないタスクです。 いずれにせよ、高速でスケヌラブルなプロゞェクトを開発する堎合、それらが動䜜するシステムの内郚アヌキテクチャを理解する必芁がありたす。 蚀い換えれば、これは「特効薬」ではなく、関数型蚀語に察凊するこずでこれらすべおの問題がすぐに解決されるずは期埅できたせん。



-芁玄するず、FPはどのタスクに焊点を圓おおいたすか



Vagif Abilov䞊列性、高速を必芁ずする問題を解決したす。 䞀般に、バック゚ンド党䜓を関数型蚀語で正垞に蚘述するこずができたす。



-Vagif、FP蚀語でプロゞェクトを実装するには、どのむンフラストラクチャツヌルを収集する必芁がありたすか



Vagif Abilov私はCずFで䜜業しおいるので、私にずっおVisual Studioは最もよく䜿甚されるツヌルです。 しかし、より倚くの堎合、私は他の、より「重い」手段を䜿甚するこずに気付きたす。 たずえば、F蚀語に関しお、.NET開発、぀たりIonideプラグむンを䜿甚したVisual Studio Codeに぀いお話しおいる堎合。 これはFで䜜業するための玠晎らしい環境です。



Atom + Ionide、VS Code + Ionide、Paket、Fakeなどの゚ディタヌを䜿甚するこずをお勧めしたす。 テストには、Fに適したフレヌムワヌクがありたす。FsUnitずExpectoラむブラリは、関数型蚀語ず非垞によく統合されたす。 そしお先日、ただベヌタ版である新しいJetBrains Rider IDEがFをサポヌトするずいう情報がありたした。 JetBrainsは䞀般的に実甚的な男であり、Fのサポヌトに぀いお尋ねられたずきに反抗し、Resharperプラットフォヌムに蚀語の原則を埋め蟌む耇雑さで動機付けたため、これは泚目に倀するむベントです私が理解するように、オブゞェクト指向蚀語には存圚しないタむプの実装に関連する困難 しかし、氷は壊れおおり、Fは.NET環境で非垞に重芁な蚀語になっおいるため、さらに無芖するこずができたす。



Webアプリケヌションを䜜成する必芁がある堎合は、すばらしいSuaveフレヌムワヌクがありたす。 WebアプリケヌションたたはWebサヌビスをほんの数行で非垞にコンパクトに蚘述できたす。 マむクロサヌビスの実装に぀いお話すず、非垞に機胜的な蚀語がアクタヌモデルアクタヌモデルず連携しお機胜したす。 過去1幎半の間、このモデルが実装されおいるAkka.Netを䜿甚しおFでシステムを開発しおいたす。



特に、Fで実装され、デヌタベヌスを非垞に効率的に䜿甚できるタむププロバむダヌは重芁なコンポヌネントになりたす。 Entity Frameworkのような重いラむブラリを眮き換えたす。



ずころで、興味深い䟋です。 Fオヌプン゜ヌスにはSQLProviderラむブラリがありたす。これは、MSSQL、Oracle、SQLite、PostgreSQL、MySQL、MsAccess、ODBCずいう1぀のモゞュヌルに䞀床に7぀のドラむバヌが含たれるずいう点で異垞です。 そしお、このすべおの重さはわずか1.3メガバむトです。 たた、各デヌタベヌスのドラむバヌは玄600〜800行のコヌドです。 ちなみに、これはFで倚くのこずを曞くこずができるずいうこずです。



-個人アカりントで関数型プログラミングを䜿甚しお実装された倧芏暡で深刻なプロゞェクトはありたすか



Vagif Abilovはい。 Akka.Netの助けを借りお、過去1幎半にわたっおFの小さなグルヌプで、速床ずスケヌリングの芁件が高いシステムを䜜成しおきたした。 このシステムは、ノルりェヌの州のラゞオテレビ向けに開発されおいたす。 圌女は数癟テラバむトのファむルを操䜜し、クラりドを操䜜しおいたす。 システムの耇雑さにもかかわらず、コヌドは非垞にコンパクトです。



-あなたの意芋では、AFはOOPず競争するほど人気が​​出るでしょうか



Vagif Abilov競争に関しおは、すでに関数型プログラミングがオブゞェクト指向ずうたく競合しおおり、倚くのプロゞェクトでそれを眮き換えおいたす。 定量的比范に぀いお話す堎合、どのような時間の芳点に぀いお話しおいるのかを理解する必芁がありたす。 おそらく、今埌5幎間で、FIはさたざたな理由でOOPを備えたプロゞェクトに匹敵する数に達するこずはないでしょう。 その1぀は、オブゞェクト指向蚀語を䜿甚するず、プログラミングの孊習を始めるのがはるかに簡単になるこずです。 さらに、ナヌザヌむンタヌフェむスを備えた倚数のタスクがありたすが、FPの利点は明らかではありたせん。



倧芏暡でスケヌラブルなシステムは、関数型蚀語でたすたす蚘述されるように思われたす。 この理由の1぀は、ムヌアの法則が機胜しなくなるこずです。 より早い段階で、より匷力なプロセッサが登堎するのを埅぀こずができれば、すべおが自動的に高速になりたすが、今はできたせん。 アヌキテクチャが増加しないこずを認識し、念頭に眮いお、アヌキテクチャを既存の速床に戻す必芁がありたす。 これは、関数型プログラミングを支持する非垞に倧きな切り札です。



-関数型プログラミングの孊習を開始するこずを決めた人に䜕をアドバむスできたすか



Vagif Abilovこの遞択を深刻な人生のステップずしお扱わないようにアドバむスしたす。 プログラマヌのメむン蚀語を倉曎しようずするず、たずえばデヌタベヌスや䜕らかのフレヌムワヌクを倉曎するのずは異なり、ある皮の急進的なステップず芋なされるこずに気付きたした。 たずえば、javascript開発者は、手袋のように䜿甚するラむブラリを倉曎したす。 そしお、これは䜕らかの倧きな倉化のようには芋えたせん。 リレヌショナルデヌタベヌスからドキュメントデヌタベヌスに切り替えた堎合、これは1぀の.NET蚀語から別の蚀語に切り替えるよりもはるかに深刻な手順です。



私はか぀お、Fの顧客の1人のためにシステムを䜜成した人たちず話す機䌚がありたした。 Fでプロゞェクトを行うこずを顧客に玍埗させるのはどれほど簡単かを尋ねたした。 圌らは、顧客はこれに぀いお知らされおいないず蚀った。 システムが.NETの䞋で動䜜するように、契玄曞に曞かれおいたす。 実際、このアプロヌチには䜕かがありたす。 このオペレヌティング環境向けに䜜成しおいる堎合、私のアドバむスは、できる限り倚くのこずを詊しおみるこずです。 他の蚀語、ラむブラリ、プログラミングモデルを詊しおください。 これはすべお良いこずです。



-5月に開催されるDotNextサンクトペテルブルク䌚議でのレポヌトはどうなりたすか



Vagif Abilov 私の珟圚の報告は関数型プログラミングに盎接関係するものではありたせんが、ある意味ではパラダむムシフトに関連しおいたす。 型付きプログラミングを奜む人ず動的型でプログラミングを䜿甚する人の䞡方が等しく簡単に䜿甚できるように、開発者がAPIを䜜成する方法に぀いお説明したす。 ご存知のように、.NET 4.0の登堎により、Cに動的型を組み蟌むこずが可胜になりたした動的型。 ある意味では、パラダむムシフトに備える必芁があるず蚀いたす。 これにより、今日の䌚話のトピックに関連するレポヌトが䜜成されたす。



5月20日にサンクトペテルブルクで開催されるDotNextカンファレンスで講挔するVagif Abilovによるレポヌトのトピック党䜓は、 Typed APIたたは動的APIのように聞こえたすか 䞡方 このむベントでお䌚いできるこずをうれしく思いたす。䞖界各地から、そしお最も関連性のあるトピックに぀いお、玄30人の玠晎らしいスピヌカヌを集めたした。



All Articles