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-посилання на результат роботи.
- Open source: https://github.com/andreasfertig/cppinsights і https://github.com/andreasfertig/cppinsights-web.
- Подробиці функціонування: https://cppinsights.io/about.html.
Що таке лямбда-функції? 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.
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 структури даних.
Інше
- Список онлайн-компіляторів: https://arne-mertz.de/2017/05/online-compilers/, також оновлений варіант: https://arnemertz.github.io/online-compilers/. Список містить багато цікавих сервісів, окрім згаданих вище Wandbox i Coliru -- тих, із якими я стикався безпосередньо.
- Інструменти підсвітки синтаксису, що використовую в цьому блозі: http://hilite.me та https://emn178.github.io/online-tools/syntax_highlight.html.
- Коллапсування фрагментів тексту для Blogger: https://www.stramaxon.com/2013/09/expandable-section-boxes.html.
- Онлайн-компілятор LaTeX: http://www.tlhiv.org/ltxpreview/.
- Онлайн-IDE для LaTeX: https://www.overleaf.com/.
Підсумок
Буду лаконічним -- чого тільки онлайн немає... З одного боку, цитуючи мого товариша, Джима, що півжиття працював в IBM: "Подумаєш, хмарні технології. У нас все це було ще в 70-х, тільки називалося по іншому". З іншого, доступність із будь-якого пристрою і не за всі гроші -- таки зручно для багатьох задач.
Обміняймось постійними посиланнями на блоги на відповідній сторінці "посилання": https://musicvsfilms.blogspot.com/p/link-exchange.html
ВідповістиВидалити