Declaração (ciência da computação) - Statement (computer science)
Na programação de computadores , uma instrução é uma unidade sintática de uma linguagem de programação imperativa que expressa alguma ação a ser executada. Um programa escrito em tal linguagem é formado por uma sequência de uma ou mais instruções. Uma instrução pode ter componentes internos (por exemplo, expressões ).
Muitas linguagens de programação (por exemplo , Ada , Algol 60 , C , Java , Pascal ) fazem uma distinção entre instruções e definições / declarações . Uma definição ou declaração especifica os dados nos quais um programa deve operar, enquanto uma instrução especifica as ações a serem tomadas com esses dados.
As declarações que não podem conter outras declarações são simples ; aqueles que podem conter outras declarações são compostos .
A aparência de uma instrução (e de fato de um programa) é determinada por sua sintaxe ou gramática. O significado de uma declaração é determinado por sua semântica .
Afirmações simples
As declarações simples são completas em si mesmas; isso inclui atribuições, chamadas de sub-rotina e algumas instruções que podem afetar significativamente o fluxo de controle do programa (por exemplo , ir para , retornar , parar / interromper). Em algumas linguagens, entrada e saída, asserções e saídas são tratadas por instruções especiais, enquanto outras linguagens usam chamadas para sub-rotinas predefinidas.
-
atribuição
- Fortran:
variable = expression
- Pascal, Algol 60, Ada:
variable := expression;
- C, C #, C ++, PHP, Java:
variable = expression;
- Fortran:
-
ligar
- Fortran:
CALL subroutine name(parameters)
- C, C ++, Java, PHP, Pascal, Ada:
subroutine name(parameters);
- Fortran:
-
afirmação
- C, C ++, PHP:
assert(relational expression);
- Java:
assert relational expression;
- C, C ++, PHP:
-
vamos para
- Fortran:
GOTO numbered-label
- Algol 60:
goto label;
- C, C ++, PHP, Pascal:
goto label;
- Fortran:
-
Retorna
- Fortran:
RETURN value
- C, C ++, Java, PHP:
return value;
- Fortran:
-
parar / parar / sair
- Fortran:
STOP number
- C, C ++:
exit(expression)
- PHP:
exit number;
- Fortran:
Declarações compostas
As declarações compostas podem conter (sequências de) declarações, aninhadas em qualquer profundidade razoável e geralmente envolvem testes para decidir se devem ou não obedecer ou repetir as declarações contidas.
- Notação para os seguintes exemplos:
- <statement> é qualquer declaração única (pode ser simples ou composta).
- <sequence> é qualquer sequência de zero ou mais <statements>
- Algumas linguagens de programação fornecem uma maneira geral de agrupar instruções, de modo que qualquer <instrução> única possa ser substituída por um grupo:
- Notação para os seguintes exemplos:
- Algol 60:
begin <sequence> end
- Pascal:
begin <sequence> end
- C, PHP, Java:
{ <sequence> }
- Algol 60:
- Outras linguagens de programação têm um terminador especial diferente em cada tipo de instrução composta, de modo que uma ou mais instruções são tratadas automaticamente como um grupo:
- Ada:
if test then <sequence> end if;
- Ada:
- Outras linguagens de programação têm um terminador especial diferente em cada tipo de instrução composta, de modo que uma ou mais instruções são tratadas automaticamente como um grupo:
Muitas instruções compostas são comandos de loop ou comandos de escolha. Em teoria, apenas um de cada um desses tipos de comandos é necessário. Na prática, existem vários casos especiais que ocorrem com bastante frequência; eles podem tornar um programa mais fácil de entender, podem tornar a programação mais fácil e, muitas vezes, podem ser implementados com muito mais eficiência. Existem muitas sutilezas não mencionadas aqui; consulte os artigos vinculados para obter detalhes.
-
loop controlado por contagem :
- Algol 60:
for index := 1 step 1 until limit do <statement> ;
- Pascal:
for index := 1 to limit do <statement> ;
- C, Java:
for ( index = 1; index <= limit; index += 1) <statement> ;
- Ada:
for index in 1..limit loop <sequence> end loop
- Fortran 90:
- Algol 60:
- Índice DO = 1, limite
- <sequência>
- FIM DO
- Índice DO = 1, limite
-
loop controlado por condição com teste no início do loop:
- Algol 60:
for index := expression while test do <statement> ;
- Pascal:
while test do <statement> ;
- C, Java:
while (test) <statement> ;
- Ada:
while test loop <sequence> end loop
- Fortran 90:
- Algol 60:
- FAÇA ENQUANTO (teste)
- <sequência>
- FIM DO
- FAÇA ENQUANTO (teste)
-
loop controlado por condição com teste no final do loop:
- Pascal:
repeat <sequence> until test; { note reversed test}
- C, Java:
do { <sequence> } while (test) ;
- Ada:
loop <sequence> exit when test; end loop;
- Pascal:
- loop controlado por condição com teste no meio do loop:
- C:
do { <sequence> if (test) break; <sequence> } while (true) ;
- Ada:
loop <sequence> exit when test; <sequence> end loop;
- C:
-
Situação simples de instrução if :
- Algol 60:
if test then <unconditional statement> ;
- Pascal:
if test then <statement> ;
- C, Java:
if (test) <statement> ;
- Ada:
if test then <sequence> end if;
- Fortran 77+:
- Algol 60:
- SE (teste) ENTÃO
- <sequência>
- FIM SE
- SE (teste) ENTÃO
-
escolha bidirecional da instrução if :
- Algol 60:
if test then <unconditional statement> else <statement> ;
- Pascal:
if test then <statement> else <statement> ;
- C, Java:
it (test) <statement> else <statement> ;
- Ada:
if test then <sequence> else <sequence> end if;
- Fortran 77+:
- Algol 60:
- SE (teste) ENTÃO
- <sequência>
- OUTRO
- <sequência>
- FIM SE
- SE (teste) ENTÃO
-
Escolha de múltiplas vias de instrução case / switch :
- Pascal:
case c of 'a': alert(); 'q': quit(); end;
- Ada:
case c is when 'a' => alert(); when 'q' => quit(); end case;
- C, Java:
switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
- Pascal:
-
Tratamento de exceções :
- Ada:
begin protected code except when exception specification => exception handler
- Java:
try { protected code } catch (exception specification) { exception handler } finally { cleanup }
- Pitão:
try: protected code except exception specification: exception handler else: no exceptions finally: cleanup
- Ada:
Sintaxe
Além de atribuições e chamadas de sub-rotina, a maioria dos idiomas inicia cada instrução com uma palavra especial (por exemplo, goto, if, while, etc.), conforme mostrado nos exemplos acima. Vários métodos foram usados para descrever a forma de declarações em diferentes linguagens; os métodos mais formais tendem a ser mais precisos:
- Algol 60 usou a forma Backus – Naur (BNF) que estabeleceu um novo nível para a especificação da gramática da linguagem.
- Até o Fortran 77, o idioma era descrito em prosa inglesa com exemplos, do Fortran 90 em diante, o idioma era descrito usando uma variante do BNF.
- Cobol usou uma metalinguagem bidimensional.
- Pascal usou diagramas de sintaxe e BNF equivalente.
O BNF usa recursão para expressar repetição, então várias extensões foram propostas para permitir a indicação direta de repetição.
Declarações e palavras-chave
Algumas gramáticas de linguagens de programação reservam palavras-chave ou marcam-nas de maneira especial e não permitem que sejam usadas como identificadores . Isso geralmente leva a gramáticas que são mais fáceis de analisar , exigindo menos antecipação .
Sem palavras-chave distintas
Fortran e PL / 1 não possuem palavras-chave reservadas, permitindo afirmações como:
- em PL / 1:
-
IF IF = THEN THEN ...
(o segundoIF
e o primeiroTHEN
são variáveis).
-
- em Fortran:
-
IF (A) X = 10...
declaração condicional (com outras variantes) -
IF (A) = 2
atribuição a uma variável subscrita chamadaIF
-
-
- Como os espaços eram opcionais até o Fortran 95, um erro de digitação poderia mudar completamente o significado de uma declaração:
-
DO 10 I = 1,5
início de um loop com I correndo de 1 a 5 -
DO 10 I = 1.5
atribuição do valor 1,5 à variávelDO10I
Palavras sinalizadas
Em Algol 60 e Algol 68, tokens especiais foram distinguidos explicitamente: para publicação, em negrito, por exemplo begin
; para programação, com alguma marcação especial, por exemplo, uma bandeira ( 'begin
), aspas ( 'begin'
) ou sublinhado ( begin
no Elliott 503 ). Isso é chamado de "stropping".
Os tokens que fazem parte da sintaxe da linguagem, portanto, não entram em conflito com os nomes definidos pelo programador.
Palavras-chave reservadas
Certos nomes são reservados como parte da linguagem de programação e não podem ser usados como nomes definidos pelo programador. A maioria das linguagens de programação mais populares usa palavras-chave reservadas. Os primeiros exemplos incluem FLOW-MATIC (1953) e COBOL (1959). Desde 1970, outros exemplos incluem Ada, C, C ++, Java e Pascal. O número de palavras reservadas depende do idioma: C tem cerca de 30, enquanto COBOL tem cerca de 400.
Semântica
A semântica se preocupa com o significado de um programa. Os documentos de padrões para muitas linguagens de programação usam BNF ou algum equivalente para expressar a sintaxe / gramática de uma maneira bastante formal e precisa, mas a semântica / significado do programa é geralmente descrito usando exemplos e prosa em inglês. Isso pode resultar em ambiguidade. Em algumas descrições de linguagem, o significado de declarações compostas é definido pelo uso de construções 'mais simples', por exemplo, um loop while pode ser definido por uma combinação de testes, saltos e rótulos, usando if
e goto
.
O artigo de semântica descreve vários formalismos matemáticos / lógicos que foram usados para especificar a semântica de uma maneira precisa; estes são geralmente mais complicados do que o BNF, e nenhuma abordagem única é geralmente aceita como o caminho a percorrer. Algumas abordagens definem efetivamente um intérprete para a linguagem, algumas usam lógica formal para raciocinar sobre um programa, algumas anexam afixos a entidades sintáticas para garantir consistência, etc.
Expressões
Freqüentemente, é feita uma distinção entre instruções, que são executadas, e expressões , que são avaliadas. O valor obtido de uma expressão é frequentemente usado como parte de uma instrução, por exemplo, atribuição variable := expression;
Algumas linguagens de programação (por exemplo, C, C ++) permitem que algumas instruções forneçam um resultado (tecnicamente todas as instruções fornecem um resultado, mas esse resultado é frequentemente do tipo 'void' e não pode ser usado para nada). A declaração mais útil que fornece um resultado é uma atribuição, o resultado sendo o valor recém-atribuído.
Isso pode ser útil para inicialização múltipla:
-
i = j = 0;
que é tratado comoi = (j = 0);
Isso também pode resultar em um simples problema com o dedo, alterando completamente o significado de algum código:
-
if (i == j) {. . . };
testa para ver sei
é igual aj
-
if (i = j) { . . . };
atribui o valor dej
ai
e testa para ver se esse valor é diferente de zero.
Algumas linguagens (Algol 60, Pascal) permitem atribuições múltiplas, mas não permitem que as atribuições apareçam nas expressões.
Extensibilidade
A maioria das linguagens tem um conjunto fixo de instruções definidas pela linguagem, mas houve experimentos com linguagens extensíveis que permitem ao programador definir novas instruções.