2010-06-10 12 views
36

Ci sono lingue che hanno come target la LLVM che:linguaggi funzionali rivolte al LLVM

  • staticamente tipizzato
  • Usa inferenza di tipo
  • sono funzionali (cioè lambda expressions, chiusure, Lista primitive, list comprehension , ecc.)
  • Avere caratteristiche orientate agli oggetti di prima classe (ereditarietà, polimorfismo, mixin, ecc.)
  • Avere un sistema di tipo sofisticato (generici, covarianza e controvarianza, ecc.)

Scala è tutto ciò, ma si rivolge solo alla JVM. F # (e in parte C#) è la maggior parte se non tutte queste, ma solo gli obiettivi .NET. Quale linguaggio simile si rivolge al LLVM?

+0

Stai chiedendo molto da una piattaforma così piccola. Sarei davvero sorpreso se hai trovato qualcosa che corrisponde a tutti i tuoi criteri. Perché hai bisogno di usare specificamente LLVM? –

+0

Sì, probabilmente hai ragione. A questo punto non ho un caso d'uso specifico, sono solo curioso del futuro dei linguaggi di programmazione. Mi sembra che LLVM abbia un futuro molto brillante, e dato che sono anche molto colpito dal nuovo linguaggio funzionale Scala che ha come target .NET e JVM, spero che qualcuno là fuori stia lavorando su qualcosa di simile per LLVM . – Matthew

+0

Sì, è sicuramente un progetto interessante. Il problema è che quando si dispone di piattaforme di livello superiore come Java e .NET che sono molto più potenti, nessuno vuole veramente occuparsi di qualcosa di livello basso come LLVM. –

risposta

41

C'è un Haskell (GHC) backend targeting per LLVM.

Si potrebbe anche provare a utilizzare F # tramite Mono-LLVM.

Inoltre, il progetto VMKit sta implementando sia la JVM che la CLI .NET su LLVM; è ancora agli stadi iniziali ma, una volta maturo, è possibile utilizzarlo con F # o qualsiasi linguaggio funzionale di targeting JVM (Scala, Clojure, ecc.)

+2

Moderno: il back-end GHC LLVM è ora "completo" e in genere più veloce di C e Nativo. – alternative

+0

@monadic - grazie! post aggiornato. – tzaman

+0

C'è anche http://purelang.bitbucket.org/ che è funzionale anche se digitato in modo dinamico. –

-3

Sì ... clang. Il C++ ha tutto sul tuo elenco tranne che per la comprensione delle liste. È anche il linguaggio LLVM di punta.

"staticamente tipizzato"

Yup

"Usa inferenza di tipo"

// 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 

"sono (cioè lambda espressioni, chiusure, Lista primitive, list comprehension, ecc) funzionali"

Lambdas in C++ assomiglia a [capture_spec](arglist...) { body }. Puoi catturare le variabili chiuse per riferimento (simile a lisp) in questo modo: [&]. In alternativa puoi acquisire per valore in questo modo: [=].

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

Nella mappa C++, zip e riduzione sono chiamati std :: transform e 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; }); 

È possibile anche mettere su list comprehension utilizzando una macro ed e un wrapper per std :: trasformare se si vuole veramente ...

"hanno caratteristiche object-oriented di prima classe (ereditarietà, polimorfismo, mixins, ecc.) "

Naturalmente.C + + consente dispacciamento virtuale + ereditarietà multipla + ereditarietà di implementazione. Nota: i mixin sono solo ereditarietà dell'implementazione. Hai solo bisogno di un meccanismo speciale "mixin" se la tua lingua proibisce l'ereditarietà multipla.

"Avere un sistema di tipo sofisticato (farmaci generici, covarianza e controvarianza, etc.)" Modelli

C++ sono il più potente sistema di farmaci generici in qualsiasi lingua per quanto ne so.

+5

Non chiamerei i template C++ _sofisticato_ o anche un _type system_, ma hanno una potenza espressiva alla pari con alcuni sistemi di tipo sofisticati :) – opqdonut

+3

Innanzitutto, non è un'inferenza di tipo, come è comunemente intesa nel contesto dei linguaggi funzionali digitati. In secondo luogo, l'ereditarietà multipla dell'IIP non consente più override di un metodo virtuale senza un altro override disambigua nella parte inferiore del diamante, quindi l'ereditarietà multipla non copre tutti i casi d'uso per i mixin. –

+0

@RyanCulpepper C++ ha entrambi i tipi di inferenza di tipo (inferenza locale e inferenza sui parametri alle funzioni generiche). Questo è come dire, ML. In effetti, credo che usi gli stessi algoritmi di inferenza del tipo sottostante ... Non sono sicuro di aver capito la parte del tuo commento sui mixin. – catphive

Problemi correlati