Articulo de referencia

Bloque (programación)

En programación informática , un bloque de código fuente es una agrupación de instrucciones que se ejecutan secuencialmente, de arriba abajo. La estructura de bloques es fundame...

En programación informática , un bloque de código fuente es una agrupación de instrucciones que se ejecutan secuencialmente, de arriba abajo. La estructura de bloques es fundamental para la programación estructurada , donde las estructuras de control se forman con bloques. Sintácticamente , un bloque funciona de forma muy similar a una sola instrucción, ya que una estructura de control generalmente opera sobre una sola instrucción o sobre un bloque.

La naturaleza de un bloque varía según el lenguaje de programación , pero existen características típicas. Un bloque generalmente proporciona un ámbito de visibilidad , de modo que un identificador definido en un bloque no es visible en los bloques contenedores externos, pero sí lo es en los bloques anidados internos, a menos que esté enmascarado por un identificador con el mismo nombre. Un bloque generalmente proporciona un ámbito de tiempo de vida, de modo que los recursos asociados a un identificador se liberan parcial o totalmente cuando el flujo de control llega al final del bloque en el que se definió dicho identificador.

Historia

El concepto de bloque se desarrolló en la década de 1950 durante el desarrollo de los primeros autocódigos y se formalizó en los informes Algol 58 y Algol 60. Algol 58 introdujo la noción de "sentencia compuesta", que se relacionaba exclusivamente con el flujo de control . [ 1 ] El Informe Revisado posterior , que describía la sintaxis y la semántica de Algol 60, introdujo la noción de bloque y ámbito de bloque , donde un bloque consiste en "Una secuencia de declaraciones seguida de una secuencia de sentencias y encerrada entre begin y end..." en la que "[t]ada declaración aparece en un bloque de esta manera y es válida solo para ese bloque". [ 2 ]

Sintaxis

En el código, un bloque se delimita como una unidad independiente, pero la sintaxis varía según el lenguaje. Algunos ejemplos notables son:

llaves
C y muchos lenguajes relacionados delimitan un bloque con {y }. De hecho, esta es la característica definitoria de un lenguaje de llaves .
Sangría
Python y Haskell utilizan la indentación para delimitar un bloque en lugar de los delimitadores, como hacen la mayoría de los lenguajes.
Paréntesis
La sintaxis del archivo por lotes utiliza (y ).
inicio/fin
La familia ALGOL generalmente delimita un bloque con las palabras clave beginy end; ALGOL 68 utiliza paréntesis.
Verbo de control invertido
Con ALGOL 68 , en el lenguaje de comandos protegidos de Edsger W. Dijkstra de 1974, el bloque de código condicional e iterativo termina alternativamente con la palabra reservada del bloque invertida : por ejemplo , y .if ~ then ~ elif ~ else ~ ficase ~ in ~ out ~ esacfor ~ while ~ do ~ od
Expresión S
Con una palabra clave sintáctica como progo letcomo en la familia Lisp .

Limitaciones

Algunos lenguajes que admiten declaraciones en un bloque no admiten todas las declaraciones. Por ejemplo, muchos lenguajes relacionados con C no permiten la definición de una función dentro de un bloque . Y a diferencia de su antecesor Algol, Pascal no admite el uso de bloques con sus propias declaraciones dentro del inicio y el final de un bloque existente, solo sentencias compuestas que permiten agrupar secuencias de sentencias en if, while, repeaty otras sentencias de control.

Ejemplos

En los inicios de la informática, muchos lenguajes como FORTRAN IV y BASIC carecían de sintaxis de bloques, salvo en ocasiones para construcciones de bucle rudimentarias. Las condiciones se codificaban mediante la instrucción goto . En el siguiente código FORTRAN 66, la estructura lógica resulta poco clara debido a la ausencia de bloques.

C INICIALIZAR VALORES A CALCULAR PAYSTX = . FALSO . PAYSST = . FALSO . IMPUESTO = 0.0 SUPTAX = 0.0 C OMITIR LA DEDUCCIÓN DE IMPUESTOS SI EL EMPLEADO GANA MENOS QUE EL UMBRAL IMPOSITIVO IF ( WAGES . LE . TAXTHR ) GOTO 100 PAYSTX = . VERDADERO . IMPUESTO = ( WAGES - TAXTHR ) * BASCRT C OMITIR LA DEDUCCIÓN DE SUPERIMPUESTO SI EL EMPLEADO GANA MENOS QUE EL UMBRAL DE SUPERIMPUESTO IF ( WAGES . LE . SUPTHR ) GOTO 100 PAYSST = . VERDADERO . SUPTAX = ( WAGES - SUPTHR ) * SUPRAT  100 IMPUESTOS = WAGES - IMPUESTO - SUPTAX

