Buscando un buen lenguaje de programación funcional / oop / meta con: [cerrado]

9

Quiero que sea

  • generación de código nativo // Capaz de compilar con algo como GHC
  • multiplataforma (win / linux)
  • Funcional y un poco orientado a objetos.
  • lambdas, coincidencia de patrones, tuplas y otras cosas funcionales
  • Gran soporte de metaprogramación
  • Sangría y bordes mínimos
  • escritura estática
  • También quiero soporte Mixin :)
  • La posibilidad de crear sitios web basados ​​en algunos marcos también es una buena ventaja.
  • entonces sí, el rendimiento y la estabilidad son importantes.

Empecé Haskell , pero aún no estoy seguro de eso, porque hay OCaml. Y tengo experiencia en F #. Pero por lo que sé, OCalm es un poco OOP y, a veces, incluso más rápido (no estoy seguro) nunca lo intenté. También hay erlang, no sé nada sobre erlang . ¿Y tal vez me estoy perdiendo algo más ...? Python , no tengo idea acerca de Python aquí, es funcional y es excelente y admite mixin y popular y rápido, pero realmente no creo que Python sea capaz de toda la magia funcional, creo que no puede.

Sé que este hilo / tema es como hablar sobre nada o como una guerra de idiomas, pero en serio y realmente quiero escuchar tu visión al respecto.

cnd
fuente
2
Creo que requerir la generación de código nativo limita enormemente las opciones. Creo que Nemerle vale la pena intentarlo .
back2dos
@ back2dos ye, me gusta Nemerle, pero usarlo con mono para pequeñas utilidades o web es un trabajo un poco extraño. Creo que sí. Y sangría todavía recibió mal apoyo. Estoy usando Nemerle, pero a veces. Por ahora lo estoy usando menos que F #.
cnd
Parece que quiere C ++ con un paradigma funcional (tiempo de ejecución) (ya tiene un paradigma funcional en tiempo de compilación).
Klaim
@Klaim Realmente no quiero C ++. Generación de código nativo con ghc -> gcc está bien para mí.
cnd
2
¿Un idioma con todos esos requisitos? Probablemente uno que escribas tú mismo.
Rein Henrichs

Respuestas:

8

Clojure parece un ajuste bastante bueno para todos sus requisitos.

  • Generación de código nativo / Capaz de compilar con algo como GHC - Sí (todo el código Clojure se compila en código de bytes Java que posteriormente se compila en código nativo a través de JIT en la JVM)

  • multiplataforma (win / linux): Sí, en cualquier lugar donde se ejecute la JVM

  • Funcional y un poco orientado a objetos: sí, Clojure es un lenguaje funcional en primer lugar, pero también tiene soporte OO si lo desea (a través de la interoperabilidad de Java o los objetos de estilo CL). Dicho esto, OO generalmente se considera unidiomático en Clojure.

  • lambdas, coincidencia de patrones, tuplas y otras cosas funcionales: sí, es un lenguaje funcional bastante estándar a este respecto. El autor (Rich Hickey) fue algo inspirado por Haskell.

  • Gran soporte de metaprogramación - Sí - "código-es-datos" se aplica como con todos los Lisps y obtienes una gran funcionalidad macro

  • Sangría y bordes mínimos: sí, aunque seguramente eso es en realidad un editor en lugar de una función de idioma.

  • tipeo estático - Sí - Clojure es dinámico de forma predeterminada, pero puede proporcionar sugerencias de tipo estático o primitivo cuando lo desee para aumentar el rendimiento

  • también quiero compatibilidad con Mixin :) - Sí, se puede lograr de varias maneras (por ejemplo, macros), aunque probablemente no lo desee o lo necesite después de haber descubierto la funcionalidad del protocolo de Clojure ...

  • La posibilidad de crear sitios web basados ​​en algunos marcos también es una buena ventaja. - Sí, hay marcos como Ring / Compojure en Clojure y también puede usar cualquier marco Java

  • entonces sí, el rendimiento y la estabilidad son importantes. - Sí - Básicamente obtienes todo el rendimiento / estabilidad de la JVM que está bastante bien probado en aplicaciones empresariales ...

Además de todo eso, Clojure tiene algunas capacidades realmente impresionantes en torno a la concurrencia. Realmente vale la pena ver este video: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

mikera
fuente
1
"todo se compila en código nativo a través de JIT en la JVM" Totalmente incorrecto ... compilado en código nativo significa que no necesitamos algo como una máquina virtual. Aquí lo necesitamos.
BenjaminB
1
Depende de por qué necesita código nativo. Si lo único que le importa es el rendimiento en estado estable, entonces la JVM está absolutamente a la altura del código nativo. Si necesita bibliotecas nativas, puede usar JNI desde JVM (que es lo suficientemente bueno para juegos 3D en tiempo real). Sin embargo, si necesita tiempo de inicio en milisegundos o tiene restricciones de memoria severas como en un dispositivo incorporado, acepto que la JVM puede no ser ideal.
mikera
mikera, también podría desear la facilidad de implementación (una dependencia menos para un paquete de Linux, o no requerir que el usuario instale el JRE en Windows, posiblemente incluso para darle a alguien un .exe o un elf). Sí, dar solo un binario es un caso de esquina, pero aún así, es posible con una aplicación nativa pero no con un programa que necesita la JVM.
Alexander
1
@Alexander: acepta que quieres una implementación sencilla, aunque dependiendo de tu perspectiva de las dependencias, esto puede ser un punto positivo para Clojure: las aplicaciones Clojure tienen exactamente una dependencia directa (la JVM), mientras que un binario nativo tiene al menos dos (el sistema operativo y la arquitectura específica del hardware)
mikera
"todo se compila en código nativo a través de JIT en la JVM": NO. (aclaro eso y
elimino
8

Lisp común

Parece admitir todos los requisitos anteriores. El enlace lo llevará a un libro en línea que cubre todo lo que necesita saber para comenzar.

Gary Rowe
fuente
1
Common Lisp genera código nativo?
Klaim
66
@Klaim: Common Lisp es lenguaje de programación. Los lenguajes de programación no generan código, los compiladores sí. Entonces, al igual que para casi cualquier otro lenguaje de programación en el planeta (C, C ++, Java, Ruby, ECMAScript, lo que sea), existen compiladores para Common Lisp que generan código nativo. Y al igual que para casi cualquier otro idioma de programación, hay compiladores que generan el código de bytes JVML, el código de bytes CIL, el código fuente C, el código fuente ECMAScript. Y al igual que para casi cualquier otro lenguaje de programación, hay intérpretes.
Jörg W Mittag
2
@Klaim: ¿Estás hablando de la evalfunción? Es solo una función, puede implementarla de la forma que desee. Algunas implementaciones tienen un intérprete separado que se envían con el ejecutable compilado. Algunos simplemente envían el compilador en sí con el ejecutable compilado. Algunos solo compilan el código en tiempo de ejecución de todos modos. Y si usted está hablando de macros: los que sólo se ejecute en tiempo de compilación de todos modos. Esa es la belleza de eso.
Jörg W Mittag
2
@nCdy Los () s en Lisp surgen como resultado de proporcionar sintaxis para diferenciar entre listas y átomos dentro de una expresión s.
Gary Rowe
1
@ Jörg W Mittag: Estoy empezando a sospechar que simplemente te gusta decir la palabra "ortogonal". ;)
FrustratedWithFormsDesigner
5

OCaml es el único idioma que proporciona todas las funciones que solicita. (Pero no sé para mixin). Incluso tiene un marco web llamado Ocsigen y es más que un lenguaje exagerado, es un idioma antiguo, con una base de usuarios real (empresas, universidades, aficionados) y años de mejoras y pruebas. .

BenjaminB
fuente
2
Pero la metaprogramación solo se realiza mediante una herramienta externa de un solo paso (CamlP4).
SK-logic
Tenga en cuenta que algunos de los "idiomas exagerados" de hoy en día podrían convertirse en los "viejos idiomas" del mañana, con una base [...] de usuarios real y años de mejoras y pruebas ". Incluso podrían alcanzar el mismo nivel de penetración en el mercado y aceptación pública. :)
haylem
2

Definitivamente Scala puede cumplir con sus requisitos:

  1. compilado y se ejecuta en JVM, por lo que es win / linux / mac.
  2. admite programación funcional y OO.
  3. admite cosas funcionales que mencionas. La coincidencia de patrones se ve muy bien y se usa activamente. Carece de soporte de recursión de cola ya que JVM no lo admite, pero las llamadas de recursión pueden optimizarse en algunos casos.
  4. La metaprogramación no es compatible. El lenguaje es genial ^ W bastante bueno para DSL. (fijo)
  5. tiene mixins (rasgos).
  6. Echa un vistazo a Lift web framework. Utiliza características funcionales del lenguaje y tiene características avanzadas muy interesantes de ver. También hay algunos otros marcos web (¡jugar !, etc.)
  7. basado en JVM tan estable.
  8. La sintaxis es bastante limpia. No hay un infierno de paréntesis (lo siento lispers, esa es solo mi opinión personal) allí y el uso de punto y coma se reduce a opcional en muchos casos.

Además, Scala tiene un gran soporte para programación paralela (por actores). La comunidad Scala está creciendo y se utiliza en proyectos reales (Twitter). El lenguaje es bastante difícil de aprender, ya que tiene muchas características y azúcar sintáctico, pero una vez que lo manejes, seguramente disfrutarás de la programación con él.

tener sentido
fuente
En comparación con el rasgo de clojure, Scala permite la composición mixina en la que el rasgo (interfaz) puede heredar clases a través de la linealización de tipo .
prasonscala
2
4. La metaprogramación no es compatible en absoluto. Los DSL se implementan en funciones de alto orden y sobrecarga, sin ninguna ayuda de metaprogramación. Como resultado, esas DSL son limitadas, limitantes y lentas. No hay generación de código en tiempo de compilación disponible en Scala. Nada como las macros de Lisp.
SK-logic
Realmente no me gusta la sintaxis de Scala después de todo ... Es personal)
cnd
1
@ SK-logic Lo comprobé y ahora estoy de acuerdo contigo. Una vez que miré a través de "DSL en acción" y hubo un ejemplo de Scala DSL, entonces pensé que estaba bien para DSL. Obviamente Lisp, Clojure funcionará mucho mejor aquí.
make_sense