2009-09-25 5 views
4

Часто при чтении о Tcl (например, http://antirez.com/articoli/tclmisunderstood.html) вы читаете, что «все является командой». Иногда вы также слышите, как другие языки, такие как Tcl, «командные языки».В чем разница между командой и оператором

Мне с моим фоном на других языках я просто рассматриваю эти «команды» как утверждения. Какая разница между командой и выражением?

+0

Спасибо всем. PS ... только что получил мою копию Ousterhout (и Jones) «Tcl и Tk Toolkit» 2-е издание –

+0

Вы нашли ответ, который искали в ответах? – RHSeeger

ответ

7

Традиционно в Tcl фраза «все является командой» означает, что нет такой вещи, как команда «зарезервированное слово» или одна, которая определяется системой, которую вы не можете изменить. Каждый исполняемый кусок Tcl кода формата:

command ?arg1? ... ?argN? 

Там нет такого понятия, как команда, которая является частью синтаксиса и не могут быть перезаписаны (например, «если» и других структур управления в большинстве языков) , Вполне возможно переопределить команду «if», чтобы сделать что-то немного другое.

Например, вы можете переопределить «а» как:

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

выше кода является непроверенной ... но он показывает общую идею.

+1

Мне кажется, что этот ответ мне лучше, чем мой. –

1

Я бы сказал, что команда - это то, что вы выполняете в инструкции; разные операторы могут выполнять одну и ту же команду (обычно с разными аргументами). Команда - это операция; оператор является конкретным вызовом операции.

-1

Я бы подумал, что команда - это инструкция в коде, и оператор может запускать несколько команд, но в конце оценивает значение true или false.

+0

Что вы говорите, не имеет смысла в контексте вопроса, который конкретно спрашивает о Tcl. Заявления в Tcl не обязательно оцениваются как true или false. –

3

Команда - это то, что другие языки называют функцией, обычным или зарезервированным словом и могут быть определены командой «proc» или на C или что-то еще. Операция является вызовом команды. Используя традиционные определения, утверждение в Tcl представляет собой команду, за которой следуют ноль или более аргументов.

Рассмотрим следующий код:

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

Линия 1 определяет команду с именем "привет", строка 4 является утверждение, что вызывает команду "HELLO".

Правда, в некоторых статьях на Tcl термин «команда» означает как имя команды, так и вызов команды. Я бы не стал слишком зависеть от этого. Думайте о заявлениях как о вызове команды, и все будет в порядке.

Когда вы видите фразу «все это команда», это означает, что зарезервированных слов нет. Вещи, которые выглядят как синтаксис языка или ключевые слова - if, return, exit, break, while and so on ... - это все команды. К ним можно относиться одинаково: их можно переименовать, их можно удалить, они могут быть повторно реализованы и т. Д.

+0

IMO вызов функции (с аргументами или без них) - это команда. Итак, строка 4 - это инструкция и команда. –

+1

nitpick alert: 'else' не является командой. Это аргумент 'if' –

+0

@glenn: спасибо. Я исправил это в своем ответе. –

1

Я думаю, что это в основном вопрос семантики, поэтому могут быть некоторые различия в понимании этих понятий. Тем не менее, this Wikipedia article содержит некоторые рекомендации, которые соответствуют моей интуиции на эту тему.

Заявление является единицей императивной программы. В частности, это единица, которая заканчивается терминатором оператора. В C это точка с запятой. Или, в Паскале и его потомках, это единица, разделенная разделителем операторов. Я думаю, что в большинстве вкусов Паскаля это также полуколона.

Команда - это действие, такое как вызов функции или ключевое слово, выполняющее действие. Статья в Википедии сравнивает их с глаголами, и я думаю, что это хорошее описание.

Таким образом, объявление переменной является инструкцией, но, вероятно, не является командой. И назначение переменной с помощью оператора присваивания может считаться командой некоторыми, а не другими. Иногда он слышит его как команду назначения, но не часто. Если он выглядит как вызов функции, как в TCL, тогда он более «командный», так как существует явный глагол set.

Кроме того, утверждения могут состоять из нескольких команд. Например, подумайте о нескольких вызовах функций в C, связанных с запятыми. Я бы подумал, что один оператор, поскольку он имеет одну точку с запятой и возвращает одно значение. Однако каждый отдельный вызов можно считать командой.

Другая вещь, которую следует учитывать при рассмотрении терминологии statement/command, заключается в том, что утверждения обычно относятся к императивным программам, тогда как команды обычно относятся к оболочкам и скриптам. Таким образом, при использовании командной оболочки, такой как bash, один говорит о командах. Если я пишу сценарий bash, то он обычно воспринимается как скрипт команд, а не программа заявлений, хотя разница в основном академическая.

TCL, как один из ранних языков сценариев, вероятно, хотел провести различие между собой как интерпретируемый язык сценариев, работающий в оболочке (желании), по сравнению с скомпилированными языками, такими как C и Pascal. Например, Perl, получив популярность несколько позже, обычно не сталкивается с различием.

Однако вы все еще часто слышите, как люди ссылаются на скрипты Perl, а не на программы Perl, а также на TCL.

Я боюсь, что мой ответ, возможно, ничего не сделал, чтобы прояснить различие, но я надеюсь, что это поможет.

0

Я часто задавался вопросом, почему термин «инструкция» используется в программировании, поскольку он, похоже, не соответствует значению слова на естественном языке, где команда является императивом, а утверждение не является. Интуитивно я бы предпочел слово command.

В Pascal объявление переменной не считается утверждением, как предлагает Джереми Бурк (это может быть верно для других языков), поскольку каждый блок программирования разделен на раздел объявления со всеми объявлениями и секцией операторов со всеми операторами , Заявления разделяются точкой с запятой, как говорит Джереми Бурк. Я не думаю, что в одном утверждении возможно иметь более одной команды (как, например, в C). За исключением составных утверждений, которые имеют одну или несколько подзапросов. Поэтому я предполагаю, что в Pascal можно было бы рассматривать синонимы команд и операторов.

Однако в реализациях Pascal команда слов часто используется для команд, заданных компилятору и среде разработки (IDE). Возможно, было бы полезно иметь другое слово для команд (операторов) в исходном коде. Возможно, люди, которые разработали Паскаль и другие ранние языки, считали команду чем-то, что должно было быть выполнено немедленно. Поэтому замечание Бурка о различии между скомпилированными и написанными на скрипте языках звучит логично для меня.

Смежные вопросы