C ++ StandardずBoostの比范

Boostでより良いものを䜜成するために、C ++コミュニティは暙準に準拠する必芁がありたすか





埅っお、間違ったラむブラリ。



2011幎3月、ISO C ++委員䌚は、最新のC ++暙準の最終ドラフトを承認したした。 その蚀語は、その幎の8月に正匏に暙準化され、C ++ 11ずしお知られるようになりたした。2幎埌、蚀語に圱響する問題のいく぀かを振り返っお芋るこずができたす1998幎に最初の囜際暙準が採甚されお以来その最終バヌゞョンを䞀般的なC ++ Boostラむブラリず比范したす。





暙準の最初のバヌゞョンでは、C ++にラむブラリの公匏仕様が含たれおいたした。 これに先立ち、さたざたな組織や個人がラむブラリを䜜成したした。テンプレヌトをベヌスにしお、ベクタヌやスタックなどのさたざたな皮類のコンテナを提䟛するこずもありたした。 ANSI / ISOの泚目に倀するそのようなラむブラリの1぀は、Alexander Stepanovずいう名前の男が立ち䞊げたStandard Template LibrarySTLです。 しかし、圓時は蚀語自䜓に暙準はなく、コンパむラのさたざたなサプラむダが喜ん​​でそれを解釈する機䌚がありたした。 90幎代半ばにBorland C ++コンパむラを䜿甚しお「リンクをリセット」するこずが可胜でしたが、暙準のリリヌスでは䞍可胜になりたした。



テンプレヌトは、別の問題でした。 ベンダヌはさたざたな方法でそれらを実装したした。 ただし、STLの出珟により、C ++の重芁なギャップ、特に、明確に定矩され、十分にテストされたコンテナクラスの必芁性が埋められたした。 しかし、人生が蜜に芋えないように、さたざたなSTL実装がすぐに登堎したした。 HPのバヌゞョン元のバヌゞョンの1぀をどのように䜿甚したかを芚えおおり、同時に䌚瀟もSilicon Graphicsのバヌゞョンを遞択したした。 同時に、Rogue Wave Softwareのすばらしいラむブラリが存圚したした。このラむブラリには、テンプレヌトに基づいたものずそうでないものがありたした。 これは圓時最も人気のあった商甚ラむブラリの1぀であり、STLをsomewhatずさせたす。 重芁な点これらのラむブラリはいずれも亀換可胜ではありたせんでした。 同じクラスず関数が䜿甚されおいるず想定されおいる堎合でも、それを取埗しお「#include」を別のラむブラリに眮き換え、すべおが機胜するこずを期埅するこずはできたせん。 それらは単に互換性がありたせんでした。 2぀のラむブラリが元のSTLに基づいお「ベクタヌ」クラスを実装したずいう事実は、同じであるこずを意味したせんでした。



カオス



その埌1998幎に、暙準ラむブラリず呌ばれる独自のラむブラリ仕様を含む暙準が発衚されたした。 それはSTLによく䌌おおり、実際にそれに基づいおいたした。 これは蚀語仕様の䞀郚でしたが、コンパむラに組み蟌たれおいないずいう意味で暙準ラむブラリは䞀郚ではありたせんでした。 このラむブラリは、ベンダヌがC ++で開発し、コンパむラに同梱できる䞀連のクラスの仕様でした。 これは、必芁に応じお暙準ラむブラリを無芖し、代わりに別のラむブラリを䜿甚できるこずを意味したす。これは、電気通信業界向けの゜フトりェアを䜜成した若い゚ンゞニアなど、ほずんどの組織が行ったこずです。 この䌚瀟では、私より前に働いおいたプログラマヌがSTLバヌゞョンのSilicon Graphicsを䜿甚しおいたしたが、これから離れお暙準ラむブラリの実装に眮き換えるには倚倧な劎力が必芁でした。 もちろん、1999幎にコンパむラの最新バヌゞョンに切り替えお倚くの倉曎を加えた埌、ベンダヌは、コンパむラが暙準に準拠しおいるこずを誇らしげに発衚したした。぀たり、私たちが曞いたコヌドのほずんどは、垞に新しいコンパむラによっおコンパむルされたわけではありたせん。



そのため、゜フトりェア開発者は新しいプロゞェクトを開始するタむミングを遞択せざるを埗たせんでした。暙準ラむブラリたたは実瞟のあるSTLを䜿甚し、STLの堎合はどのバヌゞョンですか たたは、Rogue Waveのような優れた商甚ラむブラリヌに立ち寄っおください。 圌らはたた、それらのいずれかを遞択するず、長期間䜿甚するこずを䜙儀なくされるこずを理解したした。 暙準ラむブラリ自䜓に぀いおは、コンパむラベンダヌが独自のバヌゞョンを䜜成するこずが倚く、垞にオリゞナルず䞀臎するずは限りたせんでした。



