Функциональные языки, ориентированные на LLVM
Существуют ли какие-либо языки, предназначенные для LLVM, которые:
- Статически типизированы
- Использовать вывод типа
- Являются функциональными (например, лямбда-выражения, замыкания, примитивы списков, списки и т.д.).
- Имеют первоклассные объектно-ориентированные функции (наследование, полиморфизм, миксины и т.д.).
- У вас сложная система типов (дженерики, ковариация и контравариантность и т.д.).
Scala - все это, но только для JVM. F # (и в некоторой степени С#) - это большинство, если не все из них, но только целевые .NET. Какой же язык предназначен для LLVM?
Ответы
Ответ 1
Здесь сервер Haskell (GHC), нацеленный на LLVM.
Вы также можете попробовать использовать F # через Mono-LLVM.
Кроме того, проект VMKit реализует как JVM, так и .NET CLI поверх LLVM; он все еще находится на ранних стадиях, но как только он созреет, вы можете использовать его с F # или любыми функциональными языками JVM-таргетинга (Scala, Clojure и т.д.)
Ответ 2
Я не уверен, насколько они продвинулись вперед, но их можно добавить в список:
Scala для LLVM - https://github.com/greedy/scala/
Древесина для LLVM - https://bitbucket.org/capitrane/timber-llvm
Моно для LLVM - http://www.mono-project.com/Mono_LLVM
Ответ 3
Да... clang. В С++ есть все, что есть в вашем списке, за исключением списков. Это также флагманский язык 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
"Являются функциональными (например, лямбда-выражения, замыкания, примитивы списков, списки и т.д.)"
Lambdas в С++ выглядит как [capture_spec](arglist...) { body }
. Вы можете захватить закрытые переменные по ссылке (аналогично lisp) следующим образом: [&]. В качестве альтернативы вы можете выполнить захват по значению следующим образом: [=].
int local = 10;
auto my_closure = [&]() { return local;};
my_closure(); // returns 10.
В С++ map, zip и reduce называются std:: transform и 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; });
Вы также можете настраивать списки, используя макрос и обертку вокруг std:: transform, если вы действительно хотите...
"Иметь первоклассные объектно-ориентированные функции (наследование, полиморфизм, миксины и т.д.)"
Конечно. С++ позволяет виртуальную диспетчеру + множественное наследование + наследование реализации. Примечание: mixins - это просто наследование реализации. Вам нужен только специальный механизм "mixin", если ваш язык запрещает множественное наследование.
"У вас сложная система типов (дженерики, ковариация и контравариантность и т.д.)"
С++ шаблоны - самая мощная система дженериков на любом языке, насколько мне известно.