【问题标题】:"Live" code and rapid prototyping with C++ and LLVM JIT?使用 C++ 和 LLVM JIT 的“实时”代码和快速原型设计?
【发布时间】:2012-09-16 09:09:27
【问题描述】:

您可能已经看到 Bret Victor's "live" JS IDE 或它启发的一些 alternative implementations,扩展到其他语言,但仍保留为基于 VM 的语言。

然而,昨天我偶然发现了the same concept, applied in good old C++,这要归功于 LLVM。仍然是一个非常早期且不成熟的实现,但具有很大的潜力。

我真的很好奇它的实现,但是作者已经公开并且可能不会公开它。

所以我的问题是,如果有人知道如何实现类似功能的资源,我的意思是几乎瞬时的编译和两个连接,提供代码的实时反馈,允许视觉部分更改甚至生成和预览附加代码?

【问题讨论】:

  • 在那个演示中它不是很“实时”——实际上是一个非常典型的编译延迟。至于那个颜色选择器的例子,显然,它是通过某种简单的仪器完成的(用 LLVM 很容易做到)。例如,检测所有 Colour(...) 构造函数并将它们的参数提升到全局变量中。
  • 正如你自己所说,它是用 LLVM 完成的。您应该查看 LLVM,因为它是“关于如何实现类似功能的资源”。该项目包含几个子项目。包括一个非常先进的 C/C++/ObjC 预处理器(Apple 使用它来实现所有 XCode 高级功能)、从多种语言到 LLVM 中间表示代码的实际编译器(又名 LLVM IR,它是一种类似于汇编语言但带有 SSA)、优化器从事 LLVM IR、将 LLVM IR 转换为实际二进制文件的代码生成器以及 LLVM IR 的解释器(具有 JIT 能力)。
  • @AnalogFile - LLVM 是 API,我在询问有关如何使用 API 执行此操作的资源。我检查了他们提供的一些示例,但这些都是相当基本的。我希望有一些东西可以帮助我避免深入研究文档来以乏味的方式解决问题。
  • 嗯,这种东西目前是最前沿的东西。我认为至少在十年内不会有关于如何做到这一点的教程。我可以在脑海中描绘它是如何工作的,但这并不容易,涉及大量代码和非常先进的编译器的内部知识。在高级编译器的内部结构成为常识之前,这对于教程或通用资源来说并不重要。
  • 这有点像问如何为操作系统编写优化的调度程序。您只是在 80 年代末和 90 年代(尤其是在 Linux、BSD 和开源操作系统变得普遍的 90 年代)才开始了解这些事情。仍然需要了解很多内部知识才能真正做到这一点。

标签: c++ compilation real-time llvm jit


【解决方案1】:

名为“Cling”的基于 clang 的 C/C++ 解释器可能是相关的一段代码。看看它如何用于实时构建 GUI:http://www.youtube.com/watch?v=BrjV1ZgYbbA

【讨论】:

    【解决方案2】:

    Linux:如果有人想要一种简单的方法来几乎实时地测试快速的 C/C++ 代码,您可以使用我组装的这段代码:

    #!/bin/bash
    #Requires: inotify-tools
    ################################
    # Adjust values:
    terminal="xterm"
    editor="vim"
    compiler="clang++"
    ################################
    if [[ $1 == "" ]]; then
        echo "Usage: $0 example.cpp";
        exit
    fi
    file_to_edit=$1
    file_output=${file_to_edit%%.*}
    (while(true); do 
        change=$(inotifywait -q -e close_write,moved_to,create .);
        change=${change#./ * }
        if [ "$change" = "$file_to_edit" ]; then
            ($compiler $file_to_edit -o $file_output);
        fi
    done) & > /dev/null
    $terminal -e "watch -n 1 ./$file_output" &
    $editor $file_to_edit;
    pkill -P $$
    

    注意:它需要“inotify-tools”包。

    它是如何工作的?

    1) 它将打开一个终端(默认值:xterm),其中每秒将使用“watch”命令执行二进制文件(如果不存在文件,它将仅显示“未找到错误”)

    2) 如果你的 C/C++ 代码发生变化,它会编译它(默认编译器:clang++,但你可以使用 gcc 等)。如果需要,可以修改编译命令:$compiler $file_to_edit -o $file_output

    3) 它将使用您选择的编辑器(默认为 vim)打开文件。

    4) 退出时将关闭终端和监控进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2011-05-03
      • 2011-02-17
      相关资源
      最近更新 更多