📘 Pascal — 1970

⬅️ Atlas · 🧟 Lenguajes que siguen vivos · 📚 Índice de clases

El lenguaje diseñado para enseñar a programar bien. Niklaus Wirth lo escribió como una tesis sobre cómo debía ser un lenguaje: pequeño, ordenado, con tipos fuertes y sin trampas. Millones de programadores aprendieron con él, y su influencia está en la sintaxis de media docena de lenguajes posteriores que probablemente sí usas.

🎯 Por qué está en este programa

Criterio de inclusión: Pascal se ejecuta hoy, principalmente a través de sus dos descendientes vivos: Free Pascal (compilador libre y multiplataforma, con el IDE Lazarus) y Delphi (comercial y en desarrollo activo). El Pascal ISO clásico es minoritario; la línea Object Pascal es un negocio en marcha.

Entra porque es el origen documentado de ideas que el núcleo da por sentadas y ya no explica: el tipado fuerte con conversiones explícitas, los tipos definidos por el usuario (enumerados, subrangos, registros), y la separación limpia entre declaración y ejecución. Cuando en la Parte 3 se estudia por qué := no es =, o por qué un enum de Rust es distinto de un entero, se está estudiando una decisión que Wirth tomó en 1970 y argumentó por escrito. Leer Pascal es leer el razonamiento original.

Año 1970; estándar ISO 7185 en 1983; Extended Pascal ISO 10206 en 1990
Autoría Niklaus Wirth, ETH de Zúrich
Familia ALGOL — descendiente directo de ALGOL W, también de Wirth
Paradigma Imperativo, procedimental y estructurado
Tipado Estático y fuerte, con subrangos y enumerados comprobados
Memoria Pila y montículo explícito (New / Dispose)
Ejecución Compilado a nativo; históricamente a P-code para portabilidad
Estado 🟡 El Pascal clásico es minoritario; su rama Object Pascal está muy viva

📜 Historia

Niklaus Wirth participó en el comité de ALGOL 68 y se marchó en desacuerdo: consideraba que el lenguaje se estaba volviendo demasiado grande y complejo para lo que aportaba. Su propuesta rechazada, ALGOL W, se convirtió en la semilla de lo que en 1970 publicó como Pascal, en honor a Blaise Pascal.

El objetivo era doble y explícito: enseñar programación estructurada y demostrar que un lenguaje podía ser potente siendo pequeño. Wirth dedicó su carrera a esa tesis y la resumió en una frase que sigue citándose: "hacer las cosas lo más simples posible, pero no más simples". Escribió también la Ley de Wirth —"el software se vuelve más lento más deprisa de lo que el hardware se vuelve más rápido"— que ha envejecido de forma incómodamente buena.

Pascal introdujo o consolidó cosas que hoy son evidentes y entonces no lo eran:

El truco de la portabilidad. El compilador de Zúrich no generaba código máquina: generaba P-code, un bytecode para una máquina virtual imaginaria. Para llevar Pascal a un ordenador nuevo bastaba con escribir un intérprete de P-code. UCSD Pascal llevó esa idea al mercado en los 70 y consiguió que el mismo software corriera en máquinas incompatibles. Es exactamente el modelo que Java popularizó veinte años después con la JVM y el bytecode.

En 1983 Borland lanzó Turbo Pascal: un compilador y un editor en un solo programa, que cabía en un disquete, compilaba en segundos y costaba 49,95 dólares cuando la competencia pedía cientos. Fue un fenómeno, y su descendiente directo es Delphi.

Wirth siguió adelante con Modula-2 (1978, con módulos de verdad) y Oberon (1986, aún más pequeño). Ninguno alcanzó la difusión de Pascal, pero Modula-2 influyó en el sistema de módulos de casi todo lo que vino después. Wirth murió en enero de 2024.

🏭 Dónde sobrevive hoy

🧠 Por qué no ha muerto

1. Su descendiente es un producto comercial vivo. El Pascal ISO puro es una pieza de museo, pero Object Pascal no. Ver Delphi.

