Построить компилятор Object Oriented - PullRequest
4 голосов
/ 31 октября 2011

Я сейчас работаю над проектом для моего класса. Я создаю компилятор с Flex (lex) и Bison (YACC) и C. Я сделал немного семантического синтаксического анализа, но я думал, как я собираюсь реализовать объектно-ориентированную часть. То есть как я могу справиться с классами, перегрузками, полиморфизмом и наследием.

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

Заранее спасибо за помощь, и я извиняюсь, если кто-то думает, что это просит мою домашнюю работу.

1 Ответ

3 голосов
/ 01 ноября 2011

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

В вашем вопросе есть несколько аспектов:

  1. Какова семантика часто используемых концепций объектно-ориентированного программирования?
  2. Как их можно реализовать в компиляторе?
  3. Как они обычно реализуются в других компиляторах?
  4. Какие хорошие ресурсы для дальнейшего обучения?

Семантика

Широко варьируется между языками, а также существует некоторая путаница / противоречие в том, что на самом деле означает ООП (хорошая презентация на эту тему: http://www.infoq.com/presentations/It-Is-Possible-to-Do-OOP-in-Java, в которой также есть несколько примеров реализации функций ООП). Просто выберите одну модель и найдите ссылку, которая определяет семантику, такую ​​как спецификация языка или научная статья о модели.

Javascript, вероятно, является самой простой моделью для реализации, поскольку он очень напрямую отображается на реализацию без значительной части необходимой среды в компиляторе. Статическая версия модели Java (компиляция класса времени компиляции вместо загрузки классов времени выполнения) также не должна быть слишком сложной. Более сложными моделями будут C ++ (который допускает множественное наследование) и Smalltalk или Common Lisp / CLOS (с мета-объектными протоколами).

Возможные реализации

Опять широкий выбор. Так как семантика фиксирована и в основном довольно проста, усилия по реализации наиболее сильно зависят от производительности, которую вы хотите заархивировать, и существующей инфраструктуры вашего компилятора. Сохранение всего в списках и сканирование их для первой записи, которая удовлетворяет правилам, вероятно, является самой простой реализацией.

Обычная реализация

Большинство языков программирования вне области Java / C # / C ++ выполняют статический поиск имени / подписи во время компиляции, чтобы найти определения упомянутых вещей, и используют http://en.wikipedia.org/wiki/Virtual_method_table для разрешения полиморфных вызовов. Они также используют указатель Vtable для instanceof -чек и для проверки понижений.

Ресурсы

Хотя только 30 страниц непосредственно связаны с объектами, я все же думаю, что Lisp in Small Pieces (LiSP) - отличная книга для обучения работе на этом уровне в компиляторе. Основное внимание уделяется реализации языковых функций, компромиссам в реализациях и объединению частей. (если (вы можете избавиться от используемого синтаксиса) (это здорово)).

...