【问题标题】:Functional languages targeting the LLVM针对 LLVM 的函数式语言
【发布时间】:2011-03-02 00:41:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您对这么小的平台提出了很多要求。如果您找到符合您所有条件的东西,我会感到非常惊讶。为什么需要专门使用 LLVM?
  • @musicfreak:有很多语言提供上述全部或大部分功能,可以编译成汇编。
  • 语言不针对任何特定的处理器架构,无论是物理 CPU 还是用软件编写的虚拟机。语言的实现针对特定架构。例如 Sun 的 Java 实现以 Sun 的 JVM 为目标。原则上没有什么可以阻止有人将 Java 本地移植到 x86 或 ARM 甚至微软的 CLR。​​
  • @JeremyP:GNU GCJ 将 Java 编译为本机代码,IKVM.NET 将 Java 编译为 CIL。 q.e.d. :-)
  • 一流的对象AND一流的函数是在任何平台上都可以找到的稀有面包。

标签: programming-languages scala functional-programming llvm


【解决方案1】:

有一个针对 LLVM 的 Haskell (GHC) backend

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

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

【讨论】:

  • 现代:GHC LLVM 后端现在“完整”并且通常比 C 和 Native 都快。
  • 还有purelang.bitbucket.org,虽然是动态类型的,但也有功能。
【解决方案2】:

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

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

【讨论】:

    【解决方案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++ 中的 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++ 模板是所有语言中最强大的泛型系统。

    【讨论】:

    • 我不会将 C++ 模板称为 sophisticated 甚至是 类型系统,但它们确实具有与某些复杂类型系统相当的表达能力: )
    • 首先,这不是类型推断,因为它在类型函数语言的上下文中通常被理解。其次,IIUC 多重继承不允许在菱形底部没有另一个明确覆盖的情况下对虚拟方法进行多重覆盖,因此多重继承并未涵盖 mixins 的所有用例。
    • @RyanCulpepper C++ 有两种类型推断(局部推断和泛型函数参数推断)。这与 ML 相同。事实上,我相信它使用相同的底层类型推断算法......我不确定我是否理解你关于 mixins 的评论部分。
    • @catphive:以下是我认为 C++ 不支持的类型推断类型的一些示例(但我可能错了):你能写 auto f(auto x) { return x+1;} 并让它推断签名 @987654327 @(忽略+的重载性)?你能写[](auto x) { return x+5; } 并让它推断x 必须有int 类型吗?你能写出类似auto f(auto x) { vector v; v.push_back(x); return v; } 的东西并让它推断出多态(模板)签名template &lt;class T&gt; vector&lt;T&gt; f(T) 吗?这就是类型推断在 ML 和 Haskell 等语言中的含义。
    • 我记得类型推断就是类型推断的日子。然后出现了 Scala,它甚至无法推断出最简单的递归函数(如阶乘)的类型,但这并没有阻止 Scala 社区声称它具有类型推断功能。然后 C# 社区紧随其后。现在您说 C++ 甚至无法推断通用标识 lambda 函数的类型,但您仍然认为它具有类型推断功能。我的意思是,说真的,WTF?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2010-12-18
    • 2018-08-02
    • 2011-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多