Можно ли скомпилировать язык более высокого уровня для читаемого C ++? [закрыто]

12

C ++ - отличный язык во многих отношениях, но некоторые вещи, в частности, обременительны для написания без IDE. Как пользователь VIM, было бы очень интересно, если бы у меня был доступ к языку более высокого уровня, который позволял бы мне писать C ++ с S-выражениями и, возможно, с макросами, подобными Lisp, что позволяло генерировать чистый код, избегая при этом переписывания тех же самых шаблонов. снова и снова.

Я спросил на freenode и протестировал несколько идей, таких как компиляция Lisp-> C с помощью компиляторов, таких как ECL и Bigloo, но ни один из них не генерировал особенно чистый C-код.

Есть ли работы по этому вопросу?

MaiaVictor
источник
3
Почему бы не написать свой код в виде шрифта с макросами, чтобы все это было на C ++, а затем те функции, которые вы хотите, но которые трудно просто сделать, просто расширяются макросом LISP от простого синтаксиса до более сложного C ++. А еще лучше, вы можете просто написать свой код на LISP. :)
Джимми Хоффа
2
Вы ожидаете, что перевод Lisp -> C ++ произведет чистый код C ++, когда (возможно, более простая) C ++ -> Assembly производит нечитаемую (с точки зрения мнения) сборку? Для кого предназначена компиляция?
1
Почему-то я не совсем уверен, что кто-то уже написал макросы для расширения именно того, что вы хотите расширить, но, как правило, макросы удивительно просты в написании, они просто методы обработки списков, вам не должно быть особых трудностей, просто писать их все внутри одного s-выражения, которое вы разделяете, когда хотите, чтобы макроэкспандер обращал внимание, а затем просто распечатываете список, чтобы получить код C ++ с расширением.
Джимми Хоффа
2
Я согласен, что Lisp может делать определенные вещи, которые сложны в C ++ (например, замыкания). Вам нужно сделать эти вещи? Тогда, поскольку их трудно сделать в C ++, независимо от того, как вы их вводите в C ++, автоматически или вручную, это не будет красиво. Мое предложение: если вам действительно не нужны те сложные вещи, которые может делать Лисп, не используйте Лисп. Получите хорошее в C ++. Если вам нужно использовать эти вещи, но вы должны писать код на C ++, то подумайте, как это сделать на C ++. Вот что отличает взрослых от детей в этом бизнесе.
Майк Данлавей
3
Есть несколько языков, имеющих компиляторы, которые генерируют код на C, поэтому я не понимаю, почему это невозможно, даже если это C-подобный код C ++. Если ваш вопрос «могу ли я получить канонический, лучший код C ++ с использованием всех доступных функций в C ++», это может быть немного сложнее.
Роберт Харви

Ответы:

13

Компилирование языков более высокого уровня в языки более низкого уровня - это торт. Есть бесчисленное множество примеров того, как это делается. Не вдаваясь в подробности, мы можем указать на ранние компиляторы 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 ++, а вы бы не хотели. Обновите свое резюме и найдите новую работу.