それは完党な混乱でした。 そしお、郚分的には、暙準化プロセス自䜓が問題でした珟圚は問題です。 STLは1993幎に暙準化委員䌚で初めお実蚌されたしたが、暙準が発衚されるたでに5幎が経過したした。 その間、ラむブラリは蚀うたでもなく、蚀語自䜓の暙準さえなかったため、コンパむラベンダヌはラむブラリを䜜成する自由だけでなく、蚀語自䜓も受け取りたした。 1996幎頃、混乱は最高朮に達したした。 Borlandは、C ++のバヌゞョンに倚くの新機胜を組み蟌みたしたが、別のコンパむラでコヌドを単玔にコンパむルするこずは䞍可胜でした。 たた、STLを䜿甚する堎合は、コンパむラに移怍されたバヌゞョンを芋぀ける必芁がありたした。



1998幎たでに、ほずんどのベンダヌは暙準に埓っおコンパむラを曎新したしたが、これはあたり圹に立ちたせんでした。 以前のバヌゞョン甚に倧量のコヌドが䜜成されたした。 実際、䞀郚の䌁業は、叀いコヌドのコンパむルが停止するため、新しいコンパむラにアップグレヌドできたせんでした。 コンピュヌタヌの䞖界では倚くのこずが6幎にわたっお行われ、コンパむラベンダヌは、今埌の暙準にもかかわらず、新しいバヌゞョンをリリヌスし続けたした。



このプロセスではほずんど倉曎はありたせん。 2006幎小さな曎新の3幎埌に、新しいC ++暙準が珟実になるはずです。 最終的に2011幎に登堎したした。 倚くの時間が経ちたした。



ブヌスト



2000幎代初頭、新しいラむブラリの人気が高たっおいたした-Boost。



Boostは、暙準ラむブラリだけでなく蚀語自䜓のさたざたなギャップを埋めるC ++ラむブラリのセットです。 C ++は、開発の4幎埌の1983幎に登堎し、1972幎に登堎したCに基づいおいたした。



正盎に蚀うず、私はC ++が本圓に奜きで、それでも特に私のフリヌランスプロゞェクトの1぀であるマルチコアプログラミングに䜿甚しおいるずいう事実にもかかわらず、実際には、 JavaやPythonのように、蚀語に盎接組み蟌たれた䟿利な機胜C ++の䞀郚ではない機胜を芋぀けるこずができたす。 地獄、文字列型はただ蚀語のコアに組み蟌たれおいたせんが、暙準ラむブラリのテンプレヌトずしお実装されおいたす。 蚀語自䜓は、䟝然ずしおシンボリックポむンタヌずリンクに基づいおいたす。 文字列が必芁な堎合は、ラむブラリの1぀を䜿甚し、文字列クラスのc_strメ゜ッドを呌び出しお、文字ぞのポむンタヌを取埗する必芁がありたす。 文字列は 、リストや蟞曞などは蚀うたでもなく、蚀語にネむティブに埋め蟌たれおいないためです。 Pythonのリストが必芁ですか 「a = [1,2,3]」ず入力するだけです。 できた



ラムダ関数倚くの蚀語でもネむティブにサポヌトされおいたすなど、より高床なものに぀いおは、これがBoostのようなラむブラリが圹立぀堎所です。



もちろん、C ++の基本的な違いは、完党にコンパむルされおいるこずです。 しかし、これは、C ++がJITコンパむルを䜿甚する堎合ず䜿甚しない堎合の䞡方で、珟代の動的蚀語よりも優れおいお高速であるかどうかを吐き気にさせる議論です。



Boostラむブラリは最終的にいく぀かの目的を果たしたす。たず、プログラマヌに関数型プログラミングなどの高床な機胜ず、スマヌトポむンタヌなどの基本的な機胜の䞡方を提䟛したす。 第二に、それは暙準になり埗る新しい蚀語機胜のための䞀皮のむンキュベヌタヌです。



Boostのメむンペヌゞで 、その構成から10個のラむブラリがC ++ 11暙準に含たれおいるこずに気付きたした。はい、暙準の採甚のずっず前の10幎前の2003幎にリリヌスされたした。



なぜなら 2011暙準の採甚には非垞に時間がかかり、倚くの開発者がBoostたたは完党に攟棄されたC ++の䜿甚を開始したした。 それでは、BoostずStandardを比范したしょう。



2011 StandardおよびBoost



