Языки высокого уровня и ассемблеры

Если попросить любого практика-программиста разбить языки на две группы — на языки высокого уровня и ассемблеры, — то любой практик интуитивно выполнит эту работу с легкостью. Попытаемся выделить тот принцип, по которому можно отличать эти две группы.

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

Традиционно языки высокого уровня значительно отличаются от ассемблеров по своим выразительным средствам. Ассемблеры имеют простую структуру «оператор за оператором» с достаточно жесткой структурой каждого оператора. Языки же высокого уровня имеют свободную рекурсивную структуру, с глубоко вложенными условными выражениями, процедурной нотацией и инфиксными арифметическими выражениями. Может показаться, что это и есть искомый принцип. Однако хорошо известен пример языка PL/360, созданного Н. Виртом, который по своим выразительным средствам полностью соответствовал языкам высокого уровня; практика его применения привела всех пользователей к единодушному мнению, что это всего-навсего ассемблер машин архитектуры IBM/360. Значит и выразительные свойства не могут служить искомым принципом.

Хорошо известно, что все ассемблеры ориентированы на соответствующие машины, и наоборот, языки высокого уровня, как уже упоминалось, ориентированы на удобное изложение алгоритмов. Действительно, все языки — и ассемблеры, и языки высокого уровня, — строго говоря, одинаково универсальны с точки зрения возможности реализации алгоритмов. Поэтому ориентация на конкретную машину — это безусловно вопрос эффективности реализации языка на данной машине. Обратимся, например, к известному языку ЛИСП. Этот весьма удобный для определенного класса задач язык общепризнан языком высокого уровня. Так как реализация ЛИСПа очень часто включает значительную долю интерпретации, эффективность его реализации на любых современных традиционных машинах не столь уж велика. В этом смысле нет сомнения в том, что его нельзя признать машинно-ориентированным языком.

Однако в последнее время широкое распространение получили ЛИСП-машины, которые обеспечивают высокую эффективность реализации языка ЛИСП. Если бы машинная ориентация была отличительной чертой ассемблера, то следовало бы до появления ЛИСП-машин считать язык ЛИСП языком высокого уровня, а после появления этих машин «разжаловать» его до уровня простого ассемблера. Нелепость такого положения свидетельствует о неверности исходной посылки. Машинная или проблемная ориентация не могут служить характеристикой уровня языка программирования. Уровень программирования должен характеризовать удобство разработки и отладки на данном языке, но не эффективность его реализации или близость к системе команд какой-либо машины.