针对LLVM的功能语言

时间:2010-06-10 06:36:33

标签: programming-languages scala functional-programming llvm

是否有任何针对LLVM的语言:

  • 是静态类型的
  • 使用类型推断
  • 是功能性的(即lambda表达式,闭包,列表原语,列表推导等)
  • 拥有一流的面向对象特性(继承,多态,混合等)
  • 拥有复杂的类型系统(泛型,协方差和逆变等)

Scala就是所有这些,但只针对JVM。 F#(在某种程度上是C#)是大多数(如果不是全部),但仅针对.NET。什么类似的语言针对LLVM?

3 个答案:

答案 0 :(得分:42)

Haskell (GHC) backend针对LLVM。

您也可以尝试通过Mono-LLVM使用F#。

此外,VMKit项目正在LLVM之上实现JVM和.NET CLI;它还处于早期阶段,但一旦成熟,你可以将它与F#或任何面向JVM的函数语言(Scala,Clojure等)一起使用

答案 1 :(得分:14)

我不确定这些进展有多远,但它们可能值得添加到列表中:

用于LLVM的Scala - https://github.com/greedy/scala/
LLVM的木材 - https://bitbucket.org/capitrane/timber-llvm
LLVM的单声道 - http://www.mono-project.com/Mono_LLVM

答案 2 :(得分:-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

“功能正常(即lambda表达式,闭包,列表原语,列表推导等)”

c ++中的Lambdas看起来像[capture_spec](arglist...) { body }。您可以通过引用捕获已关闭的变量(类似于lisp),如下所示:[&amp;]。或者,您可以按值捕获:[=]。

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

在C ++ 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的包装来装配列表推导...

“拥有一流的面向对象特性(继承,多态,混合等)”

当然。 C ++允许虚拟调度+多继承+实现继承。注意:mixins只是实现继承。如果您的语言禁止多重继承,则只需要一种特殊的“mixin”机制。

“拥有复杂的类型系统(泛型,协方差和逆变等)”

据我所知,C ++模板是任何语言中功能最强大的泛型系统。