Capítulo 1. Lenguajes de programación

Alfabetos, palabras, lenguajes

Alfabeto: un conjunto finito no vacío A.

Letra: un elemento de un alfabeto.

Palabra: una sucesión de letras.

Longitud de una palabra: |x| = número de letras.

Palabra vacía: palabra de longitud 0.

Universo del discurso o lenguaje universal: conjunto de todas las palabras sobre un alfabeto. Conjunto infinito, numerable, W(A).

Concatenación de palabras. Propiedades (cerrada sobre W(A), asociativa, elemento neutro, monoide libre no abeliano, |xy|=|x|+|y|.

Cabeza y cola de una palabra.

Potencia de una palabra: |x*i|=i.|x|.

Reflexión de palabras: |x*-1|=|x|.

Lenguaje: L c W(A).

Unión de lenguajes: cerrada, asociativa, elemento neutro, conmutativa, idempotente.

Concatenación de lenguajes: cerrada, asociativa, elemento neutro.

Binoide libre.

Potencia de un lenguaje. Clausura positiva. Iteración o cierre.

Reflexión, intersección, complementación.

Gramáticas

G = (At, An, S, P)

Producción: (x,y) representado x::=y.

Derivación directa mediante x::=y : v=>w <=> existen z,u v=zxu, w=zyu.

Derivación: v =>+ w.

Relación de Thue: v =>* w.

Notación de Backus.

Forma sentencial de G: S =>* x.

Sentencia (instrucción) de G: S =>* x y x está en At*.

Lenguaje asociado a G: { x | S =>* x }.

Frase de una forma sentencial: S =>* xUy, U =>+ u.

Frase simple de una forma sentencial: S =>* xUy, U => u.

Asidero: frase simple más a la izquierda.

Recursividad de una gramática: uUv =>+ xUy.

Recursividad de una regla: uUv ::= xUy.

Recursividad a izquierdas y a derechas.

Clasificación de Chomsky y de los lenguajes. Máquinas. Equivalencias.

Arbol de derivación. Subárbol.

Ambigüedad de sentencias, gramáticas, lenguajes

Lenguajes naturales

Todos representables mediante gramáticas independientes del contexto, excepto dos:

Lenguajes de programación

Generaciones de lenguajes

Lenguajes de alto nivel

Lenguajes imperativos


        1. FORTRAN
              |                                    COBOL
            ALGOL 60                         --------|
      --------|-----------------------------------------------------------------
      |       |          |                  ||       |        |                |
    BASIC   ALGOL 68   Pascal              PL/I      |      SIMULA            BCPL
             ------------------   ----------|--------|--------|-------------   |
             |---|-----|------|---|         |        |        |            |   |
            CLU  |   Modula   |             |        |      Smalltalk 72   |   C
                 |            |             |        |   -----|------------|---|---------
                Ada           |             |        |   |  Smalltalk 80   |---|--------|
                           Object Pascal    |        |   |    |----------------|        |
                                            |        |Eiffel Smalltalk V  Objective C   C++
                                            |--------|----------------------------------|
                                            |        |
                                          OOPL/I   OOCOBOL


Lenguajes aplicativos o funcionales

        2. LISP
  ---------------------------
  |       |       |         |
 LOOPS  Plasma INTERLISP  Scheme

Otros lenguajes

           APL                       SNOBOL    BLISS   FORTH   Rexx
  ---------------------------          |                        |
  |               |         |          |                        |
 Mathematica     APL2       J         SL5                     OORexx

Uso de los lenguajes

                1980
   COBOL        47.3%
   RPG          14.8%
   FORTRAN       8.9%
   Simbólicos    8.4%
   BASIC         5.4%
   PL/I          4.8%
   Pascal        1.2%
   Otros         8.9%

Traductores

Símbolos.

Técnica del Bootstraping.

Partes de un traductor

Traductores (símbolos)

Partes de un compilador

         -------------------------------------------
         |  ------------ ------------ ------------ |
         |  |A.Morfo.  | |A.Semán.  | |Optimiza. | |
         |  |----------| |----------| |----------| |
/------- |  ------------------------- ------------ | /-------
|Fuente|-|--|A.Sintáctico           |-|G.Código  |-|-|Objeto|
|------| |  |-----------------------| |----------| | |------|
         |  -------------------------------------- |
         |  |Tablas de Información               | |
         |  |------------------------------------| |
         |-----------------------------------------|

Pasos de compilación

En los compiladores de un solo paso suele fundirse el analizador semántico con el generador de código.

Partes de un intérprete

               -------------------------------------------
               |  ------------ ------------              |
               |  |A.Morfo.  | |A.Semán.  |              |
               |  |----------| |----------|              |
     /-------  |  ------------------------- ------------ |
     |Fuente|--|--|A.Sintáctico           |-|E.Código  | |
     |------|  |  |-----------------------| |----------| |
               |  -------------------------------------- |
               |  |Tablas de Información               | |
               |  |------------------------------------| |
               |-----------------------------------------|

Analizador morfológico

Analizador lexical, preprocesador, "scanner".

Genera una unidad sintáctica o un vector de unidades sintácticas.

Realiza la primera fase de la reducción al axioma de la gramática.

Elimina espacios en blanco y comentarios.

Lenguaje regular.

Unidades sintácticas:

Detección de errores morfológicos:

Analizador sintáctico

"Parser".

Gobierna todo el proceso.

Utiliza los demás como subrutinas.

Realiza el resto de la reducción al axioma de la gramática para comprobar que la instrucción en cuestión es correcta.

Lenguaje independiente del contexto.

Analizador semántico

Comprueba la corrección semántica de la instrucción.

Ejemplo: compatibilidad de tipo de las variables en una expresión.

Almacena información semántica en las tablas.

Generador de código

Traduce el programa fuente al lenguaje objeto.