stringtranslate.com

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 buenas prácticas de programación utilizando programación estructurada y estructuración de datos . Lleva el nombre del matemático, filósofo y físico francés Blaise Pascal .

Pascal se desarrolló siguiendo 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 ALGOL X se estancó. En 1968, Wirth decidió abandonar el proceso ALGOL X y mejorar aún más ALGOL W, liberándolo 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 tipos fuertes 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 tanto, un programa es sintácticamente similar a un único procedimiento o función. Esto es similar a la estructura de bloques de ALGOL 60, pero restringido 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 este campo surgió a fines de la década de 1970. Fue ampliamente utilizado como lenguaje de enseñanza en cursos de programación a 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 finales de los 80 y principios de los 90 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 programación orientada a objetos. Fue utilizado por Apple Computer (para las máquinas Lisa y Macintosh) y Borland a fines de la década de 1980 y luego se desarrolló en Delphi en la plataforma Microsoft Windows . Las extensiones de los conceptos de Pascal llevaron a los lenguajes Modula-2 y Oberon , ambos desarrollados por Wirth.

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 se desarrolló durante la década de 1950 con el objetivo explícito de poder describir claramente algoritmos . 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 con Helmut Weber sobre el lenguaje de programación Euler . Euler se basó en la sintaxis de ALGOL y en muchos conceptos, pero no fue un derivado. Su objetivo principal era agregar listas y tipos dinámicos, permitiendo su uso en roles similares a Lisp . El idioma fue publicado en 1965.

En ese momento, se habían identificado una serie de problemas en ALGOL, en particular la falta de un sistema de cuerdas estandarizado . El grupo encargado de mantener el lenguaje había comenzado el proceso ALGOL X para identificar mejoras y solicitó 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 estándar ALGOL, por lo que Wirth escribió un compilador para el lenguaje, que pasó a llamarse ALGOL W.

Los esfuerzos de ALGOL X continuarían hasta elegir un lenguaje mucho más complejo, ALGOL 68 . La complejidad de este lenguaje generó dificultades considerables para producir compiladores de alto rendimiento y no se utilizó ampliamente en la industria. Esto dejó una apertura para idiomas más nuevos.

Pascal

Pascal fue influenciado por los esfuerzos de ALGOL W, con los objetivos explícitos de enseñar programación de forma estructurada y para el desarrollo de software de sistemas. [4] 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 el 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 fueron traducidas manualmente al lenguaje ensamblador Motorola 68000 a partir del código fuente de Pascal . [5]

El sistema de composición tipográfica TeX de Donald Knuth fue escrito en WEB , el sistema de programación alfabetizado original , basado en DEC PDP-10 Pascal. Las aplicaciones comerciales exitosas como Adobe Photoshop [6] se escribieron en Macintosh Programmer's Workshop Pascal, mientras que aplicaciones como Total Commander , Skype [7] 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 Pascal más nuevos que se utilizan ampliamente. [8]

dialectos

El compilador de ejemplo de Wirth destinado a propagar el lenguaje, el sistema Pascal-P, utilizó un subconjunto del lenguaje diseñado para ser el subconjunto mínimo del lenguaje que podría compilarse a sí mismo. La idea era que esto podría permitir arrancar el 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 basó en Pascal-P2. Mantuvo el estado del subconjunto del lenguaje basándose en la idea de que funcionaría mejor en los nuevos (entonces) microprocesadores con memoria limitada. UCSD también convirtió el intérprete Pascal-P2 en una "máquina de bytes", nuevamente, porque encajaría mejor con 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 y coincidió con 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, se publicó en 1983 y se implementó y utilizó ampliamente en mainframes, minicomputadoras e IBM-PC y compatibles desde 16 bits hasta 32 bits. Los dos dialectos de Pascal más utilizados a finales 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 de 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 informativos del Grupo de Usuarios de Pascal en:

Boletines del grupo de usuarios de Pascal.

Objeto Pascal

Durante el trabajo en Lisa, Larry Tesler comenzó a mantener correspondencia con Wirth sobre la idea de agregar extensiones orientadas a objetos al lenguaje, para hacer de Pascal un lenguaje de programación multiparadigma . Esto llevó inicialmente a Clascal , introducido en 1983. Cuando el programa Lisa se desvaneció y fue reemplazado por Macintosh, se creó una versión adicional llamada Object Pascal . Este se introdujo 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 agregaron a Turbo Pascal con el lanzamiento de la versión 5.5 en 1989. [9] 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 cruzar -compilar código para otros sistemas. Free Pascal es una alternativa multiplataforma de código abierto con su propio IDE gráfico llamado Lazarus .

Implementaciones

Primeros compiladores

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 tipo C (Scallop de Max Engeli) y luego se tradujo a mano (por R. Schild) al propio Pascal para su arranque. [10] Estaba operativo a mediados de 1970. Desde entonces, muchos compiladores de Pascal han sido autohospedados de manera similar , es decir, el compilador está escrito en Pascal y generalmente es capaz de recompilarse a sí mismo cuando se agregan nuevas características al lenguaje, o cuando el compilador se va a portar a un nuevo ambiente. El compilador GNU Pascal es una excepción notable, ya que está escrito en C.

Welsh y Quinn completaron la primera migración exitosa del compilador CDC Pascal a otra computadora central 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 la minicomputadora Multum de Information Computer Systems (ICS) . El port Multum fue desarrollado – con miras a utilizar Pascal como lenguaje de programación de sistemas – por Findlay, Cupples, Cavouras y Davis, que trabajan 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 incorpora perfiles, rastreo y volcados postmortem formateados con reconocimiento de tipo) que fue implementada 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, 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 Norteamérica 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ó en Zurich un kit de adaptación del compilador 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 el último en llegar de Zúrich. La versión denominada Pascal-P1 fue acuñada a posteriori por las muchas fuentes diferentes de Pascal-P que existían. El compilador fue rediseñado para mejorar la portabilidad y publicado como Pascal-P2. Este código se mejoró posteriormente para convertirse en Pascal-P3, con un código intermedio compatible con Pascal-P2 y Pascal-P4, que no era compatible con versiones anteriores.

El compilador-intérprete Pascal-P4 aún se puede ejecutar y compilar en sistemas compatibles con Pascal original (al igual que Pascal-P2). Sin embargo, sólo 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.

Pascal-P6 es una continuación de Pascal-P5 que, junto con otras características, pretende ser un compilador para CPU específicas, incluida AMD64.

UCSD Pascal se separó 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 . [11] UCSD Pascal utilizó 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 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 eran, sino que se basaban en la longitud de palabra de 60 bits 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 central IBM System/370 ; fue nombrado compilador AAEC Pascal 8000 por la abreviatura del nombre de la comisión. [12]

Objeto Pascal y Turbo Pascal

Apple Computer creó su propia Lisa Pascal para 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 tanto en Lisa Compiladores 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 renombrara Turbo Pascal .

Turbo Pascal se volvió enormemente popular gracias a una agresiva estrategia de precios, a tener uno de los primeros IDE de pantalla completa y a un tiempo de respuesta muy rápido (solo unos segundos para compilar, vincular y ejecutar). Fue escrito y altamente optimizado completamente en lenguaje ensamblador , lo que lo hace 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 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. [13] [14] Turbo Pascal 5.5 tuvo una gran influencia en la comunidad Pascal, que comenzó a concentrarse principalmente en la PC IBM a fines de la década de 1980. Muchos aficionados a las PC que buscaban un reemplazo estructurado para BASIC utilizaron este producto. También empezó a ser adoptado por desarrolladores profesionales. Casi al mismo tiempo, se importaron varios conceptos de C para permitir a los programadores de Pascal utilizar 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 unitarias o modulares son lenguajes de programación modulares . Sin embargo, no proporciona un concepto de módulo anidado ni importación y exportación calificadas de símbolos específicos.

Otras variantes

Super Pascal agrega etiquetas no numéricas, una declaración de devolución y expresiones como nombres de tipos.

TMT Pascal fue el primer compilador compatible con Borland para modo protegido compatible con MS-DOS de 32 bits , OS/2 y Win32 . Extiende el lenguaje con sobrecarga de funciones y operadores .

