UNIDAD I.- Definiciones básicas



1.1.- Lenguajes de programación.


Un lenguaje  es  un conjunto de símbolos y signos que permite que se pueda entablar una comunicación efectiva entre las personas.


En al ámbito de la informática, un lenguaje de programación  es una notación formal para describir funciones que se ejecutaran en una computadora, en otras palabras es un conjunto de símbolos y signos que la computadora entiende y a través del cual el programador le indica a la computadora de manera precisa lo que desea hacer.


Todo lenguaje de programación posee algunos elementos de formación primitivos para la descripción de los datos y de los procesos o transformaciones aplicadas, estos elementos se definen por medio de reglas sintácticas y semánticas que describen su estructura y significado respectivamente.


Clasificación de los lenguajes de programación


Un lenguaje de programación puede ser clasificado de varias formas, de acuerdo a sus funciones y características básicas.  A continuación se describen  algunas de sus clasificaciones.


Según su nivel de abstracción o independencia de la máquina.


Lenguaje máquinaàEste lenguaje es el único capaz de entender directamente a la computadora, utiliza un alfabeto binario (1 y 0), sus instrucciones son secuencias de 1´s y 0´s. Una de sus principales ventajas es que la ejecución de un programa escrito en este lenguaje es ejecutado rápidamente al no utilizar la compilación, en contraparte, este lenguaje es poco entendible a los humanos.


Lenguaje ensambladoràLenguaje de bajo nivel, el cual utiliza nemotécnicos para la escritura de un programa, cada código y variable que utiliza es una descripción simbólica de las instrucciones en lenguaje máquina, por lo tanto es  más entendible para los seres humanos, y es de rápida ejecución en la computadora.


Lenguaje de medio nivelà Posee características de bajo nivel, tales como el acceso directo a localidades de memoria y al procesador, aunque mezclan características más avanzadas, pues permiten usar estructuras de control tales como ciclos y bifurcaciones.


Lenguajes de alto nivelàFacilitan la escritura de programas, porque permiten el uso de bloques o segmentos de código, utilizan un lenguaje muy parecido al del ser humano, lo cual hace que más entendible, por otra parte estos lenguajes requieren el uso de traductores y algunos instrumentos que hagan la conversión de ellos al lenguaje máquina, requieren mayor tiempo de compilación y de ejecución que los de lenguaje máquina. Ejemplos de estos lenguajes son los lenguajes orientados a objetos: C++, Java, etc.


Lenguajes orientados a problemas concretosàEstos lenguajes, se enfocan como su nombre lo dice a la resolución de un problema específico, como la animación, las bases de datos, para textos, etc. Algunos ejemplos de  estos lenguajes son:

Gráficos
GIF, PCX, BMP, JPEG, DBF, WGM
Bases de datos
DBF, DBT, MDX, SQL, XBASE
Administración y estadística
SPSS, BMDP
Formatos de texto
RTF, ASCII, Word, documentos de texto
Audio y video
WAV, MDI, MP3, AVI,MOV,FLV
Documentos electrónicos
PDF, XML, HTML,PHP
Edición de video
Power director, Movie Maker, Camtasia

Según los paradigmas de programación que utilizan.


Lenguajes imperativos o procedimentalesà También conocidos como lenguajes estructurados, usan las sentencias de asignación como construcción básica, manejan estructuras de control y repetitivas, dividen el programa y lo ejecutan por bloques y en forma secuencial.


Lenguajes declarativosà Son lenguajes de alto nivel, su notación  es muy sencilla puesto que es muy similar a la del algoritmo que se desea implementar


Lenguajes concurrentesàEstos lenguajes permiten la ejecución simultánea de 2 ó más tareas a la vez, usan paradigmas como los de Edgar Dijkstra, Per Brinch Hansen, y C.A.R. Hoare. Ejemplos de estos lenguajes de programación son: Ada, Concurrent C, Aarhus, Concurrent Prolog.


Lenguajes orientados a objetosàSon lenguajes de tipo abstracto, son dinámicos y su principal característica es el manejo  de clases y objetos, permiten heredar características o atributos entre objetos y clases y también lo que es el polimorfismo.


