Por qué usar Pascal
(castle-engine.io)- Object Pascal apunta a combinar un lenguaje moderno orientado a objetos y fácil de leer con rendimiento nativo, y es una opción para crear aplicaciones mantenibles en múltiples plataformas
- Gracias al tipado fuerte, las comprobaciones en tiempo de compilación y las comprobaciones en tiempo de ejecución, es más fácil filtrar errores como nombres mal escritos o incompatibilidades de tipos antes de que lleguen al usuario
- Si hace falta, se pueden usar punteros, código específico por SO o CPU, e incluso ensamblador, pero Castle Game Engine elige mantener código rápido sin ensamblador
- Puede apuntar a una amplia variedad de destinos, desde Windows, Linux y macOS hasta móviles, consolas y web, y en Castle Game Engine el código del motor y el código del juego están escritos en el mismo lenguaje
- Con integración con FPC, Lazarus, Delphi y VS Code, además de conexión con varias bibliotecas, se puede armar un flujo de desarrollo práctico dentro del ecosistema Pascal
Object Pascal legible y seguro en tipos
- Object Pascal se presenta como un lenguaje multiplataforma moderno, legible, rápido y seguro en tipos
- Si ya conoces otros lenguajes orientados a objetos, es relativamente fácil de aprender, y puedes usar como material de estudio Modern Object Pascal Introduction for Programmers
- Incluye las funciones esperadas de un lenguaje moderno orientado a objetos
- clases
- unidades
- propiedades
- genéricos
- interfaces
- reflexión
- cierres
- La sintaxis se enfoca en un código fácil de leer
- Para la seguridad de tipos, ofrece tipos separados como boolean, string, char, set, enum y range
- Las conversiones seguras, como asignar un entero a un float, se manejan fácilmente
- Las demás conversiones deben hacerse de forma explícita
Cómo detecta errores en compilación y en ejecución
- Object Pascal pone énfasis en las comprobaciones en tiempo de compilación
- Al hacer refactorizaciones como reorganizar estructuras de datos, se puede lograr que el compilador revele los puntos que necesitan cambios
- Errores evidentes como nombres mal escritos o incompatibilidades de tipos no pasan la compilación y no llegan al usuario
- También ofrece comprobaciones adicionales en tiempo de ejecución
- comprobación de límites de arreglos
- comprobación de desbordamiento de enteros
- assertion
- comprobación de fugas de memoria
- Las comprobaciones en tiempo de ejecución se usan para detectar problemas en la versión debug, y pueden desactivarse en la versión release cuando el rendimiento es importante
- Al compilar con el editor de CGE, los modos debug / release se configuran automáticamente, y se puede cambiar el modo desde el menú “Run”
- Como documentación relacionada, se puede consultar What are range and overflow checks (and errors) in Pascal y Detecting Memory Leaks
Rendimiento nativo y control de bajo nivel según sea necesario
- Object Pascal se compila a código nativo, por lo que es fácil asegurar un buen rendimiento base de ejecución
- En aplicaciones normales, no suele ser necesario bajar hasta optimizaciones de muy bajo nivel
- Si hace falta, se pueden usar funciones de bajo nivel en la medida que se necesite
- uso de punteros
- aritmética de punteros
- escritura de código específico por SO o CPU
- agregar código ensamblador
- Castle Game Engine busca una ejecución rápida sin usar nada de código ensamblador, para mejorar la portabilidad y la legibilidad del código
- La compilación también suele ser rápida; en un caso, al abrir un proyecto nuevo por primera vez, la compilación para escritorio tardó 2.5 segundos y la compilación para Android 10.1 segundos
Múltiples plataformas y la forma de desarrollo de Castle Game Engine
- Object Pascal puede usarse para diferentes plataformas
- escritorio: Windows, Linux, macOS, Raspberry Pi, FreeBSD, probablemente cualquier Unix
- móviles: Android, iOS
- consolas: Nintendo Switch
- web: WebAssembly, JS usando pas2js
- Las plataformas compatibles con Castle Game Engine pueden consultarse en Castle Game Engine platforms supported
- Para ver el conjunto completo de destinos posibles, consulta FPC target platforms y Delphi target platforms
- En Castle Game Engine, el código del motor y el código del juego están escritos en el mismo lenguaje
- El motor es de código abierto y, si lo necesitas, puedes hacer un fork de CGE y modificarlo según tus necesidades
Ecosistema de bibliotecas y herramientas de desarrollo
- Pascal cuenta con bibliotecas y unidades existentes en varias áreas
- bases de datos
- XML, JSON
- IA
- blockchain
- redes
- Es fácil integrar o enlazar bibliotecas existentes que tengan una API en C
- renderizadores
- bibliotecas de sonido
- motores de física
- También se pueden usar Python libraries in Pascal
- El ecosistema principal de herramientas es el siguiente
3 comentarios
Delphi... qué recuerdos. Borland, Delmadang..
En la época en que desarrollaba para Windows, de verdad me parecía que Object Pascal con Delphi era lo mejor.
Comentarios de Hacker News
Quienes usaron Delphi antes probablemente ya conozcan Lazarus. Lazarus es, en la práctica, casi una reimplementación de código abierto, y corre y compila de forma nativa en casi cualquier lugar, incluso en placas ARM como Raspberry Pi
Aun así, instalar bibliotecas puede ser engorroso, así que se creó FpcUp, y luego FpcUpDeluxe, para automatizar la instalación del IDE, módulos y varios addons bastante interesantes
https://wiki.freepascal.org/fpcupdeluxe
También hay una demo de un widget de tablero hecho rápidamente con los widgets gratuitos incluidos en FpcUpDeluxe
https://ibb.co/9bchx7T
FpcUpDeluxe también funciona en Alpine Linux; basta con descargar la versión musl desde la página de lanzamientos. Eso abre la posibilidad de poner un tablero incluso en sistemas muy pequeños. El código compila de forma nativa en varias plataformas y se ejecuta rápido, sin necesidad de un intérprete ni de un navegador web
La última vez que usé Lazarus y Delphi, Unicode era complicado, y en general se sentía como si asumiera ASCII
[0] https://github.com/markmal/freeship-plus-in-lazarus
[1] http://web.archive.org/web/20160128212152/http://hydronship.net/index.php?lang=en
[2] https://sourceforge.net/projects/freeship
En algún momento usé Delphi/Pascal como lenguaje principal y pasé los últimos 10~20 años buscando un lenguaje que me encajara. También usé Haxe durante bastante tiempo, pero al final sentí que caía en la trampa de “eso se puede hacer con macros”. Las macros pueden hacer cualquier cosa, pero cuando se acumulan suficientes, todo el mundo termina programando en su propio lenguaje de extensión basado en macros
JavaScript ha tenido buenas mejoras y todavía necesita más, pero hoy también hago bastante trabajo por ese lado. Hace unos años volví a usar FreePascal mientras escribía código para AVR de 8 bits, y fue realmente agradable. Al probar las funciones nuevas, de verdad se sentía como un lenguaje moderno, y también me gustó que, al programar para un espacio tan reducido, casi no usara la biblioteca estándar y construyera yo mismo el código necesario
Eso me permitió evitar el ruido de namespaces heredado que FreePascal ha acumulado durante años, con capas como TList, TFPList, TFPGList y TFPGObjectList. Lo que más extrañé fue que el compilador no permitiera expresiones constantes de punto flotante en objetivos sin FPU o sin emulación. Como podría calcularlas en tiempo de compilación, habría estado bien que se pudiera
Después de usar otros entornos, ahora siento como una limitación no poder definir variables a mitad de una función, y también me gustaría tener alcance a nivel de subfunción. La diferencia entre begin/end y
{}no me importa mucho. Hoy prefiero los lenguajes sensibles a mayúsculas y minúsculas, y creo que es mejor no poner prefijos de caracteres a los tipos. Esto parece deberse, más que nada, a la evolución de los editores. El resaltado de sintaxis y el linting en tiempo real trasladan la información a otra capa y reducen el ruido textualSi apareciera un lenguaje sucesor de FreePascal como un nuevo comienzo, probablemente me entusiasmaría bastante. Me gustaría una nueva biblioteca estándar que use funciones modernas como ciudadanos de primera clase, y quizá intente crearla cuando me jubile
{}en realidad no significan lo mismo.{}sí define un alcance local, pero begin/end noEn los 90 usé Delphi durante varios años en el trabajo y me gustaba, pero me cansó que Borland y sus dueños posteriores siguieran administrando mal el producto y el lenguaje. Anders Hejlsberg también dejó Borland y se fue a Microsoft para crear C#, que personalmente considero un lenguaje y una arquitectura mucho mejores para invertir tiempo
Últimamente estoy usando Pascal por diversión debido a las limitaciones de recursos. El antiguo Borland Turbo Pascal 3.00A corre en CP/M y ofrece editor, compilador y bibliotecas, todo dentro de 64 KB
Es lo bastante rápido para usarse de forma interactiva y genera código suficiente para implementar utilidades de bajo nivel, juegos simples y hacks varios. Nunca he usado Pascal en entornos más grandes o modernos, pero mi experiencia reciente ha sido bastante satisfactoria, así que no pienso descartarlo
Ni siquiera sabía que todavía existían implementaciones modernas de Pascal, y quizá debería volver a acercarme a mi primer amor
Si necesitas CP/M, puedes revisar en el sitio si tiene soporte, y no me sorprendería que lo tuviera. El IDE de interfaz de texto es muy parecido a Turbo Pascal y rapidísimo. El lenguaje tiene muchas más funciones avanzadas que Turbo Pascal, pero no tienes que usarlas si no quieres
Cuando lo probé rápidamente en Windows hace tiempo, los binarios generados también eran muy pequeños, como en C, y un programa simple de hello world quedaba por debajo de 50–60 KB
Recuerdo que fue una mejora enorme frente al entorno de desarrollo de M-III BASIC, y mis juegos y utilidades caseros corrían bastante bien incluso dentro de 48 KB de RAM. Me pregunto qué habrá sido de la base de código de Pascal-80. Seguro no será mejor, y probablemente será mucho peor, que las herramientas modernas para hardware retro. “Oh Pascal!” fue el libro con el que aprendí este lenguaje, y como eso fue varios años antes de que Pascal se usara comercialmente, supongo que no había muchas otras opciones
Me cuesta estar de acuerdo con varias de esas razones. Object Pascal no es un lenguaje moderno. Tal vez lo era en 1998, pero desde entonces no ha evolucionado mucho, y el último gran cambio fueron los genéricos, que llegaron más tarde que en casi cualquier otro lenguaje
FPC tampoco genera código especialmente rápido, y las características de objetos de Object Pascal tampoco favorecen la localidad. Es más rápido que un lenguaje de scripting, pero por lo general es más lento que los lenguajes compilados por adelantado en general, incluso incluyendo algunos con recolección de basura
En cambio, el ecosistema es excelente. Hay muchas buenas bibliotecas y herramientas, y lo más destacable es Lazarus, un clon de Delphi. La gente que usa FPC o Delphi nunca pareció preocuparse demasiado por modernizar el lenguaje; más bien se enfocaba en simplemente sacar el trabajo. Aun así, no me parece que vaya a resultar atractivo para desarrolladores nuevos, así que no sé cómo será su futuro
El rendimiento real es suficientemente bueno y, si encuentras un cuello de botella, puedes optimizar lo necesario. Comparado con C++, usar clases de “alto nivel” puede ser un poco más engorroso, pero no es imposible
Si quieres rendimiento base con el mínimo esfuerzo, también existe el nuevo backend de LLVM. Tienes que compilar desde código fuente el compilador porque debes construir también con el backend de LLVM la biblioteca de tiempo de ejecución, la FCL y demás, pero eso toma solo unos minutos. A cambio, el compilador se vuelve mucho más lento y, en lo personal, no creo que la diferencia de rendimiento lo valga
Así que me da curiosidad qué benchmark te hizo pensar que era unas 50 veces más lento de lo que realmente es
Aquí, programación competitiva significa cálculos algorítmicos cortos, de CPU, de un solo hilo, con un máximo de 1 a 3 segundos por ejecución; un entorno desfavorable para JIT y sin bibliotecas externas ni tuning, usando la configuración base del compilador y del runtime. En ese tiempo, la sabiduría popular era usar C++/Pascal o empezar con Java y, si aparecía “time limit exceeded”, reescribir la solución de 200–300 líneas en C++ para pasar
Pascal usa un compilador LL(1) de una sola pasada, así que puede compilar en milisegundos. Te da una experiencia tipo REPL donde Editar→Compilar→Ejecutar se completa en menos de un segundo. C/C++, con macros y tiempos de compilación lentos, ofrecía una peor experiencia de desarrollo y, al menos en mi caso, esa fue la razón por la que aprendí Pascal en vez de C y Delphi en vez de C++
No entiendo por qué habría que hacerlo. Los lenguajes antiguos deberían seguir existiendo por soporte a sistemas legados, pero no le veo mucho sentido a meterles a la fuerza ese tipo de funciones modernas
Uso mucho Java, pero sinceramente creo que casi todo lo posterior a Java 8 nunca debió agregarse. Por ejemplo, las lambdas en Java son casi un parche
Si quieres funciones modernas, usa un lenguaje moderno. Si quieres quedarte en el ecosistema de Java, usa Kotlin. Literalmente no he visto Pascal en décadas y la última vez que programé en él fue en los años 80, así que solo hablo de Java, pero agregarle esa lista de funciones a Pascal se ve ridículo
Aun así, sí vale la pena incorporar funciones modernas. Puede que no vayas a empezar un proyecto nuevo en C++ y elijas un lenguaje moderno como Rust, pero los millones de líneas de código C++ ya escritas sí pueden mejorar con funciones modernas. Basta ver cómo C++11 cambió el panorama
El lenguaje Java produjo una cantidad enorme de código boilerplate por la decisión de usar bibliotecas en vez de funciones del lenguaje, y creo que ese rumbo fue equivocado. Todo lo que se puede hacer en Python, Lisp o Haskell también se puede hacer en Java, pero por definición también se puede hacer en brainf*ck. La complejidad de la solución real en Java termina siendo mayor que en lenguajes con más funciones, y al final acabas reimplementando esas funciones del lenguaje de una forma algo rota o arrastrando un montón de dependencias para sustituirlas. En cualquiera de los dos casos, solo aumenta la superficie de API que hay que aprender
Gracias a las mejoras de Java, la JVM siguió siendo relevante y pudo contener a DotNet, lo cual fue algo bueno considerando la historia de Microsoft
Se suele pasar por alto, pero el ecosistema embebido de Ada tiene ventajas en la madurez del análisis estático, la depuración y el soporte de destinos
La sintaxis de Ada, parecida a la de Pascal, puede verse verbosa, pero no es difícil de leer. VHDL también está basada en la sintaxis de Ada, así que puede ser más fácil para quien usa ambos lenguajes
Swift también cumple con parte de esto y además suma funciones convenientes como closures, conteo automático de referencias e inferencia de tipos. No sé sobre tipos de medidas, pero parece posible implementarlo. Eso sí, todavía no parece existir un HDL tipo Swift
Pascal en realidad es bueno y su rendimiento también es decente. Fue el segundo lenguaje que aprendí en la preparatoria, después de Basic
No entiendo por qué la industria tuvo que retroceder a Python, Ruby, Java, JavaScript a finales de los 90 y principios de los 2000
Explica por qué lenguajes de tipado dinámico como Python, Ruby y JS se volvieron populares en los 90: daban ciclos de retroalimentación rápidos para crear sitios web y no necesitabas un IDE ni un compilador. En ese tiempo los IDE y compiladores eran lentos y muchas veces ni siquiera eran gratis
Además, como los usuarios se conectaban con módems de 56k, cambiar tiempo de desarrollo por mejoras de rendimiento no daba demasiada ventaja. La charla también tiene puntos interesantes sobre cómo cambió la forma de desarrollar en los últimos 10 a 20 años y por qué la tendencia está volviendo al tipado estático
Además, el navegador web se volvió una plataforma de programación popular y se usaba principalmente JavaScript. Incluso ahora, además de la parte del navegador, siguen intentando meter a presión un sistema operativo completo dentro del navegador web, y Chrome ya está bastante cerca
En mi primer año de universidad, mi primer proyecto fue un simulador de elevador hecho en Pascal, y usaba gráficos de texto. Comparado con los lenguajes de la familia C, Pascal tenía algo de elegancia que lo hacía disfrutable
Por eso ahora disfruto Nim, que según entiendo recibió influencia no solo de Ada y Python, sino también de Pascal, Modula-3, Oberon, Delphi y otros lenguajes de la línea de Wirth
Pascal no es tan malo y, de hecho, creo que tiene ventajas frente a algunos lenguajes modernos. Claro, no es perfecto y también tiene desventajas
A veces uso Pascal y BASIC para programar en DOS, y al menos para ese uso Pascal me parece bastante bien. C también se usa para programar en DOS, pero sobre todo en modo real no me parece muy bueno
Para programar en Linux en general prefiero C, pero también uso PostScript. Creo que tanto C como PostScript tienen ventajas frente a algunos lenguajes modernos. Pascal puede usarse también para otros programas; incluso TeX fue escrito en Pascal