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


а) Машинно–ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.). Машинно–ориентированные языки позволяют использовать все возможности и особенности Машинно–зависимых языков:
  • · высокое качество создаваемых программ (компактность и скорость выполнения);
  • · возможность использования конкретных аппаратных ресурсов;
  • · предсказуемость объектного кода и заказов памяти;
  • · для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;
  • · трудоемкость процесса составления программ (особенно на машинных языках и ЯСК), плохо защищенного от появления ошибок;
  • · низкая скорость программирования;
невозможность непосредственного использования программ, составленных на этих языках, на ЭВМ других типов. Машинный язык Отдельный компьютер имеет свой определенный Машинный язык (далее МЯ), ему предписывают выполнение указываемых операций над определяемыми ими операндами, поэтому МЯ является командным. Языки Символического Кодирования являются командными. Однако коды операций и адреса в машинных командах, представляющие собой последовательность двоичных (во внутреннем коде) или восьмеричных (часто используемых при написании программ) цифр, в ЯСК заменены на символы (идентификаторы). Автокоды Есть также языки, включающие в себя все возможности ЯСК, посредством расширенного введения макрокоманд - они называются Автокоды. В системе с генерацией имеются специальные программы, анализирующие макрокоманду, которые определяют, какую функцию необходимо выполнить и формируют необходимую последовательность команд, реализующих данную функцию Развитые автокоды получили название Ассемблеры. Сервисные программы и пр., как правило, составлены на языках типа Ассемблер. Язык Ассемблера – это символическое представление машинного языка. Он облегчает процесс программирования по сравнению с программированием в машинных кодах.

Трансляторы

Любую программу, которая переводит произвольный текст на некотором входном языке в текст на другом языке, называют транслятором. В частности, исходным текстом может быть входная программа. Транслятор переводит её в выходную или объектную программу. По уровню входного языка трансляторы принято делить на ассемблеры, макроассемблеры, компиляторы, генераторы. Входным языком ассемблера является мнемокод, макроассемблера - макроязык, компилятора - процедурно-ориентированный язык, а генератора - проблемно – ориентированный язык. В связи с этим входной язык называют по типу транслятора: язык ассемблера, язык макроассемблера и т.д. Программа, полученная после обработки транслятором, либо непосредственно исполняется на ЭВМ, либо подвергается обработке другим транслятором. Компиляторы и интерпретаторы Языки программирования высокого уровня отличаются от ассемблеров и используют более строгий контроль типов. Термин “высокоуровневый” означает следующее: многие детали обрабатываются автоматически, а программисту для создания своего приложения приходится писать меньшее количество строк. В частности: Распределением регистров занимается компилятор, так что программисту не надо писать код, обеспечивающий перемещение данных между регистрами и памятью; Последовательности вызова процедур генерируются автоматически; программисту нет необходимости описывать помещение аргументов функции в стек и их извлечение оттуда; Для описания структур управления программист может использовать также ключевые слова, как if, while, for; последовательности машинных команд, соответствующие этим описаниям компилятор генерирует динамически. Типизация. Современные компьютеры устроены таким образом, что им не известно понятие типа. Каждое слово памяти может содержать значение любого типа; целое число, число с плавающей запятой, указатель или машинную команду. Интерпретация значения определяется способом его использования. Если указатель следующей машинной команды указывает в процессе исполнения команды на некоторое слово в памяти, то оно и рассматривается как команда; если адрес слова задан в параметрах команды целочисленного сложения, то его значение и обрабатывается как целое число; и т. д. Одно и то же слово памяти может использоваться в различных случаях разными способами. В противоположность этому для современных языков программирования характерна строгая типизация. Для языков описания сценариев (интерпретаторы) характерно отсутствие типизации, которая только усложнила бы задачу соединения компонентов. Все элементы в них выглядят и функционируют одинаково и являются полностью взаимозаменяемыми. Например, в Tcl или Visual Basic переменная может содержать в одной точке программы строку, а в другой – целое число. Код и данные также часто бывают взаимозаменяемы. Например, Tcl, Visual Basic переменная может содержать в одной точке программы строку, а в другой - целое число. Обычно процессы трансляции и исполнения программы разделены во времени. Сначала вся программа транслируется, а потом исполняется. Трансляторы, работающие в таком режиме, называют трансляторами компилирующего типа. Если входным языком такого транслятора является процедурно-ориентированный язык высокого уровня, то транслятор называют компилятором. Компилятор – транслятор с языков высокого уровня на машинный язык (объектный код). Увеличивается скорость программирования, переносимость и совместимость программ, удобство отладки. Существуют трансляторы, в которых трансляция и исполнение совмещены во времени, их называют интерпретаторами. В состав интерпретатора входит блок анализа, распознающий операторы входного языка, набор подпрограмм, соответствующих различным операторам, и блок, управляющий всей работой интерпретатора. Интерпретаторы часто применяются в качестве отладочных и диалоговых трансляторов, обеспечивающих работу пользователя с машиной в диалоговом режиме с дистанционного терминала. Недостаток интерпретатора заключается в неэффективном использовании машинного времени. Например, при выполнении циклических программ, один и тот же оператор приходится интерпретировать многократно. Преимущество интерпретаторной реализации состоит в том, что она допускает "непосредственный режим" (перевод непосредственно во время исполнения программы (BASIC, FOXPRO)). Непосредственный режим позволяет  задавать компьютеру задачу вроде PRINT 3.14159*3/2.1 и возвращает быстрый ответ. Но неэффективен при использовании циклов. Интерпретаторы широко используются для автоматизации решения типовых задач, например, при администрировании ЭВМ. Пример – интерпретатор команд shell в ОС UNIX. Программу, написанную на языке интерпретатора, часто называют сценарием или скриптом. Командами в таком языке являются запускаемые друг за другом и взаимодействующие между собой программы. Программа command.com  в MS-DOS также является интерпретатором, который исполняет пакетные файлы *.bat. Оптимизирующий компилятор Оптимизирующий компилятор почти всю работу по адаптации кода к архитектуре сделает за вас. Достаточно указать ключ командной строки и проанализировать листинг оптимизации. Степень использования аппаратных возможностей машины без дополнительных усилий велика, но сильно зависит от характера задачи и стиля программирования. Например, при параллельной архитектуре VLIW (ОДКС) процессора, оптимизирующий компилятор создает программу «очень длинных командных слов» из последовательного алгоритма: параллельное выполнение команд, повышение производительности. Правила оптимизации формализованы.