C++11/14/17 인터프리터 환경 Jupyter-Cling

Jupyter-Cling



이전에 C++ 인터프리터 Cling에 대해 "C++11 인터프리터 Cling 빌드"이라는 기사를 썼습니다.

C++의 인터프리터이니까 인터프리터 환경의 Jupyter로부터 호출할 수 있지 않을까 하고 Jupyter 커널

Cling 설치



CERN 사이트에서 바이너리도 배포 되고 있기 때문에 통상은 이쪽을 사용하는 것이 좋을 것입니다.

바이너리 버전을 사용하는 경우는 다음 진행해 주세요.

Cling Packaging Tool



Cling 빌드에 뭔가 좋은 스크립트가 준비되어 있으므로 다음 단계로 Cling을 빌드합니다.
또한 Cling을 빌드할 때 Clang을 빌드하기 때문에 매우 시간이 걸립니다.
wget https://raw.githubusercontent.com/root-project/cling/master/tools/packaging/cpt.py
chmod +x cpt.py
./cpt.py --check-requirements && ./cpt.py --create-dev-env Debug --with-workdir=./cling-build/

덧붙여 ./cpt.py --check-requirements 곳에 CMake가 이미 들어 있지 않으면 이끼입니다.
CMake마저 들어 있으면 후는 자동으로 apt를 불러 필요한 라이브러리를 취득해 주는 것 같습니다.
cling-build/ling-Ubuntu-16.04-x86_64-0.5~dev-4681e80 와 같은 폴더가 있기 때문에, 임의의 장소 ( /opt/cling 등)에 심볼릭 링크를 붙이는 등 합니다.

Jupyter


/share/cling/Jupyter/kernel/는 Jupyter 커널을 제공합니다.
pip install -e .
jupyter-kernelspec install --user cling-cpp17
jupyter-kernelspec install --user cling-cpp14
jupyter-kernelspec install --user cling-cpp11

jupyter를 시작할 때 cling에 경로를 통과해야하므로주의하십시오.

run.sh
#!/usr/bin/env bash
PATH=/opt/cling/bin:$PATH jupyter notebook

Hello World





궁금한 곳



c++17이 시작되지 않음



c++17을 선택하면 다음과 같은 오류가 발생하여 커널이 시작되지 않습니다.

에러를 본 느낌 c++1z 밖에 대응하고 있는 것 같습니다. (Ubuntu 16.04 유래?)
error: invalid value 'c++17' in '-std=c++17'
note: use 'c++98' or 'c++03' for 'ISO C++ 1998 with amendments' standard
note: use 'gnu++98' or 'gnu++03' for 'ISO C++ 1998 with amendments and GNU extensions' standard
note: use 'c++11' for 'ISO C++ 2011 with amendments' standard
note: use 'gnu++11' for 'ISO C++ 2011 with amendments and GNU extensions' standard
note: use 'c++14' for 'ISO C++ 2014 with amendments' standard
note: use 'gnu++14' for 'ISO C++ 2014 with amendments and GNU extensions' standard
note: use 'c++1z' for 'Working draft for ISO C++ 2017' standard
note: use 'gnu++1z' for 'Working draft for ISO C++ 2017 with GNU extensions' standard
In file included from input_line_2:1:
/opt/cling/include/cling/Interpreter/RuntimeUniverse.h:162:26: warning: default template arguments for a function template are a C++11 extension [-Wc++11-extensions]
      template <class T, class = T (*)() /*disable for arrays*/>
                         ^       ~~~~~~~
input_line_2:3:62: error: expected function body after function declarator
extern "C" int __cxa_atexit(void (*f)(void*), void*, void*)  noexcept;
                                                             ^
input_line_2:5:55: error: use of undeclared identifier '__cxa_atexit'
extern "C" int atexit(void(*f)())  throw ()  { return __cxa_atexit((void(*)(void*))f, 0, __dso_handle); }
                                                      ^
python3: cling-build/cling-src/tools/clang/lib/AST/DeclBase.cpp:1334: void clang::DeclContext::removeDecl(clang::Decl*): Assertion `(DC->hasExternalVisibleStorage() || Pos != Map->end()) && "no lookup entry for decl"' failed.

응급처치로 다음과 같은 수정을 합니다.

/share/cling/Jupyter/kernel/cling-cpp17/kernel.patch
diff -u a/cling-cpp17/kernel.json b/cling-cpp17/kernel.json
--- a/cling-cpp17/kernel.json   2017-09-06 04:46:58.764971000 +0900
+++ b/cling-cpp17/kernel.json   2017-09-06 07:16:59.802765356 +0900
@@ -4,6 +4,6 @@
       "jupyter-cling-kernel",
       "-f",
       "{connection_file}",
-      "--std=c++17"
+      "--std=c++1z"
   ]
 }


/share/cling/Jupyter/kernel/clingkernel.patch
diff -u a/clingkernel.py b/clingkernel.py
--- a/clingkernel.py    2017-09-06 04:46:58.744971000 +0900
+++ b/clingkernel.py    2017-09-06 07:14:08.954707308 +0900
@@ -92,7 +92,7 @@
     flush_interval = Float(0.25, config=True)

     std = CaselessStrEnum(default_value='c++11',
-            values = ['c++11', 'c++14', 'c++17'],
+            values = ['c++11', 'c++14', 'c++17', 'c++1z'],
             help="C++ standard to use, either c++17, c++14 or c++11").tag(config=True);

     def __init__(self, **kwargs):

다시 설치하면 c++17 커널이 시작됩니다.
pip install -e .
jupyter-kernelspec install --user cling-cpp17

cling이 떨어지면 용서없이 죽는다.



cling이 떨어지는 코드를 실행하면 용서없이 커널이 떨어집니다.

로그를 전혀 꺼내지 않고 재시작하기 때문에, 어디가 나쁜지 판별할 수 없고, 어느 정도의 장소와 근기가 필요합니다.
그러나 콘솔에서 cling이 떨어지면 모든 입력이 손실되는 반면 Jupyter는 입력 기록이 셀에 남아 있기 때문에 다시 시작하기가 매우 쉽습니다.

C++의 학습등의 용도로 Jupyter를 사용하지 않는 손은 없는 것이 아닐까요.

좋은 웹페이지 즐겨찾기