Полезно ли программисту учиться создавать компилятор? - PullRequest
21 голосов
/ 08 января 2009

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

Ответы [ 17 ]

24 голосов
/ 08 января 2009

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

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

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

Я думаю, что в целом мне это было выгодно, и в настоящее время я работаю над веб-приложениями на основе Java.

8 голосов
/ 08 января 2009

Я нахожусь в процессе чтения Книги Дракона (Компиляторы), и в начале книги вы получаете следующее:

Хотя мало кто может построить или даже поддерживать компилятор для основной язык программирования, Читатель может выгодно применить идеи и методы, обсуждаемые в этой книге для общего проектирования программного обеспечения. За Например, соответствие строки методы построения лексических анализаторы также были использованы в тексте редакторы, поиск информации системы и распознавание образов программы. Контекстно-свободные грамматики и Синтаксически-ориентированные определения были раньше строил много маленьких языков такие как набор текста и рисунок системы рисования, которые произвели это книга. Приемы кода оптимизация была использована в программе верификаторы, и в программах, которые производить "структурированные" программы из неструктурированный код.

Короче говоря, вы не просто научитесь создавать компилятор. По пути вы будете изучать множество различных низкоуровневых техник, чтобы помочь вам в повседневном программировании. Хотя некоторые говорят, что это устаревшая книга, я все еще наслаждаюсь ею, и я бы порекомендовал ее, хотя чтение может стать немного тяжелым. Если он у вас есть, оставьте достаточно времени, чтобы прочитать и понять его.

7 голосов
/ 08 января 2009

Я прошел два курса по компиляции в университете и нашел их полезными, потому что:

  • Написание компилятора требует знания многих областей информатики - регулярных выражений, контекстно-свободных грамматик, синтаксических деревьев, графов и т. Д. Это может помочь вам понять, как применять теорию информатики к реальным задачам .
  • Понимая, как компилятор генерирует и оптимизирует код, вы будете тратить меньше времени на глупые "оптимизации" самостоятельно.
  • Процесс сканирования / лексирования файла и построения из него синтаксического дерева применим к гораздо большему набору проблем, чем просто сборка компилятора.
  • Помогает «обобщать» языки программирования - как только вы видите, что каждый язык программирования в конечном итоге превращается в машинный код, это облегчает изучение новых языков, потому что вы видите, что каждый язык - это просто другой способ выражения одного и того же базового языка. идеи.

Некоторые люди могут возразить, что есть больше полезных вещей, которые вы могли бы делать со своим временем, например, изучение популярного языка программирования или библиотеки, которая может помочь вам получить работу (этот аргумент часто используется в качестве причины, чтобы не изучать язык ассемблера ). Однако знание того, как работают компиляторы, вероятно, облегчит изучение новых языков программирования (см. Пункт # 4).

5 голосов
/ 08 января 2009

Хотя немногим программистам когда-либо придется реализовывать компилятор, более ранние этапы сборки компилятора, а именно лексизация и синтаксический анализ, могут встречаться гораздо чаще: кому не нужно было писать парсер для какого-то странного файла формат? Обычно они достаточно просты для управления без опыта компиляции, но не всегда.

4 голосов
/ 08 января 2009

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

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

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

3 голосов
/ 08 января 2009

Я многому научился.

Одри Танг , разработчик PUGS , рекомендует Типы и языки программирования .

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

3 голосов
/ 08 января 2009

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

3 голосов
/ 08 января 2009

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

2 голосов
/ 08 января 2009

Я проголосовал за большинство из этих ответов.

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

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

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

Как только вы узнаете, что у каждой проблемы есть несколько правильных решений, со своими плюсами и минусами, вы обычно можете выбрать гораздо лучшее решение, чем при использовании старой ориентированной на данные парадигмы "один размер подходит всем".

2 голосов
/ 08 января 2009

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

знание того, как код компилируется и выполняется как в собственном, так и в байт-коде, также является отличным инструментом в C ++ против Java / C # против C ++ / C # против потоков Java и войн пламени;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...