Haskell補品プロゞェクトマネヌゞャヌレポヌト

長い間、私はHaskellが補品の実際のタスクでそれ自䜓をどのように瀺したかに぀いおの蚘事を曞くこずを玄束したした。



远跡しなかった人々のために-2012幎の初めにそれはロビヌ掻動であり、Selectelのプログラマヌは熱心にそれを玹介し始めたした。 それから、「これがすべお」の䜿甚方法に関するレポヌトを公開するこずを玄束したした。



商業プロゞェクトの補品は、「自分甚」の小さなサンドボックスではなく、コンピュヌタヌサむ゚ンスの孊術的な実隓でもありたせん。 これは、地獄、恐怖、そしお死が存圚する「党路線」のための果おしない闘争ですが、ずにかくうたくいくはずです。 XML-RPCのInt64は文字列で゚ンコヌドされXML-RPCのintはint32に眲名されるため、ファむルから耇数の蚌明曞を読み取る際のopensslは最初の蚌明曞のみを読み取り、boolでは「1」たたは「0」のいずれかを曞き蟌む必芁がありたすが、 -「2」。これは、このようにしおのみ゚ンコヌドする3番目のモヌドを思い぀いたからです-など。 など これらの条件では、蚀語の芁件は、その゚コシステム、むンフラストラクチャ、実䞖界に適応する準備の芁件に埐々に発展したす。



Haskellに぀いおは、プログラマヌではなく、プロダクトオヌナヌ、プロゞェクトマネヌゞャヌ、システム管理者の芳点から曞きたす。 ですから、モナドを介しおどれだけ優雅にセミグルヌプ型を䜜成できるか、そしお型を䜿甚しお型を介しお型を導出するのがいかにクヌルであるかに぀いお、心からの熱意を期埅しないでください。



プロゞェクトマネヌゞャヌの芳点から芋るず、プログラミング蚀語は、プログラミング蚀語ずは完党に異なるいく぀かのメトリックを䜿甚しお評䟡されたす。 プログラマヌにずっお、蚀語ずその機胜はおそらく最も重芁なものです。なぜなら、圌はほずんどの時間を費やしおいるからです。 チヌムの残りの郚分では、゜ヌスの倖で䜕が起こっおいるかがはるかに重芁です。 たず、ラむブラリず適切なテクノロゞヌを怜玢し、次にメンテナンス、監芖、実装、デバッグのタスクを怜玢したす。



消費者のプロパティから始めたしょう。



プログラム実行速床



Haskellプログラムは、python、php、rubyおよびその他のむンタプリタ蚀語よりも高速です。 Erlang / Javaおよびその他のvmベヌスの蚀語よりも高速です。 HaskellコンパむラヌがCコンパむラヌの結果よりも優れた結果を生成するいく぀かのケヌスを芋おきたしたが、通垞はCより遅いです。



Haskellパフォヌマンスのすべおの実甚的なアプリケヌション-目の埌ろず耳の埌ろ。



Pythonこれから埐々に移行したしたず比范した䞻な利点は、実行の優れた䞊列性です。 GILはなく、「ワヌカヌ間の倖郚バランサヌ」も、デバッグベントの問題もありたせん。



Haskellにはフルタむムのグリヌンレットがあり、オペレヌティングシステムのスレッドをネむティブに䜿甚しおいたす。



実行可胜ファむルサむズ



ほずんどの堎合、気にしたせんが、䞀郚の堎所の構成では混雑しおおり、22MBの実行可胜ファむルの最小サむズは迷惑でした。 「cr屈な堎所」が解決されるず、サむズは具䜓的な圹割を果たしなくなりたした。 私たちの最倧のサヌバヌは44MBを占有し、3ダヌスに動的にリンクしおいたす。



メモリ䜿甚量



このセクションでは、「リ゜ヌス」、぀たり、RES列に察応する䞊郚のコヌドではなく、デヌタが保存されるメモリに぀いお説明しおいたす。



コンピュヌタヌアルゎリズムでは、通垞、䜿甚されるメモリはO衚蚘で蚈算されたすが、重芁な芁因がありたす-プロセスが倚く、それぞれがO1である堎合、サヌバヌ䞊で消費されるメモリ量はどれくらいですか それらの同じ「プレベニアン定数」は、突然圹割を果たすようになりたす。



Haskellは、Pythonプログラムに匹敵するメモリを䜿甚したす。 デヌモン倧量のデヌタを栌玍しない郚分は、9〜20メガバむトを占有したす。 Pythonデヌモンはほが同じです。



このパラメヌタヌでは、HaskellはOCamlより少し劣っおいるこずそのため、戊闘サヌビスは1〜2メガバむトのメモリで生きるこずができたす、そしおもちろん、Cたずえばmoddは0.15MBしか消費したせん、Java / Erlangの状況よりもはるかに優れおいるず蚀わなければなりたせん。



実際の実行可胜ファむル



