Как я могу заставить свой собственный компилятор C ++ понимать шаблоны, вложенные классы и т.д.сильные стороны C ++?

StackOverflow https://stackoverflow.com/questions/618859

Вопрос

Это университетская задача в моей группе - написать компилятор Си-подобного языка.Конечно, я собираюсь реализовать небольшую часть нашего любимого C ++.
Точная задача абсолютно глупа, и лектор сказал нам, что она должна быть самокомпилируемой (должна быть способна компилироваться сама) - итак, он имел в виду не использовать библиотеки, такие как Boost и STL.
Он также не хочет, чтобы мы использовали шаблоны, потому что это трудно реализовать.
Вопрос в том - реально ли для меня, поскольку я собираюсь написать этот проект самостоятельно, с дедлайном в конце мая - середине июня (этого года), реализовать не только шаблоны, но и вложенные классы, пространства имен, таблицы виртуальных функций на уровне синтаксического анализа?
PS Я не новичок в C ++

Это было полезно?

Решение

Придерживайтесь компилятора Си.

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

Если вы не уверены в этом, сначала, по крайней мере, внедрите C-подобный язык (так что у вас есть что сдать). Тогда сосредоточьтесь на хвастовстве.

Другие советы

" Точная задача абсолютно глупа " - Я не думаю, что вы в состоянии сделать такое суждение справедливо. Лучше отказаться от этого представления.

" я собираюсь написать этот проект самостоятельно " - Вы сказали, что это групповой проект. Вы говорите, что ваша группа не хочет согласиться с вашим мнением о том, что она должна превратиться в C ++, поэтому вы взлетели и работаете самостоятельно? Есть еще один момент, который я бы порекомендовал изменить.

Неважно, насколько вы осведомлены о C ++. Ваши навыки с грамматиками, парсерами, лексерами, AST и генерацией кода кажутся куда более уместными.

Не зная больше о вас или о назначении, я бы сказал, что у вас все получится, если первоначальное задание будет выполнено к концу мая. Это три месяца. Придерживайтесь назначения. Это может удивить вас своими трудностями.

Если вы закончите досрочно и выполните свои обязательства перед своей командой, я бы сказал, что вы можете смело изменять то, что создается, чтобы добавить функции C ++.

Держу пари, Бьярн Страуструпу потребовалось более трех месяцев, чтобы добавить объекты в C. Не переоценивайте себя и не недооценивайте первоначальное задание.

Нет проблем. И пока вы занимаетесь этим, почему бы не внедрить операционную систему, чтобы он тоже работал?

Следуйте заданию. Напишите компилятор для языка C-like ! Я бы выбрал подмножество из C. Удалите типы данных с плавающей запятой и все другие функции, которые не нужны при сборке вашего компилятора.

Написание компилятора C - большая работа. Вы не сможете сделать это через пару месяцев. Написание компилятора C ++ совершенно безумно. Вы не сможете сделать это через 5 лет.

Я хотел бы подчеркнуть несколько уже упомянутых моментов и дать несколько ссылок.

1) Придерживайтесь стандарта ANSI C 1989 года без оптимизации.

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

3) Прочитайте обложку Язык программирования C .

4) Изучите важные концепции разработки компилятора из Книги Дракона .

5) Взгляните на lcc как код, так и < a href = "https://rads.stackoverflow.com/amzn/click/com/0805316701" rel = "noreferrer"> книга .

6) Взгляните на Lex и Yacc (или Flex and Bison)

7) Написание компилятора C (вплоть до того момента, когда он может самостоятельно скомпилироваться) является ритуалом обряда прохождения среди программистов. Наслаждайтесь этим.

Для проекта класса, я думаю, что требование компилятора иметь возможность компилировать себя - это очень много вопросов. Я предполагаю, что именно это подразумевалось под глупостью в вопросе. Это означает, что вам нужно заранее точно определить, сколько C вы собираетесь реализовать, и придерживаться этого при сборке компилятора. Итак, построение таблицы символов с использованием примитивов, а не просто с использованием карты STL. Это может быть полезно для курса структуры данных, но упускает из виду курс компилятора. Нужно понимать проблемы, связанные с компилятором, и выбирать, какие структуры данных использовать, а не кодировать структуры данных.

Сборка компилятора - это прекрасный способ по-настоящему понять, что происходит с вашим кодом, как только компилятор овладеет им. Какой целевой язык? Когда я взял компиляторы, нам понадобилось 3 семестра на сборку компилятора, чтобы перейти от сортировки к сборке. Это не тривиальная задача. Это одна из тех вещей, которые на первый взгляд кажутся простыми, но чем больше вы в нее погружаетесь, тем сложнее становятся вещи.

Вы должны быть в состоянии завершить c-like язык в течение срока. Предполагая, что вы принимаете более 1 курса, это именно то, что вы могли бы сделать вовремя. C ++ также выполним, но на это уходит гораздо больше времени. Ожидание выполнения шаблонов / виртуальных функций с ++ - это слишком много, и вы можете потерпеть неудачу в назначении все вместе. Так что лучше придерживаться компилятора подмножества c и закончить его вовремя. Вы также должны учитывать время, необходимое для обеспечения качества. Если вы хотите быть тщательным QA само по себе также займет хорошее время.

Пространства имен или вложенные классы, либо виртуальные функции на уровне синтаксиса довольно просты, это всего лишь еще одно или два правила для синтаксического анализа.Это намного сложнее на более высоких уровнях, при принятии решения, какую функцию / класс выбрать (затенение имени, неоднозначные имена между пространствами имен и т.д.), Или при компиляции в байт-код / запуске AST.Итак, возможно, вы сможете написать это, но если в этом нет необходимости, пропустите это и напишите просто голую функциональную модель.

Если вы говорите о полном компиляторе с генерацией кода, то забудьте об этом. Если вы просто намерены сделать лексическое & amp; Что касается синтаксического анализа, то некоторые формы шаблонов могут быть практически выполнимыми во времени, в зависимости от того, какие инструменты компиляции вы используете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top