Lenguajes de programación. Tipos. Características.

De MediaWiki
Ir a la navegación Ir a la búsqueda

Rúbrica

Rúbrica de Xuño 2021 Xunta de Galicia
Tema Peso
1 - Presentación do tema: índice, contexto, coherencia, claridade expositiva, relación co currículo, conclusións e bibliografía. 15 %
2 - Linguaxes de programación. Definición. Elementos dunha linguxe de programación. Xeracións de linguaxes de programación (1G,2G,3G e 4G) 15 %
3 - Tipos e clasificacións de linguaxes de programación. Clasificación por nivel: máquina, ensamblador, alto nivel. Linguaxes declarativas ou imperativas. Linguaxes procedimentais, funcionais, orientados a obxectos. Linguaxes de propósito xenérico ou de propósito específico. Linguaxes concorrentes e non concorrentes. Linguaxes de servidor ou de contorno cliente. Linguaxes interpretados, compilados ou híbridos. Outras clasificacións relevantes. 40 %
4 – Linguaxes de alto nivel. Portabilidade. Procedementos. Recursividade. Herdanza. Polimorfismo. Encapsulación. 15 %
5 – Linguaxe máquina. Alfabeto. Direccións de memoria. Sintaxe. Outras características relevantes. 5 %
6 - Ensambladores. Compiladores. Fases de compilación. Intérpretes. 10 %


Lenguajes de programación

Definición

Un lenguaje de programación es un lenguaje formal que le proporciona a una persona, en este caso el programador, la capacidad de escribir (o programar) una serie de instrucciones o secuencias de órdenes en forma de algoritmos con el fin de controlar el comportamiento físico o lógico de un sistema informático, de manera que se puedan obtener diversas clases de datos o ejecutar determinadas tareas.

Características

Programar viene a ser el proceso de crear un software fiable mediante la escritura, prueba, depuración, compilación o interpretación, y mantenimiento del código fuente de dicho programa informático. Básicamente, este proceso se define aplicando lógicamente los siguientes pasos:

  • El desarrollo lógico del programa para resolver un problema en particular.
  • Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
  • Compilación o interpretación del programa hasta convertirlo en lenguaje de máquina.
  • Prueba y depuración del programa.
  • Desarrollo de la documentación.

Los lenguajes de programación están formados por un conjunto de símbolos (llamado alfabeto), de reglas gramaticales (léxico/morfológicas y sintácticas) y de reglas semánticas, que en conjunto definen las estructuras válidas del lenguaje y su significado

Generaciones

Pueden clasificarse en cinco generaciones.

Primera generación (1GL)

Formada por los lenguajes de programación utilizados en los primeros ordenadores: lenguaje máquina y ensamblador.

Segunda generación (2GL)

Formada por el lenguaje macroensamblador que es ensamblador combinado con instrucciones de control y de manejo de datos más complejas. Estos lenguajes son específicas para una familia de procesadores y el hardware relacionado con el. Aún se siguen utilizando para programar los núcleos (kernel) de los sistemas operativos y los controladores de algunos dispositivos (device drivers).

Tercera generación (3GL)

Formada por la mayor parte de los lenguajes de alto nivel actuales. El código es independiente de la máquina y el lenguaje de programación es parecido al lenguaje humano. Por ejemplo: Java, C, C++, PHP, JavaScript, e Visual Basic.

Cuarta generación (4GL)

Formada por lenguajes y entornos diseñados para una tarea o propósito muy específico como acceso a bases de datos, generación de informes, generación de interfaces de usuario, etcétera. Por ejemplo: SQL, Informix 4GL y Progress 4GL.

Quinta generación (5GL)

Formada por lenguajes en las que el programador establece el problema a resolver y las condiciones a cumplir. Se usan en inteligencia artificial, sistemas basados en el conocimiento, sistemas expertos, mecanismos de inferencia o procesamento del lenguaje natural. Por ejemplo: Prolog, Smalltalk y Lisp.

Tipos

Lenguajes compilados vs Lenguajes interpretados

Lenguajes interpretados

Lenguajes compilados

En función del nivel de abstracción

