2

Delphi では、次のことができます。

 interface 
 var
   test: string = 'this is a test!'; { compiler accepts that }

しかし、これはできません:

 implementation
 procedure showTest;
 var
   internal_test1; { compiler accepts that }
   internal_test2: string = 'another test'; { compiler error }

Embarcadero のユーザーが答えてくれることを願っています。:-)

4

2 に答える 2

9

グローバル変数の値は、コンパイル時の定数式から割り当てられ、プログラムのデータ セグメントに格納されます。つまり、これらの変数用のスペースは EXE ファイルに物理的に割り当てられるため、OS がプログラムをロードすると、これらの変数は暗黙的にロードされます。コンパイラは、実行時にコードを実行することなく、これらの変数が確実に初期化されるようにすることができます。初期値をEXEファイルに保存するだけです。

一方、ローカル変数は実行時まで存在しません。EXE には、これらの変数を常に参照する物理的なスペースはありません。それらを初期化するために、コンパイラはそれらに値を割り当てるコードを生成する必要があります。

初期のコンパイラでは技術的に簡単に実装できるため、グローバル変数を初期化できます。これは、実行時に基本的に無料の機能であり、CPU による命令の実行を必要としません。

ローカル変数を初期化する場合は、自由にコードを記述できます。そのコードは、コンパイラが挿入したコードが行うこととまったく同じことを行うことができます。

于 2013-06-25T16:48:03.220 に答える
3

Niklaus Wirth はコンピューター科学者で、言語とコンパイラーの設計を研究し、教えていました。Pascal 言語とコンパイラを設計したとき、彼の設計目標の一部は、コンパイラを小さく高速かつ効率的にすることと、タスクを分割して、コンパイラがコンパイラにとって簡単なことを実行し、プログラマが実行しやすいことを実行することでした。プログラマー。

これらの目標に沿って、彼はソース コードを 1 回読むだけですべてを最初から理解できるシングルパス コンパイラを設計しました。彼はまた、非常に単純なステート マシンを備えたコンパイラを設計しました。つまり、すべてが正しい順序で、正しい順序でのみ実行されます。

そうすることで、彼は非常に小さく、高速で、効率的で正確なコンパイラを簡単に手に入れることができました。これは、C コンパイラが困難で、不正確で、非効率的であることが知られており、FORTRAN コンパイラが遅くて大きいのとは対照的です。

プログラムの開始時に静的定数の割り当てを 1 回行うことは、小さく、高速で、効率的で、正しいコンパイラを作成できる設計上の決定事項の 1 つです。

数十年前、Borland は、小さく、高速で、効率的で、正確な Pascal コンパイラを作成しました。これは、アウトオブオーダー宣言やその他の一般的に有用で役立つオプションを許可する、他の企業 (MS など) のより高価な製品との競争に再び成功しました。コンパイラはより遅く、難しくなりましたが、プログラミングはより簡単になりました。

言い換えれば、MS は、Borland/Wirth とは異なる方法で、コンパイラとユーザーの間でタスクを分割することを選択しました。

また、MS Pascal コンパイラはかなり前に廃止されました。ただし、Borland コンパイラは引き続き Delphi として使用されます。

コンピューターは以前よりもはるかに高速になりましたが、小さく、高速で、効率的で、正確なコンパイラーを作成するタスクは同じままです。新機能は無料ではありません。コンパイルを複雑にすることには代償が伴います。コンパイラと言語全体が最初から設計された方法の例外として追加する必要がある場合、単純な機能でさえ面倒です。

于 2013-07-04T04:28:51.903 に答える