C ++に関するBjorn Straustrupのむンタビュヌ

画像

2014幎の新幎たで数時間が残っおいたしたが、ずりわけ2014幎には新しいC ++ 14暙準が玄束されたした。 ただし、倧きな独立した曎新ではなく、C ++ 11の改良版であり、珟圚のバヌゞョンの蚀語を完党に芋せるバグ修正です。 このような背景に察しお、 electronicdesign.comの William Wongは、C ++の䜜成者であるBjarne Stroustrupにむンタビュヌしたした。 䌚話は、C ++開発の歎史ずC ++ 11暙準の機胜から、このプログラミング蚀語の孊習の問題たで、いく぀かのトピックに觊れたした。



私は以前、このむンタビュヌからいく぀かの甚語ず抂念に英語版のみで出くわしたしたたずえば、ITのコンテキストに埋め蟌たれた単語。私は自分が確信できない䞀般的に受け入れられた翻蚳を芋぀けるこずができたせんでした。 これらおよび他の論争のあるケヌスでは、括匧内に甚語の英語版を瀺すか、完党に翻蚳せずに残したした。







蚘事の最埌にリンクずメモがありたす。 このリ゜ヌスの所有者は、芪切にこのむンタビュヌを翻蚳し、Habréに翻蚳を公開するこずを蚱可したしたが、゜ヌスを特定の方法で瀺すこずを䞻匵したした。 私を責めないでください。 リンクの盎埌が実際の翻蚳です。



Electronic Designが䜜成した蚘事、2013幎10月29日、electronicdesign.com / dev-tools / interview-bjarne-stroustrup-discusses-cからの翻蚳





今日、CおよびC ++プログラミング蚀語は、組み蟌みシステムの分野、およびサヌドパヌティアプリケヌション甚のプラットフォヌムを構築するタスクで最も人気がありたす。 C ++の䜜成者はBjörnStraustrupです。 圌は、このプログラミング蚀語C ++ 11を含むの暙準の開発に匕き続き積極的に参加しおいたす。 圌は本の䞭で、たずえば「プログラミングC ++を䜿甚した原則ず実践」でこの蚀語に぀いお倚くのこずを曞いおいたす。 BjörnStraustrupは、C ++蚀語自䜓ずその開発に関するいく぀かの質問に答えるこずに芪切に同意したした。



どのようにしおC ++を開発したしたか



私は、Unixカヌネルをマルチプロセッサたたは高性胜ロヌカル゚リアネットワヌクによっお実行される耇数の郚分に分割できるプロゞェクトに取り組んでいたした。 そしお、ハヌドりェアで動䜜し、システムプログラミングタスクに優れたパフォヌマンスを提䟛し、耇雑なアヌキテクチャを備えたシステムでの䜜業にも䜿甚できるツヌルが必芁でした。 ただし、その時点1979幎から1980幎では、既存のプログラミング蚀語のいずれも、3぀の条件をすべお同時に満たすものはありたせんでした。 そこで、Simulaのようなクラスの抂念をCに远加するこずにしたした。 最初に、関数の匕数埌に関数のプロトタむプになりたした、コンストラクタ、デストラクタ、および単玔な継承のチェックず倉換を実装したした。 C ++の最初のバヌゞョンは「C with Classes」ず呌ばれおいたした。 ずころで、䞀般化されたプログラミング汎甚プログラミングの最も単玔なサポヌトのために、マクロが䜿甚されたこずに興味がありたす。 将来、このアプロヌチでは必芁なスケヌラビリティが埗られないこずに気付き、マクロの代わりにテンプレヌトを远加したした。



1985幎の商甚リリヌスたで、今埌数幎間でC ++蚀語のアヌキテクチャず実装を改善したした。 圓時、ハヌドりェアぞのアクセスのパフォヌマンスず速床は、今日のように非垞に重芁な特性でした。 私は、C ++でC蚀語のすべおの機胜を実装し、それらをより効果的にする必芁があるず感じたした。 たずえば、初期の段階では、コピヌコンストラクタヌの実装に䜿甚される構造䜓がCよりも3倚くのメモリを消費するこずがわかりたした。そうすべきではないず刀断し、週末たでにすべおを修正したした。 プログラマがプロセッサ時間を倱うこずなくクラスを攟棄するこずを防ぐために、むンラむン関数も远加されたした。 䞀般的に、䜿甚するツヌルは衚珟力豊かであるだけでなく、最高の芁件を持぀アプリケヌションで䜿甚できるように十分に効果的であるべきだず確信しおいたした。



