Procurando por uma boa linguagem de programação funcional / oop / meta com: [fechado]

9

Eu quero que seja

  • geração de código nativo // Capaz de compilar com algo como o GHC
  • multiplataforma (win / linux)
  • Funcional e um pouco orientado a objetos
  • lambdas, correspondência de padrões, tuplas e outras coisas funcionais
  • Ótimo suporte à metaprogramação
  • Recuo e bordas mínimas
  • digitação estática
  • Também quero apoio Mixin :)
  • A possibilidade de criar sites com base em algumas estruturas também é uma boa vantagem.
  • então, sim, o desempenho e a estabilidade são importantes.

Comecei o Haskell , mas ainda não tenho certeza, porque existe o OCaml. E eu tenho experiência em F #. Mas, tanto quanto eu sei, o OCalm é um pouco POO e, às vezes, mais rápido (não tenho certeza), nunca tentei. Também há erlang, não sei nada sobre erlang . E talvez eu esteja perdendo algo mais ..? Python , eu não tenho idéia do python aqui, é funcional e oop e suporta mixin, popular e rápido, mas eu realmente não acho que o python seja capaz de toda a magia funcional, acho que não pode.

Eu sei que esse tópico / tópico é como falar sobre nada ou como uma guerra de idiomas, mas eu realmente quero ouvir sua visão sobre isso.

cnd
fonte
2
Eu acho que exigir a geração de código nativo limita bastante as opções. Eu acho que nemerle vale a pena tentar .
Back2dos
@ back2dos ye, eu gosto de Nemerle, mas usá-lo com mono para pequenos utilitários ou web é um trabalho um pouco estranho. Acho que sim. E o travessão ainda tem um apoio ruim. Estou usando Nemerle, mas às vezes. Por enquanto estou usando menos do que o F #.
cnd
Parece que você deseja C ++ com um paradigma funcional (em tempo de execução) (ele já possui paradigma funcional em tempo de compilação).
Klaim
@Klaim Eu realmente não quero C ++. código nativo de geração com ghc -> gcc é bom para mim.
cnd
2
Uma linguagem com todos esses requisitos? Provavelmente você escreve a si mesmo.
Rein Henrichs

Respostas:

8

Clojure parece ser um bom ajuste para todos os seus requisitos.

  • geração de código nativo / Capaz de compilar com algo como GHC - Sim (todo o código Clojure é compilado no bytecode Java que posteriormente é compilado no código nativo via JIT na JVM)

  • multiplataforma (win / linux) - Sim - em qualquer lugar que a JVM seja executada

  • Funcional e um pouco orientado a objetos - Sim - O Clojure é uma linguagem funcional em primeiro lugar, mas também oferece suporte a OO, se você desejar (via interoperabilidade Java ou objetos no estilo CL). Dito isto, o OO é geralmente considerado unidiomatic em Clojure.

  • lambdas, correspondência de padrões, tuplas e outras coisas funcionais - Sim - é uma linguagem funcional bastante padrão nesse sentido. O autor (Rich Hickey) foi um pouco inspirado por Haskell.

  • Ótimo suporte à metaprogramação - Sim - o "código é dados" se aplica como em todos os Lisps e você obtém excelente funcionalidade de macro

  • Recuos e bordas mínimas - Sim, embora certamente esse seja realmente um editor, e não um recurso de idioma?

  • digitação estática - Sim - Clojure é dinâmico por padrão, mas você pode fornecer dicas de tipo estático ou primitivo sempre que desejar para melhorar o desempenho

  • Também quero o suporte ao Mixin :) - Sim - pode ser alcançado de várias maneiras (por exemplo, macros), embora você provavelmente não queira ou precise dele depois de descobrir a funcionalidade do protocolo do Clojure ....

  • A possibilidade de criar sites com base em algumas estruturas também é uma boa vantagem. - Sim - existem estruturas como Ring / Compojure no Clojure e você também pode usar qualquer estrutura Java

  • então, sim, o desempenho e a estabilidade são importantes. - Sim - Você basicamente obtém todo o desempenho / estabilidade da JVM, que é bastante comprovado em aplicativos corporativos ...

Além de tudo isso, Clojure tem alguns recursos realmente impressionantes em relação à simultaneidade. Realmente vale a pena assistir a este vídeo: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Mikera
fonte
1
"tudo é compilado no código nativo via JIT na JVM" Totalmente errado ... compilado no código nativo significa que não precisamos de algo como uma máquina virtual. Aqui precisamos disso.
benjaminb
1
Depende do motivo pelo qual você precisa de código nativo. Se tudo o que importa é o desempenho em estado estacionário, a JVM estará absolutamente lá em cima com o código nativo. Se você precisar de bibliotecas nativas, poderá usar o JNI da JVM (que é bom o suficiente para jogos 3D em tempo real). Se, no entanto, você precisar de um tempo de inicialização em milissegundos ou tiver severas restrições de memória, como em um dispositivo incorporado, concordo que a JVM pode não ser o ideal.
Mikera #
mikera, você também pode querer facilitar a implantação (menos uma dependência para um pacote Linux ou não exigir que o usuário instale o JRE no Windows, possivelmente até mesmo fornecer a alguém .exe ou elf). Sim, fornecer apenas um binário é um caso de canto, mas ainda é possível com um aplicativo nativo, mas não com um programa que precise da JVM.
Alexander Alexander
1
@Alexander - concorde que você deseja facilitar a implantação, embora, dependendo da sua perspectiva de dependências, esse ainda seja um ponto positivo para o Clojure: os aplicativos Clojure têm exatamente uma dependência direta (a JVM), enquanto um binário nativo possui pelo menos dois (o sistema operacional e a arquitetura de hardware específica)
mikera
"tudo é compilado no código nativo via JIT na JVM": NÃO. (esclarecer que e remover meu -1)
haylem
8

