Функциональные языки, ориентированные на LLVM - PullRequest
36 голосов
/ 10 июня 2010

Существуют ли языки, нацеленные на LLVM, которые:

  • Статически набраны
  • Использовать вывод типа
  • Функциональны (то есть лямбда-выражения, замыкания, примитивы списков, списки и т. Д.)
  • Обладают первоклассными объектно-ориентированными функциями (наследование, полиморфизм, миксины и т. Д.)
  • Иметь сложную систему типов (дженерики, ковариации и контравариантности и т. Д.)

Scala - все это, но он предназначен только для JVM. F # (и в некоторой степени C #) - большинство, если не все из них, но только для .NET. Какой похожий язык предназначен для LLVM?

Ответы [ 3 ]

42 голосов
/ 10 июня 2010

Существует Haskell (GHC) бэкэнд , предназначенный для LLVM.

Вы также можете попробовать использовать F # через Mono-LLVM .

Такжепроект VMKit реализует как JVM, так и .NET CLI поверх LLVM;он все еще находится на ранних стадиях, но как только он достигнет зрелости, вы сможете использовать его с F # или любыми функциональными языками, ориентированными на JVM (Scala, Clojure и т. д.)

14 голосов
/ 16 февраля 2011

Я не уверен, как далеко они продвинулись, но их, возможно, стоит добавить в список:

Скала для LLVM - https://github.com/greedy/scala/
Древесина для LLVM - https://bitbucket.org/capitrane/timber-llvm
Mono для LLVM - http://www.mono -project.com / Mono_LLVM

0 голосов
/ 03 декабря 2011

Да ... лязг . C ++ имеет все в вашем списке, за исключением понимания списка. Это также основной язык LLVM.

"Статически набраны"

Да

«Использовать вывод типа»

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

"Функциональны (то есть лямбда-выражения, замыкания, примитивы списков, списки и т. Д.)"

Лямбды в c ++ выглядят как [capture_spec](arglist...) { body }. Вы можете захватить закрытые переменные по ссылке (аналогично lisp) следующим образом: [&]. Кроме того, вы можете захватить по значению, например, так: [=].

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

В C ++ map zip и redund называются std :: transform и std :: аккумулировать.

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

Вы также можете настроить списки, используя макрос и обертку вокруг std :: transform, если вы действительно хотите ...

«Иметь первоклассные объектно-ориентированные функции (наследование, полиморфизм, миксины и т. Д.)»

Конечно. C ++ позволяет виртуальную диспетчеризацию + множественное наследование + наследование реализации. Примечание: миксины - это просто наследование реализации. Вам нужен только специальный механизм "mixin", если ваш язык запрещает множественное наследование.

«Иметь сложную систему типов (дженерики, ковариации и контравариантности и т. Д.)»

Шаблоны C ++, насколько я знаю, являются самой мощной универсальной системой на любом языке.

...