Las universidades de Wisconsin-Madison , Zúrich , Karlsruhe y Wuppertal desarrollaron los compiladores Pascal-SC [15] [16] y Pascal-XSC [17] [18] [19] ( Extensiones para Computación Científica ), destinados a programar cálculos numéricos. . El desarrollo de Pascal-SC comenzó en 1978 y admitió ISO 7185 Pascal nivel 0, pero el soporte de nivel 2 se agregó en una etapa posterior. [20] Pascal-SC originalmente estaba destinado al procesador Z80 , pero luego fue reescrito para DOS ( x86 ) y 68000 . Pascal-XSC ha sido portado en varias ocasiones a los sistemas operativos Unix (Linux, SunOS , HP-UX , AIX ) y Microsoft/IBM (DOS con EMX , OS/2, Windows ). Funciona 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 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 lenguaje incluía algunas extensiones para facilitar la programación del sistema (por ejemplo, un equivalente a lseek). [21] Más tarde, el equipo de Sol pasó al proyecto ChorusOS para diseñar un sistema operativo distribuido . [22]

IP Pascal es una implementación del lenguaje de programación Pascal que utiliza Micropolis DOS, pero se trasladó rápidamente al CP/M-80 ejecutándose en el Z80. Se trasladó a los tipos de máquinas 80386 en 1994 y hoy existe 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 espacio de nombres , matrices dinámicas 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 Pascal original, 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 tipo ALGOL con palabras reservadas como if, then, else, while, fory case, que se extienden en una sola declaración o en un bloque de declaraciones begina . Pascal también tiene construcciones de estructuración de datos que no están incluidas en los tipos ALGOL 60end originales , como registros , variantes, punteros , enumeraciones y conjuntos y punteros de procedimientos. Tales construcciones fueron en parte heredadas o inspiradas de Simula 67, ALGOL 68 , el propio ALGOL W de Niklaus Wirth y sugerencias de CAR Hoare .

Los programas Pascal comienzan con la program palabra clave con una lista de descriptores de archivos externos como parámetros [23] (no requerido en Turbo Pascal, etc.); luego sigue el bloque principal entre corchetes por las palabras clave beginy end. Los puntos y coma separan las declaraciones y el punto (es decir, un punto) finaliza todo el programa (o unidad ). Las mayúsculas y minúsculas se ignoran en la fuente Pascal.

A continuación se muestra un ejemplo del código fuente en uso para un mensaje muy simple "¡Hola, mundo!" programa :

programa HolaMundo ( salida ) ; comenzar WriteLn ( '¡Hola mundo!' ) {No ";" es obligatorio después de la última declaración de un bloque;  agregar uno agrega una "declaración nula" al programa, que el compilador ignora.} end .   

Tipos de datos

Una Declaración de tipo en Pascal se utiliza 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:

El rango de valores permitido 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 reala 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 función de declaración de tipos de Pascal, por ejemplo.

escriba byte = 0 .. 255 ; byte_firmado = - 128 .. 127 ; cadena = matriz empaquetada [ 1 .. 255 ] de carácter ;            

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 bytetipo puede almacenarse en un número 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 manera 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 packedpalabra clave le dice al compilador que use el método de almacenamiento más eficiente 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 crear subrangos de cualquier tipo de datos ordinales (cualquier tipo simple excepto real):

var x : 1 .. 10 ; y : 'a' .. 'z' ;      

Tipos de conjuntos

A diferencia de otros lenguajes de programación de su época, Pascal admite un tipo de conjunto: [24]

var Conjunto1 : conjunto de 1 .. 10 ; Conjunto2 : conjunto de 'a' .. 'z' ;          

Un conjunto es un concepto fundamental para las matemáticas modernas y puede usarse 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 admite conjuntos. Por ejemplo, para muchos compiladores de Pascal:

si 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 resultar particularmente útiles, tanto en términos de rendimiento como de legibilidad:

si estoy en [ 0 .. 3 , 7 , 9 , 12 .. 15 ] entonces ...        

Para estos ejemplos, que involucran conjuntos en dominios pequeños, el rendimiento mejorado generalmente se logra cuando el compilador representa las variables del conjunto como vectores de bits . Los operadores establecidos pueden luego implementarse eficientemente como operaciones de código de máquina bit a bit.

Tipos de registros

Un ejemplo de un tipo de registro Pascal:

tipo coche = longitud del registro : entero ; ancho : extremo entero ;        

Un ejemplo de un tipo de registro variante:

escriba Forma = ( Círculo , Cuadrado , Triángulo ) ; Dimensiones = caja de registro 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 entre sí para ahorrar espacio.

Declaraciones de tipo

Los tipos se pueden definir a partir de otros tipos mediante declaraciones de tipo:

escriba x = entero ; y = x ; ...      

Además, se pueden construir tipos complejos a partir de tipos simples:

escriba a = matriz [ 1 .. 10 ] de número entero ; b = registro x : entero ; y : char {punto y coma adicional no es estrictamente necesario} fin ; c = archivo de a ;                     

Tipo de archivo

escriba a = archivo de número entero ; b = registro x : entero ; y : final del carácter ; 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 indica con f^ . Los procedimientos get (para lectura) y put (para escritura) mueven la variable del búfer al siguiente elemento. La lectura se introduce de manera que read(f, x) sea lo mismo que x := f^; obtener(f); . La escritura se introduce de manera que escribir(f, x) sea lo mismo que f^ := x; poner(f); El tipo textestá predefinido como archivo de carácter char. Si bien la variable de búfer podría usarse para inspeccionar el siguiente carácter a usar (comprobar si hay un dígito antes de leer un número entero), esto conduce a serios problemas con los programas interactivos en las primeras implementaciones, pero se resolvió más tarde con la "E/S diferida". concepto, que espera hasta que se acceda realmente a la variable del búfer del archivo antes de realizar operaciones con el archivo.

Tipos de puntero

Pascal admite el uso de punteros :

escriba pNodo = ^ Nodo ; Nodo = registrar un : entero ; b : carbón ; c : pFin del nodo ; var NodoPtr : pNodo ; 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 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 del registro, e inicializar el puntero c al puntero nulo ("NIL" en Pascal), las declaraciones serían:

nuevo ( PtrNodo ) ; ... NodoPtr ^. un := 10 ; NodoPtr ^. b := 'A' ; NodoPtr ^. c := nulo ; ...      

Esto también se podría hacer usando la withdeclaración, de la siguiente manera:

nuevo ( PtrNodo ) ; ... con NodePtr ^ comience a : = 10 ; b := 'A' ; c : = final nulo ; ...           

Dentro del alcance de la instrucción with , a y b se refieren a los subcampos del puntero de registro NodePtr y no al registro Node o al tipo de puntero pNode.

Se pueden crear listas , pilas y colas enlazadas 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 locales o estáticas 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 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 de eliminación (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 [ 25] 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 las pérdidas de memoria ).

Algunas de estas restricciones se pueden eliminar en los 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 comandos ' goto '.

mientras que a <> b haz WriteLn ( 'Esperando' ) ;     si a > b entonces WriteLn ( 'Condición cumplida' ) {no se permite punto y coma antes de lo contrario} else WriteLn ( 'Condición no cumplida' ) ;        para i := 1 a 10 no haga {ningún 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 ;             

Procedimientos y funciones

Pascal estructura los programas en procedimientos y funciones. Generalmente, se utiliza un procedimiento por sus efectos secundarios, mientras que una función se utiliza por su valor de retorno.

programa de impresión ( salida ) ; var i : entero ;   procedimiento PrintAnInteger ( j : entero ) ; comenzar ... terminar ;    función triple ( const x : entero ) : entero ; comenzar triple : = x * 3 terminar ;        comenzar {programa principal} ... PrintAnInteger ( i ) ; PrintAnInteger ( triple ( i )) final .    

Los procedimientos y funciones se pueden anidar a 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, 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 en ese orden. Este requisito de orden estaba originalmente pensado para permitir una compilación eficiente en un solo paso . Sin embargo, en algunos dialectos (como Delphi ) se ha relajado el estricto requisito de ordenamiento de las secciones de declaración.

Punto y coma como separadores de declaraciones

Pascal adoptó muchas características 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 declaración. No se necesita punto y coma antes de la endpalabra clave de una declaración de tipo de registro, un bloque o una declaración de caso ; antes de la untilpalabra clave de una declaración repetida; y antes de la elsepalabra clave de una declaració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 tipo ALGOL en el Informe Revisado de 1973 y 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 elsepalabra clave en una declaración if , porque elsesigue a una sola declaración, no a una secuencia de declaraciones. En el caso de los if 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í lo tiene) al terminar 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... explícito . [26]end

Recursos

Compiladores e intérpretes

Hay varios compiladores e intérpretes de Pascal disponibles para uso general:

IDE

Bibliotecas

Estándares

ISO/IEC 7185:1990 Pascal

En 1983, el lenguaje se estandarizó en la norma internacional IEC/ISO 7185 [33] y en varias normas locales específicas de cada país, incluidas las estadounidenses ANSI/IEEE770X3.97-1983 e ISO 7185:1983. Estos dos estándares solo se diferenciaban en que el estándar ISO incluía una extensión de "nivel 1" para arreglos conformes (un arreglo donde los límites del arreglo no se conocen hasta el tiempo de ejecución), mientras que ANSI no permitía esta extensión al original (Wirth versión) idioma. En 1989, se revisó la norma ISO 7185 (ISO 7185:1990) para corregir varios errores y ambigüedades encontrados en el documento original.