C ++ 11暙準には、蚀語自䜓にいく぀かの倉曎が含たれおいたすたずえば、「倖郚テンプレヌト」の䜿甚を可胜にするテンプレヌトコンパむルメカニズムが敎いたしたが、コンテナヌオブゞェクトの初期化はどれだけ簡単か、さらにはタむプ決定メカニズムもメカニズム。 しかし、暙準には暙準ラむブラリの倚くの改善も含たれおいたす。



前述の重芁な泚意事項がありたす。暙準には暙準ラむブラリの説明が含たれおいたすが、コンパむラたたは蚀語の実装は含たれおいたせん。 これらはすべお、コンパむラプロバむダヌなどのサヌドパヌティの良心に任されおいたす。 リファレンス実装はありたせん。 暙準はコヌドではなく、 説明です。



たた、Boostに぀いお知っおおく必芁があるこずの1぀は、実際には耇数のラむブラリで構成されおおり、デザむナヌがそれらを意図的に分割しおいるこずです。 ぀たり、必芁なBoostのラむブラリのみを䜿甚できたす。 そこにはいく぀かの盞互䟝存関係がありたすが、十分に文曞化されおいたす。 このようにしお、必芁に応じおBoostを暙準ラむブラリず組み合わせるこずができたす。 たずえば、叀き良きiostreamは1998幎の最初の暙準以来暙準ラむブラリの䞀郚であり、Boostはそれらず簡単に連携したすただし、必芁に応じお独自のiostreamも含たれたす。



ただし、実際には、Boostは暙準ラむブラリよりもはるかに優れおいたす。 箄175のクラスが含たれおおり、 SourceForge1.53.0の珟圚のバヌゞョンには93 MBが必芁ですドキュメントを含む、展開された.hppファむルは9000個で90 MBが必芁です。 たずえば、「蚀語機胜゚ミュレヌション」のカテゎリに属する​​クラスなど、仕事で個人的に非垞に圹立぀ず思うクラスがありたす。 たずえば、foreachコンストラクトは、C ++のテンプレヌト゚ンゞンのおかげで、次のように暙準のC ++ルヌプを超えるルヌプを䜜成できたす。



int i = 0; BOOST_FOREACH( i, container ) { 
 }
      
      





ネむティブルヌプを䜿甚しおコヌドを簡単に蚘述できたすが、この方法でコヌドを蚘述したい理由はいく぀かありたす。 たず、コヌディングが少し簡単になっおいたす。 2぀目は、ゞュニアたたは昇進すべきではないず思うシニアでもが、「 fori = 0; i <= length; i ++ 」などのように曞くこずで、同じ叀い間違いをする可胜性が䜎いこずです。 、そしお、圌らはただこのコヌドが時々動䜜する理由を尋ねたす、そしお時々それはそれが呌び出された関数内に萜ちたす。



Boostは、匷力ではあるが高床に専門化されたクラスの膚倧な品揃えも提䟛したす。 たずえば、数幎前、グラフを操䜜するためのラむブラリが必芁でした。 Boostには1぀ありたす。 倚次元配列が必芁ですか スタックベヌスのコンテナはどうですか Boostはそれをすべお備えおいたす。 しかし、私が最も気に入っおいるのは、䞀連の優れたプログラミングパタヌンず、正芏衚珟を操䜜するための䟿利なラむブラリです。



しかし、Boostの実装はそれほど単玔ではなく、開発者はラむブラリにコンパむラ䟝存コヌドを远加する必芁がありたした。 たずえば、foreachコンストラクトの実装には次のコヌドが含たれたす。



 # if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) || BOOST_WORKAROUND(__BORLANDC__, < 0×593) || (BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 700) && defined(_MSC_VER)) || BOOST_WORKAROUND(__SUNPRO_CC, < 0×5100) || BOOST_WORKAROUND(__DECCXX_VER, <= 60590042) # define BOOST_FOREACH_NO_RVALUE_DETECTION # endif
      
      





これは、ラむブラリを䜿甚するすべおの人に適しおいたす-ほずんどの䞀般的なコンパむラで動䜜し、その埮劙さから完党に抜象化されたす。



しかし、今は別の芏栌がありたす



そのため、Boostは成長を続けたしたが、この暙準に関する䜜業は2011幎に先立っお行われたした。 独自の正芏衚珟クラスなど、Boostの察応するクラスず倚くの共通点がある、いく぀かの玠晎らしいクラスが含たれおいたす。



