Pull to refresh
56
0
Сергей Садовников @FlexFerrum

Пользователь

Send message

Jinja2 в мире C++, часть третья. «Теперь ты в конане»

Reading time 17 min
Views 5.7K

image С момента публикации предыдущей части прошло больше полутора лет, была реализована большая куча фичей, сделано несколько релизов, но не об этом пойдёт речь. Пару дней назад в жизни библиотеки произошло важное событие: она была добавлена в основной репозиторий conan'а (conan-center-index). Об том, как это случилось, что для этого пришлось сделать и что вообще нужно делать, чтобы добавить туда свою библиотеку, и пойдёт речь под катом.

Читать дальше →
Total votes 15: ↑15 and ↓0 +15
Comments 8

Jinja2 в мире C++, часть вторая. Рендеринг

Reading time 10 min
Views 4.8K

Jinja2 logo Это вторая часть истории о портировании шаблонного движка Jinja2 на C++. Первую можно почитать здесь: Шаблоны третьего порядка, или как я портировал Jinja2 на C++. В ней речь пойдёт о процессе рендеринга шаблонов. Или, иначе говоря, о написании "с нуля" интерпретатора питоноподобного языка.

Читать дальше →
Total votes 6: ↑6 and ↓0 +6
Comments 3

clang и IDE: история о дружбе и недружбе

Reading time 9 min
Views 11K

Для меня это началось шесть с половиной лет назад, когда волею судеб меня затянуло в один закрытый проект. Чей проект — не спрашивайте, не расскажу. Скажу лишь, что идея его была проста как грабли: встроить clang front-end в IDE. Ну, как это недавно сделали в QtCreator, в CLion (в некотором смысле), и т. п. Clang тогда был восходящей звездой, многие тащились от появившейся, наконец, возможности использовать полноценный C++-парсер почти на халяву. И идея, так сказать, буквально витала в воздухе (да и встроенный в clang API автокомплит кода как бэ намекал), надо было просто взять и сделать. Но, как говорил на Боромир, "Нельзя просто так взять, и...". Так получилось и в этом случае. За подробностями — велкам под кат.

Читать дальше →
Total votes 37: ↑35 and ↓2 +33
Comments 17

Шаблоны третьего порядка, или как я портировал Jinja2 на C++

Reading time 15 min
Views 6.8K
Jinja2 logoПод «шаблонами» в контексте C++ обычно понимаются вполне конкретные языковые конструкции. Есть простые шаблоны, которые упрощают работу с однотипным кодом — это шаблоны классов и функций. Если у шаблона какой-то из параметров сам по себе шаблон, то это уже, можно сказать, шаблоны второго порядка и генерируют они другие шаблоны в зависимости от своих параметров. Но что если и их возможностей недостаточно и проще генерировать сразу исходный текст? Много исходного текста?
Любителям Python а также HTML-вёрстки знакомо средство (движок, библиотека) для работы с текстовыми шаблонами под названием Jinja2. На вход этот движок получает файл-шаблон, в котором текст может быть перемешан с управляющими конструкциями, на выходе получается чистый текст, в котором все управляющие конструкции заменены текстом в соответствии с заданными извне (или изнутри) параметрами. Грубо говоря, это что-то вроде ASP-страниц (или C++-препроцессора), только язык разметки другой.
До сих пор реализация этого движка была только для Python. Теперь же она есть и для C++. О том, как и почему так вышло, и пойдёт речь в статье.
Читать дальше →
Total votes 14: ↑14 and ↓0 +14
Comments 18

Clang API. Начало

Reading time 11 min
Views 34K
Сейчас с уверенностью можно утверждать, что времена самописных C++-парсеров постепенно отходят в прошлое. На сцену медленно, но неумолимо выходит clang — полноценный C++-фронренд и компилятор, предоставляющий своим пользователям богатое API. С помощью этого API можно распарсить исходный текст на C/C++/Objective C, и вытащить из него всю необходимую информацию — от простого лексического значения токенов, до таблицы символов, AST-деревьев и результатов статического анализа кода на предмет всяких разных проблем. В связке с llvm и при сильном на то желании C++ можно использовать в качестве скриптового языка, парся и исполняя C++-программы «на лету». В общем, возможности перед программистами открываются богатые, надо только понять — как ими правильно воспользоваться. А тут, как это не редко случается, и начинается самое интересное.
Читать дальше →
Total votes 54: ↑53 and ↓1 +52
Comments 40

Variadic templates в C++0x

Reading time 20 min
Views 72K
Те, кто читал книгу Андрея Александреску «Современное программирование на C++» знают, что существует обширный класс задач (в области метапрограммирования с использованием шаблонов), когда шаблону при инстанцировании необходимо указать переменное (заранее неизвестное) количество аргументов. Типичные примеры таких задач:
— Описание кортежей (tuples)
— Описание типов наподобие вариантов (variants)
— Описание функторов (в этом случае перечень типов аргументов зависит от сигнатуры функции)
— Классификация типов по заранее заданным множествам
— и т. п.

В каждой такой задаче точное количество типов, передаваемых соответствующему шаблону в качестве аргументов, заранее определить сложно. И, вообще говоря, зависит от желания и потребностей того, кто намеревается использовать соответствующий шаблонный класс.
В рамках действующего стандарта С++ сколь-нибудь удобного решения таких задач не существует. Шаблоны могут принимать строго определённое количество параметров и никак иначе. А. Александреску (в упомянутой выше книге) предлагает общее решение, основанное на т. н. «списках типов», в котором типы представлены в виде односвязного списка, реализованного посредством рекурсивных шаблонов. Альтернативным решением (используемом, например, в boost::variant и boost::tuple) является объявление шаблонного класса с большим количеством параметров, которым (всем, кроме первого) присвоено некоторое значение по умолчанию. Оба этих решения являются половинчатыми и не охватывают весь спектр возможных задач. По этому, для устранения недостатков существующих решений и упрощения кода новый стандарт предлагает С++-разработчикам новый вариант объявления шаблонов? «шаблоны с переменным количеством параметров» или, в оригинале, «variadic templates».

Читать дальше →
Total votes 41: ↑38 and ↓3 +35
Comments 17

Миграция проекта на C++ с Visual Studio 2008 на Visual Studio 2010

Reading time 4 min
Views 1.3K
Не за горами принятие нового стандарта C++, и (к счастью?) разработчики компиляторов дают программистам возможность опробовать некоторые новые возможности, появляющиеся в языке, уже сейчас. В частности, последняя версия Visual Studio поддерживает ряд нововведений, о которых не раз и не два уже писалось. Но одно дело — демонстрировать возможности на синтетических примерах, другое — попробовать их в боевом режиме (очевидно, что на свой страх и риск). Эта статья — результат такого эксперимента. Итак.

Исходный материал: игровой проект с исходниками на C++. Активно используется boost (1.40), пользовательский интерфейс на Qt (4.x).
Задача: перевести проект на Visual Studio 2010 для дальнейшей разработки с использованием этого компилятора и его новых возможностей (в перспективе возможен переход gcc 4.5 и старше).

В процессе переноса кода исправлялись не только ошибки компиляции, вылезшие при сборки новым компилятором, но и выполнялась косметическая переработка кода, т. е. замена ряда используемых конструкций из boost'а на аналогичные из STL/языка (более глубокая переработка кода будет делаться позже). Ниже описаны некоторые проблемы, с которыми пришлось столкнуться, и способы их решения. Да, после внесения правок и финальной перекомпиляции всё запустилось и заработало.

Читать дальше →
Total votes 18: ↑13 and ↓5 +8
Comments 2

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity