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

Полезно ли программисту узнать, как построить компилятор?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я читаю книгу драконов (компиляторы), и в начале книги вас приветствуют следующим образом:

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 9

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

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

Если вы делаете всю свою работу в PHP mySql, это здорово. Просто помните, что все технологии устарели, и вам нужно понять следующую замечательную вещь. Наличие "общих знаний", таких как понимание компиляции, обеспечивает концептуальный буфер между вами и теми shmucks, которые не могут адаптироваться.

Узнайте, как учиться.

Ответ 10

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

зная, как компилируются и выполняются команды как в родном, так и в байткоде, также является отличным инструментом в С++ vs Java/С# vs С++/С# vs Java threads и пламенных войн;)

Ответ 11

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

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

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

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

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

Ответ 12

Я веб-разработчик; Я провожу большую часть своего времени в PHP и MySQL. Я не думаю, что научиться строить компилятор мне очень понравится.

Различные типы программистов получат разные преимущества.

Бит не ответа, я знаю...

Ответ 13

Да, это хорошая идея. Изучение того, как все это работает, может принести пользу только программисту. Я написал BASIC-компилятор в SX ASM и узнал тонну от него.

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

Повторное изобретательство колес всегда полезно для образовательной ценности.

Ответ 14

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

Ответ 15

В некотором роде, этот вопрос очень похож на "Должен ли я узнать C?"

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

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

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

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

Ответ 16

Недавно я сделал независимое исследование того, что мы назвали Language Processing (мой последний проект был не столько компилятором, сколько парсером/интерпретатором файлов С++ с функциями, подобными компилятору). Я должен был использовать книгу "Дракон", о которой говорилось выше. Я думал, что это разработчик программного обеспечения, это была одна из самых важных вещей, которые я сделал в своей карьере в колледже. Я нашел это не только интересным и полезным для моей личной выгоды, но и позволило мне глубже проникнуть на язык. В дополнение к тому, что книга Дракона не является специфичной для языка, она помогла мне понять сходство и, что еще важнее, причины различий на разных языках. Однако я согласен с тем, что не все программисты могут сочтет это необходимым. Тем не менее, в области разработки программного обеспечения я считаю, что если у вас есть интерес к расширению вашего понимания дизайна языка, может быть очень полезно посмотреть на компиляторы.

Ответ 17

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

Кроме того, новые языки программирования, такие как zonnon и composita, используйте синтаксические направленные протоколы для связи между живыми объектами. Они определяют типы протоколов, которые определяют интерфейс для потока сервера как грамматику EBNF. Это делает невозможным кодирование обработчиков сообщений, если вы не написали компилятор!

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

В то время как текущая реализация zonnon все еще немного на glitchy стороне; и определение языка, похоже, еще не завершено; я, тем не менее, буду настолько смел, чтобы рисковать тем, что zonnon (или что-то подобное) поместит С# в мусорный ящик, где он принадлежит, если они могут устранить эти проблемы.

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

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