Se afirmó que la 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 nivel 1 al estándar, siendo el nivel 0 Pascal. sin matrices conformes. Esta incorporación se realizó a petición de CAR Hoare y con la aprobación de Niklaus Wirth. La causa precipitante fue que Hoare quería crear una versión Pascal de la Biblioteca de Algoritmos Numéricos (NAG) , que había sido escrita originalmente en FORTRAN, y descubrió que no era posible hacerlo sin una extensión que permitiera parámetros de matriz de diferentes tamaños. . Consideraciones similares motivaron la inclusión en la norma ISO 7185 de la posibilidad de especificar los tipos de parámetros de procedimiento 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 , [34] la segunda parte del "manual e informe del usuario de Pascal".

En las máquinas grandes (mainframes y minicomputadoras) en las que se originó Pascal, generalmente se siguieron los estándares. En la IBM PC , no lo eran. En los PC de IBM, los estándares de Borland Turbo Pascal y Delphi tienen el mayor número de usuarios. Por lo tanto, normalmente es importante comprender si una implementación particular corresponde al lenguaje Pascal original o a un dialecto de Borland del mismo.

Las versiones del lenguaje para IBM PC 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 lenguaje 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, [35] que es idéntico en contenido técnico [36] a IEEE/ANSI 770X3.160-1989 [37] A partir de 2019, soporte de Pascal extendido en el compilador FreePascal esta planeado. [38]

Variaciones

La versión Zürich de Pascal de Niklaus Wirth se publicó 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 características 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, eliminación, gotos entre procedimientos 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 del idioma Pascal-P. UCSD Pascal fue adoptado más tarde como Apple Pascal y continuó con varias versiones allí. Aunque UCSD Pascal en realidad amplió el subconjunto Pascal en el kit Pascal-P agregando construcciones Pascal estándar, 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 de Niklaus Algoritmos + Estructuras de datos = Programas ). Se agregaron varias construcciones para utilizar Pascal-FC como 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 sólo simulaba un entorno normal (justo), sino que también podía simular condiciones extremas (modo injusto).

Compiladores Pascal tipo Borland

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. Probablemente esto se deba a que el sistema UCSD era el sistema Pascal más común, adecuado para desarrollar aplicaciones en los sistemas de microprocesadores de recursos limitados disponibles en ese momento.

La versión 3 de Turbo Pascal envuelta en plástico y 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 tales Versiones como Delphi en mente.

Productos de software ( compiladores e IDE/ Desarrollo rápido de aplicaciones (RAD)) en esta categoría:

Lista de estándares relacionados

Recepción

Pascal generó una amplia variedad de respuestas en la comunidad informática, tanto críticas como elogiosas.

Crítica temprana

Si bien fueron muy populares 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 no ser adecuadas 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". [42] El problema más grave que describió Kernighan fue que los tamaños de las matrices y las longitudes de las cadenas 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 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 cuestiones menores. Además, afirmó que el lenguaje no proporcionaba ninguna construcción simple para "escapar" (ignorar a sabiendas y por la fuerza) restricciones y limitaciones. Quejas más generales de otras fuentes [25] [43] 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 consecuencias graves cuando se usaban declaraciones directas para definir tipos de punteros, o cuando las declaraciones de registros conducían a una recursividad mutua. , o cuando un identificador puede o no haberse utilizado en una lista de enumeración. Otra dificultad fue que, al igual que ALGOL 60 , el lenguaje no permitía que los procedimientos o funciones pasadas 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 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 condensadas en dos categorías: ISO y Borland-like. Pascal extendido aborda muchas de estas primeras críticas. Admite cadenas de longitud variable, inicialización de variables, compilación separada, operadores booleanos de cortocircuito y otherwisecláusulas predeterminadas () para declaraciones de casos. [44]

Ver también

Referencias

  1. ^ "Acerca de los delegados de Microsoft""". Archivado desde el original el 27 de junio de 2012. Observamos con mucho cuidado Delphi Object Pascal y construimos un prototipo funcional de referencias de métodos vinculados para comprender su interacción con el lenguaje de programación Java y sus API... Nuestra conclusión fue que las referencias de métodos vinculados son innecesarias y perjudiciales para el lenguaje. Esta decisión se tomó en consulta con Borland International, que tenía experiencia previa con referencias de métodos vinculados en Delphi Object Pascal .
  2. ^ Investigación TechMetrix (1999). "Historia de Java" (PDF) . Informe de servidores de aplicaciones Java . Archivado desde el original (PDF) el 29 de diciembre de 2010 . Consultado el 16 de octubre de 2009 . El proyecto se llevó a cabo con el nombre "verde" y el lenguaje se basó en un modelo antiguo de UCSD Pascal , que permite generar código interpretativo.
  3. ^ "Una conversación con James Gosling - Cola ACM". Archivado desde el original el 16 de julio de 2015 . Consultado el 11 de agosto de 2015 .
  4. ^ Wirth, Niklaus (2000). "El desarrollo de lenguajes de programación procesal Contribuciones y perspectivas personales". Lenguajes de programación modulares . Apuntes de conferencias sobre informática. vol. 1897, págs. 1-10. doi :10.1007/10722581_1. ISBN 978-3-540-67958-5.
  5. ^ Hertzfeld, Andy. "Hungarian folklore.org Archivado el 18 de noviembre de 2015 en Wayback Machine : Historias de Macintosh. Consultado el 6 de marzo de 2012.
  6. ^ https://www.computerhistory.org/atchm/adobe-photoshop-source-code/ Archivado el 7 de mayo de 2014 en Wayback Machine , código fuente de Adobe Photoshop
  7. ^ "Exhibición de aplicaciones RAD Studio". 2021-10-29.
  8. ^ tiobe.com Archivado el 15 de marzo de 2012 en Wayback Machine , Índice de la comunidad de programación de enero de 2011.
  9. ^ "Software antiguo: Turbo Pascal v5.5". Archivado desde el original el 24 de noviembre de 2010 . Consultado el 17 de mayo de 2018 .
  10. ^ Computadoras y Computación. Una perspectiva personal. Archivado el 10 de mayo de 2017 en Wayback Machine por Niklaus Wirth.
  11. ^ cbi.umn.edu, "Una entrevista con John Brackett y Doug Ross" [ enlace muerto permanente ] , p15, Instituto Charles Babbage, 2004
  12. ^ Establecimiento de investigación de la Comisión Australiana de Energía Atómica, Lucas Heights, Informe de la rama de ciencia y tecnología nuclear, Investigación divisional (PDF) . Agencia Internacional de Energía Atómica (IEAE) (Reporte). 1977. pág. 22.
  13. ^ Jon Udell, Accidente de los pascales orientados a objetos, BYTE, julio de 1989.
  14. ^ M. I. Trofimov, ¿El fin de Pascal?, BYTE, marzo de 1990, p. 36.
  15. ^ Rall, LB (1987). "Una introducción al lenguaje informático científico Pascal-SC". Ordenadores . 14 : 53–69. doi :10.1016/0898-1221(87)90181-7.
  16. ^ PI (29 de agosto de 1986). "Cadmus jetzt mit Kulisch-Arithmetik - Uni Karlsruhe gibt Pascal-Compiler nach München" [Cadmus ahora viene con aritmética de Kulisch - La Universidad de Karlsruhe entrega el compilador Pascal a Munich]. Computerwoche (en alemán). Múnich – Karlsruhe, Alemania: IDG Business Media GmbH . Archivado desde el original el 30 de mayo de 2016 . Consultado el 30 de mayo de 2016 .
  17. ^ "Pascal-XSC: Pascal para informática científica extendida". Archivado desde el original el 5 de enero de 2014.
  18. ^ "Software XSC". Archivado desde el original el 1 de noviembre de 2015 . Consultado el 11 de agosto de 2015 .
  19. ^ "Universitaet Wuppertal: Wissenschaftliches Rechnen / Softwaretechnologie". Archivado desde el original el 6 de noviembre de 2015 . Consultado el 11 de agosto de 2015 .
  20. ^ Bamberger, Lothar; Davenport, James H.; Fischer, Hans-Christoph; Kok, enero; Schumacher, Gunter; Ullrich, cristiano; Wallis, Peter JL; Invierno, Dik T.; Wolff von Gudenberg, Jürgen (1990). Wallis, Peter JL (ed.). Mejora de la programación en punto flotante (1ª ed.). Bath, Reino Unido: John Wiley & Sons Ltd. ISBN  0-471-92437-7.
  21. ^ Michel Gien, "The SOL Operating System", en Usenix Summer '83 Conference, Toronto, ON, (julio de 1983), págs.
  22. ^ "Descripción general de los sistemas operativos distribuidos CHORUS" (PDF) . Sistemas de coro . 1991. Archivado desde el original (PDF) el 7 de febrero de 2015, a través de cs.berkeley.edu.
  23. ^ Pascal ISO 7185: 1990 Archivado el 17 de junio de 2012 en Wayback Machine 6.10
  24. ^ Mandell, Steven L. (1987). Programación Pascal hoy . Compañía Editorial del Oeste. ISBN 978-0-314-33935-5.
  25. ^ ab J. Welsh, WJ Sneeringer y CAR Hoare, "Ambigüedades e inseguridades en Pascal", Software: práctica y experiencia 7 , págs. 685–696 (1977)
  26. ^ Pascal, Nell Dale y Chip Weems, "Dangling Else", p. 160–161 Archivado el 18 de marzo de 2017 en la Wayback Machine.
  27. ^ "Pascal-S: un subconjunto y su implementación", N. Wirth en Pascal - El lenguaje y su implementación, por DW Barron, Wiley 1979.
  28. ^ "Guía del usuario de VAX-11 Pascal V1.0" (PDF) .
  29. ^ ab "Descripción del producto de software VSI Pascal para OpenVMS" (PDF) . VSI. 2017. Archivado desde el original (PDF) el 18 de abril de 2021 . Consultado el 7 de febrero de 2022 .
  30. ^ "Entrevista con un arquitecto Pascal - Compaq Pascal". Archivado desde el original el 19 de octubre de 2021 . Consultado el 28 de mayo de 2022 .
  31. ^ "Descripción del producto del software Compaq Pascal versión 5.8 para Tru64 UNIX". Archivado desde el original el 25 de julio de 2020 . Consultado el 28 de mayo de 2022 .
  32. ^ "Entrevista a John Reagan de VSI sobre GEM frente a LLVM para X86/64". Sistemas eCube . 2019-03-12. Archivado desde el original el 12 de agosto de 2020 . Consultado el 7 de febrero de 2022 .
  33. ^ ISO/IEC 7185:1990 Pascal (PDF) . Archivado desde el original (PDF) el 27 de enero de 2016 . Consultado el 16 de septiembre de 2014 .
  34. ^ Wirth, Niklaus (julio de 1973). El lenguaje de programación Pascal (Informe revisado) . ETH Zúrich. doi :10.3929/ethz-a-000814158.
  35. ^ Pascal extendido: ISO/IEC 10206:1990. Archivado desde el original el 27 de marzo de 2016 . Consultado el 16 de septiembre de 2014 .
  36. ^ "Estándares lingüísticos: Pascal, Pascal extendido, Fortan". Archivado desde el original el 14 de julio de 2014 . Consultado el 16 de septiembre de 2014 .
  37. ^ Estándar IEEE/ANSI para el lenguaje de programación Pascal extendido . 1990. doi :10.1109/IEEESTD.1990.101061. ISBN 978-0-7381-4247-0.
  38. ^ "Pascal extendido: wiki gratuita de Pascal". wiki.freepascal.org .
  39. ^ "Pascal virtual para OS/2". Archivado desde el original el 30 de agosto de 2011 . Consultado el 3 de abril de 2016 .
  40. ^ Wolfgang (15 de octubre de 2020). "WDSibyl: entorno de desarrollo visual". WDSibyl.org . Archivado desde el original el 12 de febrero de 2020 . Consultado el 20 de abril de 2020 .
  41. ^ "netlabs.org - Proyecto: Open Sibyl". Archivado desde el original el 4 de marzo de 2016 . Consultado el 3 de abril de 2016 .
  42. ^ Brian W. Kernighan (1981). "Por qué Pascal no es mi lenguaje de programación favorito". Archivado el 28 de abril de 2009 en Wayback Machine.
  43. ^ O. Lecarme, P. Desjardins, "Más comentarios sobre el lenguaje de programación Pascal", Acta Informatica 4 , págs. 231-243 (1975).
  44. ^ "Pascal extendido". Archivado desde el original el 18 de octubre de 2015 . Consultado el 17 de octubre de 2015 .

Otras lecturas