Чи можливо скомпілювати мову вищого рівня для читання C ++? [зачинено]


12

C ++ - це багато в чому чудова мова, але деякі речі особливо громіздко писати без IDE. Як користувач VIM, було б дуже цікаво, якби я мав доступ до мови вищого рівня, яка дала мені змогу писати C ++ за допомогою S-Expressions і, можливо, макросів, подібних до Lisp, дозволяючи створювати чистий код, уникаючи переписування тих же малюнків знову і знову.

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

Чи є якісь роботи з цього питання?


3
Чому б не написати свій код у lisp з макросами так, що це все C ++, а потім ті функції, які ви хочете, але їх важко зробити, просто розширити макрос LISP з простого синтаксису до більш складного C ++. А ще краще, ви можете просто написати свій код у LISP. :)
Джиммі Хоффа

2
Чи очікуєте ви, що переклад Lisp -> C ++ створить чистий код C ++, коли (можливо, простіший) C ++ -> збірка створює нечитабельну (на думку думки) збірку? Для кого все-таки призначена мета компіляції?

1
Я чомусь не повністю переконаний, що хтось уже написав макроси, щоб розширити саме те, що ви хочете розширити, але, як правило, макроси можна надихати просто, вони просто перелічують методи обробки, у вас не повинно виникнути особливих труднощів, просто написавши його всередині одного s-виразу, який ви розмічаєте, коли хочете, щоб розширювач макросів звернув увагу, а потім просто надрукуйте список, щоб отримати свій код C ++ з розширенням.
Джиммі Хоффа

2
Я погоджуюсь, що Лісп може робити певні речі, які важкі в C ++ (наприклад, закриття). Чи потрібно робити це? Тоді, оскільки їх важко зробити на C ++, незалежно від того, як ви вводите їх у C ++, автоматично або вручну, це буде не дуже. Моя пропозиція: Якщо вам не дуже потрібні ті складні речі, які може зробити Ліпп, не використовуйте Lisp. Будьте добрими на C ++. Якщо ви повинні використовувати ці речі, але ви повинні кодувати в C ++, то з’ясуйте, як це зробити в C ++. Ось що відокремлює дорослих від дітей у цій справі.
Майк Данлаве

3
У кількох мовах є компілятори, які випромінюють код C, тому я не бачу, чому це неможливо, навіть якщо це C-подібний код C ++. Якщо ваше запитання "чи можу я отримати канонічний, найкращий досвід C ++ код, використовуючи всі доступні функції в C ++", це може бути трохи складніше.
Роберт Харві

Відповіді:


13

Компіляція мов вищого рівня до мов нижчого рівня - це торт. Існує незліченна кількість прикладів цього. Не виходячи з більшої частини дотичної, ми можемо вказати на ранні компілятори C ++, які зібрані до C.

Коли ви починаєте кидати в суміш «чисте» та «читабельне», все стає справді важким. Чистий, читабельний код виражає значення та наміри того, що ви писали. Комп'ютери, як відомо, погано інтерпретують та створюють значення. Ви, швидше за все, отримаєте названі змінні, int_147ніж input_buffer_length. Звичайно, якщо ви дійсно хотіли, щоб цей проект працював, ви можете взяти участь у масштабному проекті AI, щоб перетворити ваш Lisp на якийсь гідно читабельний C ++, але, якщо чесно сказати, звичайні компілятори Lisp досить добре трапляються в тому, що вони роблять .

Більш важливою, ніж складність генерації C ++ з Lisp, є корисність цього. Якій меті він послужив би читаному створеному C ++? Якщо Lisp є вашим вихідним кодом, проміжні представлення повинні бути неактуальними. Якщо ви хочете передати C ++ програмістам, які не розуміють ваш оригінал Lisp, у вас зараз є ще одна проблема. Що станеться, коли вони хочуть змінити ваш створений C ++? Що станеться, якщо вони пишуть речі на C ++, які не чітко перекладаються на ваш Lisp?

Скажімо, ми це вирішили. Це десятиліття пізніше, і, спалюючи сотні мільйонів доларів дотаційних грошей на DoD, ми створили цей масивний, складний (але бездоганний) механізм перекладу мови, який може перетворити Lisp на ідіоматичний C ++ і навпаки. Що ми насправді здобули, що не було б краще досягти, навчаючи людей новій мові програмування або просто розробляючи новий компілятор, який дозволяє нам зв’язувати дві мови?

Авжеж. Ваш начальник хоче, щоб ви написали C ++, а ви краще не зробили це. Оновіть своє резюме та знайдіть нову роботу.


