36

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

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

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

4

3 回答 3

43

有一个针对 LLVM的Haskell (GHC) 后端。

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

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

于 2010-06-10T06:56:34.360 回答
14

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

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

于 2011-02-16T07:52:36.047 回答
-3

是的……铿锵声。除了列表推导之外,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++ 中的 Lambda 看起来像[capture_spec](arglist...) { body }. 您可以通过引用(类似于 lisp)捕获封闭变量,如下所示:[&]。或者,您可以像这样按值捕获:[=]。

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++ 模板是任何语言中最强大的泛型系统。

于 2011-12-03T10:25:02.310 回答