什么是命令和语句之间的区别

时间:2009-09-25 16:24:17

标签: language-design command tcl

通常在阅读Tcl(例如http://antirez.com/articoli/tclmisunderstood.html)时,您会读到“一切都是命令”。有时您也会听到其他语言,如Tcl,“命令语言”。

对于我的其他语言背景,我只是将这些“命令”视为语句。命令和语句之间究竟有什么区别?

6 个答案:

答案 0 :(得分:7)

传统上,在Tcl中,短语“一切都是命令”意味着没有“保留字”命令,或者系统定义的命令,你无法改变。每个可执行的Tcl代码都具有以下格式:

command ?arg1? ... ?argN?

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

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

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

以上代码未经测试......但它显示了一般的想法。

答案 1 :(得分:3)

命令是其他语言称为函数,例程或保留字的命令,可以通过“proc”命令或C或其他任何语言来定义。语句是对命令的调用。使用传统定义,Tcl中的语句是一个后跟零个或多个参数的命令。

请考虑以下代码:

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

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

确实,Tcl上的一些文章使用术语“命令”来表示命令的名称和命令的调用。我不会太挂了。将语句视为命令的调用,你会没事的。

当你看到短语“一切都是命令”时,就意味着没有保留字。看起来像语言语法或关键字的东西 - 如果,返回,退出,休息,等等...... - 都是命令。它们都可以被视为一样:它们可以被重命名,它们可以被删除,它们可以被重新实现等等。

答案 2 :(得分:1)

我会说命令就是你在声明中执行的命令;不同的语句可以执行相同的命令(通常使用不同的参数)。该命令是操作;语句是对操作的特定调用。

答案 3 :(得分:1)

我想这主要是一个语义问题,因此对这些概念的理解可能会有一些变化。也就是说,this Wikipedia article提供了一些符合我对该主题的直觉的指导。

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

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

因此,变量声明是一个声明,但可能不是命令。通过赋值运算符的变量赋值可能被某些人视为命令,而不是其他人。人们有时会听到它被称为分配命令,但不常见。如果它看起来像一个函数调用,就像在TCL中一样,那么它就更像“命令式”,因为它有一个明确的动词set

此外,语句可能包含多个命令。例如,考虑C中用逗号连接的几个函数调用。我会考虑一个语句,因为它有一个分号并返回一个值。但是,每个单独的调用都可以被视为一个命令。

在考虑语句/命令术语时要记住的另一件事是语句通常是指命令式程序,而命令通常是指shell和脚本。因此,当使用像bash这样的命令shell时,会谈到命令。如果我编写一个bash脚本,那么它通常被认为是一个命令脚本,而不是一个语句程序,尽管差异主要是学术上的。

作为早期脚本语言之一,TCL可能希望将自身区分为在shell(愿望)中运行的解释脚本语言与C和Pascal等编译语言之间的区别。例如,Perl稍后会受到欢迎,通常不会因这种区别而受到欢迎。

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

我担心我的答案可能没有做任何澄清区别的事情,但我希望它有所帮助。

答案 4 :(得分:0)

我经常想知道为什么在编程中使用术语'语句',因为它似乎与自然语言中的单词的含义不匹配,其中命令是命令而命令不是。直观地说,我更喜欢命令这个词。

在Pascal中,变量声明不被视为声明,正如Jeremy Bourque所暗示的那样(对于其他语言可能也是如此),因为每个编程块都在声明部分中包含所有声明,声明部分包含所有声明。 正如Jeremy Bourque所说,陈述以分号分隔。我认为在一个语句中不可能有多个命令(显然在C中)。当然,除了复合语句,它有一个或多个子语句。所以我想可以考虑Pascal中的命令和语句同义词。

但是,在Pascal的实现中,word命令通常用于给予编译器和开发环境(IDE)的命令。在源代码中为命令(语句)使用不同的单词可能很有用。也许是那些开发Pascal和其他早期语言的人,将命令视为可以立即执行的命令。因此,Bourque关于编译语言和脚本语言之间差异的评论对我来说是合乎逻辑的。

答案 5 :(得分:-1)

我认为命令是代码中的指令,并且语句可以运行多个命令,但最后评估为true或false。