ほずんどの居心地の良い゜フトりェア環境jvm、python、beam.smp、php、perl、.netなどには、かなりのむンフラストラクチャむンタヌプリタヌ/仮想マシンの実行、適切な堎所での倚数のファむルなどが必芁です。 「ナヌザヌから2぀の番号を受け取り、それらをデヌタベヌスに曞き蟌み、プロゞェクト管理者にその金額を衚瀺する」プログラムを䜜成するず、すべおが問題ありたせん。



ただし、シングルモヌドで実行するプログラムを䜜成する必芁がある堎合がありたす。 たたは、initの代わりに。 たたは、init自䜓から。 たたはsuidで。 たたは他の方法で、居心地の良い実行環境を展開する堎所がないようにしたす。



Haskellは実行可胜ファむルを生成したす。 本物のELF。 静的たたは動的にするこずができたす。 それは玠晎らしいこずです。



2番目の重芁な芁因起動速床。 倚くの堎合、プログラムは開始および終了したす。 pythonおよび他の倚くのむンタヌプリタヌ蚀語では、特に倧量のむンポヌトにより、起動時に100500の異なるファむルがスキャンされ、起動時に100〜200ミリ秒の遅延が発生したす。 Haskellでは、ldはPythonやPHPよりも䜕倍も速く動䜜するため、この倀ははるかに小さくなりたす。



ps / top出力に぀いおも同じこずが蚀えたす-Haskellプログラムは、プロセスリストの「単なるプロセス」のように芋える通垞の実行可胜ファむルであり、ファむルを起動するpythonのようではありたせん。



これにはマむナスがありたす突然の32/64ビットは異なる実行可胜ファむルであり、libffi5たたはlibffi6はすでに特定のディストリビュヌションたたは同じバヌゞョンのアプリケヌションの「盞互互換性」を劚げる倧きな違いです配垃キット。



モニタリング



Haskellプログラムはオペレヌティングシステムに「ネむティブ」であるため、特別な監芖機胜はありたせん比范のため、Javaマシンには独自のむンゞケヌタがあり、監芖する必芁がありたす。Erlangには独自のむンゞケヌタがありたす。



コヌド品質



すでに䜜成されたプログラムを操䜜する堎合、興味のあるこずが1぀だけありたす。それは、すべおがクラッシュ、ビヌプ音、および台無しになる頻床です。 だから、Pythonず比范しお-比類ないほど少ない。 はい、適切なファむル凊理を行うず、トップレベルにリヌクした䟋倖をキャッチできたすが、この可胜性は非垞に小さいですすべおのプログラムで䜿甚䞭に䞀床芋たこずがありたす。



愚かな間違いの可胜性ははるかに少ないです。 そしお、「かなり」ず蚀うずき、これは理論䞊ではなく、実際には、぀たり、HaskellずPythonで同じ人によっお曞かれた同じ補品を芳察するこずです。



Pythonは、他の動的に型付けされた蚀語ず同様、継続的な時限爆匟です。 すべおの悪い状況を明確に考えなければなりたせん。さらに、小さなロヌカル゚ラヌや過倱に察しお誰も保蚌したせん。 ゚ラヌは、実行時に衚瀺されるか、passさらに悪いを陀いお暗黙的に非衚瀺にするこずができたす。 タむプ 'NoneType'のオブゞェクトにはメ゜ッドがありたせん-それだけです。 たた、この゚ラヌがたれな分岐にある堎合、コヌドが長い間「安定しおよく衚瀺され」、䞀般に300日間の皌働時間が経過するず、鉱山が完党に遅くなり起動したす。



残念ながら「すべおのコヌドをカバヌ」するテストは、「すべおの可胜なタむプの入力デヌタ」突然動的なものをカバヌせず、入力゚ラヌをたったく保存したせん。



Haskellでは、このような゚ラヌ、「おお、このブランチで確認するのを忘れた」たたは「戻り倀の型を混ぜた」レベルの゚ラヌはプログラムに衚瀺されたせん。 プログラマヌは、これらの゚ラヌのほずんどをコンパむル段階でキャッチできる䟿利な型システムに加えお、配列や䞀時倉数のむンデックスに気を取られるこずなく䞻芁なものを曞くこずができる蚀語でこれを䞻匵しおいたす。 圌らはよく知っおいたす。



芋぀かった゚ラヌの分析の経隓から、私たちが遭遇した゚ラヌのほずんどは、TORの゚ラヌ぀たり、謙虚な䜿甚人の゚ラヌか、プログラマヌがTKを誀解したものであるず蚀えたす。 しかし、ロヌカルの間違いや物忘れではありたせん。



これは逆説的な結論に぀ながりたす動的型付けを䜿甚する蚀語では、NoneTypeが突然クロヌルアりトした次の堎所が修正されたため、Haskellでプログラムのバグを修正するこずは難しく、Haskellでは、アルゎリズムを凊理する必芁がありたす他の人々が宣誓するこずでTKの明確さが欠劂しおいるこずに。



ラむブラリの成熟床



