Pull to refresh

Генерация кода с jamon

Reading time 8 min
Views 2.7K
Java *
Генерация кода

В нескольких проектах на разных местах работы я использовал генерацию кода. Зачем?
Чаще всего этим достигается сохранение правильности кода при изменениях. Например при добавлении еще одного типа данных в модель предметной области надо добавить класс на Яве, класс на С ++, код преобразования между ними и значение в Enum. Без генерации кода и работы ручками много, и всегда есть шанс что то из этого забыть.
Иногда reflection может быть заменой генерации кода, но даже тогда такой код будет менее читабельный чем шаблон для генерации.
Исходная информация для генерации кода может выглядеть очень по разному — это может быть Ява класс, у которого через reflection считываем свойства и генерим класс на C++, или csv файл, или XML, или еще что нибудь.

Попробую рассказать как я генерирую код в maven проектах с помощью фреймворка jamon.

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

Создание языка программирования с использованием LLVM. Часть 3: Генерация кода LLVM IR

Reading time 22 min
Views 14K
Compilers *
Translation
Добро пожаловать в Главу 3 учебника «Создание языка программирования с LLVM». В этой главе мы рассмотрим, как преобразовать AST (Абстрактное Синтаксическое дерево), построенное в Главе 2, в LLVM IR. Она расскажет вам о некоторых аспектах работы LLVM, а также продемонстрирует, насколько он прост в использовании. Вы увидите, что гораздо больше труда потребовалось на лексический и синтаксический анализ, чем на непосредственное создание кода LLVM IR.

Обратите внимание: код из этой главы требует наличия LLVM 2.2 или более поздней версии. С версиями по LLVM 2.1 включительно этот код работать не будет. Также стоит отметить, что вам стоит использовать версию этого учебника, которая соответствует вашему релизу LLVM: вы можете использовать документацию, которая прилагается к официальным выпускам или посетить страницу с релизами на llvm.org.
Читать дальше →
Total votes 28: ↑26 and ↓2 +24
Comments 11

Инструментирующий профайлер своими руками

Reading time 5 min
Views 6.1K
Java *
Давно хотел написать простую утилиту, которая позволила бы показать в каких методах код проводит основное время, какие объекты и в каком количестве создает и оперативно включать трассировку посещения метода не модифицируя исходник.

Основные требования — простота, возможность запуска в текстовом режиме и независимость от архитектуры.

И вот что получилось
Total votes 19: ↑18 and ↓1 +17
Comments 2

Автоматизация разработки под Android

Reading time 9 min
Views 24K
Development for Android *
Sandbox

Приветствую, хаброжители. Я Android разработчик. Точнее даже не так. Я ленивый Android разработчик. На протяжении уже не одного десятка проектов меня начали угнетать рутинные и механические операции, не требующие от меня никаких умственных усилий. Теперь же за меня это делает IDE.
Читать дальше →
Total votes 23: ↑22 and ↓1 +21
Comments 14

Генерация маппинга через t4 шаблоны

Reading time 5 min
Views 10K
Programming *.NET *C# *

Здравствуйте! Наш проект уже достиг такой стадии когда встал вопрос об оптимизации производительности. После анализа слабых мест, одно из возможных путей для оптимизации был способ избавления от AutoMapper’а, он хоть и не является самым тормозным местом, но является тем местом, которое мы можем улучшить. AutoMapper используется у нас для маппинга DO объектов в DTO объекты для передачи через WCF сервис. Вручную написанный метод с созданием нового объекта и копированием полей работает быстрее. Писали маппинг вручную — безрадостная рутина, часто были ошибки, забытые поля, забытые новые поля, поэтому решили написать генерацию маппинга через t4 шаблоны.

По сути нам надо было сверить список пропертей и типов, и написать копирование, но не всё так гладко в датском королевстве.
Читать дальше →
Total votes 10: ↑10 and ↓0 +10
Comments 23