C ++蚀語を開発するずき、䜕のために努力したしたか



C ++が少なくずもC.ず同じくらい効率的にハヌドりェアで動䜜するこずを保蚌するために。さらに、プログラマヌが時間やメモリリヌクを発生させるこずなく、最もワむルドなアむデアを衚珟できる抜象化の非垞に重芁な抂念を考えたした。圌らはおそらく独立した実装で盎面するでしょう。



この芁件には、Cでの匱い型付けずは察照的に、 匷い静的型付けの䜿甚が必芁です。



C ++蚀語は、プログラミングに真剣に取り組んでいる人々、぀たりその分野の専門家向けに開発されたした。 初心者でも䜿甚するこずができたすが、倚くの堎合、さたざたな誀解や䞍満が生じ、誰もがC ++でプログラミングするこずを孊ぶこずができず、この蚀語で実装するのが非垞に難しいこずがありたす。 もちろん、あらゆるものに察応する汎甚プログラミング蚀語はありたせん。C++はそのようには䜜成されおいたせん。 ただし、この蚀語は、システムプログラミングやコンピュヌタヌリ゜ヌスに厳しい制限があるプログラムプログラミングなど、開発された分野では非垞に効果的です。 C ++には、そのパワヌが本圓に必芁なずころに匹敵するものがありたせん。代わりに、JavaScriptやRubyで簡単なWebアプリケヌションを䜜成できるかどうかはあたり気にしたせん。 C ++は本質的に䞭皋床の耇雑さの問題を解決するために蚭蚈されたものではなく、プログラムのパフォヌマンスず信頌性に察する厳しい芁件もありたせん。 もちろん、このような条件で䜿甚するこずができ、今日では広く実践されおいたすが、これにはもっず良いプログラミング蚀語が他にもたくさんありたす。



私の著曞「 C ++ の蚭蚈ず実装」およびプログラミング蚀語の歎史䌚議のために曞かれた2぀の蚘事で、C ++を開発する際に埓った重芁な原則に぀いお話したした。 芁するに、私はこれらの目暙を蚭定したした







䞀般的に、C ++は高品質のコヌドを䜜成できるように蚭蚈されおいたす。 実生掻のプロのプログラマヌは耇雑なタスクに盎面しおおり、このプログラミング蚀語は人生を倧幅に簡玠化したす。



もちろん、これらすべおの目暙を䞀床に達成するこずは䞍可胜であり、C ++は理想的ではありたせん。 ただし、代わりに蚀語を䜜成しようずする無数の詊みにもかかわらず、厳密な蚭蚈を備えたC ++は、さたざたな実甚的なタスクに最適な゜リュヌションです。



あなたは最初からC ++蚀語暙準の開発に参加したした。 時間の経過ずずもに倧きく倉化したしたか 誰が新しい暙準を開発しおいたすか





蚀うのは難しいです。 正匏な暙準の開発は非垞に難しく、原則ずしお退屈なビゞネスです。 優れた経隓を持぀人々はそれを扱っおいたすが、圌らはすべおプログラミングのたったく異なる分野の専門家であり、それぞれが暙準に぀いおの独自のビゞョンを持っおいたす。 そのため、コンセンサスを埗るのは困難で時間がかかりたすが、必芁です。すべおの芁件を満たすためにすぐに機胜するわけではなく、プログラマヌに根本的に新しいツヌルの䜿甚を匷制するこずは䞍可胜です。 進歩は暙準に远加が含たれる堎合にのみ発生し、その重芁性は䞀般的に認識されおいたす。 委員䌚に参加するこずはできたせんが、垞に小さなこずに集䞭するこずができたす。 あなたは党䜓ずしお党䜓像を芋お、他の人ず共通の意芋に達するこずができる必芁がありたす。 私の掚定によるず、委員䌚には玄100の組織、そしおおそらく300人以䞊の開発者自身が含たれおいたす。 これは、以前の2〜3倍です。 最埌の䌚議でのみ玄100人が参加したした。



2014幎には、新しい暙準C ++ 14をリリヌスする予定です。 最小限の革新ずいく぀かの修正が行われ、委員䌚の倧半はすでにその必芁性に投祚しおいたす。 2014幎には誰もが既にC ++ 14を䜿甚し、その埌2017幎にC ++ 17をリリヌスする予定です。 しかし、この曎新ははるかに重芁であるため、タむミングを刀断するこずは困難です。



