C ++ - отличный язык во многих отношениях, но некоторые вещи, в частности, обременительны для написания без IDE. Как пользователь VIM, было бы очень интересно, если бы у меня был доступ к языку более высокого уровня, который позволял бы мне писать C ++ с S-выражениями и, возможно, с макросами, подобными Lisp, что позволяло генерировать чистый код, избегая при этом переписывания тех же самых шаблонов. снова и снова.
Я спросил на freenode и протестировал несколько идей, таких как компиляция Lisp-> C с помощью компиляторов, таких как ECL и Bigloo, но ни один из них не генерировал особенно чистый C-код.
Есть ли работы по этому вопросу?
Ответы:
Компилирование языков более высокого уровня в языки более низкого уровня - это торт. Есть бесчисленное множество примеров того, как это делается. Не вдаваясь в подробности, мы можем указать на ранние компиляторы C ++, которые компилировались до C.
Однако, когда вы начинаете бросать «чистый» и «читаемый» в микс, все становится действительно сложно. Чистый, читаемый код выражает смысл и намерение написанного вами. Компьютеры, как известно, плохо интерпретируют и создают смысл. Вы, скорее всего, в конечном итоге с именами переменных,
int_147
чемinput_buffer_length
. Конечно, если вы действительно хотите, чтобы этот проект работал, вы могли бы участвовать в масштабном AI-проекте, чтобы обработать преобразование вашего Lisp в какой-то прилично читаемый C ++, но, если честно, компиляторы Common Lisp чертовски хороши в том, что они делают ,Полезность этого важнее, чем сложность генерации C ++ из Lisp. Какой цели он будет служить для читабельности созданного C ++? Если Lisp - ваш исходный код, промежуточные представления не должны иметь значения. Если вы хотите иметь возможность передавать C ++ программистам, которые не понимают ваш оригинальный Lisp, у вас теперь есть другая проблема. Что происходит, когда они хотят изменить ваш сгенерированный C ++? Что произойдет, если они напишут на C ++ вещи, которые не будут полностью переведены на ваш Lisp?
Допустим, мы решили это. Прошло десять лет, и, потратив сотни миллионов долларов на гранты DoD, мы создали этот мощный, сложный (но безупречный) движок языкового перевода, который может превратить Lisp в идиоматический C ++ и наоборот. Что мы действительно получили, что было бы лучше достичь, научив людей новому языку программирования или просто разработав новый компилятор, который позволит нам связать два языка?
О верно. Ваш начальник хочет, чтобы вы писали на C ++, а вы бы не хотели. Обновите свое резюме и найдите новую работу.
источник
Короткий ответ: в настоящее время нет ничего, что могло бы помочь вам конвертировать Lisp в READABLE C ++. Конечно, вы можете конвертировать что угодно в C ++ или C, но читаемый код пишется людьми, а не программами. Конечно, вы можете выводить код C ++ с правильным форматированием, отступами, красивыми именами классов и, возможно, даже каким-то образом получить идеальный перевод из объектов класса Lisp в классы C ++. Может быть, вы можете правильно связать свои библиотечные зависимости, и, может быть, вы можете скомпилировать двоичные файлы, которые очень близки к тому, что мог бы создать язык C, если бы вы написали все это на C. Но в конечном итоге читаемый код - это красота, которую не понимают кем-то, по крайней мере, пока, и, возможно, никогда не считая, что термин читаемый Это довольно субъективно для начала, и то, что может считаться читаемым среди одной группы разработчиков, может считаться ужасным для других.
Чтобы сделать С ++ читабельным, вы должны писать на С ++, а не на Лиспе. Вы также должны быть в состоянии изменить свой стиль кодирования в соответствии с тем, что люди, которые будут читать ваш код, будут лучше всего понимать. Как и книги, программы написаны с учетом конкретной аудитории и могут быть красивыми и трогательными, если написаны хорошо, и запутанными и утомительными, если нет. И если мы не сможем придумать программу для написания прекрасных фантастических романов для нас, то мы не сможем придумать что-то, что можно было бы преобразовать в читаемый C ++.
источник
ViM - отличная среда разработки для C ++. У него лучшее завершение, которое я когда-либо видел, хотя оно становится немного медленным, если вы загружаете много заголовков, лязг завершен . И для компиляции я обнаружил, что все IDE не хватает в любом случае; Вы в конечном итоге пишете систему сборки в CMake или что-то еще. И я не видел ничего, чтобы оказать какую-либо помощь для LISP, точка.
Правда, в C ++ нет макросов в стиле lisp, но шаблоны могут делать все, что могут гигиенические макросы схемы, и даже больше, потому что вы можете реализовать их по-разному в зависимости от типов и в зависимости от их возможностей. Правда, отсутствие сборщика мусора делает замыкания немного более утомительными, но идиома RAII, используемая для управления ресурсами, имеет свои преимущества и интересные свойства.
Если вы студент, вы действительно знаете все продвинутые C ++? От библиотеки алгоритмов до написания шаблонов с альтернативными реализациями, основанными на свойствах типов аргументов, вычислений времени компиляции с использованием шаблонного метапрограммирования (с использованием Boost.MPL) до понимания того, как Boost работает под капотом? Если нет, я рекомендую использовать это как возможность изучить некоторые продвинутые C ++. Школьное задание не нужно поддерживать, так что вы можете поиграть с языком, чтобы увидеть, сколько стоят функции, где в рабочем коде вы должны быть осторожны с удобочитаемостью.
И чтобы ответить на последний прямой вопрос: C ++ имеет так много идиом под своим поясом, что невозможно создать идиоматический C ++ из чего-либо. Просто потому, что не будет никакого способа выразить большинство этих идиом во всем остальном. Начиная с того факта, что сборщик мусора будет распределять все по куче, в то время как в C ++ использование стека идиоматично.
источник