Модификация программы и что лучше менять: исполняемый код или AST программы?

Reading time 11 min
Views 14K
Website development *Open source *Programming *Java *System Analysis and Design *
Принципы в заметке общие для почти любого языка программирования и системы исполнения, но акцент будет на jvm. Рассмотрим два основных подхода по модификации программы:

  • манипуляции с исполняемым кодом программы после компиляции или во время загрузки кода;
  • изменение исходного кода перед компиляцией.


Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Comments 10

Генерация кода в Go

Reading time 6 min
Views 38K
Go *
Translation
Перевод статьи Роба Пайка из официального блога Go о автоматической кодогенерации с помощью go generate. Статья немного устарела (была написана перед выходом Go 1.4, в котором и появился go generate), но хорошо объясняет суть работы go generate.
Читать дальше →
Total votes 34: ↑26 and ↓8 +18
Comments 26

Введение в разработку предметно-ориентированных языков (DSL) с помощью EMFText

Reading time 18 min
Views 13K
ООО «ЦИТ» corporate blog Website development *Java *Eclipse *Compilers *
Tutorial

Это 5-я статья цикла по разработке, управляемой моделями. В предыдущих статьях мы уже разобрались с метамоделями, валидацией моделей, некоторыми нотациями для моделей (диаграммы и таблицы). Всё это было в рамках пространства моделирования MOF. Сегодня мы построим мост в пространство моделирования EBNF – познакомимся с текстовой нотацией для MOF-моделей.
Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Comments 25

Разработка парсера, кодогенератора и редактора SQL с помощью EMFText

Reading time 36 min
Views 11K
ООО «ЦИТ» corporate blog Java *Eclipse *SQL *Compilers *
Tutorial


Это 6-я статья цикла по разработке, управляемой моделями. В прошлой статье вы получили общее представление о разработке предметно-ориентированных языков с помощью EMFText. Настало время перейти от игрушечного языка к более серьёзному. Будет очень много рисунков, кода и текста. Если вы планируете использовать EMFText или подобный инструмент, то эта статья должна сэкономить вам много времени. Возможно, вы узнаете что-то новое о EMF (делегаты преобразований).

Подобно отважному хоббиту мы начнём свой путь с BNF-грамматики SQL, дойдём до жуткого дракона (метамодели) и вернёмся обратно к грамматике, но уже другой…
Читать дальше →
Total votes 18: ↑18 and ↓0 +18
Comments 6

Релиз CLion 2016.2: удаленная отладка, поддержка формата Doxygen, новые возможности кодогенерации и многое другое

Reading time 7 min
Views 13K
JetBrains corporate blog Programming *C++ *C *
Привет, Хабр!

Чуть больше года прошло с момента первого релиза нашей кросс-платформенной IDE для разработки на C и C++. За это время у нас появились десятки тысяч пользователей, среди клиентов встречаются такие организации, как NASA и AirBnB, а самый популярный запрос в трекере набрал более 500 голосов. И кстати, мы не зря просим вас голосовать за те запросы, которые вам наиболее интересны или актуальны. Наша очередь задач на разработку зависит от вашего мнения и ваших голосов в первую очередь. Именно поэтому релиз 2016.2 включает в себя так много долгожданных возможностей!



А теперь обо всем по порядку.
Читать дальше →
Total votes 33: ↑29 and ↓4 +25
Comments 79

[CppCon 2017] Herb Sutter: Метапрограммирование и кодогенерация в C++

Reading time 8 min
Views 10K
C++ *
Sandbox

Продолжаю серию публикаций Fil по CppCon 2017. В докладе представлены ранние наработки по добавлению рефлексии и кодогенерации в C++, а также по метаклассам, которые позволят генерировать части классов C++. В стандарт эти новшества попадут не ранее, чем в C++23.

Total votes 14: ↑14 and ↓0 +14
Comments 7

Golang Moscow: встреча в Avito

Reading time 2 min
Views 5K
AvitoTech corporate blog High performance *Website development *System Programming *Go *

