субота, 15 серпня 2020 р.

Онлайн інструменти для С++

Compiler explorer logo
Попередній пост задумувався як приклад використання онлайн-засобів для роботи із С++, однак, осмислено показати більшість із них не вдавалося. Тому пишу ще один.

Ремарка: пам'ятайте, що більшість із цих проектів -- приватні, на особистих (чи арендованих своїм коштом) серверах авторів, хай і з залученням пожертв. Будьте акуратні -- не зловживайте, не заваліть DDoS-ом.
Щоб нормально роздивитися зображення -- клікніть по них. На жаль, не вдається мені за розумний час дійти толку із ресайзером Blogpost, вони виходили або заширокі, або нечитабельні.

Compiler explorer -- https://godbolt.org

Напевне, перший і найпопулярніший із них. 

  • Компілює в асемблерний код. 
  • Останнім часом навчився також віддавати бінарний код та запускати скомпільоване.
  • Десятки версій gcc, clang, MSVC, ICC, для купи архітектур -- ARM, x86-64, x86-32, MIPS, MSP430,  PowerPC/Power64, RISC-V та ряду інших.
  • Поміж компіляторів -- найновіші версії, включаючи код з master/head та спеціальних гілок типу gcc із підтримкою модулів чи концепцій. 
  • Дозволяє підключати десятки бібліотек -- boost, Google test, cppcoro, Eigen, GSL купи різних версій.
  • Сторонні інструменти -- PSV-Studio, clang-tidy, clang-format, readelf тощо.
  • Також -- CUDA, Rust, Go, FPC, Arduino та інші.
  • Бібліотеки та сторонні інструменти потрібно підключати в меню -- по замовчуванню їх немає. 
  • Компіляторам можна передавати опції на ваш розсуд.
  • Розвинутий інтерфес -- починаючи із підсвітки рядків коду що відповідають асмеблерним командам до підтримкою багатьох вікон одночасно. Поекспериментуйте.
    Ремарка: на малих екранах частина контролів зникає, щоб побачити, доводиться масштабувати.
  • Підтримує збереження коду та конфігурації UI за допомогою спеціальних URL.
  • Open Source: https://github.com/compiler-explorer/compiler-explorer.
  • API для звертань зовні.
  • Подробиці: https://xania.org/201609/how-compiler-explorer-runs-on-amazon та https://github.com/compiler-explorer/compiler-explorer/wiki.
Приклад: https://godbolt.org/z/nSfHZc. Використовувався на парі, щоб проілюструвати, компілятори як для RISC, так і для CISC процесорів використовують, фактично, RISC підмножину команд. Також, якщо обрати компіляцію для x86-32, зразу буде видно наслідок недостачі регістрів та особливостей 32-бітних calling conventions.
Приклад. URL: https://godbolt.org/z/nSfHZc. Обрано стиль асемблера Intel.
A, B, C -- вкладки різних компіляторів.
1 -- 17-й рядок відповідає вказаним стрілками фрагментам асемблерного коду.
2 -- Введені вручну опції компілятора. Рядок під ними -- іконки інструментів, підключення бібліотек тощо.


Приклад до boost::asio: https://godbolt.org/z/WfxMMn. Асемблерного коду -- 29 тисяч рядків.
Додано, власне, boost і PVS-Studio. Застереження PVS-Studio лише до коду boost.

Безцінна річ -- must have!

Quick C++ Benchmark -- https://quick-bench.com

Більш спеціалізований інструмент. Дозволяє запустити тести, на базі Google benchmark, та візуалізувати результати. 
  • Підтримує десятки версій gcc i clang.
  • Вибір опцій лише із списку. Можна обрати версія стандарту С++, рівень оптимізації, реалізацію стандартної бібліотеки.  
  • Окрім візуального порівняння, дозволяє подивитися асемберний код тестів. 
  • Ремарка: за повторного запуску, по замовчуванню, повертає закешовані результати.
  • Надає безпосередній доступ до Compiler explorer та C++ insights.
  • Open Source: https://github.com/FredTingaud/quick-bench-front-end та https://github.com/FredTingaud/quick-bench-back-end.

Приклад використання Quick C++ bench із попереднього поста.

C++ insights -- https://cppinsights.io/ 

C++ мова складна, місцями -- неочевидна. C++ insights дозволяє представити просунуті можливості С++ -- шаблони, лямба-функції і т.д. і т.п. у вигляді простого С-подібного коду. Дуже хороший інструмент, щоб зрозуміти, як ті всі "засоби побудови абстракцій" функціонують.
Що таке лямбда-функції?
URL: https://cppinsights.io/s/a3e18d24.

Build bench -- https://build-bench.com

