План Язык программирования Ассемблер и его возможности
Связывание программ на разных языках
Download 95.62 Kb.
|
Лекция №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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling