Introducción a los lenguajes de programación

Table of Contents

Bibliografía

  • Introducción capítulo 1 SICP (Building Abstractions with Procedures)
  • Capítulo 1.2 PLP (The Programming Language Spectrum)
  • Capítulo 1.3 PLP (Why Study Programming Languages)
  • Capítulo 1.4 PLP (Compilation and Interpretation)

Historia de los lenguajes de programación

El nacimiento de los computadores comerciales

  • Al comienzo sólo existía el código máquina
  • El UNIVAC fue el primer computador comercial (1951)
  • Aparece la figura del programador
  • manual de 1959 de programación del UNIVAC
  • Mas importantes las horas de funcionamiento del computador que las horas de trabajo del programador

Ordenador UNIVAC

Los pioneros

  • Los primeros lenguajes de programación aparecieron a finales de la década de los 50
  • FORTRAN, equipo de IBM dirigido por John W. Backus
  • FORmula TRANslating system
  • Primer manual de FORTRAN octubre de 1956
  • Primer compilador abril de 1956.

Cita de John Backus (Wikipedia sobre FORTRAN):

Much of my work has come from being lazy. I didn't like writing programs, and so, when I was working on the IBM 701, writing programs for computing missile trajectories, I started work on a programming system to make it easier to write programs.

La explosión

  • Desde 1954 hasta la actualidad se han documentado más de 2.500 (consultar en The Language List)
  • Entre 1952 y 1972 alrededor de 200 lenguajes
  • Una decena fueron realmente siginificativos y tuvieron influencia en el desarrollo de lenguajes posteriores.

Algunos ejemplos importantes

1957 FORTRAN1975 Pascal1990 Haskell
1958 ALGOL1975 Scheme1991 Python
1960 Lisp1975 Modula1993 Ruby
1960 COBOL1983 Smalltalk-801995 Java
1962 APL1983 Objective-C1995 PHP
1962 SIMULA1983 Ada2000 C#
1964 BASIC1986 C++2003 Scala
1964 PL/I1986 Eiffel2003 Groovy
1970 Prolog1987 Perl2009 Go
1972 C1988 Tcl/Tk

Genealogía de los lenguajes de programación

Póster de Eric Levenez

Aspectos que provocan la evolución de los LP

  • Recursos y tipos de ordenadores
  • Aplicaciones y necesidades de los usuarios
  • Nuevos métodos de programación
  • Estudios teóricos
  • Estandarización
La siguiente tabla (extraida del libro Programming Languages. Design and Implementation, de Terrence W. Pratt y Marvin V. Zelkowitz) muestra una pequeña lista de los lenguajes y las influencias que fueron importante a finales del siglo 20.

Ejemplos concretos de evolución

img/lenguajes-influencias.png

Importancia del aprendizaje de técnicas de LPs

Es importante conocer cómo funciona "por dentro" un lenguaje de programación y sus características comparadas.

  • Mejora el uso del lenguaje de programación
  • Incrementa el vocabulario de los elementos de programación
  • Permite una mejor elección del lenguaje de programación
  • Mejora la habilidad para desarrollar programas efectivos y eficientes
  • Facilita el aprendizaje de un nuevo lenguaje de programación
  • Facilita el diseño de nuevos lenguajes de programación

Lenguajes usados en la actualidad

Una lista extraida de freshmeat de proyectos etiquetados con la etiqueta Libraries ordenados por lenguaje de programación

Java (1436)J2ME (35)Groovy (12)
C (1310)Other (30)Visual Basic (11)
C++ (988)Unix Shell (30)ML (10)
PHP (857)Fortran (28)ASP (10)
Python (629)Haskell (23)Pascal (9)
Perl (404)Ada (23)HTML (8)
JavaScript (200)Other Scripting.. (19)Erlang (8)
Ruby (130)Lisp (17)Zope (8)
C# (88)Delphi (15)AJAX (8)
Tcl (86)Lua (14)XML (7)
SQL (67)Eiffel (14).NET (7)
Objective C (41)PL/SQL (13)Qt (6)
Scheme (37)OCaml (13)Emacs Lisp (6)
Assembly (36)Common Lisp (12)bash (5)

La evolución no se detiene

Ruby

img/yukihiromatsumoto.jpg

  • Ruby, un lenguaje de programación ideado en 1993 por el joven japonés Yukihiro Matsumoto
  • Lenguaje multi-paradigma interpretado y muy expresivo que actualmente se utiliza tanto para desarrollar aplicaciones web como videojuegos.
  • Proyecto vivo, cada año aparecen nuevas versiones

Scala

Yikihiro Matsumoto

  • Scala, diseñado en 2003 por el profesor alemán Martin Oderski
  • Respuesta a los problemas de los lenguajes tradicionales imperativos para manejar la concurrencia
  • Está implementado sobre Java y corre en la Máquina Virtual Java