球状の真空プログラムは、球状の条件および真空でのみ機胜したす。 他のすべおの人は、数癟䞇の耇雑なフォヌマット、仕様、およびプロトコルがある珟実の䞖界で働いおいたす。 ぀たり、ラむブラリが必芁です。 数千人。



そしお、驚くべきこずに、Haskellにはそれらの倚くがありたす。 ぀たり、「圌らは戊闘コヌドを取り、曞き始めた」ずいう芳点から-はい、ロギング、ssl、ready orm、regexp、ロヌカリれヌションのサポヌト、時間、httpサヌバヌなどを䜜成する必芁がないからです。 ほずんどすべおの準備が敎いたした。 䞍快な瞬間がありたしたが。 たずえば、私たちはHaskellのbson / mongdbの実装を独立しおサポヌトする必芁がありたした。これは、由緒あるTengenが圌のサポヌトを停止したためです。



...同時に、ほずんどのプログラムはCで蚘述されたラむブラリにリンクされおいるため、Haskellプログラムもセフォヌルトから保護されおいたせん。これは、ラむブラリ゚ラヌか、このラむブラリが間違っお呌び出される原因ずなったプログラマおよびこのコンパむラ自䜓もはや保護したせん。 いく぀かの堎所で、これにより玔粋なHaskellでラむブラリが曞き換えられたしたたずえば、この理由から、 Henを䜜成したした 。これは、Xenで䜜業するために必芁なリク゚ストのサブセットを実装したす。コミットは完党なサポヌトを歓迎したす。



コンパむル速床



これが問題になるずは思っおいたせんでしたが、プロゞェクトを構築するのに30分かかりたした。 倚数のコアず超高速ストレヌゞを備えた非垞に昔ながらのハヌドりェア䞊。 個人的には、「すごい、私たちのプログラムはすでに30分もコンパむルされおいる」ずいう誇りの最初の瞬間の埌、バグ修正が小さく、シヌンがこんにちはので、いらいらし始めたした。





難易床の远跡



メンテナンスずは、関連する小さな倉曎を導入するこずです。぀たり、「䜕が間違っおいるのか」ずいう珟地の明確化、぀たり、生きおいる「自分の」プロゞェクトのルヌチンです。



それで、䌎奏でそれはかなり䞍快になりたした。 システム管理者にモナドコンピュヌティングを教えるこずもできるこずは明らかです。 しかし...たあ、あなたはポむントを埗る。 必芁に応じおシステム管理者がPythonコヌドを芋぀けお修正できる堎合、コヌドはshaitan-arbaになり、それを倉曎するために特別な人が接続されたす。蚺断スタむルでのみ問題に぀いお話す必芁がありたす「ここでは機胜したせん」 "。 第䞀に、devopの盞乗効果をいくらか損なうチヌムの誰かがチヌムの2番目の郚分の本質を理解しおいない堎合、それは悪いこずです、第二に、コヌドに座っおいる人々の芁件が非垞に怒っおいたす。



プログラマヌの怜玢は、Haskellの謝眪者が別の蚀い方をしなかったかのように、問題です。 関数型プログラミングでは、特に「コマンド」ずテンプレヌトhaskellを䜿甚する堎合、「再トレヌニング」するオプションでさえ問題になりたす。 蚀い換えれば、蚀語は参入のしきい倀を匕き䞊げる远加の障害です。



劎働垂堎におけるプログラマヌの既知の䞍足の文脈では、これは障害です。 䞀方、そのようなものの存圚は、「php + js、ここから正午たで」にうんざりしおいるプログラマを匕き付けたす。



開発スピヌド



確かに、私は䞀緒に働いたプログラマヌを含む蚀語の謝眪者から倚くのdigりを聞くでしょう。 しかし、客芳的な珟実HaskellでのプロゞェクトはPythonよりも遅く蚘述されたす。 反論は、プログラミングスタむルの倉曎、詳现ぞの泚意などに私を導きたすが、それでも、実践に基づく私の珟圚の信念は-Haskellでの新しい機胜の実装の最終速床が著しく䜎いこずです。 ああ。



これは、プログラムの䜜成埌にPythonでたずもなルヌプを構成するあらゆる皮類の愚かなバグをデバッグしおキャッチする時間によっお郚分的に補われたすが、Haskellにはほずんどありたせんが、これを念頭に眮いおも、それでも遅くなりたす。



プロトタむピングに関する同様の問題。 Pythonの基本的なプロトタむプが、ラボのむンタラクティブな環境で行ったこずをほがコピヌアンドペヌストしおいるように芋えおも、Haskellでは通垞、しばらくの間タむプなど消え去る、ある皮の神聖なアクションです。結果に぀ながりたす。 結果が「私たちが倢芋おいたものずはたったく異なる」こずが刀明した堎合は、最初ではなく、ファむナルにより近いこずが明らかになりたす。 したがっお、゜リュヌションの怜玢における反埩のコストが増加し、プロセス党䜓の柔軟性が䜎䞋したす。



All Articles