2010-06-10 4 views
36

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

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

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

+0

Вы много просите от такой небольшой платформы. Я был бы очень удивлен, если бы нашел то, что соответствует всем вашим критериям. Зачем вам нужно использовать LLVM? –

+0

Да, вы, вероятно, правы. На данный момент у меня нет конкретного варианта использования, мне просто интересно узнать о будущем языков программирования. Мне кажется, что LLVM имеет очень светлое будущее, и учитывая, что меня тоже впечатляет новый функциональный язык Scala, который нацелен на .NET и JVM, я надеюсь, что кто-то там работает над чем-то похожим для LLVM , – Matthew

+0

Да, это определенно интересный проект. Проблема в том, что когда у вас более мощные платформы, такие как Java и .NET, которые намного мощнее, никто не хочет иметь дело с чем-то вроде низкоуровневого LLVM. –

ответ

41

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

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

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

+2

Modern: GHC LLVM backend теперь «завершен» и обычно быстрее, чем C и Native. – alternative

+0

@monadic - спасибо! сообщение обновлено. – tzaman

+0

Существует также http://purelang.bitbucket.org/, который функционально, хотя и динамически типизирован. –

-3

Да ... clang. В 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 

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

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

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

На карте C++, 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; }); 

Вы можете также соорудить списочные с помощью макросов и и обертки станда :: преобразование, если вы действительно хотите ...

«имеют объектно-ориентированные функции первого класса (наследование, полиморфизм, миксины и т. д.) "

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

«Есть сложные системы типа (генерики, ковариация и контрвариантность и т.д.)»

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

+5

Я бы не назвал шаблоны C++ _sophisticated_ или даже _type system_, но они обладают выразительной мощностью наравне с некоторыми сложными системами типов. – opqdonut

+3

Во-первых, это не вывод типа, как это обычно понимают в контексте типизированных функциональных языков. Во-вторых, множественное наследование IIUC не допускает множественных переопределений виртуального метода без другого переопределения переопределения в нижней части алмаза, поэтому множественное наследование не распространяется на все варианты использования для mixins. –

+0

@RyanCulpepper C++ имеет оба типа вывода типа (локальный вывод и вывод по параметрам для общих функций). Это то же самое, что сказать, ML. На самом деле, я считаю, что он использует одни и те же основные алгоритмы вывода ... Я не уверен, что я понимаю часть вашего комментария о mixins. – catphive

Смежные вопросы