Какие инструменты / IDE / languages существуют для генерации C-кода

#c #compiler-construction #code-generation

#c #конструкция компилятора #генерация кода

Вопрос:

Я хотел узнать больше об инструментах, которые помогают в написании генераторов кода для C. По сути, как мы достигаем функциональности, аналогичной шаблонам c .

Комментарии:

1. Я думаю, вам нужно быть более конкретным с тем, чего вы хотите достичь.

2. Я согласен. Просто у меня было слишком мало информации по этой теме, и я не слишком уверен, о чем я прошу. Я попробую еще раз. У меня есть код, который работает для данного типа данных на C, скажем, целых чисел. Я хочу обобщить это на другие типы данных. Я не думаю, что простое выполнение typedef и search-replace будет работать. Существует ли инструмент и более четко определенный подход к выполнению генерации кода. Другими словами, я хочу точно использовать функции шаблона, но не возражаю против двухэтапной компиляции. Мой целевой язык — C.

3. Ну, очевидный ответ — использовать встроенное в C расширение под названием «C «.

4. Я прошел по очевидному маршруту. Мне понравилось и я многому научился. Я чувствовал, что это мешает моей производительности и ищет не очень мощное неочевидное решение.

5. Если у вас есть шаблонный код для алгоритма и вы не можете использовать шаблоны, тогда какой-то макропроцессор имеет смысл. Вы также захотите поместить условия в макрос, поэтому макросы C не будут работать. Предложение M4 позволит вам сделать все это.

Ответ №1:

Несмотря на то, что это не идеальное решение, и для его освоения требуется некоторое время, в прошлом я использовал макропроцессор m4 для генерации общего кода на C (вроде как шаблоны C ). Возможно, вы захотите это проверить.

Комментарии:

1. Я почти уверен, что макросы m4 не «похожи на шаблоны C «. Попробуйте написать type_traits или Boost::Spirit с обоими, или, если на то пошло, выполнить любое нетривиальное метапрограммирование шаблона.

2. Ну, поскольку GNU m4 завершен по Тьюрингу, теоретически вы можете сделать что-то эквивалентное type_traits or Boost:Spirit . Я полагаю, что это было бы практически невозможно. Тем не менее, на мой взгляд, m4 хорошо работает для более простых вещей, таких как простые универсальные контейнеры.

3. Конечно, это может сработать для дублирования исходного кода для некоторых контейнеров или алгоритмов и замены нескольких фрагментов для их «создания экземпляра» (некоторый хакерский препроцессор должен работать одинаково хорошо). Но это лишь крошечное подмножество шаблонов C . Пожалуйста, не сводите их к этому (и, пожалуйста, не идите по глупому маршруту turing tarpit — никого не волнует, что вы можете, учитывая бесконечное время и упрямых кодовых обезьян, людей волнует только то, сможете ли вы в разумные сроки с разумными ресурсами).

4. Я знаю, что шаблоны C очень мощные. Я пытаюсь сказать, что если по какой-то причине у вас нет возможности использовать C (в моем случае причина заключалась в том, что для целевой системы не было доступных компиляторов C ), но вам отчаянно нужен ограниченный тип универсального программирования, чтобы избежать массового дублирования кода,m4 работает нормально. И, по моему опыту, он работает намного лучше, чем препроцессор C.

5. Спасибо cyco. m4 может просто работать для меня. Хотелось бы чего-то более простого или ориентированного на компилятор. Но я согласен, что простая задача m4 может быть лучшим решением.

Ответ №2:

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

Вы можете использовать генератор кода на основе шаблонов, где «шаблон» означает «шаблонный код» с подстановкой строк. Это самый простой сценарий. Такой инструмент, как StringTemplate или CodeSmith, выполнит эту работу. Но есть много других. Просто поищите вокруг.

Если вам нужен более серьезный сценарий генерации, в котором могут потребоваться различные структуры классов в соответствии с набором определений, тогда вам следует использовать полностью программируемый генератор, такой как AtomWeaver. Существуют и другие (MPS, Xtext), но они не полагаются на шаблоны.

Комментарии:

1. Спасибо Rui. Я попробую. Не уверен, как он будет генерировать C-код?

2. AtomWeaver — это IDE, очень похожая на MS Visual Studio, но для генерации кода. Чтобы сгенерировать код, создайте шаблон Atom и в разделе Exec шаблона вложите свой код с помощью команды code() . Создайте параметры в своем шаблоне и замените переменные части вашего кода этими параметрами. В любом случае, вы должны запустить учебные пособия для нескольких простых примеров…