Первый вопрос, который задаёт себе человек, впервые услышавший о языке программирования Assembler, – а зачем он, собственно, нужен? Особенно теперь, когда все пишут на C/C++, Delphi или других языках высокого уровня? Действительно, ведь очень многое можно создать на С, но ни один язык, даже такой популярный, не может претендовать на то, чтобы на нём можно было написать действительно абсолютно «всё».
Итак, на Ассемблере пишут:
1) всё, что требует максимальной скорости выполнения: основные компоненты компьютерных игр, ядра операционных систем реального времени и просто критические участки программ;
2) всё, что взаимодействует с внешними устройствами: драйверы; программы, работающие напрямую с портами, звуковыми и видеоплатами;
3) всё, что полностью использует возможности процессора: ядра многозадачных операционных систем, DPMI-серверы и вообще любые программы, переводящие процессор в защищённый режим;
4) всё, что полностью использует возможности операционной системы: вирусы и антивирусы; программы защиты от несанкционированного доступа; программы, обходящие эти защиты, и программы, защищающиеся от данных программ;
и многое другое.
Стоит познакомиться с Ассемблером поближе, как оказывается, что многое из того, что обычно пишут на языках высокого уровня, лучше, проще и быстрее написать на Ассемблере.
Как же так? Ведь всем известно, что Ассемблер – неудобный язык, и писать на нём долго и сложно! Давайте перечислим мотивы, которые обычно выдвигаются в доказательство того, что Ассемблер не нужен.
1) Говорят, что ассемблер трудно выучить. Любой язык программирования трудно выучить. Легко выучить С или Delphi после Pascal, потому что они похожи. А попробуйте освоить Lisp, Forth или Prolog, и окажется, что ассемблер в действительности даже проще, чем любой абсолютно незнакомый язык программирования.
2) Говорят, что программы на ассемблере трудно понять. Разумеется, на ассемблере легко написать неудобочитаемую программу, точно так же, как и на любом другом языке! Если вы знаете язык и если автор программы не старался её запутать, то понять программу будет не сложнее, чем если бы она была написана на Basic.
3) Говорят, что программы на ассемблере трудно отлаживать. Программы на ассемблере легко отлаживать – опять же при условии, что Вы знаете язык. Более того, знание ассемблера часто помогает отлаживать программы на других языках, потому что оно даёт представление о том, как на самом деле функционирует компьютер и что происходит при выполнении команд языка высокого уровня.
4) Говорят, что современные компьютеры такие быстрые, что ассемблер больше не нужен. Каким бы быстрым ни был компьютер, пользователю всегда хочется большей скорости, иначе не наблюдалось бы постоянного спроса на ещё более мощные компьютеры. И самой быстрой программой на данном оборудовании всегда будет программа, написанная на ассемблере.
5) Говорят, что писать на ассемблере сложно. В этом есть доля правды. Очень часто авторы программ на ассемблере «изобретают велосипеды», программируя заново элементарные процедуры типа форматированного вывода на экран или генератора случайных чисел, в то время как программисты на С просто вызывают стандартные функции. Библиотеки таких функций существуют и для ассемблера, но они не стандартизированы и не распространяются вместе с компиляторами.
6) Говорят, что программы на ассемблере не переносятся. Действительно, в этом заключается самая сильная и самая слабая сторона ассемблера. Во-первых, благодаря этой особенности программы на ассемблере используют возможности компьютера с наибольшей полнотой; во-вторых, эти же программы не будут работать на другом компьютере. Стоит заметить, что и другие языки часто не гарантируют переносимости – та же программа на С, написанная, например, под Windows 95, не скомпилируется ни на Macintosh, ни на SGI.
Далеко не всё, что говорят об Ассемблере, является правдой, и далеко не все, кто говорят об Ассемблере, на самом деле знают его. Но даже ярые противники согласятся с тем, что программы на Ассемблере – самые быстрые, самые маленькие и могут то, что не под силу программам, созданным на любом другом языке программирования.
Почти всё, что надо знать об Ассемблере, где-нибудь да объяснено, а также объяснено многое из того, что не заботит большинство программистов. С одной стороны, чтобы написать простую программу, не нужно знать язык и устройство процессора в совершенстве, но, с другой стороны, по-настоящему серьёзная работа потребует и основательной подготовки.
Степень мотивации при изучении того или иного раздела науки или практического навыка имеет первостепенное значение и во многом определяет успех или неудачу. Для себя вопрос можно сформулировать более точно: зачем мне нужно изучать Ассемблер?
При честном ответе самому себе на этот вопрос, несомненно, необходимо учитывать соображения научной и практической значимости проблемы, честолюбия (в хорошем смысле), практических последствий (получение диплома, возможность устройства на работу), стремление к постижению научной истины и, далеко не в последнюю очередь, материальные, финансовые интересы.
В настоящее время на всём земном шаре миллионы, если не миллиарды, людей вовлечены в процесс компьютеризации. Без преувеличения можно сказать, что люди, общающиеся с компьютером на уровне Ассемблера, стоят на вершине этой гигантской пирамиды. Это – жрецы информатики, они же относятся к самым высокооплачиваемым программистам. Таким образом, изучив Ассемблер, можно в полной мере удовлетворить собственное честолюбие не в ущерб окружающим и приобрести специальность с высокой степенью востребованности.
Переходя к более специфическим аспектам, необходимо отметить, что программа на Ассемблере как никакая другая близка к машинному коду, является лишь «слегка причёсанным» машинным кодом.
Отсюда в качестве постулата можно констатировать, что ни один язык программирования высокого уровня, и даже ни один какой-либо программный продукт вообще, не может обеспечить создание более эффективной и гибкой программы, чем Ассемблер. Всё, что можно создать при помощи любых программных продуктов, можно создать и при помощи Ассемблера. Обратное неверно. Правда, за это приходится платить снижением производительности труда при программировании.
Именно ассемблер (и ничто другое) служит инструментом для построения интерфейсов и поддержки протоколов связи с любыми нетрадиционными внешними устройствами (например, с аппаратурой некоторого физического эксперимента, космического корабля и т. п.).
Неоспорима методическая ценность изучения Ассемблера для досконального понимания работы компьютера. Полностью и до конца понять работу компьютера (за исключением его электроники) можно, только освоив Ассемблер и управление компьютером на самом нижнем уровне.
Можно утверждать, что знание Ассемблера и умение работать с компьютером на самом нижнем уровне обязательны для системного программиста-профессионала. Однако и учёный-прикладник может делать простые ассемблерные вставки в свои программы на Паскале или на C++, «вылизывая» наиболее ответственные их места. Кстати, можно и наоборот, вставлять процедуры на языках высокого уровня в ассемблерную программу.
Наконец, нельзя не отметить удовольствие от программирования, когда вы работаете один на один с «железом» компьютера и между вами и компьютером никто не стоит (имеется в виду автор компилятора с языка высокого уровня), как бы ни был высок его профессиональный уровень.
Итак, если Вы хотите до конца понять, как работает ваш компьютер и использовать возможности компьютера на 100 %, создавать интерфейсы с внешними устройствами, перехватчики, перекодировщики, надёжно защищать свои программные продукты и иметь потенциальную возможность взламывать чужие и многое другое, – Ассемблер для Вас.