Привет, меня зовут Илья, я работаю в Avito и хочу позвать Go-разработчиков на митап, который будет проходить в эту субботу, 14-го октября, у нас в офисе при поддержке сообщества Golang Moscow.


В этот раз главная тема митапа — пристальный разбор привычных стандартных средств Go: обсудим нюансы работы с io.Reader/io.Writer, послушаем анализ эволюции Garbage Collector от Go 1.5 до 1.9, узнаем, как можно расширять database/sql на примере работы с ClickHouse, похоливарим про кодогенерацию. Подробности по докладам и ссылка на TimePad — под катом.


Total votes 29: ↑25 and ↓4 +21
Comments 9

Компилятор на JavaScript с использованием ANTLR

Reading time 19 min
Views 15K
JavaScript *Compilers *



В начале этого года я присоединилась к команде, работающей над MongoDB Compass — графическим интерфейсом для MongoDB. Пользователи Compass через Intercom запросили инструмент, позволяющий писать запросы к базе данных, используя любой удобный им язык программирования, поддерживаемый драйвером MongoDB. То есть нам нужна была возможность трансформировать (компилировать) язык Mongo Shell в другие языки и обратно.

Данная статья может стать как практическим руководством, помогающим при написании компилятора на JavaScript, так и теоретическим ресурсом, включающим основные понятия и принципы создания компиляторов. В конце приведен не только полный список всех используемых при написании материалов, а также ссылки на дополнительную литературу, направленную на более глубокое изучение вопроса. Информация в статье подается последовательно, начиная с исследования предметной области и далее постепенно усложняя функционал разрабатываемого в качестве примера приложения. Если во время прочтения вам кажется, что вы не улавливаете переход от одного шага к другому, вы можете обратиться к полной версии данной программы и возможно это поможет устранить возникший пробел.
Читать дальше →
Total votes 16: ↑15 and ↓1 +14
Comments 3

«Истина в последней инстанции» или зачем нужен Database First Design

Reading time 9 min
Views 12K
Programming *Java *SQL *ООP *
Translation

В этой весьма запоздалой статье я объясню почему, по моему мнению, в большинстве случаев при разработке модели данных приложения необходимо придерживаться подхода "database first". Вместо "Java[любой другой язык] first" подхода, который выведет вас на длинную дорожку, полную боли и страданий, как только проект начнет расти.


image
"Слишком занят, чтобы стать лучше" Licensed CC by Alan O’Rourke / Audience Stack. Оригинальное изображение

Читать дальше →
Total votes 19: ↑18 and ↓1 +17
Comments 109

[CppCon 2018] Herb Sutter: На пути к более простому и мощному C++

Reading time 10 min
Views 9.7K
Programming *C++ *

В своём выступлении на CppCon 2018 Herb Sutter представил общественности свои наработки по двум направлениям. Во-первых, это контроль времени жизни переменных (Lifetime), который позволит обнаруживать целые классы багов на этапе компиляции. Во-вторых, это обновлённый proposal по метаклассам, которые позволят избежать дублирования кода, один раз описывая поведение категории классов и потом подключая его к конкретным классам одной строчкой.

Total votes 20: ↑19 and ↓1 +18
Comments 21

The New iOS Mobile Enterprise. Часть #1: Кодогенерация для ресурсов

Reading time 11 min
Views 7.8K
TINKOFF corporate blog Development for iOS *Development of mobile applications *

Всем привет!


Меня зовут Дмитрий. Так получилось, что я являюсь тим лидом в команде из 13 iOS разработчиков уже на протяжении двух лет. И вместе мы трудимся над приложением Тинькофф Бизнес.


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


Расскажу о практиках и подходах которые помогли команде заметно ускориться в разработке и тестировании и заметно сократить количество стресса, багов, проблем при внеплановом или срочном релизе. #MakeReleaseWithoutStress.


Поехали!

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

