Para salvar la brecha que separa a sus dos lectores, o sea a la máquina y al programador, el lenguaje de computación está ideado jerárquicamente. Recuérdese que la unidad procesadora central de una computadora responde a un conjunto de varios cientos de instrucciones, a las que se llama con toda propiedad lenguaje de la máquina. En lo fundamental éste es el único código de mando que la computadora entiende, un código que más o menos está dentro de su equipo. Compuestos de unos y ceros como todo lo demás de la computadora, el lenguaje de la máquina es extremadamente dificultoso. Si un programador quiere escribir una instrucción que agregue el contenido de una palabra de memoria a una segunda, debe entender, por ejemplo, al símbolo de ocho dígitos de esta instrucción de adición en una tabla, así como las direcciones de las dos palabras. El resultado será una hilera de tal vez 32 dígitos, que el programador puede equivocar a la hora de copiar. Por ello, un programa que contenga varias docenas de estas instrucciones será una pesadilla en cuanto a su escritura, a su cotejo y a su corrección. A pesar de ello en los primeros años de la computación los ingenieros trabajaron directamente en el lenguaje de la máquina. Luego empezaron a desarrollar códigos más legibles, aprovechándose de recursos mnemotécnicos. A estos nuevos códigos se les dio el nombre de lenguajes en conjunto (assembly languages) y todavía se usan.
El fundamento de los lenguajes en conjunto es que los programadores humanos
recuerdan los nombres más fácilmente que los números. Nombres cortos y fijos
(tales como AD, SUBS, MUL)
se presentan en todas las instrucciones
de la máquina, amén de que los programadores pueden componer sus propios nombres
para indicar sitios de almacenamiento, es decir, variables en el sentido matemático
(nombres AL, RAPID,SUM).
Aunque la computadora ejecuta instrucciones
sólo en lenguaje de la máquina, con ayuda de un programa escrito con anterioridad,
traduce automáticamente del lenguaje del conjunto al lenguaje de la máquina,
y enseguida ejecuta. Es decir, transforma el programa escrito con nombres en
una larga hilera de dígitos binarios que el procesador entiende. Este programa
de traducción (llamado conjuntador assembler) evita al programador
el trabajo de buscar códigos binarios en una tabla y de escribirlos él mismo.
En general, los programadores siguen escribiendo un enunciado en lenguaje de
conjunto para cada instrucción que quieran que ejecute la máquina. Sigue estando
muy atado a la estructura lógica de la máquina que usa, aunque ahora escribe
en un lenguaje que no es el lenguaje de la máquina.
El paso siguiente fue crear códigos que alejaron todavía más al programador
de su máquina, pues le permitieron escribir en un lenguaje más matemático. A
estos códigos se les llaman lenguajes de alto nivel (high-level languages)
y son traducidos en instrucciones a la máquina no por medio de programas conjuntadores
relativamente simples, sino por medio de programas complejos llamados compiladores
(compilers). El primero de tales lenguajes que se usó de un modo general
(a fines de los años 1950) fue el FORTRAN
. A partir de entonces
ha habido docenas de ellos. En FORTRAN,
el programador escribe
instrucciones que se parecen mucho al álgebra: por ejemplo, C=A+B. En otros
lenguajes los enunciados pueden parecerse más a la lógica simbólica o inclusive
al idioma natural simple. Cada enunciado FORTRAN
pide a la CPU
que realice algunas operaciones elementales, por lo cual todos ellos deben ser
convertidos en un número de instrucciones dadas en el lenguaje de la máquina.
Un programa compilador tiene precisamente esta tarea; acepta enunciados FORTRAN
como su input, los analiza en sus partes constitutivas y genera enunciados
de la máquina como output. Como cualquier traductor humano, el compilador
escucha en un idioma y habla del otro. Pero a diferencia del humano, que aporta
al trabajo de traducción sus conocimientos sobre el significado de las palabras
y sobre las probables intenciones del hablante o escritor, el compilador no
sabe nada del propósito general del programa FORTRAN
y mucho menos
de las intenciones del programador. Nadie afirmaría que entiende francés si
todo lo que hace es identificar al sujeto y al predicado en una frase en francés,
en tanto que un compilador entiende FORTRAN
justamente en ese sentido,
porque puede analizar la sintaxis de enunciados en FORTRAN
o cualquier
otro lenguaje de alto nivel deben ser en lo estructural no ambiguas. El compilador
no puede elegir entre análisis alternos; por definición carece de aptitud de
interpretación del traductor humano.
|
||
Lenguaje de alto nivel (FORTRAN) |
Lenguaje conjuntador (hipotético)
|
Lenguaje de la máquina (16 bits hipotéticos)
|
VEL = 10 | LDI 10 STA VEL |
0000110000001010 000100010001000 |
POS=VEL*(TIME+INC) | LDA TIME ADA INC MUL VEL STA POS |
0000100100010010 0010000100010100 0011100100010000 0001000100010110 |
|
Aquí se muestran tres niveles del lenguaje electrónico. Una orden en un
lenguaje de alto nivel podría convertirse en dos o tres (¡o muchas!) en el lenguaje
conjuntador. El lenguaje conjuntador permite además el uso de nombres (VEL,
POS, TIME, INC)
y el uso de mnemotecnias en instrucciones (LDI,
LDA, ADA, MUL y ETA
son todos opcodes, es decir, códigos de instrucción
o nombres de operaciones de la máquina). En el lenguaje de la máquina, inclusive
éstas deben ser sustituidas por hileras de números binarios.
He aquí, pues, una cualidad del lenguaje de la computación: su estructura jerárquica o en capas. Los códigos de computación se clasifican en términos de su distancia respecto a su lenguaje binario de las instrucciones de la máquina y de su proximidad a los lenguajes tradicionales de las matemáticas y de la lógica. En el nivel más elevado están lenguajes compiladores de la talla de FORTRAN;
abajo se hallan lenguajes de conjunto; abajo de éstos están las instrucciones de la máquina (gráfica VIII.1). Lo cierto es que en realidad son posibles niveles aún más altos. Por ejemplo, un programa escrito en PASCAL
puede aceptar más expresiones en el idioma hablado natural, como "multiplique distancia por velocidad", y convertirlas en operaciones de la máquina. En este caso, el programa PASCAL
es en sí un compilador del lenguaje natural para cuyo procesamiento está equipado. Un compilador ocupa una posición intermedia entre un nivel alto y uno bajo. Las palabras "alto" y "bajo" tal vez parezcan indicar prejuicio: el lenguaje de alto nivel está un poco más cerca del usuario que habla el lenguaje natural, aun cuando nuestro lenguaje exceda en complejidad y riqueza a cualquier cosa que la computadora pueda procesar hoy día. Por otra parte, el lenguaje de la computación cobra significado únicamente por medio de su ejecución. Ejecutar una orden FORTRAN
le permite realizar su significado en el campo de la acción. Como ocurre en cualquier jerarquía, las unidades situadas en la cima dan las órdenes, las intermedias las pasan y las unidades situadas en el fondo las ejecutan. Las humildes instrucciones de la máquina son las únicas que en realidad realizan computación.
Los programas de compilación y de conjunto son programas de traducción: aceptan
como input enunciados en clave en un nivel de la jerarquía electrónica
y producen instrucciones de output en un nivel inferior. el proceso de traducción,
aunque terriblemente complejo, no tiene nada de misterioso. Se lleva acabo de
un algoritmo; no intervienen intuiciones. Para que el compilador "entienda"
un enunciado en FORTRAN
sólo necesita procesarlo paso a paso y
convertirlo en una forma ejecutable. Una vez ejecutado, el enunciado no ejerce
influencia alguna sobre el resto del programa. en el idioma hablado el significado
de una frase puede cambiar radicalmente debido a la frase que le sigue, porque
la frase permanece activa y resonante en la memoria mucho después de haber sido
leída o pronunciada. Todo enunciado escrito en lenguaje de computación exige,
sin embargo, la total atención de la máquina a lo largo del fugaz momento de
su ejecución; en seguida deja de tener significado a menos que (en el caso de
programas looping) se vuelva a presentar nuevamente para su ejecución.
Además, como el lenguaje de la computación sólo tiene significado en la acción,
no se puede tolerar la menor ambigüedad. Si una orden de FORTRAN
tiene dos interpretaciones posibles, el compilador deberá generar dos conjuntos
de instrucciones a la máquina. Sin embargo, el procesador central sólo puede
ejecutar una instrucción a la vez; no puede escoger libremente entre los dos
conjuntos de instrucciones. Por esta razón el lenguaje de la computación es
unívoco en todos los niveles: cada enunciado o es por completo claro o está
equivocado para garantizar su calidad el lenguaje cuenta con una sintaxis rígida
de expresiones permisibles. Esta rigidez significa que los programadores que
por naturaleza no piensan de un modo tan consistente, cometen con frecuencia
errores tan pequeños, al dejar fuera puntuación , paréntesis, o bien deletreando
mal. Cuando el compilador se encuentra con un enunciado que no es conforme,
tal vez trate de adivinar que fue lo que el programador quiso escribir; ¿omitió
una coma o punto y coma? Esta adivinación es de alcance limitado por que el
compilador nunca quiere escoger entre significados operacionalmente diferentes.
A final de cuentas, tal vez el compilador pase por alto el mal enunciado y omita
totalmente las instrucciones a la máquina que pudo generar. Por lo común el
resultado es que el programa no se puede ejecutar. En pocas palabras, la ambigüedad
que tan importante es a la comunicación humana resulta fatal a la computadora.
En el lenguaje hablado la ambigüedad significa en muchos casos la diferencia
entre lenguaje e intención, ya que respecto a una frase sencilla caben presentarse
muchos significados. En términos lógicos nuestro lenguaje escrito y hablado
suele fallarnos, porque no revela con claridad nuestras intenciones. Por otra
parte, esta falla es una de las cualidades del lenguaje que hacen posible a
la poesía y que, en general, nos permite grandes economías en cuanto a comunicación.
Hay ocasiones en que la ambigüedad comunica exactamente el sentido correcto.
Sin embargo, es frecuente que el mensaje se refiera a emociones o intuiciones
que los lenguajes de las computadoras no pueden representar. La representación
electrónica como una serie de símbolos en una tarjeta perforada, en cinta magnética
o en disco magnético, es una representación sin tacha (dentro de la tolerancia
de error del sistema particular). Sucede que un enunciado FORTRAN
no
es otra cosa que estos símbolos. En el lenguaje natural la expresión escrita
es sólo una parte de todo el lenguaje, no siempre la más importante. Cualquier
frase escrita en un papel se puede decir de varios modos, lo cual traduce otros
tantos matices de significado que dan colorido al contexto en que se presentan.
En cambio, en una variable FORTRAN
no hay connotaciones, no hay
significados sobreentendidos. La imprecisión en un lenguaje de computación no
producirá poesía, ni expresará emoción, ni agregará colorido, ni hará nada de
aquello en que el lenguaje natural sobresale. Sólo producirá un error, en cuyo
caso el programa deberá ser rehecho.
Los lenguajes electrónicos han sido ideados por matemáticos y lógicos como instrumentos para resolver problemas técnicos. Estas personas quizá no aprecien siempre las ambigüedades matices del idioma literario hablado. Pero en caso de que sí las aprecien, no pueden incorporar esos matices en sus compiladores porque la naturaleza lógica de los circuitos y de los registros de almacenamiento no permite ambigüedades. Los únicos lenguajes apropiados para los sistemas electrónicos son aquellos que sean precisos y tan estructuralmente simples como FORTRAN
y LISP
. La única definición que tiene sentido es la definición operacional: tradúzcase el enunciado en lenguaje de la máquina, ejecútese y examínese el resultado. Finalmente en FORTRAN
no hay nada parecido al pensamiento que no se pueda expresar en un enunciado FORTRAN ;
en el reino de la computadora, coinciden pensamiento y lenguaje.
![]() |
![]() |
![]() |
![]() |
![]() |