Go

Go

  • Go, el nuevo lenguaje de programación de Google
  • Una mezcla de C y Python que intenta conseguir un lenguaje de programación de sistemas muy eficiente, expresivo y también multiparadigma.

Elementos de los lenguajes de programación

Definición de la Encyclopedia of Computer Science

A programming language is a set of characters, rules for combining them, and rules specifying their effects when executed by a computer, which have the following four characteristics:

  1. It requires no knowledge of machine code on the part of the user
  2. It has machine independence
  3. Is translated into machine language
  4. Employs a notation that is closer to that of the specific problem being solved than is machine code

Definición de Abelson y Sussman

We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a program. […] The programs we use to conjure processes are like a sorcerer's spells. They are carefully composed from symbolic expressions in arcane and esoteric programming languages that prescribe the tasks we want our processes to perform.

Otra idea fundamental:

A powerful programming language is more than just a means for instructing a computer to perform tasks. The language also serves as a framework within which we organize our ideas about processes. Thus, when we describe a language, we should pay particular attention to the means that the language provides for combining simple ideas to form more complex ideas.

Características de un LP

  1. Define un proceso que se ejecuta en un computador
  2. Es de alto nivel, cercano a los problemas que se quieren resolver (abstracción)
  3. Permite construir nuevas abstracciones que se adapten al dominio que se programa

Elementos de un LP

Para Abelson y Sussman, todos los lenguajes de progamación permiten combinar ideas simples en ideas más complejas mediante los siguientes tres mecanismos

  • Expresiones primitivas que representan las entidades más simples del lenguaje
  • Mecanismos de combinación con los que se construyen elementos compuestos a partir de elementos más simples
  • Mecanismos de abstracción con los que dar nombre a los elementos compuestos y manipularlos como unidades

Sintaxis y semántica

  • Sintaxis: un conjunto de reglas que definen qué expresiones de texto son correctas. Por ejemplo, en C todas las sentencias deben terminar en ';'
  • Los lenguajes de programación se ejecutan en un computador y tienen una determinada semántica que define cuál será el resultado de la ejecución de un programa.

Los lenguajes son para las personas

Los lenguajes de programación deben ser precisos, deben poder traducirse sin ambiguedad en lenguaje máquina para que sean ejecutados por computadores. Pero deben ser utilizados (leídos, comentados, probados, etc.) por personas.

La programación es una actividad colaborativa y debe basarse en la comunicación.

Abstracción

Modelar como una actividad fundamental

  • Para escribir un programa que preste unos servicios es fundamental modelar el dominio sobre el que va a trabajar
  • Necesario definir distintas abstracciones que nos permitan tratar sus elementos y comunicarnos correctamente con los usuarios que van a utilizar el programa.

Abstracciones computacionales

Existen abstracciones propias de la computación, que se utilizan en múltiples dominios. Por ejemplo, abstracciones de datos como:

  • Listas
  • Árboles
  • Grafos
  • Tablas hash

También existen abstracciones que nos permiten tratar con dispositivos y ordenadores externos:

  • Fichero
  • Raster gráfico
  • Protocolo TCP/IP

Construcción de abstracciones

Uno de los trabajos principales de un informático es la construcción de abstracciones que permitan ahorrar tiempo y esfuerzo a la hora de tratar con la complejidad del mundo real.

Cita de Joel Spolsky en su blog Joel on Software

TCP is what computer scientists like to call an abstraction: a simplification of something much more complicated that is going on under the covers. As it turns out, a lot of computer programming consists of building abstractions. What is a string library? It's a way to pretend that computers can manipulate strings just as easily as they can manipulate numbers. What is a file system? It's a way to pretend that a hard drive isn't really a bunch of spinning magnetic platters that can store bits at certain locations, but rather a hierarchical system of folders-within-folders containing individual files that in turn consist of one or more strings of bytes.

Lenguajes de programación con constructores de abstracciones

Una misión fundamental de los lenguajes de programación es proporcionar herramientas que sirvan para construir estas abstracciones.

Paradigmas de programación

¿Qué es un paradigma de programación?

  • Un paradigma define un conjunto de reglas, patrones y estilos de programación que son usados por un grupo de lenguajes de programación
  • La separación entre los paradigmas y los lenguajes no es estricta

Paradigmas más importantes

  • Paradigma funcional
  • Paradigma lógico
  • Paradigma imperativo o procedural
  • Paradigma orientado a objetos

Paradigma funcional

Resumen de las características principales:

  • La computación se realiza mediante la evaluación de expresiones
  • Definición de funciones
  • Funciones como datos primitivos
  • Valores sin efectos laterales, no existe la asignación
  • Programación declarativa

Lenguajes: LISP, Scheme, Haskell, Scala, Clojure.

Ejemplo de código (LISP):

(define (factorial x)
   (if (= x 0)
      1
      (* x (factorial (- x 1)))))

(factorial 8)
40320
(factorial 30)
265252859812191058636308480000000

Paradigma lógico

Características:

  • Definición de reglas
  • Unificación como elemento de computación
  • Programación declarativa

Lenguajes: Prolog, Mercury, Oz.

Ejemplo de código (Prolog):

padrede('juan', 'maria'). % juan es padre de maria
padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela').
padrede('carlos', 'debora').

hijode(A,B) :- padrede(B,A).
abuelode(A,B) :-  padrede(A,C), padrede(C,B).
hermanode(A,B) :- padrede(C,A) , padrede(C,B), A \== B.        

familiarde(A,B) :- padrede(A,B).
familiarde(A,B) :- hijode(A,B). 
familiarde(A,B) :- hermanode(A,B).

?- hermanode('juan', 'marcela').
yes
?- hermanode('carlos', 'juan').
no
?- abuelode('pablo', 'maria').
yes
?- abuelode('maria', 'pablo').
no

Paradigma imperativo

Los lenguajes de programación que complen el paradigma imperativo se caracterizan por tener un estado implícito que es modificado mediante instrucciones o comandos del lenguaje. Como resultado, estos lenguajes tienen una noción de secuenciación de los comandos para permitir un control preciso y determinista del estado.

Características:

  • Definición de procedimientos
  • Definición de tipos de datos
  • Chequeo de tipos en tiempo de compilación
  • Cambio de estado de variables
  • Pasos de ejecución de un proceso
    type 
       tDimension = 1..100;
       eMatriz(f,c: tDimension) = array [1..f,1..c] of real;
       
       tRango = record
          f,c: tDimension value 1;
       end;
       
       tpMatriz = ^eMatriz;
    
    
    procedure EscribirMatriz(var m: tpMatriz);
    var filas,col : integer;
    begin
       for filas := 1 to m^.f do begin
          for col := 1 to m^.c do
             write(m^[filas,col]:7:2);
          writeln(resultado);
          writeln(resultado)
         end;    
    end;
    

Paradigma orientado a objetos

Características:

  • Definición de clases y herencia
  • Objetos como abstracción de datos y procedimientos
  • Polimorfismo y chequeo de tipos en tiempo de ejecución

Ejemplo (Java):

public class Bicicleta {
    public int marcha;
    public int velocidad;
        
    public Bicicleta(int velocidadInicial, int marchaInicial) {
        marcha = marchaInicial;
        velocidad = velocidadInicial;
    }
        
    public void setMarcha(int nuevoValor) {
        marcha = nuevoValor;
    }
        
    public void frenar(int decremento) {
        velocidad -= decremento;
    }
        
    public void acelerar(int incremento) {
        velocidad += incremento;
    }
}

public class MountainBike extends Bicicleta {
    public int alturaSillin;

    public MountainBike(int alturaInicial, int velocidadInicial, int marchaInicial) {
        super(velocidadInicial, marchaInicial);
        alturaSillin = alturaInicial;
    }   
        
    public void setAltura(int nuevoValor) {
        alturaSillin = nuevoValor;
    }   
}

public class Excursion {
   
        public static void main(String[] args) {
           MountainBike miBicicleta = new MoutainBike(10,10,3);
           miBicicleta.acelerar(10);
           miBicicleta.setMarcha(4);
           miBicicleta.frenar(10);
        }
}

Compiladores e intérpretes

Existe una gran variedad de estrategias para conseguir que un programa se ejecute en un computador. Todas se basan en los "meta-programas" (compiladores, intérpretes, etc.) cuyos datos de entrada son el código fuente de otros programas.

Estos meta-programas procesan otros programas y realizan múltiples tareas.

Compilación

La siguiente figura muestra el proceso de generación y ejecución de un programa compilado.

Proceso de compilación

Ejemplos: C, C++

  • Diferentes momentos en la vida de un programa: tiempo de compilación y tiempo de ejecución
  • Mayor eficiencia

Interpretación

Proceso de interpretación

Ejemplos: BASIC, LISP, Scheme, Python, Ruby

  • No hay diferencia entre el tiempo de compilación y el tiempo de ejecución
  • Mayor flexibilidad: el código se puede construir y ejecutar "on the fly" (funciones lambda o clousures).

Ejecución en máquina virtual

Ejecución en una máquina virtual

Ejemplos: Java, Scala

Enlazado de rutinas y librerías

Enlazado de librerías

Preprocesamiento

Prepropceso

El preprocesador analiza el código y sustituye macros. Ejemplo: C, C++. Scala hace algo parecido con Java.


Lenguajes y Paradigmas de Programación
Curso 2010-2011
Departamento de Ciencia de la Computación e Inteligencia Artificial
Universidad de Alicante

Sitio web realizado con org-mode y el estilo CSS del proyecto Worg

Validate XHTML 1.0