Связывание программ на разных языках.
На практике в некоторых случаях на языке ассемблера кодируют только фрагменты программ, тогда как остальная часть программы разрабатывается на том или ином языке высокого уровня. В таком случае фрагменты, написанные на языке ассемблера, необходимо связывать с остальными частями программной системы. Это достигается двумя основными способами:
-
На этапе компиляции — вставка в исходный код программы на языке высо-кого уровня ассемблерных фрагментов (англ. inline assembler) с помощью специальных директив высокоуровнего языка. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода с данными и подпрограммами, включая подпрограммы со множеством входов и выходов, не поддерживаемых языком высокого уровня, с его помощью сделать невозможно.
-
На этапе компоновки при раздельной компиляции. Для взаимодействия ком-понуемых модулей достаточно, чтобы импортируемые функции (опреде-лённые в одних модулях и используемые в других) поддерживали определённое соглашение о вызове (англ. calling conventions). Написаны отдельные модули могут быть на любых языках, в том числе и на языке ассемблера.
Достоинства и недостатки языка ассемблера.
Использование языка ассемблера предоставляет программисту ряд возможностей, как правило, недоступных при программировании на языках высокого уровня. Большинство из них связано с близостью языка к аппаратной платформе.
-
Возможность максимально полного использования всех особенностей аппаратной платформы позволяет, теоретически, писать самый быстрый и компактный код из всех возможных для данного процессора. Искусный программист, как правило, способен значительно оптимизировать программу по сравнению с транслятором с языка высокого уровня по одному или нескольким параметрам и создать код, близкий к оптимальному по Парето (когда дальнейшее быстродействие программы может быть достигнуто только за счёт удлинения кода и наоборот):
-
За счёт более рационального использования ресурсов процессора. Например, максимально эффективного размещения всех или часто используемых исходных данных во внутренних регистрах процессора, можно исключить излишние обращения к внешней оперативной памяти.
-
За счёт интеллектуальной оптимизации вычислений, в том числе более эффективного использования промежуточных результатов, может быть сокращён объём кода и повышена скорость программы.
-
Возможность непосредственного доступа к аппаратуре, и, в частности, портам ввода-вывода, конкретным адресам памяти, регистрам процессора (во многих операционных системах данная возможность существенно ограничивается тем, что прямое обращение из прикладных программ для записи в регистры периферийного оборудования блокировано для повышения надёжности работы системы).
Вместе с тем, язык ассемблера имеет и недостатки, так или иначе ограничивающие его применение или делающие таковое менее выгодным.
-
В силу машинной ориентации («низкого уровня») языка ассемблера человеку сложнее читать и понимать программу, написанную на языке ассемблера, по сравнению с языками программирования высокого уровня. Это затрудняет сопровождение программ, написанных на языке ассемблера.
-
Программа на языке ассемблера состоит из очень «мелких» элементов — машинных команд, соответственно, объём текста программы по количеству команд оказывается больше. Поэтому разработка больших программ на языке ассемблера выполняется медленнее.
-
Растёт вероятность внесения ошибок при разработке и модификации кода, усложняется его отладка.
-
Как правило, программисту доступно меньшее количество библиотек по сравнению с современными развитыми и популярными языками программи-рования.
-
Требуется повышенная квалификация программиста для получения качест-венного кода: эффективность кода, написанного начинающим програм-мистом на языке ассемблера, обычно оказывается не лучше или даже хуже эффективности кода, порождаемого оптимизирующим компилятором для сравнимых программ, написанных на языке высокого уровня[8]. При этом чем больше объём программы, тем меньше выигрыш от использования языка ассемблера.
-
Программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы, программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода[10][11].
-
Отсутствует возможность прямой простой переносимости программ на языке ассемблера на компьютеры с другой архитектурой и системой команд.
Применение языка ассемблера
В настоящее время в индустрии информационных технологий в основном используются языки программирования высокого уровня. Однако языки ассемблера продолжают применяться, что обусловлено их уникальными преимуществами в части эффективности и возможности полного использования специфических средств конкретной платформы.
На языке ассемблера пишут программы или их фрагменты в тех случаях, когда критически важны:
-
быстродействие (это драйверы устройств, компьютерные игры);
-
объём используемой памяти (загрузочные секторы, встроенное программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).
С использованием программирования на языке ассемблера производятся:
-
Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих ограниченную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресур-соёмкими и более быстрыми.
-
Создание операционных систем (ОС) или их некоторых компонентов.
-
В настоящее время подавляющее большинство ОС пишут на более высо-коуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абс-трагирования от аппаратного обеспечения (hardware abstraction layer) и ядро операционной системы, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует. Некоторые любительские ОС, например, такие как MenuetOS и KolibriOS, целиком написаны на языке ассемблера. При этом MenuetOS и KolibriOS помещаются на дискету и содержат графический многооконный интерфейс.
-
Программирование микроконтроллеров (МК) и других встраиваемых в обо-рудование управляющих процессоров. В 2013 году для программирования МК язык ассемблера применялся весьма часто, хотя для этого более широкое распространение получают языки вроде Си. Типичная задача программы в МК — перемещение отдельных байтов и битов между различными ячейками памяти и логические операции с ними. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и жилище современного цивилизованного человека в среднем содержится 50 микроконтроллеров.
-
Создание драйверов устройств. В связи с повышенными требованиями к надёжности и быстродействию драйверы или некоторые их программные модули обычно программируют на языке ассемблера. Надёжность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра системы, поэтому одна тонкая ошибка в критичном для работы системы драйвере может привести к краху всей системы. Тем не менее, в настоящее время в связи с достаточной производительностью современных процессоров и совершенством компиля-торов с языков высокого уровня некоторые драйверы также стремятся писать на языках высокого уровня.
-
Создание антивирусов и других защитных программ.
-
Написание кода низкоуровневых библиотек трансляторов языков програм-мирования.
-
Написание компьютерных вирусов.
Использование языка ассемблера практически не имеет альтернативы при создании:
-
драйверов оборудования и ядра операционной системы (по крайней мере, машинозависимых подсистем ядра ОС) — когда принципиально необходимо временно́е согласование работы периферийных устройств с центральным процессором;
-
программ, которые должны храниться в ПЗУ ограниченного объёма и/или выполняться на устройствах с ограниченной производительностью («про-шивок» компьютеров и различных электронных устройств);
-
платформенно - зависимых компонентов компиляторов и интерпретато-ров языков высокого уровня, системных библиотек и кода, реализующего совместимость платформ[1,5,9].
Ещё одной сферой применения является обратное реконструирование прог-рамм. С помощью программы-дизассемблера возможно преобразование от-компилированной программы в программу на языке ассемблера, которая за-тем может быть подвергнута изучению, изменению и повторной компиляции. В большинстве случаев это единственный (хотя и крайне трудоёмкий) способ обратного реконструирования алгоритмов программы, если не доступен её исходный код на языке высокого уровня.
Do'stlaringiz bilan baham: |