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 buenas prácticas de programación mediante 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 . [a]
Pascal se desarrolló siguiendo el modelo del lenguaje ALGOL 60. Wirth participó en el proceso de mejora del lenguaje como parte de los esfuerzos de ALGOL X y propuso una versión llamada ALGOL W. Esta no fue aceptada y el proceso de ALGOL X se estancó. En 1968, Wirth decidió abandonar el proceso ALGOL X y mejorar aún más ALGOL W, publicando este último como Pascal en 1970.
Además de los escalares y matrices de ALGOL , Pascal permite definir tipos de datos complejos y construir estructuras de datos dinámicas y recursivas como listas , árboles y gráficos . Pascal tiene una tipificación fuerte en todos los objetos, lo que significa que un tipo de datos no se puede convertir ni 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 los 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 . También había compiladores disponibles para muchas microcomputadoras cuando surgió el campo a fines de la década de 1970. Se usó ampliamente como lenguaje de enseñanza en cursos de programación de nivel universitario en la década de 1980, y también se usó en entornos de producción para escribir software comercial durante el mismo período. Fue reemplazado 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. Lo utilizaron Apple Computer (para las máquinas Lisa y Macintosh) y Borland a finales de los años 1980 y más tarde se desarrolló en Delphi en la plataforma Microsoft Windows . Las extensiones de los conceptos de Pascal dieron lugar a los lenguajes Modula-2 y Oberon , ambos desarrollados por Wirth.
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 se desarrolló durante la década de 1950 con el objetivo explícito de poder describir algoritmos con claridad . 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 introducción, en 1962 Wirth comenzó a trabajar en su tesis doctoral con Helmut Weber sobre el lenguaje de programación Euler . Euler se basaba en la sintaxis y muchos conceptos de ALGOL, pero no era un derivado. Su objetivo principal era añadir listas y tipos dinámicos, lo que permitía su uso en funciones similares a Lisp . El lenguaje se publicó en 1965.
En ese momento, se habían identificado varios problemas en ALGOL, en particular la falta de un sistema de cadenas estandarizado . El grupo encargado de mantener el lenguaje había iniciado el proceso ALGOL X para identificar mejoras y solicitar propuestas. Wirth y Tony Hoare presentaron un conjunto conservador de modificaciones para agregar cadenas y limpiar parte de la sintaxis. Se consideró que estas modificaciones eran demasiado menores para que valiera la pena usarlas como el nuevo estándar de ALGOL, por lo que Wirth escribió un compilador para el lenguaje, que se denominó ALGOL W.
Los esfuerzos de ALGOL X continuaron hasta elegir un lenguaje mucho más complejo, ALGOL 68. La complejidad de este lenguaje provocó considerables dificultades para producir compiladores de alto rendimiento y no se utilizó ampliamente en la industria. Esto dejó una oportunidad para lenguajes más nuevos.
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 sistemas. [5] Una generación de estudiantes utilizó 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 se utilizó ampliamente 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 original de Macintosh se tradujeron a mano al lenguaje ensamblador Motorola 68000 a partir del código fuente de Pascal . [6]
El sistema de composición tipográfica TeX de Donald Knuth fue escrito en WEB , el sistema de programación alfabetizada original , basado en DEC PDP-10 Pascal. Aplicaciones comerciales exitosas como Adobe Photoshop [7] fueron escritas en Macintosh Programmer's Workshop Pascal, mientras que aplicaciones como Total Commander , Skype [8] y Macromedia Captivate fueron escritas 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 utilizan ampliamente. [9]
El compilador de ejemplo de Wirth, que pretendía propagar el lenguaje, el sistema Pascal-P, utilizaba un subconjunto del lenguaje diseñado para ser el subconjunto mínimo del lenguaje que pudiera compilarse a sí mismo. La idea era que esto pudiera permitir el arranque del compilador, que luego se extendería al estado completo del lenguaje Pascal. Esto se hizo con varios compiladores, pero una excepción notable fue UCSD Pascal, que se basaba en Pascal-P2. Mantuvo el estado de subconjunto del lenguaje basándose en la idea de que esto funcionaría mejor en los nuevos (en ese entonces) microprocesadores con memoria limitada. UCSD también convirtió el intérprete Pascal-P2 en una "máquina de bytes", nuevamente, porque sería más adecuado para los microprocesadores orientados a bytes.
UCSD Pascal formó la base de muchos sistemas, incluido Apple Pascal. Borland Pascal no se basó en el código base de UCSD, pero llegó durante el período popular de UCSD e igualó muchas de sus características. Esto inició la línea que terminó con Delphi Pascal y el compilador de código abierto compatible FPC/Lazarus.
El estándar ISO para Pascal, ISO 7185, fue publicado en 1983 y fue ampliamente implementado y utilizado en mainframes, minicomputadoras e IBM-PC y compatibles de 16 bits a 32 bits. Los dos dialectos de Pascal más utilizados hacia fines del siglo XX y hasta hoy son la versión estándar ISO 7185 y las versiones Delphi/Turbo Pascal (de las cuales las dos versiones Borland son en su mayoría compatibles entre sí).
La fuente de gran parte de la historia temprana de Pascal se puede encontrar en los boletines del Grupo de usuarios de Pascal en:
Boletines del grupo de usuarios de Pascal.
Durante el trabajo en Lisa, Larry Tesler comenzó a comunicarse con Wirth sobre la idea de agregar extensiones orientadas a objetos al lenguaje, para hacer de Pascal un lenguaje de programación multiparadigma . Esto condujo inicialmente a Clascal , presentado en 1983. Cuando el programa Lisa desapareció y fue reemplazado por Macintosh, se creó una versión posterior y se llamó Object Pascal . Este se presentó en Mac en 1985 como parte del marco de aplicaciones MacApp , y se convirtió en el principal lenguaje de desarrollo de Apple hasta principios de la década de 1990.
Las extensiones de Object Pascal se añadieron a Turbo Pascal con el lanzamiento de la versión 5.5 en 1989. [10] Con el paso de los años, Object Pascal se convirtió en la base del sistema Delphi para Microsoft Windows , que todavía se utiliza para desarrollar aplicaciones de Windows, y puede compilar código de forma cruzada para otros sistemas. Free Pascal es una alternativa multiplataforma de código abierto con su propio IDE gráfico llamado Lazarus .
El primer compilador de Pascal fue diseñado en Zúrich para la familia de computadoras mainframe 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 inadecuación de FORTRAN 66 para expresar estructuras de datos complejas. El segundo intento se implementó en un lenguaje similar a C (Scallop por Max Engeli) y luego se tradujo a mano (por R. Schild) al propio Pascal para el arranque. [11] Estuvo operativo a mediados de 1970. Muchos compiladores de Pascal desde entonces han sido de manera similar autoalojados , es decir, el compilador está escrito en Pascal y el compilador generalmente es capaz de recompilarse a sí mismo cuando se agregan nuevas características al lenguaje o cuando el compilador debe ser portado a un nuevo entorno. El compilador GNU Pascal es una excepción notable, ya que está escrito en C.
El primer port exitoso del compilador CDC Pascal a otro mainframe fue completado por Welsh y Quinn en la Queen's University de 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 el miniordenador de Information Computer Systems (ICS) Multum . El port Multum fue desarrollado -con vistas 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, puede haber sido la primera implementación de 16 bits .
En 1977, Welsh et al. completaron un compilador completamente nuevo en la QUB. Ofrecía una función de diagnóstico del lenguaje fuente (que incorporaba creación de perfiles, rastreo y volcados de datos post mortem formateados con reconocimiento de tipos) que fue implementado por Findlay y Watt en la Universidad de Glasgow. Esta implementación fue trasladada en 1980 a la serie ICL 2900 por un equipo con base 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, habiendo sido adaptada por Welsh y Hay en la Universidad de Manchester en 1984 para verificar rigurosamente la conformidad con la Norma BSI 6192/ISO 7185 y para generar código para una máquina abstracta portátil.
El primer compilador de Pascal escrito en América del Norte fue construido 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.
Para propagar el lenguaje rápidamente, se creó en Zúrich un kit de portabilidad de compiladores 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 llamaron Pascal-P1, Pascal-P2, Pascal-P3 y Pascal-P4. Pascal-P1 fue la primera versión y Pascal-P4 fue la última en salir de Zúrich. La versión denominada Pascal-P1 se acuñó después del hecho de que existían muchas fuentes diferentes para Pascal-P. El compilador fue rediseñado para mejorar la portabilidad y se publicó 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 Pascal-P4 todavía puede ejecutarse y compilarse en sistemas compatibles con el Pascal original (al igual que Pascal-P2). Sin embargo, solo acepta un subconjunto del lenguaje Pascal.
Pascal-P5, creado fuera del grupo de Zúrich, acepta el lenguaje Pascal completo e incluye compatibilidad con ISO 7185.
Pascal-P6 es una continuación de Pascal-P5 que, junto con otras características, apunta a ser un compilador para CPU específicas, incluido AMD64.
UCSD Pascal se derivó de Pascal-P2, donde Kenneth Bowles lo utilizó para crear el sistema UCSD p interpretativo . Fue uno de los tres sistemas operativos disponibles en el lanzamiento de la IBM Personal Computer original . [12] UCSD Pascal utilizó un código intermedio basado en valores de bytes y, por lo tanto, fue uno de los primeros compiladores de bytecode . Apple Pascal se lanzó en 1979 para los sistemas informáticos Apple II y Apple III . Fue una implementación de UCSD Pascal, o se basó en gran medida en él. Pascal-P1 a Pascal-P4 no lo fueron, sino que se basaron en la longitud de palabra de 60 bits de CDC 6600 .
La Comisión Australiana de Energía Atómica lanzó un compilador basado en el compilador Pascal-P4, que creaba archivos de objetos binarios nativos, para la computadora mainframe IBM System/370 ; se lo denominó compilador AAEC Pascal 8000 en honor a la abreviatura del nombre de la comisión. [13]
Apple Computer creó su propio Lisa Pascal para el Lisa Workshop en 1982, y portó 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. Una reimplementación de este compilador para IBM PC se comercializó con los nombres Compas Pascal y PolyPascal antes de que Borland lo adquiriera y lo rebautizara Turbo Pascal .
Turbo Pascal se volvió muy popular gracias a una estrategia de precios agresiva, a tener uno de los primeros IDE de pantalla completa y a un tiempo de ejecución muy rápido (apenas unos segundos para compilar, vincular y ejecutar). Fue escrito y altamente optimizado completamente en lenguaje ensamblador , lo que lo hizo más pequeño y más rápido que gran parte de la competencia.
En 1986, Anders portó Turbo Pascal a Macintosh e incorporó las extensiones Object Pascal de Apple a Turbo Pascal. 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. [14] [15] Turbo Pascal 5.5 tuvo una gran influencia en la comunidad Pascal, que comenzó a concentrarse principalmente en IBM PC a fines de la década de 1980. Muchos aficionados a las PC en busca de un reemplazo estructurado para BASIC usaron 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 la interfaz de programación de aplicaciones (API) basada en C de Microsoft Windows directamente. Estas extensiones incluían cadenas terminadas en nulo , aritmética de punteros , punteros de función , un operador de dirección y conversiones de tipos no seguras .
Turbo Pascal y otros derivados con estructuras unitarias o modulares son lenguajes de programación modulares . Sin embargo, no ofrece un concepto de módulo anidado ni importación y exportación calificadas de símbolos específicos.
Super Pascal agrega 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 compatible con MS-DOS de 32 bits , OS/2 y Win32 . Amplía el lenguaje con sobrecarga de funciones y operadores .
Las universidades de Wisconsin–Madison , Zúrich , Karlsruhe y Wuppertal desarrollaron los compiladores Pascal-SC [16] [17] y Pascal-XSC [18] [19] [20] ( Extensiones para computación científica ), destinados a programar cálculos numéricos. El desarrollo de Pascal-SC comenzó en 1978 con soporte para el nivel 0 de Pascal ISO 7185, pero el soporte de nivel 2 se agregó en una etapa posterior. [21] Pascal-SC originalmente apuntaba al procesador Z80 , pero luego fue reescrito para DOS ( x86 ) y 68000. Pascal-XSC ha sido portado en varias ocasiones a sistemas operativos Unix (Linux, SunOS , HP-UX , AIX ) y Microsoft/IBM (DOS con EMX , OS/2, Windows ). Opera generando 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 un Pascal de nivel 1 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 lenguaje incluía algunas extensiones para facilitar la programación del sistema (por ejemplo, un equivalente a lseek). [22] El equipo Sol luego se trasladó al proyecto ChorusOS para diseñar un sistema operativo distribuido . [23]
IP Pascal es una implementación del lenguaje de programación Pascal que utiliza Micropolis DOS, pero se trasladó rápidamente a CP/M-80 que se ejecuta en el Z80. Se trasladó a los tipos de máquina 80386 en 1994 y existe hoy en día como implementaciones de Windows XP y Linux. En 2008, el sistema se llevó a un nuevo nivel y el lenguaje resultante se denominó "Pascaline" (en honor a la calculadora de Pascal ). Incluye objetos, controles de espacios de nombres , matrices dinámicas y muchas otras extensiones, y en general 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.
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
, que se extienden en una sola declaración o en un bloque begin
de end
declaraciones. 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 punteros de conjuntos y procedimientos. Dichas construcciones fueron en parte heredadas o inspiradas de Simula 67, ALGOL 68 , el propio ALGOL W de Niklaus Wirth y las sugerencias de CAR Hoare .
Los programas Pascal comienzan con la program
palabra clave con una lista de descriptores de archivos externos como parámetros [24] (no es necesario en Turbo Pascal, etc.); luego sigue el bloque principal entre paréntesis de las palabras clave begin
y end
. Los puntos y coma separan las declaraciones y el punto final (es decir, un punto) finaliza todo el programa (o unidad ). En el código fuente de Pascal se ignoran las mayúsculas y minúsculas .
A continuación se muestra un ejemplo del código fuente utilizado para un programa muy simple "¡Hola, mundo!" :
programa HelloWorld ( salida ) ; begin WriteLn ( '¡Hola, mundo!' ) {No se requiere ";" después de la última declaración de un bloque - agregar uno agrega una "declaración nula" al programa, que es ignorada por el compilador.} end .
En Pascal, una declaración de tipo se utiliza para definir un rango de valores que una variable de ese tipo puede almacenar. También define un conjunto de operaciones que se pueden realizar con variables de ese tipo. Los tipos predefinidos son:
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 un número entero utilizando el redondeo bancario ) y trunc
(redondea hacia cero).
El programador tiene la libertad de definir otros tipos de datos comúnmente utilizados (por ejemplo, byte, cadena, etc.) en términos de los tipos predefinidos utilizando la facilidad de declaración de tipos de Pascal, por ejemplo
tipo byte = 0 .. 255 ; signed_byte = - 128 .. 127 ; cadena = matriz empaquetada [ 1 .. 255 ] de char ;
Los tipos de uso frecuente, como byte y string, ya están definidos en muchas implementaciones.
Normalmente, el sistema utilizará una palabra para almacenar los datos. Por ejemplo, el byte
tipo puede almacenarse en un entero de máquina (quizás de 32 bits) en lugar de un valor de 8 bits . Pascal no contiene elementos de lenguaje que permitan definir los tipos de almacenamiento básicos de forma más granular. Esta capacidad se incluyó en varias 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 packed
palabra clave le indica al compilador que utilice el método de almacenamiento más eficiente para los tipos de datos estructurados: conjuntos, matrices y registros, en lugar de utilizar una palabra para cada elemento. El empaquetamiento puede ralentizar el acceso en máquinas que no ofrecen un acceso fácil a partes de una palabra.
También se pueden crear subrangos de cualquier tipo de datos ordinales (cualquier tipo simple excepto real):
var x : 1 .. 10 ; y : 'a' .. 'z' ;
A diferencia de otros lenguajes de programación de su época, Pascal admite un tipo de conjunto: [25]
var Set1 : conjunto de 1 .. 10 ; Set2 : conjunto de 'a' .. 'z' ;
Un conjunto es un concepto fundamental para las matemáticas modernas y puede utilizarse en muchos algoritmos. Esta característica 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 yo estoy en [ 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 particularmente útiles, tanto en términos de rendimiento como de legibilidad:
si i está en [ 0 .. 3 , 7 , 9 , 12 .. 15 ] entonces ...
En estos ejemplos, que involucran conjuntos en dominios pequeños, el rendimiento mejorado se logra generalmente mediante la representación de las variables de conjunto como vectores de bits por parte del compilador . Los operadores de conjunto se pueden implementar de manera eficiente como operaciones de código de máquina a nivel de bits.
Un ejemplo de un tipo de registro Pascal:
tipo coche = registro largo : entero ; ancho : entero fin ;
Un ejemplo de un tipo de registro variante:
tipo Forma = ( Círculo , Cuadrado , Triángulo ) ; Dimensiones = registro caso Figura : Forma del Círculo : ( Diámetro : real ) ; Cuadrado : ( Ancho : real ) ; Triángulo : ( Lado : real ; Ángulo1 , Ángulo2 : 0 .. 360 ) fin ;
Los registros variantes permiten que varios campos del registro se superpongan para ahorrar espacio.
Los tipos se pueden definir a partir de otros tipos mediante declaraciones de tipo:
tipo x = entero ; y = x ; ...
Además, se pueden construir tipos complejos a partir de tipos simples:
tipo a = matriz [ 1 .. 10 ] de entero ; b = registro x : entero ; y : carácter {punto y coma adicional no estrictamente requerido} fin ; c = archivo de a ;
tipo a = archivo de entero ; b = registro x : entero ; y : carácter fin ; c = archivo de b ;
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 de búfer al siguiente elemento. Read se introduce de modo que read(f, x) sea lo mismo que x := f^; get(f); . Write se introduce de modo que write(f, x) sea lo mismo que f^ := x; put(f); El tipo text
está predefinido como file o char. Si bien la variable de búfer se podría usar para inspeccionar el siguiente carácter que se usará (verificar si hay un dígito antes de leer un entero), esto conduce a serios problemas con los programas interactivos en las primeras implementaciones, pero se resolvió más tarde con el concepto de "E/S diferida", que espera hasta que se acceda realmente a la variable de búfer de archivo antes de realizar operaciones de archivo.
Pascal admite el uso de punteros :
tipo pNode = ^ Nodo ; Nodo = registro a : entero ; b : carácter ; c : pNode fin ; 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 declararlos. Esta es una declaración adelantada , 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 instrucciones serían:
nuevo ( NodePtr ) ; ... NodePtr ^. a := 10 ; NodePtr ^. b := 'A' ; NodePtr ^. c := nil ; ...
Esto también se puede hacer mediante la with
siguiente declaración:
nuevo ( NodePtr ) ; ... con NodePtr ^ comienza a := 10 ; b := 'A' ; c : = nil fin ; ...
Dentro del alcance de la declaración with , a y b hacen referencia a los subcampos del puntero de registro NodePtr y no al registro Node o al tipo de puntero pNode.
Se pueden crear listas enlazadas , pilas y colas incluyendo 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 char no es compatible con un puntero a un entero). Esto ayuda a eliminar los problemas de seguridad de tipo inherentes a otras implementaciones de punteros, particularmente las utilizadas 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 la función dispose (que tiene el mismo efecto que la función de biblioteca libre que se encuentra en C ) significa que el riesgo de punteros colgantes no se ha eliminado [26] como lo ha hecho en lenguajes como Java y C#, que proporcionan recolección automática de basura (pero que no eliminan el problema relacionado de fugas de memoria ).
Algunas de estas restricciones pueden eliminarse en los dialectos más nuevos.
Pascal es un lenguaje de programación estructurado , lo que significa que el flujo de control está estructurado en declaraciones estándar , generalmente sin comandos " goto ".
mientras a <> b haga WriteLn ( 'Esperando' ) ; si a > b entonces WriteLn ( 'Condición cumplida' ) {no se permite punto y coma antes de else} else WriteLn ( 'Condición no cumplida' ) ; para i := 1 a 10 hacer {no hay punto y coma aquí ya que separaría la siguiente declaración} WriteLn ( 'Iteración: ' , i ) ; repetir a := a + 1 hasta a = 10 ; caso i de 0 : Escribir ( 'cero' ) ; 1 : Escribir ( 'uno' ) ; 2 : Escribir ( 'dos' ) ; 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 : Escribir ( '?' ) fin ;
Pascal estructura los programas en procedimientos y funciones. Generalmente, un procedimiento se utiliza por sus efectos secundarios, mientras que una función se utiliza por su valor de retorno.
programa Impresión ( salida ) ; var i : entero ; procedimiento PrintAnInteger ( j : entero ) ; comienzo ... fin ; función triple ( const x : entero ) : entero ; inicio triple := x * 3 fin ; comienzo { programa principal } ... PrintAnInteger ( i ) ; PrintAnInteger ( triple ( i )) fin .
Los procedimientos y funciones se pueden anidar hasta cualquier profundidad, y la construcción 'programa' 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, este 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 orden se pensó originalmente para permitir una compilación eficiente en un solo paso . Sin embargo, en algunos dialectos (como Delphi ) el requisito de orden estricto de las secciones de declaración se ha relajado.
Pascal adoptó muchas características de sintaxis del lenguaje ALGOL , incluido el uso de un punto y coma como separador de sentencias. Esto contrasta con otros lenguajes, como PL/I y C , que utilizan el punto y coma como terminador de sentencia. No se necesita un punto y coma antes de la end
palabra clave de una declaración de tipo de registro, un bloque o una sentencia de caso ; antes de la until
palabra clave de una sentencia de repetición; y antes de la else
palabra clave de una sentencia if .
En las primeras versiones de Pascal no se permitía la presencia de un punto y coma adicional. Sin embargo, la adición de sentencias vacías similares a ALGOL en el Informe Revisado de 1973 y los cambios posteriores al lenguaje en la norma ISO 7185:1983 ahora permiten el uso de punto y coma opcionales en la mayoría de estos casos. Todavía no se permite el uso de un punto y coma inmediatamente antes de la else
palabra clave en una sentencia ifelse
, porque sigue a una única sentencia, no a una secuencia de sentencias. En el caso de los ifs anidados, no se puede utilizar un punto y coma para evitar el problema del else pendiente (donde el if interno no tiene un else, pero el if externo sí) terminando supuestamente el if anidado con un punto y coma; esto, en cambio, termina ambas cláusulas if. En su lugar, se debe utilizar un bloque begin
... explícito. [27]end
Hay varios compiladores e intérpretes de Pascal disponibles para uso general:
En 1983, el lenguaje se estandarizó en la norma internacional IEC/ISO 7185 [34] y en varias normas locales específicas de cada país, incluidas la estadounidense ANSI/IEEE770X3.97-1983 y la ISO 7185:1983. Estas dos normas se diferenciaban únicamente en que la norma ISO incluía una extensión de "nivel 1" para matrices conformes (una matriz cuyos límites no se conocen hasta el momento de la ejecución), mientras que la ANSI no permitía esta extensión en el lenguaje original (versión Wirth). En 1989, se revisó la ISO 7185 (ISO 7185:1990) para corregir varios errores y ambigüedades encontrados en el documento original.
La norma ISO 7185 se presentó como una aclaración del lenguaje de Wirth de 1974, tal como se detalla en el Manual de usuario y el informe [Jensen y Wirth], pero también se destacó por agregar "Parámetros de matriz conformes" como nivel 1 al estándar, siendo el nivel 0 Pascal sin matrices conformes. Esta adición se realizó a pedido de CAR Hoare y con la aprobación de Niklaus Wirth. La causa desencadenante fue que Hoare quería crear una versión 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 la norma ISO 7185 de la función para especificar los tipos de parámetros de los parámetros procedimentales y funcionales.
El propio Niklaus Wirth 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 fue documentado en The Pascal Report , [35] la segunda parte del "Manual e informe del usuario de Pascal".
En las grandes máquinas (mainframes y minicomputadoras) en las que se originó Pascal, los estándares generalmente se seguían. En el IBM PC , no fue así. En los IBM PC, los estándares Borland Turbo Pascal y Delphi tienen el mayor número de usuarios. Por lo tanto, suele ser importante comprender si una implementación particular corresponde al lenguaje Pascal original o a un dialecto Borland del mismo.
Las versiones del lenguaje para IBM PC comenzaron a diferir con la llegada de UCSD Pascal, una implementación interpretada que incluía varias extensiones del lenguaje, junto con varias omisiones y cambios. Muchas características del lenguaje UCSD sobreviven hoy en día, incluso en el dialecto de Borland.
En 1990, se creó un estándar Pascal extendido como ISO/IEC 10206, [36] que es idéntico en contenido técnico [37] a IEEE/ANSI 770X3.160-1989 [38] A partir de 2019, está previsto que el compilador FreePascal admita Pascal extendido . [39]
La versión de Zúrich de Pascal de Niklaus Wirth se publicó fuera de la ETH en dos formas básicas: el código fuente del compilador CDC 6000 y un kit de adaptación llamado sistema Pascal-P. El compilador Pascal-P omitió varias características del lenguaje completo que no eran necesarias para arrancar el compilador. Por ejemplo, se omitieron los procedimientos y funciones utilizados como parámetros, los registros de variantes no discriminados, el empaquetado, la eliminación, los gotos interprocedimentales y otras características del compilador completo.
UCSD Pascal , dirigido por el profesor Kenneth Bowles , se basó en el kit Pascal-P2 y, en consecuencia, compartió varias de las restricciones del lenguaje Pascal-P. UCSD Pascal se adoptó más tarde como Apple Pascal y continuó en varias versiones de este. Aunque UCSD Pascal en realidad expandió el subconjunto Pascal en el kit Pascal-P agregando construcciones estándar de Pascal, todavía no era una instalación estándar completa de Pascal.
A principios de los años 90, Alan Burns y Geoff Davies desarrollaron Pascal-FC, una extensión de Pl/0 (del libro de Niklaus Algorithms + Data Structures = Programs ). Se añadieron varias construcciones para utilizar Pascal-FC como herramienta de enseñanza de 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 ) podí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).
El Turbo Pascal de Borland , escrito por Anders Hejlsberg , se escribió en lenguaje ensamblador independientemente de UCSD y de los compiladores de Zúrich. Sin embargo, adoptó gran parte del mismo subconjunto y extensiones que el compilador UCSD. Esto se debe probablemente a que el sistema UCSD era el sistema Pascal más común y adecuado para desarrollar aplicaciones en los sistemas de microprocesadores con recursos limitados disponibles en ese momento.
La versión 3 de Turbo Pascal envuelta en plástico y las encarnaciones posteriores, incluyendo Object Pascal y Delphi de Borland y las versiones casi compatibles no con Borland, se hicieron populares entre los programadores, incluidos los autores de shareware, y por eso 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/ Desarrollo rápido de aplicaciones (RAD)) en esta categoría:
Pascal generó una amplia variedad de respuestas en la comunidad informática, tanto críticas como elogiosas.
Aunque muy populares en los años 1980 y principios de los 1990, las implementaciones de Pascal que siguieron 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". [43] El problema más grave que Kernighan describió fue que los tamaños de matriz y las longitudes de cadena eran parte del tipo, por lo que no era posible escribir una función que aceptara matrices de longitud variable o incluso cadenas como parámetros. Esto hizo que fuera inviable escribir, por ejemplo, una biblioteca de ordenamiento. Kernighan también criticó el orden impredecible de evaluación de 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 proporcionaba ninguna construcción simple para "escapar" (ignorar consciente y forzosamente) restricciones y limitaciones. Quejas más generales de otras fuentes [26] [44] señalaron que el alcance de las declaraciones no estaba claramente definido en la definición del lenguaje original, lo que a veces tenía consecuencias graves cuando se usaban declaraciones hacia adelante para definir tipos de punteros, o cuando las declaraciones de registros conducían a una recursión mutua , o cuando un identificador podía o no haber sido usado 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 continuó evolucionando, y la mayoría de los puntos de Kernighan no se aplican a las versiones del lenguaje que fueron mejoradas para ser adecuadas para el desarrollo de productos comerciales, como Turbo Pascal de Borland . Como Kernighan predijo 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 similares a Borland. Extended Pascal aborda muchas de estas críticas tempranas. Admite cadenas de longitud variable, inicialización de variables, compilación separada, operadores booleanos de cortocircuito y otherwise
cláusulas predeterminadas ( ) para declaraciones de caso. [45]
Hemos analizado con mucho cuidado Delphi Object Pascal y hemos creado un prototipo funcional de referencias a métodos enlazados para entender su interacción con el lenguaje de programación Java y sus API... Nuestra conclusión fue que las referencias a métodos enlazados son innecesarias y perjudiciales para el lenguaje. Esta decisión se tomó tras consultar con Borland International, que tenía experiencia previa con referencias a métodos enlazados en Delphi Object Pascal .
El proyecto siguió adelante con el nombre de "green" y el lenguaje se basaba en un antiguo modelo de
UCSD Pascal
, que permite generar código interpretativo.