En función del nivel de abstracción podemos diferenciar de más bajo a más alto nivel entre:

  • Lenguaje máquina: Mantiene una dependencia total con la arquitectura física de la máquina; siguen una notación binaria.
  • Lenguaje ensamblador: Permite escribir instrucciones con una notación simbólica o nemotécnica.
  • Lenguaje de alto nivel: Aporta una mayor independencia de la máquina; esto lenguajes requieren ser compilados o interpretados

En función paradigma de programación

Un paradigma de programación es una metodología o filosofía de programación a seguir con un núcleo central incuestionable; es decir, los lenguajes que utilizan el mismo paradigma de programación utilizarán los mesmos conceptos básicos para programar.

Pueden clasificarse en dos grandes grupos: el grupo que sigue el paradigma imperativo e el que sigue el paradigma declarativo.

Lenguajes Declarativos

El código indica que es lo que se quiere obtener pero no cómo se tiene que obtener.

Es un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen el problema y detallan se solución. El programador tiene que pensar en la lógica del algoritmo y no en la secuencia de ordenes para que se lleve a cabo.

Un lenguaje declarativo es un tipo de lenguaje de programación basado más en las matemáticas y en la lógica que los lenguajes imperativos, más cercanos estos al razonamiento humano. Los lenguajes declarativos no dicen cómo hacer una cosa, sino, más bien, qué cosa hacer. Hay dos subtipos:

  • Lenguajes Funcionales
  • Lenguajes Lógicos.

Lenguajes funcionales

Se trata de lenguajes de programación sin asignaciones, basados en el concepto matemático de función.

Consisten en combinar funciones para conseguir funciones más complejas hasta llegar a la función que es el programa.

Ejemplos de estos lenguajes son LISP y SCHEME

Lenguajes lógicos

Son lenguajes en los que se especifican un conjunto de hechos y una serie de reglas que permiten la deducción de otros hechos. El sistema utiliza esa información para encontrar la solución.

La programación lógica desde la perspectiva del programador consiste en establecer correctamente todos los hechos y reglas, ya que el cálculo está implícito.

El lenguaje lógico más representativo es PROLOG, basado en la lógica de predicados.

Lenguajes Imperativos

El código está formado por una serie de pasos o instrucciones para realizar una tarea organizando o cambiando valores en memoria. Las instruciones se ejecutan de forma secuencial, es decir, hasta que no se ejecuta una no se pasa a ejecutar la siguiente. Entre muchos otros, Java, C, C++, PHP, JavaScript y Visual Basic son ejemplos de lenguajes imperativos.

Dentro de los lenguajes imperativos se van produciendo evoluciones de la metodología estructurada a nuevos enfoques como son la programación orientada a objetos, la programación orientada a aspectos, la programación concurrente u la programación multiparadigma.

A finales de los años 60 nace la metodología estructurada que permitía tres tipos de estructuras en el código:

  • la secuencial
  • la alternativa (basada en una decisión)
  • la repetitiva (bucles).

Los programas están formados por datos y esas estructuras. Un ejemplo sería el lenguaje Basic.

La primera evolución supuso añadir al módulo como componente básico dando lugar a la programación estructurada y modular. Los programas estaban formados por módulos o procesos por un lado y datos por otro. Los módulos necesitaban unos datos de entrada y obtenían otros de salida que a su vez podían ser utilizados por otros módulos. Por ejemplo, C es un lenguaje estructurado y modular.

En los años 80 apareció la programación orientada a objetos, y otros enfoques como la programación concurrente, la orientada a eventos, la orientada a aspectos, y la multiparadigma

Orientados a objetos

Esta metodología se popularizó a principios de los 90 siendo actualmente una de las más utilizadas. Cada objeto sigue el patrón especificado en una clase. Los programas contienen objetos que se relacionan o colaboran con otros objetos de su misma clase o de otras clases. La clase está compuesta de atributos (datos) y métodos (procesos) y puede tener las propiedades:

  • Herencia. Pueden declararse clases hijas que heredan las propiedades y métodos de la clase padre. Los métodos heredados pueden sobrecargarse; esto es, dentro de la misma clase puede aparecer definido con distinto comportamiento el mismo método con diferente firma (número de parámetros y tipo de los mismos)
  • Polimorfismo. Propiedad que permite que un método se comporte de diferente manera dependiendo del objeto sobre el que se aplica.
  • Encapsulamiento. Permite ocultar detalles internos de una clase.

