2016-07-13 5 views
4

私はTOCとコンパイラのデザインを勉強していますが、まだ完成していません。一方、私はアセンブリとマシンコードについて非常に浅い知識を持っています。私はC++を勉強しているので、両側(コードのHLLとLLL表現)を結ぶという欲求と必要性を常に持っていますパフォーマンスと最適化に関する議論を行います。可変識別子は、一日の終わりに全く不要ですか?

私の質問は次のとおりです:コードの文の中で式として書かれたときに私たちの変数は、これらすべての変数(および識別子を持つ他のエンティティ)実行時になって、単なる指示を行う

C++は静的型付け言語であります仮想メモリの位置(静的およびグローバル)と、ローカル変数のスタックアドレスに関連するアドレッシングについて説明します。

つまり、セマンティックおよび構文検証を含むコンパイルが成功した後、実行時にシンボルテーブルを使用しなくても、識別子やチェックを考えずにターゲットメモリバイトの保証されたエンティティとしてデータを処理するのは賢明ではありません必要なの?

私の質問が、学習努力が不足していることが原因の質問のタイプ(私はそうではないと思っています)のように見える場合は、そのことを教えてください。それが正しかったのは、私が最近C++に集中しており、まだ低レベル言語の知識を持っていないという機会がないからです。事前にお詫びします。

+4

これは、基本的に、イントロスペクションやリフレクションを使わないで静的にコンパイルされた言語の仕組みです。C++ソースファイルをコンパイルすると、コンパイラによって生成されたオブジェクトファイルには、ソース内の変数への参照がありません。それはすべての記憶場所です。 –

+2

はい、あなたの理解は正しいです。 –

+0

TLDR;混乱する。しかし、 'C++は静的型付けされた言語です:'間違っています。これにはCが含まれています。 –

答えて

2

はい、ほとんどです。識別子が単なるアドレスまたはスタックオフセット以上に残るようにするいくつかの詳細があります。

最初に、RTTIにはC++が含まれています。つまり、実行時に少なくともタイプの名前が引き続き使用可能な場合があります。例:

const std::type_info &info = typeid(*ptr_interface); 
std::cout << info.name() << std::endl; 

*ptr_interfaceの種類の名前を印刷します。

第2に、プログラムがリンクされる方法のために、オブジェクトファイルのシンボルが実行中のイメージにまだ存在する可能性があります。たとえば、関数名を含むスタックのバックトレースを生成できるので、linuxカーネルはこれを利用しています。また、モジュールをロードしてリンクするために、関数名の知識を使用します。同様の機能がGnu Cライブラリに存在します。リンクされていると、スタックトレース内の関数名を取得できます。

通常の場合、コードは変数の元の名前の影響を受けません(しかし、コンパイラは変数が持つ型に適したコードを出力します)。

+0

ありがとうございます。私は、普通のコードx = y + 1でl-値またはr-値にアクセスする単純変数を考えてみましょう。変数にアクセスする式は、実行時に識別子もタイプも指定されていないため、アドレッシングの指示としてチェックされません。これを仮定するのは正確ですか? – Physician

+1

RTTIは、コンパイラによってオンとオフに切り替えられる機能であり、プログラムに余分なオーバーヘッドが加わることに注意してください。 – NathanOliver

+1

@Physicianよく、マシンコード自体は、変数に割り当てられたメモリにアクセスするために適切なワイドなレジスタ/アラインメントを使用しますが、最終的にはあなたの質問である場合、C++コードの見た目に本質的には気を付けません。それは確かにどのような変数の名前が気にしません。 –

3

あなたがいます。マシンコードにコンパイルされると、もはや変数識別子(またはそのような変数型)の概念はなくなります。特定の場所のバイトだけです。 どのの場所は、変数名に基づいて(コンパイル時に)コンパイラによって、グローバル変数の場合にはリンカー(リンク時)によって決定されました。

もちろん、デバッグの目的で識別子などの情報を保持すると便利です。これはまさに「デバッグ情報を使ったコンパイル」という意味です。コンパイラは、そのようにすると、(冗長な)識別子を生成されたコードに埋め込み、デバッガがそのコードにアクセスできるようにします。あるいは、それらを別のファイルに入れてください。その詳細はデバッグ情報の形式に依存します。

関連する問題