(Когда) должен ли я изучать компиляторы?

согласно этому http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html статья, я определенно должен.

цитата нежный, но настойчивый исполнительный резюме: если вы не знаете, как компиляторы работают, тогда вы не знаете как работают компьютеры. Если тебе не 100% уверен, знаете ли вы, как компиляторы работы, тогда вы не знаете как они работа.

Я подумал, что это очень интересная статья, и область приложение очень полезно (сделайте себе одолжение и прочитайте его) Но опять же, я видел успешных старших инженеров sw, которые не очень хорошо знали компиляторы или внутреннюю машинную архитектуру, если на то пошло, но знал кое-что из каждого пункта в следующем списке :

  • парадигма программирования (OO, функциональная,...)
  • API языка программирования (C#, Java..) и по крайней мере 2 очень разные некоторые говорят! (Java / Haskell)
  • A рамки программирования (Java, .NET)
  • IDE, чтобы сделать вас более продуктивным (Eclipse, VisualStudio, Emacs,....)
  • рекомендации по программированию (см., например, правила fxcop)
  • принципы программирования (сухое, высокое сцепление, низкое сцепление,....)
  • методологий программирования (TDD, MDE)
  • шаблоны проектирования (структурные, поведенческие,....)
  • архитектурные Основы (Уровни, Слои, Модели Процессов (Водопад, Agile,...)
  • Инструмент Тестирования (Модульное Тестирование, Тестирование Модели, ...)
  • метод GUI (WPF, Swing)
  • инструмент документирования (Javadoc, Sandcastle..)
  • язык моделирования (и, возможно, инструмент) (UML, VisualParadigm, Rational)
  • (несомненно, забывая здесь очень важные вещи)

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

или я должен заказать ' The Unleashed Compilers Unlimited Bible (in 24H..)) сегодня?

для тех, кто прочитал статью и хочет сразу начать учиться:

учебные ресурсы по синтаксическим анализаторам, интерпретаторам и компиляторам

9 ответов


Если вы просто хотите быть заурядным кодером и писать вещи... вам не нужно брать компиляторы.

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

компиляторы-это микрокосм информатики! Он содержит каждую проблему, включая (но не ограничиваясь) AI (жадные алгоритмы и эвристический поиск), алгоритмы, теорию (формальные языки, автоматы), системы, архитектуры и т. д.

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

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

I очень надеюсь, что вы рассмотрите возможность узнать о них... это поможет вам перейти на следующий уровень как программиста :-).


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


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

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


Итак, когда вы должны узнать о компиляторах?

когда вы хотите, или это нужно для решения проблемы.


Если вы собираетесь работать на достаточно высоком уровне, где вы беспокоитесь о UML и самоописывающемся коде, вы можете легко пройти всю свою карьеру, не желая или не нуждаясь в интимных деталях того, как работает компилятор.

но, если вы кодер в окопах и не стремитесь управлять своими друзьями, вполне вероятно, что однажды вы поймете, что ведете войну со своим компилятором. Это может быть случайная ошибка, которая приходит или разговор в коридоре о пока-стихи - для петель. Вы поймете, что ассамблея (или IL, вероятно, в ближайшие годы) находится немного слева от того, что вам нужно, и другая вселенная развернется.

Итак, я полагаю, мой ответ таков: просто знайте о компиляторе сейчас, что он делает довольно много, но не беспокойтесь об этом слишком много.


теория компилятора полезна, но не существенна.

хотя есть некоторые методы, которые пригодятся, такие как лексический анализ и синтаксический анализ.

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


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

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

в целом, понимание всего программно-аппаратного стека не важно для написания хороших алгоритмов и кода, но это, безусловно, поможет!


с практической точки зрения общая теория компиляторов-это меньше беспокойства, чем ассемблер, компоновщик и загрузчик для конкретной платформы. Например, я просто рассматриваю компилятор GCC как переводчик с моего языка высокого уровня C на язык сборки низкого уровня на платформе x86. И чаще всего, я вручную уточнение ;) код, сгенерированный компилятором.

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


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

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


просто мое мнение, но я считаю, что компиляторам не уделяется достаточного внимания в курсах CS, не в моем, и не в любом другом afaik. Я думаю, что любой CS major должен делать 2 вещи после творческого отпуска или окончания своего основного: повторно изучать, если необходимо, конечные автоматы и, возможно, язык формальных методов. Применять его. Напишите простой компилятор с этими знаниями. У Алекса Айкена есть очень полезный онлайн-учебник по написанию компилятора для классного объектно-ориентированного языка, который является подмножеством Scala по состоянию на 2013 год ver. По крайней мере, на момент написания.