2010-06-10 10 views
36

¿Hay lenguas que se dirigen a la LLVM que:Los lenguajes funcionales dirigidos a la LLVM

  • estáticamente mecanografiadas
  • Uso inferencia de tipos
  • son funcionales (es decir lambda expresiones, cierres de lista primitivas, las listas por comprensión , etc.)
  • Tiene funciones orientadas a objetos de primera clase (herencia, polimorfismo, mixins, etc.)
  • Tiene un sistema de tipos sofisticado (genéricos, covarianza y contravarianza, etc.)

Scala es todo esto, pero solo está destinado a la JVM. F # (y hasta cierto punto C#) es la mayoría si no todos estos, pero solo los objetivos .NET. ¿Qué lenguaje similar se dirige a LLVM?

+0

Estás pidiendo mucho desde una plataforma tan pequeña. Me sorprendería mucho si encontraras algo que coincida con todos tus criterios. ¿Por qué necesita usar LLVM específicamente? –

+0

Sí, probablemente tengas razón. No tengo un caso de uso específico en este punto, solo tengo curiosidad sobre el futuro de los lenguajes de programación. Me parece que LLVM tiene un futuro muy brillante, y dado que también estoy muy impresionado por el nuevo lenguaje funcional Scala que apunta a .NET y JVM, espero que alguien esté trabajando en algo similar para LLVM . – Matthew

+0

Sí, definitivamente es un proyecto interesante. El problema es que cuando tienes plataformas de alto nivel como Java y .NET que son mucho más poderosas, nadie realmente quiere lidiar con algo de bajo nivel como LLVM. –

Respuesta

41

Hay un Haskell (GHC) backend dirigido a LLVM.

También podría intentar usar F # hasta Mono-LLVM.

Además, el proyecto VMKit está implementando tanto la JVM como la .NET CLI encima de LLVM; todavía está en sus primeras etapas, pero una vez que madura puede usarlo con F # o cualquier lenguaje funcional de JVM (Scala, Clojure, etc.)

+2

Moderno: el backend GHC LLVM ahora es "completo" y típicamente más rápido que C y Native. – alternative

+0

@monadic - gracias! publicación actualizada – tzaman

+0

También hay http://purelang.bitbucket.org/ que es funcional aunque está tipeado dinámicamente. –

-3

Sí ... clang. C++ tiene todo en su lista, excepto la lista de comprensiones. También es el lenguaje LLVM insignia.

"se escriben de forma estática"

"Uso inferencia de tipos"

// local type inference 
auto var = 10; 

// type inference on parameters to generic functions 
template <typename T> 
void my_function(T arg) { 
    ... 
} 
my_function(1) // infers that T = int 

// correctly handles more complicated cases where type is partially specified. 
template <typename T> 
void my_function(std::vector<T> arg) { 
    ... 
} 
std::vector<int> my_vec = {1, 2, 3, 4}; 
my_function(my_vec) // infers that T = int 

"son (es decir lambda expresiones, los cierres, las primitivas de lista, listas por comprensión, etc.) funcionales"

Lambdas en C++ parece [capture_spec](arglist...) { body }. Puede capturar variables cerradas por referencia (similar a lisp) como lo siguiente: [&]. Alternativamente, puede capturar por valor de la siguiente manera: [=].

int local = 10; 
auto my_closure = [&]() { return local;}; 
my_closure(); // returns 10. 

En C++ map, zip y reduce se llaman std :: transform y std :: accumulate.

std::vector<int> vec = {1, 2, 3, 4}; 
int sum = std::accumulate(vec.begin(), vec.end(), [](int x, int y) { return x + y; }); 

También puede armar listas por comprensión utilizando una macro y una envoltura alrededor y std :: transformar si realmente quiere ...

"Tienen características orientadas a objetos de primera clase (herencia, polimorfismo, mixins, etc.) "

Por supuesto.C++ permite despacho virtual + herencia múltiple + herencia de implementación. Nota: mixins es solo herencia de implementación. Solo necesita un mecanismo especial de "mixin" si su idioma prohíbe la herencia múltiple.

"Tener un sistema sofisticado tipo (genéricos, covarianza y contravarianza, etc.)" plantillas

C++ son el sistema más potente genéricos en cualquier idioma por lo que yo sé.

+5

No me gustaría llamar a las plantillas de C++ _sophisticated_ o incluso _type system_, pero tienen poder expresivo a la par con algunos sofisticados sistemas de tipo :) – opqdonut

+3

En primer lugar, eso no es inferencia tipo como se entiende comúnmente en el contexto de los lenguajes funcionales tipados. En segundo lugar, la herencia múltiple de IIUC no permite reemplazos múltiples de un método virtual sin otra anulación de desambiguación en la parte inferior del diamante, por lo que la herencia múltiple no cubre todos los casos de uso para mixins. –

+0

@RyanCulpepper C++ tiene ambos tipos de inferencia de tipo (inferencia local e inferencia de parámetros para funciones genéricas). Esto es lo mismo que decir, ML. De hecho, creo que usa los mismos algoritmos de inferencia de tipo subyacente ... No estoy seguro de entender la parte de tu comentario sobre mixins. – catphive

Cuestiones relacionadas