通常在阅读 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 中的语句是一个命令,后跟零个或多个参数。
考虑以下代码:
1 proc hello {string} {
2 puts "hello, $string"
3 }
4 hello "world"
第 1 行定义了一个名为“hello”的命令,第 4 行是一个调用“hello”命令的语句。
确实,一些关于 Tcl 的文章使用术语“命令”来表示命令的名称和命令的调用。我不会太挂断那个。将语句视为命令的调用,您会没事的。
当您看到“一切都是命令”这句话时,这意味着没有保留字。看起来像语言语法或关键字的东西——if、return、exit、break、while 等等……——都是命令。它们都可以被同等对待:它们可以重命名、可以删除、可以重新实现等。
我会说命令是您在语句中执行的内容;不同的语句可能执行相同的命令(通常使用不同的参数)。命令就是操作;语句是操作的特定调用。
我想这主要是语义的问题,所以对这些概念的理解可能会有一些变化。也就是说,这篇 Wikipedia 文章提供了一些符合我对该主题的直觉的指导。
语句是命令式程序的一个单元。具体来说,它是由语句终止符终止的单元。在 C 中,这是一个分号。或者,在 Pascal 及其后代中,它是由语句分隔符分隔的单元。我认为在大多数 Pascal 风格中,这也是一个分号。
命令是一种操作,例如执行操作的函数调用或关键字。维基百科的文章将它们比作动词,我认为这是一个很好的描述。
因此,变量声明是一个语句,但可能不是命令。通过赋值运算符进行的变量赋值可能被某些人而不是其他人视为命令。人们有时会听到它被称为分配命令,但并不常见。如果它看起来像 TCL 中的函数调用,那么它更像是“命令式”,因为有一个明确的动词set
。
此外,语句可能包含多个命令。例如,考虑在 C 中使用逗号连接的几个函数调用。我会考虑这种说法,因为它有一个分号并返回一个值。但是,每个单独的调用都可以被视为一个命令。
在考虑语句/命令术语时要记住的另一件事是,语句通常指的是命令式程序,而命令通常指的是 shell 和脚本。因此,当使用像 bash 这样的命令 shell 时,人们会谈到命令。如果我编写一个 bash 脚本,那么它通常被认为是一个命令脚本,而不是一个语句程序,尽管差异在很大程度上是学术性的。
作为早期的脚本语言之一,TCL 可能希望将自身作为在 shell 中运行的解释性脚本语言(希望)与 C 和 Pascal 等编译语言进行区分。例如,Perl 比较晚才流行起来,通常不会强调这种区别。
但是,您仍然经常听到人们提到 Perl 脚本,而不是 Perl 程序,TCL 也是如此。
我担心我的回答可能对澄清区别没有任何帮助,但我希望它有所帮助。
我经常想知道为什么在编程中使用“语句”一词,因为它似乎与自然语言中单词的含义不匹配,其中命令是命令式而语句不是。直觉上,我更喜欢命令这个词。
在 Pascal 中,变量声明不被视为语句,正如 Jeremy Bourque 建议的那样(对于其他语言可能也是如此),因为每个编程块都分为包含所有声明的声明部分和包含所有语句的语句部分。正如上面 Jeremy Bourque 所说,语句用分号分隔。我认为在一个语句中不可能有多个命令(显然在 C 中)。当然,复合语句除外,它有一个或多个子语句。所以我想人们可以考虑 Pascal 中的命令和语句同义词。
然而,在 Pascal 的实现中,command 这个词通常用于给编译器和开发环境 (IDE) 的命令。在源代码中为命令(语句)使用不同的词可能会很有用。也许开发 Pascal 和其他早期语言的人认为命令是要立即执行的。因此,Bourque 关于编译语言和脚本语言之间差异的评论在我看来是合乎逻辑的。
我认为命令是代码中的指令,一条语句可能会运行多个命令,但最后评估为真或假。