Object Pascal es una extensión del lenguaje de programación Pascal que proporciona funciones 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. Esto pasó a llamarse Objeto Pascal. Hasta mediados de la década de 1980, Object Pascal fue el principal lenguaje de programación para las primeras versiones del marco de aplicaciones MacApp . El lenguaje perdió su lugar como principal lenguaje de desarrollo en Mac en 1991 con el lanzamiento de MacApp 3.0, basado en C++ . El apoyo oficial terminó 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 . Luego, Symantec desarrolló Think Class Library (TCL), basada en conceptos de MacApp, a la que se podía llamar tanto desde Object Pascal como desde THINK C. La suite Think desplazó en gran medida a MPW como principal plataforma de desarrollo en Mac a finales de los años 1980.
Symantec portó Object Pascal a la PC y desarrolló un marco 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 usado en Delphi creado por Anders Hejlsberg . Delphi siguió siendo la corriente principal para las aplicaciones empresariales en PC hasta principios de la década de 2000, y fue parcialmente desplazada 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 los últimos se encontraba el sistema UCSD Pascal , que se compilaba en un formato de código p-System intermedio que luego podía ejecutarse en múltiples plataformas. Apple obtuvo la licencia de UCSD y la utilizó como base para su sistema Apple Pascal para Apple II y Apple III .
Pascal se convirtió en uno de los idiomas principales de la empresa en este período. Con el inicio del proyecto Apple Lisa , se seleccionó Pascal como lenguaje de programación principal de la plataforma, aunque esta vez como compilador a diferencia del 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 anterior de Pascal orientada a objetos llamada Clascal , que estaba disponible en la computadora Lisa .
Se necesitaba Object Pascal para soportar MacApp , un marco de aplicación expandible para Macintosh 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 producto en 1986.
También se implementó una extensión de Object Pascal en el entorno de desarrollo integrado (IDE) 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. Posteriormente, Symantec lanzó una versión no oficial 4.5d4 sin costo alguno.
Apple dejó de admitir Object Pascal cuando pasaron de los chips de la serie Motorola 68000 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 dirigido 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 PowerPC , incluso la arquitectura después de que Apple y Symantec abandonaran el soporte. MacApp 2.0, escrito en Object Pascal, fue portado al PowerPC usando CodeWarrior . [4] [5]
En 1986, Borland introdujo extensiones similares, también denominadas Object Pascal, al producto Turbo Pascal para Macintosh, y en 1989 para Turbo Pascal 5.5 para DOS. Cuando Borland pasó de DOS a Windows en 1994, crearon un sucesor de Turbo Pascal, llamado Delphi , e introdujeron 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 aún se podía compilar el código que utilizaba el modelo de objetos Turbo Pascal, 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 niega tener que llamar a los procedimientos New
y Dispose
), propiedades, punteros a métodos y algunas otras cosas. Estos se inspiraron en el borrador de trabajo ISO para extensiones orientadas a objetos, pero muchas de las diferencias con el dialecto de Turbo Pascal (como el requisito del borrador de que todos los métodos sean virtuales ) fueron ignoradas.
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 es compatible. [6]
asm
secciones que son JavaScript simple pero que tienen acceso a símbolos Pascal, o clases externas que se asignan directamente a clases prototipo de JavaScript. Smart Pascal introduce herencia verdadera, clases, clases parciales, interfaces, una tabla de métodos virtuales y muchas otras construcciones avanzadas que no forman parte de JavaScript de forma predeterminada.Los compiladores de 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 y motores de scripting de Object Pascal 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 justo a tiempo (JIT). Modern Pascal proporciona 3 intérpretes diferentes: una interfaz de línea de comandos (CLI), módulo Apache (Celerity) y CodeRunner (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. . [12]
Aquí hay varios programas "Hello World" en diferentes versiones de Object Pascal.
programa ObjetoPascalExample ; escriba THelloWorld = procedimiento de objeto Put ; fin ; var HolaMundo : HolaMundo ; procedimiento HolaMundo . Poner ; comenzar ShowMessage ( '¡Hola, mundo!' ) ; fin ; comenzar nuevo ( HolaMundo ) ; Hola Mundo . Poner ; Eliminar ( HolaMundo ) ; fin .
Todavía es compatible con Delphi y Free Pascal. FPC también empaqueta sus propios sustitutos para las bibliotecas/unidades. Delfos no lo hace. La serie Free Pascal 1.0 y el IDE en modo texto FPC son las bases de código abiertas más grandes en este dialecto. Free Pascal 2.0 fue reescrito en un dialecto más parecido a Delphi, y el IDE en modo texto y los marcos relacionados (Free Vision) son las únicas partes en la versión TP de Object Pascal.
programa ObjetoPascalExample ; escriba THelloWorld = procedimiento de objeto Put ; fin ; procedimiento HolaMundo . Poner ; comenzar WriteLn ( '¡Hola, mundo!' ) ; fin ; var HolaMundo : HolaMundo ; {asignado en la pila y puede usarse sin asignación explícita. } comenzar HolaMundo . Poner ; fin .
programa ObjetoPascalExample ; escriba PHelloWorld = ^ THelloWorld ; THelloWorld = procedimiento de objeto Put ; fin ; procedimiento HolaMundo . Poner ; comenzar WriteLn ( '¡Hola, mundo!' ) ; fin ; var HolaMundo : PHelloMundo ; {este es un puntero escrito a THelloWorld} comenzar nuevo ( HolaMundo ) ; Hola mundo ^. Poner ; Eliminar ( HolaMundo ) ; fin .
Otro ejemplo:
programa ObjetoPascalExample ; escriba PHelloWorld = ^ THelloWorld ; THelloWorld = procedimiento de objeto Put ; fin ; procedimiento HolaMundo . Poner ; comenzar WriteLn ( '¡Hola, mundo!' ) ; fin ; var HolaMundo : PHelloMundo ; { este es un puntero escrito a THelloWorld } HelloWorld2 : ^ THelloWorld ; { esto es exactamente lo mismo con una sintaxis diferente } HolaMundo3 : ^ HolaMundo ; HolaMundo4 : PHelloMundo ; comenzar { 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í... } Nuevo ( HolaMundo ) ; {una instancia} HolaMundo4 := HolaMundo ; { esto es válido - una copia de puntero } HolaMundo2 := HolaMundo ; {esto es válido: una copia de puntero} Nuevo ( HolaMundo3 ) ; {una segunda instancia} HolaMundo4 := HolaMundo3 ; { esto es válido - una copia de puntero } HolaMundo2 := HolaMundo3 ; {esto es válido: una copia de puntero} Dispose ( HolaMundo ) ; {asigna sólo dos instancias} Dispose ( HelloWorld3 ) ; { por lo que debe liberar sólo dos instancias } fin .
Esto funciona basándose en una copia de puntero, a menos que haya una asignación específica para una copia más profunda.
programa ObjetoPascalExample ; escriba THelloWorld = procedimiento de clase Put ; fin ; procedimiento HolaMundo . Poner ; comenzar Writeln ( '¡Hola, mundo!' ) ; fin ; var HolaMundo : HolaMundo ; {este es un puntero implícito} comenzar HolaMundo := HolaMundo . Crear ; { constructor devuelve un puntero a un objeto de tipo THelloWorld } HelloWorld . Poner ; Hola Mundo . Gratis ; {esta línea desasigna el objeto THelloWorld señalado por HelloWorld} fin .
Tenga en cuenta que la construcción del objeto todavía está disponible en Delphi y Free Pascal.
espacio de nombres ObjectPascalExample ; interfaz escriba ConsoleApp = clase método de clase Principal ; fin ; THelloWorld = método de clase Put ; fin ; implementación método SaludoMundo . Poner ; comenzar consola . WriteLine ( '¡Hola, mundo!' ) ; fin ; Método de clase ConsoleApp . Principal ; comenzar var HolaMundo : = nuevo HolaMundo ; Hola Mundo . Poner ; fin ; fin .
escriba THelloWorld = procedimiento de clase Put ; comenzar PrintLn ( '¡Hola, mundo!' ) ; fin fin ; var HolaMundo := HolaMundo . Crear ; Hola Mundo . 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 funciones en Object Pascal con extensiones para Delphi y extensiones para 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 de Delphi, y que tanto Delphi (parcial) como Free Pascal (más extenso) admitan la sobrecarga del operador . Delphi también ha introducido muchas otras características desde la versión 7, [13] incluidas las genéricas. Mientras que FreePascal intenta ser compatible con Delphi en el modo de compatibilidad de Delphi, también suele introducir muchas características nuevas en el lenguaje que no siempre están disponibles en Delphi.