命令和语句有什么区别?

6
通常在阅读有关Tcl的文章时(例如http://antirez.com/articoli/tclmisunderstood.html),你会看到“一切皆为命令”的说法。有时你还会听到其他语言被称为“命令语言”,就像Tcl一样。
对我来说,由于我具备其他语言的背景,我只将这些“命令”视为语句。那么,命令和语句之间有什么不同呢?

谢谢大家。PS...我刚拿到了Ousterhout(和Jones)的《Tcl和Tk工具包》第二版。 - Dexygen
你在回复中找到了你想要的答案吗? - RHSeeger
6个回答

7

在Tcl中,“一切皆命令”这个短语传统上意味着没有所谓的“保留字”命令,或者说不存在由系统定义且无法更改的命令。每一个可执行的Tcl代码都是以下格式:

command ?arg1? ... ?argN?

在大多数语言中,没有什么命令是语法的一部分且不能被覆盖的(例如“if”和其他控制结构)。可以完全重新定义“if”命令以执行略有不同的操作。

例如,您可以将“while”重新定义为:

proc while {expression body} {
    for {} {[uplevel 1 expr $expression]} {} {
        uplevel 1 $body
    }
}

上述代码未经测试...但它展示了一般的思路。

1
我认为这个答案比我的更好。 - Bryan Oakley

3

一个命令是其他语言中称为函数、例程或保留字的东西,可以通过“proc”命令或C语言等来定义。语句是对命令的调用。按照传统的定义,Tcl中的语句是由一个命令后跟零个或多个参数组成。

考虑以下代码:

1   proc hello {string} {
2      puts "hello, $string"
3   }
4   hello "world"

第一行定义了一个名为“hello”的命令,第四行是调用“hello”命令的语句。

确实,关于Tcl的一些文章使用术语“command”来同时表示命令的名称和命令的调用。但不要过于纠结于此。把语句看作是命令的调用,你就会明白。

当你看到短语“everything is a command”时,它意味着没有保留字。看起来像语言语法或关键字的东西 - if、return、exit、break、while等等 - 都是命令。它们都可以被同等对待:它们可以被重命名,它们可以被移除,它们可以被重新实现等等。


在我看来,函数调用(带参数或不带参数)是一条命令。因此,第4行既是语句又是命令。 - Nick Dandoulakis
1
小问题提醒:else 不是一个命令,而是 if 的参数。 - glenn jackman

1
我认为命令是在语句中执行的操作;不同的语句可能会执行相同的命令(通常使用不同的参数)。命令是操作,语句是对该操作的具体调用。

1

我想这主要是一个语义问题,所以对于这些概念的理解可能会有一些差异。话虽如此,这篇维基百科文章提供了一些指导,与我对这个主题的直觉相符。

语句是命令式程序的一个单元。具体来说,它是由语句终止符终止的单元。在C语言中,这是一个分号。或者,在Pascal及其后代中,它是由语句分隔符分隔的单元。我认为在大多数Pascal语言中,这也是一个分号。

命令是一个动作,例如函数调用或执行操作的关键字。维基百科的文章将它们比作动词,我认为这是一个很好的描述。

因此,变量声明是一个语句,但可能不是一个命令。通过赋值运算符进行变量赋值可能被一些人认为是一个命令,而其他人则不是。有时听到它被称为赋值命令,但并不经常。如果它看起来像一个函数调用,就像TCL一样,那么它更像是一个“命令”,因为有一个明确的动词set

此外,语句可能由多个命令组成。例如,在C语言中,考虑使用逗号连接的多个函数调用。我认为这是一个语句,因为它只有一个分号并返回一个值。但是,每个单独的调用都可以被视为一个命令。

在考虑语句/命令术语时要记住的另一件事是,语句通常指命令式程序,而命令通常指shell和脚本。因此,在使用像bash这样的命令shell时,人们谈论命令。如果我编写一个bash脚本,那么它通常被认为是一系列命令的脚本,而不是一系列语句的程序,尽管区别在很大程度上是学术性的。

TCL作为早期脚本语言之一,可能希望将自己作为在shell(wish)中运行的解释脚本语言与像C和Pascal这样的编译语言区分开来。例如,Perl稍后才变得流行,通常不会强调这种区别。

然而,您仍然经常听到人们提到Perl脚本,而不是Perl程序,同样也适用于TCL。

我担心我的答案可能没有澄清这种区别,但我希望它有所帮助。


0

我经常想知道为什么编程中使用术语“语句”,因为它似乎与自然语言中该词的含义不符,其中命令是一种命令而语句则不是。直觉上,我更喜欢单词“命令”。

在Pascal中,变量声明不被视为语句,正如Jeremy Bourque所建议的那样(对于其他语言可能也是如此),因为每个编程块都分为一个声明部分和一个语句部分。语句由分号分隔,就像Jeremy Bourque上面所说的那样。我认为在一个语句中不可能有多个命令(似乎在C中可以)。当然,除了复合语句之外,复合语句具有一个或多个子语句。因此,我想在Pascal中可以将命令和语句视为同义词。

然而,在Pascal的实现中,单词“命令”通常用于向编译器和开发环境(IDE)发出命令。在源代码中,为命令(语句)使用不同的单词可能很有用。也许开发Pascal和其他早期语言的人们认为命令是立即执行的东西。因此,Bourque关于编译语言和脚本语言之间差异的评论对我来说是合乎逻辑的。


-1
我认为命令是代码中的指令,而语句可能运行多个命令,但最终会评估为真或假。

你所说的话在问题的上下文中没有意义,问题明确询问的是关于Tcl的。在Tcl中的语句不一定会评估为真或假。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接