Bloque (programación)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Estructura Lexical del código fuente agrupada

En programación informática, un bloque o un bloque de código o un bloque de código es una estructura léxica de código fuente que se agrupa. Los bloques constan de una o más declaraciones y declaraciones. Un lenguaje de programación que permite la creación de bloques, incluidos bloques anidados dentro de otros bloques, se denomina lenguaje de programación estructurado en bloques. Los bloques son fundamentales para la programación estructurada, donde las estructuras de control se forman a partir de bloques.

Los bloques tienen dos funciones: agrupar declaraciones para que puedan ser tratadas como una sola declaración y definir ámbitos para nombres para distinguirlos del mismo nombre usado en otros lugares. En un lenguaje de programación estructurado en bloques, los objetos nombrados en los bloques externos son visibles dentro de los bloques internos, a menos que estén enmascarados por un objeto declarado con el mismo nombre.

Historia

Las ideas de estructura de bloques se desarrollaron en la década de 1950 durante el desarrollo de los primeros códigos automáticos y se formalizaron en los informes Algol 58 y Algol 60. Algol 58 introdujo la noción de "enunciado compuesto", que estaba relacionada únicamente con el control del flujo. El Informe Revisado posterior que describía la sintaxis y la semántica de Algol 60 introdujo la noción de bloque y alcance de bloque, con un bloque que consta de " Una secuencia de declaraciones seguidas de una secuencia de declaraciones y encerradas entre el comienzo y el final..." en el que "[t]ada declaración aparece en un bloque de esta manera y es válida sólo para ese bloque."

Sintaxis

Los bloques usan diferente sintaxis en diferentes idiomas. Dos grandes familias son:

  • la familia ALGOL en la que los bloques están delimitados por las palabras clave "begin"y"end"o equivalente. En C, los bloques están delimitados por frenos rizados - "{"y"}". ALGOL 68 utiliza paréntesis.
  • Parentheses - "("y")", se utilizan en el lenguaje de lotes MS-DOS
  • indentación, como en Python
  • s-expresiones con una palabra clave sintáctica como prog o let (como en la familia Lisp)
  • En 1968 (con ALGOL 68), luego en Edsger W. Dijkstra 1974 Mando protegido Idioma el bloque de código condicional e iterativo se terminan alternativamente con la palabra reservada bloque inversa: por ejemplo. if ~ then ~ elif ~ else ~ fi, case ~ in ~ out ~ esac y for ~ while ~ do ~ od

Limitaciones

Algunos lenguajes que soportan bloques con declaraciones no soportan completamente todas las declaraciones; por ejemplo, muchos lenguajes derivados de C no permiten una definición de función dentro de un bloque (funciones anidadas). Y a diferencia de su antecesor Algol, Pascal no admite el uso de bloques con sus propias declaraciones dentro del comienzo y el final de un bloque existente, sólo declaraciones compuestas que permiten agrupar secuencias de declaraciones en if, mientras, repetir y otras declaraciones de control.

Semántica básica

El significado semántico de un bloque es doble. En primer lugar, proporciona al programador una forma de crear estructuras arbitrariamente grandes y complejas que pueden tratarse como unidades. En segundo lugar, permite al programador limitar el alcance de las variables y, a veces, de otros objetos que han sido declarados.

En los primeros lenguajes como Fortran IV y BASIC, no había bloques de instrucciones ni estructuras de control. Los condicionales se implementaron utilizando declaraciones goto condicionales:

C LANGUAGE: ANSI STANDARD FORTRAN 66C INITIALIZE VALUES to be CALCULATED  PAYSTX = .FALSE.  PAYSST = .FALSE.  TAX = 0,0  SUPTAX = 0,0C SKIP TAX DEDUCTION IF EMPLOYEE EARNS LESS than TAX THRESHOLD  IF ()WAGEs .LE. TAXTHR) GOTO 100  PAYSTX = .TRUE.  TAX = ()WAGEs - TAXTHR) * BASCRTC 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

