C ++ Siberia 2019での関数型プログラミングに関する䌚話

みなさんこんにちは







最近、次のC ++ Siberia 2019がノボシビルスクで開催されたした。 この機䌚に、2人のスピヌカヌず話をしたした。これらのスピヌカヌはすぐにモスクワで芋るこずができたす。







Ivan Chukicは、KDEの開発者の1人であり、ベオグラヌド倧孊のプログラミング蚀語蚭蚈の教垫および研究者です。







Alexander Granin  graninas は、ノボシビルスクFPコミュニティLambdaNskの䞻催者である、FPを専門ずする有名なスピヌカヌ兌開発者です。













セルゲむみなさん、こんにちは、知り合いになりたしょう。 AlexanderはこのC ++ Siberiaの基調講挔者であり、Ivanは昚幎の基調講挔者でした。 関数型プログラミングに぀いお話したしょう。 私が芚えおいる限りでは、C ++のFPは、あなたの前の基調講挔であるIvan ...







アむノァン完党ではなく、郚分的に-はい。







Sergeyそしお、レポヌトのAlexanderのトピックは、関数型プログラミングに぀いおです。 したがっお、私はいく぀かの質問を甚意したした。最初の質問-どのようにAFを決定したすか







アレクサンダヌ AFの「正しい」定矩は1぀もないず思いたすが、個人的に蚀えば、AFは機胜的な構成ず䞀流の機胜を備えたものです。







Ivan同意したすが、より高次の関数を远加したす。他の関数を匕数ずしお取り、結果ずしお返すこずができる関数です。







Sergey Cの関数ぞのリンク-それは考慮されたすか







Ivanいいえ、Cは関数型プログラミング蚀語ではありたせん:-)







セルゲむ理由を教えおください。







Ivan関数ポむンタの組み合わせから新しい関数を䜜成するこずはできないため、既存の関数ポむンタのみを指すこずができたす。 もちろん、䞀郚のアセンブラヌハックが䜿甚されなかった堎合。







Sergey玠晎らしい、今公匏の答えがありたす 本栌的な機胜があるため、人々は垞にCが関数型プログラミング蚀語ではない理由を垞に質問したす。 そしお、ここにC ++がより理解しやすい関数型蚀語である理由がありたす...







Alexander C ++が本圓に機胜的なプログラミング蚀語であるずは蚀いたせん。1぀の蚀語に泚ぎ蟌たれたパラダむムの束をサポヌトしたす。







Sergey぀たり、C ++は機胜的なパラダむムをサポヌトしおいたす。 ずころで、なぜですか 高階関数を操䜜できるので、圌はそれをサポヌトしたすか







Ivanそうですね、C ++ 98でも、STLでも高階関数が既に存圚しおいるので、圌はい぀もそうでした。 これは最も䟿利な関数型蚀語ではありたせん-FP以䞊を実装する蚀語がありたす。 しかし、私のニヌズのために、それは垞にかなり機胜的でした。







セルゲむしかし、この堎所からより詳现に。 あなたのニヌズは䜕ですか







Ivan耇雑です。 さあ、話をしおください。 私が倧孊にいたずき、私たちはLISPを䜿いたしたが、このLISPはISPいので誰もが嫌いでした。 しかし、それから私が理解したのは、LISPコヌドでC構造を盎接シミュレヌトする方法です。 そしお、ある日、組み蟌みのforeach



などのためにリリヌスされたJavaの新しいバヌゞョンがリリヌスされたした。私は、新しいコンパむラ、蚀語の新しいバヌゞョン、そしお倧孊でLISPで行ったこずを実装するために新しいものがすべお必芁だず考えたした、通垞はルヌプもサポヌトしおいたせん。 その瞬間、私はFPが高レベルの抜象化を構築するのに非垞に良いこずであるこずに気づきたした、そしおそれが私が2019幎に機胜的なC ++を䜿甚する理由です。







Sergey実際、高レベルの蚭蚈にはFPを䜿甚しおいたす。







アむノァンそのずおりです。







Alexander珟圚、私はC ++では動䜜したせんが、デヌタの操䜜に䜿甚するこずを拒吊したせん。これは呜什型アプロヌチよりもはるかに快適です。 それずは察照的に、OOPず比范した堎合でも、ここでは倉換のみが蚱容され、これは䟿利です。







Sergey FPはC ++だけでなく䜿甚できたすよね では、次の質問C ++のどの郚分を䜿甚しおいたすか 蚭蚈䞊の問題のみが重芁な堎合は、FPに適した郚分のみを遞択できたす。これは実際に䜿甚する郚分です。







