Bloquear (programação)

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

Na programação de computadores , um bloco ou bloco de código ou bloco de código é uma estrutura lexical de código-fonte que é agrupada. Os blocos consistem em uma ou mais declarações e declarações . Uma linguagem de programação que permite a criação de blocos, incluindo blocos aninhados em outros blocos, é chamada de linguagem de programação estruturada em blocos . Os blocos são fundamentais para a programação estruturada , onde as estruturas de controle são formadas a partir de blocos.

Os blocos têm duas funções: agrupar instruções para que possam ser tratadas como uma instrução e definir escopos para nomes para distingui-los do mesmo nome usado em outro lugar. Em uma linguagem de programação estruturada em blocos, os objetos nomeados nos blocos externos são visíveis dentro dos blocos internos, a menos que sejam mascarados por um objeto declarado com o mesmo nome.

História

Ideias de estrutura de blocos foram desenvolvidas na década de 1950 durante o desenvolvimento dos primeiros autocodes , e foram formalizadas nos relatórios Algol 58 e Algol 60 . Algol 58 introduziu a noção de "instrução composta", que estava relacionada exclusivamente ao fluxo de controle . [1] O Relatório Revisado subsequente , que descreveu a sintaxe e a semântica do Algol 60, introduziu a noção de um bloco e escopo de bloco , com um bloco consistindo em "Uma sequência de declarações seguidas por uma sequência de instruções e entre o início e o fim. ." em que "[toda] declaração aparece em um bloco dessa maneira e é válida apenas para esse bloco." [2]

Sintaxe

Os blocos usam sintaxe diferente em idiomas diferentes. Duas grandes famílias são:

  • a família ALGOL na qual os blocos são delimitados pelas palavras-chave " begin" e " end" ou equivalente. Em C , os blocos são delimitados por chaves - " {" e " }". ALGOL 68 usa parênteses.
  • Parênteses - " (" e " ", são usados ​​na linguagem de lote) do MS-DOS
  • recuo , como em Python
  • s-expressions com uma palavra-chave sintática como progou let(como na família Lisp )
  • Em 1968 (com ALGOL 68 ), então em 1974 Guarded Command Language de Edsger W. Dijkstra o bloco de código condicional e iterativo são alternativamente terminados com a palavra reservada do bloco invertida : por exemplo , eif ~ then ~ elif ~ else ~ ficase ~ in ~ out ~ esacfor ~ while ~ do ~ od

Limitações

Algumas linguagens que suportam blocos com declarações não suportam totalmente todas as declarações; por exemplo, muitas linguagens derivadas de C não permitem uma definição de função dentro de um bloco ( funções aninhadas ). E ao contrário de seu ancestral Algol, Pascal não suporta o uso de blocos com suas próprias declarações dentro do início e fim de um bloco existente, apenas instruções compostas que permitem que sequências de instruções sejam agrupadas em if , while , repeat e outras instruções de controle.

Semântica básica

O significado semântico de um bloco é duplo. Em primeiro lugar, fornece ao programador uma maneira de criar estruturas arbitrariamente grandes e complexas que podem ser tratadas como unidades. Em segundo lugar, permite que o programador limite o escopo de variáveis ​​e, às vezes, de outros objetos que foram declarados.

Nas primeiras linguagens, como Fortran IV e BASIC , não havia blocos de instruções ou estruturas de controle. As condicionais foram implementadas usando declarações condicionais goto :

C LINGUAGEM: ANSI STANDARD FORTRAN 66 
C INICIALIZAR VALORES A SEREM CALCULADOS 
PAYSTX = . FALSO . PAGAMENTO = . FALSO . IMPOSTO = 0,0 SUPTAX = 0,0 C PULAR DEDUÇÃO DE IMPOSTO SE O EMPREGADO GANHAR MENOS QUE O LIMITE DE IMPOSTO SE ( SALÁRIOS . LE . IMPOSTO ) GOTO 100 PAYSTX = . VERDADEIRO . IMPOSTO = ( SALÁRIOS - IMPOSTO ) * BASCRT        
        
        
        

          
        
            
C PULAR DEDUÇÃO DE SUPER IMPOSTO SE O EMPREGADO GANHAR MENOS QUE O LIMITE DE SUPER IMPOSTO 
SE ( SALÁRIOS . LE . SUPTHR ) IR PARA 100 PAGAMENTOS = . VERDADEIRO . SUPTAX = ( SALÁRIO - SUPTHR ) * SUPRAT   100 TAXADO = SALÁRIO - IMPOSTO - SUPTAX          
        
            
       

A estrutura lógica do programa não é refletida na linguagem, e analisar quando uma determinada instrução é executada pode ser difícil.

Os blocos permitem que o programador trate um grupo de instruções como uma unidade, e os valores padrão que deveriam aparecer na inicialização neste estilo de programação podem, com uma estrutura de blocos, ser colocados mais próximos da decisão:

    { Idioma: Jensen e Wirth Pascal } 
    if  salarios  >  tax_threshold  then 
        begin 
        paystax  :=  true ; 
        tax  :=  ( salários  -  tax_threshold )  *  tax_rate 
        { A estrutura do bloco facilita a visualização de como o código pode 
          ser refatorado para maior clareza, e também facilita a execução, 
          porque a estrutura da condicional interna pode ser facilmente movida 
          para fora do condicional externa completamente e os efeitos de fazê 
          -lo são facilmente previstos. } 
        se  salários  >  supertax_threshold  então começar 
            pays_supertax  :=  true ; 
            supertax  :=  ( salarios  -  supertax_threshold )  *  supertax_rate 
        end 
        else  begin 
            pays_supertax  :=  false ; 
            supertax  :=  0 
        end 
    end 
    else  begin 
        paystax  :=  false ;  pays_supertax  :=  false ; 
        imposto  :=  0 ;  supertaxa  :=  0 
    end ; 
    tributado  :=  salário  -  imposto -  sobretaxa ;

O uso de blocos no fragmento de Pascal acima esclarece a intenção do programador e permite combinar os blocos resultantes em uma hierarquia aninhada de instruções condicionais . A estrutura do código reflete mais de perto o pensamento do programador, tornando-o mais fácil de entender e modificar.

O código-fonte acima pode ser ainda mais claro retirando a instrução if interna da externa, colocando os dois blocos um após o outro para serem executados consecutivamente. Semanticamente há pouca diferença neste caso, e o uso de estrutura de blocos, suportado por recuo para legibilidade, facilita para o programador refatorar o código.

Em linguagens primitivas, as variáveis ​​tinham amplo escopo. Por exemplo, uma variável inteira chamada IEMPNO pode ser usada em uma parte de uma sub-rotina Fortran para denotar um número de previdência social (ssn) do funcionário, mas durante o trabalho de manutenção na mesma sub-rotina, um programador pode acidentalmente usar a mesma variável, IEMPNO, para um propósito diferente, e isso pode resultar em um bug difícil de rastrear. A estrutura de blocos torna mais fácil para os programadores controlarem o escopo em um nível mínimo.

;; Idioma: Esquema Padrão R5RS 
( let (( empno  ( ssn-of  employee-name ))) 
  ( while  ( is-manager  empno ) 
    ( let (( employees  ( length ( underlings-of  empno )))) 
      ( printf  "~a has ~a funcionários trabalhando com ele:~%"  nome do  funcionário funcionários ) 
      ( for-each 
        ( lambda ( empno ) 
          ;; Dentro desta expressão lambda a variável empno se refere ao ssn
          ;; de um subalterno. A variável empno na expressão externa, 
          ;; referindo-se ao ssn do gerente, está sombreado. 
          ( printf  "Nome: ~a, função: ~a~%" 
                  ( nome-de  empno ) 
                  ( papel-de  empno ))) 
        ( subalternos de  empno ))))))

No fragmento Scheme acima , empno é usado para identificar o gerente e seus subordinados cada um por seu respectivo ssn, mas como o ssn subordinado é declarado dentro de um bloco interno, ele não interage com a variável de mesmo nome que contém o ssn do gerente . Na prática, considerações de clareza provavelmente levariam o programador a escolher nomes de variáveis ​​distintos, mas eles têm a escolha e é mais difícil introduzir um bug inadvertidamente.

Içamento

Em algumas linguagens, uma variável pode ser declarada no escopo da função mesmo dentro de blocos fechados. Por exemplo, em JavaScript, variáveis ​​declaradas com vartêm escopo de função.

Veja também

Referências

  1. ^ Perlis, AJ ; Samelson, K. (1958). "Relatório preliminar: linguagem algébrica internacional". Comunicações da ACM . Nova York, NY, EUA: ACM. 1 (12): 8–22. doi : 10.1145/377924.594925 . S2CID  28755282 .
  2. ^ Backus, JW ; Bauer, FL ; Verde, J.; Katz, C.; McCarthy, J.; Perlis, AJ; Rutishauser, H .; Samelson, K.; Vauquois, B.; Wegstein, JH; van Wijngaarden, A.; Woodger, M. (maio de 1960). Naur, Peter (ed.). "Relatório sobre a Linguagem Algorítmica ALGOL 60" . Comunicações da ACM . Nova York, NY, EUA: ACM. 3 (5): 299–314. doi : 10.1145/367236.367262 . ISSN 0001-0782 . S2CID 278290 . Recuperado 2009-10-27 .