2. Compila absurdamente rápido. El diseño del lenguaje —una sola pasada, declaraciones antes del uso, sin preprocesador— permite compiladores que procesan cientos de miles de líneas por segundo. Free Pascal y Delphi siguen siendo de los compiladores más rápidos que existen, y quien viene de esperar minutos con C++ o Rust lo nota de inmediato.

3. Es genuinamente bueno para enseñar. Fuerza a declarar antes de usar, distingue asignación de comparación, no permite conversiones silenciosas y su sintaxis se lee en voz alta. Los errores que un principiante comete en C —confundir = con ==, desbordar un array, olvidar un tipo— en Pascal son errores de compilación.

4. Free Pascal es un compilador serio. Multiplataforma real (Windows, Linux, macOS, Android, Raspberry Pi, incluso microcontroladores), compatible con la sintaxis de Delphi, libre y mantenido.

🔄 Lo que se ha modernizado

El Pascal ISO de 1983 sí está congelado. Free Pascal, que es donde vive el lenguaje, no:

⚙️ Cómo se ejecuta hoy

sudo apt-get install -y fpc

fpc -Mobjfpc total_venta.pas
echo "15000 2 0.10" | ./total_venta
# Total: 27000.00

Implementaciones: Free Pascal (FPC) es la libre y la más completa; Lazarus es su IDE con diseñador visual de formularios, clon libre del de Delphi. Delphi de Embarcadero es la comercial. GNU Pascal existe pero lleva años sin desarrollo activo.

Modos de compilación de FPC, que hay que conocer porque cambian el lenguaje: -Mfpc (dialecto propio), -Mobjfpc (Object Pascal con extensiones propias, el recomendado), -Mdelphi (compatibilidad con Delphi), -Miso (ISO 7185 estricto).

🧪 El programa de la clase 041 en Pascal

program TotalVenta;
{$MODE OBJFPC}{$H+}

var
  Precio, Cantidad, Descuento, Total: Double;

begin
  Read(Precio, Cantidad, Descuento);

  Total := Precio * Cantidad * (1 - Descuento);

  WriteLn('Total: ', Total:0:2);
end.

Recorrido, línea a línea.

Y ahora el Pascal que merece la pena ver, el de los tipos:

type
  TDia       = (Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo);
  TLaborable = Lunes..Viernes;              { subrango: un tipo con límites }
  TVenta = record
    Producto : string[40];
    Unidades : 1..9999;                     { el rango es parte del tipo }
    Importe  : Double;
  end;

var
  Hoy   : TDia;
  Venta : TVenta;
begin
  Hoy := Miercoles;
  { Hoy := Hoy + 1;   <-- no compila: un enumerado no es un entero }
  Hoy := Succ(Hoy);   { esta es la forma correcta }

  Venta.Unidades := 0;  { con {$R+} activo, esto es un error en ejecución }
end.

Un enumerado de Pascal no es un entero disfrazado: no se le puede sumar, y Succ/Pred son las operaciones legítimas. Un subrango 1..9999 es un tipo cuyo dominio comprueba el compilador cuando puede y el runtime cuando no (con {$R+}). Compara con enum de C, que sí es un entero y admite cualquier valor. Esa diferencia —el tipo como afirmación sobre los valores posibles, no solo sobre el tamaño en bytes— es la línea recta que va de Pascal a Ada, y de ahí a los tipos suma de Rust y a los tipos literales de TypeScript.

🔍 Qué reconocer si vienes de otro lenguaje

Si conoces… En Pascal es…
int x = 5; var x: Integer; … x := 5;
== =; y la asignación es :=
!= <>
&& / \|\| / ! and / or / not
{ ... } begin ... end
// comentario { comentario } o (* comentario *); FPC acepta //
struct record
enum type T = (A, B, C); — y no es un entero
typedef unsigned char type TNota = 1..7; — subrango comprobado
void f() / int f() procedure f; / function f: Integer;
return x Result := x; (Object Pascal) o NombreFuncion := x; (clásico)
malloc / free New(p) / Dispose(p)
printf("%.2f", x) Write(x:0:2)

⚠️ Errores comunes al leerlo

📚 Fuentes y bibliografía


⏮️ Volver al Atlas · 🧟 Los lenguajes que siguen vivos · 🔗 Relacionadas: Delphi / Object Pascal · Ada · C