- O desenvolvedor, que valoriza programação funcional e garantias estáticas, passou por várias linguagens e acabou avaliando muito positivamente o design equilibrado de OCaml
- Em comparação com o sistema de tipos complexo e a compilação lenta de Haskell, OCaml oferece simplicidade e praticidade ao mesmo tempo
- Lembra o Go pela compilação rápida e runtime enxuto, mas mantém pontos fortes de linguagens funcionais como pattern matching e tipos soma
- Com builds rápidos, binários estáticos e ferramentas ricas de documentação (
odig, utop), oferece alta produtividade e boa acessibilidade
- O maior atrativo de OCaml é apresentado como o equilíbrio entre simplicidade e expressividade, além de um design de linguagem refinado
Experiência com linguagens de programação e comparação
- A partir da experiência de desenvolver software amador e profissional em várias linguagens, o autor organiza as características de uma boa linguagem
- Apresenta como fatores importantes: compilação rápida, runtime simples, fortes garantias estáticas, componentes funcionais, bom desempenho e qualidade da documentação
- Haskell ajudou a aprender a forma de pensar da programação funcional, mas sua sintaxe complexa e compilação lenta são apontadas como problemas
- A tendência da comunidade de buscar complexidade e problemas de runtime como space leak tornam a manutenção difícil
- Go possibilita simplicidade, compilação rápida, boas ferramentas e compreensão de código conciso
- Porém, seu design conservador, o tratamento de erros verboso e a ausência de verificação nula explícita aumentam a chance de bugs e causam incômodo
- A ausência de REPL e a postura negativa em relação a ideias funcionais também são mencionadas como limitações
Principais pontos fortes de OCaml
- OCaml é avaliada como uma linguagem que atende à maior parte dos critérios acima
- Fortes garantias estáticas: suporte a tipos soma, variantes polimórficas e pattern matching
- Runtime simples: usa coleta de lixo, mas funciona como uma linguagem de nível de sistema
- Compilação rápida: com o sistema de build Dune, é mais rápida que Haskell ou Rust
- Geração de binário único com linkagem estática, facilitando a distribuição
- Excelentes ferramentas de documentação:
odig (navegação offline de documentação), utop (REPL), estrutura separada entre arquivos de interface e implementação
- O recurso de inferência automática de tipos melhora a eficiência na escrita de código
- A estrutura de definir tipos em arquivos de interface ajuda na navegação clara pelo código
Design da linguagem e impressões
- OCaml é uma linguagem antiga, mas mantém uma sensação de design refinado
- Alguns recursos orientados a objetos e bibliotecas complexas são considerados desnecessários
- No geral, o equilíbrio entre simplicidade e expressividade e um bom ecossistema de documentação e ferramentas são os principais atrativos de OCaml
- O autor avalia OCaml de forma muito positiva como uma “linguagem simples, mas expressiva” e menciona uma satisfação difícil de encontrar em outras linguagens
1 comentários
Comentários no Hacker News
Usei um pouco de OCaml e tive vários problemas
O suporte a Windows é péssimo, e só no OCaml 5 melhorou para algo como “bem ruim” em vez de horrível
A sintaxe é difícil para humanos lerem, e quando dá erro de sintaxe, basta um único caractere errado para aparecer um erro de 1000 linhas
O ocamlfmt transforma até
matchcomplexos em uma única linha, o que prejudica a legibilidadeA documentação também é excessivamente concisa e quase não tem exemplos
O OPAM parece bom na teoria, mas na prática tem muitos bugs; havia até um bug em que, se você pertencesse a mais de 32 grupos Unix, ele não encontrava o
curlComo as anotações de tipo nas assinaturas de função são opcionais, isso reduz as vantagens da tipagem estática
O ecossistema também é pequeno, e nem copiar arquivos tem função embutida
Essa obsessão com listas simplesmente encadeadas também é ineficiente
Ainda assim, é melhor que C ou Python, mas eu provavelmente não escolheria isso em vez de Rust
Como ele tem como alvo a CLR, a distribuição é muito mais fácil, e dá para aproveitar diretamente o ecossistema .NET
Dá para usar quase sem adaptação bibliotecas NuGet feitas para C# ou VB.NET, então o ecossistema é enorme
A documentação de F# é muito mais rica e tem muito mais exemplos
Links de referência: F# Language Reference, F# Core Docs, F# Cheatsheet
curlno OPAM existia mesmo e confirmei na issue #5373Na verdade é um problema relacionado ao musl, causado pelo fato de o OPAM ter sido compilado com esse binário
O
ocamlformat, se configurado com o perfil janestreet, fica muito melhor que o padrãoO problema das anotações de tipo nas assinaturas de função se resolve fornecendo arquivos
.mli, mas a maioria não faz issoEm compensação, o plugin de OCaml para VS Code oferece a melhor experiência para iniciantes
No hardware de hoje, penso que a coleção padrão deveria ser vector
Antigamente nem era possível instalar direto pelo ocaml.org; era preciso passar por mingw ou wsl
Então, na prática, era como se nem existisse OCaml para Windows
O motivo de os designers da linguagem Go quase não terem adotado ideias de programação funcional é claro
Como disse Rob Pike, a maioria dos desenvolvedores do Google era jovem e acostumada com linguagens da família C, então precisavam de uma linguagem fácil de aprender
Como mudar para a forma de pensar das linguagens funcionais exige muito tempo, Go tentou evitar esse custo
Sempre que vejo a palavra “ML”, meu coração ainda acelera por um instante, e aí percebo que não é Meta Language, e sim Machine Learning, e me decepciono
O que me incomoda mais hoje em dia é o uso excessivo da palavra “AI”
Eu preferiria que não usassem o termo AI até surgir uma AGI de verdade
Se você assistir à palestra de Richard Feldman, ela explica bem por que linguagens funcionais não conseguiram se popularizar
Ou a linguagem domina uma plataforma, ou tem um aplicativo matador, ou conta com um orçamento gigantesco de marketing
O motivo de Python ter crescido tanto também foi ter se tornado a linguagem central do ecossistema de AI
Eu também aprendi programação funcional com OCaml e fiz projetos com Haskell e Zig, mas no fim voltei à realidade de “usar as ferramentas que dão para usar”
OCaml, Rust e Haskell são populares como linguagens que as pessoas “querem aprender”, mas não como linguagens “amplamente usadas de fato”
O Torch era originalmente baseado em Lua, e foi migrado para Python, que já era muito popular
O pessoal de FP foi indiferente às mudanças tecnológicas do mundo real, e nesse meio-tempo linguagens como C, Pascal, Perl e Tcl ocuparam o mercado
No fim, FP ficou como “os sacerdotes dentro da catedral”, enquanto as linguagens imperativas conquistaram o público
Já usei F#, e a concorrência baseada em Actors me pareceu fácil de entender
Mas quando entram em cena arrays mutáveis, tudo fica mais complicado
Tenho curiosidade sobre por que alguém preferiria OCaml a F# no trabalho
Já OCaml conta com remoção do lock global, compilação rápida e recursos poderosos como módulos, GADTs e effects
F# ainda leva vantagem em suporte a Windows, SIMD e tipos sem boxing, mas OCaml está alcançando aos poucos
Há muitas bibliotecas, mas a maioria não tem estilo de F#
OCaml tem um ecossistema nativo maior
A interoperabilidade com C# é boa, mas usar bibliotecas F# a partir de C# era um pesadelo
No fim, você acaba mantendo uma camada externa em C#, e a base de código vira um híbrido
O ecossistema .NET é rico, mas a forma de pensar centrada em OOP entra em choque com o estilo FP
O Visual Studio é confortável, mas é ruim para fluxos de trabalho baseados em CLI
A velocidade de compilação só vai piorando, e testar também é estranho
Quando usei OCaml, o design ergonômico da linguagem pareceu muito mais natural
F# é chamado de “OCaml para .NET”, mas na prática é apenas uma linguagem da família ML; são quase linguagens diferentes
Como OCaml é uma linguagem antiga, talvez dê para abrir mão dos recursos de OOP, mas acho que Standard ML é mais completo
Ele é útil para registros com tipagem estrutural, open recursion e bindings de JS como
Js_of_ocamlTambém não oferece suporte a atualização de registros, o que é inconveniente
Desde o começo dos anos 2000, OCaml sempre foi uma “linguagem quase perfeita”
Mas, quando os pontos de atrito começaram a ser resolvidos, outras linguagens já tinham absorvido essas ideias
Pouca gente aprende, mas todo mundo que aprende vai lá e cria uma nova linguagem
Fonte
Já existem muitos projetos rodando bem em OCaml
E agora, com a adição de um sistema de effects, ele está até mais avançado
Popularidade e qualidade são coisas diferentes
popularidade ≠ excelência, e na música também é assim
Isso só é decidido por tendências e inércia
Quanto mais usada uma linguagem é, mais gente a odeia,
e quanto mais desconhecida, mais fácil é superestimá-la
OCaml é menos popular porque o grupo de usuários que sente essa eficiência é pequeno
E a postura dogmática do pessoal de FP também contribui
Acho que Elixir é uma linguagem parecida com OCaml, mas com mais chance de se popularizar
Ela tem vantagens de FP como imutabilidade, pattern matching e modelo Actor,
e funciona com estabilidade sobre a runtime BEAM
Não tem tipagem estática, mas está adotando verificação de tipos gradual
Mesmo podendo usar diretamente o ecossistema .NET, ele é menos conhecido que OCaml
Há inclusive muitas empresas que a usam em backends de SaaS
Por isso as linguagens FP continuam sendo de nicho
OCaml se parece com Go no sentido de ser uma linguagem de sistemas com GC
Eu prefiro GC a gerenciamento manual de memória ou borrow checking
O GC da linguagem D também era excelente, mas o problema é que a própria palavra “GC” assustava as pessoas