Según la generación o el año que surgieron.


Se distinguen 6 generaciones de lenguajes de programación.


1ª Generaciónà  Los primeros ordenadores se programaban directamente en código binario, que puede
representarse mediante secuencias de ceros y unos sistema binario. Cada modelo de ordenador tiene su propio código, por esa razón se llama lenguaje de máquina. Surgieron durante la década de los 40 y 50´s


2ª Generaciónà Los lenguajes simbólicos o ensambladores,  simplifican la escritura de las instrucciones y las hacen más legibles. Los lenguajes ensambladores usan códigos  para expresar las instrucciones en vez del código binario. Los programas de software de sistemas tales como los sistemas operativos y los programas de utilidad se escriben con frecuencia en un lenguaje ensamblador. Fueron creados  entre 1958 y  mediados de los 60’s, el primer lenguaje y su compilador fue  FORTRAN. En esta etapa, los lenguajes manejan la asignación estática de memoria.


3ª Generaciónà  Surgieron  a  mediados de los 60 y 70’s, son lenguajes de tipo secuenciales, es decir, manejaban la programación estructurada (módulos o subprogramas, variables locales, estructuras dinámicas). Sustituyen las instrucciones simbólicas por códigos independientes de la máquina, más parecidas al lenguaje humano. Algunos ejemplos de ellos son: ALGOL 60, PL/I, ALGOL 68, PASCAL, MODULA, C.


4ª Generaciónà  Surgen entre la mitad de la década de los 70 y hasta finales de los 80´s, son lenguajes de muy alto nivel dedicados a tareas específicas o herramientas que permiten construir aplicaciones sencillas combinando piezas prefabricadas, denominadas herramientas CASE.
Estos lenguajes tienen una estructura muy parecida al lenguaje inglés, las principales aplicaciones que destacan son: acceso a base de datos, capacidades gráficas, generación de código automáticamente, programación visual. Entre estos lenguajes destacan: SQL, DB2, DBASE, INGRESS, NATURAL, Visual Basic, etc.


5ª Generaciónà Son propios de principios de los 80 y principios de los 90’s, su principal característica es que son lenguajes ligados a la inteligencia artificial, también los orientados a objetos, lenguajes visuales y orientados a Internet. Dentro de estos destacan los siguientes: COMMON LISP, PROLOG, APRLOG, MIRANDA, SIMULA 67, Smalltalk, etc.




1.2.- Procesadores de lenguaje.

Un procesador de lenguaje es el nombre genérico que reciben las aplicaciones que reciben las aplicaciones cuya entrada es un lenguaje y que permite al programador ejecutar un determinado programa, es decir son herramientas de compilación que ayudan en la conversión de un programa en un lenguaje de programación pueda ser entendido por el ordenador.


Existen muchos procesadores de lenguajes, pero de entre todos destacan principalmente:


Traductores: Aplicación o programa que genera un programa objeto a partir de un programa fuente, para ello utiliza un diagrama denominado de “T”, en el cual utiliza 3 lenguajes para lograr su objetivo, un lenguaje fuente (LF), un lenguaje de implementación (LI) y un lenguaje objeto (LO).


Ensambladores:  Es un tipo espeial de procesador de lenguaje, es utilizado cuando el lenguaje fuente es el lenguaje ensamblador y se va a traducir el código a lenguaje máquina.

Compilador: Es un programa informático que traduce un programa escrito en un lenguaje de programación generalmente de alto nivel a otro lenguaje de bajo nivel, generando un programa que la máquina será capaz de interpretar (lenguaje máquina), siempre es de un lenguaje de nivel superior a uno de nivel inferior.  Existen 2 características básicas que todo compilador debe tener: tiempo de compilación: tiempo que tarda en ser traducido un programa de lenguaje de alto nivel a uno de bajo nivel; y tiempo de ejecución: tiempo de ejecución de un programa objeto generado después de la compilación.

Descompiladores: programa informático que hace exactamente lo contrario a un compilador, traduce de un lenguaje de bajo nivel a uno de alto nivel.

