Pascal (lenguaje de programación)
Pascal es un lenguaje de programación imperativo y procedimental, diseñado por Niklaus Wirth como un lenguaje pequeño y eficiente destinado a fomentar las buenas prácticas de programación utilizando programación estructurada y estructuración de datos. Recibe su nombre en honor al matemático, filósofo y físico francés Blaise Pascal.
Pascal fue desarrollado sobre el patrón del lenguaje ALGOL 60. Wirth participó en el proceso para mejorar el lenguaje como parte de los esfuerzos de ALGOL X y propuso una versión llamada ALGOL W. Esto no fue aceptado y el proceso de ALGOL X se atascó. En 1968, Wirth decidió abandonar el proceso ALGOL X y mejorar aún más ALGOL W, y lo lanzó como Pascal en 1970.
Además de los escalares y matrices de ALGOL, Pascal permite definir tipos de datos complejos y crear estructuras de datos dinámicas y recursivas, como listas, árboles y gráficos. Pascal tiene tipificación fuerte en todos los objetos, lo que significa que un tipo de datos no se puede convertir o interpretar como otro sin conversiones explícitas. A diferencia de C (y la mayoría de los lenguajes de la familia C), Pascal permite definiciones de procedimientos anidados a cualquier nivel de profundidad, y también permite la mayoría de tipos de definiciones y declaraciones dentro de subrutinas (procedimientos y funciones). Por lo tanto, un programa es sintácticamente similar a un solo procedimiento o función. Esto es similar a la estructura de bloques de ALGOL 60, pero restringida de declaraciones de bloque arbitrarias a solo procedimientos y funciones.
Pascal tuvo mucho éxito en la década de 1970, especialmente en el floreciente mercado de las minicomputadoras. Los compiladores también estaban disponibles para muchas microcomputadoras cuando el campo surgió a fines de la década de 1970. Fue ampliamente utilizado como lenguaje de enseñanza en cursos de programación de nivel universitario en la década de 1980, y también se utilizó en entornos de producción para escribir software comercial durante el mismo período. Fue desplazado por el lenguaje de programación C a fines de la década de 1980 y principios de la de 1990 cuando los sistemas basados en UNIX se hicieron populares, y especialmente con el lanzamiento de C++.
En 1985 se desarrolló un derivado llamado Object Pascal diseñado para la programación orientada a objetos. Apple Computer (para las máquinas Lisa y MacIntosh) y Borland lo utilizaron a fines de la década de 1980 y luego se desarrolló en Delphi en la plataforma Microsoft Windows. Las extensiones a los conceptos de Pascal llevaron a los lenguajes Modula-2 y Oberon.
Historia
Esfuerzos anteriores
Gran parte de la historia del diseño de lenguajes informáticos durante la década de 1960 se remonta al lenguaje ALGOL 60. ALGOL fue desarrollado durante la década de 1950 con el objetivo explícito de poder describir algoritmos claramente. Incluía una serie de características para la programación estructurada que siguen siendo comunes en los lenguajes hasta el día de hoy.
Poco después de su presentación, en 1962, Wirth comenzó a trabajar en su disertación con Helmut Weber sobre el lenguaje de programación Euler. Euler se basó en la sintaxis de ALGOL y muchos conceptos, pero no fue un derivado. Su objetivo principal era agregar listas y tipos dinámicos, lo que permitía su uso en roles similares a Lisp. El lenguaje fue publicado en 1965.
Para entonces, se habían identificado una serie de problemas en ALGOL, en particular, la falta de un sistema de cadenas estandarizado. El grupo encargado de mantener el lenguaje había comenzado el proceso ALGOL X para identificar mejoras, solicitando presentaciones. Wirth y Tony Hoare presentaron un conjunto conservador de modificaciones para agregar cadenas y limpiar parte de la sintaxis. Estos se consideraron demasiado menores para que valiera la pena usarlos como el nuevo ALGOL estándar, por lo que Wirth escribió un compilador para el lenguaje, que pasó a llamarse ALGOL W.
Los esfuerzos de ALGOL X pasarían a elegir un lenguaje mucho más complejo, ALGOL 68. La complejidad de este lenguaje generaba una dificultad considerable para producir compiladores de alto rendimiento y no se usaba mucho en la industria. Esto dejó una apertura para nuevos idiomas.
Pascal
Pascal fue influenciado por los esfuerzos de ALGOL W, con los objetivos explícitos de enseñar programación de manera estructurada y para el desarrollo de software de sistema. Una generación de estudiantes usó Pascal como lenguaje introductorio en cursos de pregrado.
Uno de los primeros éxitos del lenguaje fue la introducción de UCSD Pascal, una versión que se ejecutaba en un sistema operativo personalizado que podía trasladarse a diferentes plataformas. Una plataforma clave fue Apple II, donde tuvo un uso generalizado como Apple Pascal. Esto llevó a que Pascal se convirtiera en el principal lenguaje de alto nivel utilizado para el desarrollo en Apple Lisa y, más tarde, en Macintosh. Partes del sistema operativo Macintosh original se tradujeron a mano al lenguaje ensamblador Motorola 68000 a partir del código fuente de Pascal.
El sistema de composición tipográfica TeX de Donald E. Knuth se escribió en WEB, el sistema de programación literario original, basado en DEC PDP-10 Pascal. Aplicaciones comerciales exitosas como Adobe Photoshop se escribieron en Macintosh Programmer's Workshop Pascal, mientras que aplicaciones como Total Commander, Skype y Macromedia Captivate se escribieron en Delphi (Object Pascal). Apollo Computer utilizó Pascal como lenguaje de programación de sistemas para sus sistemas operativos a partir de 1980.
También se han utilizado variantes de Pascal para todo, desde proyectos de investigación hasta juegos de PC y sistemas integrados. Existen compiladores de Pascal más nuevos que se usan ampliamente.
Objeto Pascual
Durante el trabajo en Lisa, Larry Tesler comenzó a mantener correspondencia con Wirth sobre la idea de agregar extensiones orientadas a objetos al lenguaje. Esto condujo inicialmente a Clascal, presentado en 1983. A medida que el programa Lisa se desvaneció y fue reemplazado por Macintosh, se creó una versión adicional y se llamó Object Pascal. Esto se introdujo en la Mac en 1985 como parte del marco de la aplicación MacApp y se convirtió en el principal lenguaje de desarrollo de Apple a principios de la década de 1990.
Las extensiones de Object Pascal se agregaron a Turbo Pascal con el lanzamiento de la versión 5.5 en 1989. A lo largo de los años, Object Pascal se convirtió en la base del sistema Delphi para Microsoft Windows, que todavía se usa para desarrollar aplicaciones de Windows y puede cruzar -compilar código a otros sistemas. Free Pascal es una alternativa multiplataforma de código abierto con su propio IDE gráfico llamado Lazarus.
Implementaciones
Primeros compiladores de Pascal
El primer compilador Pascal se diseñó en Zúrich para la familia de computadoras centrales de la serie CDC 6000. Niklaus Wirth informa que un primer intento de implementarlo en FORTRAN 66 en 1969 no tuvo éxito debido a la insuficiencia de FORTRAN 66 para expresar estructuras de datos complejas. El segundo intento se implementó en un lenguaje similar a C (Scallop de Max Engeli) y luego se tradujo a mano (por R. Schild) al propio Pascal para el arranque. Estuvo operativo a mediados de 1970. Muchos compiladores de Pascal desde entonces han sido igualmente autohospedados, es decir, el compilador está escrito en Pascal, y el compilador generalmente es capaz de recompilarse a sí mismo cuando se agregan nuevas funciones al lenguaje, o cuando el compilador debe ser portado a un nuevo ambiente. El compilador GNU Pascal es una excepción notable, ya que está escrito en C.
El primer puerto exitoso del compilador CDC Pascal a otro mainframe lo completaron Welsh y Quinn en la Queen's University of Belfast (QUB) en 1972. El objetivo era la serie 1900 de International Computers Limited (ICL). Este compilador, a su vez, fue el padre del compilador Pascal para la minicomputadora Multum de Information Computer Systems (ICS). El puerto Multum fue desarrollado, con miras a utilizar Pascal como lenguaje de programación de sistemas, por Findlay, Cupples, Cavouras y Davis, que trabajaban en el Departamento de Ciencias de la Computación de la Universidad de Glasgow. Se cree que Multum Pascal, que se completó en el verano de 1973, pudo haber sido la primera implementación de 16 bits.
Welsh et al. completaron un compilador completamente nuevo. en QUB en 1977. Ofrecía una función de diagnóstico del idioma de origen (que incorporaba creación de perfiles, rastreo y volcados post mórtem formateados con reconocimiento de tipo) que fue implementada por Findlay y Watt en la Universidad de Glasgow. Esta implementación fue portada en 1980 a la serie ICL 2900 por un equipo con sede en la Universidad de Southampton y la Universidad de Glasgow. La implementación del modelo Pascal estándar también se basó en este compilador, que fue adaptado por Welsh y Hay en la Universidad de Manchester en 1984 para verificar rigurosamente la conformidad con el estándar BSI 6192/ISO 7185 y generar código para una máquina abstracta portátil.
El primer compilador Pascal escrito en América del Norte se construyó en la Universidad de Illinois bajo la dirección de Donald B. Gillies para el PDP-11 y generó código de máquina nativo.
El sistema Pascal-P
Para propagar el lenguaje rápidamente, se creó un kit de portabilidad de compilador en Zürich que incluía un compilador que generaba el llamado código p para una máquina de pila virtual, es decir, código que se presta a una interpretación razonablemente eficiente, junto con un intérprete para ese código: el sistema Pascal-P. Los compiladores del sistema P se denominaron Pascal-P1, Pascal-P2, Pascal-P3 y Pascal-P4. Pascal-P1 fue la primera versión y Pascal-P4 fue la última en venir de Zürich. La versión denominada Pascal-P1 se acuñó después del hecho de las muchas fuentes diferentes de Pascal-P que existían. El compilador se rediseñó para mejorar la portabilidad y se emitió como Pascal-P2. Este código se mejoró más tarde para convertirse en Pascal-P3, con un código intermedio compatible con versiones anteriores de Pascal-P2 y Pascal-P4, que no era compatible con versiones anteriores.
El compilador-intérprete de Pascal-P4 aún se puede ejecutar y compilar en sistemas compatibles con el Pascal original. Sin embargo, solo acepta un subconjunto del lenguaje Pascal.
Pascal-P5, creado fuera del grupo Zürich, acepta el lenguaje Pascal completo e incluye compatibilidad con ISO 7185.
UCSD Pascal se bifurcó de Pascal-P2, donde Kenneth Bowles lo usó para crear el p-System interpretativo de UCSD. Era uno de los tres sistemas operativos disponibles en el lanzamiento de la computadora personal IBM original. UCSD Pascal usó un código intermedio basado en valores de bytes y, por lo tanto, fue uno de los primeros compiladores de códigos de bytes. Apple Pascal se lanzó en 1979 para los sistemas informáticos Apple 2 y Apple 3. Fue una implementación de UCSD Pascal, o se basó en gran medida en él. Pascal-P1 a Pascal-P4 no lo fue, sino que se basó en la longitud de palabra de 60 bits de CDC 6600.
La Comisión de Energía Atómica de Australia lanzó un compilador basado en el compilador Pascal-P5, que creaba archivos de objetos binarios nativos, para la computadora central IBM System/370; fue nombrado AAEC Pascal 8000 Compiler por la abreviatura del nombre de la comisión.
Objeto Pascal y Turbo Pascal
Apple Computer creó su propio Lisa Pascal para Lisa Workshop en 1982 y transfirió el compilador a Apple Macintosh y MPW en 1985. En 1985, Larry Tesler, en consulta con Niklaus Wirth, definió Object Pascal y estas extensiones se incorporaron en los compiladores Lisa Pascal y Mac Pascal.
En la década de 1980, Anders Hejlsberg escribió el compilador Blue Label Pascal para Nascom-2. Se comercializó una reimplementación de este compilador para IBM PC con los nombres Compas Pascal y PolyPascal antes de que Borland lo adquiriera y lo rebautizara como Turbo Pascal.
Turbo Pascal se hizo muy popular gracias a una estrategia de precios agresiva, al tener uno de los primeros IDE de pantalla completa y un tiempo de respuesta muy rápido (solo unos segundos para compilar, vincular y ejecutar). Fue escrito y altamente optimizado completamente en lenguaje ensamblador, haciéndolo más pequeño y más rápido que gran parte de la competencia.
En 1986, Anders transfirió Turbo Pascal a Macintosh e incorporó las extensiones de Object Pascal de Apple en Turbo Pascal. Luego, estas extensiones se agregaron nuevamente a la versión para PC de Turbo Pascal para la versión 5.5. Al mismo tiempo, Microsoft también implementó el compilador Object Pascal. Turbo Pascal 5.5 tuvo una gran influencia en la comunidad de Pascal, que comenzó a concentrarse principalmente en la PC de IBM a fines de la década de 1980. Muchos aficionados a la PC en busca de un reemplazo estructurado para BASIC utilizaron este producto. También comenzó a ser adoptado por desarrolladores profesionales. Casi al mismo tiempo, se importaron varios conceptos de C para permitir que los programadores de Pascal usaran directamente la interfaz de programación de aplicaciones (API) basada en C de Microsoft Windows. Estas extensiones incluían cadenas terminadas en nulo, aritmética de punteros, punteros de función, un operador de dirección y encasillamientos inseguros.
Turbo Pascal y otros derivados con estructuras unidad o módulo son lenguajes de programación modulares. Sin embargo, no proporciona un concepto de módulo anidado o importación y exportación calificada de símbolos específicos.
Otras variantes
Super Pascal es una variante que agregó etiquetas no numéricas, una declaración de retorno y expresiones como nombres de tipos.
TMT Pascal fue el primer compilador compatible con Borland para el modo protegido DOS de 32 bits, OS/2 y sistemas operativos Win32. El lenguaje TMT Pascal fue el primero en permitir la sobrecarga de funciones y operadores.
Las universidades de Wisconsin-Madison, Zürich, Karlsruhe y Wuppertal desarrollaron Pascal-SC y Pascal-XSC (Extensiones para Computación Científica) compiladores, destinados a programar cálculos numéricos. El desarrollo de Pascal-SC comenzó en 1978 y admitió el nivel 0 de ISO 7185 Pascal, pero se agregó compatibilidad con el nivel 2 en una etapa posterior. Pascal-SC originalmente tenía como objetivo el procesador Z80, pero luego se reescribió para DOS (x86) y 68000. Pascal-XSC se ha portado en varias ocasiones a Unix (Linux, SunOS, HP-UX, AIX) y Microsoft/IBM (DOS con EMX, OS/2, Windows) sistemas operativos. Funciona generando un código fuente C intermedio que luego se compila en un ejecutable nativo. Algunas de las extensiones del lenguaje Pascal-SC han sido adoptadas por GNU Pascal.
Pascal Sol fue diseñado alrededor de 1983 por un equipo francés para implementar un sistema similar a Unix llamado Sol. Era el nivel 1 de Pascal estándar (con límites de matriz parametrizados), pero la definición permitía palabras clave alternativas e identificadores predefinidos en francés y el idioma incluía algunas extensiones para facilitar la programación del sistema (por ejemplo, un equivalente a lseek). Más tarde, el equipo de Sol pasó al proyecto ChorusOS para diseñar un sistema operativo distribuido.
IP Pascal fue una implementación del lenguaje de programación Pascal utilizando Micropolis DOS, pero se movió rápidamente a CP/M-80 ejecutándose en el Z80. Se movió a los tipos de máquinas 80386 en 1994 y existe hoy como implementaciones de Windows/XP y Linux. En 2008, el sistema se elevó a un nuevo nivel y el lenguaje resultante se denominó "Pascaline" (después de la calculadora de Pascal). Incluye objetos, controles de espacio de nombres, arreglos dinámicos y muchas otras extensiones, y generalmente presenta la misma funcionalidad y protección de tipos que C#. Es la única implementación de este tipo que también es compatible con la implementación original de Pascal, que está estandarizada como ISO 7185.
Construcciones del lenguaje
Pascal, en su forma original, es un lenguaje puramente procedimental e incluye la matriz tradicional de estructuras de control similares a ALGOL con palabras reservadas como if
, then
, else
, while
, for
, y case
, oscilando en una sola declaración o un begin
-end
. Pascal también tiene construcciones de estructuración de datos no incluidas en los tipos originales de ALGOL 60, como registros, variantes, punteros, enumeraciones y conjuntos y punteros de procedimiento. Tales construcciones fueron en parte heredadas o inspiradas en Simula 67, ALGOL 68, el propio ALGOL W de Niklaus Wirth y sugerencias de C. A. R. Hoare.
Los programas Pascal comienzan con la palabra clave program
con una lista de descriptores de archivos externos como parámetros (no requeridos en Turbo Pascal, etc.); luego sigue el bloque principal entre corchetes por las palabras clave begin
y end
. Los puntos y comas separan las instrucciones y el punto final (es decir, un punto) finaliza todo el programa (o unidad). Las mayúsculas y minúsculas se ignoran en la fuente Pascal.
Este es un ejemplo del código fuente en uso para un mensaje muy simple de "¡Hola, mundo!" programa:
programa HolaWorld()Producto);comenzar Escriba()¡Hola, Mundo! ') {No ";" se requiere después de la última declaración de un bloque - añadir una añade una "null statement" al programa, que es ignorada por el compilador. }final.
Tipos de datos
Una declaración de tipo en Pascal se usa para definir un rango de valores que una variable de ese tipo es capaz de almacenar. También define un conjunto de operaciones que se pueden realizar en variables de ese tipo. Los tipos predefinidos son:
Tipo de datos | Tipo de valores que la variable es capaz de almacenar |
---|---|
entero | números enteros |
real | números de punto flotante |
boolean | los valores Verdaderos o Falsos |
char | un único personaje de un conjunto de caracteres ordenado |
set | equivalente a una serie de valores booleanos |
array | un grupo contable de cualquiera de los tipos o registros de datos anteriores |
récord | A collection of any of the preceding data types |
cuerda | una secuencia o "estring" de caracteres se declara como un " array lleno de char" con un índice inicial de 1. Estos pueden ser asignados constantes de cadena y los caracteres individuales se pueden acceder como elementos del array. |
El rango de valores permitidos para los tipos básicos (excepto booleanos) está definido por la implementación. Se proporcionan funciones para algunas conversiones de datos. Para la conversión de real
a integer
, están disponibles las siguientes funciones: round
(que redondea a entero usando el redondeo bancario) y trunc
(redondea hacia cero).
El programador tiene la libertad de definir otros tipos de datos de uso común (por ejemplo, byte, cadena, etc.) en términos de los tipos predefinidos utilizando la función de declaración de tipos de Pascal, por ejemplo
Tipo byte = 0..255; sign_byte = -128..127; cuerda = empaquetado array[1..255] de char;
Los tipos de uso frecuente, como byte y cadena, ya están definidos en muchas implementaciones.
Normalmente, el sistema utilizará una palabra para almacenar los datos. Por ejemplo, el tipo byte
puede almacenarse en un entero de la máquina - quizás 32 bits - en lugar de un valor de 8 bits. Pascal no contiene elementos de lenguaje que permitan definir los tipos básicos de almacenamiento de forma más granular. Esta capacidad se incluyó en una serie de extensiones de Pascal y lenguajes posteriores, mientras que otros, como Modula-2, ampliaron el conjunto integrado para cubrir la mayoría de los tipos de datos de máquina, como los enteros de 16 bits.
La palabra clave packed
le dice al compilador que use el método más eficiente de almacenamiento para los tipos de datos estructurados: conjuntos, matrices y registros, en lugar de usar una palabra para cada elemento. El empaquetado puede ralentizar el acceso en máquinas que no ofrecen fácil acceso a partes de una palabra.
Tipos de subrango
También se pueden hacer subrangos de cualquier tipo de dato ordinal (cualquier tipo simple excepto real):
Var x : 1..10; Sí. : 'a'..'z ';
Tipos de conjuntos
A diferencia de otros lenguajes de programación de su época, Pascal admite un tipo de conjunto:
Var Set1 : set de 1..10; Set2 : set de 'a'..'z ';
Un conjunto es un concepto fundamental para las matemáticas modernas y puede usarse en muchos algoritmos. Tal función es útil y puede ser más rápida que una construcción equivalente en un lenguaje que no admita conjuntos. Por ejemplo, para muchos compiladores de Pascal:
si i dentro [5..10] entonces ...
se ejecuta más rápido que:
si ()i ■ 4) y ()i . 11) entonces ...
Los conjuntos de valores no contiguos pueden ser especialmente útiles, tanto en términos de rendimiento como de legibilidad:
si i dentro [0..3, 7, 9, 12..15] entonces ...
Para estos ejemplos, que implican conjuntos sobre dominios pequeños, el rendimiento mejorado generalmente lo logra el compilador que representa las variables de conjunto como vectores de bits. Los operadores de conjunto se pueden implementar de manera eficiente como operaciones de código de máquina bit a bit.
Tipos de unión
En Pascal hay dos formas de crear sindicatos. Una es la forma estándar a través de un registro de variantes. El segundo es un medio no estándar de declarar una variable como absoluta, lo que significa que se coloca en la misma ubicación de memoria como otra variable o en una dirección absoluta. Mientras que todos los compiladores Pascal soportan registros de variantes, sólo algunas soportan variables absolutas.
A los efectos de este ejemplo, todos los tipos enteros son: un byte es de 8 bits, una palabra es de 16 bits, y un entero es de 32 bits.
El siguiente ejemplo muestra la forma absoluta no estándar:
VAR A: Integer; B: Array[1..4] de Byte absoluto A; C: Integer absoluto 0;
En el primer ejemplo, cada uno de los elementos de la matriz B mapas a uno de los bytes específicos de la variable A. En el segundo ejemplo, la variable C se asigna a la dirección exacta de la máquina 0.
En el siguiente ejemplo, un registro tiene variantes, algunas de las cuales comparten la misma ubicación que otras:
TYPE Forma = ()Circle, Plaza, Triángulo); Dimensiones = récord Caso Gráfico: Forma de Circle: ()Diámetro: real); Plaza: ()Width: real); Triángulo: ()Lado: real; Angle1, Angle2: 0..360) final;
Declaraciones de tipos
Los tipos se pueden definir a partir de otros tipos usando declaraciones de tipo:
Tipo x = entero; Sí. = x;...
Además, los tipos complejos se pueden construir a partir de tipos simples:
Tipo a = array[1..10] de entero; b = récord x : entero; Sí. : char {extra semicolon not strictly required} final; c = archivo de a;
Tipo de archivo
Como se muestra en el ejemplo anterior, los archivos Pascal son secuencias de componentes. Cada archivo tiene una variable de búfer que se denota por f^. Los procedimientos get (para leer) y put (para escribir) mueven la variable del búfer al siguiente elemento. Read se introduce de manera que read(f, x) es lo mismo que x:= f^; obtener(f);. Write se introduce de manera que write(f, x) es lo mismo que f^:= x; put(f); El tipo texto
está predefinido como archivo de char. Si bien la variable de búfer podría usarse para inspeccionar el siguiente carácter que se usará (comprobar un dígito antes de leer un número entero), esto genera serios problemas con los programas interactivos en las primeras implementaciones, pero se resolvió más tarde con el "lazy I /O" concepto.
En Jensen & Con Pascal, las cadenas se representan como matrices empaquetadas de caracteres; por lo tanto, tienen una longitud fija y suelen estar acolchados.
Tipos de puntero
Pascal admite el uso de punteros:
Tipo pNode = ^Node; Node = récord a : entero; b : char; c : pNode final;Var NodePtr : pNode; IntPtr : ^entero;
Aquí la variable NodePtr es un puntero al tipo de datos Node, un registro. Los punteros se pueden utilizar antes de que se declaren. Esta es una declaración directa, una excepción a la regla de que las cosas deben declararse antes de usarse.
Para crear un nuevo registro y asignar el valor 10 y el carácter A a los campos a y b en el registro, y para inicializar el puntero c al puntero nulo ("NIL" en Pascal), las sentencias serían:
Nuevo()NodePtr);...NodePtr^.a := 10;NodePtr^.b := 'A ';NodePtr^.c := NIL;...
Esto también se puede hacer usando la declaración with
, de la siguiente manera:
Nuevo()NodePtr);...con NodePtr^ docomenzar a := 10; b := 'A '; c := NILfinal;...
Dentro del alcance de la declaración with, a y b se refieren a los subcampos del puntero de registro NodePtr y no al Nodo de registro o al tipo de puntero pNode.
Se pueden crear listas, pilas y colas vinculadas al incluir un campo de tipo puntero (c) en el registro.
A diferencia de muchos lenguajes que cuentan con punteros, Pascal solo permite que los punteros hagan referencia a variables creadas dinámicamente que son anónimas y no les permite hacer referencia a variables estáticas o locales estándar. Los punteros también deben tener un tipo asociado, y un puntero a un tipo no es compatible con un puntero a otro tipo (por ejemplo, un puntero a un carácter no es compatible con un puntero a un número entero). Esto ayuda a eliminar los problemas de seguridad de tipos inherentes a otras implementaciones de punteros, en particular las que se usan para PL/I o C. También elimina algunos riesgos causados por punteros colgantes, pero la capacidad de desasignar dinámicamente el espacio referenciado mediante el uso de dispose (que tiene el mismo efecto que la función de biblioteca gratuita que se encuentra en C) significa que el riesgo de punteros colgantes no se ha eliminado como en lenguajes como Java y C#, que proporcionan recolección de basura (pero que no eliminan el problema relacionado de pérdidas de memoria).
Algunas de estas restricciones se pueden eliminar en dialectos más nuevos.
Estructuras de control
Pascal es un lenguaje de programación estructurado, lo que significa que el flujo de control está estructurado en declaraciones estándar, generalmente sin 'goto' comandos
mientras a ■ b do WriteLn()Esperando ');si a ■ b entonces WriteLn()'Condition met ') No se admite nada antes de lo contrario. más WriteLn()'Condition not met ');para i := 1 a 10 do No semicolon aquí como se desprendería de la siguiente declaración WriteLn()' Iteración: ', i);repetición a := a + 1hasta a = 10;Caso i de 0 : Escriba()'cero '); 1 : Escriba()'uno '); 2 : Escriba()'dos '); 3,4,5,6,7,8,9,10: Escriba()'? ')final;
Procedimientos y funciones
Pascal estructura los programas en procedimientos y funciones. Generalmente, un procedimiento se usa por sus efectos secundarios, mientras que una función se usa por su valor de retorno.
programa Impresión;Var i : entero;procedimiento PrintAnInteger()j : entero);comenzar ...final;función triple()const x: entero): entero;comenzartriple := x * 3final;comenzar { programa principal } ... PrintAnInteger()i); PrintAnInteger()triple()i)final.
Los procedimientos y funciones se pueden anidar a cualquier profundidad, y el 'programa' construct es el bloque lógico más externo.
De forma predeterminada, los parámetros se pasan por valor. Si 'var' precede al nombre de un parámetro, se pasa por referencia.
Cada procedimiento o función puede tener sus propias declaraciones de etiquetas goto, constantes, tipos, variables y otros procedimientos y funciones, que deben estar todos en ese orden. Este requisito de pedido originalmente estaba destinado a permitir una compilación eficiente de un solo paso. Sin embargo, en algunos dialectos (como Delphi) se ha relajado el estricto requisito de ordenación de las secciones de declaración.
Punto y coma como separadores de declaraciones
Pascal adoptó muchas funciones de sintaxis del lenguaje ALGOL, incluido el uso de un punto y coma como separador de declaraciones. Esto contrasta con otros lenguajes, como PL/I y C, que utilizan el punto y coma como terminador de declaraciones. No se necesita punto y coma antes de la palabra clave end
de una declaración de tipo de registro, un bloque o una declaración case; antes de la palabra clave until
de una declaración de repetición; y antes de la palabra clave else
de una instrucción if.
La presencia de un punto y coma adicional no estaba permitida en las primeras versiones de Pascal. Sin embargo, la adición de declaraciones vacías similares a ALGOL en el Informe revisado de 1973 y los cambios posteriores al lenguaje en ISO 7185:1983 ahora permiten puntos y comas opcionales en la mayoría de estos casos. Todavía no se permite un punto y coma inmediatamente antes de la palabra clave else
en una declaración if, porque else
sigue una sola declaración, no una secuencia de declaraciones. En el caso de ifs anidados, no se puede usar un punto y coma para evitar el problema de else colgante (donde el if interno no tiene un else, pero el if externo sí) terminando supuestamente el if anidado con un punto y coma; en cambio, esto termina ambos if cláusulas. En su lugar, se debe utilizar un bloque begin
...end
explícito.
Recursos
Compiladores e intérpretes
Varios compiladores e intérpretes de Pascal están disponibles para uso general:
- Delphi es el producto de desarrollo de aplicaciones rápidas insignia de Embarcadero (antes Borland/CodeGear). Utiliza el lenguaje Pascal Object (termed 'Delphi' de Borland), descendido de Pascal, para crear aplicaciones para Windows, macOS, iOS y Android. El soporte de NET que existía de D8 a D2005, D2006 y D2007 ha sido terminado, y reemplazado por un nuevo idioma (Prism, que es Oxygene remarcado, ver abajo) que no es totalmente compatible con el retroceso. En los últimos años se agregaron soporte Unicode y genéricos (D2009, D2010, Delphi XE).
- Free Pascal es un compilador multiplataforma escrito en Object Pascal (y es autoanfitrión). Su objetivo es proporcionar un compilador conveniente y potente, capaz de compilar aplicaciones heredadas y ser los medios para desarrollar nuevas. Se distribuye bajo la Licencia Pública General de GNU (GNU GPL), mientras que los paquetes y la biblioteca de tiempo de ejecución vienen bajo una Licencia Pública General de GNU modificada (GNU LGPL). Además de los modos de compatibilidad para Turbo Pascal, Delphi y Mac Pascal, tiene sus propios modos de sintaxis de procedimiento y orientados a objetos con soporte para funciones extendidas como la sobrecarga del operador. Soporta muchas plataformas y sistemas operativos. Las versiones actuales también cuentan con un modo ISO.
- Turbo51 es un compilador Pascal gratuito para la familia Intel 8051 de microcontroladores, con sintaxis Turbo Pascal 7.
- Oxygene (anteriormente llamado Chrome) es un compilador de Objeto Pascal para el. Plataformas NET y Mono. Fue creado y vendido por RemObjects Software, y vendido por un tiempo por Embarcadero como el compilador de backend de Prism.
- Kylix era descendiente de Delphi, con soporte para el sistema operativo Linux y una biblioteca de objetos mejorada. Ya no es compatible. Compiler and IDE are available now for non-commercial use.
- GNU Pascal Compiler (GPC) es el compilador Pascal de GNU Compiler Collection (GCC). El compilador está escrito en C, la biblioteca de tiempo de ejecución principalmente en Pascal. Distribuido bajo la Licencia Pública General de GNU, funciona en muchas plataformas y sistemas operativos. Soporta los idiomas estándar ANSI/ISO y tiene soporte de dialecto pascal parcial. Una de las omisiones más dolorosas es la ausencia de un tipo 100% Turbo Pascal-compatible (corte)string. El soporte para Borland Delphi y otras variantes de idiomas es bastante limitado. Sin embargo, hay apoyo para Mac-pascal.
- Virtual Pascal fue creado por Vitaly Miryanov en 1995 como un compilador nativo OS/2 compatible con la sintaxis Borland Pascal. Entonces, se había desarrollado comercialmente por fPrint, añadiendo soporte Win32, y en 2000 se convirtió en freeware. Hoy puede compilar para Win32, OS/2 y Linux, y es en su mayoría compatible con Borland Pascal y Delphi. El desarrollo fue cancelado el 4 de abril de 2005.
- P4 compilador, la base para muchos posteriores compiladores Pascal-implemented-in-Pascal. Implementa un subconjunto de Pascal completo.
- El compilador P5 es una adaptación ISO 7185 (full Pascal) de P4.
- Smart Mobile Studio es un compilador Pascal a HTML5/Javascript
- Turbo Pascal fue el compilador Pascal dominante para PCs durante los años 80 y principios de los noventa, popular tanto por sus potentes extensiones como por los tiempos de compilación extremadamente cortos. Turbo Pascal fue escrito compactamente y pudo compilar, ejecutar y depurar todo de memoria sin acceder al disco. Las unidades de disquete lento eran comunes para los programadores en ese momento, aumentando aún más la ventaja de velocidad de Turbo Pascal. Actualmente, las versiones anteriores de Turbo Pascal (hasta 5.5) están disponibles para su descarga gratuita desde el sitio de Borland.
- IP Pascal implementa el lenguaje "Pascaline" (nombrado después de la calculadora de Pascal), que es un Pascal muy extendido compatible con Pascal original según ISO 7185. Cuenta con módulos con control de espacio de nombres, incluyendo módulos de tareas paralelos con semafores, objetos, arrays dinámicos de cualquier dimensión que se asignan en tiempo de ejecución, sobrecargas, sobresueldos y muchas otras extensiones. IP Pascal tiene una biblioteca de portabilidad incorporada que se adapta a medida al lenguaje Pascal. Por ejemplo, una aplicación de salida de texto estándar del Pascal original de 1970 se puede recompilar para trabajar en una ventana e incluso tener construcciones gráficas añadidos.
- Pascal-XT fue creado por Siemens para sus sistemas operativos mainframe BS2000 y SINIX.
- PocketStudio es un compilador de subconjuntos Pascal y herramienta RAD para procesadores Palm OS y MC68xxx con algunas de sus propias extensiones para ayudar a interfacing con la API de Palm OS. Se parece a Delphi y Lázaro con un diseñador de formularios visuales, un inspector de objetos y un editor de código fuente.
- MIDletPascal – A Pascal compiler and IDE that generates small and fast Java bytecode specifically designed to create software for mobiles.
- Vector Pascal es un lenguaje para conjuntos de instrucciones SIMD como el MMX y el AMD 3d Now, apoyando a todos los procesadores Intel y AMD, y el motor de emoción de PlayStation 2 de Sony.
- Morfik Pascal permite el desarrollo de aplicaciones Web completamente escritas en Object Pascal (tanto el servidor como el lado del navegador).
- WDSibyl – Desarrollo visual Medio ambiente y compilador Pascal para Win32 y OS/2.
- PP Compiler, un compilador para Palm OS que funciona directamente en el ordenador portátil.
- CDC 6000 El compilador Pascal es el código fuente del primer (CDC 6000) compilador Pascal.
- Pascal-S
- AmigaPascal es un compilador Pascal gratuito para el ordenador Amiga.
- VSI Pascal para OpenVMS (antes HP Pascal para OpenVMS, Compaq Pascal, DEC Pascal, VAX Pascal y originalmente VAX-11 Pascal) es un compilador Pascal que funciona en sistemas OpenVMS. También fue apoyado bajo Tru64. VSI Pascal para OpenVMS es compatible con ISO/IEC 7185:1990 Pascal también algunos de ISO/IEC 10206:1990 Extended Pascal, y también incluye sus propias extensiones. El frontend compilador se implementa en BLISS.
- Stony Brook Pascal+ fue un compilador optimizador de 16 bits (más de 32 bits) para DOS y OS/2, comercializado como reemplazo directo para Turbo Pascal, pero produciendo código que ejecutó al menos dos veces más rápido.
IDE
- Dev-Pascal es un IDE pascal que fue diseñado en Borland Delphi y que soporta Free Pascal y GNU Pascal como backends.
- Lazarus es un IDE multiplataforma visual libre de Delphi para el desarrollo rápido de aplicaciones (RAD). Basado en Free Pascal, Lazarus está disponible para numerosas plataformas incluyendo Linux, FreeBSD, macOS y Microsoft Windows.
- Fuego (macOS) y Agua (Windows) para el Oxigeno y el Compilador de Elementos
Bibliotecas
- Biblioteca WOL para crear aplicaciones GUI con el Compilador Pascal Libre.
Estándares
ISO/IEC 7185:1990Pascal
En 1983, el lenguaje se estandarizó en el estándar internacional IEC/ISO 7185 y en varios estándares locales específicos de cada país, incluido el estadounidense ANSI/IEEE770X3.97-1983 e ISO 7185:1983. Estos dos estándares diferían solo en que el estándar ISO incluía un "nivel 1" extensión para arreglos conformes (un arreglo donde los límites del arreglo no se conocen hasta el tiempo de ejecución), donde ANSI no permitía esta extensión al lenguaje original (versión Wirth). En 1989, se revisó la ISO 7185 (ISO 7185:1990) para corregir varios errores y ambigüedades encontradas en el documento original.
Se afirmó que ISO 7185 era una aclaración del lenguaje de Wirth de 1974, como se detalla en el Manual del usuario y el Informe [Jensen y Wirth], pero también se destacó por agregar "Parámetros de matriz conformes" como un nivel 1 al estándar, siendo el nivel 0 Pascal sin arreglos conformes. Esta adición se realizó a pedido de C. A. R. Hoare y con la aprobación de Niklaus Wirth. La causa precipitante fue que Hoare quería crear una versión en Pascal de la Biblioteca de algoritmos numéricos (NAG), que originalmente se había escrito en FORTRAN, y descubrió que no era posible hacerlo sin una extensión que permitiera parámetros de matriz de tamaño variable.. Consideraciones similares motivaron la inclusión en ISO 7185 de la facilidad para especificar los tipos de parámetros de parámetros de procedimiento y funcionales.
Niklaus Wirth mismo se refirió al lenguaje de 1974 como "el estándar", por ejemplo, para diferenciarlo de las características específicas de la máquina del compilador CDC 6000. Este lenguaje se documentó en El informe de Pascal, la segunda parte del "manual de usuario e informe de Pascal".
En las máquinas grandes (mainframes y minicomputadoras) en las que se originó Pascal, generalmente se siguieron los estándares. En la PC de IBM, no lo eran. En las PC de IBM, los estándares de Borland Turbo Pascal y Delphi tienen la mayor cantidad de usuarios. Por lo tanto, normalmente es importante comprender si una implementación particular corresponde al lenguaje original de Pascal oa un dialecto de Borland del mismo.
Las versiones del lenguaje para PC de IBM comenzaron a diferir con la llegada de UCSD Pascal, una implementación interpretada que presentaba varias extensiones del lenguaje, junto con varias omisiones y cambios. Muchas características del idioma de UCSD sobreviven hoy, incluso en el dialecto de Borland.
ISO/IEC 10206:1990 Pascal extendido
En 1990, se creó un estándar Pascal extendido como ISO/IEC 10206, que es idéntico en contenido técnico a IEEE/ANSI 770X3.160-1989 A partir de 2019, está prevista la compatibilidad con Extended Pascal en FreePascal Compiler.
Variaciones
La versión Zürich de Niklaus Wirth de Pascal se emitió fuera de ETH en dos formas básicas: la fuente del compilador CDC 6000 y un kit de portabilidad llamado sistema Pascal-P. El compilador Pascal-P omitió varias funciones del lenguaje completo que no eran necesarias para iniciar el compilador. Por ejemplo, se omitieron los procedimientos y funciones utilizados como parámetros, registros de variantes no discriminadas, empaquetado, disposición, gotos interprocedimiento y otras características del compilador completo.
UCSD Pascal, bajo la dirección del profesor Kenneth Bowles, se basó en el kit Pascal-P2 y, en consecuencia, compartió varias de las restricciones de idioma de Pascal-P. UCSD Pascal se adoptó más tarde como Apple Pascal y continuó a través de varias versiones allí. Aunque UCSD Pascal en realidad expandió el subconjunto Pascal en el kit Pascal-P al volver a agregar construcciones estándar de Pascal, todavía no era una instalación estándar completa de Pascal.
A principios de la década de 1990, Alan Burns y Geoff Davies desarrollaron Pascal-FC, una extensión de Pl/0 (del libro Algorithms + Data Structures = Programs de Niklaus). Se agregaron varias construcciones para usar Pascal-FC como una herramienta de enseñanza para la programación concurrente (como semáforos, monitores, canales, invocación remota y recursos). Para poder demostrar la concurrencia, la salida del compilador (una especie de código P) podría ejecutarse en una máquina virtual. Esta máquina virtual no solo simulaba un entorno normal, justo, sino que también podía simular condiciones extremas (modo injusto).
Compiladores Pascal tipo Borland
El Turbo Pascal de Borland, escrito por Anders Hejlsberg, fue escrito en lenguaje ensamblador independiente de UCSD y los compiladores de Zürich. Sin embargo, adoptó gran parte del mismo subconjunto y extensiones que el compilador UCSD. Esto probablemente se deba a que el sistema UCSD era el sistema Pascal más común adecuado para desarrollar aplicaciones en los sistemas de microprocesador de recursos limitados disponibles en ese momento.
La versión 3 de Turbo Pascal envuelta en plástico y las encarnaciones posteriores, incluidos Object Pascal y Delphi de Borland y los casi compatibles que no son de Borland, se hicieron populares entre los programadores, incluidos los autores de shareware, por lo que la biblioteca SWAG de código Pascal presenta una gran cantidad de código escrito con versiones como Delphi en mente.
Productos de software (compiladores e IDE/Rapid Application Development (RAD)) en esta categoría:
- Turbo Pascal – "TURBO.EXE" hasta la versión 7, y Turbo Pascal para Windows ("TPW") y Turbo Pascal para Macintosh.
- Pascal puro e HiSPeed Pascal 2 Pascal language Environment for the Atari ST range of computers.
- Borland Pascal 7 – Una versión profesional de la línea Turbo Pascal que apuntaba tanto a DOS como a Windows.
- Object Pascal – una extensión del lenguaje pascal que fue desarrollado en Apple Computer por un equipo liderado por Larry Tesler en consulta con Niklaus Wirth, el inventor de Pascal; sus características fueron agregadas al Turbo Pascal de Borland para Macintosh y en 1989 para Turbo Pascal 5.5 para DOS.
- Delphi – Object Pascal es esencialmente su lenguaje subyacente.
- Libre Pascal compilador (FPC) – Free Pascal adoptó el dialecto estándar de facto de los programadores Pascal, Borland Pascal y, más tarde, Delphi. Freepascal también soporta ambos estándares ISO.
- PascalABC.NET – una nueva generación de lenguaje de programación pascal incluyendo compilador e IDE.
- Borland Kylix es un compilador e IDE vendido anteriormente por Borland, pero más tarde se suspendió. Es una versión Linux del entorno de desarrollo de software Borland Delphi y C++Builder.
- Lazarus – similar a Kylix en función, es un IDE visual multiplataforma libre para RAD utilizando el compilador Pascal Libre, que admite dialectos de Object Pascal a diferentes grados.
- Virtual Pascal – VP2/1 es un completo Borland Pascal – y Borland Delphi – compilador Pascal compatible de 32 bits para OS/2 y Windows 32 (con una versión Linux "en el camino").
- Sybil es una fuente abierta Delphi-like IDE y compilador; las implementaciones incluyen:
- WDSibyl para Microsoft Windows y OS/2, un entorno comercial compatible con Borland Pascal lanzado por una empresa llamada Speedsoft que se desarrolló posteriormente en un entorno de desarrollo de aplicaciones rápidas (RAD) similar a Delphi llamado Sybil y luego abierto bajo la GPL cuando esa empresa cerró;
- Open Sybil, que es un proyecto en curso, una herramienta de código abierto para OS/2 y ECS que se basaba originalmente en las fuentes WDsybl Sibyl Sibyl Portable Component Classes (SPCC) y Sibyl Visual Development Tool (SVDE), pero ahora su núcleo es IBM System Object Model (SOM), WPS y OpenDoc.
Lista de estándares relacionados
- ISO 8651-2: 1988 Sistemas de procesamiento de información – Gráficos informáticos – Acoplamientos de idiomas del sistema de núcleo gráfico – Parte 2: Pascal
Recepción
Pascal generó una amplia variedad de respuestas en la comunidad informática, tanto críticas como complementarias.
Primeras críticas
Si bien fue muy popular en la década de 1980 y principios de la de 1990, las implementaciones de Pascal que seguían de cerca la definición inicial del lenguaje de Wirth fueron ampliamente criticadas por ser inadecuadas para su uso fuera de la enseñanza. Brian Kernighan, quien popularizó el lenguaje C, describió sus críticas más notables a Pascal ya en 1981 en su artículo 'Por qué Pascal no es mi lenguaje de programación favorito'. El problema más grave que describió Kernighan fue que los tamaños de los arreglos y las longitudes de las cadenas formaban parte del tipo, por lo que no era posible escribir una función que aceptara arreglos de longitud variable o incluso cadenas como parámetros. Esto hizo inviable escribir, por ejemplo, una biblioteca de clasificación. Kernighan también criticó el orden impredecible de evaluación de las expresiones booleanas, el soporte deficiente de la biblioteca y la falta de variables estáticas, y planteó una serie de problemas menores. Además, afirmó que el lenguaje no proporciona construcciones simples para "escapar" (ignorar a sabiendas y por la fuerza) restricciones y limitaciones. Las quejas más generales de otras fuentes señalaron que el alcance de las declaraciones no estaba claramente definido en la definición del idioma original, lo que a veces tenía serias consecuencias cuando se usaban declaraciones directas para definir tipos de punteros, o cuando las declaraciones de registros conducían a la repetición mutua, o cuando un identificador puede o puede no haber sido utilizado en una lista de enumeración. Otra dificultad era que, al igual que ALGOL 60, el lenguaje no permitía que los procedimientos o funciones pasados como parámetros predefinieran el tipo esperado de sus parámetros.
A pesar de las críticas iniciales, Pascal siguió evolucionando y la mayoría de los puntos de Kernighan no se aplican a las versiones del lenguaje que se mejoraron para que fueran adecuadas para el desarrollo de productos comerciales, como Turbo Pascal de Borland. Como predijo Kernighan en su artículo, la mayoría de las extensiones para solucionar estos problemas eran incompatibles de un compilador a otro. Sin embargo, desde principios de la década de 1990, la mayoría de las variedades parecen condensarse en dos categorías: ISO y similar a Borland. Extended Pascal aborda muchas de estas primeras críticas. Admite cadenas de longitud variable, inicialización de variables, compilación separada, operadores booleanos de cortocircuito y cláusulas predeterminadas (otherwise
) para declaraciones de casos.
Contenido relacionado
Registro de instrucciones
Intel 8085
Cabezal de lectura y escritura de disco