Object Pascal es una extensión del lenguaje de programación Pascal que proporciona características de programación orientada a objetos (OOP) como clases y métodos .
El lenguaje fue desarrollado originalmente por Apple Computer como Clascal para el sistema de desarrollo Lisa Workshop. Cuando Lisa dio paso a Macintosh , Apple colaboró con Niklaus Wirth , el autor de Pascal, para desarrollar una versión oficialmente estandarizada de Clascal. Esta se renombró Object Pascal. Hasta mediados de la década de 1980, Object Pascal fue el lenguaje de programación principal para las primeras versiones del marco de aplicaciones MacApp . El lenguaje perdió su lugar como el principal lenguaje de desarrollo en Mac en 1991 con el lanzamiento de MacApp 3.0 basado en C++ . El soporte oficial finalizó en 1996.
Symantec también desarrolló un compilador para Object Pascal para su producto Think Pascal, que podía compilar programas mucho más rápido que el Macintosh Programmer's Workshop (MPW) de Apple. Symantec luego desarrolló la Think Class Library (TCL), basada en conceptos de MacApp, que podía ser invocada tanto desde Object Pascal como desde THINK C. La suite Think desplazó en gran medida a MPW como la principal plataforma de desarrollo en Mac a fines de la década de 1980.
Symantec adaptó Object Pascal a la PC y desarrolló un marco de trabajo de objetos similar en esa plataforma. A diferencia de TCL, que finalmente migró a C++, las bibliotecas de PC siguieron basándose principalmente en Pascal.
Borland agregó soporte para programación orientada a objetos a Turbo Pascal 5.5, que eventualmente se convertiría en la base del dialecto Object Pascal utilizado en Delphi creado por Anders Hejlsberg . Delphi siguió siendo la opción principal para aplicaciones comerciales en PC hasta principios de la década de 2000 y fue parcialmente reemplazado en la década de 2000 con la introducción de .NET Framework que incluía C# de Hejlsberg .
Pascal se convirtió en un lenguaje importante en el mundo de la programación en la década de 1970, con implementaciones de alta calidad en la mayoría de las plataformas de minicomputadoras y microcomputadoras . Entre estas últimas se encontraba el sistema UCSD Pascal , que compilaba a un formato de código p-System intermedio que luego podía ejecutarse en múltiples plataformas. Apple licenció UCSD y lo utilizó como base para su sistema Apple Pascal para Apple II y Apple III .
Pascal se convirtió en uno de los principales lenguajes de programación de la empresa en este período. Con el inicio del proyecto Apple Lisa , Pascal fue seleccionado como el lenguaje de programación principal de la plataforma, aunque esta vez como compilador en contraposición al intérprete p-System .
Object Pascal es una extensión del lenguaje Pascal que fue desarrollado en Apple Computer por un equipo dirigido por Larry Tesler en consulta con Niklaus Wirth , el inventor de Pascal. [2] Desciende de una versión orientada a objetos anterior de Pascal llamada Clascal , que estaba disponible en la computadora Lisa .
Object Pascal era necesario para soportar MacApp , un marco de trabajo de aplicaciones Macintosh expandible que ahora se denominaría biblioteca de clases . Las extensiones de Object Pascal y MacApp fueron desarrolladas por Barry Haynes, Ken Doyle y Larry Rosenstein, y fueron probadas por Dan Allen. Larry Tesler supervisó el proyecto, que comenzó a principios de 1985 y se convirtió en un producto en 1986.
También se implementó una extensión de Object Pascal en el entorno de desarrollo integrado (IDE) de Think Pascal. El IDE incluye el compilador y un editor con resaltado y verificación de sintaxis, un potente depurador y una biblioteca de clases. [3] Muchos desarrolladores prefirieron Think Pascal a la implementación de Object Pascal de Apple porque Think Pascal ofrecía un ciclo de compilación , enlace y depuración mucho más rápido y una estrecha integración de sus herramientas. La última versión oficial de Think Pascal fue la 4.01, en 1992. Symantec lanzó más tarde una versión no oficial 4.5d4 sin cargo.
Apple abandonó el soporte para Object Pascal cuando pasó de los chips de la serie 68000 de Motorola a la arquitectura PowerPC de IBM en 1994. MacApp 3.0 ya había sido reescrito en C++ y portado a esta plataforma.
Metrowerks ofreció con CodeWarrior un compilador Object Pascal para Macintosh que apuntaba tanto a 68k como a PowerPC , tanto en su IDE como en herramientas MPW. Los desarrolladores de Macintosh que usaban Object Pascal tenían un camino para migrar a la arquitectura PowerPC , incluso después de que tanto Apple como Symantec dejaran de brindar soporte. MacApp 2.0, escrita en Object Pascal, fue migrada a PowerPC usando CodeWarrior . [4] [5]
En 1986, Borland introdujo extensiones similares, también llamadas Object Pascal, para el producto Turbo Pascal para Macintosh, y en 1989 para Turbo Pascal 5.5 para DOS. Cuando Borland cambió su enfoque de DOS a Windows en 1994, creó un sucesor de Turbo Pascal, llamado Delphi , e introdujo un nuevo conjunto de extensiones para crear lo que ahora se conoce como el lenguaje Delphi.
El desarrollo de Delphi comenzó en 1993 y Delphi 1.0 se lanzó oficialmente en los Estados Unidos el 14 de febrero de 1995. Si bien el código que utilizaba el modelo de objetos de Turbo Pascal aún se podía compilar, Delphi presentó una nueva sintaxis que utilizaba la palabra clave class
en lugar de object
, el constructor Create y un destructor virtual Destroy (y que negaba la necesidad de llamar a los procedimientos New
y Dispose
), propiedades, punteros de método y algunas otras cosas. Estas se inspiraron en el borrador de trabajo de ISO para extensiones orientadas a objetos, pero se ignoraron muchas de las diferencias con el dialecto de Turbo Pascal (como el requisito del borrador de que todos los métodos fueran virtuales ).
El lenguaje Delphi ha seguido evolucionando a lo largo de los años para admitir construcciones como matrices dinámicas , genéricos y métodos anónimos . La antigua sintaxis de objetos introducida por Apple ("Tipos de objetos de estilo antiguo") todavía se admite. [6]
asm
secciones que son JavaScript simple pero tienen acceso a símbolos Pascal o clases externas que se asignan directamente a clases prototípicas de JavaScript. Smart Pascal introduce herencia real, clases, clases parciales, interfaces, una tabla de métodos virtuales y muchas otras construcciones avanzadas que no son parte de JavaScript de forma predeterminada.Los compiladores Object Pascal están disponibles para una amplia gama de sistemas operativos y arquitecturas.
Pascal Script (anteriormente InnerFuse ) y DWScript (Delphi Web Script) son intérpretes de Object Pascal y motores de scripting de código abierto escritos en Delphi. Admiten subconjuntos de Object Pascal. DWScript también puede compilar código Object Pascal en código JavaScript (Smart Pascal) y admite la compilación en tiempo real (JIT). Modern Pascal proporciona 3 intérpretes diferentes: una interfaz de línea de comandos (CLI), un módulo Apache (Celerity) y CodeRunner (una solución similar a node.js capaz de manejar diferentes scripts por puerto), además de la capacidad de compilar y proteger el código fuente de un script . [15]
Aquí hay varios programas "Hola Mundo" en diferentes versiones de Object Pascal.
programa ObjetoPascalEjemplo ; tipo THelloWorld = objeto procedimiento Put ; fin ; var HolaMundo : HolaMundo ; procedimiento THelloWorld . Put ; begin ShowMessage ( '¡Hola, mundo!' ) ; end ; comenzar Nuevo ( HolaMundo ) ; HolaMundo . Poner ; Disponer ( HolaMundo ) ; fin .
Todavía se admite en Delphi y Free Pascal. FPC también incluye sus propios sustitutos para las bibliotecas/unidades. Delphi no lo hace. La serie Free Pascal 1.0 y el IDE de modo texto de FPC son las bases de código abiertas más grandes en este dialecto. Free Pascal 2.0 se reescribió en un dialecto más parecido a Delphi, y el IDE de modo texto y los marcos relacionados (Free Vision) son las únicas partes en la versión TP de Object Pascal.
programa ObjetoPascalEjemplo ; tipo THelloWorld = objeto procedimiento Put ; fin ; procedimiento THelloWorld . Put ; begin WriteLn ( '¡Hola, mundo!' ) ; end ; var HelloWorld : THelloWorld ; { asignado en la pila y se puede usar sin asignación explícita. } begin HelloWorld . Put ; end .
programa ObjetoPascalEjemplo ; tipo PHelloWorld = ^ THelloWorld ; THelloWorld = objeto procedimiento Put ; fin ; procedimiento THelloWorld . Put ; begin WriteLn ( '¡Hola, mundo!' ) ; end ; var HelloWorld : PHelloWorld ; { este es un puntero tipado a un THelloWorld } comenzar Nuevo ( HolaMundo ) ; HolaMundo ^. Poner ; Disponer ( HolaMundo ) ; fin .
Otro ejemplo:
programa ObjetoPascalEjemplo ; tipo PHelloWorld = ^ THelloWorld ; THelloWorld = objeto procedimiento Put ; fin ; procedimiento THelloWorld . Put ; begin WriteLn ( '¡Hola, mundo!' ) ; end ; var HelloWorld : PHelloWorld ; { este es un puntero tipado a un THelloWorld } HelloWorld2 : ^ THelloWorld ; { esto es exactamente lo mismo con una sintaxis diferente } HelloWorld3 : ^ THelloWorld ; HelloWorld4 : PHelloWorld ; begin { Esto funciona de manera similar al código anterior, tenga en cuenta la asignación y desasignación, aunque muchas personas se confunden. En el pasado hubo un ejemplo incorrecto con comentarios incorrectos aquí... } New ( HelloWorld ) ; { una instancia } HelloWorld4 := HelloWorld ; { esto es válido - una copia de puntero } HelloWorld2 := HelloWorld ; { esto es válido - una copia de puntero } New ( HelloWorld3 ) ; { una segunda instancia } HelloWorld4 := HelloWorld3 ; { esto es válido - una copia de puntero } HelloWorld2 := HelloWorld3 ; { esto es válido - una copia de puntero } Dispose ( HelloWorld ) ; { asigna solo dos instancias } Dispose ( HelloWorld3 ) ; { por lo que debe liberar solo dos instancias } fin .
Esto funciona según la copia del puntero, a menos que haya una asignación específica para una copia más profunda.
programa ObjetoPascalEjemplo ; tipo THelloWorld = clase procedimiento Put ; fin ; procedimiento THelloWorld . Put ; begin Writeln ( '¡Hola, mundo!' ) ; end ; var HelloWorld : THelloWorld ; { este es un puntero implícito } begin HelloWorld := THelloWorld . Create ; { el constructor devuelve un puntero a un objeto de tipo THelloWorld } HelloWorld . Put ; HelloWorld . Free ; { esta línea desasigna el objeto THelloWorld al que apunta HelloWorld } end .
Tenga en cuenta que la construcción de objetos todavía está disponible en Delphi y Free Pascal.
espacio de nombres ObjectPascalExample ; interfaz tipo ConsoleApp = clase método de clase Principal ; fin ; THelloWorld = método de clase Put ; fin ; implementación método THelloWorld . Put ; comienzo Console . WriteLine ( '¡Hola, mundo!' ) ; fin ; método de clase ConsoleApp . Main ; begin var HelloWorld := new THelloWorld ; HelloWorld . Put ; end ; fin .
tipo THelloWorld = clase procedimiento Put ; begin PrintLn ( '¡Hola, mundo!' ) ; end end ; var HolaMundo := THelloWorld . Crear ; HolaMundo . Poner ;
La implementación del método también se puede realizar en una ubicación distinta como en otros dialectos de Object Pascal.
Se han introducido continuamente muchas características en Object Pascal con extensiones a Delphi y extensiones a FreePascal. En reacción a las críticas, Free Pascal ha adoptado genéricos con la misma sintaxis que Delphi, siempre que se seleccione el modo de compatibilidad con Delphi, y tanto Delphi (parcial) como Free Pascal (más extenso) admitan la sobrecarga de operadores . Delphi también ha introducido muchas otras características desde la versión 7, [16] incluyendo genéricos. Mientras que FreePascal intenta ser compatible con Delphi en el modo de compatibilidad con Delphi, también suele introducir muchas características nuevas al lenguaje que no siempre están disponibles en Delphi.