在 Jupyter Notebook 中交互式运行 C++ 代码

Jupyter Notebook 支持非常多的编程语言,而且可以直接运行这些语言的代码。要让 Jupyter Notebook 能够运行特定语言的代码,需要添加对应的内核。具体支持的语言及内核可以查看该链接:https://github.com/jupyter/jupyter/wiki/Jupyter-kernels 。

今天要讲的,是支持在交互模式下执行 C++ 代码的 cling 内核。看到官方的示例,我着实感到惊讶,C++代码也能够像 Python 那样边写边运行?关于其内部的机理我还未深入探究,但最重要的是赶紧装上 cling 内核,体验一下交互式执行 C++ 代码的快感。

在经过两天的折腾之后,终于将 C++ 的 cling 内核装上了。由于我是在 Linux 机器上安装该内核,主要问题还是编译过程繁琐。尝试了很多方法,包括下载源代码、手动执行各个编译过程,结果因种种问题而失败,不过也从中学到了不少东西。最后克隆了官方的 Github 仓库,使用其提供的 CPT 工具直接完成编译,一步到位,非常简单。

由于 cling 内核依赖于 Python3,因此如果你的机器上安装的是 Python2 的话,必须先安装 Python3。安装 Python3 后,可以顺便将其添加到 Jupyter Notebook 内核中,便于以后使用。

添加 Python3 内核

安装 Python3:

$ apt-get install python3 python3-pip

然后安装 ipykernel 模块:

python3 -m pip install ipykernel

该过程耗时较长,成功后将出现以下提示:

Successfully installed ipykernel ipython traitlets jupyter-client tornado setuptools pexpect simplegeneric prompt-toolkit typing pickleshare pygments jedi decorator ipython-genutils python-dateutil jupyter-core pyzmq backports-abc ptyprocess wcwidth

最后,将 Python 3 内核安装到 Jupyter Notebook 中:

python3 -m ipykernel install --user

OK,此时打开 Jupyter Notebook,你将会发现已经多了一个 Python3 内核了。

添加 C++ cling 内核

克隆 cling 的 Github 官方仓库:

git clone https://github.com/root-project/cling.git

在进行编译操作之前,首先要确保你的机器上已经装好了 cmake 工具,即能够直接通过输入命令 cmake 执行程序。

如果 cmake 已经正确安装,就可以进行以下的操作了。

切换到 cling/tools/packaging/ 目录下,执行以下两条命令:

chmod +x cpt.py
./cpt.py --check-requirements && ./cpt.py --create-dev-env Debug --with-workdir=./cling-build/

这个过程包含了从网络上获取源文件以及编译,是最为耗时的一个阶段,以小时计。

编译完成后,需要在 python3 中安装 clingkernel。切换到 cling/tools/Jupyter/ 目录下,执行

pip3 install kernel/

最后一步,往 Jupyter Notebook 中添加 cling 内核,可以根据自己的需要安装特定 C++ 规范的 cling 内核,例如 cling-cpp11, cling-cpp14, cling-cpp17。

jupyter kernelspec install kernel/cling-cpp17

如果没有其他问题,此时就可以打开 Jupyter Notebook 感受不一样的 C++ 编程了!

官方代码示例

class Rectangle {
    private:
        double w;
        double h;

    public:

        Rectangle(double w_, double h_) {
            w = w_;
            h = h_;
        }
        double area(void) {
            return w * h;
        }
        double perimiter(void) {
            return 2 * (w + h);
        }
};
Rectangle r = Rectangle(5, 4);
r.area();

输出:

(double) 20.000000

Amazing!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注