Por que usar Pascal
(castle-engine.io)- Object Pascal mira combinar uma linguagem orientada a objetos moderna e fácil de ler com desempenho nativo, sendo uma opção para criar aplicações sustentáveis em várias plataformas
- Graças à tipagem forte, verificações em tempo de compilação e verificações em tempo de execução, erros como typos em nomes ou incompatibilidades de tipo tendem a ser filtrados antes de chegar ao usuário
- Quando necessário, é possível usar ponteiros, código específico para OS/CPU e até assembly, mas o Castle Game Engine opta por manter código rápido mesmo sem assembly
- Pode atingir uma ampla variedade de alvos, de Windows, Linux, macOS, mobile, consoles e web, e no Castle Game Engine o código do engine e o código do jogo são escritos na mesma linguagem
- Com integrações com FPC, Lazarus, Delphi, VS Code e diversas bibliotecas, é possível montar um fluxo de desenvolvimento prático dentro do ecossistema Pascal
Object Pascal legível e com segurança de tipos
- Object Pascal é tratado como uma linguagem multiplataforma type-safe, moderna, legível e rápida
- Se você já conhece outra linguagem orientada a objetos, é relativamente fácil aprendê-la, e pode usar Modern Object Pascal Introduction for Programmers como material de estudo
- Ela conta com recursos esperados de uma linguagem orientada a objetos moderna
- Classes
- Units
- Propriedades
- Generics
- Interfaces
- Reflexão
- Closures
- A sintaxe tem foco em código fácil de ler
- Para segurança de tipos, oferece tipos separados como boolean, string, char, set, enum e range
- Conversões seguras, como atribuir um inteiro a um float, são tratadas com facilidade
- Outras conversões precisam ser feitas explicitamente
Como erros são capturados na compilação e em runtime
- Object Pascal dá importância às verificações em tempo de compilação
- Ao fazer refatorações como reorganizar estruturas de dados, é possível fazer com que o compilador revele os pontos que precisam ser alterados
- Erros óbvios, como typos em nomes ou incompatibilidades de tipo, não passam pela compilação e não chegam ao usuário
- Também há verificações adicionais em runtime
- Verificação de limites de arrays
- Verificação de overflow de inteiros
- Assertions
- Verificação de vazamentos de memória
- As verificações em runtime são usadas para encontrar problemas em versões debug e podem ser desativadas em versões release quando desempenho é importante
- Ao compilar pelo CGE editor, os modos debug / release são configurados automaticamente, e é possível alternar o modo no menu “Run”
- Como documentação relacionada, consulte What are range and overflow checks (and errors) in Pascal e Detecting Memory Leaks
Desempenho nativo e controle de baixo nível na medida necessária
- Object Pascal é compilado para código nativo, então é fácil obter bom desempenho básico de execução
- Em aplicações comuns, muitas vezes não é necessário descer até otimizações de baixo nível
- Quando necessário, é possível usar tantos recursos de baixo nível quanto se quiser
- Uso de ponteiros
- Aritmética de ponteiros
- Escrita de código específico para OS/CPU
- Adição de código assembly
- Para aumentar a portabilidade e a legibilidade do código, o Castle Game Engine não tem nenhum código assembly, mas mira execução rápida
- A compilação também costuma ser rápida; há um caso em que, ao abrir um novo projeto pela primeira vez, o build para desktop levou 2,5 segundos, e o build para Android levou 10,1 segundos
Várias plataformas e o modo de desenvolvimento do Castle Game Engine
- Object Pascal pode ser usado para atingir diversas plataformas
- Desktop: Windows, Linux, macOS, Raspberry Pi, FreeBSD, provavelmente qualquer Unix
- Mobile: Android, iOS
- Consoles: Nintendo Switch
- Web: WebAssembly, JS usando pas2js
- As plataformas suportadas pelo Castle Game Engine podem ser conferidas em Castle Game Engine platforms supported
- Para todos os alvos possíveis, consulte FPC target platforms e Delphi target platforms
- No Castle Game Engine, o código do engine e o código do jogo são escritos na mesma linguagem
- O engine é open source, e você pode fazer um fork do CGE e modificá-lo conforme suas necessidades
Ecossistema de bibliotecas e ferramentas de desenvolvimento
- Pascal tem bibliotecas e units existentes para várias áreas
- Bancos de dados
- XML, JSON
- IA
- Blockchain
- Networking
- É possível integrar ou linkar facilmente bibliotecas existentes que tenham C API
- Renderers
- Bibliotecas de som
- Motores de física
- Também é possível usar Python libraries in Pascal
- O principal ecossistema de ferramentas é o seguinte
3 comentários
Delphi... que nostalgia. Borland, Delmadang..
Na época em que eu desenvolvia para Windows, acho que Object Pascal com Delphi era realmente o melhor.
Comentários no Hacker News
Quem usava Delphi antigamente provavelmente já conhece o Lazarus. O Lazarus é, na prática, algo bem próximo de uma reimplementação open source e roda/compila nativamente em praticamente qualquer lugar, incluindo placas ARM como o Raspberry Pi
Porém, como a instalação de bibliotecas pode ser trabalhosa, surgiram o FpcUp e depois o FpcUpDeluxe para automatizar a instalação da IDE, de módulos e de vários addons bem interessantes
https://wiki.freepascal.org/fpcupdeluxe
Também existe uma demo de widget de painel feita às pressas com os widgets gratuitos incluídos no FpcUpDeluxe
https://ibb.co/9bchx7T
O FpcUpDeluxe também funciona no Alpine Linux; basta baixar a versão musl na página de releases. Isso abre a possibilidade de colocar painéis até em sistemas bem pequenos. O código compila nativamente em várias plataformas e executa rápido, sem precisar de interpretador nem navegador web
Da última vez que usei Lazarus e Delphi, Unicode era complicado e, no geral, passava a sensação de que tudo assumia 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
Em certa época usei Delphi/Pascal como linguagem principal e passei os últimos 10~20 anos procurando uma linguagem que combinasse comigo. Também usei Haxe por bastante tempo, mas no fim fiquei com a sensação de ter caído na armadilha do “isso dá para fazer com macro”. Macro consegue fazer de tudo, mas, quando se acumula o suficiente, cada pessoa acaba programando na sua própria linguagem de extensão por macros
O JavaScript recebeu melhorias decentes, e ainda precisa de mais, mas hoje também trabalho bastante com ele. Há alguns anos voltei a usar FreePascal escrevendo código para AVR de 8 bits e foi muito divertido. Testando os recursos novos, ele realmente pareceu uma linguagem moderna, e também gostei do fato de, por estar programando para um ambiente minúsculo, eu quase não usar a biblioteca padrão e acabar criando o código necessário por conta própria
Isso me permitiu evitar o ruído de namespaces legados e compatibilidade retroativa que o FreePascal acumulou ao longo dos anos, como as camadas TList, TFPList, TFPGList e TFPGObjectList. O que mais senti falta foi o compilador não permitir expressões constantes de ponto flutuante em alvos sem FPU nem emulação. Como isso poderia ser calculado em tempo de compilação, seria bom se fosse possível
Depois de usar outros ambientes, hoje sinto como limitação não poder definir variáveis no meio de uma função, e também seria bom ter escopo no nível de subfunções. A diferença entre begin/end e
{}não me incomoda muito. Hoje prefiro linguagens que diferenciam maiúsculas de minúsculas e acho melhor não usar prefixos de caracteres nos tipos. Isso parece se dever principalmente à evolução dos editores. Highlight de sintaxe e linting em tempo real deslocam essas informações para outra camada e reduzem o ruído visual no textoEu ficaria bem empolgado se surgisse uma linguagem sucessora do FreePascal como um novo começo. Seria ótimo ter uma nova biblioteca padrão que tratasse recursos modernos como cidadãos de primeira classe; talvez eu mesmo tente fazer isso quando me aposentar
{}na verdade não significam a mesma coisa.{}define um escopo local, mas begin/end nãoNos anos 90 usei Delphi profissionalmente por alguns anos e gostava bastante, mas cansei de ver a Borland e os donos seguintes administrarem mal o produto e a linguagem repetidas vezes. Anders Hejlsberg também saiu da Borland e foi para a Microsoft criar o C# e, pessoalmente, acho que é uma linguagem e uma arquitetura muito melhores para investir tempo
Hoje em dia, por restrições de recursos, tenho usado Pascal por diversão. O antigo Borland Turbo Pascal 3.00A roda em CP/M e oferece editor, compilador e bibliotecas, tudo dentro de 64 KB
É rápido o bastante para uso interativo e gera código suficiente para implementar utilitários de baixo nível, jogos simples e hacks diversos. Nunca usei Pascal em ambientes maiores ou mais modernos, mas a experiência recente foi bastante satisfatória, então não pretendo descartá-lo
Eu nem sabia que ainda existiam implementações modernas de Pascal, e talvez eu deva voltar a me aproximar do meu primeiro amor
Se você precisa de CP/M, pode verificar no site se há suporte, e eu não ficaria surpreso se houvesse. A IDE de interface textual é muito parecida com a do Turbo Pascal e rápida como um raio. A linguagem tem muito mais recursos avançados que o Turbo Pascal, mas você não precisa usá-los se não quiser
Quando testei rapidamente no Windows no passado, os binários gerados também eram bem pequenos, como em C, e um simples programa hello world tinha menos de 50~60 KB
Lembro que foi um avanço enorme em relação ao ambiente de desenvolvimento do M-III BASIC, e meus jogos e utilitários rodavam muito bem mesmo dentro de 48 KB de RAM. Fico curioso sobre o que aconteceu com a base de código do Pascal-80. Não deve ser melhor, e provavelmente é muito pior, do que ferramentas modernas para hardware retrô. “Oh Pascal!” foi o livro com que aprendi essa linguagem, e como isso foi alguns anos antes de Pascal ser usado comercialmente, imagino que também não houvesse muitas outras opções
Tenho dificuldade em concordar com alguns pontos. Object Pascal não é uma linguagem moderna. Talvez tenha sido em 1998, mas depois disso não evoluiu muito, e a última grande mudança também foram os genéricos, que chegaram mais tarde do que em quase todas as outras linguagens
O FPC também não gera código especialmente rápido, e as características de objeto do Object Pascal também não favorecem localidade. É mais rápido que linguagens de script, mas, em geral, mais lento que linguagens compiladas antecipadamente em geral, inclusive as com coleta de lixo
Por outro lado, o ecossistema é excelente. Há muitas boas bibliotecas e ferramentas, e o mais notável é o Lazarus, um clone do Delphi. As pessoas que usam FPC ou Delphi em geral não se importavam muito com modernização da linguagem, apenas faziam o trabalho. Ainda assim, não me parece que vá atrair novos desenvolvedores, então não sei como será o futuro
O desempenho real é suficiente, e, se você encontrar um gargalo, também dá para otimizar o quanto for necessário. Em comparação com C++, usar classes “de nível mais alto” pode ser um pouco mais incômodo, mas não é impossível
Se você quiser desempenho básico com o mínimo de esforço, também existe o novo backend LLVM. Como é preciso compilar a biblioteca de runtime, a FCL etc. com o backend LLVM, você precisa compilar o compilador a partir do código-fonte, mas isso leva só alguns minutos. Em troca, o compilador fica muito mais lento, e pessoalmente não acho que a diferença de desempenho valha isso
Então fico curioso para saber qual benchmark levou você a concluir que ele é algo como 50 vezes mais lento do que realmente é
Aqui, programação competitiva significa cálculos algorítmicos curtos, single-thread e centrados em CPU, com no máximo 1~3 segundos por execução, em um ambiente desfavorável para JIT e usando configurações padrão de compilador e runtime, sem bibliotecas externas nem tuning. Na época, a noção comum era usar C++/Pascal ou, se você estivesse usando Java e aparecesse “time limit exceeded”, reescrever a solução de 200~300 linhas em C++ para conseguir passar
Pascal usa um compilador LL(1) de passagem única, então é possível compilar em milissegundos. Isso oferece uma experiência quase de REPL, concluindo Edit→Compile→Run em menos de 1 segundo. C/C++, com macros e tempos de compilação lentos, tinham uma experiência de desenvolvimento pior e, pelo menos para mim, foi por isso que aprendi Pascal em vez de C e Delphi em vez de C++
Não entendo por que isso seria realmente necessário. Linguagens antigas precisam continuar existindo por causa do suporte a legado, mas não vejo muito sentido em enfiar à força esses recursos modernos em linguagens antigas
Eu uso bastante Java, mas, sinceramente, acho que quase todos os recursos depois do Java 8 nunca deveriam ter sido adicionados. Por exemplo, lambdas em Java são quase um remendo
Se você quer recursos modernos, use uma linguagem moderna. Se quer ficar no ecossistema Java, use Kotlin. Faz literalmente décadas que não vejo Pascal, e a última vez que programei nele foi nos anos 1980, então só posso falar de Java, mas acrescentar essa lista de recursos ao Pascal parece risível
Ainda assim, há valor em incorporar recursos modernos. Você pode optar por não começar um projeto novo em C++ e escolher uma linguagem moderna como Rust, mas os milhões de linhas de código C++ já escritas podem ser melhorados com recursos modernos. Basta ver como C++11 mudou o jogo
A linguagem Java, por causa da decisão de usar bibliotecas em vez de recursos de linguagem, gerou uma quantidade enorme de boilerplate, e acho que essa direção foi equivocada. Tudo o que dá para fazer em Python, Lisp e Haskell também dá para fazer em Java, mas, por definição, também dá para fazer em brainf*ck. A complexidade das soluções reais em Java acaba ficando maior do que em linguagens com mais recursos, e no fim você acaba reimplementando esses recursos de linguagem de um jeito meio quebrado ou trazendo uma montanha de dependências para substituí-los. De qualquer forma, isso só aumenta a superfície de API que precisa ser aprendida
Graças às melhorias no Java, a JVM continuou relevante e conseguiu conter o DotNet, o que, considerando a história da Microsoft, foi uma coisa boa
Isso é frequentemente ignorado, mas o ecossistema embarcado de Ada tem vantagens em maturidade de análise estática, depuração e suporte a alvos
A sintaxe de Ada, parecida com a de Pascal, pode parecer verbosa, mas não é difícil de ler. VHDL também se baseia na sintaxe de Ada, então pode ser ainda mais fácil para quem usa as duas linguagens
Swift também atende parte disso e ainda adiciona recursos convenientes como closures, contagem automática de referências e inferência de tipos. Não sei sobre tipos de medida, mas parece viável de implementar. Só que ainda não parece existir um HDL tipo Swift
Pascal é realmente bom e também tem desempenho decente. Foi a segunda linguagem que aprendi no ensino médio, depois de Basic
Não entendo por que a indústria teve de regredir para Python, Ruby, Java e JavaScript no fim dos anos 1990 e começo dos anos 2000
Ela explica por que linguagens de tipagem dinâmica como Python, Ruby e JS ficaram populares nos anos 1990: elas ofereciam um ciclo de feedback rápido para criar sites e não exigiam IDE nem compilador. Na época, IDEs e compiladores eram lentos e muitas vezes não eram gratuitos
De qualquer forma, era a era em que os usuários se conectavam por modem de 56k, então trocar desempenho por menos tempo de desenvolvimento não trazia tanto prejuízo. A apresentação também traz vários pontos interessantes sobre como a forma de desenvolver mudou nos últimos 10 a 20 anos e por que a tendência está voltando para a tipagem estática
Além disso, o navegador virou uma plataforma de programação popular, e usava principalmente JavaScript. Ainda hoje, além da parte do navegador, estão tentando enfiar um sistema operacional completo dentro do navegador, e o Chrome está chegando bem perto disso
No primeiro ano da faculdade, meu primeiro projeto foi um simulador de elevador feito em Pascal, com gráficos em texto. Comparado às linguagens da família C, havia algo de elegante no Pascal que o tornava agradável
Por isso hoje em dia gosto de Nim; pelo que sei, Nim foi influenciado não só por Ada e Python, mas também por linguagens da linhagem Wirth como Pascal, Modula-3, Oberon e Delphi
Pascal não é tão ruim e, na verdade, acho que tem vantagens em relação a algumas linguagens modernas. Claro que não é perfeito e também tem desvantagens
Às vezes uso Pascal e BASIC para programação em DOS e, pelo menos para esse uso, Pascal parece adequado. C também é usado para programação em DOS, mas não parece tão bom assim, especialmente em modo real
Para programação em Linux, em geral prefiro C, mas também uso PostScript. Acho que tanto C quanto PostScript têm vantagens em comparação com algumas linguagens modernas. Pascal também pode ser usado em outros programas, e até o TeX foi escrito em Pascal