Я б хотів, щоб я міг оновити своє резюме та знайти іншу роботу. На жаль, це не так просто, коли робота = "студент" і начальник = "професор". І, на жаль, я маю мати диплом. Незалежно від того, я не ходжу на заняття, а вчуся це вдома. З того факту, що я вже працюю в галузі та заробляю більше грошей, ніж більшість випускників, яких я знаю. Саме так воно працює. Сумно. На щастя, мій професор прийняв мене здати, якщо я напишу щось складне в C ++. Я вже знаю С ++. Тому я краще скористаюся можливістю дізнатися щось інше (; Рант вбік, чудова відповідь. Дякую.
MaiaVictor

@Dokkat: Я не вірю, що ви знаєте C ++. Чи можете ви писати шаблони зі спеціальними реалізаціями залежно від того, чи має параметр якийсь метод чи функцію? Ви робили обчислення за часом компіляції за допомогою Boost.MPL? Ви розумієте, як працює Boost.ForEach? Якщо вам доведеться це робити на C ++, скористайтеся цією можливістю, щоб дізнатися про більш вдосконалений C ++. Він буде більш корисним і для вашої роботи.
Ян Худек

1
Ну, я зробив кілька досить складних шаблонів, коли працював із C ++ у ті сумні роки. Так, я використовував Boost.ForEach багато, я пам’ятаю, що визначив багато макросів, щоб зробити його кориснішим. У будь-якому випадку я був дитиною, це не було веселим досвідом. Я не маю сенсу в подальшому навчанні, коли Лісп надає таку набагато більш міцну, менш болісну макросистему, яка здійснює саме таку метапрограмування, що C ++ вимагає гуру.
MaiaVictor

3

Коротка відповідь, зараз немає нічого, що допоможе вам перетворити Lisp на ЗНАЧЕННУ C ++. Звичайно, ви можете конвертувати що-небудь у C ++ або C, але читабельний код пише людина, а не програми. Впевнені, що ви можете виводити код C ++ з належним форматуванням, відступами, приємними назвами класів і, можливо, навіть якось отримати ідеальний переклад з об’єктів класу Lisp в класи C ++. Можливо, ви можете зв'язати свої залежності від бібліотеки якнайкраще, а може, ви зможете скласти двійкові файли, дуже близькі до того, до чого виходила б мова С, якби ви написали все це на С. Але, зрештою, читабельний код - це краса, яку не розуміють ким-небудь, принаймні не просто ще, і, можливо, ніколи не враховуючи, що цей термін читабельний Спочатку досить суб'єктивно, і те, що можна вважати читабельним серед однієї групи розробників, може вважатися злісним для інших.

Щоб зробити C ++ читабельним, потрібно писати на C ++, а не на Lisp. Ви також повинні мати можливість змінити стиль кодування відповідно до того, що найкраще зрозуміють люди, які прочитають ваш код. Як і книги, програми написані з урахуванням конкретної аудиторії і можуть бути красивими і зворушливими, якщо написані добре, і заплутаними і стомлюючими, якщо ні. І якщо ми не можемо придумати програму для написання прекрасних художніх романів для нас, тоді ми не зможемо придумати щось, щоб перетворити на читабельний C ++.


Я думаю, ви перечитали, що я маю на увазі під «читабельним»! Це не повинно бути справді красивим. Досить просто, щоб ви могли його прочитати і зрозуміти, що відбувається. Я думаю, я піду з деякими макросами Ліспа для прямого перекладу, як запропонував JimmyHoffa в коментарях.
MaiaVictor

3

ViM - це чудовий IDE для C ++. Він має найкраще завершення, яке я коли-небудь бачив досі, хоча він стає трохи повільним, якщо ви втягнете багато заголовків, клац завершений . І для компіляції я все-таки виявив, що всі IDE бракують; ви закінчите писати систему збирання в CMake або щось все одно. І я не бачив нічого, щоб надати будь-яку допомогу за ліс, період.

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

Якщо ви студент, чи справді ви знаєте всі передові C ++? Від бібліотеки алгоритмів до написання шаблонів з альтернативними реалізаціями на основі властивостей типів аргументів, компілюйте обчислення часу за допомогою метапрограмування шаблонів (використовуючи Boost.MPL) до розуміння того, як Boost працює під кришкою? Якщо ні, то рекомендую скористатися цією можливістю, щоб вивчити деякі передові C ++. Шкільне завдання не потребує підтримки, тому ви можете грати з мовою, щоб побачити, які функції варті того, де у виробничому коді вам слід бути обережними щодо читабельності.


І щоб відповісти на остаточний прямий запитання: C ++ має стільки ідіом під своїм поясом, що немає можливості генерувати ідіоматичні C ++ з нічого. Просто тому, що не можна буде висловити більшість цих ідіом ні в чому іншому. Починаючи з того, що все, що буде збирати сміття, виділить все на купі, тоді як у C ++ ідіоматично скористатися стеком.


Погодьтеся на VIM. Він підходить як рукавичка для розвитку С. Я користувач Vim, але для Lisp використовую Emacs у злому режимі зі SLIME та Paredit. Існує деяка підтримка Lisping in vim з основними гачками REPL, але вони не наближаються до SLIME.
mike30
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.