2010-06-10 9 views
36

Czy istnieją jakieś języki ukierunkowane na LLVM, że:Języki funkcjonalne ukierunkowane na LLVM

  • statycznie wpisane
  • Zastosowanie typ wnioskowanie
  • są funkcjonalne (tj lambda expressions, zamknięcia, lista prymitywy, listowych , itp.)
  • Mieć pierwszorzędne cechy obiektowe (dziedziczenie, polimorfizm, mixiny itp.)
  • Mieć wyrafinowany system typów (rodzajowy, kowariancja i przeciwwariancja itp.)

Scala to wszystko, ale jest przeznaczona tylko dla maszyny JVM. F # (i do pewnego stopnia C#) to większość, jeśli nie wszystkie, ale tylko obiekty .NET. Jaki język jest podobny do LLVM?

+0

Prosisz o wiele z tak małej platformy. Byłbym bardzo zaskoczony, gdybyś znalazł coś, co pasuje do wszystkich twoich kryteriów. Dlaczego musisz używać LLVM specjalnie? –

+0

Tak, prawdopodobnie masz rację. W tej chwili nie mam konkretnego przypadku użycia, ciekawi mnie tylko przyszłość języków programowania. Wydaje mi się, że LLVM ma bardzo świetlaną przyszłość, a także jestem pod dużym wrażeniem nowej funkcjonalnej wersji językowej Scala, która jest skierowana do .NET i JVM, mam nadzieję, że ktoś tam pracuje nad czymś podobnym do LLVM. . – Matthew

+0

Tak, to zdecydowanie interesujący projekt. Problem polega na tym, że jeśli masz platformy o wyższym poziomie, takie jak Java i .NET, które są znacznie potężniejsze, nikt tak naprawdę nie chce zajmować się czymś tak niskim jak LLVM. –

Odpowiedz

41

Istnieje Haskell (GHC) backend kierowania na LLVM.

Możesz także spróbować użyć F # do Mono-LLVM.

Ponadto projekt VMKit implementuje zarówno maszynę JVM, jak i interfejs CLI platformy .NET na LLVM; wciąż jest na wczesnym etapie, ale gdy dojrzeje, możesz go użyć z F # lub innymi językami funkcjonalnymi JVM (Scala, Clojure, itp.)

+2

Współczesność: backend GHC LLVM jest teraz "kompletny" i zazwyczaj szybszy niż C i Native. – alternative

+0

@monadic - thanks! po aktualizacji. – tzaman

+0

Istnieje również http://purelang.bitbucket.org/, który jest funkcjonalny, chociaż dynamicznie wpisany. –

-3

Tak ... clang. C++ ma wszystko na twojej liście, z wyjątkiem listy. Jest to również flagowy język LLVM.

"statycznie wpisane"

Yup

"Użyj typ wnioskowanie"

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

"są funkcjonalne (czyli lambda wyrażenia, zamknięcia, lista prymitywy, listowych, etc.)"

Lambda w języku C++ wygląda jak [capture_spec](arglist...) { body }. Możesz przechwytywać zamknięte zmienne przez odwołanie (podobnie jak seplenienie), tak jak to: [&]. Alternatywnie możesz przechwytywać według wartości, jak na przykład: [=].

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

W mapie C++, zip i redukcja nazywane są std :: transform i 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; }); 

Można również sklecić listowych za pomocą makra i i owinięcie wokół std :: przekształcić, jeśli naprawdę chcesz ...

posiadają cechy obiektowe Pierwsza klasa (dziedziczenie, polimorfizm”, mixins, itp.) "

Oczywiście.C++ umożliwia wirtualną wysyłkę + dziedziczenie dziedziczenia + wielokrotnego. Uwaga: mixiny są po prostu dziedziczeniem implementacji. Potrzebujesz tylko specjalnego mechanizmu "mixin", jeśli twój język zabrania wielokrotnego dziedziczenia.

"Have a zaawansowany system typu (leki generyczne, kowariancji i kontrawariancja, etc.)"

C++ szablony są najbardziej wydajny system rodzajowych w dowolnym języku, o ile wiem.

+5

Nie nazwałbym szablonów C++ _sophisticated_ ani nawet _type system_, ale mają one moc ekspresywną na równi z wyrafinowanymi systemami typów :) – opqdonut

+3

Po pierwsze, nie jest to wnioskowanie typu, ponieważ jest powszechnie rozumiane w kontekście typowych języków funkcjonalnych. Po drugie, dziedziczenie wielokrotne IIUC nie pozwala na wielokrotne przesłonięcia metody wirtualnej bez kolejnego jednoznacznego zastąpienia na dole diamentu, więc dziedziczenie wielokrotne nie obejmuje wszystkich przypadków użycia dla mixinów. –

+0

@RyanCulpepper C++ ma oba rodzaje typów wnioskowania (wnioskowanie lokalne i wnioskowanie na parametry do funkcji ogólnych). To jest to samo, co powiedz, ML. W rzeczywistości uważam, że używa on tych samych podstawowych algorytmów wnioskowania ... Nie jestem pewien, czy rozumiem tę część twojego komentarza na temat mixins. – catphive