C++, C# y Java son ejemplos de lenguajes orientadas a objetos.

Lenguajes concurrentes

Dijkstra instigó el estudio de la programación concurrente en su ahora clásico artículo "Procesos secuenciales de cooperación", publicado en 1967. En ese artículo vemos la introducción de algunos problemas ahora bien conocidos como "The Dining Philosophers","The Sleeping Barber " y "The Dutch Flag Problem"; y quizás lo más importante, el problema de la sección crítica y su solución utilizando semáforos. Este artículo fue, de hecho, el primero en tener una visión de alto nivel de la programación concurrente.

Su filosofía es la división de un problema en subproblemas que se solucionan de forma individual, para crear un programa o aplicación que no se vea afectada en tiempo real.

Un lenguaje de programación será concurrente si posee las estructuras necesarias para **definir y manejar diferentes tareas (hilos de ejecución)** dentro de un programa de forma simultánea gestionando los problemas de comunicación y sincronización entre esos hilos.

Ejemplos: Java, Ada

Lenguajes conducidos por eventos

La programación dirigida por eventos, es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario (como un clic de ratón o pulsación de teclado) o que ellos mismos provoquen.

Este es el paradigma más habitual en el desarrollo de interfaces gráficas de usuario (GUI) o drivers de dispositivos.

Swift sería un lenguaje representativo de este paradigma.

Lenguajes orientados a aspectos

La idea central de la POA es permitir que un programa sea construido describiendo cada concepto (o incumbencia) separadamente. El soporte para este nuevo paradigma se logra a través de una nueva clase de lenguajes, llamados lenguajes orientados a aspectos (LOA), los cuales brindan mecanismos para capturar y declarar aquellos elementos que se diseminan por todo el sistema (aspectos).

Los LOA son aquellos lenguajes que permiten separar la definición de la funcionalidad “principal” de la definición de los diferentes aspectos.

Los LOA deben satisfacer varias propiedades deseables, entre las que se pueden mencionar:

  • Cada aspecto debe ser claramente identificable.
  • Cada aspecto debe auto contenerse.
  • Los aspectos deben ser fácilmente modificables.
  • Los aspectos no deben interferir entre ellos.
  • Los aspectos no deben interferir con los mecanismos usados para definir y evolucionar la funcionalidad principal, como la herencia.

Se distinguen dos enfoques diferentes en el diseño de los lenguajes orientados a aspectos:

  • los lenguajes orientados a aspectos de dominio específico. Por ejemplo:
    • COOL (COOrdination Language) es un lenguaje de dominio específico, desarrollado por Xerox, cuya finalidad es tratar los aspectos de sincronismo entre hilos concurrentes.
    • RIDL (Remote Interaction and Data transfers aspect Language) es un LOA de dominio específico que maneja la transferencia de datos entre diferentes espacios de ejecución.
    • MALAJ (Multi Aspect LAnguage for Java) [13] es un LOA de dominio especifico, focalizado en la sincronización y reubicación.
  • los lenguajes orientados a aspectos de propósito general. Algunos ejemplos
    • AspectC: LOA que extiende C.
    • AspectC++: LOA que extiende de C++
    • AspectJ: LOA que extiende de Java

Programación multiparadigma

La Programación Multiparadigma es una práctica que emerge como resultado de la coeexistencia de los paradigmas orientado a objetos, procedural, declarativo y funcional buscando mejorar la producción en el desarrollo de proyectos.

Rust quizás sea su mejor exponente: es un lenguaje de programación compilado, de propósito general y multiparadigma que está siendo desarrollado por Mozilla.​ Ha sido diseñado para ser "un lenguaje seguro, concurrente y práctico".

Python también encajaría: es orientado a objetos, reflexivo, imperativo y funcional.

En función del dominio de aplicación