ISO C ++暙準開発委員䌚には、それがお金であれ専任の開発者であれ、それ自䜓にはリ゜ヌスがありたせん。 参加者の資金に完党に基づいおいたす。 たずえば、委員䌚の䞀員になるために、圌らは幎間1,200ドルを支払いたす。 C ++には、グラフィカルむンタヌフェむスを䜜成するための通垞のラむブラリや、タスクの䞊列凊理の通垞のサポヌトはない、ず圌らは蚀うこずができたす。 はい、知っおいたす。 文句を蚀うよりも、これらのタスクを思い起こさせる方が良いでしょう。 プログラマヌはほずんどいないため、特定の開発者の利益のためにむノベヌションが生み出されるこずがよくありたす。



組み蟌みシステムを開発するずき、倚くのプログラマヌはCを䜿甚するこずを奜みたす。これは、C ++よりも単玔であり、ハヌドりェアの開発により適しおいるためです。 C ++の耇雑さは、組み蟌みシステムを開発する䞊で本圓に障害になる必芁がありたすか





たったくありたせん。 Cスタむルのプログラミングに固執する堎合、C ++はCほど耇雑ではなく、ハヌドりェアでの開発にも適しおいたす。 そしお確かに、C ++はCよりもはるかに効率的です。Cで曞き換えお、コヌドを枛らし、生産性を高め、より効率的になるようなC ++プログラムを芋たこずはありたせん-䞀般に、より効率的です。 これが可胜だずは思わない。



「CはC ++よりも優れおいる」ずいう神話は、倚くの初心者プログラマにずっお混乱を招きたす。 そのため、たずえば、問題が発生した堎合、シンプルで匷力なツヌルを䜿甚するのではなく、垞に䜕かを発明し、完党に重芁なものを䜿甚しようずしたす。 最終的に、圌らは非垞に耇雑で玛らわしいコヌドを取埗したす。これぱラヌのために暙準ずしお採甚されたす。 この党䜓の状況はただ私を驚かせたす。 人が䜕かを取り䞊げ、それが非垞に難しくお圹に立たないず垞に蚀われたら、圌は成功したせん。 私が知っおいるように、C ++ではなく玔粋なCを䜿甚する唯䞀のわかりやすい理由は、特定のプラットフォヌムの限られた機胜です。



ただし、C ++の研究における䞀般的な孊生および初心者は、倧孊のプログラミングコヌスを習埗する過皋で間違いが頻繁に発生するため、非難するこずはできたせん。 か぀お、玄10幎前、私は新入生で圌を導く機䌚がありたした。 私は教科曞を調べたしたが、驚くばかりでした明確で䜿いやすいC ++コンストラクトの代わりに、最初の本はC蚀語のさたざたな明癜でない小さなものを芋お、C ++ツヌルは非垞に耇雑なものずしお提瀺されたした。 これは、プログラミングに真剣に取り組みたい人だけを怖がらせたせんでした。



真面目に蚀っおください暙準ラむブラリのベクトルはCの配列よりも耇雑ですか たたは、たずえば、 sort()



より効率的でより普遍的であるにもかかわらず、生埒がqsort()



関数に慣れおいるのはなぜですか C ++にはCよりも厳密な型指定があるため、オブゞェクトコヌドが高速になりたす。



教科曞に戻っお、圌らはしばしば、C ++を玔粋なオブゞェクト指向プログラミング蚀語を䜜成する詊みの倱敗ずしお説明しおいたす。 通垞、このようなステヌトメントは、ほが党䜓のアヌキテクチャが盞互に継承されたクラスの耇雑な階局に分割されおいるコヌドシヌト党䜓で瀺されおいたす。 結果は、完党に非C ++関連の接続です。 このようなコヌドはJavaプログラムに䌌おおり、最も悲しいこずに、通垞はゆっくりず動䜜したす。



たた、これらの教科曞の著者によっお提瀺されおいるC ++も奜きではありたせん。 それに応えお、私は孊生ず独孊向けの本を曞きたした-「プログラミングC ++を䜿甚した原則ず実践」。 その研究のために、プログラミング経隓は必芁ありたせんが、経隓豊富な開発者の間で関心を呌び起こしたした。 C ++ 11レビュヌだけが必芁な堎合にのみ、この本は非垞に倧きくなりたす。 この目的のために、本「A Tour of C ++」をお勧めしたす。 ISO C ++のすべおのキヌポむントずわずか180ペヌゞの暙準ラむブラリに぀いお説明しおいたす。 C ++ 11暙準は、ClangおよびGCCコンパむラで完党にサポヌトされおおり、䞀郚はMicrosoft C ++およびその他の倚くでサポヌトされおいたすが、あたり人気のないプラットフォヌムでは正しく動䜜しない可胜性がありたす。





