Спросите Hackaday: изучайте ассемблер в первую очередь, в последнюю очередь или никогда?
ДомДом > Блог > Спросите Hackaday: изучайте ассемблер в первую очередь, в последнюю очередь или никогда?

Спросите Hackaday: изучайте ассемблер в первую очередь, в последнюю очередь или никогда?

Jul 15, 2023

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

Конечно, это было очень давно. В наши дни более вероятно, что если вам больше 40 лет, вы, возможно, сначала выучите BASIC. Становишься моложе, и начинаешь склоняться к Java, Javascript или даже C. Однако это заставило меня задуматься: стоит ли людям изучать ассемблер, и если да, то когда?

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

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

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

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

Итак, есть два пути. Во-первых, выберите более старый процессор. Что-то вроде Z80, 1802 или 6502 не так уж сложно освоить, и для этого существует масса доступных ресурсов. У вас нет такого оборудования? Какая разница? Используйте эмулятор. Вероятно, вы даже сможете найти некоторые из них, которые запускаются в браузере и имеют отличные возможности отладки, недоступные на реальном оборудовании. Я программировал на десятках процессоров, и все они очень похожи. Учитывая странность модели 1802, я, возможно, не рекомендую ее, хотя мне она сама нравится. С другой стороны, этому очень легко научиться. PDP-8 или PDP-11 — другие хорошие кандидаты, хотя некоторые особенности работы миникомпьютеров сегодня редко можно увидеть.

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

Только не заходите слишком далеко назад. Программирование EDSAC, TUTAC или 4004, вероятно, вообще не соответствует современным вычислениям. Честно говоря, ни один из этих процессоров не является таковым. Но при необходимости они могут помочь подготовить почву для перехода на более совершенные процессоры. Как в старой поговорке: прежде чем идти, нужно ползти, и идти, прежде чем бежать.

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

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