SEP DGIT SEIT
INSTITUTO TECNOLÓGICO DE MINATITLÀN
JERARQUÍA DEL LENGUAJE DE COMPUTACIÓN
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 extremedamente 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 instruciones 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 procedador 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 |
0000110000001010 000100010001000 |
|
POS=VEL*(TIME+INC) |
LDA TIME |
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, aúnque terriblemente complejo, notiene 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 síntaxis 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
computadoreas 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.