От машинного кода до API систем

Автор: | 29.01.2018

Машинный код
Трансляция программ
Повторное использование кода
Объектная структуризация
Структуризация программных систем

Машинный код

Компьютер – это электронное устройство, которое обрабатывает информацию, представленную в виде двоичных сигналов. Сначала это был аппарат для выполнения арифметических операций.

Прыжком в развитии компьютера послужила идея программного способа реализации задач. Суть этой идеи можно проследить на примере реализации задачи Y=N * X с помощью только одного сумматора.

Для выполнения этой задачи дополнительно к сумматору нужны такие устройства:

  • память для сохранения промежуточных результатов (данных);
  • память для сохранения последовательности операций (программы);
  • устройство управления для перевода двоичных кодов в управляющие сигналы;
  • регистры для сохранения чисел, которые непосредственно участвуют в операции;
  • регистр состояния, который изменяет содержимое с 0 на 1 – в зависимости от полученного результата (= 0 или 1) и тем самым влияет на порядок выполнения команд.

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

Довольно скоро стало понятно, что процесс формирования машинного кода можно автоматизировать. Уже в 1950 году для записи программ начали применять мнемонический язык – язык assembly. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова, которые отражали суть команды. Например, на языке ассемблера команда сложения двух чисел обозначается словом add, тогда как ее машинный код может быть таким: 000010.

Ассемблер – язык программирования низкого уровня, который ориентирован на конкретный тип процессора и учитывает его особенности.

Трансляция программ

Появились программы (трансляторы Алгол, Бейсик, Фортран и др.), предназначенные для перевода программ, записанных с использованием языка высокого уровня, на машинный язык.

Языки стали машинно-независимыми, однако не настолько, чтобы общаться с машиной в терминах абстрактных понятий. Пока машины просто выполняли предписанные им инструкции по традиционным схемам выполнения алгоритма:

 

Повторное использование кода

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

Библиотечный модуль – это автономно компилируемая программная единица, включающая процедуры и функции, а также все атрибуты к ним (описание переменных и т.п.). Объектный код программы, полученный в результате отдельного процесса трансляции, чаще всего представляет лишь некоторую составную часть программы, которая должна быть связана с другими ее частями для решения задач, стоящих перед всей системой в целом. Даже, если вся программа разработана и оттранслирована в виде единственного модуля, ее объектный код все же еще не готов для выполнения машиной, поскольку любой программе, как правило, требуются функции, выполняемые другими программами или же операционной системой. Поэтому объектный код программы в действительности представляет собой программу на машинном языке, содержащую ссылки на другие программы; эту программу необходимо связать с другими программами, прежде чем получить полноценный выполняемый модуль. Связывание объектного модуля с другими модулями выполняет программа, называемая редактором связей.

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

Со временем появились так называемые динамические компонуемые библиотеки – DLL (dynamic link libraries). Одно из основных назначений библиотек DLL — позволить приложениям загружать код, который обрабатывается во время выполнения, вместо того, чтобы компоновать его в само приложение во время компиляции. При этом один и тот же модуль может одновременно использоваться несколькими приложениями.

Другое преимущество использования DLL состоит в том, что ваше приложение становится модульным. Это упрощает процесс обновления приложений, поскольку при необходимости обновляется не все приложение полностью, а только определенные библиотеки. Типичным примером может служить среда Windows. При каждой установке нового устройства приходится устанавливать и новую библиотеку DLL с программой-драйвером. Преимущество DLL станет очевидным, если представить необходимость повторной инсталляции Windows при каждой установке нового устройства в систему.

Структуризация программных систем

Любая сложная система должна иметь понятную и рациональную структуру, т.е. разделяться на части – модули, имеющие вполне законченное функциональное назначение с четко оговоренными правилами взаимодействия. Ясное понимание каждого отдельного модуля существенно упрощает работу по модификации и развитию системы. И, напротив, сложную систему без хорошей структуры чаще проще разработать заново, чем модернизировать.

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

Наиболее общим подходом к структуризации программных систем является разделение всех её модулей на три основные группы:

  • ядро – модули, выполняющие основные функции системы (загрузка / выгрузка файлов, переключение модулей программ и др);
  • приложения пользователей, обеспечивающие непосредственное выполнение задач пользователей;
  • Интерфейс (API), обеспечивающий взаимодействие ядра и приложений пользователя.

API (Application Programming Interface) – это интерфейс программирования, интерфейс создания приложений. Если говорить более понятным языком, то API – это готовый код для упрощения жизни программисту.

 

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *