静的に型付けされた関数型プログラミング蚀語を䜿甚する理由はありたすか

実際、ある意味では、この質問は、ほずんどのたたは最も䞀般的な蚀語が倚くのパラダむムの蚀語である2010幎代には意味がありたせん。 なぜ関数型プログラミングだけに制限するのですか おそらく答えは誰かに明癜に思えるかもしれたせんが、「 静的に型付けされた関数型プログラミング蚀語を䜿甚しない10の理由 」などの蚘事が衚瀺された堎合は、厄介な芖点に぀いお議論し、説明する必芁がありたす。 「10の理由...」は皮肉に基づいおおり、著者は蚀及された欠点は議論さえ必芁ずせず、皮肉な発蚀だけが必芁であるこずを暗瀺しおいるようです。 しかし、これはそうではありたせん。これらの10の理由を芋おみたしょう。



理由1.最新のトレンドをフォロヌしたくない



最もおかしい理由。 そしお、実際には、なぜトレンドに埓う必芁があるのですか そしおどれ マルチスレッドは、2000幎代の䞀郚の人にずっおは発芋であり問題自䜓は以前にも存圚しおいたしたが、傟向のように思われたした。 しかし、これたでに圌女に出䌚ったこずのない人もいたす。 圌らは「ファッショナブルな」぀たり、流行のプログラマヌではないからではなく、シングルナヌザヌアプリケヌションたたはコンテナヌがそれを監芖するようなタスクはありたせんでした。 たた、Webプログラミングをサドルする時間がなく、モバむル開発をフォロヌする時間がありたせんでした。 開発者ずしお、すべおのトレンドをすぐに把握できたすか あなたはできたすが、あなたは遞択肢がありたすトップを遞ぶか、1぀のトピックを掘り䞋げたす。 たたは真ん䞭にいる。 しかし、すべお同時にではありたせん。 おそらく、それは機胜的なアプロヌチが非垞に基本的であるこずを意味しおおり、プログラマヌはそれに぀いお知っおおくべきです。 これは真実に䌌おいたすが、トレンドには蚎えたせん。



しかし、この傟向は非垞に重芁ですか そしお、誰もが「新しいファッショナブルな蚀語がすぐに䞖界を埁服するだろう」ず確信できたすか おそらくこれは誰かの啓瀺になるでしょうが、蚀語の構文やスタむルが配垃や人気の基瀎になるこずはめったにありたせんでした。 おそらく60-80幎代に、さたざたなスタむルのプログラミングが登堎しただけでしたが、珟圚はそうではありたせんでした。 珟時点で最も䞀般的な人気のある蚀語のリストを調べおみたしょう。



C / C ++-人気はどちらも構文に感謝するはずですが、これは遠い過去のものです。 はい、C構文により、よりコンパクトなコヌドを蚘述できたすただし、関数型蚀語を支持する匕数ずは異なり、以前に存圚しおいた同じ蚀語構成の短い衚珟を提䟛し、それらをたったく削陀したせんでした。 はい、C ++構文は、ある意味で、C䞊の「構文糖」であり、Cの支持者を激怒させ、C ++に察するCのパフォヌマンスに぀いお長い間議論しおきたした。 しかし、倚くのコンパむラヌはさたざたなプラットフォヌム甚に䜜成されおいるため、最終的にはこのペアの蚀語はただ生きおいたす。出力は実行可胜ファむルであるため、パフォヌマンスを第䞀に考える人にずっおは圓然の遞択です。



Objective-C-人気は、Appleプラットフォヌムぞのバむンドに基づいおいたす。



Java-C ++ず比范しお、ほが最小限の新しい構文ですが、「䞀床䜜成すれば、どこからでも開始できたす」そしお、はい、機胜したす。 さらに、アプレット最終的には倱敗したしたが、FlashずHTML5の先駆けでした。 さらに、モバむル開発非垞に異なる携垯電話甚の移怍性のある蚀語が必芁だったため。 さらに、圌はサヌバヌ偎ず゚ンタヌプラむズにニッチを芋぀けたした。



C-別のC ++クロヌン。すべおの「砂糖」が埌で登堎し、有病率はWindowsぞのバむンドに基づいおいたす。 モノ Cで蚘述されたプログラムを絶察に起動するずいうタスクが達成されるず確信しおいたすか そしおこれは、.Netが独自の速床で開発されおおり、Monoがすべおに远い぀いおいるこずを考慮しおいたす。 さらに、倚くのラむブラリはWindowsず非垞に密接に関係しおいたす。



PHP / Ruby-Web開発に関連する2぀の蚀語。 倚くの人は、圌らが1぀のペアになっおいるこずを奜たないでしょうが、これは人生の厳しい真実です。 ちなみに、䞀定数のプログラマヌの間でのPHPの嫌悪は、蚀語の「悪い」構文によっお正確に説明されおいたす。 圌が他の関数型蚀語よりも人気があるこずを劚げないもの。 逆説的にですが、PHPは「単玔な」構文ずWebアプリケヌションの迅速な開発のために人気を博しおいたす。



JavaScript-Webぞのリンクを備えた別の蚀語ですが、既にブラりザヌ偎にありたす。 たた、必芁に応じお-望たない堎合は、ほずんどすべおのWeb開発者が粟通しおいる必芁がありたす。 しかし、その䞭には「蚭蚈による」誀算がありたす。 そしお、䜕も䜏んでいない。 さらに、最近では、圌はブラりザの倖に䜏み始め、独立した蚀語になり始めたした。 そしお䜕 なぜPythonよりも悪いのですか



Python / Perl-もずもず「スクリプト化」されたシェル蚀語の代替ずしお、Web指向の2぀の蚀語。 しかし、Perlは次第に短くなり、時には難解な構文のために、次第に死に始めたした。 考えおみおください。 䜕らかの構文の簡朔さの制限がただありたす。



Visual Basic-Windows / Officeプラットフォヌムぞのバむンド。



シェル-Unixぞのバむンド。



アセンブラ-任意のデバむスに察しお最も効率的なコヌドを䜜成する機胜。 繰り返したすが、倚くの評䟡では、どの機胜蚀語よりも人気がありたす。



結論は明らかです。蚀語は構文のおかげで普及したわけではなく、実甚化されたためです。 関数型プログラミングを䜿甚する珟圚の傟向は、関数型の「予期しない」発芋そのものではなく、OOPの玔粋䞻矩者が蚀語に機胜を远加しなかったずいう事実に基づいおいたす。



理由2。コヌドの行に察しお支払いを受ける



コヌド行の支払いを受け取った堎合、管理者がパフォヌマンスを正しく評䟡しない堎合この堎合のようにに問題が発生する可胜性があるため、ゞョブを確実に倉曎する必芁がありたす。



真剣に蚀えば、「コヌドの行」ずは䜕ですか たずえば、100行のコヌドを含むアプリケヌションがあり、それらを5行に枛らしたラむブラリが芋぀かりたした。関数型プログラミングはありたせん。 たた、同じこずをしお、コヌドを3、7、10、15、8行のコヌドに枛らす5぀のラむブラリを芋぀けたかもしれたせん。 最短のものを遞択する必芁がありたすか、それずも最高のサポヌト、より倚くのオプション、より良いパフォヌマンスなどを提䟛する必芁がありたすか



もっず真剣に蚀えば、䜕らかの理由で、倚くの人が簡朔さをコヌドのナニヌクな利点だず考えおいたす。 はい、C、Pearl、その他の蚀語でそのような「矎」のいやらしい䟋を芋たした。 これらはすべおゞョヌクやシャレヌドにずっおは矎しいものですが、長期にわたる開発にずっおはそうではありたせん。 誰がこれを正しく読んで理解できたすか 誰がサポヌトしたすか なぜ䞀郚の人々は、「短いコヌド」ず「良いコヌド」ずの類䌌性を匕き出すのですか ある堎合もあればそうでない堎合もありたす。



倚くの堎合、コヌドの簡朔さず明快さは䞡極性の抂念です。 コヌドが短いほど理解しにくくなり、すべおが明確に蚘述されおいるほど理解しやすくなりたす。 それは起こりたすが、その逆も同様です。 簡朔で理解可胜なコヌドを同時に実珟できたすか それはあなたが䜕を意味するかに䟝存したす。 自然蚀語を芋おください。 小説の意味を1぀のフレヌズで衚珟するこずは可胜ですか おそらく、それはおかしくなりたす。 分詞タヌンオヌバヌを動詞たたは他の構文で眮き換えるこずは可胜ですか もちろんできたすが、それはスタむルの問題です-そしお、あなたは垞に自然蚀語の遞択肢がありたす。



簡朔さはプログラミング蚀語に䟝存しおいたすか サブゞェクト領域の動䜜を蚘述する関数たたはメ゜ッドの呌び出しが3぀ある堎合、それが䞍可胜な堎合、それらを1぀に眮き換えお眮き換えるこずはできたせん。 そしお、可胜であれば、プログラミング蚀語でそれらを枛らすこずは問題ではありたせん。 そしお、それはプログラミング蚀語の構文に本圓に䟝存しおいたすか 独自のアルゎリズムを蚘述する必芁がある堎合、この問題を解決するラむブラリの存圚を知らないか、ラむブラリにそのようなラむブラリがないか、この問題を解決する独自のラむブラリを䜜成しおいたせん。 たた、ラむブラリ呌び出しは、句読点の圢匏のryushechokを陀いお、ほずんどすべおの蚀語で同じように芋えたす。



理由3.䞭かっこが倧奜き



そのような「深刻な」議論に驚いた。 この蚀語でかなり長い間䜜業しおいる堎合は、すべおの括匧を自動的に配眮したす。倚くの堎合、線集者自身がこれを行いたす。 それでは、どのような違いがありたすか さらに、倚くの堎合、1行のコヌドブロック条件たたは反埩埌でも、ブロックの境界がはっきりず芋えるように䞭括匧を配眮する必芁があり、コヌドが間違ったブロックに挿入されたずきの゚ラヌが少なくなるこずを確信しおいたす。



理由4.明瀺的な型が芋たい



明瀺的な型を芋るのは奜きではありたせんが、コンパむラが明瀺的な型を芋るのは奜きです。 私は圌に型の制埡を倱いたくありたせん。 それは倚くの状況で私を守りたす。 しかし、もちろん、型が暗黙的であり、すべおが䜕らかの圢で舞台裏で機胜する堎合は矎しいです。 しかし、矎しさの代償すべおがどのように機胜するかを正確に制埡できなくなりたす。 倚くの堎合、矎しさの代䟡はパフォヌマンスず暗黙の操䜜です。 そしお、はい、メ゜ッドが私が曞いおいないラむブラリ、たたはプログラムの他の堎所で宣蚀された倉数を含む匏のタむプから返っおくるのを芋たいです。 これが文字列なのかオブゞェクトのリストなのか疑問に思わない。



理由5。バグを修正したい



理由6.デバッガヌに䜏んでいる



これらはおそらく最も深刻な議論です。 これが本圓なら、䜕癟䞇人もの開発者がすぐに関数型蚀語に切り替えたいず思うでしょう。 しかし、私はこれがそうであるこずを疑わせおください。 なぜ関数型蚀語の支持者は、 ここずここのバグが少ないず思うのですか。 匕数は次のようになりたす



-れロなし静的コヌド分析により解決

-䞍倉デヌタすべおのプログラミング蚀語で利甚可胜ですが、特にパフォヌマンスずメモリ割り圓おの問題に関しおは、このアプロヌチを垞に䜿甚できるずは限りたせん

-非垞に厳密な型システム「非垞に」はすでに䞻芳的な蚀葉なので、この議論は著者の良心に任せたす

-小さな関数の構成ラムダ関数は既にCおよび他の蚀語であり、Javaですぐになりたす

-非同期プログラミングの抜象化これは抜象化の問題にすぎず、ラむブラリを䜿甚しおすべおを実行できたす

-コレクションの高階関数Cおよび他の蚀語で利甚可胜、Javaで提䟛されたす

-枬定単䜍Fに有効、すべおのタスクに適甚䞍可

-操䜜の順序はコヌドで明確に衚珟されおいたすプログラミング蚀語で䜿甚するこずは問題ではありたせんが、このアプロヌチを䜿甚するかどうかを遞択できたす



䜕らかの理由で、ここでのすべおの゚ラヌはむしろコヌドたたはデヌタの゚ラヌになりたすが、私の経隓から、ほずんどの゚ラヌは動䜜、ルヌル、オブゞェクト間の盞互䜜甚に関連しおいる可胜性が高いです。 フィヌルド5でアルゎリズムを取埗したが、3である必芁がある堎合、プログラミング蚀語の違いは䜕ですか このような゚ラヌは、「良い」構文ではなく、単䜓テストずテストによる開発で適切に凊理されたす。 機胜的スタむルの実践者にずっおは、 TDDはREPLに眮き換えられたすが、コヌドの意味が蚘述埌に䜕床も倉わる可胜性がある堎合、REPLがどのように圹立぀かは明らかではありたせんか



これらの議論は、ガベヌゞコレクタヌを備えた蚀語のバグのない「矎しい生掻」の玄束を連想させたす。 はい、メモリのあいたいなバグはほずんどありたせんが、抂しお、それらは䟋倖ポむンタ0に倉わりたした。 はい、メモリリヌクはずっず少なくなっおいたすが、抂しお、それは長寿呜のアプリケヌションでただ発生しおいたす。 もちろん、メモリ割り圓おに぀いお考えるこずは少なくなりたしたが、たったく考える必芁がないずは蚀えたせん。



理由7。すべおの小さなこずを考えたくない



再び感情的な議論。 これはすべお、蚀語ではなく開発者に䟝存したす。



理由8. nullをチェックしたい



非垞に物議を醞す議論。 掘り手が持っおいるアルゎリズムに埓っお、穎を掘るタスクがあるず想像しおください。 れロの類䌌点は、掘り出し人がいないこずです。 そうでない堎合は、はい、タスク党䜓を䞭断したいのですが、これは䟋倖です。 たるで掘り出し人がいるかのように静かに凊刑したくありたせんが、穎は掘られおいたせん。 そのような状況は関数型蚀語でも远跡されるず蚀うでしょう。 しかし、すみたせん、それではどのような違いがありたすかれロたたは他の䜕かをチェックしおいたすか 良いこずも悪いこずもありたすが、れロのチェックには時々セマンティクスがあり、単にオブゞェクトの存圚をチェックするだけではありたせん。 はい、すべおのプログラミング蚀語では、nullの代わりに架空の空の倀Nullオブゞェクトテンプレヌトを返すこずができたすが、実行する䟡倀があるかどうかを慎重に怜蚎しおください。明癜な゚ラヌは暗黙的な゚ラヌよりもキャッチしやすいです。



理由9.どこでもデザむンパタヌンを䜿甚しおいる



倚くの蚭蚈パタヌンがオブゞェクト指向プログラミングの機胜の結果であるこずは本圓に秘密ですか そしお、クロヌゞャヌ、モナド、カリヌ化は関数型プログラミングのパタヌンだけではありたせんか そしお、倚くの関数型プログラミングパタヌンがただ先を行く可胜性がありたす。



理由10.数孊が倚すぎる



これはむしろ感情的な議論でもありたす。 数孊は、あらゆるプログラミング蚀語に察応しおいたす。 もう1぀は、関数型プログラミングの矎しさを蚌明するために、玔粋な数孊の䟋たたはアルゎリズムの問​​題のみを瀺すこずが倚いこずです䞊べ替えアルゎリズム党䜓が数孊に分類されるかどうかさえわかりたせん。 しかし、2010幎代に誰がアルゎリズムの問​​題を解決したすか Knutの本は40幎以䞊前のものですが、ただ゜ヌトアルゎリズムを曞いおいたすか ラむブラリを䜿甚し、車茪を再発明しないでください。



モナドやファンクタヌが他の人が理解する䞊で問題になるかどうかは評䟡できたせんが、もしそうなら、関数型プログラミングは遞挙の運呜であり続ける運呜にありたす。 これらの遞択されたものを喜ばせるよりもむしろ悲しむべきもの。 これらの抂念を習埗できる人が少ないほど、関数型蚀語の可胜性は䜎くなりたす。 Lispはすでに50歳であり、圌はただ最高の時間を埅っおいたす。 たた、垞に遞挙の継承でした。 考えおみおください。



おわりに



もちろん、機胜的なスタむルには明るい未来がありたす。 むしろ、20幎前にはなかったこずは驚くべきこずです。 さらに驚くべきこずは、最初の関数型蚀語の登堎から60幎埌にそれを蚀うこずです。



おそらく、プログラミング蚀語の蚭蚈者は20幎前に、抂念の明確な混乱は問題に満ちおいるか、単に蚀語の「玔床」を維持したいず考えおいたず考えおいたした。 しかし、2010幎代の䞭庭では、倚くのパラダむムの蚀語がショヌを支配しおいたす。 そしおそれは良いこずです。 抂しお、最初に「名詞」OOPのようにを䜿甚するか、「動詞」OFのようにを䜿甚するかは私の遞択です。 オブゞェクトず関数のどちらかを遞択したくないので、タスクに応じおそれらを䜿甚したす。



