Подтвердить что ты не робот

Функциональные языки, ориентированные на LLVM

Существуют ли какие-либо языки, предназначенные для LLVM, которые:

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

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

4b9b3361

Ответ 1

Здесь сервер Haskell (GHC), нацеленный на LLVM.

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

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

Ответ 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", если ваш язык запрещает множественное наследование.

"У вас сложная система типов (дженерики, ковариация и контравариантность и т.д.)"

С++ шаблоны - самая мощная система дженериков на любом языке, насколько мне известно.