Lisp comum

Parece apoiar todos os requisitos acima. O link levará você a um livro on-line que cobre tudo o que você precisa saber para começar.

Gary Rowe
fonte
1
Lisp comum gera código nativo?
Klaim
6
@Klaim: Lisp comum é uma linguagem de programação. Linguagens de programação não geram código, compiladores. Portanto, assim como em praticamente todas as outras linguagens de programação do planeta (C, C ++, Java, Ruby, ECMAScript, o que você quiser), existem compiladores para Common Lisp que geram código nativo. E, assim como em praticamente todos os outros idiomas de programação, existem compiladores que geram bytecode JVML, bytecode CIL, código-fonte C, código-fonte ECMAScript. E, assim como em praticamente todas as outras linguagens de programação, existem intérpretes.
Jörg W Mittag
2
@Klaim: Você está falando sobre a evalfunção? É apenas uma função, você pode implementá-la como quiser. Algumas implementações possuem um intérprete separado, que é enviado com o executável compilado. Alguns apenas enviam o próprio compilador com o executável compilado. Alguns só compilam o código em tempo de execução de qualquer maneira. E se você estiver falando sobre macros: elas só são executadas em tempo de compilação de qualquer maneira. Essa é a beleza disso.
Jörg W Mittag
2
@nCdy Os () s no Lisp surgem como resultado de fornecer sintaxe para diferenciar entre listas e átomos em uma expressão s.
Gary Rowe
1
@ Jörg W Mittag: Estou começando a suspeitar que você gosta de dizer a palavra "ortogonal". ;)
FrustratedWithFormsDesigner
5

O OCaml é o único idioma que fornece todos os recursos solicitados. (Mas eu não conheço o mixin.) Ele ainda possui uma estrutura da web chamada Ocsigen e é mais do que uma linguagem exagerada, é uma linguagem antiga, com uma base de usuários real (empresas, universidades, amadores) e anos de aprimoramento e testes .

BenjaminB
fonte
2
Mas a metaprogramação é feita apenas por uma ferramenta externa de passagem única (CamlP4).
SK-logic
Observe que alguns dos "idiomas de hype" de hoje podem se tornar os "idiomas antigos de amanhã, com bases de usuários reais [...] e anos de aprimoramento e teste". Eles podem até atingir o mesmo nível de penetração no mercado e aceitação pública. :)
haylem
2

Definitivamente, o Scala pode atender aos seus requisitos:

  1. compilado e executado na JVM, para que seja win / linux / mac.
  2. suporta programação funcional e OO.
  3. suporta coisas funcionais que você mencionou. A correspondência de padrões parece ótima e usada ativamente. Falta suporte à recursão de cauda, ​​pois a JVM não suporta, mas as chamadas de recursão podem ser otimizadas em alguns casos.
  4. metaprogramação não é suportada. A linguagem é ótima ^ W muito boa para DSL. (fixo)
  5. tem mixins (características).
  6. dê uma olhada na estrutura da web do Lift. Ele usa recursos funcionais da linguagem e possui recursos avançados muito interessantes de se ver. Existem também alguns outros frameworks da web (play !, etc.)
  7. baseado na JVM tão estável.
  8. A sintaxe é bastante limpa. Não há parênteses (desculpe covardes, essa é apenas a minha opinião pessoal) por lá e o uso de ponto e vírgula é reduzido a opcional em muitos casos.

Além disso, Scala tem um ótimo suporte para programação paralela (por atores). A comunidade Scala está crescendo e é usada em projetos reais (Twitter). A linguagem é bastante difícil de aprender, pois possui muitos recursos e açúcar sintático, mas uma vez que você a manipule, certamente gostará de programar com ela.

faz sentido
fonte
Quando comparada à característica de Clojure, Scala permite composição de mixagem na qual a característica (interface) pode herdar classes via linearização de tipo .
prasonscala
2
4. A metaprogramação não é suportada. DSLs são implementadas em funções de alta ordem e sobrecarga, sem nenhuma ajuda de metaprogramação. Como resultado - essas DSLs são limitadas, limitadoras e lentas. Nenhuma geração de código em tempo de compilação está disponível no Scala. Nada como macros Lisp.
SK-logic
Afinal, eu realmente não gosto da sintaxe do Scala ... É pessoal)
cnd
1
@ SK-logic Eu verifiquei e agora concordo com você. Uma vez eu olhei através do "DSL em ação" e havia o exemplo do Scala DSL, então pensei que seria bom para o DSL. Obviamente Lisp, Clojure funcionará muito melhor aqui.
make_sense