Desensamblador: Al igual que el descompilador, el desensamblador, codifica un programa en lenguaje máquina y lo convierte a uno en lenguaje ensamblador.

Intérprete: A diferencia de los procesadores de lenguaje anteriores, este tipo de procesador, solo ejecuta las instrucciones, son más lentos que los compiladores debido a que analiza y ejecuta un programa fuente de forma simultánea a diferencia de los compiladores que primero analizan y luego ejecutan.
Las siguientes herramientas, permiten que el compilador cumpla sus labores del compilador, por lo cual son propias y “exclusivas” de un compilador

Depuradores (Debugger): Estas herramientas permiten encontrar y corregir errores de un programa compilado, permiten limpiar al programa de errores y visualizar la forma correcta en que deben ejecutarse.

Analizadores de rendimiento (profilers): Son herramientas que permiten examinar el comportamiento de los programas en tiempo de ejecución, verificando también si la corrida del programa objeto es la deseada y  permitiendo comprobar qué zonas de código trabajan eficientemente y cuáles deben ser eliminadas o corregidas.

Optimizadores de código: Son herramientas independientes o incluidas en los compiladores e invocarse por medio de opciones de compilación, sus funciones principales son:  medir la velocidad de ejecución y mejorarla, generar código reutilizable y “estándar” para un determinado procesador, reducir el tamaño del código ejecutable y el código fuente quitando lo que no se ocupa.




Enlazador (linker): Aplicaciones que permiten reunir varias partes de un mismo programa cuando este ha sido dividido en segmentos y han sido compiladas por separado, se encarga de llevar memoria y unir las partes de programas en el momento en que sea necesario, y generando un solo código objeto. El primer modulo o parte de programa que acomoda es el programa principal y después de este todos los códigos que sean necesarios para la ejecución de un programa.

Cargadores (loader): Son aquellos instrumentos que se encargan de poner en memoria el programa ejecutable y colocando el apuntador en la  primera instrucción a ejecutar, después de que el programa fuente ha sido compilado. 




1.3.- Fases del compilador y sus fundamentos teóricos.

Como ya se menciono, un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación generalmente de alto nivel a otro lenguaje de bajo nivel, generando un programa que la máquina será capaz de interpretar (lenguaje máquina), siempre es de un lenguaje de nivel superior a uno de nivel inferior.

Existen varios tipos de compiladores, de acuerdo a la forma en la que se encuentran estructurados y también a la forma en la que realizan el proceso de compilación.

Tipos de compiladores.

Compiladores cruzados: generan código para un lenguaje diferente a aquel en el que fueron creado y también puede que sea diferente al lenguaje en el que fueron creados. Por ejemplo un compilador hecho en C++ que compile código de Java o viceversa.

Compiladores optimizadores: eliminan funciones y código no utilizado  en el  programa con el fin de reducir el tamaño, además permiten descubrir posibles errores, pero no cambian la funcionalidad del programa.

Compiladores de una sola pasada: generan el código objeto después de analizar una vez el código fuente, son poco efectivos pues tardan mucho en detectar errores

Compiladores de varias pasadas: contrario al compilador anterior, este verifica más de una vez todas las posibles opciones de errores y luego genera el código objeto, con esto reduce código inútil y son más confiables y eficientes.

Compiladores Just In Time (JIT): no son un compilador como tal, forman parte de un intérprete y compilan y analizan solo las partes del código que se vayan necesitando.

Compiladores incrementales: generan código objeto de cada instrucción que forma parte del programa, a medida de que el usuario va tecleando la instrucción, cuando se compila el programa completo, el compilador tiene casi todo compilado y  en caso de errores solo compila la parte donde se encontró el error por lo que es mucho más rápido.

Compilador con enlazador: divide un programa en partes más pequeñas o módulos y una vez que todas las partes han sido compiladas las une y genera un solo código objeto.

Ensamblador: así se denomina al programa que compila instrucciones escritas en lenguaje ensamblador y su estructura es sencilla al utilizar únicamente código simbólico.  

Descompilador: compilador inverso, compila un programa objeto y lo convierte en programa fuente.

Auto compilador: compila únicamente código de aquel lenguaje en el que fue creado, por lo general son utilizados para añadir mejoras al lenguaje de programación.