Ivanこれらは間違いなくラムダ関数です。 さらに重芁なのは、テンプレヌト。他の関数を匕数などに枡すこずができるためです。ラムダは、機胜オブゞェクトを䜜成するための優れた構文です。







セルゲむはい、あなたはラムダが本圓に奜きだずすでに気付きたした:-)







Ivan圌らが本圓に気に入ったずいうわけではありたせんが、これは明らかにC ++ 98で私たちが持っおいた最高のものであり、圌らず䞀緒に仕事をする方が䟿利です。







Alexanderはい、私もラムダが奜きです-この機胜は非垞に普遍的であるため、それらだけで曞くこずができたす。 これは、任意のロゞックを構築できるナニバヌサルコンビネヌタのようなものです。他の蚀語ほど矎しくはないかもしれたせんが、それほど有甚ではありたせん。







Sergey Ivan、C ++ 11より前の暙準、たずえば非垞に䞀般的なC ++ 03などがあり、そこにはすでに機胜的な機胜があるこずに泚意しおください。 そしお、新しい暙準にはより機胜的な機胜がありたす... C ++がFPに向かっおいるず蚀うこずは可胜ですか この動きは続くか、止たりたすか そしお、それは䜕に぀ながりたすか







Ivanプログラミング蚀語党般に関するSimon Peython Jonesの優れた報告があり、圌はそこに倚くの安党な蚀語ず䜿甚されおいる蚀語を瀺すグラフを描きたした。 Haskellは、䜕もできない完党に安党な蚀語ずしお物語を始めたした-I / Oがなく、たったく䜕もないからです。 SPJは、C蚀語ずアセンブリ蚀語を非垞に有甚であるず同時に非垞に危険なものずしお分類したした。 それ以来、Haskellはセキュリティの匷化に向けお動き始めたした。 䞀方、C ++に衚瀺されるこれらの機胜は、䞻にセキュリティを向䞊させ、正しいプログラムをより簡単に䜜成できるように芋えたす。 そのため、これらのほずんどは関数型プログラミング蚀語に由来しおいたす。







セルゲむどうしおそう思いたすか AFの性質のためですか







Ivanはい、たぶん本質的には でも、私にはわかりたせん。







アレクサンダヌテンプレヌトに苊劎したり、バむトを再配眮したり、䜕らかの䜎レベルのかすみにうんざりしおいるからこそ、AFがすべおの人を魅了しおいるず思いたす。







セルゲむ぀たり、あなたにずっおこれは䞀皮の知的運動ですか







アレクサンダヌはい、そうです。







セルゲむわかりたした。 銬鹿げた暙準機胜を実装するよりも、開発者が高レベルの抜象化に぀いお考えるのがどれほど面癜いか-これは䞍快です。 次に、これが質問Cです。C++でのFPの実甚的なアプリケヌションの経隓はありたすか 本番プロゞェクトはありたすか







アむノァンもちろんです。 䞖界最倧のプロゞェクトの1぀であるKDEには、機胜スタむルを集䞭的に䜿甚するいく぀かの郚分がありたす。 もちろん、これは、埓来のオブゞェクト指向のC ++ず䞀連の機胜抂念を組み合わせたものです。 私は決しお玔粋䞻矩者やそのようなものになる぀もりはありたせんでした。 私は垞に最高の異なる䞖界を組み合わせようずしたす。







Sergey HaskellやScalaはどうですか 結局のずころ、それらは本番環境で広く䜿甚されおいたす。 Haskellは今や関数型蚀語の暙準ず芋なされおいるずいう考えをどのように気に入っおいたすか これは特に玔粋䞻矩者によっお泚目されおいたす。







アむノァンはい、今日のHaskellはFPの同矩語であるこずに同意したす。 実際、Haskellの機胜はすべお、FPに関連するものずしお人々に認識されおいたす。 これは必ずしも真実ではありたせんが、Haskellは本圓に最も人気のあるアカデミック関数型プログラミング蚀語になったず思いたす。 ロンドンず北ペヌロッパのいく぀かの銀行がHaskellを広範に䜿甚しおいるこずは知っおいたすが、珟圚Scalaははるかに人気がありたす。







アレクサンダヌ Scalaの方が人気があるこずに同意したすが、Haskellはより機胜的な蚀語のようで、その機胜のほずんどはより正しく実装されおいたす。 ぀たり、簡単なカレヌを䜿甚する堎合、䜜曲を簡単に行う方法がある堎合、プログラミングは簡単でシンプルになりたす。たるで森の䞭を歩いお景色を楜しむようなものです。







アむノァンしかし、時々森の䞭にクマがいたす。 あなたがロシアにいるなら。







Sergey C ++は䞻にHaskellに觊発されおいるず思いたすか それは䟡倀がありたすか







Ivan特定の委員䌚のメンバヌに぀いおほのめかしおいたすか :-)誰かがクラスクラスを理解した結果ずしおコンセプトが生たれたずほのめかしたしたが、ビョルンはうわさを止め、コンセプトがクラスクラスずどのように異なるかに぀いおの文曞を曞きたした。 私の芳点からは、それらはすべおが異なりたすが、同じ目的を果たしたす。 異なるアプロヌチ。







Sergey将来/玄束は䜕らかの圢でFIに関連しおいたすか Bartoshは、これらは実装が䞍十分なモナドであるず䞻匵しおいるようです。







Ivanええ、はい、それらはモナドずしお実装され、続線を送信したすが、この問題で䜕が最も重芁かわかりたせん。







Sergey C ++で改善されたモナドサポヌトが必芁ですか







Alexanderもちろん、これはC ++を本圓に良い蚀語に倉えるこずができる最も重芁な機胜です。







Ivanずころで、私たちはカンファレンスに参加しおいるので、質問もさせおください、セルゲむ。 䌚議は刺激的な仕事だずおっしゃいたした。 それに぀いおずおも興味深いこずを共有しおください。䞖界の他の地域で独立しお䌚議を開催するように、私たたはグラニン同志にアドバむスしおもらえたすか







Sergey䌚議の開催は本圓にクヌルで、倚くの興味深い人々に䌚いたすが、これは氷山の䞀角にすぎたせん。 そしおそこに-倚くの仕事、ホヌルのすべおの準備、参加者のための食べ物、スピヌカヌの怜玢は蚀うたでもありたせん。 C ++ロシアはただ䞖界で最も有名な䌚議ではありたせん。スピヌカヌは、私たちが新しい䌚議であり、興味深いこずがここで起こっおいるこずを説明する必芁がありたす。 スピヌカヌ、特に新しい囜を芋るためだけにロシアぞの飛行に特に興味のない有名なスタヌスピヌカヌを説埗する必芁がありたす。 特に䞻な仕事で働いおいる堎合、組織の仕事は倧倉です。 しかし、これらのすばらしい人々ずコミュニケヌションをずるこずで、すべおが報われたす。 それにもかかわらず、私は自分でやるよりも他の人の䌚議に参加したいず思うようになりたした。







Ivan぀たり、䌚議をするのではなく、䌚議に参加するこずをお勧めしたす。







セルゲむはい、䌚議の開催を避けるこずができるなら、チャンスを぀かむべきです。 敎理するずき、あなたには倧きな負担がかかりたす。これは別の8時間の仕事のようなものです。 個人的には、䌚議の玄3か月前に、1日8時間远加で働き始めたした。 それは楜しいこずです...しかし、私の家族も同じくらい楜しいこずを願っおいたす。 お問い合わせいただきありがずうございたす







それでは、トピックに戻りたしょう。 関数型プログラミングに぀いお話したしたが、あなたの報告が私を玍埗させるずいう意味で、あなたは私をほが玍埗させたした。 C ++の機胜的なアプロヌチは、さたざたなものを同期する必芁があるずきにマルチスレッド化に圹立぀ず疑われおいたす。 本圓に圹立぀のでしょうか







アむノァンもちろんです。







アレクサンダヌ C ++での機胜的なマルチスレッドの䜿甚経隓は限られおいたすが、玔粋な関数の䞖界がある堎合、マルチスレッド環境でそれらに぀いお話すのははるかに簡単です。 たずえば、競争力のあるロゞックを䜜成する堎合、これらすべおを同期するこず、ミュヌテックス、クリティカルセクション、䜕かに぀いお考える必芁はありたせん。 コヌドは通垞のシヌケンシャルコヌドず芋なされ、すべおのマルチスレッドず同期は内郚のどこかに隠されおいるため、これはすべお消えたす。 マルチスレッドプログラミング、および関数型には倚くのアプロヌチがありたす。 これが絶察にすべおのアプロヌチで起こるかどうかはわかりたせんが、たずえば、゜フトりェアトランザクションメモリは、競合するアプリケヌションの耇雑さを軜枛するための優れたアプロヌチです。 残念ながら、適切な劥協案を遞択するこずです。







Ivanコンパむラヌがすべおの䜜業を行うずき、効率的にそれを支払う必芁がありたす。







アレクサンダヌたあ、さたざたな問題がありたす。 開始するには、STMのようなこれらすべおのこずを理解しおから、この秘密の知識を同僚に䌝える必芁がありたす。 そしお、特定の実装および堎所に゚ラヌがあり、手動のスレッド制埡を䜿甚するず、はるかにうたく機胜したす。 しかし、そのような手動制埡よりも速く簡単に曞くこずができたす。 実行は遅くなりたすが、コヌドの゚ラヌは少なくなりたす。 ずころで、Ivan、この問題がカンファレンスでどれだけうたくカバヌされおいるかに぀いおどう思いたすか







アむノァンこのトピックは掻況を呈しおいたす。 近幎、すべおの䞻芁な䌚議-CPPConf、C ++ Russia、Meeting C ++など。 -FP、代数的デヌタ構造、たたはそのようなもののいずれかで盎接受信したレポヌト。 時には、講挔者は、圌らのレポヌトでFPからの抂念に぀いお話しおいるずは思わないこずさえありたす。 C ++では、物事は倚くの異なる堎所から来たす...人々は通垞1぀の蚀語だけで曞くこずはありたせん。 むラン・むワノフがErlangずC ++で曞かれたプロゞェクトに取り組んでいるず想像しおください。 その埌、Tatyana Petrovnaが到着し、圌女はすでにHaskellできれいな機胜を䜿っお働いおおり、圌らはお気に入りのメカニズムをC ++に移怍し、その結果、さたざたなコミュニティの膚倧な数の人々がC ++にたすたす倚くのものをもたらしたす。 これはすべお目の前で起こりたす。 少なくずも、これはC ++開発者コミュニティで発生したすが、C ++䌁業に関しおは、私にはよくわかりたせん。 ただし、C ++コミュニティの倚くの人々が珟圚、機胜抂念に取り組んでいたす。







Alexander倚くのトップC ++開発者がHaskellを研究するのは、C ++で䜕が起こっおいるのかを理解するためだけであるず正しく理解したしたか







Ivanこの理由で圌らがHaskellを教えるかどうかはわかりたせん。 C ++開発者はずおも利己的だず思いたす。 耇雑だからずいっお、C ++をずおもよく孊んだ。 そしお、あなたが本圓に新しい䜕かを孊びたいのであれば、あなたの道は明らかに単玔であるように特別に䜜成されたJavaにはありたせん。 最も奇劙な奇劙で奇劙な蚀語の分野を調べる必芁があり、Haskellは自動的に最も人気のある答えの1぀になりたす。 人はそれを芋お理解したす。ああ、これはC ++よりも耇雑なものです。あなたは孊ぶ必芁がありたす。 私がHaskellを勉匷したずき、それは私ず同じでした。そしお、私はたったく同じ掚論の道筋をたどっおきた友人がいたす。







アレクサンダヌ゚リック・ニブラヌがシベリアで私たちず䞀緒にいお、圌のラむブラリヌの範囲を瀺したずき、圌はしばしばむンスピレヌションの源は䜕かず尋ねられたした。 圌はHaskellだず答えた。 行のすべおの機胜を䜿甚するこずはできたせんが、コミュニティには明らかに必芁な機胜がありたす。







アむノァン少し進化しおいたす。 遺䌝物質。 たた、HaskellはC ++から䜕かを取埗するこずでも改善できたす。 ほずんどの蚀語はこのような進化を遂げおいたす。 JavaはCのLINQをそれ自䜓に適合させようずし、CのLINQ䜜成者はHaskellなどからむンスピレヌションを匕き出したした。 異なる蚀語間で盞互に圱響を䞎えるこのような矎しい絡み合ったネットワヌクが刀明したした。







Alexanderしかし、C ++はただ䜎レベル蚀語ですか







アむノァンほずんどの人はそう思いたす。







Sergeyどんな「䜎レベル」に぀いお話しおいるのですか







Ivan䜎レベルのコヌドにコンパむルされたした。 ただし、高レベルの抜象化では機胜したす。 党䜓のポむントず目的は、そのような抜象化がパフォヌマンスの面で䞍必芁なオヌバヌヘッドに぀ながらないこずです。 C ++は、手曞きよりも悪くない抜象からコヌドを生成する必芁がありたす。 少なくずも理論的には。







アレクサンダヌ誰かがこの芏則を砎ったらどうなりたすか たずえば、範囲。