実際、玔粋な関数型プログラミングは、その「矎しさ」によっお倚くの人を怖がらせたす。 ここで、C ++、Java、Cずは異なり、「クリヌンな」OOP蚀語でもあるSmalltalkの歎史を思い出すず䟿利です。 しかし、手続き型アプロヌチの芁玠を砎棄しなかった蚀語ずは異なり、圌は決しお「離陞」したせんでした。 䞀郚には、すべおのタスクで「クリヌン」なアプロヌチが必芁なわけではなく、堎合によっおはたったく適甚できないこずもありたす。 さらに、これは通垞、舞台裏で暗黙的な操䜜を䌎う抜象化の䜿甚を意味し、通垞はあたりパフォヌマンスが䜎䞋する恐れがありたす。 そしお、実際に、論理蚀語PrologなどたたはLispでのWeb開発でGUIを実装するタスクに出䌚った堎合、「プッシュ䞍可胜なものをプッシュする」こずの耇雑さを自分で認識しなければなりたせん。 ただし、元の蚘事で蚀及されたFも倚くのパラダむムの蚀語であり、「玔粋な」関数型蚀語ではないこずに泚意しおください。



おそらく、別の傟向に感心するかもしれたせん。JVMたたは.Netプラットフォヌムに基づいた倚数のプログラミング蚀語です。 もちろん、これは任意の構文糖で曞くこずができたすが、同じバむトコヌドを取埗できるプラスです。 ただし、それはすべおプログラミング蚀語の実装に䟝存したす-単䞀の呌び出しに倚方向の組み合わせを䜿甚したり、リフレクションに基づいたりするこずができたす。これにはパフォヌマンスの問題が䌎いたす。 たた、この倚様な蚀語が必芁なのは誰ですか 異なる角かっこ、コンマ、コロンのみを持぀10個の関数型プログラミング蚀語が必芁なのはなぜですか いいえ、本圓に。



1日で新しい蚀語で最も簡単なプログラムを䜜成し、1週間で倚かれ少なかれ曞くこずを孊び、1か月で孊び、1幎でよく孊ぶこずができたす。 結局のずころ、問題は構文だけでなく、倚くのニュアンス、「正しい」関数の「正しい」呌び出しなどにもありたす。 なぜ、ある蚀語から別の蚀語にスキップするのですか そしお、すべおのプロゞェクトでどうでしょうか そしお半幎ごずに もちろん、これは知的挑戊です。 しかし、すべおの雇甚䞻が知的挑戊に察するあなたの内郚ニヌズに支払うこずに同意するかどうかは疑問です。 それは雇甚䞻の問題ではなく、あなた自身の問題でもありたす-毎回、察象分野の問題ず新しいプログラミング蚀語を入力する問題を同時に解決しなければなりたせん。 それに応じお、あいたいな未来が埅っおいたすおそらく、新しい蚀語は将来必芁になるこずはないでしょうずあいたいな過去以前の蚀語での経隓を既に忘れおいる可胜性がありたす。 ここでも、コヌドサポヌトの問題が発生したす。コヌドを理解しおいる人、たたは最短時間で理解を習埗できる人を芋぀ける方法です。



しかし、歎史に目を向けるず、バビロニアの蚀語矀は垞にそうでした。 生たれた人もいれば死にかけた人もいたす。 AlgolたたはPL / 1を芚えおいるのは誰ですか しかし、他にもたくさんありたした。 プログラミング蚀語には独自の進化があり、その䞭で最も匷力なものが生き残りたす。 そしお最匷のものは、矎しい構文を備えた蚀語ではありたせんが、必芁な蚀語です。 このような関数型蚀語の必芁性は、 ここで説明するように、開発時間の短瞮ずバグの数の削枛に関連する可胜性がありたす 。 ただし、䞊蚘の蚌拠は特定のプロゞェクトが真空状態にあるこずに基づいおいるため、コヌドの行数が䜕を意味するのかは完党には䞍明です。 したがっお、この蚘事のトピックに察する答えは、「はい」ではなく「いいえ」ですが、将来は私たちを刀断するでしょう。



All Articles