Meta compilador: también llamado “compilador de compiladores”, tiene como entrada un lenguaje de programación y como salida un compilador para el mismo.

Proceso de compilación.

El proceso de compilación se lleva a cabo de forma general en 2 partes: una etapa inicial que permite analizar el código fuente y generar un código intermedio que pueda ser entendido en la siguiente etapa, esta etapa está formada por las fases de: análisis léxico, análisis sintáctico, análisis semántico y la generación de código intermedio.

En la segunda etapa o etapa final, se genera el código objeto correspondiente al programa fuente, está etapa se compone de las fases de optimización de código y generación de código (final). 



Fases del proceso de compilación.

1.-Análisis léxico: es la primera fase del compilador, consiste en leer de izquierda a derecha el programa fuente y separa este en cadenas de caracteres también llamados tokens o componentes léxicos, básicamente es el reconocimiento de patrones regulares, elimina comentarios y espacios en blanco.

2.- Análisis sintáctico: es la segunda etapa del análisis, aquí se agrupan los componentes léxicos que resultaron del análisis léxico, se jerarquizan los componentes en un árbol sintáctico o jerárquico.

3.-Anáisis semántico: en esta etapa se revisa el programa fuente de nueva cuenta, para tratar de encontrar errores semánticos en el programa y se verifica el árbol sintáctico, revisando que los tipos de datos, operadores y operandos sean correctos de acuerdo a la sintaxis del  lenguaje.

4.- Generación de código intermedio: es una representación abstracta de los resultados de los análisis anteriores, debe ser fácil de producir y de traducir.

5.-Optimización de código: se revisa que el programa no tenga errores, además se eliminan funciones y en general código que no se usa, con el objetivo de hacer al programa más eficiente y de menor tamaño.

6.-Generación de código (final): utiliza el código intermedio que se genero en etapas anteriores y produce el código objeto que es el resultado esperado del proceso de compilación.

Nota: Durante el proceso de compilación, se utilizan otras herramientas que hacen posible que el análisis y producción del código objeto se lleve a cabo en todas las fases anteriores, estos elementos son:

Tabla de símbolos: contiene una descripción de todos los componentes léxicos identificados en los análisis, además de la línea en la que fueron encontrados por primera vez y en donde se encuentran después.

Manejador de errores: tiene una lista de los errores que se encontraron en cada fase y trata de corregirlos, aquí se especifica el error, donde se encontró y cuál es la causa del error.

1.5.-Formas de Backus-Naur.

Las Formas de Backus-Naur (BNF), fueron creadas  por e informático estadounidense John Backus (ganador del premio TURING en 1977), en 1954 con el desarrollo del proyecto FORTRAN. Las formas de Backus, fueron creadas para describir el lenguaje ALGOL y sus gramáticas utilizadas y eran conocidas originalmente como Formas Normales de Backus, después Peter Naur, las simplifico y por ello fueron conocidas como formas de Backus-Naur.

La notación BNF o gramática independiente de contexto permite describir la sintaxis de las construcciones de los lenguajes de programación, utilizando los siguientes meta símbolos:


Meta símbolo
Significado
< >
Encierra conceptos definidos o por definir
: : =
Para definir o indicar equivalencia
|
Separa las distintas alternativas
“  “  
Indica que el símbolo entre comillas es un carácter que forma parte de la sintaxis del lenguaje.

(  )      
Para agrupaciones

1.6.-Jerarquias de Chomsky.

Las jerarquías de Chomsky, fueron creadas por Noam Chomsky en 1956, y son una descripción de los distintos tipos de gramáticas formales que existen, consta de 4 niveles que son:

Tipo
Lenguaje
Autómata
Normas de producción
0
Recursivamente enumerables (LRE)
Máquina de Turing (MT)
Sin restricciones
1
Sensible al contexto(LSC)
Autómata linealmente acotado
αAβ Y αγβ
2
Libres de contexto (LLC)
Autómata no-determinista
A Y γ
3
Regular (RL)
Autómata Finito
A Y aB
A
Y a


No hay comentarios:

Publicar un comentario