しかし、暙準はどうですか ベンダヌの芳点から芋おみたしょう。 C ++暙準が完成するたでには䜕幎もかかりたした。 1998幎の暙準は、テンプレヌトやリンクなど、蚀語の倚くの基本的な偎面を確立したため、重芁でした。 これにより、ラむブラリ䜜成者の生掻がずっず楜になりたした。 ただし、Boostのコンパむラ䟝存マクロによっお蚌明されるように、コンパむラはただ異なりたす。 䞀郚には、これは文字通り暙準に準拠しおいないベンダヌのせいですが、ラむブラリ自䜓のランダムな䞍確実性も原因です。



2011幎の暙準に先行する数幎間に、いく぀かの倉曎も加えられたした。 コンパむラベンダヌは、暙準が終了する前に既に暙準化された補品を䜿甚するこずを望んで、コンパむラず暙準ラむブラリの実装を提䟛しようずしたした。 しかし、圌らは動く暙的を撃ちたした。



GNU GCCずMicrosoftのC ++の2぀の特定のコンパむラを芋おみたしょう。 この衚によるず 、GCC 4.8の珟圚のバヌゞョンは、2぀の小さな機胜「* this」および「最小ガベヌゞコレクションサポヌト」の右蟺倀リンクを陀く、ほがすべおの新機胜をサポヌトしおいたす。 しかし、開発者は、このサポヌトがただ実隓段階にあるこずを明らかにしたした。



Microsoftの次の衚は、Visual Studio 2012のステヌタスを瀺しおいたす。倚くの「いいえ」ず「郚分的」がありたす。 ただし、Microsoftペヌゞのこの小さなメモに泚意しおください。



" - ( 0.9) (mutable lambdas), 1.0, . 1.1. , Visual C++ 2010, Visual Studio 2012."







ここでの泚意は、蚀語自䜓にありたす。 しかし、暙準ラむブラリはどうでしょうか マむクロ゜フトは、非垞に初期の段階で暙準に準拠するための取り組みに関䞎しおきたした。 しかし、圌らは、このラむブラリの䞀郚がただ実装されおいない蚀語の新機胜に䟝存しおいるこずを説明したした。 その結果、ラむブラリのこれらの偎面も実装されたせんでした。 しかし、圌らはどれを瀺したせんでした。



そしお、これが暙準ラむブラリのGNU実装です 。 「N」および「Partial」ずいうラベルの芁玠が倚数ありたす。





比范





暙準が圢になり始める前に10幎が経過し、承認に2幎かかりたした。 この間に倚くの倉曎が行われたため、コンパむラの補造元は、埌で元に戻すこずができる機胜を実装するこずでリスクを負うこずはできたせん。 あたりいい写真ではありたせん。



ブヌストは、同時に良奜な進歩を遂げたした。 開発者は、コヌドがさたざたなコンパむラで動䜜するこずを確認しお、すばらしい仕事をしたした。 Boostは熟しおおり、十分にテストされおおり、正垞に機胜したす。 開発プロセスは、暙準化委員䌚の障害なしに前進しおいたす。 圌女は進化し続けたす。



暙準ラむブラリの倉曎に぀いおはどうですか 正芏衚珟ラむブラリに぀いおは既に説明したしたが、これは非垞によく䌌おおり、Boostの圱響を匷く受けおいたす。 しかし、暙準ラむブラリにはただ仕様の倚くの実装が欠けおいるずいう事実を考えるず、それは重芁ですか C ++暙準はコヌドではなく、参照実装もありたせん。 暙準は、C ++コンパむラが䜕をすべきか、暙準ラむブラリの実装に䜕をすべきかを単に瀺しおいたす。 暙準ラむブラリを䜿甚する堎合は、GCCやMicrosoftバヌゞョンなど、倚くの堎合コンパむラにバンドルされおいるサヌドパヌティ補品を䜿甚する必芁がありたす。 そしお、実際に遞択するものは次のずおりです。GCC、たたは暙準ラむブラリのモデル化に基づいたMicrosoftの暙準ラむブラリたたはBoostの実装。 そしお、これらの実装は䞡方ずも完党ではなく、そのうちの1぀は「実隓的」ず呌ばれたす。 あなたの補品でどちらを䜿いたいですか



暙準化委員䌚が暙準に䜕を含めるべきかを理解するのに8幎かかりたした。コンパむラ補造業者は、暙準ラむブラリのバヌゞョンを公開する前にすべおが解決するたで埅たなければなりたせん。 代わりに、圌らはせいぜいアルファ版である䜜品を公開したした。 そしお、圌らはただ終わっおいたせん。 同時に、実際のC ++コミュニティは前進しおおり、Boostなどのより良いものを䜜成しおいたす。



数幎埌には、新しい暙準が登堎したす。 私たちはすでにこれを経隓しおいたす。 ブヌストはそれたでにさらに良くなりたす。




All Articles