La estructura lógica del programa no se refleja en el lenguaje y analizar cuándo se ejecuta una declaración determinada puede resultar difícil.

Los bloques permiten al programador tratar un grupo de declaraciones como una unidad, y los valores predeterminados que tenían que aparecer en la inicialización en este estilo de programación pueden, con una estructura de bloques, ubicarse más cerca de la decisión:

 Jensen y Wirth Pascal si salarios  tax_threshold entonces comenzar paystax := verdadero; impuestos := ()salarios - tax_threshold) * tax_rate {} La estructura del bloque hace más fácil ver cómo el código podría ser refactorizado para la claridad, y también hace que sea más fácil de hacer, porque la estructura del condicional interior se puede mover fácilmente fuera del condicional exterior por completo y los efectos de hacer así que se predicen fácilmente. } si salarios  supertax_threshold entonces comenzar pays_supertax := verdadero; supertax := ()salarios - supertax_threshold) * supertax_rate final más comenzar pays_supertax := falso; supertax := 0 final final más comenzar paystax := falso; pays_supertax := falso; impuestos := 0; supertax := 0 final; impuestos := salarios - impuestos - supertax;

El uso de bloques en el fragmento anterior de Pascal aclara la intención del programador y permite combinar los bloques resultantes en una jerarquía anidada de declaraciones condicionales. La estructura del código refleja más fielmente el pensamiento del programador, lo que facilita su comprensión y modificación.

El código fuente anterior se puede hacer aún más claro quitando la instrucción if interna de la externa por completo, colocando los dos bloques uno tras otro para que se ejecuten consecutivamente. Semánticamente hay poca diferencia en este caso, y el uso de una estructura de bloques, respaldada por sangría para facilitar la lectura, facilita al programador la refactorización del código.

En los lenguajes primitivos, las variables tenían un amplio alcance. Por ejemplo, una variable entera llamada IEMPNO podría usarse en una parte de una subrutina de Fortran para indicar el número de seguro social (ssn) de un empleado, pero durante el trabajo de mantenimiento en la misma subrutina, un programador podría usar accidentalmente la misma variable, IEMPNO, para un propósito diferente, y esto podría resultar en un error difícil de rastrear. La estructura de bloques facilita a los programadores controlar el alcance a un nivel mínimo.

; Idioma: R5RS Standard Scheme()Deja ()empno ()Ssn-of nombre de empleado)) ()mientras ()is-manager empno) ()Deja ()empleados ()longitud ()sublings-of empno))) ()printf "Tiene empleados trabajando bajo él." nombre de empleado empleados) ()para cada ()lambda ()empno) ; Dentro de esta expresión lambda el empno variable se refiere al ssn ; de un bajo. El empno variable en la expresión exterior, ;; se refiere a la ssn del gerente, está sombreado. ()printf "Name: ~a, role: ~a~%" ()nombre de empno) ()función empno)) ()sublings-of empno))))

En el fragmento de esquema anterior, empno se usa para identificar tanto al administrador como a sus subordinados, cada uno por su respectivo ssn, pero debido a que el ssn subordinado se declara dentro de un bloque interno, no interactúa con la variable del mismo nombre que contiene el seguro social del gerente. En la práctica, consideraciones de claridad probablemente llevarían al programador a elegir nombres de variables distintos, pero tienen la opción y es más difícil introducir un error sin darse cuenta.

Izado

En algunos idiomas, una variable se puede declarar en el ámbito de la función incluso dentro de bloques cerrados. Por ejemplo, en JavaScript, las variables declaradas con var tienen alcance de función.

Contenido relacionado

C128

C128 puede referirse...

SRS

SRS o SrS pueden...

Rapira

Rapira es un lenguaje de programación de procedimientos educativo desarrollado en la Unión Soviética e implementado en la computadora AGAT, PDP- 11 Clones...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save