(Когда) я должен учить компиляторы? - PullRequest
35 голосов
/ 09 апреля 2009

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

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

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

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

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

Или я должен заказать «Неограниченную Библию без ограничений» (в 24ч ..))) сегодня?

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

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

Ответы [ 9 ]

39 голосов
/ 09 апреля 2009

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

Если вы хотите изучать информатику, ценить и действительно стать ученым, вы ДОЛЖНЫ брать компиляторы.

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

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

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

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

9 голосов
/ 09 апреля 2009

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

4 голосов
/ 09 апреля 2009

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

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

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

4 голосов
/ 09 апреля 2009

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

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


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

Когда вы хотите или нуждаетесь в решении проблемы.

3 голосов
/ 09 апреля 2009

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

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

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

3 голосов
/ 09 апреля 2009

Теория компилятора полезна, но не обязательна.

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

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

2 голосов
/ 02 мая 2012

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

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

2 голосов
/ 09 апреля 2009

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

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

0 голосов
/ 01 апреля 2014

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

...