Pascal es un lenguaje de programación poco utilizado por los profesionales españoles debido a su fama de lenguaje-que-sólo-sirve-para-aprender. Este sambenito le viene por haber sido utilizado durante décadas en las clases de Introducción a la Programación en universidades e institutos, clases donde apenas se profundiza en el lenguaje (puesto que es una “introducción”) y donde frecuentemente se utilizan compiladores anticuados como el obsoleto Turbo Pascal de Borland (un compilador para el extinto MS-DOS).
La realidad es que Object Pascal (nombre por el que se conoce la última definición del lenguaje definido por la ISO) es un lenguaje potente y versátil, tanto o más que cualquiera de sus competidores, y algunas de sus características son ideales tanto para los programadores profesionales como para los aficionados.
Por definición “Pascal es un lenguaje procedural, de alto nivel, estructurado y fuertemente tipado”. Esta es una definición muy técnica, así que voy a intentar explicarlo de forma más simple.
Pascal es un lenguaje para describir procesos. Es decir, que un programa en Pascal va explicando cómo se hacen las cosas paso a paso y de forma ordenada.
Que es de alto nivel significa que se parece al lenguaje humano. Cuanto más se parece un lenguaje de programación al humano más alto nivel tiene. En concreto el nivel de Pascal es tan alto que con poco esfuerzo pueden escribirse programas que, al leerlos, casi parecen textos escritos en inglés. Claro que no es un inglés perfecto, pero imaginemos el siguiente programa:
PROGRAM Greetings; VAR Name: STRING; BEGIN Write ('What is your name? '); ReadLn (Name); WriteLn ('Greetings, ', Name); END.
Cualquiera que sepa leer en inglés sabrá, más o menos, qué hace el programa, mientras que si tenemos el mismo programa en, por ejemplo, C++:
#include <iostream> #include <string> using namespace std; int main () { string Name; cout << “What is your name? “; cin >> Name; cout << endl << “Greetings, “ << Name << endl; }
Bueno, pues sí, es posible que se vea lo que hace, pero como que es más complicado.
Sigamos. Es un lenguaje estructurado porque en él se definen una serie de niveles. No es fácil explicarlo en poco espacio, pero baste con saber que permite agrupar elementos (funciones, datos, etc) en estructuras y niveles de forma que no estén mezclados. Existen varios niveles de estructuración, siendo una de estas estructuras las Clases y Objetos, que tan de moda están por la llamada Programación Orientada a Objetos.
Lo de que es fuertemente tipado significa que es muy estricto en lo referente a la conversión de datos. Creo que esto se verá mejor con un ejemplo. Imaginemos que tenemos un número de manzanas que hay que repartir entre dos personas. El programa para realizar tan complejo cálculo podría ser este:
PROGRAM Reparto; VAR Manzanas, Resultado: INTEGER; { “INTEGER” significa que es un número entero. } BEGIN Write ('Número de manzanas a repartir: '); ReadLN (Manzanas); Resultado := Manzanas / 2; { Repartimos entre dos personas. } WriteLn ('A cada uno le tocan ', Resultado, ' manzanas.'); END.
Si lo intentamos compilar, lo más seguro es que aparezca un mensaje de error. A mi me devuelve lo siguiente (utilizando el compilador Free Pascal):
reparto.pas(8,25) Error: Incompatible types: got "Extended" expected "SmallInt"
Es decir: “Tipos incompatibles: Se tiene “Extendido” y se esperaba “Entero corto””. La razón es sencilla: el compilador, al encontrar la división, deduce que el resultado puede ser fraccionario (por ejemplo, si tenemos tres manzanas a cada uno le tocaría una manzana y media), pero nosotros le hemos dicho que el Resultado es entero.
En otros lenguajes de programación, como C++, realizan lo que se denomina una conversión automática, en este caso redondeando automáticamente el resultado. ¿Por qué Pascal no lo hace? Creo que está claro.
Como he dicho, si intentamos repartir tres manzanas entre dos personas a cada uno le tocaría una manzana y media. Si redondeamos, entonces el programa devuelve “A cada uno le tocan 1 manzanas”. ¡Eso no es correcto, porque perdemos una manzana! Esto se soluciona fácilmente cambiando la línea que hay justo debajo de “VAR”:
VAR Manzanas: INTEGER; { “INTEGER” significa que es un número entero. } Resultado: REAL; { “REAL” significa que es un número real. }
Ahora sí que nos devuelve el resultado que esperamos. Si el programa lo hubiéramos escrito en C++, por ejemplo, el compilador no nos hubiera avisado del problema 1) y tal vez lo habríamos dejado pasar. Evidentemente este es un ejemplo muy sencillo, pero imaginaos los problemas que podrían aparecer si fuera algo tan complicado como los cálculos de un simulador de vuelo o de una rutina de inteligencia artificial: el compilador no indica error alguno pero los resultados no son correctos a pesar de que el programa está bien.
Evidentemente Pascal incluye funciones y herramientas para convertir un dato de un tipo a otro diferente si fuera necesario. Por ejemplo, si queremos redondear un número fraccionario podemos utilizar la función Trunc.
Como se ha visto, al ser un lenguaje de alto nivel es fácil de entender qué es lo que hace. Al ser estructurado permite tener las cosas ordenadas, lo que lo hace fácil de modificar y extender. Por último, al ser estricto con los tipos de datos, nos obliga a pensar detenidamente el cómo estamos manejando y procesando los datos, reduciendo el riesgo de cometer errores de cálculo.
Pero no todo son ventajas, así que para ser justos voy a decir algunas desventajas:
Al ser de alto nivel hay que escribir más que en otros lenguajes como los derivados de C (C++, Java,…). Del mismo modo los archivos fuente suelen ser más largos.
Al ser estricto con los tipos de datos, hay que dar muchas vueltas a la hora de hacer “ciertas cosas”, lo que puede resultar en programas más grandes y lentos.
Aparte de eso, creo que ya es cuestión de gustos, porque todo lo que se puede hacer en un lenguaje puede hacerse en otro, y Pascal no es una excepción.
A continuación tenéis una lista con recursos para que veáis qué herramientas pueden utilizarse para crear juegos de ordenador con Pascal.
* Free Pascal - Posiblemente el más famoso compilador libre del momento. Puede utilizarse en muchas plataformas diferentes y genera ejecutables para muchas más, incluyendo algunas videoconsolas. Incluye un entorno de desarrollo al estilo del legendario Turbo Pascal.
* Lazarus - Un entorno RAD similar a Delphi, solo que libre, que utiliza el compilador Free Pascal.
* GNU Pascal - El compilador Pascal del proyecto GNU.
Las siguientes bibliotecas están disponibles actualmente.
* JEDI-SDL - Envolvente que permite utilizar la popular biblioteca SDL tanto con Delphi como con Free Pascal.
* Allegro.pas - Envolvente que permite utilizar la biblioteca Allegro con Delphi (sólo la versión 4.2) y Free Pascal. Tal vez en el futuro funcione también con GNU Pascal.
* GLScene - Un conjunto de componentes que permiten crear juegos 3D aplicando la idea ”arrastrar y soltar”, utilizando OpenGL como base. Funciona tanto con Delphi como con Lazarus.
* DelphiX2) - Un conjunto de componentes que permiten crear juegos 3D aplicando la idea ”arrastrar y soltar”, utilizando DirectX como base que funciona únicamente con Delphi, por lo que está limitado a sistemas Windows.
Hay más bibliotecas a lo largo y ancho de Internet, pero creo que esta es una buena selección.
* Quake 2 Delphi - Una conversión del del juego Quake 2 para compilar con Delphi.
* LEAF - Un sencillo motor que facilita la creación de juegos 2D y 3D, tanto con Delphi como Free Pascal. La versión publicada es algo vieja, pero el autor me ha confirmado que están trabajando en una más moderna y mejor documentada.
Además del propio foro de GAS, también tenéis los siguientes sitios web y foros que pueden ser de vuestro interés: