Tclについて読むとき(たとえばhttp://antirez.com/articoli/tclmisunderstood.html)、「すべてがコマンドである」と読むことがよくあります。Tclのような他の言語が「コマンド言語」であると聞くこともあります。
他の言語のバックグラウンドを持つ私にとって、私はこれらの「コマンド」をステートメントとして見ています。コマンドとステートメントの違いは正確には何ですか?
Tclについて読むとき(たとえばhttp://antirez.com/articoli/tclmisunderstood.html)、「すべてがコマンドである」と読むことがよくあります。Tclのような他の言語が「コマンド言語」であると聞くこともあります。
他の言語のバックグラウンドを持つ私にとって、私はこれらの「コマンド」をステートメントとして見ています。コマンドとステートメントの違いは正確には何ですか?
伝統的に、Tcl では、「すべてがコマンドである」というフレーズは、「予約語」コマンド、または変更できないシステムによって定義されたコマンドのようなものがないことを意味します。Tcl コードのすべての実行可能な部分は、次の形式です。
command ?arg1? ... ?argN?
構文の一部であり、上書きできないコマンドのようなものはありません (ほとんどの言語の "if" やその他の制御構造のように)。「if」コマンドを再定義して、少し異なることを行うことは完全に可能です。
たとえば、「while」を次のように再定義できます。
proc while {expression body} {
for {} {[uplevel 1 expr $expression]} {} {
uplevel 1 $body
}
}
上記のコードはテストされていません...しかし、それは一般的な考え方を示しています。
コマンドは、他の言語が関数、ルーチン、または予約語と呼ぶものであり、「proc」コマンドまたはCなどで定義できます。ステートメントは、コマンドの呼び出しです。従来の定義を使用すると、Tclのステートメントは、0個以上の引数が後に続くコマンドです。
次のコードを検討してください。
1 proc hello {string} {
2 puts "hello, $string"
3 }
4 hello "world"
1行目は「hello」という名前のコマンドを定義し、4行目は「hello」コマンドを呼び出すステートメントです。
確かに、Tclに関するいくつかの記事では、「コマンド」という用語を使用して、コマンドの名前とコマンドの呼び出しの両方を意味しています。私はそれにこだわる必要はありません。ステートメントをコマンドの呼び出しと考えれば、問題はありません。
「すべてがコマンドです」というフレーズが表示されている場合、それは予約語がないことを意味します。言語構文またはキーワードのように見えるもの(if、return、exit、break、whileなど...)はすべてコマンドです。それらはすべて同じように扱うことができます。名前を変更したり、削除したり、再実装したりすることができます。
コマンドはステートメントで実行するものだと思います。異なるステートメントが同じコマンドを実行する場合があります (通常は異なる引数を使用)。コマンドは操作です。ステートメントは、操作の特定の呼び出しです。
これは主にセマンティクスの問題だと思うので、これらの概念の理解には多少の違いがあるかもしれません。そうは言っても、このウィキペディアの記事は、このトピックに関する私の直感に沿ったガイダンスを提供します.
ステートメントは、命令型プログラムの単位です。具体的には、ステートメントターミネータによって終了されるのはユニットです。C ではセミコロンです。または、Pascal とその子孫では、ステートメント区切り文字で区切られているのは単位です。Pascal のほとんどのフレーバーでは、セミコロンでもあると思います。
コマンドは、アクションを実行する関数呼び出しやキーワードなどのアクションです。ウィキペディアの記事では動詞に例えられていますが、これは適切な説明だと思います。
したがって、変数宣言はステートメントですが、おそらくコマンドではありません。また、代入演算子による変数の代入は、コマンドと見なされる場合もあれば、そうでない場合もあります。割り当てコマンドと呼ばれることもありますが、それほど多くはありません。TCL のように関数呼び出しのように見える場合は、明示的な動詞があるため、より「コマンドに似ている」と言えますset
。
また、ステートメントは複数のコマンドで構成されている場合があります。たとえば、コンマで結合された C のいくつかの関数呼び出しについて考えてみましょう。1 つのセミコロンがあり、1 つの値を返すため、その 1 つのステートメントと見なします。ただし、個別の呼び出しはそれぞれコマンドと見なすことができます。
ステートメント/コマンドの用語を検討する際に留意すべきもう 1 つの点は、ステートメントは通常、命令型プログラムを指し、コマンドは通常、シェルとスクリプトを指すということです。したがって、bash のようなコマンド シェルを使用する場合は、コマンドを使用します。私が bash スクリプトを作成すると、通常はステートメントのプログラムではなくコマンドのスクリプトと見なされますが、その違いは主に学術的なものです。
初期のスクリプト言語の 1 つとしての TCL は、C や Pascal などのコンパイル済み言語とは対照的に、シェルで実行されるインタープリター型スクリプト言語 (希望) としてのそれ自体を区別したかったのでしょう。たとえば、Perl はやや遅れて人気を博したため、通常、その区別については口を閉ざしません。
しかし、Perl プログラムではなく、Perl スクリプトや、TCL について言及する人がいまだによく耳にします。
私の答えが区別を明確にするために何もしなかったのではないかと心配していますが、それが役立つことを願っています.
コマンドは命令でステートメントはそうではない自然言語の単語の意味と一致しないように見えるため、プログラミングで「ステートメント」という用語が使用される理由をよく疑問に思いました。直感的には、コマンドという言葉を好みます。
Pascal では、Jeremy Bourque が示唆するように (他の言語にも当てはまる可能性があります)、変数宣言はステートメントとは見なされません。これは、各プログラミング ブロックがすべての宣言を含む宣言セクションとすべてのステートメントを含むステートメント セクションに分割されているためです。Jeremy Bourque が上で述べたように、ステートメントはセミコロンで区切られます。1 つのステートメントに複数のコマンドを含めることはできないと思います (C のように)。もちろん、1 つ以上のサブステートメントを持つ複合ステートメントは除きます。したがって、Pascal ではコマンドとステートメントの同義語を考えることができると思います。
ただし、Pascal の実装では、コマンドという言葉は、コンパイラや開発環境 (IDE) に与えられるコマンドによく使用されます。ソース コード内のコマンド (ステートメント) に別の単語を使用すると便利な場合があります。おそらく、パスカルやその他の初期の言語を開発した人々は、コマンドをすぐに実行するものと見なしていました。したがって、コンパイルされた言語とスクリプト化された言語の違いに関する Bourque の発言は、私には論理的に聞こえます。
コマンドはコード内の命令であり、ステートメントは複数のコマンドを実行する可能性がありますが、最終的にはtrueまたはfalseと評価されます。