Одна із найбільших вад С++ -- жахливо довга компіляція. Build bench дозволяє дослідити час компіляції різних конструкція С та С++. Проект того ж автора, що й  Quick C++ Benchmark. 
  • Дозволяє порівнювати час виконання, використану оперативну пам'ять, об'єм читання з диску. 
  • Можна порівняти час компіляції того ж коду одним компілятором з різними опціями чи час компіляції різними компіляторами, час компіляції різних версій коду тим же компілятором тощо.
  • Підтримує десятки версій gcc i clang -- як і Quick C++ Benchmark.
  • Аналогічно, вибір опцій лише із списку -- версія стандарту С++, рівень оптимізації, реалізацію стандартної бібліотеки. 
  • Крім візуального порівняння затрат ресурсів на компіляцію, можна подивитися повне дерево включення файлів заголовків, результати препроцесингу та асемблерний лістинг для кожного із варіантів компіляції.
  • Open source: https://github.com/FredTingaud/quick-bench-back-end і https://github.com/FredTingaud/quick-bench-front-end.
Порівняння компіляції "Hello world!" на С (clang), C++ (clang), C++ (gcc).
Що цікаво, якщо для clang (10.0) використати не його рідну libc++, а libstdc++ від gcc -- clang обгонить gcc (10.1) по швидкості компіляції (для цього прикладу).

Wandbox -- https://wandbox.org/

Це ціле онлайн-середовище розробки.
  • В першу чергу -- надає можливість запустити скомпільовані програми. 
  • Підтримує десятки мов програмування -- С, С++, Rust, C#, Python, Lua, і т.д. Є окремий варіант для PHP.
  • Підтримує десятки версій GCC та Clang, включаючи найсвіжіші та з HEAD.
  • Підтримує різні версії boost, бібліотеки Sprout і MessagePack.
  • Підтримує кількох файлів у проекті -- не дуже поширена можливість в онлайн-засобів. 
  • Можна вручну задавати опції компіляції.
  • Можна задавати опції командного рядка та що вводити через stdin для скомпільованого коду.
  • Є варіант без JavaScript. 
  • API для звертань ззовні. Плагіни для використання із vim i emacs.
  • Інтеграція з Github.
  • Підтримує збереження коду та конфігурації UI за допомогою спеціальних URL.
  • Open source: https://github.com/melpon/wandbox.

Приклад програми із трьох файлів. URL: https://wandbox.org/permlink/87KuzcDHKfgnKGKT.

Coliru -- https://coliru.stacked-crooked.com/

Інше, дещо примітивніше, але теж популярне онлайн-IDE.
  • Дозволяє компілювати та запускати скомпільоване. 
  • Надає доступ до командного рядка Linux.
  • Підтримує збереження коду за допомогою спеціальних URL.
  • Користуючись цими URL, можна працювати із багатьма файлами, хоч і збоченим способом. Див. Q&A.
  • Підтримує зовнішні API.
Приклад: https://coliru.stacked-crooked.com/a/7c4dec39a2602a58.


CppMem: Interactive C/C++ memory model -- http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/

Суттєво складніший інструмент, ніж розглянуті раніше. Він дозволяє ближче придивитися до моделей узгодженості пам'яті в С++. 
  • Можна вказати модель узгодженості (preferred -- використовується стандартним С++).
  • Показує відношення між операціями -- sequenced-before (sb), sequentially consistent (sc), read from (rf) тощо. 
  • Вміє експортувати в LaTeX.
  • Детальніше про нього можна почитати тут: "CppMem - An Overview".
  • Стаття, із математичною основою, від авторів: "Mathematizing C++ Concurrency".
Впорядкування в простій програмі.
sb: sequenced-before, rf: read from, sw: synchronized-with.
Інструмент відверто не для початківців, але може бути корисний людям, яким доводиться мати справу із моделями узгодженості, наприкла, пишучи lock-free структури даних.

Інше

  1. Список онлайн-компіляторів: https://arne-mertz.de/2017/05/online-compilers/, також оновлений варіант: https://arnemertz.github.io/online-compilers/. Список містить багато цікавих сервісів, окрім згаданих вище Wandbox i Coliru -- тих, із якими я стикався безпосередньо.
  2. Інструменти підсвітки синтаксису, що використовую в цьому блозі: http://hilite.me та https://emn178.github.io/online-tools/syntax_highlight.html
  3. Коллапсування фрагментів тексту для Blogger: https://www.stramaxon.com/2013/09/expandable-section-boxes.html.
  4. Онлайн-компілятор LaTeX: http://www.tlhiv.org/ltxpreview/.
  5. Онлайн-IDE для LaTeX: https://www.overleaf.com/.

Підсумок

Буду лаконічним -- чого тільки онлайн немає... З одного боку, цитуючи мого товариша, Джима, що півжиття працював в IBM: "Подумаєш, хмарні технології. У нас все це було ще в 70-х, тільки називалося по іншому". З іншого, доступність із будь-якого пристрою і не за всі гроші -- таки зручно для багатьох задач.



1 коментар:

  1. Обміняймось постійними посиланнями на блоги на відповідній сторінці "посилання": https://musicvsfilms.blogspot.com/p/link-exchange.html

    ВідповістиВидалити