Как я могу заставить свой собственный компилятор C ++ понимать шаблоны, вложенные классы и т. Д. Сильные стороны C ++? - PullRequest
4 голосов
/ 06 марта 2009

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

Ответы [ 9 ]

28 голосов
/ 06 марта 2009

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

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

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

22 голосов
/ 06 марта 2009

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

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

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

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

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

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

10 голосов
/ 06 марта 2009

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

7 голосов
/ 06 марта 2009

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

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

5 голосов
/ 06 марта 2009

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

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

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

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

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

5) Взгляните на lcc и код, и книгу .

6) Взгляните на Лекса и Яка (или Флекса и Бизона)

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

3 голосов
/ 06 марта 2009

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

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

2 голосов
/ 06 марта 2009

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

1 голос
/ 06 марта 2009

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

1 голос
/ 06 марта 2009

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

...