Какую часть компилятора мы должны знать? - PullRequest
10 голосов
/ 09 декабря 2008

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

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

Если да, то какие ресурсы вы бы порекомендовали?

Ответы [ 13 ]

20 голосов
/ 09 декабря 2008

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

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

10 голосов
/ 09 декабря 2008

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

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


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


Edit2: Многие обычные тексты используют довольно абстрактный математический подход к проблеме компилятора, который поначалу может пугать или сбивать с толку. Учебное пособие Crenshaw основано на подходе «начать разбивать код», основанном на более тонком понимании автора. Хорошее вступление, но если вы серьезны, ваш должен провести более формальное исследование.

3 голосов
/ 09 декабря 2008

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

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

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

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

3 голосов
/ 09 декабря 2008

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

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

    answer = ""

    для i = 1 до n

      answer = answer .. strings[i]    -- .. is string concatenation
    

    Этот код является квадратичным, выполняя квадратичное количество выделения и копирования. Плохие новости.

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

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

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

2 голосов
/ 09 декабря 2008

Вы заинтересованы в эффективном использовании отладчика? Тогда да. Вы заинтересованы в написании надежного или эффективного кода? Тогда да.

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

Для середины компилятора я рекомендую как lcc, так и sdcc. Вы можете или не можете купить книгу LCC:

[http://www.cs.princeton.edu/software/lcc/][1]

Вам не нужно, хотя, источник находится в сети (во многих формах). Как и sdcc (небольшой компилятор c устройством, изначально созданный для 8051 и других 8-битных микро). Я рекомендую зайти в интерфейс, где компилятор отвечает бэкэнду, вы обнаружите, что ваш код превращен в серию атомарных частей, иногда наоборот. а = б + 7; может закончиться тем, что загрузит постоянное целое число 7. читает из памяти переменную b в следующие доступные регистры. Добавьте 7 плюс регистр с помощью b и сохраните в следующем доступном регистре. сохранить значение в регистре в месте в памяти для.

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

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

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

Я был бы осторожен с утверждением «не пиши для компилятора, а пиши для чтения». Существует много плохого кода, потому что такого рода утверждения используются неправильно. Написание кода для удобства обслуживания приводит к плохому коду, который необходимо поддерживать. Ремонтопригодность является взаимоисключающей с надежностью и производительностью. Лично у меня была бы надежность и производительность, чем плохой код, который может поддерживать любой выпускник колледжа.

Со временем вы научитесь не слишком стараться писать для компилятора. Просто не тратьте впустую свой код, не используйте особенности языка. Если вам нужно было провести дополнительное исследование, чтобы выяснить какую-то функцию компилятора, вы можете быть уверены, что большая часть мира не понимает этого, включая человека, который должен внедрить его в компиляторы. Поэтому вы можете ожидать, что эта функция не будет работать согласованно между компиляторами, поэтому вы должны использовать ее в первую очередь. Это также означает, что не пытайтесь писать свой код для одного конкретного компилятора, не слишком привязывайтесь к gcc и его функциям, пробуйте sdcc и lcc, а также microsoft, borland, kiel и другие. Сделайте ваш код чистым, простым, читаемым и переносимым.

Итог: если вы серьезно относитесь к написанию программного обеспечения, то вам абсолютно необходимо знать, как работает компилятор. gcc, sdcc, lcc (и vbcc, если вы можете его найти) - все они бесплатные, с открытым исходным кодом и предоставляют опыт обучения, который улучшит ваши навыки программирования.

2 голосов
/ 09 декабря 2008

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

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

EDIT

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

1 голос
/ 17 августа 2010

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

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

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

1 голос
/ 09 декабря 2008

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

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

1 голос
/ 09 декабря 2008

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

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

1 голос
/ 09 декабря 2008

Не учите компиляторы, изучайте решаемые ими проблемы.

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