Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Posts Tagged ‘cling

Cling — С++ интерпретатор на базе Clang

with one comment

Один из самых серьезных проектов на земле – это Большой Адронный Коллайдер. Исследователи, которые с ним работают, собирают с него огромные объемы данных, а уж мы-то знаем насколько болезненна с ними работа, особенно если в качестве языка программирования ты, ради скорости, используешь С++ который может и исполняется быстро, но компилируется очень медленно.

В связи с этим, люди из CERN как раз и создали проект Root и, в частности, его часть под названием Cling. Cling — это интерпретатор С++, написан он на базе Clang, и является весьма уникальной тулзой в плане того, что для С++ это очень необычно.

Cling можно попробовать собрать из сорцов, но лень всегда побеждает, поэтому вместо этого можно скачать бинарники, которые каждый день собираются для Ubuntu, Mac OSX и Fedora.

А что на Windows?

С виндой все плохо, потому как Clang сам по себе не обладает ABI-совместимостью с местным MSVC и иже с ним, и вообще непонятно собирается ли Clang на “голой” Windows. Скорее всего нет. И в принципе можно его попробовать собрать под Cygwin (удачи!) но самое простое, если хочется поиграться, это развернуть Ubuntu’вую виртуалку и гонять все через SSH.

Вот собственно то кол-во телодвижений которое нужно сделать под Windows:

  1. Скачать образ Ubuntu Desktop.

  2. Сделать виртуальную машину. Если у вас работает Hyper-V (ага, вы потратились на современное железо, зачем?) то просто делаете виртуалку первого поколения (со 2-м Убунта не работает). Если Hyper-V не работает, воспользуйтесь VirtualBox.

  3. Ставите убунту на виртуалку

  4. Настраиваете сеть для убунты. Под Hyper-V это получилось не так уж и просто: сначала в Virtual Switch Manager нужно было сделать виртуальный External свич, а потом в убунте вместо DHCP, которое не поднялось, нужно было в сетевых настройках прописать статический IP.

  5. Чтобы не сидеть в убунте физически, вместо этого делаем

    sudo apt-get udpate
    sudo apt install ssh
    

  6. Теперь можно скачать .tar.gz собственно Cling и распаковать его куда-нибудь, например в home dir.

  7. Закрываем, но не выключаем, виртуалку. На хосте запускаем KiTTY или какой-нть еще SSH клиент и коннектимся к виртуалке удаленно.

  8. Подключаемся к виртуалке из хост системы, запускаем Cling, профит!

Как этим пользоваться?

По сути Cling – это REPL для С++, как бы безумно это не звучало. Вот типичная сессия:

[cling]$ #include <iostream>
[cling]$ #include <vector>
[cling]$ using namespace std;
[cling]$ vector<int> numbers{1,2,3};
[cling]$ for (auto& x : numbers) x *= 3;
[cling]$ for (auto& x : numbers) cout << x << "\t";
3       6       9

Единственная проблема что если хочется функции, то нужно переключиться командой в .rawInput, иначе работаеть не будет:

[cling]$ .rawInput
Using raw input
[cling]! int add(int i) { return i+1; }
[cling]! .rawInput
Not using raw input

Ну вот как-то так. Еще следует заметить что после объявления символ уже нельзя переопределять, это вам не MATLAB.

Метакомманды

Самому Cling можно посылать команды поведения через точку. Вот несколькие из них помимо .rawInput, о которой мы уже говорили:

  • .x foo.cpp загружает foo.cpp и вызывает из этого файла функцию void foo(), если таковая определена

  • .L mylib загружает либу или файл

  • .I path добавляет include path

  • .printAST показывает AST после каждого обработанного ввода

  • .help показывает короткую справку со списком всех метакоманд (я тут привожу лишь некоторые)

  • .q выходит из интерпретатора

Заключение

Cling позволяет работать с С++ как с MATLAB’ом, то есть в REPL-стиле. Конечно, с точки зрения юзабельности есть много косяков, и графики оно пока не строит (только если вы сами не сделаете для этого инфраструктуру), но для тех кто хочет быстро что-то посчитать, эта утилита – самое то!

P.S. большое спасибо Михаилу Филиппову за помощь при настройке всего этого счастья!

Written by Dmitri

26 апреля 2015 at 9:38

Опубликовано в С++

Tagged with