Подтвердить что ты не робот

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

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

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

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

  • Парадигма программирования (OO, функциональная,...)
  • Язык программирования API (С#, Java..) и по крайней мере 2 очень разные говорят! (Java/Haskell)
  • Структура программирования (Java,.NET)
  • IDE, чтобы сделать вас более продуктивным (Eclipse, VisualStudio, Emacs,....)
  • Передовые методы программирования (см., например, правила fxcop)
  • Принципы программирования (DRY, High Cohesion, Low Coupling,....)
  • Методы программирования (TDD, MDE)
  • Шаблоны проектирования (структурные, поведенческие,...).
  • Архитектурные основы (уровни, слои, модели процессов (водопад, гибкий,...)
  • Инструмент тестирования (тестирование устройства, тестирование модели,...)
  • Технология GUI (WPF, Swing)
  • Инструмент для документирования (Javadoc, Sandcastle..)
  • Моделирование языка (и, возможно, инструмента) (UML, VisualParadigm, Rational)
  • (несомненно, забыв здесь очень важный материал)

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

Или я должен заказывать "Развязанные компиляторы Неограниченная Библия (в 24H..))) сегодня?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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


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

Если вам нужно или нужно решить проблему.

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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