Какие предметы информатики должны пройти вводный курс в компиляторах? [закрыто]

10

Я не бакалавр компьютерных наук и работаю веб-разработчиком (Java, Python, AS3 и т. Д.) Как профессионал. Я беру 1 курс в семестр в моем местном университете. В прошлом семестре я принимал искусственный интеллект (включающий логику, грамматику без контекста, разбор CYK, вводный НЛП, цепочки Маркова, HMM и т. Д.).

В следующем семестре я планирую пройти вводный курс по компиляторам, который охватывает следующие программы:

Лексический анализ, синтаксический анализ, семантический анализ, среда выполнения, промежуточные представления, генерация кода, распределение регистров, выбор инструкций и планирование, введение в локальную и глобальную оптимизацию кода, анализ потока данных

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

stressed_geek
источник
1
Зависит от вашей школы. У меня было не так сложно, поэтому предварительными условиями были базовые структуры данных и базовые алгоритмы - вот и все. К сожалению, они сделали компиляторы необязательными, и я отказался от них.
Работа

Ответы:

8

Вы, вероятно, должны иметь простое понимание следующих тем:

  • Дискретная математика (множества, отношения, деревья, графы, матрицы, теория чисел)
  • Структуры данных (в более прикладном смысле, как работают деревья, списки, стеки, очереди и строки)
  • Основные алгоритмы (основные понятия, сортировка, поиск, обозначения Big-O и т. Д.)
  • Компьютерная архитектура (цифровая логика, битовые операции, микрокомпоненты, кэш, память, программирование сборки)
  • Разное (регулярные выражения, контекстно-свободные языки, автоматы конечного состояния / раскрытия, машины Тьюринга и вычислимость, лексические и синтаксические инструменты)

Необязательно, и, вероятно, очень поможет:

  • Дизайн операционной системы (управление процессами, дизайн ядра, синхронизация, планирование, события, блокировки, потоки и стек против кучи)
Pewpewarrows
источник
4

Ну, я немного поработал над написанием своих собственных компиляторов, и я бы сказал, что основным условием является четкое понимание того, что вы получите в классе Data Structures. В частности, если вы не понимаете рекурсию, деревья и карты / хеш-таблицы, вы очень быстро потеряетесь, пытаясь научиться создавать компилятор.

Мейсон Уилер
источник
3

Вам понадобятся некоторые базовые знания об архитектуре компьютера (регистры, память, регистры специального назначения и т. Д.), И вы уже видели некоторый код сборки. Было бы еще лучше, если бы вы ранее написали некоторый ассемблерный код, поэтому у вас есть четкое представление о том, как работает машинный язык.

В зависимости от уровня курса, можно ожидать, что вы немного знаете о суперскалярной обработке и тому подобном.

Питер Смит
источник
1
Это верно только в том случае, если мы предположим, что рассматриваемый компилятор генерирует машинный код, а не какой-то байт-код.
Мейсон Уилер
3

Если это вообще что-то вроде класса компиляторов, который я взял в конце мелового периода (около 1988 г.), единственными реальными предпосылками были бы структуры данных (особенно деревья и хеш-таблицы), некоторый язык ассемблера (для сгенерированного кода), возможно некоторая компьютерная архитектура, и любой другой класс будет учить таким вещам, как регулярные выражения, конечные автоматы, машины Тьюринга и т. д., хотя они могут быть рассмотрены как часть самого курса по компилятору (FWIW, мой нет). Вы также захотите убедиться, что понимаете рекурсию.

Джон Боде
источник
2

Возможно, вам также понадобится пройти курс формальных моделей и языков. Все, что покрывает основную иерархию Хомпского, было бы хорошо: Обычные языки + Языки без контекста. Это потому, что важно понимать математические основы синтаксического анализа, чтобы ваш синтаксический анализатор был чистым, производительным и правильным. Я думаю, что хороший класс компиляторов будет часто охватывать как Регулярные выражения, так и парсеры LALR / LL (k) и теорию, стоящую за ними.

Марк Поли
источник
0

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

GrandmasterB
источник
0

Зависит от вашего универа, но большинству требуются следующие условия:

=> Discrete Mathematics
Should include: propositional logic, predicate logic, set theory etc etc 

=> General Concepts of Programming (In any language of choice would be okay)
=> Algorithms and Data Structures
Should include: data structures, abstract data types, recursive algorithms
rrazd
источник