var=1 は実際には var = 1 とどう違うのですか? そして、これらの違いが本当に重要な言語と重要でない言語は何ですか?
5 に答える
さて、bash
一つに:
var = 1
とパラメータを使用してvar
プログラムを実行しようとしますが、次のようになります。=
1
var=1
に設定var
し1
ます。別のバリアントもあります。
var= 1
これは一時的var
に空の文字列に設定され、1
プログラムを実行しようとします (var
実行後に元の値に復元されます)。
そして、完全を期すために:
var =1
var
単一の引数でプログラムを実行しようとします=1
。
Brainfuck では、どちらもコメントとして無視されます。
sh では、引数およびを使用してプログラムを実行しようとするときに、 をにvar=1
設定var
します。1
var = 1
var
=
1
から読む:
コンピューター プログラミング言語で記述されたソース コード内で発生する一連の空白 (最初の空白文字を超える) は、通常は無視されます。そのような言語は自由形式です
コンピュータ プログラミングでは、自由形式言語は、プログラム テキスト内のページ上の文字の配置が重要でないプログラミング言語です。プログラム テキストは、古いパンチ カード システムのように特定の列に配置する必要はなく、多くの場合、行末は重要ではありません。空白文字はトークンを区切るためにのみ使用され、それ以外の意味はありません。
C、Pascal、Perl など、ほとんどの自由形式言語は ALGOL から派生しています。Lisp 言語は自由形式ですが、ALGOL から派生したものではありません。REXX はほとんど自由形式ですが、空白文字が連結演算子である場合もあります。SQL は完全なプログラミング言語ではありませんが、自由形式でもあります。
私の知る限り、「=」はほとんどのプログラミング言語で「代入」を意味します (コンパイラは空白を無視します)。
「==」と「===」は、javascript などの場所で異なる場合があります。
注: 一部の言語var
では、それ自体が問題になります。たとえば、C# では予約済みのキーワードです。だから多分x = 1
もっと良い例でしょう。また、「=」は一部の言語では代入演算子であり、他の言語では等価チェック演算子です。そのような問題を心配する代わりに、私は語彙処理のさまざまな流派に集中してきました。
私のペニーの価値:
Algol の伝統を持つほとんどのプログラミング言語 (C とその子孫を含む) では、このような空白は違いを生みません。このような言語で
`3+4
は、事前定義された multisymbol 演算子の 1 つを形成できない限り、構文 (または意味論的効果) の影響なしに空白を削除できます。3 + 4
x++-5
x ++ - 5
x + + - 5
空白で中断されていない (英数字以外の) 記号の任意のシーケンスが有効な識別子である SML などの言語があります。そのような言語
3+4
では、3 + 4
butx++-4
(x ++- 4') is not the same as
x++ - 4'.3+4
のようなものでさえ単一のトークンとして、つまり構文的に異なるものとして扱われる言語があります3 + 4
。FORTRAN の初期のバージョンには興味深いアプローチがあり、これが批判を集め、宇宙船のバグ ストーリーの根幹となりました。(詳細は以下)。
最後に、Miranda、Haskell、CoffeeScript などの一部の言語は、ISWIM の伝統に従い、インデントを構文的に重要なものにしています。
空白の扱いで悪名高い言語の例は Fortran です (ただし、ほとんどの批判はこの言語の以前のバージョンに当てはまりますが、後のバージョンはこの点でより Algol に似ています)。
興味深い話の 1 つは、FORTRAN がスペースを無視するためにロケット (私が聞いたバージョンではスペースシャトル) が誤動作する原因となったバグの話 DO 10 I = 1.100
ですDO 10 I = 1,100
。ループ) は、変数 へfor
の値の代入として解析されました。100
DO 10 I
FORTRANコードの行
DO 10 I = 1.100
どうやら実際に発生したようです。コンパイラは、空白を無視し、暗黙的に宣言してから DO10I を割り当てて、本来の処理を実行したようです。驚くべきことに、このプログラムは使用前に実際にテストされています。エラーが検出されたため、ロケットは保存されましたが、将来のファクトイドが台無しになりました。ロケットの終焉は広く報道され、プログラマーの民間伝承の一部となっています。
引用元:
http://www-users.cs.york.ac.uk/susan/cyc/p/fbug.htm
さまざまなプログラミング言語での空白のトピックは、非常に興味深いものになる可能性があります。
http://c2.com/cgi/wiki?SyntacticallySignificantWhitespaceConsideredHarmful
この非常に興味深く面白い (マニアックな方法で) ソースからの引用:
空白が常に区切り文字として使用される理由を不思議に思う必要があります。空白を区切り文字として使用することで、ユーザーが名前にスペースを含めることを防ぎ、CamelCase と EmbeddedUnderscore の聖戦を引き起こします。C では、スペースはタイプ/スコープ情報にのみ使用されることを考慮してください。言語がコロンを使用するよりパスカルのようなアプローチを選択していた場合、聖戦全体を回避できたはずです。その間
グローバル、const、文字列: null ポインター例外メッセージ = 「null ポインター例外が発生しました」
私たちの目には異質に見えるかもしれませんが、それはいくつかの厄介なスタイルの問題を回避したでしょう. 特に、スペース区切りは Unix 全体に広まったようで、win32 との互換性 (ファイル名、SQL テーブルなどのスペースに問題がない) が面倒です。
多くのプログラミング言語 (C、C++、Lisp、Java、Forth など、および HTML など) では、空白の有無は構文的に重要です (そうでない場合、「foo bar」は同じ意味になります)。 「foobar」など) (トークン区切り)。(LISP は、リスト内の項目を区切るためにスペースを使用します... 他の言語ではコンマを使用することがよくあります。) ただし、さまざまなフレーバーの空白 (タブ、スペースバー、改行、改行、CR/LF) およびさまざまな量のスペースは、すべて同じように扱われます。 「いくつかの空白」。1 つのスペース、3 つのスペース、2 つの改行、タブ - それらの間に大きな違いはありません。