stringtranslate.com

Bloque (programación)

En programación informática , un bloque o bloque de código o 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 se relacionaba únicamente con el control del flujo . [1] El Informe Revisado posterior que describió 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 por 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". [2]

Sintaxis

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

Limitaciones

Algunos idiomas que admiten bloques con declaraciones no admiten 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, solo declaraciones compuestas que permiten agrupar secuencias de declaraciones en if , while , 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 más que formas simples de bucles. Los condicionales se implementaron utilizando declaraciones goto condicionales :

LENGUAJE C: ESTÁNDAR ANSI FORTRAN 66 C INICIALIZAR VALORES A CALCULAR PAYSTX = . FALSO . PAGO = . FALSO . IMPUESTO = 0.0 SUPTAX = 0.0 C SALTAR LA DEDUCCIÓN DE IMPUESTOS SI EL EMPLEADO GANA MENOS QUE EL UMBRAL DE IMPUESTOS SI ( SALARIOS . LE . TAXTHR ) IR A 100 PAYSTX = . VERDADERO . IMPUESTO = ( SALARIOS - IMPUESTOS ) * BASCRT C SALTAR LA DEDUCCIÓN DE SUPERIMPUESTOS SI EL EMPLEADO GANA MENOS QUE EL UMBRAL DE SUPERIMPUESTOS SI ( SALARIOS . LE . SUPTHR ) IR A 100 PAYSST = . VERDADERO . SUPRAT = ( SALARIOS - SUPTHR ) * SUPRAT  100 GRAVADO = SALARIOS - IMPUESTO - SUPRAT                                                             

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 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:

 { Idioma: Jensen y Wirth Pascal } si salarios > umbral_impuesto entonces comienza el impuesto salarial := verdadero ; impuesto := ( salarios - umbral_impuesto ) * tasa_impuesto { La estructura del bloque hace que sea más fácil ver cómo se podría  refactorizar el código para mayor claridad, y también hace que sea más fácil de hacer,  porque la estructura del condicional interno se puede mover fácilmente  fuera del condicional externo por completo y los efectos de hacerlo  se predicen fácilmente. } si salarios > supertax_threshold entonces comience pays_supertax := true ; superimpuesto := ( salarios - supertax_threshold ) * supertax_rate fin si no comienza pays_supertax := false ; supertax := 0 fin fin si no comienza paystax := false ; pays_supertax := falso ; impuesto : = 0 ; superimpuesto := 0 fin ; gravado := salarios - impuesto - superimpuesto ;                                                                  

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 por completo la declaración if interna de la externa, 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 las lenguas primitivas, 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: Esquema estándar R5RS ( let (( empno ( ssn-of nombre-empleado ))) ( while ( is-manager empno ) ( let (( empleados ( longitud ( subordinados-de empno )))) ( printf "~a tiene ~a empleados que trabajan bajo su mando:~%" nombre-empleado empleados ) ( for-each ( lambda ( empno ) ;; Dentro de esta expresión lambda la variable empno se refiere al ssn ;; de un subordinado. La variable empno en la expresión externa , ;; que hace referencia al ssn del gerente, está sombreado ( printf "Nombre: ~a, rol: ~a~%" ( nombre-de empno ) ( rol-de empno ))) ( subordinados-de 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 ssn del administrador. . 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.

Izar

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 vartienen alcance de función.

Ver también

Referencias

  1. ^ Perlis, AJ ; Samelson, K. (1958). "Informe preliminar: lenguaje algebraico internacional". Comunicaciones de la 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 .