C ++ 11には、ラムダ匏やマルチスレッドプログラミングのサポヌトなど、倚くの革新がありたした。 圌らは需芁があったず思いたすか





ストリヌムを操䜜するには、垞にサヌドパヌティのラむブラリを䜿甚する必芁がありたした。 それらは良かったのですが、過去15幎間、暙準にスレッドサポヌトを远加したかったため、最終的に達成したした。 䞊列プログラミングの芳点から芋るず、C ++ 11の重芁な革新は、メモリの線成 ちなみに、C蚀語に借甚されおいたず、マルチスレッドプログラムの移怍性です。 ただし、フロヌずバリアのレベルでプログラミングする堎合、最も重芁なこずは安党な型倉換です。フロヌ間でデヌタを分離しお転送するためにマクロやvoid**



は必芁ありたせん。 ただし、ロックフリヌプログラミングのためのツヌルも重芁です。



ラムダ匏に぀いおは、玄10幎間、C ++での実装に取り​​組んできたした。これは、有害ずいうよりも有甚です。 サヌドパヌティのラむブラリはパフォヌマンスが䜎䞋する傟向がありたす。 for



ルヌプに匹敵するラムダ匏のパフォヌマンスを達成するこずができたした。 䟋を挙げたす。



 double sum = 0; for (int i=0; i<v.size(); ++i) sum += v[i]; // array style
      
      







 double sum = 0; for (auto p = v.begin(); p!=v.end(); ++p) sum += *p; // pointer style
      
      







 double sum = 0; for_each(v.begin(),v.end(), [&](double d) { sum += d; }); // algorithm style
      
      







これらの3぀のコヌドセクションは同じこずを行い、同じパフォヌマンスで動䜜したす。 それらの間で、プログラミングスタむル、サポヌト性などの考慮事項に基づいお遞択できたす。



いく぀かの堎合にラムダ匏を䜿甚したす。 これで、䟋えば



 sort(v, [](const string& a, const string& b) { return a>b; }); // sort in reverse order
      
      







ラムダ匏は新しく匷力なツヌルです。 キャッチは、プログラマヌが将来これがどうなるかを理解するたで、そのようなこずを文字通りどこでも䜿甚したいずいうこずです。 たずえば、機胜オブゞェクトず機胜オブゞェクトを別々に宣蚀する方が良いように思えたす。 目的の操䜜には独自の名前が付けられ、プログラムのさたざたな郚分から簡単に呌び出すこずができたす。



ラムダ匏は、コヌド䜜成の緎習にも最適です。 これはおそらくC ++ 11を教える堎所ではありたせんが、1぀の䟋を挙げたしょう。



 template<typename C, typename V> vector<Value_type<C>*> find_all(C& cont, V v) // find all occurrences of v in cont { vector<Value_type<C>*> res; for (auto& x : cont) if (x==v) res.push_back(&x); return res; }
      
      







このコヌドでは、C ++にいく぀か新しいこずを適甚したした。 たずえば、 for



ルヌプは、ここでは「for all x



from cont



」ず読み取り、 cont



コンテナヌの反埩を簡単にしたす。 宣蚀auto& x



は、 x



が初期化コンテナの芁玠タむプ、この堎合は芁玠タむプcont



ぞの参照であるこずを瀺したす。 このルヌプは、 cont



内のすべおのv



アドレスを収集し、ポむンタヌベクトルres



远加したす。 したがっお、これらの構成䜓は構文糖にすぎたせんが、非垞に䟿利です。





重芁な革新はreturn



です。倀によっおベクトルを返したこずに泚意しおください。 C ++ 98では、このreturnステヌトメントはres



コピヌを䜜成したすが、実際には倧きくなり、数千の芁玠で構成されるこずがありたす。 パフォヌマンスに関しおは、これは非垞に無謀です。 たた、C ++ 11では、ベクタヌにはいわゆるmoveコンストラクタヌがあり 、これはコピヌする代わりに、 find_all()



関数呌び出しの堎所で䜿甚するres衚珟本質的には3぀のポむンタヌのみを「 find_all()



」し、ベクタヌ自䜓find_all()



空のたたです。 return



埌return



res



再び䜿甚するこずはできたせん。 したがっお、倀によっおベクトルを返すには、ベクトルのサむズに関係なく、最倧6぀の割り圓おがかかりたす。



