UNIDAD II
OBJETIVO Y FILOSOFIA
El estudio de los lenguajes de programación agrupa tres intereses diferentes; el del programador profesional, el del diseñador del lenguaje y del Implementador del lenguaje.
Además, estos tres trabajos han de realizarse dentro de las ligaduras y capacidades de la organización de una computadora y de las limitaciones fundamentales de la propia "calculabilidad". El termino "el programador" es un tanto amorfo, en el sentido de que camufla importantes diferencias entre distintos niveles y aplicaciones de la programación. Claramente el programador que ha realizado un curso de doce semanas en COBOL y luego entra en el campo del procesamiento de datos es diferente del programador que escribe un compilador en Pascal, o del programador que diseña un experimento de inteligencia artificial en LISP, o del programador que combina sus rutinas de FORTRAN para resolver un problema de ingeniería complejo, o del programador que desarrolla un sistema operativo multiprocesador en ADA.
En esta investigación, intentaremos clarificar estas distinciones tratando diferentes lenguajes de programación en el contexto de cada área de aplicación diferente. El "diseñador del lenguaje" es también un termino algo nebuloso. Algunos lenguajes (como APL y LISP) fueron diseñados por una sola persona con un concepto único, mientras que otros (FORTRAN y COBOL) son el producto de desarrollo de varios años realizados por comités de diseño de lenguajes.
El "Implementador del lenguaje" es la persona o grupo que desarrolla un compilador o interprete para un lenguaje sobre una maquina particular o tipos de maquinas. Mas frecuentemente, el primer compilador para el lenguaje Y sobre la maquina X es desarrollada por la corporación que manufactura la maquina X . Por ejemplo, hay varios compiladores de Fortran en uso; uno desarrollado por IBM para una maquina IBM, otro desarrollado por DEC para una maquina DEC, otro por CDC, y así sucesivamente. Las compañías de software también desarrollan compiladores y también lo hacen los grupos de investigación de las universidades. Por ejemplo, la universidad de Waterloo desarrolla compiladores para FORTRAN Y PASCAL, los cuales son útiles en un entorno de programación de estudiantes debido a su superior capacidad de diagnostico y velocidad de compilación.
Hay también muchos aspectos compartidos entre los programadores, diseñadores de un lenguaje implementadores del mismo. Cada uno debe comprender las necesidades y ligaduras que gobiernan las actividades de los otros dos.
Hay, al menos, dos formas fundamentales desde las que pueden verse o clasificarse los lenguajes de programación: por su nivel y por principales aplicaciones. Además, estas visiones están condicionadas por la visión histórica por la que ha transcurrido el lenguaje. Además, hay cuatro niveles distintos de lenguaje de programación.
Los "Lenguajes Declarativos" son los mas parecidos al castellano o ingles en su potencia expresiva y funcionalidad están en el nivel mas alto respecto a los otros. Son fundamentalmente lenguajes de ordenes, dominados por sentencias que expresan "Lo que hay que hacer" en ves de "Como hacerlo". Ejemplos de estos lenguajes son los lenguajes estadísticos como SAS y SPSS y los lenguajes de búsqueda en base de datos, como NATURAL e IMS. Estos lenguajes se desarrollaron con la idea de que los profesionales pudieran asimilar mas rápidamente el lenguaje y usarlo en su trabajo, sin necesidad de programadores o practicas de programación.
Los lenguajes de " Alto Nivel" son los mas utilizados como lenguaje de programación. Aunque no son fundamentalmente declarativos, estos lenguajes permiten que los algoritmos se expresen en un nivel y estilo de escritura fácilmente legible y comprensible por otros programadores. Además, los lenguajes de alto nivel tienen normalmente las características de " Transportabilidad". Es decir, están implementadas sobre varias maquinas de forma que un programa puede ser fácilmente " Transportado " (Transferido) de una maquina a otra sin una revisión sustancial. En ese sentido se llama "Independientes de la maquina". Ejemplos de estos lenguajes de alto nivel son PASCAL , APL y FORTRAN (para aplicaciones científicas ), COBOL (para aplicaciones de procesamiento de datos), SNOBOL( para aplicaciones de procesamiento de textos), LISP y PROLOG (para aplicaciones de inteligencia artificial), C y ADA (para aplicaciones de programación de sistemas) y PL/I (para aplicaciones de propósitos generales) .
Los "Lenguajes Ensambladores" y los "Lenguajes Maquina" son dependientes de la maquina. Cada tipo de maquina, tal como VAX de digital, tiene su propio lenguaje maquina distinto y su lenguaje ensamblador asociado. El lenguaje Ensamblador es simplemente una representación simbólica del lenguaje maquina asociado, lo cual permite una programación menos tediosa que con el anterior. Sin embargo, es necesario un conocimiento de la arquitectura mecánica subyacente para realizar una programación efectiva en cualquiera de estos niveles lenguajes.
Los siguiente tres segmentos del programa equivalentes exponen las distinciones básicas entre lenguajes maquina, ensambladores de alto nivel:
Como muestra este ejemplo, a mas bajo nivel de lenguaje mas cerca esta de las características de un tipo e maquina particular y mas alejado de ser comprendido por un humano ordinario. Hay también una estrecha relación ( correspondencia 1:1 ) entre las sentencias en lenguaje ensamblador y sus formas en lenguaje maquina codificada. La principal diferencia aquí es que los lenguajes ensambladores se utilizan símbolos (X,Y,Z,A para " sumar", M para "multiplicar"), mientras que se requieren códigos numéricos (OC1A4, etc.) para que lo comprenda la maquina.
La programación de un lenguaje de alto nivel o en un lenguaje ensamblador requiere, por tanto, algún tipo de interfaz con el lenguaje maquina para que el programa pueda ejecutarse. Las tres interfaces mas comunes: un "ensamblador" , un "compilador" y un "interprete". El ensamblador y el compilador traduce el programa a otro equivalente en el lenguaje X de la maquina "residente" como un paso separado antes de la ejecución. Por otra parte, el interprete ejecuta directamente las instrucciones en un lenguaje Y de alto nivel, sin un paso de procesamiento previo.
La compilación es, en general, un proceso mas eficiente que la interpretación para la mayoría de los tipos de maquina. Esto se debe principalmente a que las sentencias dentro de un "bucle" deben ser reinterpretadas cada vez que se ejecutan por un interprete. Con un compilador. Cada sentencia es interpretada y luego traducida a lenguaje maquina solo una vez.
Algunos lenguajes son lenguajes principalmente interpretados, como APL, PROLOG y LISP. El resto de los lenguajes -- Pascal, FORTRAN, COBOL, PL/I, SNOBOL,, C, Ada y Modula-2 – son normalmente lenguajes compilados. En algunos casos, un compilador estará utilizable alternativamente para un lenguaje interpretado (tal como LISP) e inversamente (tal como el interprete SNOBOL4 de los laboratorios Bell). Frecuentemente la interpretación es preferible a la compilación en un entorno de programación experimental o de educación, donde cada nueva ejecución de un programa implicado un cambio en el propio texto del programa. La calidad de diagnosis y depuración que soportan los lenguajes interpretados es generalmente mejor que la de los lenguajes compilados, puesto que los mensajes de error se refieren directamente a sentencias del texto del programa original. Además, la ventaja de la eficiencia que se adjudica tradicionalmente a los lenguajes compilados frente a los interpretados puede pronto ser eliminado, debido a la evolución de las maquinas cuyos lenguajes son ellos mismos1lenguajes de alto nivel. Como ejemplo de estos están las nuevas maquinas LISP, las cuales han sido diseñadas recientemente por Symbolics y Xerox Corporations.
Los lenguajes de Programación son tomados de diferentes perspectivas. Es importante para un programador decidir cuales conceptos emitir o cuales incluir en la programación. Con frecuencia el programador es osado a usar combinaciones de conceptos que hacen al lenguaje "DURO" de usar, de entender e implementar. Cada programador tiene en mente un estilo particular de programación, la decisión de incluir u omitir ciertos tipos de datos que pueden tener una significativa influencia en la forma en que el Lenguaje es usado, la decisión de usar u omitir conceptos de programación o modelos.
Existen cinco estilo de programación y son los siguientes:
Orientados a Objetos.
Imperativa : Entrada, procesamiento y salidas de Datos.
Funcional : "Funciones", los datos son funciones, los resultados pueden ser un valor o una función.
Lógico : {T,F} + operaciones lógicos (Inteligencia Artificial).
Concurrente : Aún esta en proceso de investigación.
El programador, diseñador e implementador de un lenguaje de programación deben comprender la evolución histórica de los lenguajes para poder apreciar por que presentan características diferentes. Por ejemplo, los lenguajes "mas jóvenes" desaconsejan (o prohiben) el uso de las sentencias GOTO como mecanismo de control inferior, y esto es correcto en el contexto de las filosofías actuales de ingeniería del software y programación estructurada. Pero hubo un tiempo en que la GOTO, combinada con la IF, era la única estructura de control disponible; el programador no dispone de algo como la construcción WHILE o un IF-THEN-ELSE para elegir. Por tanto, cuando se ve un lenguaje como FORTRAN, el cual tiene sus raíces en los comienzos de la historia de los lenguajes de programación, uno no debe sorprenderse de ver la antigua sentencia GOTO dentro de su repertorio.
Lo mas importante es que la historia nos permite ver la evolución de familias de lenguajes de programación, ver la influencia que ejercer las arquitecturas y aplicaciones de las computadoras sobre el diseño de lenguajes y evitar futuros defectos de diseño aprendido las lecciones del pasado. Los que estudian se han elegido debido a su mayor influencia y amplio uso entre los programadores, así como por sus distintas características de diseño e implementacion. Colectivamente cubren los aspectos más importantes con los que ha de enfrentarse el diseñado de lenguajes y la mayoría de las aplicaciones con las que se enfrenta el programador. Para los lectores que estén interesados en conocer con mas detalle la historia de los lenguajes de programación recomendamos las actas de una recién conferencia (1981) sobre este tema, editadas por Richard Wexelblat. Vemos que FORTRAN I es un ascendente directo de FORTRAN II, mientras que FORTRAN, COBOL, ALGO 60, LISP, SNOBOL y los lenguajes ensambladores, influyeron en el diseño de PL/I.
También varios lenguajes están prefijados por las letras ANS. Esto significa que el American National Standards Institute ha adoptado esa versión del lenguaje como el estándar nacional. Una vez que un lenguaje esta estandarizado, las maquinas que implementan este lenguaje deben cumplir todas las especificaciones estándares, reforzando así el máximo de transportabilidad de programas de una maquina a otra. La policía federal de no comprar maquinas que no cumplan la versión estándar de cualquier lenguaje que soporte tiende a "fortalecer" el proceso de estandarizacion, puesto que el gobierno es, con mucho, el mayor comprador de computadoras de la nación.
Finalmente, la notación algebraica ordinaria, por ejemplo, influyo fuertemente en el diseño de FORTRAN y ALGOL. Por otra parte, el ingles influyo en el desarrollo del COBOL. El lambda calculo de Church dio los fundamentos de la notación funcional de LISP, mientras que el algoritmo de Markov motivo el estilo de reconocimiento de formas de SNOBOL. La arquitectura de computadoras de Von Neumann, la cual fue una evolución de la maquina mas antigua de Turing, es el modelo básico de la mayoría de los diseños de computadoras de las ultimas tres décadas. Esta maquina no solo influyeron en los primeros lenguajes sino que también suministraron el esqueleto operacional sobre el que evoluciono la mayoría de la programación de sistemas.
Una discusión mas directa de todos estos primeros modelos no están entre los objetivos de este texto. Sin embargo, es importante apuntar aquí debido a su fundamental influencia en la evolución de los primeros lenguajes de programación, por una parte, y por su estado en el núcleo de la teoría de la computadora, por otra. Mas sobre este punto, cualquier algoritmo que pueda describirse en ingles o castellano puede escribirse igualmente como una maquina de Turing (maquina de Von Neumann), un algoritmo de Markov o una función recursiva. Esta sección, conocida ampliamente como "tesis de Church", nos permite escribir algoritmos en distintos estilos de programación (lenguajes) sin sacrificar ninguna medida de generalidad, o potencia de programación, en la transición.
COMUNICACION
Los lenguajes de programación son lenguajes especiales que ayudan al usuario a comunicarse con la computadora. Establecen una comunicación entre el humano que prefiere usar palabras, el sistema decimal y la computadora, que trabaja solo con números binarios (0's y 1's).
Lenguaje de máquina
El lenguaje de máquina está orientado hacia la máquina que está constituida por varios arreglos de "bits". Este lenguaje es fácil de entender por la computadora, pero difícil para el usuario. Es el lenguaje original de la computadora el cual es generado por el "software", y no por el programador.
Lenguaje de bajo nivel
Es un lenguaje de programación bien cercano al lenguaje de máquina. Es difícil de entender por las personas y requiere que los programadores codifiquen las instrucciones con muchos detalles. Ejemplo: lenguaje ensamblador.
Lenguaje de alto nivel
Es un lenguaje que se asemeja más al lenguaje humano que a un lenguaje de máquina o ensamblador. Es más fácil escribir programas en este lenguaje, pero luego deben ser traducidos por compiladores o intérpretes para que la computadora los entienda.
Procesadores de lenguajes
Programas traductores
Son los que traducen instrucciones de lenguajes de programación de alto nivel al código binario del lenguaje de la máquina.
Código fuente ("source code")
Es un conjunto de instrucciones del programa que están escritas en un lenguaje de programación.
Código del objeto ("object code")
Es un conjunto de instrucciones binarias traducidas y que la computadora puede ejecutar.
Ejemplos de programas traductores
Compilador
Es un programa que traduce un lenguaje de alto nivel al lenguaje de máquina de una computadora. Según va ejecutando la traducción, coteja los errores hechos por el programador. Traduce un programa una sola vez, generalmente, y es cinco veces más rápido que los programas intérpretes. Ejemplos: ALGOL, BASIC, COBOL, FORTRAN, PASCAL y PL/1.
Intérprete
Es un programa que traduce un lenguaje de alto nivel al lenguaje de máquina de una computadora. El programa siempre permanece en su forma original (programa fuente) y traduce cuando está en la fase de ejecución instrucción por instrucción. Ejemplo: BASIC
Ensamblador
Es un programa de bajo nivel que traduce el lenguaje de ensamble a lenguaje de máquina. Utiliza letras del alfabeto para representar los diferentes arreglos del código binario de la máquina. Los programadores de ensamble deben conocer profundamente la arquitectura y el lenguaje de máquina de su computadora. El programa ensamblador traduce cada instrucción de ensamble escrita por el programador a la instrucción en lenguaje de máquina binario equivalente. En general, las instrucciones ("software") de un sistema se escriben en este lenguaje. Ejemplos: Sistema operativo y Sistemas de manejo de base de datos.
LENGUAJES DE ALTO NIVEL MAS COMUNES
BASIC (Beginners All-purpose Symbolic Instruction Code)
Fue el lenguaje de programación interactivo más popular en la década de los 70. Es un lenguaje de propósito general. Desarrollado por John Kemeny y Thomas Kurtz en "Dartmouth College" en 1963. Existen numerosas versiones, algunas son compiladores y otras son intérpretes.
COBOL (Common Business Oriented Language)
Es un lenguaje compilador diseñado para aplicaciones de negocios. Desarrollado en 1959 por el gobierno federal de los Estados Unidos y fabricantes de computadoras bajo el liderazgo de Grace Hopper. Es el más utilizado por los "mainframe". COBOL está estructurado en cuatro divisiones; a saber:
División de identificación - identifica el programa.
División ambiental - identifica a las computadoras fuente y objeto.
División de datos - identifica las memorias "buffer", constantes y áreas de trabajo.
División de procedimiento - describe el procesamiento(la lógica del programa).
PASCAL
Este programa recibío su nombre en honor a Blaise Pascal. Fue desarrollado por el científico suizo Niklaus Wirth en 1970 y diseñado para enseñar técnicas de programación estructurada. Es fácil de aprender y de usar y no utiliza línea sino ";" (semicolon). Existen versiones de compilador, como de intérprete. Estas varían según la versión.
FORTRAN (FORmula TRANslator)
Es uno de los primeros lenguajes de alto nivel desarrollado en 1954 por John Backus y un grupo de programadores de IBM. Es un lenguaje compilador que se diseñó para expresar con facilidad las fórmulas matemáticas, resolver problemas científicos y de ingeniería.
ADA
Es un lenguaje desarrollado como una norma del Departamento de Defensa de los Estados Unidos. Es un lenguaje basado en PASCAL, pero más amplio y específico. Fue diseñado tanto para aplicaciones comerciales como científicas. Es un lenguage de multitareas que puede ser compilado por segmentos separados. Se llama ADA en honor de Augusta Ada Byron, condesa de Lovelace e hija del poeta inglés Lord Byron.
APL (A Programming Language)
Este programa fue desarrollado por Kenneth Inverson a mediados de la década de 1960 para resolver problemas matemáticos. Este lenguaje se caracteriza por su brevedad y por su capacidad de generación de matrices y se utiliza en el desarrollo de modelos matemáticos.
PL/1 (Programming Language 1)
Este programa fue desarrollado por IBM. Es un lenguaje de propósito general que incluye características de COBOL y de FORTRAN. Su principal utilidad es en los "mainframes".
RPG (Report Program Generator)
Fue desarrollado por IBM en 1964 y diseñado para generar informes comerciales o de negocios.
Lenguaje C
Fue desarrollado a principios de la década de los 70 en Bell Laboratories por Brian Kernigham y Dennis Ritchie. Ellos necesitaban desarrollar un lenguaje que se pudiera integrar con UNIX, permitiendo a los usuarios hacer modificaciones y mejorías fácilmente. Fue derivado de otro lenguaje llamado BCPL.
Lenguaje C++
Se pronuncia "ce plus plus". Fue desarrollado por Bjarne Stroustrup en los Bell Laboratories a principios de la decada de los '80. C++ introduce la programación orientada al objeto en C. Es un lenguaje extremadamente poderoso y eficiente. C++ es un super conjunto de C, para aprender C++ significa aprender todo acerca de C, luego aprender programación orientada al objeto y el uso de éstas con C++.
Visual BASIC
Este programa fue creado por Microsoft. Es un programa moderno que da apoyo a las características y métodos orientados al objetos.
Programación orientada al objeto
Las metas de la programación orientada al objeto es mejorar la productividad de los programadores haciendo más fácil de reusar y extender los programas y manejar sus complejidades. De esta forma, se reduce el costo de desarrollo y mantenimiento de los programas. En los lenguajes orientados al objeto los datos son considerados como objetos que a su vez pertenecen a alguna clase. A las operaciones que se definen sobre los objetos son llamados métodos. Ejemplo de programas orientados al objeto: Visual BASIC y C++.
INDEPENDENCIA DE LA MAQUINA
Los intérpretes realizan normalmente dos operaciones:
Traducen el código fuente a un formato interno (esta operación no es estrictamente indispensable).
Ejecutan o interpretan el programa traducido al formato interno.
El formato interno podría ser simplemente el resultado del análisis morfológico, o llevar realizada cierta dosis de análisis sintáctico/semántico, como la traducción a notación polaca inversa o a cuádruplas. La primera parte del intérprete se llama a veces "el compilador", aunque el código interno que genera no es el lenguaje de la máquina, ni siquiera lenguaje simbólico, ni tampoco un lenguaje de alto nivel.
En el lenguaje JAVA, las dos partes se han separado por completo, y tenemos el compilador de JAVA, que traduce los fuentes a bytecode, y el intérprete de JAVA, que en realidad interpreta bytecode.
Lenguajes interpretativos
Algunos lenguajes no pueden compilarse por completo al lenguaje de la máquina por uno de los motivos siguientes:
Porque contienen operadores que precisan de la presencia del intérprete, como aquéllos que ejecutan en tiempo de ejecución cadenas de caracteres que representan instrucciones del lenguaje fuente (APL, LISP, Prolog, Smalltalk).
Porque han eliminado totalmente la declaración de las variables, de tal modo que una variable tiene siempre el tipo del último valor que se le asignó (APL, LISP, Smalltalk).
Porque se ha eliminado la gestión dinámica de la memoria, confiándole al intérprete la eliminación automática de la memoria no utilizada (APL, JAVA, LISP, Smalltalk).
Porque la presencia del intérprete durante la ejecución es necesaria por razones de seguridad o de independencia de la máquina (JAVA).
Entre los lenguajes interpretativos destacan APL, JAVA, LISP, Prolog, Rexx, Smalltalk y SNOBOL.
Ventajas de un intérprete
Flexibilidad: permite realizar acciones complejas, imposibles o muy difíciles con un compilador, como las siguientes:
Ejecución de cadenas de caracteres mediante operadores como "execute", "interprete" o "evalquote".
Modificar sobre la marcha el significado de los símbolos e incluso prescindir por completo de las declaraciones.
Obtener un ligamiento dinámico completo en los sistemas orientados a objetos.
Simplificar la gestión de memoria en los programas fuente.
Facilidad de depuración de programas: la interpretación puede interrumpirse en cualquier momento para examinar o modificar los valores de las variables o la situación en la ejecución. La tabla de símbolos está disponible. Se pueden corregir los errores y continuar. Trazas y paradas programadas. Saltos en el programa. Abandonos de subrutinas.
Rapidez en el desarrollo.
Desventajas de un intérprete
Velocidad: usualmente un orden de magnitud menor que la de un programa compilado.
Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
Uso de los intérpretes
Los intérpretes se usan principalmente:
Para el desarrollo de prototipos.
Para la enseñanza.
Cuando el lenguaje tiene características que exigen un intérprete (Lisp, APL, REXX, Smalltalk, Prolog).
Cuando el lenguaje dispone de operadores muy potentes, lo que significa que la mayor parte del tiempo los programas están ejecutando código rápido prefabricado, más que los programas fuente del programador (APL, SNOBOL).
Para obtener independencia de la máquina (JAVA).
Para aumentar la seguridad (JAVA).
Generación de código en un intérprete
La gestión de registros durante la ejecución es innecesaria. El propio intérprete la realiza.
Las conversiones de tipo pueden aplazarse. Esto puede tener ventajas e inconvenientes, y normalmente habrá que buscar un equilibrio entre la ocupación de memoria y el tiempo de ejecución.
Durante el análisis sintáctico, la información semántica asociada a los operandos de las expresiones suele generarse sobre plataformas de operandos, es decir, vectores de estructuras que contienen toda la información asociada al operando izquierdo, el operando derecho y el resultado de la operación.
Tipos de estructura de intérpretes
Algunos intérpretes utilizan una tabla de símbolos de tamaño fijo, cuyos elementos apuntan directamente a la memoria asignada a las variables.
Otros tienen tablas de símbolos cuyo tamaño puede modificarse de forma dinámica.
En algunos, la tabla de símbolos no apunta directamente a la memoria asignada a las variables, sino que lo hace a través de una tabla de referencias intermedia, que lleva la cuenta del número de punteros que apuntan en un momento dado al objeto de que se trate. Esto simplifica la recolección de desechos y la gestión de la memoria, a costa de aumentar el tiempo de acceso a las variables, pues hay que atravesar un direccionamiento indirecto más.
UTILIDAD Y EFICIENCIA
ADA
Es un lenguaje estructurado parecido al PASCAL, destinado a controlar mecanismos en "tiempo real" (o sea una velocidad compatible con las necesidades reales), pero de gran complejidad. Admite una programación "orientada a objetos" y un sistema de alta modularidad de tipo hipertexto.
Fue elaborado a pedido del Departamento de Defensa de los Estados Unidos y establecido como norma para todos los fabricantes que participaban en el programa de la Iniciativa de Defensa Estratégica (IDE, también llamado "Guerra de las Galaxias").
Regresar al inicio de esta página
ASSEMBLER (ENSAMBLADOR)
Como señalado a propósito del "Primer Nivel" de los lenguajes, el Assembler es directamente dependiente de los circuitos electrónicos de los procesadores (que constituyen el núcleo de los computadores), por lo cual escribir en Ensamblador sigue siendo una tarea muy compleja, a lo cual hay que sumar que el código varía de un procesador a otro aunque existe ya un jerga común para ciertas operaciones como las aritméticas y lógicas, por ejemplo:
ADD para sumar (sin reserva) ADC para sumar con reserva ("add with carry") MUL para multiplicar ORA para el "o" lógico ("or and") EOR para el "o" exclusivo (o bien... o bien...)
Las instrucciones de este tipo deben ir seguidas sea de dos valores (dos números a sumar o multiplicar por ejemplo) o del nombre de una variable. Cuando se ejecute el programa, el valor de una variable nombrada deberá provenir de una operación anterior que
haya terminado por una instrucción del tipo "almacenar el resultado del operación en la variable X",
haya extraído el valor de la variable de una determinada celda de memoria, o
haya efectuado una interacción con el usuario, por ejemplo escribir en pantalla "Escriba el valor de X".
(Estas son "instrucciones de asignación").
El Assembler contiene además un conjunto mínimo de instrucciones de alternación e iteración indispensables para que un programa pueda funcionar como tal.
Regresar al inicio de esta página
ALGOL
El ALGOL ("ALGOrithmic Lenguage") es el primer lenguaje que fue creado por un comité internacional. En 1960 se reunieron representantes de varios países europeos y de Estados Unidos para crear un lenguaje destinado a "describir procesos" mediante instrucciones de control (iteraciones y alternaciones) de nivel más elevado que las existentes en las versiones existentes de su predecesor, el FORTRAN.
Permite escribir programas de resolución de problemas en forma limpia y clara, de fácil lectura. Aunque poco "transportable" (no permite con facilidad que un programa escrito para un tipo de computador funcione en otro), es de gran importancia conceptual por cuanto introdujo la "programación estructurada", lo cual influyó en muchos lenguajes creados posteriormente.
En 1968 se implementó una nueva versión multi-propósito especialmente orientada a la tercera generación de computadores que empezaban a copar el mercado. (A diferencia de la primera versión, ésta resultó muy compleja y, por ello, tuvo poco éxito).
EJEMPLO:
REAL PROCEDURE exp(x);
VALUE x; REAL x;
BEGIN
REAL sum, term, n;
sum:= 1; term:= 1; n:= 0;
FOR n:= n+1 WHILE abs (term) > 0.001 DO
BEGIN
term:= x * term / n;
sum:= sum + term
END;
exp:= sum
END.
Regresar al inicio de esta página
BASIC
El BASIC ("Beginner's All-purpose Symbolic Instruction Code")nació con los microcomputadores, como un lenguaje simplificado y multi-propósito destinado a los usuarios no-especialistas.
Permite resolver problemas numéricos o comerciales así como crear y mantener archivos, realizar gráficos lineales, etc. Es por esencia un lenguaje interpretado y no-estructurado. Sin embargo, existen algunos compiladores, pero no es común recurrir a ellos. Y también es factible redactar los programas en forma estructurada.
EJEMPLO
10 INPUT A
20 INPUT B
30 C = A+ B
40 IF C > 100 THEN 90
50 PRINT "Suma = "; C
60 PRINT
70 PRINT "Desea seguir? "; : GET R$
80 IF R$ = "S" THEN 10
90 PRINT "Resultado superior a 100!"
100 END
Regresar al inicio de esta página
C y C++
El lenguaje "C" es bastante reciente y está especialmente orientado hacia el desarrollo de software de sistemas operativos y utilitarios que anteriormente se escribían en Assembler. Se usa hoy como base para crear el software que funciona con el sistema operativo "UNIX", logrando un alto grado de portabilidad, es decir de independencia respecto de los procesadores (con lo cual es fácil lograr que un mismo programa pueda ser ejecutado en diferentes modelos de computadores).
El "C++" es un lenguaje desarrollado a partir del "C" pero con una estructura "orientada a objetos", lo cual facilita un mejor manejo de datos.
Regresar al inicio de esta página
COBOL
EL COBOL ("COmmon Business-Oriented Language") es uno de los primeros lenguajes de programación creados. Fue desarrollado en 1960 por CODASYL (Conference on Data Systems Languages), un comité en que participaron fabricantes y usarios, a pedido de la Marina de los Estados Unidos. Este comité estuvo dirigido por la Dra. Grace Hopper, una de las primeras programadoras de la computadora ENIAC. Es uno de los pocos lenguajes reconocidos como norma internacional (americana por el ANSI -American National Standards Institute- y europea por el ISO -International Organization for Standardization-).
Está orientado -como su nombre indica- a aplicaciones comerciales, por lo cual sus instrucciones están especialmente diseñadas para facilitar la entrada y salida de datos (impresión de tablas, etc.). Se pretendió que se pareciera lo más posible a un lenguaje natural, por lo cual requiere mucho más escritura que otros lenguajes. Esto facilita la lectura posterior pero resulta aburrido para los redactores. Debe iniciarse con secciones donde se declaran todas las variables y los periféricos que se van a usar, cosas que muchos lenguajes posteriores ya no requieren.
Los programas escritos en COBOL, que es un lenguaje compilado, se clasifican en cuatro divisiones: Identification, Enviroment, Data y Procedure. La Identification division especifica el nombre del programa y contiene información general del programa como puede ser su autor, fecha en que se escribió y una pequeña descripción de su utilidad, así como cualquier otra documentación que el programador desee añadir.
La Enviroment division especifica qué equipo o equipos se están utilizando, y los archivos empleados en el programa para la entrada y la salida.
La Data division describe los datos utilizados en el programa.
La Procedure division contiene la parte del procesamiento que dicta las acciones del programa.
EJEMPLO
IDENTIFICATION DIVISION.
PROGRAM-ID. SUMA.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ENTRADA ASSIGN TO INPUT.
SELECT SALIDA ASSIGN TO OUTPUT.
DATA DIVISION.
FILE SECTION.
FD ENTRADA LABEL RECORD IS OMITTED.
01 VENTA.
02 VALOR PICTURE 9999V99.
03 FILLER PICTURE X(44).
FD SALIDA LABEL RECORD IS OMITTED.
01 RESULTADOS PICTURE X(132).
WORKING STORAGE SECTION.
...
PROCEDURE DIVISION.
...
Regresar al inicio de esta página
FORTRAN
El FORTRAN ("FORmula TRANslator") fue desarrollado entre los años 1954 y 1957 por un equipo dirigido por James Backus, fue el primer lenguaje compilado e inclusive hoy en día es usado ampliamente en la solución de problemas numéricos. Aunque fue el más común hasta 1970, sigue siendo de primera importancia en aplicaciones científicas por cuanto se adapta muy bien a la forma tradicional de escribir fórmulas matemáticas. Al contrario, no se presta con facilidad al manejo de archivos y produccción de tablas de resultados.
Existen numerosas versiones y perfeccionamientos posteriores. (La versión de 1966 fue instituída como estándar por el Instituto Americano de Estandarización, reemplazándola por el FORTRAN 77 en la década siguiente).
EJEMPLO
INTEGER A, B, C
10 READ (5,1010) A, B
1010 FORMAT (I4,I4)
C = A - B
IF (C. EQ. 0) GO TO 20
WRITE (6,1020) C
1020 FORMAT (I4)
GO TO 10
20 STOP
END
Regresar al inicio de esta página
HYPERTALK
"HyperTalk" es el lenguaje desarrollado por Dan Winkler para Bill Atkinson, el creador del "HyperCard" para Apple-Macintosh. Está orientado a la creación de aplicaciones conforme al sistema de "hiperarchivos" (sistemas de fichas interrelacionadas donde se facilita el "navegar" de un archivo a otro).
HyperTalk es un buen ejemplo de lenguaje orientado a objetos. Este tipo de lenguaje combina la lógica declarativa con los algoritmos (Vea "PROLOG"). Un programa ya no es una secuencia de instrucciones sino un conjunto de objetos agrupados en conjuntos, definidos mediante atributos y a los cuales pueden asociarse instrucciones. Así, en HyperCard, existen archivos ("stacks" o "pilas") que agrupan fichas ("cards"), y cada una de éstas contiene campos de datos y botones. Todos son "objetos" que -si bien mantienen entre sí una relaciónn jerárquica- tienen asociados paquetes de instrucciones ("scripts") independientes unos de otros. Cada objeto pertenece a un conjunto (como fichas o botones) que tiene "atributos" propios comunes a todos sus miembros, y cada atributo tendrá un valor común o específico para cada caso. Para dar o buscar dicho valor intervienen "facetas" que son instrucciones (procedimientos) asociadas.
Regresar al inicio de esta página
HTML
El HTML o "HyperText Marking Language" es el lenguaje que se utiliza para crear páginas -como la presente- en World Wide Web.
El HTML se basa en los mismos principios que el HyperTalk, permitiendo definir segmentos (de texto o ilustraciones) que remiten a otros, facilitando una "navegación" por múltiples vías, a gusto del usuario. Así es como el botón "Home" tiene asociadas las instrucciones que indican al procesador que busque la primera ficha o página del archivo llamado "Home" o "index" en el archivo del computador que presta el servicio de conexión (servidor). Y si se hace un clic en una palabra subrayada, se pasa a ver otra sección del mismo documento o algún otro documento (otro "objeto").
El HTML no es propiamente un lenguaje de programación , sino solo de exhibición de contenidos y navegación, porque no define operaciones.
Regresar al inicio de esta página
JAVA
JAVA es un lenguaje de programación basado en el C++ (con cambios en la sintaxis y nuevas restricciones de codificación). Permite agregar animaciones y puntos sensibles en páginas de texto. Aunque se lo pretende presentar como "EL" lenguaje destinado a desarrollos para World Wide Web, es mucho mas complejo que el HTML e incluso que otros lenguajes utilizables por los browsers (navegadores) de la Web.
Una versión muy reducida es el "JavaScript", que se puede combinar con el lenguaje HTML, dentro de una página web.
Regresar al inicio de esta página
LISP
LISP ("LIst Processing Language") es un lenguaje computacional bastante diferente de los demás. Es un lenguaje funcional, es decir que acumula informaciones e instrucciones bajo la apariencia de fórmulas (como en álgebra). Estas informaciones toman la forma de listas (de ahí su nombre), que son memorizadas y comparadas para efectuar luego operaciones que consisten en "evaluar las fórmulas". El conjunto de funciones constituye el programa en cuanto la evaluación de una función llama a otra y así sucesivamente (en forma eminentemente recursiva). El control de la ejecución depende del intérprete (que busca la secuencia y la traduce en lenguaje máquina), mientras depende del programador la forma en que las funciones se llaman entre sí.
El objetivo de este tipo de lenguaje es asemejarse a una forma humana de conservación de información (la de las descripciones) y permitir la construcción de programas que se enriquezcan o ajusten en función del uso (simulando aprendizaje). Así, LISP es el primer lenguaje creado con el fín de ser una herramienta para el desarrollo de la inteligencia artificial.
EJEMPLO
? (de append (L1 L2)
(if (null L1)
L2
(cons (cor L1)
(append (cdr L1) L2))))
Regresar al inicio de esta página
LOGO
Creado por Seymour Papert, padre de la "computación educativa", el LOGO está destinado a la enseñanza de la programación a los niños, desde temprana edad. Por ello es sobretodo conocido por su capacidad gráfica y su "tortuga", que es el puntero con el cual se realizan los dibujos. Es altamento modular y deja gran libertad al usuario para definir procedimientos desde muy simples hasta muy complejos, en forma jerárquica, permitiendo incluso el control de periféricos mecánicos (operación de pequeños robots). Aunque bastante poderoso (se han escrito procesadores de palabras en LOGO), practicamente no es utilizado fuera de la escuela básica.
EJEMPLO
Comandos para dibujar un cuadrado de 20 pixels (puntos) por lado:
BAJAR_PLUMA. ADELANTE 20. ROTACION 90. ADELANTE 20. ROTACION 90. ADELANTE 20. ROTACION 90. ADELANTE 20. LEVANTAR_PLUMA.
Lo que conforma el cuadrado puede simplificarse como: HACER 4 (ADELANTE 20. ROTACION 90). y ser utilizado repetidamente definiendo el comando "Cuadrado":
>CUADRADO: HACER 4 (ADELANTE 20. ROTACION 90).
Esta definición se puede generalizar reemplazando la longitud por una variable (El programa pide automáticamente en pantalla el valor de una variable si lo desconoce): >CUADRADO: HACER 4 (ADELANTE LADO. ROTACION 90).
(Las órdenes para bajar y levantar la "pluma" -que permiten dejar o no dejar rastro al mover la "tortuga" - pueden introducirse o no en la definición, a voluntad).
Regresar al inicio de esta página
PASCAL
Del nombre del filosófico y matemático francés, PASCAL es un lenguaje inicialmente diseñado para la docencia introductoria de la programación (a nivel superior). Surgió alrededor de 1970, en gran parte como reacción simplificadora después de la creación de los muy complejos PL/1 y ALGOL68 para los nuevos computadores de tercera generación.
Muy inspirado en la primera versión oficial de ALGOL (60), es un lenguaje muy estructurado y con alta modularidad. Tuvo por ello -y por su simplicidad- mucha aceptación al punto de ser utilizado para crear importantes aplicaciones e incluso compiladores y sistemas operativos (antes desarrollados en Assembler).
EJEMPLO
PROGRAM CALCULATOR;
VAR
A, B: INTEGER;
OPERATION; CHAR;
BEGIN
REPEAT
READLN (A, OPERATION, B);
IF OPERATION = '+' THEN
WRITELN (A + B)
ELSE IF OPERATION = '-' THEN
WRITELN (A - B)
ELSE IF OPERATION = '*' THEN
WRITELN ( A* B)
ELSE IF OPERATION = '/' THEN
WRITELN (A / B)
UNTIL FALSE
END.
Regresar al inicio de esta página
PERL
Es un lenguaje especializado en el procesamiento de textos, particularmente extraer y validar las respuestas a cuestionarios incluidos en páginas web.
Regresar al inicio de esta página
PL/1
EL "PL/1" es un lenguaje multi-propósito creado por IBM y SHARE, especialmente a raíz del paso de la segunda a la tercera generación de computadores, cuando se preveía la creciente difusión de estas máquinas y su posible uso en una gama creciente de actividades. Pretendía ampliar las posibilidades del FORTRAN fusionando conceptos provenientes del COBOL y el ALGOL.
La gran cantidad de instrucciones, tipos de datos y casos especiales que contempla lo hacen difícil de aprender y dominar, razón de su poca difusión.
EJEMPLO
TRAPZ: PROCEDURE OPTIONS (MAIN);
DECLARE (J,K) FIXED DECIMAL (2),
AREA FIXED DECIMAL (8,6);
PUT SKIP EDIT ('AREA BAJO LA CURVA') (X(9),A);
PUT SKIP;
DO K=4 TO 10;
AREA=0.5/K;
DO J=1 TO K-1;
AREA=AREA+((J/K)**2)/K);
END;
PUT SKIP EDIT ('PARA DELTA X=1/',K,AREA)
(X(2),A,F(2),X(6),F(9,6);
END;
END;
Regresar al inicio de esta página
PHP
Lenguaje que se acopla al HTML (páginas web) para definir procedimientos que ha de realizar el servidor de web, por ejemplo procesar un formulario, enviar o extraer datos de una base de datos (acoplándose también con un lenguaje de tipo SQL), enviar una u otra página web según determinadas condiciones prefijadas por el programador, etc.
Regresar al inicio de esta página
PROLOG
Los primeros años de la décado del 70 son conocidos como un período de "crisis del software", en que se descubrió que la creación de buenos programas involucraba costos mayores que los del hardware que los ejecuta. También se hacía patente una creciente necesidad de procesar "conocimientos" (algo mucho más amplio y complejo que los datos cuantitativos o meras "secuencias de caracteres" a los cuales se reducen muchos lenguajes de programación). Esta crisis llevó a investigar numerosas alternativas, entre las cuales nuevos lenguajes no basados en instrucciones algorítmicas o procedimientos. Si el hombre "procesa" más información por inferencia lógica que por cálculo, ¿no podría la máquina hacer lo mismo?
PROLOG ("PROgramación en LOGica") es una respuesta a esta crisis, producto del avance de la lógica moderna (de tipo funcional). Lo crearon A. Colmenauer y Ph. Roussel, con la colaboración de R. Kowalski, simultáneamente en la Universidad de Aix-Marseille (Francia) y Edimburgo (Gran Bretaña). Se basa en el cálculo de predicados de primer orden y en el principio de resolución de Robinson. En vez de ser algorítmico ("procedural" en inglés, término sin traducción), es decir concebido como un conjunto de instrucciones que la máquina debe ejecutar en forma secuencial, es "declarativo", es decir basado en definiciones (de "hechos" o "reglas", como se explica más abajo).
EJEMPLO
Si sabemos que una línea aérea une París con Río con el vuelo 36 y otra une Río con Santiago con el vuelo 71, concluimos sin dificultad alguna que es posible viajar de París a Santiago con una escala en Río.
En lógica funcional, los datos básicos ("hechos" en terminología PROLOG) podrían escribirse:
une(Paris,Rio,Vuelo36).
une(Rio,Santiago,Vuelo71).
Vemos que la relación ("une") es la misma y que hay un término común en la lista de argumentos (lo que hay entre paréntesis). Solo falta explicitar una regla idéntica a la que se usa para extraer una conclusión a partir de dos premisas en un silogismo:
camino(Paris,Santiago) <- une(Paris, x, n),
une(x, Santiago, m).
o sea "Hay un camino entre París y Santiago si algún vuelo (n) une París con una ciudad 'x' y (&) otro vuelo (m) une esta ciudad 'x' con Santiago.
Un "programa" en PROLOG se conforma con estos dos tipos de expresiones (llamadas "cláusulas"): "hechos" y "reglas". Una cláusula con forma de hecho y seguida de un '?' constituye la forma habitual de consultar la información. Si no contiene ninguna variable, el programa verifica si existe una "copia" en la lista de hechos y contesta por sí o no. Si contiene una o más variables busca cuales se ajustan a la descripción o pueden ser deducidas mediante las reglas y señala el valor correcto de las diferentes variables (o bien "No" si no hay respuesta posible).
Regresar al inicio de esta página
SQL
Lenguaje desarrollado especialmente para facilitar la consulta de bases de datos (BD), acotando progresivamente la búsqueda (de ahí el nombre de "Sequential Query Language").
Existen hoy numerosas aplicaciones de administración de bases de datos que recurren al SQL (Las más conocidas, potentes - y caras - son Oracle e Informix).
Hoy se pueden acoplar las bases de datos a hipertextos (páginas web), para lo cual las buenas aplicaciones ya traen módulos que hacen la conexión. El lenguaje PHP del cual hablamos más arriba también sirve para definir procedimientos de inserción y de consulta de datos en BD (Base de Datos) que funcionan con SQL.
SIMPLICIDAD
Luego de escribir la nota sobre la conjetural simplificación C=simple, C++= complicado, me quedé pensando en que existe esa percepción de un espectro de dificultades en los lenguajes de programación, donde, digamos, en un extremo vive Basic, y en el otro Assembler. La pregunta inocente que se me aparece es: ¿por qué alguien aprendería una lenguaje difícil si existe uno fácil? En otra época -digamos, unos diez años atrás- esa pregunta tenía otra respuesta que la que tiene hoy. Pero en estos días, digamos que el 90% de las cosas que se pueden escribir en Visual C++ se pueden escribir también en Visual Basic, discutiblemente con más facilidad. ¿Por qué preferir Java, C, C++, Visual Basic, Delphi? Estoy hablando únicamente de algunos lenguajes de desarrollo en el entorno gráfico de Windows. No quiero ni asomarme a la marisma de lengaujes compilados, semicompilados e interpretados que existe bajo Linux. Creo que el problema es un poco más complejo de lo que parece a simple vista.
Stroustrup (hablando de Java) decía que la simplicidad de un lenguaje siempre es ilusoria, y que eventualmente cualquier lenguaje que alcance popularidad será necesariamente grande, en términos de complejidad y de librerías. Fueron palabras proféticas: todavía recuerdo el día que Bill Gates defendía a capa y espada lo despojado de Visual Basic, un lenguaje que nunca tendría punteros, herencia, funciones virtuales, excepciones, multithreading, etc. Hoy Visual Basic (en su reencarnación .NET) tiene todas estas cosas y mucho más. Naturalmente era un lenguaje más simple que C++, y esa simplicidad tenía, entre otros costos graves, la irregularidad. La sintaxis era caótica (estoy pensando en Line, por ejemplo, que tenía el signo menos para separar dos pares de coordenadas encerradas entre paréntesis), un formulario era utilizado a veces como variable (Form1.Show) o como tipo (new Form1), no había forma de prototipear sin escribir el cuerpo de la función... Pero tenía la mejor IDE y era el más productivo de los lenguajes de programación, por lo que era también necesariamente denostado por los Altos Programadores de C++, quienes tenían un IDE horrible para trabajar con MFC en Visual C++, y se las veían en figurillas para manejar COM con ATL. Ni hablar del punto de vista de los de Linux, que sólo tenían vi y make. Pero eso con el tiempo, como decía Stroustrup, tendería a equilibrarse. C++ ganó simplicidad y un mejor IDE en .NET, y Visual Basic ganó complejidad y regularidad. Digamos que en el entorno ideal de Microsoft programar en un lenguaje u otro aparentemente es sólo una elección de cuál sintaxis es más elegante. La pregunta que esto me provoca es qué sucederá con la generación de programadores acostumbrados a pensar que programar es algo sencillo que se aprende con un wizard en un par de días. Estoy hablando, por supuesto, de la generación Visual Basic, idiotizada por el mercado Microsoft (cuyos precursores quizás fueron los programadores de Clipper). Advierto aquí que la palabra "idiotizada" no está dictada desde el rencor ocasionado porque ellos la tuvieron fácil y yo no: programé paralelamente en Visual Basic y en C++ por una cifra de años. La práctica negligente de la programación alentada por el hecho de que un formulario de "Hello, world!" se hace sin experiencia previa en unos quince minutos sólo deja como secuela programas mal diseñados, algoritmos pobres e ineficientes, inmantenibilidad, costumbres viciosas que no se pueden cambiar fácilmente una vez adquiridas. Si uno es tratado de idiota por el tiempo suficiente, uno termina creyéndoselo. La literatura completa esa ilusión con libros como "Visual Basic for dummies"; el gran Dijkstra decía (en su excelente escrito "Under the spell of Leibnitz's dream"), que considerar retrasados mentales a los profesionales de la computación era una costumbre de las editoriales de Estados Unidos. Le criticaron un libro por ser demasiado riguroso y técnico, citando la famosa "no one ever got broke by underestimating the intelligence of the American people" de P. T. Barnum. Pero bueno, volviendo al tema, el camino de Visual Basic era claramente un camino sin salida, y no deja de darme cierta satisfacción ver que finalmente tomó una forma más profesional, y que la tecnología no nos transformó en meros obreros del bit.
En la nota sobre C y C++ pretendo que la práctica seria de un lenguaje de programación cualquiera sólo llega a un punto satisfactorio luego de un par de años, pero ese par de años es muy caro para los tiempos tecnológicos de hoy. Nos olvidamos que los tiempos tecnológicos de hoy son el génesis de un deseado futuro más estable, y que algún día no muy lejano los lenguajes de programación tenderán a ser equivalentes en prestaciones, y que, como en una evolución darwiniana acelerada, sólo sobrevivirán los más populares.
DISEÑO DETALLADO
ESTRUCTURAS I/O
Características de los lenguajes de programación
Los lenguajes de programación constituyen la instrumentación de las reglas cualitativas de un paradigma, estos están sujetos a una serie de características generales que pueden clasificarse como sigue:
Tipos de Datos
Estructuras de Control
Manejo del I/O
Operaciones, Operadores y Operandos
Sintaxis
Esquema de Traducción y Ejecución
Tipos de datos
En todo lenguaje existen tres tipos niveles de tipos de datos: Máquina, Lenguaje, Usuario (definidas por el mismo). Entre mayor nivel tenga el tipo del dato, más fácil es su uso. Por otro lado, entre más elemental sea el tipo del dato resulta más eficiente en términos de memoria y tiempo de ejecución.
Nivel Máquina
APUNTADOR = Representa una dirección (o zona) en memoria
REGISTRO = Representa un registro o acumulador en el CPU
ENTERO = Número Entero en 2 B ( 2**15 ) ó 4 B (2**32).
REAL = Número Exponecial en 4, 8 ó 16 Bytes.
ASCII = Caracter alfanumérico 1B ( 256 elementos )
BOOLEANO = Caracter booleano (t,f) en 1bit ó 1Byte
NBCD = Caracter decimal en 4 bits (nibble)
Nivel Lenguaje
Varia considerablemente para cada lenguaje, algunos de ellos son:
CADENA (n) = Cadena de caracteres ASCII de tamaño n, puede ser dinámica o estáticamente asignada
ARREGLO (n,...,m) = Manejo de vectores y matrices de otros tipos
TABLA (n) = Tabla de acceso Hash de n elementos
ENUMERABLES = Asignación de mnemónicos en una secuencia enumerable ( 256 elementos ).
SUBRANGO = Selección de un rango de números enteros
SET = Similar al enumerable pero para uso lógico
RECORD = Estructura formada por varios tipos diversos con un solo nombre ( una dirección base en memoria).
FILE = Similar a CADENA asociado con un manejo de I/O
Relacionado con el tipo de datos, se asocian los conceptos de
Coercion :
Los datos son convertidos obligatoriamente al tipo requerido por la operación
Overloading :
Cuando un tipo de dato, operador o función puede tener distintos significados de acuerdo al contexto en que se encuentre
Polimorfismo :
Cuando una estructura de datos básica puede tener formas distintas en su definición final ( un ejemplo elemental es el Case en un Record, sin embargo puede ser muy complejo ). Otros tipos de datos más específicos son:
LISTAS = Secuencia de Apuntadores en forma ligada
PATRONES = Similar a CADENA solo que su usa para comparar valores y contenidos en cada CADENA
FUNCIONES = Asocian un relación o función lógica
CLASES = Similares a RECORD, solo que incluyen en su definición datos, rutinas y comunicación ( DB/DP/DC ), asociados a una dirección de memoria ( normalmente residen en el HEAP )
Nivel Usuario
Adicionalmente el usuario puede definir sus propias estructuras de datos, combinando para esto los diversos tipos de datos anteriormente mencionados. ¿Qué tal un : Apuntador de un Arreglo de Record de un Subrango de enteros con subindices Enumerables?
Estructuras de Control
Un aspecto importante en un lenguaje de programación es su estructura de control, esto es la forma como organiza la ejecución de las instrucciones del usuario. Esta organización es independiente de la forma y las operaciones que forman en si las instrucciones del lenguaje. En realidad es la forma de la estructura de control que identifica al paradigma de programación en cuestión. Así por ejemplo la estructura procedural define al paradigma; en general podemos decir que toman las siguientes formas:
Secuencial ===> BEGIN / END
Condicional ===> IF THEN, IF THEN ELSE
Incondicional ==> GO TO
Predicados ==> AND,OR,CUT,NEGATION,BACKTRACKING
Cíclica ===> WHILE, REPEAT UNTIL, FOR
Modular ===> FUNCTION, PROCEDURE
Interrupciones => ON CONDITION, EXCEPTION HANDLING
No Secuencial => CASE OF, RECURSIVE, LISTS
Por Eventos ===> MESSAGES, INTERLEAVED
Concurrencia ==> PAR/END, PAR/ALT/END
Manejo del I/O
Otro elemento de los lenguajes de programación es el manejo del Input/Output, el cual se clasifica de acuerdo al medio usado:
Entrada de texto : Stream Oriented, EOF, EOL
Impresión : DISPLAY, TYPE
Manejo del Disco : Virtual Memory, Overlays
Manejo de Archivos : SEQ, RANDOM, INDEX, HASH
Manejo de Multimedios : Mouse, VCR, etc.
Es importante en la medida en que pueda la información se almacene y recupere en una forma compatible con el esquema de operación del lenguaje. Así por ejemplo, para una lengua matemática es importante tener un manejo transparente de matrices en disco y para un manejo de objetos, sería conveniente tener un manejo sencillo de persistencia de los objetos en disco.
Operaciones, Operadores y Operandos
Se mencionan a continuación las operaciones y su ejecución en lenguajes artificiales (estas pueden requerir de cero, uno, dos ó múltiples operandos):
1) Tipo de Máquina Triples de Máquina ( Load Reg3,Alfa)
2) Tipo Aritmético - (unario), -,+,*,/,**, INC, DEC
3) Tipo Comparación >,<, >=, =<
4) Tipo lógico AND, OR, NOT
5) Tipo Utileria Asignación (=,:=, <-)
6) Tipo I/O Open, Close, Get,Put, Read, Write, Seek, Find
7) Tipo Texto Concatena ( ||, b, +) , Decatena, SUBSTR, Alterna( | )
8) Tipo Misceláneo New,Dispose, Cons,Append, CAR,CDR,CUT,etc.
Sintaxis
Tal vez el componente más característico de un lenguaje de programación es su sintaxis, esta invita al uso del paradigma de una manera natural. Así por ejemplo PASCAL, usa una sintaxis estructurada, mientras que LISP tiene una sintaxis mas libre pero de tipo funcional. PROLOG por su parte tiene una notación formal que invita a la abstracción y al cálculo de predicados. Finalmente los lenguaje orientados a objetos ( como Smalltalk ) combinan una sintaxis en texto con un manejo de iconos que representan en croquis ( e inclusive, imágenes completas ) los objetos en cuestión, junto con esto, el uso de multimedio para el pasaje de mensajes de I/O invita el pensamiento en términos del paradigma en forma sencilla ( Hypercard ). Una vez más es importante recordar que la sintaxis del lenguaje aunque necesaria, no define al paradigma, éste está identificado por los postulados correspondientes. Adicionalmente, se puede argumentar que la programción en términos gramaticales representa un paradigma adicional de programación.
Esquema de Traducción y Ejecución
Existen un gran número de esquemas para las labores de tradución, ligado, cargado y ejecución de un programa, existen diversos esquemas de Interpretación, Compilación y Residencia en Ejecución
Bibliografía:
Llaccua y Vasquez, Programando con Objetos en Borland Pascal. Ed. San Marcos
Schildt , Turbo C/C++, manual de referencia. , Osborne/McGraw-Hill.
Watt , David A. Programming Languaje Concepts and Paradigms. University of Glasgow, Uk. Prentice Hall.