Los bloques permiten al programador tratar un grupo de instrucciones como una unidad, y los valores predeterminados que debían 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. El siguiente código en Jensen y Wirth Pascal muestra que la estructura de bloques facilita la visualización de cómo se podría refactorizar el código para mayor claridad, y también facilita la refactorización, ya que la estructura de la condición interna se puede separar fácilmente de la condición externa y los efectos de hacerlo son fácilmente predecibles. El uso de bloques en el fragmento a continuación clarifica la intención del programador y permite combinar los bloques resultantes en una jerarquía anidada de instrucciones condicionales . La estructura del código refleja con mayor precisión el pensamiento del programador, lo que facilita su comprensión y modificación. El código puede hacerse aún más claro separando la instrucción `if` interna de la externa, colocando los dos bloques uno tras otro para que se ejecuten consecutivamente. Semánticamente, en este caso hay poca diferencia, y el uso de la estructura de bloques, con el apoyo de la indentación para facilitar la lectura, hace que al programador le resulte fácil refactorizar el código.

si wages > tax_threshold entonces begin paystax := true ; tax := ( wages - tax_threshold ) * tax_rate si wages > supertax_threshold entonces 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 ;

En los lenguajes primitivos, las variables tenían un alcance amplio. Por ejemplo, una variable entera llamada IEMPNO podría usarse en una subrutina de Fortran para representar el número de seguridad social (SSN) de un empleado, pero durante el mantenimiento de la misma subrutina, un programador podría usar accidentalmente la misma variable, IEMPNO, para un propósito diferente, lo que podría generar un error difícil de rastrear. La estructura de bloques facilita a los programadores el control del alcance.

En el siguiente fragmento del esquema estándar R5RS , `empno` se utiliza para identificar tanto al gerente como a sus subordinados mediante sus respectivos números de seguridad social (SSN). Sin embargo, dado que el SSN del subordinado se declara dentro de un bloque interno, no interactúa con la variable del mismo nombre que contiene el SSN del gerente. En la práctica, la claridad probablemente llevaría al programador a elegir nombres de variables distintos, pero tiene la opción de elegir y es más difícil introducir un error inadvertidamente. Dentro de la expresión lambda, la variable `empno` se refiere al SSN de un subordinado. La variable `empno` en la expresión externa, que se refiere al SSN del gerente, está oculta.

( let (( empno ( ssn-of employee-name ))) ( while ( is-manager empno ) ( let (( employees ( length ( underlings-of empno )))) ( printf "~a tiene ~a empleados trabajando bajo su mando:~%" employee-name employees ) ( for-each ( lambda ( empno ) ( printf "Nombre: ~a, rol: ~a~%" ( name-of empno ) ( role-of empno ))) ( underlings-of empno )))))

Izado

En algunos lenguajes, una variable puede declararse en el ámbito de una función incluso dentro de bloques cerrados. Por ejemplo, en JavaScript, las variables declaradas con vartienen ámbito de función.

Véase también

Referencias

  1. Perlis, AJ ; Samelson, K. (1958). "Informe preliminar: lenguaje algebraico internacional" . Communications of the ACM . 1 (12). Nueva York, NY, EE. UU.: ACM: 8–22 . doi : 10.1145/377924.594925 . S2CID 28755282 . 
  2. ^ Backus, JW ; Bauer, Florida ; Verde, J.; Katz, C.; McCarthy, J.; Perlis, AJ; Rutishauser, H .; Samelson, K.; Vauquois, B .; Wegstein, JH; van Wijngaarden, A.; Woodger, M. (mayo de 1960). Naur, Peter (ed.). «Informe sobre el Lenguaje Algorítmico ALGOL 60» . Comunicaciones de la ACM . 3 (5). Nueva York, NY, EE. UU.: ACM: 299– 314. doi : 10.1145/367236.367262 . ISSN 0001-0782 . S2CID 278290 . Consultado el 27 de octubre de 2009 .