Первый этап развития программного обеспечения (ПО)

На первом этапе основные затраты были связаны с кодированием программ, реализующих хорошо известные алгоритмы вычислений. Это привело к разработке средств автоматизации кодирования — автокодов (название языков и трансляторов) — и уменьшило затраты примерно на порядок за счет автоматизации рутинных операций, устранения или своевременного обнаружения связанных с кодированием ошибок. Принятый в настоящее время термин «ассемблер» представляется менее удачным, чем «автокод», так как не раскрывает отличительные черты данного класса инструментальных средств. Текст на ассемблере, например команда «MET CLC А, В», определяет не алгоритмическое действие а заполнение некоторой области памяти ЭВМ (в данном случае 6 байт). От намерений программиста зависит как будет использоваться эта область — в качестве машинной команды или данных.

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

Хотя лаконичность традиционно считается положительной чертой языка, объем программы на языке Ассемблер обычно на порядок больше, чем в машинном коде. И это не недостаток. Например, двухбайтовая машинная команда может кодироваться следующим образом:

ENDLOOP BCTR RCOUNT, RBEG КОНЕЦ ОСНОВНОГО ЦИКЛА

Ценность комментариев и мнемонических обозначений не требует обоснования, но что говорит русскоязычному программисту, например, мнемоника BCTR? Оказывается разумная избыточность полезна и без мнемоничности. Важно, чтобы случайная описка или ошибка перфорации могла быть обнаружена транслятором. С этой точки зрения вряд ли оправдано использование идентификаторов вида M1, M2, МЗ, ... .

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