Концепции, необходимые для построения IDE/ компилятора
Какие темы информатики мне нужно знать, когда дело доходит до создания IDE (например, SharpDevelop) или компилятора / анализатора языка? Я не ожидаю полного списка углубленных уроков, а просто списка тем, которые помогут мне в улучшении.
Правильно ли я считаю, что синтаксический анализатор имеет некоторые правила относительно синтаксиса / семантики языка и проверяет код на основе этих правил? Это похоже на простой подход?
Спасибо
6 ответов
IDE, компилятор и отладчик - три разных зверя.
Вот быстрый и немного случайный выбор некоторых ссылок, которые мне показались интересными или вдохновляющими, когда я размышлял над созданием инструментов моделирования для языков моделирования, который настолько близок, насколько я понимаю, к IDE:
- Высокопроизводительный графический интерфейс
- Волшебные чернила - программируемая информация, а не взаимодействие
- Эдвард Туфте - представьте, если ваша трудовая жизнь была потрачена на просмотр информации, сделавшей это прекрасным
- Динамические IDE для динамических языков (Bracha также разработал интерфейс отладочного зеркала Java, еще одна вещь, в которой нуждается IDE)
- Шаблоны информационного дизайна - общие примеры графических интерфейсов
- Проблемы с интерфейсами с вкладками (хотя значки не очень часто используются, когда каждая страница кода выглядит одинаково; возможно, сгенерированные значки, подобные приведенным здесь, будут работать)
- Рекомендации здравого смысла для разработки мультимодальных пользовательских интерфейсов - что, если лучший способ выразить ваш код - это размахивать руками или строго говорить об ошибке.
- Проблема Буратино - похоже на пост Брахи о исправлении работающего фреймворка
В этих ссылках есть склонность к шаблонам, которые помогают читать и просматривать, а не писать код, а также к системам, которые пользователь расширяет, используя их, а не как отдельный цикл; если вам нужен ориентированный на задачи интерфейс или статические плагины, то вам стоит поискать проекты для существующих IDE, таких как Eclipse.
Для реализации компилятора / языка вам понадобится фундаментальное понимание:
Написание компиляторов и интерпретаторов: подход к разработке программного обеспечения [Мягкая обложка] Рональд Мак -> это отличная книга для начала. Он проведет вас через весь процесс создания компилятора и ide с помощью отладчика и многих других необходимых вам вещей. В конце книги у вас будет хорошее представление о том, что нужно сделать, чтобы разветвляться самостоятельно.
Возможно, вы также захотите взглянуть на паттерны языковой реализации, опубликованные PragProg.com.
Если вы пишете компилятор, хороший курс по информатике в области теории языковых переводов или что-то подобное очень важно. MIT Open Courseware предлагает класс "Компьютерный язык" по этим направлениям. Это должно научить вас концепции, которую упоминает mmattax, и обеспечить хорошее начало.
Что касается IDE, это действительно больше проект для настольных приложений. Возможно, вы вызываете компилятор из вашей IDE, но на самом деле вы не компилируете код (хотя, если честно, в сложной IDE вы, возможно, анализируете код). Таким образом, знания, необходимые для создания IDE, которая вызывает внешний компилятор / компоновщик, были бы в большей степени сосредоточены вокруг инструментария пользовательского интерфейса любой платформы, которую вы используете, возможно, с небольшой долей теории интерфейса компилятора (как вы узнали бы в курсе по компилятору).) если вы хотите разобрать код.
Ну, чтобы разработать компилятор, вам нужно понять следующие темы
- конечный автомат (DFA)
- не зависящая от контекста грамматика (вам нужно определить грамматику до того, как вы начнете кодировать, это предварительная версия вашего языка / компилятора)
После того, как сделано с теоретической частью, то вам нужно разработать следующие компоненты для вашего компилятора
- Lexical Analyzer (проверка токенов для вашего языка)
- Парсер (подтвердите предложения вашего языка)
- Схема перевода (преобразование вашего кода (высокий уровень) в 3-х адресный код (код машинного языка))
- Виртуальная машина (генерация кода / создание фактического выхода вашего кода)
Примечание: выход каждого компонента является входом для следующего компонента, а вход Lexical Analyzer является вашим реальным кодом, и в основном компилятор разрабатывается с использованием формального метода (процедурный шаблон проектирования).
Извините, но ответ "Вся информатика и годы практического опыта".
Это слишком большая тема для обычных смертных и затмений, intellij, netbeans и Visual... эта тема довольно хорошо освещена.
Посмотрите на что-то меньшее и более достижимое, как плагин Eclipse для чего-то, что вас интересует.