Podemos tener la siguiente clasificación en función de los dominios de aplicación siguientes:

  • Aplicaciones científico-técnicas: Como ejemplo tenemos MATLAB o R.
  • Aplicaciones de gestión de información: Como ejemplo tenemos Java, o SQL.
  • Aplicaciones de programación de sistemas: Como ejemplo tenemos C, o C++.
  • Aplicaciones Web: Como ejemplo tenemos PHP, o Javascript.
  • Aplicaciones para movilidad: Como ejemplos tenemos Swift, o Kotlim.

Otros lenguajes y su clasificación

Existen otros lenguajes informáticos, que sin ser estrictamente de programación, si son de gran importancia en la informática y en la web. Una posible clasificación de esos lenguajes sería: lenguajes de marcas, especificación, consulta y transformación

Lenguajes de marcas

Permiten colocar distintivos o señales en el texto que serán interpretadas por aplicaciones o procesos. Algunos ejemplos de lenguajes de marcas:

  • XML (eXtensible Markup Language): metalenguaje extensible pensada para la transmisión de información estructurada y que pueda ser validada.
<?xml version="1.0" encoding="UTF-8"?>
<alumnos>
  <alumno>
     <nome>Xurxo</nome>
     <apelidos>Losada Blanco</apelidos>
  </alumno>
  <alumno>
     <nome>Antía</nome>
     <apelidos>Pérez López</apelidos>
  </alumno>   
</alumnos>
  • HTML (Hiper Text Markup Language) o XHTML (eXtensible Hiper Text Markup Language): sirven ambas para publicar hipertexto en la Word Wide Web.
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
 <!-- Ejemplo muy básico de XHTML con estilo externo -->
 <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Ejemplo básico de xhtml</title>
        <meta   content="text/html; charset=utf-8" 
                http-equiv="Content-Type" />
        <link   rel="stylesheet" href="ejemplo_css.css" 
                type="text/css" />
    </head>
    <body>
        <h1>Cabeceira principal</h1>
        <p class="principal">Este párrafo contiene texto y un enlace a 
            <a href="http://www.realacademiagalega.org/">Real Academia Galega </a>.
        </p>
    </body>
 </html>

Lenguajes de especificación

Describen algo de forma precisa. Por exemplo CSS (Cascading Style Sheets) é unha linguaxe formal que especifica a presentación ou estilo dun documento HTML, XML ou XHTML. Exemplo de código CSS que se podería aplicar ao exemplo XHTML anterior e editado en Notepad++:

body{
   font-family: "MS Sans Serif", Geneva, sans-serif;
   font-size: 15px;
   color: Black;
   border:black 2px double;
   padding: 40px;
   margin: 20px;}
h1 {
   font: 40px "Times New Roman", Times, serif;
   font-weight: bolder;
   word-spacing: 25px;}
p.principal{
   text-align: center;
   font: 10px "MS Serif", "New York", serif;}

Lenguajes de consultas

Permiten extraer o manipular información de un grupo de información. Por ejemplo:

  • el lenguaje de consultas SQL (Standard Query Language) permite buscar y manipular información en bases de datos relacionales
-- Ejemplo de script SQL:
select *
from empleados;
  • el lenguaxe XQuery permite buscar y manipular información en bases de datos XML nativas
--Ejemplo de expresión FLOWR (for, let, order by, where, return) en XQuery:
for $libro in doc("libros.xml")/bib/libro
let $editorial := $libro/editorial
where $editorial="MCGRAW/HILL" or contains($editorial, "Toxosoutos")
return $libro

Lenguajes de transformación

Actúan sobre una información inicial par obtener otra nueva.

Por exemplo, el lenguaje XSLT (eXtensible Stylesheet Language Tranformations) permite describir las transformaciones que se van realizar sobre un documento XML para obtener otro archivo.

Un ejemplo de transformación XSL que cuando actúa sobre el exemplo XML anterior obtiene una páxina HTML con una lista del alumnado:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Ejemplo sencillo de transformación XSL -->
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="alumnos">
        <html>
            <head>
                <title>fundamentos.xsl</title>
            </head>
            <body>
                <h1>Alumnos</h1>
                <ul>                
                    <xsl:for-each select="alumno">
                        <li>
                            <xsl:value-of select="apelidos"/>, 
                            <xsl:value-of select="nome"/>
                        </li>
                    </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>
 </xsl:stylesheet>

