2 pontos por GN⁺ 2023-07-10 | 3 comentários | Compartilhar no WhatsApp
  • 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
    • FPC: Free Pascal Compiler open source
    • Lazarus: IDE Pascal open source baseada em FPC
    • Delphi: compilador e IDE Pascal comerciais
    • VS Code: várias ferramentas do ecossistema CGE e Pascal oferecem suporte explícito à integração com o VS Code

3 comentários

 
gmong 2023-07-20

Delphi... que nostalgia. Borland, Delmadang..

 
xguru 2023-07-10

Na época em que eu desenvolvia para Windows, acho que Object Pascal com Delphi era realmente o melhor.

 
GN⁺ 2023-07-10
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

  • 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 texto
    Eu 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

    • begin/end e {} na verdade não significam a mesma coisa. {} define um escopo local, mas begin/end não
  • Nos 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

    • Distribuir aplicativos desktop em C# de forma confiável é praticamente um pesadelo completo comparado ao exe único gerado por Delphi/Lazarus
  • 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

    • Turbo Pascal e o Delphi posterior foram o primeiro momento em que uma linguagem de programação realmente fez sentido para mim. No fim acabei indo para C e C++, mas sempre tive vontade de voltar para uma linguagem mais expressiva
      Eu nem sabia que ainda existiam implementações modernas de Pascal, e talvez eu deva voltar a me aproximar do meu primeiro amor
    • Se ainda não usou, vale a pena dar uma olhada no Free Pascal. Ele oferece suporte a muitas plataformas
      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
    • Ah, a nostalgia de Pascal. Na época do TRS-80 Model III, juntei a fortuna de 80~100 dólares para comprar o pacote Pascal 80, versão New Classics. Era praticamente uma IDE inicial e, para a época, era muito boa. http://www.trs-80.org/pascal-80/
      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

    • Os genéricos entraram no FPC há 17 anos, então isso está longe de ser uma mudança recente. Se for para citar uma grande mudança adicionada recentemente, eu diria que funções anônimas e referências a função, ou seja, closures, seriam candidatas mais adequadas
      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
    • Acho que você está subestimando demais. No passado, já houve benchmarks em que ele ficou tão rápido quanto C++, e, no seu principal caso de uso, aplicativos GUI locais, nunca vi nada responder de forma tão imediata, incluindo aplicativos GUI em C# e afins
      Então fico curioso para saber qual benchmark levou você a concluir que ele é algo como 50 vezes mais lento do que realmente é
    • Não conheço o FPC, mas o Delphi 7 estava em um nível parecido com o C++ em programação competitiva há 10 anos, e era algo como 2~3 vezes mais rápido que Java
      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
    • A maior diferença entre Pascal e C++ é a experiência do desenvolvedor
      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 concordo fortemente com a ideia de que o ecossistema seja excelente. Trabalhei cerca de 10 anos com Pascal e frequentemente me frustrava com a falta de bibliotecas modernas, e no fim eu tinha de criar minhas próprias soluções ou abandonar a ideia por completo
  • 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

    • Lambda é remendo? Você realmente acha melhor criar uma classe anônima com um único método?
    • Em Java, a interoperabilidade entre linguagens é fácil, então uma opção como Kotlin é mais simples. O mesmo vale para Clojure. Mas, se você estiver usando C++, não existe um caminho fácil de upgrade para outra coisa
      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
    • Então seria preciso trocar de linguagem de programação com muito mais frequência. Adicionar e integrar novos recursos com ganhos já comprovados parece uma forma razoável de adiar esse processo
    • Até recentemente, Java tinha poucas vantagens sobre o Delphi de 15 anos atrás, além de um ecossistema absurdamente grande. Claro, esse ecossistema vence tudo
      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
    • Só nos últimos anos surgiram linguagens competitivas para a JVM. Scala era um beco sem saída, Clojure foi quase uma moda passageira, e Rhino/JS tinha ambições bem limitadas
      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

    • Sempre achei Ada subestimada. Pessoalmente, valorizo recursos como segurança de memória, modelo padrão de concorrência, suporte a tipos de unidades e medidas e pré-compilação
      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
    • Fico curioso se Ada agora oferece suporte a alvos Android e iOS. Da última vez que vi, não parecia haver uma forma clara de compilar para NDK
    • Não é a opção mais amigável para começar no macOS
  • 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

    • Vi recentemente uma apresentação sobre esse tema: https://www.youtube.com/watch?v=Tml94je2edk
      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
    • Os computadores ficaram mais rápidos e a memória aumentou, então era preciso inventar onde usar isso ;-)
      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

    • Fico curioso sobre onde você usa PostScript. É interessante ver gente usando isso para finalidades além de trabalho relacionado a impressão