Шон Максомт
источник
Я хотел бы обновить свое резюме и найти другую работу. К сожалению, это не так просто, когда работа = "студент" и начальник = "профессор". И, к сожалению, у меня должен быть диплом. Несмотря на то, что я не хожу на занятия, а учусь сам дома. Из того факта, что я уже работаю в отрасли и зарабатываю больше денег, чем большинство выпускников, которых я знаю. Вот как это работает. К сожалению. К счастью, мой профессор согласился передать меня, если я напишу что-нибудь сложное в C ++. Я уже знаю C ++. Так что я бы предпочел воспользоваться возможностью узнать что-то другое (Rant в стороне, отличный ответ. Спасибо.
MaiaVictor
@Dokkat: я не верю, что вы знаете C ++. Можете ли вы написать шаблоны со специальными реализациями в зависимости от того, есть ли у параметра какой-либо метод или функция? Вы делали вычисления во время компиляции, используя Boost.MPL? Вы понимаете, как работает Boost.ForEach? Если вам нужно сделать это на C ++, воспользуйтесь возможностью изучить более продвинутый C ++. Это будет более пригодным для вашей работы тоже.
Ян Худек
1
Ну, я сделал несколько довольно сложных шаблонов, когда работал с C ++ в те печальные годы. Да, я много использовал Boost.ForEach, я помню, как определил много макросов, чтобы сделать его более полезным. Во всяком случае, я был ребенком, это был не веселый опыт. Я не вижу смысла в дальнейшем изучении, когда Lisp предоставляет такую ​​гораздо более надежную, менее болезненную макросистему, которая выполняет именно тот тип метапрограммирования, что C ++ требует навыков гуру.
MaiaVictor
3

Короткий ответ: в настоящее время нет ничего, что могло бы помочь вам конвертировать Lisp в READABLE C ++. Конечно, вы можете конвертировать что угодно в C ++ или C, но читаемый код пишется людьми, а не программами. Конечно, вы можете выводить код C ++ с правильным форматированием, отступами, красивыми именами классов и, возможно, даже каким-то образом получить идеальный перевод из объектов класса Lisp в классы C ++. Может быть, вы можете правильно связать свои библиотечные зависимости, и, может быть, вы можете скомпилировать двоичные файлы, которые очень близки к тому, что мог бы создать язык C, если бы вы написали все это на C. Но в конечном итоге читаемый код - это красота, которую не понимают кем-то, по крайней мере, пока, и, возможно, никогда не считая, что термин читаемый Это довольно субъективно для начала, и то, что может считаться читаемым среди одной группы разработчиков, может считаться ужасным для других.

Чтобы сделать С ++ читабельным, вы должны писать на С ++, а не на Лиспе. Вы также должны быть в состоянии изменить свой стиль кодирования в соответствии с тем, что люди, которые будут читать ваш код, будут лучше всего понимать. Как и книги, программы написаны с учетом конкретной аудитории и могут быть красивыми и трогательными, если написаны хорошо, и запутанными и утомительными, если нет. И если мы не сможем придумать программу для написания прекрасных фантастических романов для нас, то мы не сможем придумать что-то, что можно было бы преобразовать в читаемый C ++.

Шашанк Гупта
источник
Я полагаю, вы не понимаете, что я имею в виду под "читабельным"! Это не должно быть действительно красиво. Достаточно, чтобы вы могли прочитать и понять, что происходит. Думаю, я пойду с некоторыми макросами Lisp для прямого перевода, как предложил JimmyHoffa в комментариях.
MaiaVictor
3

ViM - отличная среда разработки для C ++. У него лучшее завершение, которое я когда-либо видел, хотя оно становится немного медленным, если вы загружаете много заголовков, лязг завершен . И для компиляции я обнаружил, что все IDE не хватает в любом случае; Вы в конечном итоге пишете систему сборки в CMake или что-то еще. И я не видел ничего, чтобы оказать какую-либо помощь для LISP, точка.

Правда, в C ++ нет макросов в стиле lisp, но шаблоны могут делать все, что могут гигиенические макросы схемы, и даже больше, потому что вы можете реализовать их по-разному в зависимости от типов и в зависимости от их возможностей. Правда, отсутствие сборщика мусора делает замыкания немного более утомительными, но идиома RAII, используемая для управления ресурсами, имеет свои преимущества и интересные свойства.

Если вы студент, вы действительно знаете все продвинутые C ++? От библиотеки алгоритмов до написания шаблонов с альтернативными реализациями, основанными на свойствах типов аргументов, вычислений времени компиляции с использованием шаблонного метапрограммирования (с использованием Boost.MPL) до понимания того, как Boost работает под капотом? Если нет, я рекомендую использовать это как возможность изучить некоторые продвинутые C ++. Школьное задание не нужно поддерживать, так что вы можете поиграть с языком, чтобы увидеть, сколько стоят функции, где в рабочем коде вы должны быть осторожны с удобочитаемостью.


И чтобы ответить на последний прямой вопрос: C ++ имеет так много идиом под своим поясом, что невозможно создать идиоматический C ++ из чего-либо. Просто потому, что не будет никакого способа выразить большинство этих идиом во всем остальном. Начиная с того факта, что сборщик мусора будет распределять все по куче, в то время как в C ++ использование стека идиоматично.

Ян Худек
источник
Согласитесь на VIM. Это подходит как перчатка для разработки C. Я пользователь Vim, но для Lisp я использую Emacs в злом режиме с SLIME и Paredit. Существует некоторая поддержка Lisping в vim с базовыми хуками REPL, но они не приближаются к SLIME.
mike30