Características de un lenguaje de programación

Características del diseño

Las características deseables en un lenguaje de programación, según Kenneth C.Louden (2004) son las siguientes:

Eficiencia en la ejecución

Al iniciarse los lenguajes de programación, existía un criterio de diseño primordial: eficiencia en la ejecución. Este principio puede abarcar características para la eficiencia del código:

1. Optimización: se refiere al diseño del lenguaje que debe ser tal que un traductor nos pueda generar un código ejecutable eficiente.

2. Eficiencia de traducción: se refiere a la verificación de errores que podrían tener al compilar/interpretar el código fuente y podría resultar en que el código objeto resulte ineficiente.

3. La confiabilidad: se refiere al aseguramiento de que un programa no se comportará en forma no esperada o desastrosa durante la ejecución. Un programa que no sea confiable genera muchos costos adicionales como causar un completo desperdicio de tiempo de desarrollo y de codificación.

4. La capacidad de la implementación: es la eficiencia con la se puede escribir un traductor. El éxito de un lenguaje se puede obstaculizar simplemente porque es demasiado difícil escribir un traductor (compilador o intérprete).

5. Eficiencia de la programación: esto está claramente relacionada con la potencia y la generalidad de los mecanismos de abstracción del lenguaje. Lo conciso de la sintaxis y evitar detalles innecesarios, como son las declaraciones de variables, a menudo se consideran también factores importantes en este tipo de eficiencia.

6. La capacidad de darle mantenimiento: se refiere a la facilidad con la cual se pueden localizar los errores y corregirse, así como agregarse nuevas características

Regularidad

Implica las restricciones no usuales en el uso de constructores particulares también menos restricciones raras entre dichos constructores. Se subdivide en 3 conceptos más precisos:

1. La generalidad: se refiere al eliminar casos especiales en la disponibilidad en el uso de constructores y combinar constructores íntimamente relacionados en uno solo más general.

2. La ortogonalidad: significa que los constructores de los lenguajes se pueden combinar en cualquier forma significativa y que la interacción de los constructores, o el contexto del uso, no debe generar restricciones o comportamientos inesperados.

3. La uniformidad: significa que cosas similares deben verse de manera similar y tener significados similares y, a la inversa, las cosas diferentes deben verse diferentes.

Simplicidad

Un lenguaje de programación demasiado simple puede, de hecho, hacer que la tarea de utilizarlo resulte más compleja por la carencia de algunos constructores fundamentales.

Expresividad

La expresividad es la facilidad con la cual un lenguaje puede expresar procesos y estructuras complejas. Algunas veces la expresividad se considera poco concisa, lo que puede, por tanto, comprometer la legibilidad.

Extensibilidad

Permite que el usuario pueda agregar características a un lenguaje.

Capacidad de restricción

En el diseño del lenguaje conceptos estándares como son los programas, funciones y variables deben quedar claramente reconocibles.

Precisión

Es la existencia de una definición precisa para un lenguaje, de tal manera que le comportamiento de los programas pueda ser predecible.

Independencia de la maquina

El diseño de un lenguaje debe intentar aislar e identificar todas aquellas dependencias de la máquina que no se pueden evitar, de manera que el programador sepa exactamente dónde pueden presentarse dificultades.

Seguridad

Promueve un diseño de lenguaje que permite que los errores sean descubiertos e informados. La seguridad está íntimamente relacionada con la confiablidad y con la precisión.

Aspectos de la implementación

En cuanto a las características relacionadas con la implementación, tenemos:

  • Curva de aprendizaje: es el grado de éxito obtenido durante el aprendizaje en el transcurso del tiempo. Una curva pronunciada implica un aprendizaje rápido.
  • Compilado o interpretado: Según el contexto de implementación será mejor un sistema de traducción u otro.
  • Portabilidad: facilidad de recompilar el código para distintos sistemas operativos y/o ordenadores.
  • Soporte externo y documentación: Base de conocimiento, manuales y ayuda por parte del desarrollador o la comunidad.
  • Coste de mantenimiento: Teniendo en cuenta que dos tercios del tiempo del ciclo de vida del software se gasta en mantenimiento, este es un aspecto relevante.

