LINUX.ORG.RU

Jinja2 на С++

 ,


0

3

Вышел шаблонизатор файлов на С++ Jinja2Cpp. Это генератор файлов на основании шаблонов, аналог известной программистам на Python Jinja.

За основу взята спецификация Jinja.

Статьи от автора, раскрывающие некоторые аспекты и освещающие тёмные места — здесь и здесь.

>>> Подробности

★★

Проверено: Shaman007 ()
Последнее исправление: Virtuos86 (всего исправлений: 3)
Ответ на: комментарий от anonymous

Не видел бесплатной версии.

Ничего не могу сказать.

Moisha_Liberman ★★
() автор топика
Ответ на: комментарий от tsaruchetkav1

Да ну на фиг!

Перед носом железка на Intel Atom, которая сейчас в разработке и выхлоп обоих компилей. Интел свои деньги не зря получает. По крайней мере, дураками их считать не стоит.

Он явно не си, он явно не С++.

Спасибо, Царь Очевидность! =)))

Moisha_Liberman ★★
() автор топика
Ответ на: Да ну на фиг! от Moisha_Liberman

Перед носом железка на Intel Atom

Это не intel.

которая сейчас в разработке и выхлоп обоих компилей.

Ну и, дальше что? Показывай выхлоп.

Интел свои деньги не зря получает. По крайней мере, дураками их считать не стоит.

Чини методичку. Тебе лишь сообщили о том, что он не делает то, что тебе рассказала мусорная пропаганда, которой ты где-то начитался. К дуракам и прочей херне это отношения не имеет.

tsaruchetkav1
()
Ответ на: Предположительно... от Moisha_Liberman

В MS-компиле могут быть включены какие-то опции, вносящие задержки из-за дополнительных проверок. В gcc нет. Та же проверка на срыв стека может оказаться дорогим удовольствием.

Херня.

Ну и С явно в последнее время в MS не в фаворе, так что они могли что-то там намудрить с компилятором. Это тоже надо учитывать. На выхлоп компиля смотреть надо.

Херня. С++ - есть си. Никакой компилятор отдельно не оптимизирует Си.

tsaruchetkav1
()
Ответ на: комментарий от tsaruchetkav1

ЛОЛШТО? =)))

Проверка на срыв стека это херня? То есть, внедрение в код программы установки canary и проверка наличия оного по возврату из функции это... херня? Она делается типа вне потока кода, независимо от него?

Да нет. Она производится именно в результирующем коде приложения и влияет на исполнение. Не будет canary, значит стек сорван, по соображениям безопасности приблуда должна быть убита. Точка.

Только что спросил коллегу. В MS выставлен по дефолту /Gs. Я был прав.

Херня. С++ - есть си. Никакой компилятор отдельно не оптимизирует Си.

ШИТОПРАСТИТИ?!? Вы, милейший, трезвели бы, а? А то уже неприлично становится.

Moisha_Liberman ★★
() автор топика
Ответ на: комментарий от tsaruchetkav1

Угу...

Это не intel.

Мага нэуиноат, я сам сматрэл! =)))

Конечно не Интел, ага. Арм это...

Не продолжайте дальше, ненадо... Вам в обоих тредах уже хватило, по-моему.

Moisha_Liberman ★★
() автор топика

ТС, тупица, нет слова шаблонизатор, убери

anonymous
()
Ответ на: комментарий от q0tw4

И как из С++ будет выглядеть:

#[derive(Template)] // this will generate the code...
#[template(path = "hello.html")] // using the template in this path, relative
                                 // to the templates dir in the crate root

struct HelloTemplate<'a> { // the name of the struct can be anything
    name: &'a str, // the field name should match the variable name
                   // in your template
}
   
fn main() {
    let hello = HelloTemplate { name: "world" }; // instantiate your struct
    println!("{}", hello.render().unwrap()); // then render it.
}

?

Особенно, если добавить #[repr(C)] и #[no_mangle]...

monk ★★★★★
()
Ответ на: комментарий от rumgot

Когда надо из программы на C++ сохранять данные в какие-то файлы со сложной структурой (генерация программ, скриптов, формирование отчётов в html, ...)

monk ★★★★★
()
Ответ на: комментарий от rumgot

Можно. У нас в проекте активно использовалась автогенерация исходников на C++. На входе, скажем, .h-ник, на выходе - .cpp-файл с реализацией сериализации. Или ещё чего подобное. Когда я задолбался на C++ же прописывать логику генерации каждого конкретного исходника - я и решил написать шаблонизатор. В итоге, в шаблон отображается AST, а дальше в шаблоне с ней делай что хочешь. Поскольку все шаблоны теперь за пределами автогенератора - вариантов выхлопа для одного входа может быть масса. Чем, опять же, и пользуемся.

Знаю, что сейчас этот движок используют в связке с boost.beast (зачем на C++ писать веб-сервера - это оффотпик в данном случае). Знаю, что его используют для генерации сложных отчётов опять же из кода на C++.

anonymous
()
Ответ на: комментарий от rumgot

В принципе как уже выше писали - генерация скриптов, отчетов и пр.

В моем случае очень пригодились шаблоны для генерации однотипных, но оптимизированных вручную SQL-запросов с геоданными (PostGIS). ORM там лажали ужасно, а вручную писать влом уже.

anonymous
()
Ответ на: комментарий от anonymous

Так понятно. Человек предлагал rust-овскую библиотеку с #[repr(C)] подключить.

monk ★★★★★
()
Ответ на: Прямо даже и не знаю... от Moisha_Liberman

А если попробовать, а?

Написал новость через жё,так что хрен поймёшь что это такое.
Сложно было написать что это встраиваемый шаблонный движок?
Ещё и придумал какой-то «шаблонизатор». Гуглопереводчиком что-ли пользовался?

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от WatchCat

Про "шаблонизатор"...

Я ваааще ничё не писал. =)

Это там анон какой-то пурист и граммар-наци по совместительству прилетел и чего-то про «шаблонизатор» верещать начал. Ну хочет верещать — пусть верещит.

В остальном, вот чесслово, я думал что и так понятно. =)

Moisha_Liberman ★★
() автор топика
Ответ на: Про "шаблонизатор"... от Moisha_Liberman

А ты не думай - думать вредно.

GNU autogen тоже «щаблонизатор», только это отдельное приложение. Это так, на случай если ты не знал.
Поэтому я и спросил чем хрень из новости лучше autogen'а.

WatchCat ★★★★★
()

Шёл 2019 год...

...а в плюсах всё так же ни модулей, ни человеческого метапрограммирования, и плюсовики продолжают трахаться с текстовыми препроцессорами и кодогенераторами.

anonymous
()

было бы прикольней на чистом python, но и так может скорости прибавит!

anonymous
()
Ответ на: комментарий от WatchCat

Да так-то в курсе что такое autogen.

Только от применения autogen в коде на плюсах для генерации html как-то невырезанные в детстве гланды начинают побаливать и заднице становится очень тревожно. =)))

Анекдот вспомнился, да.

Moisha_Liberman ★★
() автор топика
Ответ на: комментарий от anonymous

Причина, как выяснилось, довольно проста. В реализации библиотеки активно используется unordered_map, который в MSVC реализован несколько, гм... хуже, чем в gcc. После того, как взял стороннюю реализацию - цифры сравнялись.

anonymous
()
Ответ на: комментарий от htower_

Как мой зёма, Царствие ему Небесное...

Говаривал — отродясь такого не было и вот опять...

И почему я не удивлён?

Moisha_Liberman ★★
() автор топика
Ответ на: комментарий от example_cat

не сердитесь гражданин начальник дайте нам шаблонизатор погосту и мы купим его у криптопро не сумлевайтесь

anonymous
()
Ответ на: комментарий от anonymous

Онож это, прикручивать питон к плюсовому проекту - легко и просто! А главное, надёжно! И дёшево. :)

А про криптопро - порвало. В клочья. :D

anonymous
()
Ответ на: комментарий от monk

И как из С++ будет выглядеть

Ну да, код работающий на макросах не заюзаешь на сях. Разве что переписать сам макрос, чтоб тот пихал #[repr(C)] и #[no_mangle] и биндиться уже к его выхлопу. Решение чисто теоретическое, для данной либы практически нереализуемо.

q0tw4 ★★★★
()
Ответ на: комментарий от q0tw4

Для генерации HTML с помощью xslt нужен XML на входе. А это, эммм..., не всегда разумно/имеет смысл/реализуемо. И, опять же, остаётся открытым вопрос кастомизации (тех самых параметров для шаблона), биндинга к внутренним структура программы и т. п. Да и чаще всего это будет выглядеть как удаление гланд через задний проход.

anonymous
()
Ответ на: комментарий от anonymous

Ну я так гуй делал через html в qt. Биндинги там все проставляются перед запуском процессора или запихиваются в контекст преобразователя в виде большой xml-ки. Единственная беда - все вычисления сложнее конкатенации строк приходится производить на С++ стороне, тоесть надо заранее знать какие вещи могут пригодится и удобно разместить их в контексте. Но разве в других шаблонизаторах иначе?

q0tw4 ★★★★
()
Ответ на: комментарий от q0tw4

Но разве в других шаблонизаторах иначе?

Иначе. Та же жижа (упомянутая здесь) - это, считай, шаблонный движок со встроенным внутрь питоном. Очень многое можно делать в самом шаблоне.

anonymous
()
Ответ на: комментарий от q0tw4

Ну да, код работающий на макросах не заюзаешь на сях.

Ура! Силы разума победили!

Кстати для генерации html есть xslt. Вполне рабочее решение и из С++ доступно

<sarcasm>Ага. А если надо нарисовать окошко с кнопочкой, есть Electron. И доступно из С++ не хуже, чем формирование html через xslt.</sacasm>

monk ★★★★★
()
Ответ на: А точно питон? от Moisha_Liberman

Ты малясь попутал. Под «жижей» я имел в виду, собственно, jinja. Тут её где-то выше в камментах кто-то так назвал.

anonymous
()
Ответ на: комментарий от monk

есть Electron

Мой завод пишет на Qt. В моем решении достаточно добавить Qt модуль xmlpatterns, чи как его там, а всё остальное уже есть в депенденсах.

q0tw4 ★★★★
()
Ответ на: комментарий от anonymous

Ну до этого я пробовал {{Mustache}} причем помнится даже самописный. Не пошло что-то. Xslt конечно замороченный, но решение вышло вполне приличное.

q0tw4 ★★★★
()
Ответ на: комментарий от q0tw4

У меня был опыт генерации исходников на C++ с помощью XSLT-преобразований (doxygen обрабатывал h-ник, генерировал xml, потом этот xml преобразовывался в промежуточный с помощью одного xslt, потом этот промежуточный xml - уже в финальный код с помощью другого xslt). При написании этих трансформаторов легко Люцифера вызвать теми заклинаниями, которые применялись. С помощью {{Mustache}}/Jinja2 код шаблонов получается таки понятнее. А если ещё и AST внутри движка отрефлексирована - так вообще красота. В общем, я туда ходил. Я знаю. :)

anonymous
()
Ответ на: комментарий от anonymous

Тут был момент в том, что аппликуха хранит данные преимущественно в виде кутешного XML Dom и на выходе Html. С другими движками сразу же возникает вопрос как из шаблона доступаться к данным. Это же не скриптовый язык в котором input['request'] из шаблона вызвал и вуаля.

q0tw4 ★★★★
()
Ответ на: комментарий от Virtuos86

О, к граммар-наци в нашем тесном круге...

Стремительным домкратом присоединяются ГОСТ-наци. Как я уже говорил автору библиотеки в приватном общении, несмотря на то, что я знаю что по ГОСТ точка в конце заголовка не ставится, точка здесь имеет свой сакральный смысл и олицетворяет определённую сермяжную правду.

Типа, «Jinja2 на С++ и точка». В смысле «Jinja2 на С++ и не е...(ну, Вы меня поняли)».

Но против рихтовки я ничего против не имею. =)))

Moisha_Liberman ★★
() автор топика
Ответ на: комментарий от q0tw4

Так в этом и вся суть. В смысле, с этого надо было начинать. :) Вы выбрали решение, подходящее под характер ваших данных и способ работы с ними. Но не всем это решение подойдёт. Ибо, опять же, как параметры пробрасывать и всё такое?

anonymous
()
Ответ на: комментарий от anonymous

Да есть там переменные, есть. Кстати я и не говорил всем xslt узать, я просто пример привел, может кому пригодится.

q0tw4 ★★★★
()

оно и на python не шибко востребованно. разве что только, как алтернатива django templates? ну, раз звезды пилят, значит это кому-нибудь греет.

dummy ★★
()
Ответ на: Нет. от Moisha_Liberman

и поэтому решил реализовать язык шаблонов впринципе только в околопитоно-мирке и нужный

в то время, как в виде python c++ extension, это могло бы кому-то пригодиться в реальной жизни, спасти парочку деревьев сжигаемых фласком в датацентрах по всему миру

actionless ★★★★★
()
Последнее исправление: actionless (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.