2008-12-09 2 views
10

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

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

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

ответ

2

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

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

EDIT

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

+0

В настоящее время нет разницы в производительности между обеими итерациями. Не знаете, почему и как это произошло, но если вы на самом деле попробуете его, то итерация займет то же самое время. Таким образом, пример массива фактически фактически недействителен. – 2008-12-09 04:05:33

+1

Возможно, исправлено оптимизатором на уровне перезаписи АСТ ... просто гадать. – dmckee 2008-12-09 04:10:25

+1

Это проблема, которая может быть исправлена ​​передовым компилятором, но не все компиляторы делают это. Тем более разумно знать, как работает компилятор и что он может сделать. – 2008-12-09 05:18:44

20

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

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

10

Без каких-либо доказательств эффективности вообще я чувствую себя лучше, понимая, что происходит с моим кодом, зная лишь немного о компиляторах и немного сборки. Вы можете многому научиться, прочитав Jack Crenshaw's Let's Build a Compiler.

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


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


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

1

Я думаю, что здесь работает компилятор (он создает экспликацию с характеристиками x, y, z). Это означает, что вы ориентируетесь на платформу.

Как это делает эту задачу не имеют значения (если только вы не пишете составителей конечно)

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

:) Кажется очевидным, но меня поражает количество разработчиков, которых я встречал, даже не рассматривая вывод компилятора.

1

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

0

Я думаю, что действительно важно, чтобы сделать переводчика: он дает вам больше информации о языках программирования, и это то, что вы используете ... В схеме на самом деле трудно сделать переводчик! Но на самом деле я очень хотел бы прочитать части SICP для большого просветления).

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

0

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

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

1

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

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

3

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

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

    ответа = «»

    для я = 1 до п делать

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

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

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

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

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

1

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

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

3

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

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

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

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

2

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

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

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

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

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

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

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

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

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

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

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

1

В сообщении блога Steve Yegge утверждал, что все программисты should know how compilers work. Он заходит так далеко, чтобы сказать:

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

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

Смежные вопросы