Генерация кода для бекенда. Что генерировать, как и зачем?

Reading time 11 min
Views 7.6K
Programming *Java *Kotlin *
Я хочу показать в этой статье как у нас в фирме генерируется бекенд (и немного фронтенд) код, зачем вообще это нужно и как это лучше делать.

Что именно будем генерировать — не так важно.
Важно что мы опишем 3 вида объектов на основе которых сгенерируем взаимодействие фронтенда с бекендом, а кое где и полностью реализацию бекенда

Эти типы объектов:
1. Messages — объекты, которые будучи сериализoванными в JSON участвуют в обмене информации между фронтендом и бекендом
2. Endpoints — URI, который вызывает фронтенд вместе с описанием HTTP метода, параметров запроса, типа Request Body и типа респонса
3. Entities — Это такие messages, для которых них есть стандартные endpoints для Create/Update/List/Delete (может быть не все), они хранятся в базе данных и для них есть Data Access Object, или Spring JPA repository — вообщем зависит от технологии, но какой то доступ к базе данных

Фронтендом я не занимаюсь вообще, но
1) Знаю, что он пишется на Typescript, поэтому мы генерируем и классы тайпскрипта
2) Большая часть требований к бекенду приходит от разработчиков фронтенда.

Требования к коду



Читать дальше →
Total votes 14: ↑13 and ↓1 +12
Comments 8

Публичные контракты, как обеспечить их согласованность

Reading time 13 min
Views 4.8K
Directum corporate blog System Analysis and Design *.NET *
  • ваша система состоит из множества взаимосвязанных сервисов?
  • всё ещё вручную актуализируете код сервисов при изменении публичного API?
  • изменения в ваших сервисах часто подрывают работу других, а другие разработчики вас за это ненавидят?

Если ответили да хотя бы один раз, то добро пожаловать!
Читать дальше →
Total votes 9: ↑9 and ↓0 +9
Comments 4

Опыт оптимизации вычислений через динамическую генерацию байт-кода JVM

Reading time 6 min
Views 1.9K
Образовательные проекты JetBrains corporate blog Kotlin *
В своем небольшом проекте по моделированию случайных величин я столкнулся с проблемой низкой производительности вычисления математических выражений, вводимых пользователем, и долго искал разные способы ее решения: попробовал написать интерпретатор на С++ в надежде, что он будет быстрым, сочинил свой байт-код. Наиболее удачной идеей оказалась генерация классов JVM и их загрузка во время выполнения.

Узнав про KMath, я решил обобщить эту оптимизацию для множества математических структур и операторов, определенных на них.

KMath — это библиотека для математики и компьютерной алгебры, активно использующая контекстно-ориентированное программирование в Kotlin. В KMath разделены математические сущности (числа, векторы, матрицы) и операции над ними — они поставляются отдельным объектом, алгеброй, соответствующей типу операндов, Algebra<T>.

import scientifik.kmath.operations.*

ComplexField {
   (i pow 2) + Complex(1.0, 3.0)
}

Таким образом, после написания генератора байт-кода, с учетом оптимизаций JVM можно получить быстрые расчеты для любого математического объекта — достаточно определить операции над ними на Kotlin.
Читать дальше →
Total votes 7: ↑7 and ↓0 +7
Comments 0

JavaCC 21 Parser Generator

Reading time 4 min
Views 1.9K
Open source *Java *
Sandbox

JavaCC 21 is a continuation of work on the venerable JavaCC parser generator, originally developed at Sun Microsystems in the 1990’s and released under a liberal open source license in 2003. It is currently the most advanced version of JavaCC. It has many feature enhancements (with more to come soon) and also generates much more modern, readable Java code. Also, certain key bugs have finally been fixed. (N.B. The “21” in JavaCC 21 is not a version number. It is simply part of the project name and means that this is a JavaCC for the 21st century!)

Read more →
Total votes 8: ↑8 and ↓0 +8
Comments 0
1