Está en la página 1de 19

Prolegómenos Introducción Clasificación de los Lenguajes

Lenguajes de Programación I
Introducción

Ernesto Hernández-Novich
<emhn@usb.ve>

Copyright
c 2007-2010
Prolegómenos Introducción Clasificación de los Lenguajes

La Materia

Ernesto Hernández-Novich
Consultas
Preferiblemente por correo electrónico <emhn@usb.ve>.
Escriba [CI3641] al comienzo del asunto.
Previa cita, en MYS-220C (no vengo todos los días).
Tenemos clase Lun y Mié en AUL-009, 15:30-17:30pm.
Tres (3) exámenes escritos
Primer Parcial (25 %) el 2010-10-06 (Mié Semana III)
Segundo Parcial (35 %) el 2010-11-08 (Lun Semana VIII)
Tercer Parcial (40 %) el 2010-12-06 (Lun Semana XII)
http://www.ldc.usb.ve/~emhn/
Prolegómenos Introducción Clasificación de los Lenguajes

Bibliografía

Michael L. Scott.
Programming Language Pragmatics
Morgan Kaufmann Publishers, Inc.
San Francisco, California
ISBN 13: 978-0-12-633951-2
ISBN 10: 0-12-633951-1

Sugiero leer el material correspondiente a cada clase


anticipadamente pues las clases consisten en
ejemplos de los conceptos.
Prolegómenos Introducción Clasificación de los Lenguajes

Preparación para los exámenes

El libro es denso e intenso.


Aprender de memoria los conceptos es inútil.
Tendrán que escribir programas concretos, que si dominan
la materia y los conceptos involucrados siempre terminan
siendo programas cortísimos.
Haskell, C, C++, Scheme y Prolog son los lenguajes que
suelen aparecer. Es irrelevante que Ud. no esté inscrito en
CI-3661
En la mayoría de las clases hay ejemplos de código en
diversos lenguajes. Se sugiere hacerlos funcionar y
modificarlos para afirmar los conocimientos.
¡Estudie las soluciones a los exámenes de cursos previos!
Aprenda cómo y, sobre todo, cuánto y cuán ordenado es
necesario escribir para tener una respuesta correcta.
Prolegómenos Introducción Clasificación de los Lenguajes

¿Por qué es importante ésta materia?

¿Cuál es tu rol ante los lenguajes?


Si eres programador, eres un mero usuario de lenguajes.
Si eres un implantador la materia es Traductores.
Esta materia apoya al diseñador de lenguajes.
Y comprender el contenido:
Permite aprender nuevos lenguajes con facilidad.
Permite comprender y explotar las cosas oscuras de los
lenguajes.
Ayuda a escoger la mejor alternativa para cada problema.
Contribuye a mejorar el uso (y abuso) de entornos de
programación.
Induce a imitar un lenguaje dentro de otro.
Prolegómenos Introducción Clasificación de los Lenguajes

Historia (1940s)

En el principio sólo había ceros y unos (y a veces, sólo


ceros).
Programar era el mismo arte que ahora, pero requería
conexiones de cables.
Luego se programaba en lenguaje de máquina
directamente, pasando muy rápidamente al lenguaje
ensamblable (como mucho con macros).
La programación estaba centrada en la máquina
Muy bajo nivel.
Intimo conocimiento del hardware.
La portabilidad no era importante.
La comprensión del trabajo de otros era difícil.
Prolegómenos Introducción Clasificación de los Lenguajes

Historia (1950s)

Se desarrolla el primer lenguaje de alto nivel (FORTRAN).


Le siguen lenguajes como LISP y Algol.
Traducción del lenguaje de alto nivel a lenguaje de
máquina usando los primeros compiladores.
Prolegómenos Introducción Clasificación de los Lenguajes

El presente...

La cantidad de lenguajes es abrumadora.


¿Cuántos lenguajes conoces?
¿Cuántos lenguajes dominas?
¿Por qué tal diversidad?
Evolución (encontramos mejores formas de hacer las
cosas).
Propósitos especiales (dominio del problema).
Preferencias personales (¡Perl rules!).
Prolegómenos Introducción Clasificación de los Lenguajes

¿Por qué un lenguaje se hace popular?

Poder expresivo.
Facilidad de uso para el novato.
Facilidad de implantación, en particular Software Libre.
Calidad de las herramientas (compiladores, IDEs).
Inercia y dinero.
Prolegómenos Introducción Clasificación de los Lenguajes

¿Cómo expresar el problema?

Imperativos.
Enfasis en cómo hacer las cosas.
Von-Neumann (Fortran, Pascal, C, Basic).
Orientados a Objetos (C++, Smalltalk, Eiffel, Java).
Declarativos.
Enfasis en qué hacer.
Funcionales (LISP/Scheme, Haskell, ML, Erlang).
Flujo de Datos (Id, Val).
Lógicos (Prolog, cualquier hoja de cálculo).
Mixtos.
Combinan características de ambos grupos.
Perl, Python, Ruby.
Prolegómenos Introducción Clasificación de los Lenguajes

Lenguajes dentro de lenguajes


Cuando un lenguaje engendra y hospeda otro

Domain Specific Languages (DSL)


Haskore (expresión musical dentro de Haskell).
Perligata (escribir programas Perl en latín).
Unix Shell Scripting
Lenguajes embebibles
Lua (usado en WoW y Half Life 2, awesome window
manager).
EMACS Lisp o Vim + (Perl, Python, Ruby)
Prolegómenos Introducción Clasificación de los Lenguajes

¿Cómo pasa de código fuente a resultados?

Compilados.
Interpretados.
Máquinas virtuales (el punto medio).
Prolegómenos Introducción Clasificación de los Lenguajes

Compilación pura

El código fuente es procesado por un compilador, que


genera un programa objeto ejecutable en el lenguaje
nativo de la máquina.
El programa objeto es ejecutado de manera directa y
opera de forma autónoma sobre el procesador,
procesando sus entradas y produciendo sus salidas.
Los lenguajes compilados tienden a producir programas
con mayor velocidad de ejecución, a un costo de
procesamiento previo.
C y Fortran son ejemplos de lenguajes con compilación
pura.
Prolegómenos Introducción Clasificación de los Lenguajes

Interpretación pura

El código fuente es procesado por un interpretador, que


controla la evolución del programa paso a paso. El
interpretador ejecuta directamente sobre el procesador
anfitrión.
Cada línea o instrucción del programa es leída por el
interpretador, analizada y ejecutada, posiblemente
utilizando entradas y produciendo salidas.
Los lenguajes interpretados tienden a producir programas
con menor velocidad de ejecución, pero con mucha más
flexibilidad en el ciclo de desarrollo y diagnósticos.
LISP, Prolog y Smalltalk son ejemplos de lenguajes con
interpretación pura.
Prolegómenos Introducción Clasificación de los Lenguajes

Máquinas virtuales

El código fuente es procesado por un traductor, que


produce una representación intermedia del programa de
un nivel más bajo (bytecode), como si se tratara de una
máquina ideal con operaciones abstractas.
El código intermedio es interpretado por una máquina
virtual que implanta esas operaciones abstractas, y que
utiliza las entradas o produce salidas.
La calidad del traductor en cuanto a optimización del
código y la expresividad del lenguaje intermedio,
combinados con una implantación eficiente de dicha
máquina virtual permite obtener beneficios en ambos
extremos (velocidad de desarrollo y velocidad de
ejecución).
Perl, Ruby, Python y Java son ejemplos.
http://www.parrot.org
Prolegómenos Introducción Clasificación de los Lenguajes

Preprocesadores

Aplicable a compilación e interpretación.


Expande macros (mera sustitución de cadenas).
Capaz de enriquecer el código fuente incluyendo código
fuente general adicional.
Capaz de eliminar código fuente condicionalmente.
Generalmente separado del lenguaje (preprocesador de
C), pero en algunos lenguajes puede ser un elemento
intrínseco (source filter Perl).
Prolegómenos Introducción Clasificación de los Lenguajes

Librerías y cargadores (linkers)

Compilación separada o por partes.


Una librería es una colección de rutinas previamente
desarrolladas y posiblemente optimizadas.
El código fuente hace referencia a las rutinas.
En un lenguaje puramente compilado, el enlazador
resuelve esas dependencias estáticamente durante la
construcción del programa objeto.
En un lenguaje puramente interpretado, el interpretador
agrega las librerías durante la ejecución y establece las
dependencias dinámicamente.
Prolegómenos Introducción Clasificación de los Lenguajes

Compilación a ensamblable

El compilador genera lenguaje ensamblable del


procesador anfitrión en lugar de generar código objeto
directamente.
¿Por qué no generar otro lenguaje de alto nivel? Esto se
llama traducción de fuente a fuente.
SQL embebido en C.
Compiladores para LISP o Prolog.
Así funcionaban las primeras versiones de C++.
Haskell genera Core, que se optimiza para generar C o
bien código de máquina.
Prolegómenos Introducción Clasificación de los Lenguajes

¿El huevo o la gallina?

¿De dónde salió el primer compilador?


Difícil escribir un compilador para X en ensamblable.
Más fácil escribir un interpretador para X en ensamblable.
Una vez que tengo el interpretador para X corriendo en la
máquina, escribo un compilador para X en X.
¡Corro el compilador para X en el interpretador para X, y le
doy como entrada el compilador para X!
Esto se llama bootstrapping.
Técnica similar hizo popular a Pascal. Niklaus Wirth
distribuía:
Compilador para Pascal escrito en Pascal que generaba
P-código.
Compilador para Pascal traducido a P-código.
Interpretador de P-código escrito en Pascal.
Basta traducir este interpretador a algún lenguaje local.

También podría gustarte