Los lenguajes de programación actuales y su tendencia

Para saber cuales son los lenguajes más difundidos poden consultarse los siguientes índices o clasificaciones:

  • Índice Tiobe: Se basa en el número de ingenieros cualificados en cada lenguaje en todo el mundo, cursos de lenguajes ofertados, provedores que trabajan sobre los lenguajes, búsquedas realizadas en Google, Bing, Yahoo, Wikipedia, Amazon, YouTube y Baidu; y una serie de premisas como por ejemplo que el lenguaj exista como lenguaxe de programación en Wikipedia y que tenga por lo menos 10000 visitas en Google.
  • Índice PYPL ou PopularitY of Programming Language index: se basa en el análisis de frecuencia de búsqueda de tutoriales o guías de lenguajes de programación en Google utilizando Google Trends.
  • clasificación Redmonk: no basa su clasificación en la información de los buscadores si no en los proyectos albergados en los repositorios en GitHub y en las preguntas de la web de StackOverflow orientada a programadores. Incluye lenguajes informáticos y no solo lenguajes de programación.
  • clasificación Trendyskills: Se basa en las ofertas de empleo para los lenguajes de programación en varios países europeos y Estados Unidos. Incluye lenguajes informáticos y no solo lenguajes de programación.
  • IEEE Spectrum: Se basa en la combinación de once métricas de 8 fuentes: CareerBuilder, GitHub, Google, Hacker News, the IEEE, Reddit, Stack Overflow y Twitter

Los lenguajes comunes a todos estos índices en el año 2021 en los 10 primeros puestos son: C, C++, Java, C#, PHP, Python y JavaScript.

10 Lenguajes de programación más populares en 2021
Índice Tiobe Índice PYPL Clasificación Redmonk Clasificación Trendyskills Clasificación IEEE Spectrum
C Python Javascript Java Python
Java Java Python Python Java
Python Javascript Java JavaScript C
C++ C# PHP C++ C++
C# C/C++ C++ TypeScript JavaScript
Visual Basic PHP C# J R
JavaScript R Ruby C# Arduino
Assembly language Objective-C CSS PHP Go
PHP TypeScript TypeScript Go Swift
SQL Swift C HTML Matlab

Conclusión

Los lenguajes de programación han recorrido un largo camino desde los primeros lenguajes ensambladores hasta la actualidad. Hoy en día los principales desarrollos apuntan hacia la Inteligencia artificial como nuevo paradigma de programación. El desarrollo del lenguaje natural, la conducción automática, el reconocimiento facial y otros avances significativos de la informática vienen de la mano del desarrollo de nuevos chips especializados y de nuevos motores de inteligencia.

Relación del tema con el sistema educativo actual

Este tema puede ser desarrollado en los siguientes módulos formativos (para atribución docente de PES)

  • Bachillerato - Tecnologías de la Información y la Comunicación II (PES)
  • GS- GS - DAW - Desarrollo Web en Entorno Servidor DAW/DAM - Programación (PES)

Aunque los profesores de SAI no tienen una atribución docente en ningún módulo con aplicación directa del tema, siempre es probable que se diseñe algún pequeño programa en clase, para lo que recurrir a la notación de pseudocódigo o de ordinograma sería un recurso esclarecedor.

Bibliografía

  • Introduction to Java Programming and Data Structures, Comprehensiva Versión. Y. Daniel Liang. Pearson, 11ª edición. 2017.
  • Java 9. Francisco Javier Moldes Teo. Anaya. 2017.
  • Introducción a la computación. J, Glenn Brookshear, Pearson, 11ª edición. 2012
  • Fundamentos de programación. Algoritmos, estructuras de datos y objetos. Luis Joyanes Aguilar, McGraw-Hill, 4ª edición. 2008.
  • Langsam, Augenstein y Tanembaum: “Estructuras de Datos con C y C++”, Prentice- Hall 1997
  • Prieto A., Lloris A. y Torres J.C.: Introducción a la Informática, 4ª ed (2006) McGraw- Hill
  • Lenguajes de programación, principios y práctica. 2- Ed (2004). Kenneth C.Louden

Referencias