План Язык программирования Ассемблер и его возможности


Связывание программ на разных языках


Download 95.62 Kb.
bet4/12
Sana17.06.2023
Hajmi95.62 Kb.
#1549318
TuriЛекция
1   2   3   4   5   6   7   8   9   ...   12
Bog'liq
Лекция №17b

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

  • На этапе компиляции — вставка в исходный код программы на языке высо-кого уровня ассемблерных фрагментов (англ. 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].

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


Download 95.62 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   12




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling