Bloco (programação) - Block (programming)

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 instruçõ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 única 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 em 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

Idéias de estrutura de bloco foram desenvolvidas na década de 1950 durante o desenvolvimento dos primeiros autocódigos e foram formalizadas nos relatórios Algol 58 e Algol 60 . Algol 58 introduziu a noção de "declaração composta", que estava relacionada exclusivamente ao fluxo de controle . O subsequente Relatório Revisado que descreveu a sintaxe e 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 seguida por uma sequência de declarações e entre começar e terminar ..." em qual "[e] própria declaração aparece em um bloco desta forma e é válida apenas para aquele bloco."

Sintaxe

Os blocos usam sintaxe diferente em idiomas diferentes. Duas famílias amplas 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
  • expressões-s com uma palavra-chave sintática como progou let(como na família Lisp )
  • Em 1968 (com ALGOL 68 ), então em Edsger W. Dijkstra 's 1974 Guarded Command Language o bloco de código condicional e iterativo são terminados alternativamente com a palavra reservada de 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 no início e no final de um bloco existente, apenas declarações compostas permitindo que sequências de declarações sejam agrupadas em if , while , repeat e outras declaraçõ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 ao programador limitar o escopo das 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 instruções goto condicionais :

C     LANGUAGE: ANSI STANDARD FORTRAN 66
C     INITIALIZE VALUES TO BE CALCULATED
      PAYSTX = .FALSE.
      PAYSST = .FALSE.
      TAX = 0.0
      SUPTAX = 0.0
C     SKIP TAX DEDUCTION IF EMPLOYEE EARNS LESS THAN TAX THRESHOLD
      IF (WAGES .LE. TAXTHR) GOTO 100
      PAYSTX = .TRUE.
      TAX = (WAGES - TAXTHR) * BASCRT
C     SKIP SUPERTAX DEDUCTION IF EMPLOYEE EARNS LESS THAN SUPERTAX THRESHOLD
      IF (WAGES .LE. SUPTHR) GOTO 100
      PAYSST = .TRUE.
      SUPTAX = (WAGES - SUPTHR) * SUPRAT
  100 TAXED = WAGES - TAX - SUPTAX

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

Os blocos permitem que o programador trate um grupo de declaraçõ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:

    { Language: Jensen and Wirth Pascal }
    if wages > tax_threshold then
        begin
        paystax := true;
        tax := (wages - tax_threshold) * tax_rate
        { The block structure makes it easier to see how the code could
          be refactored for clarity, and also makes it easier to do,
          because the structure of the inner conditional can easily be moved
          out of the outer conditional altogether and the effects of doing
          so are easily predicted. }
        if wages > supertax_threshold then
            begin
            pays_supertax := true;
            supertax := (wages - supertax_threshold) * supertax_rate
            end
        else begin
            pays_supertax := false;
            supertax := 0
            end
        end
    else begin
        paystax := false; pays_supertax := false;
        tax := 0; supertax := 0
        end;
    taxed := wages - tax - supertax;

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 o pensamento do programador mais de perto, 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 bloco, suportada por indentação para legibilidade, torna mais fácil 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 de funcionário (ssn), mas durante o trabalho de manutenção na mesma sub-rotina, um programador pode acidentalmente usar a mesma variável, IEMPNO, para uma finalidade diferente, e isso poderia resultar em um bug difícil de rastrear. A estrutura de blocos torna mais fácil para os programadores controlar o escopo em um nível mínimo.

;; Language: R5RS Standard Scheme
(let ((empno (ssn-of employee-name)))
  (while (is-manager empno)
    (let ((employees (length (underlings-of empno))))
      (printf "~a has ~a employees working under him:~%" employee-name employees)
      (for-each
        (lambda(empno)
          ;; Within this lambda expression the variable empno refers to the ssn
          ;; of an underling. The variable empno in the outer expression,
          ;; referring to the manager's ssn, is shadowed.
          (printf "Name: ~a, role: ~a~%"
                  (name-of empno)
                  (role-of empno)))
        (underlings-of empno)))))

No fragmento do esquema acima , empno é usado para identificar o gerente e seus subordinados, cada um por seus respectivos ssn, mas porque 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 ele ou ela tem a escolha e é mais difícil introduzir um bug inadvertidamente.

Elevação

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

Veja também

Referências