Как я могу заставить свой собственный компилятор C++ понимать шаблоны, вложенные классы и т. Д. Сильные стороны C++?
В моей группе - задача университета написать компилятор языка, подобного Си. Конечно, я собираюсь реализовать небольшую часть нашего любимого C++.
Точная задача абсолютно глупа, и лектор сказал нам, что она должна быть самоскомпилируемой (должна быть способной компилировать себя), поэтому он хотел не использовать библиотеки, такие как Boost и STL.
Он также не хочет, чтобы мы использовали шаблоны, потому что это сложно реализовать.
Вопрос в том, реально ли это для меня, так как я собираюсь написать этот проект самостоятельно, с крайним сроком в конце мая - середине июня (в этом году), чтобы реализовать не только шаблоны, но и вложенные классы, пространства имен, таблицы виртуальных функций на уровне синтаксического анализа?
PS Я не новичок в C++
9 ответов
Придерживайтесь делать компилятор Си.
Поверьте мне, это достаточно трудоемкая работа по созданию достойного компилятора Си, особенно если он должен компилироваться сам. Попытка поддержать все функции C++, такие как вложенные классы и шаблоны, сведет вас с ума. Возможно, группа могла бы сделать это, но я думаю, что одного компилятора Си более чем достаточно.
Если вы не уверены в этом, по крайней мере, сначала внедрите C-подобный язык (так что у вас есть что сдать). Тогда сосредоточьтесь на том, чтобы хвастаться.
"Точная задача абсолютно глупая" - я не думаю, что вы в состоянии сделать это суждение справедливо. Лучше отказаться от этой точки зрения.
"Я собираюсь написать этот проект самостоятельно", - вы сказали, что это групповой проект. Вы говорите, что ваша группа не хочет согласиться с вашим мнением о том, что она должна превратиться в C++, поэтому вы взлетели и работаете самостоятельно? Есть еще один момент, который я бы рекомендовал изменить.
Неважно, насколько вы осведомлены о C++. Ваши навыки с грамматиками, парсерами, лексерами, AST и генерацией кода кажутся куда более уместными.
Не зная больше о вас или о назначении, я бы сказал, что вы преуспеете, если первоначальное задание будет выполнено к концу мая. Это три месяца. Придерживайтесь назначения. Это может удивить вас своими трудностями.
Если вы закончите досрочно и выполните свои обязательства перед своей командой, я бы сказал, что вы можете смело изменять то, что создается, чтобы добавить функции C++.
Могу поспорить, что Бьярне Страуструпу потребовалось более трех месяцев, чтобы добавить объекты в C. Не переоценивайте себя и не недооценивайте первоначальное задание.
Нет проблем. И пока вы занимаетесь этим, почему бы не внедрить операционную систему, чтобы он тоже работал?
Следуйте заданию. Написать компилятор для C-подобного языка! Я бы выбрал подмножество C. Удалите типы данных с плавающей точкой и все другие функции, которые не нужны при сборке вашего компилятора.
Написание C-компилятора - большая работа. Вы не сможете сделать это через пару месяцев. Написание компилятора C++ совершенно безумно. Вы не сможете сделать это через 5 лет.
Я хотел бы подчеркнуть несколько уже упомянутых моментов и дать несколько ссылок.
1) Придерживайтесь стандарта ANSIC 1989 года без оптимизации.
2) Не волнуйтесь, при правильном руководстве, хорошей организации и большом количестве тяжелой работы это выполнимо.
3) Прочитайте обложку " Язык программирования C".
4) Понимать важные концепции разработки компиляторов из Книги Дракона.
5) Посмотрите на lcc и код, и книгу.
6) Взгляните на Лекса и Яка (или Флекса и Бизона)
7) Написание компилятора C (вплоть до того момента, когда он может самостоятельно скомпилироваться) является ритуалом обряда обряда среди программистов. Наслаждайся этим.
Для проекта класса, я думаю, что требование компилятора быть способным компилировать себя - это слишком много. Я предполагаю, что именно это и имелось в виду под глупостью в вопросе. Это означает, что вам нужно заранее точно определить, сколько C вы собираетесь реализовать, и придерживаться этого при сборке компилятора. Итак, построение таблицы символов с использованием примитивов, а не просто с использованием карты STL. Это может быть полезно для курса структуры данных, но упускает из виду курс компилятора. Это должно быть о понимании проблем, связанных с компилятором, и выборе структур данных, которые следует использовать, а не о кодировании структур данных.
Сборка компилятора - это прекрасный способ по-настоящему понять, что происходит с вашим кодом, как только компилятор овладеет им. Какой целевой язык? Когда я взял компиляторы, нам понадобилось 3 семестра на сборку компилятора, чтобы перейти от сортировки к сборке. Это не тривиальная задача. Это одна из тех вещей, которые на первый взгляд кажутся простыми, но чем больше вы погружаетесь в это, тем сложнее становятся вещи.
Вы должны быть в состоянии завершить c-like язык в сроки. Предполагая, что вы принимаете более 1 курса, это именно то, что вы могли бы сделать вовремя. C++ также выполним, но на это уходит гораздо больше времени. Ожидание выполнения шаблонов / виртуальных функций C++ - это слишком много, и вы можете потерпеть неудачу в назначении все вместе. Так что лучше придерживаться компилятора переменного подмножества и закончить его вовремя. Вы также должны учитывать время, необходимое для обеспечения качества. Если вы хотите быть тщательным QA само по себе также займет хорошее время.
Пространства имен или вложенные предложения, либо виртуальные функции на уровне синтаксиса довольно просты, это всего лишь одно или два правила для парсера. Это намного сложнее на более высоких уровнях, при принятии решения, какую функцию / класс выбрать (затенение имен, неоднозначные имена между пространствами имен и т. Д.) Или при компиляции в байт-код / запуск AST. Итак, вы можете написать их, но если это не нужно, пропустите это и напишите просто голую функциональную модель.
Если вы говорите о полном компиляторе с генерацией кода, то забудьте об этом. Если вы просто намереваетесь заняться лексическим и синтаксическим анализом, то некоторые формы шаблонов могут быть практически выполнимыми во временных рамках, в зависимости от того, какие инструменты компиляции вы используете.