En la programación de computadoras , 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 sentencias . Un lenguaje de programación que permite la creación de bloques, incluidos los bloques anidados dentro de otros bloques, se denomina lenguaje de programación estructurado por 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 tratarse como una sola declaración; y definir el alcance de los nombres para distinguirlos del mismo nombre utilizado en otros lugares. En un lenguaje de programación estructurado por 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 "declaración compuesta", que estaba relacionada ú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 seguida de una secuencia de declaraciones y encerrada entre el comienzo y el final ... . "en el que" [e] misma declaración aparece en un bloque de esta manera y es válida sólo para ese bloque ". [2]
Sintaxis
Los bloques usan una sintaxis diferente en diferentes idiomas. Dos amplias 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 llaves - "{
" y "}
". ALGOL 68 utiliza paréntesis. - Los paréntesis: "
(
" y ")
", se utilizan en el lenguaje por lotes de MS-DOS. - sangría , como en Python
- Expresiones-s con una palabra clave sintáctica como
prog
olet
(como en la familia Lisp ) - En 1968 (con ALGOL 68 ), luego en el Lenguaje de comandos guardado de 1974 de Edsger W. Dijkstra , el bloque de código condicional e iterativo se termina alternativamente con la palabra reservada del bloque invertida : por ejemplo , y
if ~ then ~ elif ~ else ~ fi
case ~ in ~ out ~ esac
for ~ while ~ do ~ od
Limitaciones
Algunos lenguajes 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 antepasado 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 , repeat 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, 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 sentencias goto condicionales :
LENGUA C : ESTÁNDAR ANSI FORTRAN 66 C INICIALIZAR LOS VALORES QUE SE CALCULARÁN PAYSTX = . FALSO . PAYSST = . FALSO . TAX = 0,0 SUPTAX = 0,0 C SKIP TAX deducción del SI EMPLEADOS GANA MENOS DE IMPUESTOS UMBRAL IF ( SALARIOS . LE . TAXTHR ) GOTO 100 PAYSTX = . VERDADERO . TAX = ( SALARIOS - TAXTHR ) * BASCRT C SKIP supertax deducción del SI EMPLEADOS GANA MENOS DE supertax UMBRAL IF ( SALARIOS . LE . SUPTHR ) GOTO 100 PAYSST = . VERDADERO . SUPTAX = ( SALARIOS - SUPTHR ) * SUPRAT 100 IMPUESTOS = SALARIOS - IMPUESTOS - SUPTAX
La estructura lógica del programa no se refleja en el lenguaje y analizar cuándo se ejecuta una determinada instrucción puede resultar difícil.
Los bloques permiten al programador tratar un grupo de sentencias como una unidad, y los valores por defecto que debían aparecer en la inicialización en este estilo de programación pueden, con una estructura de bloques, situarse más cerca de la decisión:
{Idioma: Jensen y Wirth Pascal} si salarios > umbral_impuesto, entonces comiencen paystax : = true ; tax : = ( salarios - tax_threshold ) * tax_rate {La estructura de bloque hace que sea más fácil ver cómo se podría refactorizar el código para mayor claridad, y también lo hace 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 pueden predecir fácilmente. } si salarios > supertax_threshold entonces begin pays_supertax : = true ; supertax : = ( salarios - supertax_threshold ) * supertax_rate end else begin pays_supertax : = false ; supertax : = 0 end end else begin paystax : = false ; paga_supertax : = falso ; impuesto : = 0 ; sobreimpuesto : = 0 final ; gravado : = salario - impuesto - sobreimpuesto ;
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 de cerca el pensamiento del programador, lo que facilita su comprensión y modificación.
El código fuente anterior se puede aclarar aún más sacando la instrucció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 la estructura de bloques, respaldada por sangría para mejorar la legibilidad, facilita al programador la refactorización del código.
En los lenguajes primitivos, las variables tenían un alcance amplio. 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 de un empleado (ssn), 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 hace que sea más fácil para los programadores controlar el alcance a un nivel mínimo.
;; Idioma: R5RS Standard Scheme ( let (( empno ( ssn-of employee-name ))) ( while ( is-manager empno ) ( let (( employee ( length ( underlings-of empno )))) ( printf "~ a has ~ a empleados que trabajan debajo de él: ~% " empleados-nombre- empleado ) ( 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 , ;; refiriéndose al ssn del gerente, está sombreado. ( printf "Nombre: ~ a, rol: ~ a ~%" ( nombre-del empno ) ( rol-del empno ))) ( subordinados-del empno )))) )
En el fragmento de esquema anterior , empno se usa para identificar tanto al gerente como a sus subordinados, cada uno por su respectivo ssn, pero debido a que el subordinado ssn 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, las consideraciones de claridad probablemente llevarían al programador a elegir distintos nombres de variables, pero él o ella tiene la opción y es más difícil introducir un error sin darse cuenta.
Izar
En algunos lenguajes, una variable se puede declarar en el ámbito de la función incluso dentro de bloques encerrados. Por ejemplo, en Javascript, las variables declaradas con var
tienen alcance de función.
Ver también
Referencias
- ^ Perlis, AJ ; Samelson, K. (1958). "Informe preliminar: lenguaje algebraico internacional". Comunicaciones de la ACM . Nueva York, NY, EE.UU .: ACM. 1 (12): 8-22. doi : 10.1145 / 377924.594925 .
- ^ Backus, JW ; Bauer, FL ; Green, 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" . 3 (5). Nueva York, NY, EE. UU .: ACM: 299–314. doi : 10.1145 / 367236.367262 . ISSN 0001-0782 . Consultado el 27 de octubre de 2009 . Cite journal requiere
|journal=
( ayuda )