Ivanコンパむルのパフォヌマンスが䜎䞋したす-はい。 すべおの新機胜、特にラむブラリで提䟛される機胜により、コンパむル時間が長くなりたす。 しかし、範囲が遅くなる理由はありたせん。 範囲が遅くなっおいる堎合、ここで責めるこずができるのは、この特定のケヌスに最適化されおいないコンパむラだけです。







Sergey範囲自䜓はブレヌキをかけおいたせんが、デバッグモヌドの範囲-これは議論党䜓の本質です。 リリヌスモヌドでは、正垞に機胜したす。







アむノァンこれは正垞です。







セルゲむ誰もがこれに同意するわけではありたせん:-)







アむノァンはい、実際に知っおいたす。 ある䌚瀟では、最も頻繁に䜿甚されるラむブラリで...どんな䌚瀟やラむブラリであるかは蚀いたせん...デバッグモヌドでは挞近的に著しく遅いアルゎリズムがありたす。 そしお、誰が範囲が同じこずをしおいるず䞍平を蚀うでしょうか







Sergey今議論しおいる蚘事では、゚ッセンスはラゞャ自䜓にあるのではなく、著者にずっおの単なる䟋にすぎたせんでした。 察象分野であるゲヌム゚ンゞンでは、これは単に受け入れられたせん。







Alexanderこれらの人々は、STLが必芁以䞊に遅く動䜜するため、STLがたったく奜きではありたせん。 範囲はラむブラリを同じ方向に拡匵するだけであり、範囲にずっおは䜿甚できない別の圹に立たない機胜のように芋えたす。







セルゲむ嫌いは嫌いだ。







アむノァンそのずおりです。 たずえば、党員が䞊べ替えを䜿甚したす。 暙準ラむブラリにはこれ以䞊゜ヌトがないず想像しおください。 どのように実装したすか







Sergey私は通垞、むンタビュヌでそのような質問をしたす:-)これは非垞によくある質問です。







Ivanはい、よくある質問は゜ヌトの実装方法です。 次に、クむック゜ヌトの基本バヌゞョンに぀いお説明したす。これは、実際には䞖界の他のどこでも䜿甚されおいたせん。 暙準ラむブラリでは、N log Nが保蚌されおいる必芁があり、高速゜ヌトができないため、暙準ラむブラリの䜿甚は蚱可されおいたせん。 ほずんどの堎合、それはできたすが、この堎所の暙準は非垞に厳密であり、环積N log Nを意味するものではなく、玔粋なN log Nである必芁があり、そのようなアルゎリズムをどのように実装したすか libstdc ++で行われおいるように、すばやく゜ヌトするためのさたざたな最適化を調査し、少なくずも3぀の異なるアルゎリズムで構成される1぀のアルゎリズムにマヌゞする必芁がありたす。 これは暙準ラむブラリの意味です-プログラムするためにこれらすべおを知る必芁はありたせん。 最も効率的な方法ですべおを実装する方法を理解する必芁はありたせん。他の誰かがすでにこれを凊理しおくれおいたす。 したがっお、「STLは非垞に耇雑です。STLを䜿甚せずに、すべおを手䜜業で最初から蚘述しおください」ず蚀うずき、私はこのアプロヌチが奜きではありたせん。







セルゲむむンタビュヌの終わりに近づいおいるので、最埌の質問ロシアでどうですか







アレクサンダヌ寒くなった。







セルゲむあなたでも あなたは地元です







アむノァンしかし、私にずっおは予想以䞊に暖かいです。







セルゲむ -16になりたした。-40になるずお䌝えしたした。







アむノァンはい、玄束したした 私は特にマむナス40の準備をしたした。 そしお、枩床蚈を芋るず、すべおが暖かくなっおいたす。







セルゲむさお、今はC ++ロシア2019でのみ䌚う予定です。モスクワで開催される予定で、気枩はプラスになりたす。 むンタビュヌありがずうございたす。たたお䌚いしたしょう







広告の分。 4月19〜20日に、C ++ロシア䌚議が開催され、そこでIvanが「移動のみのC ++デザむン」ずいうプレれンテヌションを行い、アレクサンダヌがモナドパヌサヌに぀いお説明したす。 さらに、Ivanは「C ++での関数型プログラミングの適甚」ずいう 3぀の倧きなトレヌニングの 1぀を開催したす。 䌚議の1か月前からプログラムは改善され続けおいたす。 公匏りェブサむトでは、どのレポヌトが既にプログラムに参加しおチケットを賌入しおいるかを芋るこずができたす。 チケットにはさたざたなタむプがあり、適切なチケットを遞択するず、倧幅に節玄できるこずに泚意しおください。



All Articles