2013-11-22 5 views
5

私はinterviewをBjarne StroustrupとC++とそのデザインで読みました。私は彼がそこで使用した用語で混乱していたので、私はそのような瞬間のいくつかを明確にすることを望んでいました。Bjarne Stroustrupとのインタビュー - 抽象化と手作りのコード

私は私の本、「C++の設計と実装」に、私の2つの歴史プログラミング言語の会議論文で私の設計目標と設計上の制約を文書化しますが、簡単に、私は

    を目指します
  • 抽象化を使用するときに手作りのコードと比較ゼロオーバーヘッド、
  • Cのものと非常に類似した機械モデル、
  • 抽象化機構の極めて柔軟セット、及び
  • 静的TY安全です。
  1. 「手作りのコードは、」このような場合には何を意味するのでしょうか... Stroustrup氏 はプログラマ を作成することができる抽象概念のためのいくつかの手作り道具を意味するのでしょうか?
  2. この場合、「マシンモデル」とは何ですか?言語がハードウェアとやりとりする方法?

私は彼が言及した本に見ていた(実際には「デザインとC++の進化」で、私は信じている)が、私はまだ本当にわかりません。これらの2つの用語もグーグルグーグルではありません。

+2

スタック・エクスチェンジ・プログラマー・サイトに適しているかもしれませんが、オーバーフローは特に*コード*関連の問題に関連しています。うまくいけばよい質問がここでもまだ答えられることができます。 –

+0

@ Gmercer015 OK、申し訳ありませんが、私はそれを知らなかった。 – kazarey

+0

@remyabel私はこれを読んだ。私はiteslfによって "手作り"の意味を理解しています、私は理解していないものはここで手作りされているものです。 – kazarey

答えて

7

「マシンモデル」とは、コンピュータがその言語で明らかにする方法を意味します。たとえば、CやC++では、バイト、メモリの場所、ポインタ、整数の型を多かれ少なかれ同じ方法で扱います。

ここで「手作り」とは、C++で提供される抽象化を使用せず、Cまたはアセンブリ(またはその抽象化を除いてC++)で効率的に記述される同等のコードを意味します。これは "狙い"であり、 "制約"ではありません.C++はすべての場合において正確に達成できません。そのコードは(当然です)、必要なときにストレージのサイズを変更するreallocを使用する可能性があるため

はそうちょうど例として、vector<int>は常に、mallocfreeを使って書かれた同様のサイズ変更可能な配列とまったく同じ性能を達成しません。 reallocは非常に頻繁にあなたを救うことはありませんが、それは塊を保存します。 vectorは、アロケータインターフェイスがreallocに相当する何も持っていないため、小さなオーバーヘッドが導入されているため、これを行うことはできません。しかし、vectorは、ほとんどすべての時間においてほぼ同じ性能を持ち、ゼロオーバヘッドの目的はほぼ満たされています。

もう1つの例:リリースモードでまともなC++コンパイラを使用している場合、myvector_of_int[3]を書くと、my_int_pointer[3]と比べてゼロオーバーヘッドが本当にあります。ローカル変数(myvector_of_intに格納されているデータポインタ)のデータメンバにアクセスするのにポインタ型のローカル変数(my_int_pointer)にアクセスする場合に比べてオーバーヘッドがないのはなぜか分かりませんが、余分な費用はかかりません。

+0

あなたはBjarneがC++で提供されている抽象化を使わない**を目指していると言っていますか? –

+2

いいえ、私は、あなたが抽象化を使用している場合、そこではゼロのオーバーヘッドを目指していると言っています。 "手作り"コード、つまり、抽象化と同じことをするコードは、C++コンパイラ/ライブラリがあなたのために行うのではなく、C言語で明示的に行います。 –

+0

* ooohhhh * gotcha。 –

6

「手作りの」コードでは、Stroustrupは手書きの抽象化の実装を意味します。例えば、手作業のforループは、ループ本体のN個のコピーである。 (単純な実装では、Duff's Deviceを参照してください。)

"マシンモデル"によって、Stroustrupはマシンのコンパイラのビューを意味します。たとえば、CおよびC++では、バイト、メモリの場所、メモリアクセスの順序付けなど、およそ同等のビューが提供されます。対照的に、Fortranは "バイト"という概念を持っておらず、メモリ位置(または配列アクセス)はC/C++ビューには全く対応していません。

+0

"手作りのforループはループ本体のN個のコピーになります" - あるいは手作りの 'for'ループはCまたはC++で' if'と 'goto'を含みます、またはアセンブリ内の条件付き分岐。それは、抽象化の重要な性質が何であると考えているのか、それは文脈によって異なる可能性があるのか​​という疑問です。 –