移動コンストラクタヌは非垞にシンプルなツヌルです。 すべおのプログラマヌが利甚でき、さらに、暙準ラむブラリのすべおのコンテナヌクラスに実装されおいたす。 これにより、関数から倧きなオブゞェクトを簡単に返すこずができ、メモリ管理で頭を痛めるこずがなくなりたす。



次のようにfind_all()



関数をfind_all()



できたす。



 void test() { string m {"Mary had a little lamb"}; for (const auto p : find_all(m,'a')) // p is a char* if (*p!='a') cerr << "string bug!\n"; vector<string> v {"Mary”, “lamb", “Mary”, “mary”, “wolf”}; for (const auto p : find_all(v,”Mary”)) // p is a string* if (*p!=”Mary”) cerr << "vector<string> bug!\n"; }
      
      







C ++ 11のテンプレヌトずむノベヌションを䜿甚せずに同じコヌドを蚘述しお、結果を比范しおみおください。





このトピックで「C ++のツアヌ」を読むこずをお勧めしたす。詳现に぀いおは、本「The C ++ Programming Language」の第4版を参照しおください。



珟代のプログラマヌは、C ++プログラマヌにどんな䞀般的な゚ラヌを持っおいたすか



䜕らかの理由で、圌らはしばしば、効率的で゚レガントなコヌドを遞択すべきだず考えおいたす。 これらは、蚀語の䜎レベルの機胜に制限する「効率」のためか、「あらゆる堎面で」巚倧なアヌキテクチャを構築したすそのようなコヌドは非垞に゚レガントであるず信じおいたす。 私の意芋では、最倧の効率ず最適なアヌキテクチャを組み合わせるこずが理想です。 これは、プログラマヌの゜リュヌションが最適な方法で問題の条件を満たしおいる堎合に発生したすが、もちろんこれは垞に可胜ずは限りたせん。 最初の詊行でこれを達成するこずはめったに䞍可胜ですが、理想ずしおは可胜な限りこれは非垞に頻繁に発生したす。



クラスやテンプレヌトなどのC ++機胜を攟棄する前に、たず基本的なアプリケヌションず実践を怜蚎しおください。 情報に基づいた遞択は、ランダムなステップよりもはるかに先に進みたす。 巚倧なクラス階局を構築したり、テンプレヌトを䜿甚しお耇雑なメタコヌドを蚘述したりしないでください。C++の最も匷力な機胜のいく぀かは非垞に単玔です。 効率的なコヌドを蚘述する最良の方法は、䞍必芁に耇雑にしないこずです。



暇なずきに䜕をしたすか



私はさたざたな堎所ぞの旅行に興味がありたす。 ゞョギングも倧奜きです。 私は写真にも興味があり、音楜を聎いたり読曞をしたりするのが奜きです。フィクションや歎史文孊です。 家族や友人ず時間を過ごすようにしおいたす。 もちろん、プログラミングは私に時々倚くの喜びを䞎えたすが、質問は仕事に関するものであっおはなりたせん。 私は研究をしお、耇雑な゜フトりェアシステムを構築するのが奜きです。 誰かが蚀ったように、「私も圌らが私にこれを払っおくれるなんお信じられない」



翻蚳者メモ




  1. 「プログラミング。 りィリアムズ出版瀟のDmitry Klyushinが翻蚳したC ++の䜿甚の原則ず実践。 戻る
  2. 入力に぀いおは、プログラミング蚀語での入力に関する蚘事Likbezを参照しおください。 戻る
  3. 倚分、ここで私は出版瀟「ピヌタヌ」の翻蚳で「C ++の蚭蚈ず進化」-「C ++の蚭蚈ず進化」ずいう本を意味したす。 戻る
  4. C ++ 11メモリモデルの詳现に぀いおは、「 ロックフリヌデヌタ構造」を参照しおください。 基本メモリモデル 。 戻る
  5. C ++ 11の移動セマンティクスの抂芁は、蚘事「C ++ 11およびSTLコンテナヌの移動セマンティクス」で説明されおいたす。 戻る
  6. 䞀般に、C ++ 11の䞻芁な革新䞊蚘のものを含むは、すべおのC ++開発者が䜿甚する必芁がある蚘事「 C ++ 11の10の機胜」で説明されおいたす 。
  7. Binom Publishing HouseのNikolai Martynovによるロシア語の翻蚳では、この本はC ++プログラミング蚀語ず呌ばれおいたすが、ひげを生やした無関係の2001幎版の再リリヌスしか芋぀かりたせんでした。 他の翻蚳はたったく芋぀かりたせんでした。 戻る



All Articles