Интерпретатор сообщает о найденных
им ошибках после трансляции каждой строки
программы. Компилятор транслирует программу
намного быстрее, чем интерпретатор, но
сообщает о найденных им ошибках после
завершения компиляции всей программы.
Найти и исправить ошибки в этом случае
труднее. Интерпретаторы рассчитаны на
языки, предназначенные для обучения программированию,
и используются начинающими программистами.
Большинство современных языков предназначены
для разработки сложных пакетов программ
и рассчитаны на компиляцию.
Иногда один и тот же язык может использовать
и компилятор, и интерпретатор. К числу
таких языков относится, например, Бейсик.
Как правило, программы-компиляторы и
интерпретаторы называются так же, как
и языки, для перевода с которых они предназначены.
Слова Паскаль, Ада, Си могут относиться
как к названиям языков, так и к названиям
соответствующих программ.
Недостаток компилятора - трудоёмкость трансляции языков программирования,
ориентированных на обработку данных
сложных структур, часто заранее неизвестной
или динамически меняющейся во время работы
программы.
С помощью интерпретатора, наоборот,
допустимо в любой момент остановить программу,
исследовать содержимое памяти, организовать
диалог с пользователем, выполнить сколь
угодно сложные преобразования и при этом
постоянно контролировать состояние окружающей
программно - аппаратной среды, благодаря
чему достигается высокая надёжность
работы.
Недостатком интерпретаторов является то, что они тихоходны. Ими затрачивается
слишком много времени на разгадывание
того, что делать, вместо того чтобы заниматься
действительно делом. При исполнении программных
операторов, интерпретатор должен сначала
сканировать каждый оператор с целью прочтения
его содержимого (что этот человек просит
меня сделать?), а затем выполнить запрошенную
операцию. Операторы в циклах сканируются
излишне много. В реальных системах программирования
перемешаны технологии и компиляции и
интерпретации.
Причиной вновь вспыхнувшего интереса
к компиляторам стало появление быстрых
и сложных 64-разрядных микропроцессоров,
типичным представителем которых можно
считать Intel Itanium. Ответственность за увеличение
производительности, на которое потенциально
способны будущие 64-разрядные процессоры,
ложится на компиляторы нового поколения.
Корпорация подает новый язык как логическое
продолжение Си и C++ для Web-приложений.
Ключевыми модулями станут Common Language Runtime
для C# и специальный компилятор, который
преобразует текст, написанный на традиционных
языках Кобол, Perl, Фортран или других, в
промежуточный язык, который будет работать
на новой платформе Microsoft .Net. Может появиться
новое поколение компиляторов, позволяющих
увеличить производительность до уровня,
позволяющего убедить профессионалов
в необходимости использовать 64-разрядные
аппаратные архитектуры. (См. приложение№1).
Глава 4. «Классификация языков
программирования»
Машинно-ориентированные языки
Машинно-ориентированные
языки - это языки, наборы операторов
и изобразительные средства которых существенно
зависят от особенностей ЭВМ (внутреннего
языка, структуры памяти и т.д.). Машинно-ориентированные
языки позволяют использовать все возможности
и особенности Машинно - зависимых языков:
высокое качество создаваемых программ
(компактность и скорость выполнения);
возможность использования конкретных
аппаратных ресурсов; предсказуемость
объектного кода и заказов памяти; для
составления эффективных программ необходимо
знать систему команд и особенности функционирования
данной ЭВМ; трудоемкость процесса составления
программ ( особенно на машинных языках
и ЯСК), плохо защищенного от появления
ошибок; низкая скорость программирования;
невозможность непосредственного использования
программ, составленных на этих языках,
на ЭВМ других типов.
Машинно-ориентированные языки по степени
автоматического программирования подразделяются
на классы.
Машинный язык. Отдельный компьютер имеет
свой определенный Машинный язык (далее
МЯ), ему предписывают выполнение указываемых
операций над определяемыми ими операндами,
поэтому МЯ является командным. Однако,
некоторые семейства ЭВМ (например, ЕС
ЭВМ, IBM/370/ и др.) имеют единый МЯ для ЭВМ
разной мощности. В команде любого из них
сообщается информация о местонахождении
операндов и типе выполняемой операции.
В новых модулях ЭВМ намечается тенденция
к повышению внутренних языков машинно-аппаратным
путем реализовывать более сложные команды,
приближающиеся по своим функциональным
действиям к операторам алгоритмических
языков программирования.
Машинно-независимые
языки - это средство
описания алгоритмов решения задач и информации,
подлежащей обработке. Они удобны в использовании
для широкого круга пользователей и не
требуют от них знания особенностей организации
функционирования ЭВМ и ВС.
Подобные языки получили название высокоуровневых
языков программирования. Программы, составляемые
на таких языках, представляют собой последовательности
операторов, структурированные согласно
правилам рассматривания языка (задачи,
сегменты, блоки и т.д.). Операторы языка
описывают действия, которые должна выполнять
система после трансляции программы на
МЯ. То есть, командные последовательности
(процедуры, подпрограммы), часто используемые
в машинных программах, представлены в
высокоуровневых языках отдельными операторами.
Программист получил возможность не расписывать
в деталях вычислительный процесс на уровне
машинных команд, а сосредоточиться на
основных особенностях алгоритма.
Проблемно - ориентированные
языки. С расширением областей применения
вычислительной техники возникла необходимость
формализовать представление постановки
и решение новых классов задач. Необходимо
было создать такие языки программирования,
которые, используя в данной области обозначения
и терминологию, позволили бы описывать
требуемые алгоритмы решения для поставленных
задач, ими стали проблемно - ориентированные
языки. Эти языки - языки ориентированные
на решение определенных проблем, должны
обеспечить программиста средствами,
позволяющими коротко и четко формулировать
задачу и получать результаты в требуемой
форме.
Диалоговые языки. Появление новых технических
возможностей поставило задачу перед
системными программистами - создать программные
средства, обеспечивающие оперативное
взаимодействие человека с ЭВМ их назвали
диалоговыми языками. Эти работы велись
в двух направлениях. Создавались специальные
управляющие языки для обеспечения оперативного
воздействия на прохождение задач, которые
составлялись на любых раннее неразработанных
(не диалоговых) языках. Разрабатывались
также языки, которые кроме целей управления
обеспечивали бы описание алгоритмов
решения задач.
Непроцедурные языки. Непроцедурные языки составляют группу
языков, описывающих организацию данных,
обрабатываемых по фиксированным алгоритмам
(табличные языки и генераторы отчетов),
и языков связи с операционными системами.
Позволяя четко описывать как задачу,
так и необходимые для её решения действия,
таблицы решений дают возможность в наглядной
форме определить, какие условия должны
быть выполнены, прежде чем переходить
к какому-либо действию. Одна таблица решений,
описывающая некоторую ситуацию, содержит
все возможные блок-схемы реализаций алгоритмов
решения.
Глава 5 "Стандартизация
языков программирования"
Язык программирования может быть представлен
в виде набора спецификаций, определяющих
его синтаксис и семантику. Для многих
широко распространённых языков программирования
созданы международные стандарты. Специальные
организации проводят регулярное обновление
и публикацию спецификаций и формальных
определений соответствующего языка.
В рамках таких комитетов продолжается
разработка и модернизация языков программирования
и решаются вопросы о расширении или поддержке
уже существующих и новых языковых конструкций.
Типы данных
Современные цифровые компьютеры обычно
являются двоичными, данные хранят в двоичном
(бинарном) коде (хотя возможны реализации
и в других системах счисления). Эти данные,
как правило, отражают информацию из реального
мира (имена, банковские счета, измерения
и др.), представляющую высокоуровневые
концепции. Особая
система, по которой данные организуются
в программе, -- это система типов языка
программирования; разработка и изучение
систем типов известна под названием теория
типов. Языки могут быть классифицированы
как системы со статической типизацией
и языки с динамической типизацией. Статически-типизированные
языки могут быть в дальнейшем подразделены
на языки с обязательной декларацией,
где каждая переменная и объявление функции
имеет обязательное объявление типа, и
языки с выводимыми типами.
Иногда динамически-типизированные языки
называются латентной типизацией.
Структуры данных.
Системы типов в языках высокого уровня
позволяют определять сложные, составные
типы, так называемые структуры данных.
Как правило, структурные типы данных
образуются как декартово произведение
базовых (атомарных) типов и ранее определённых
составных типов. Основные структуры данных
(списки, очереди, хеш-таблицы, двоичные
деревья и пары) часто представлены особыми
синтаксическими конструкциями в языках
высокого уровня. Такие данные структурируются
автоматически.
Семантика языков программирования
Существует несколько подходов к определению
семантики языков программирования. Наиболее
широко распространены разновидности
следующих трёх: операционного, денотационного
(математического) и деривационного (аксиоматического).
При описании семантики в рамках операционного
подхода обычно исполнение конструкций
языка программирования интерпретируется
с помощью некоторой воображаемой (абстрактной)
ЭВМ.
Деривационная семантика описывает последствия
выполнения конструкций языка с помощью
языка логики и задания пред- и постусловий.
Денотационная семантика оперирует понятиями,
типичными для математики -- множества,
соответствия, а также суждения, утверждения
и др.
Используемые символы
Современные языки программирования
рассчитаны на использование ASCII, то есть
доступность всех графических
символов ASCII является необходимым и достаточным
условием для записи любых конструкций
языка. Управляющие
символы ASCII используются ограниченно:
допускаются только возврат каретки CR,
перевод строки LF и горизонтальная табуляция
HT (иногда также вертикальная табуляция
VT и переход к следующей странице FF). Ранние
языки, возникшие в эпоху 6-битных символов,
использовали более ограниченный набор.
Например, алфавит Фортрана включает 49
символов (включая пробел): A B C D E F G H I J
K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / () . ,
$ ' : .
Заметным исключением является язык
APL, в котором используется очень много
специальных символов. Использование
символов за пределами ASCII (например, символов
KOI8-R или символов Юникода) зависит от реализации:
иногда они разрешаются только в комментариях
и символьных/строковых константах, а
иногда и в идентификаторах. В CCCP существовали
языки, где все ключевые слова писались
русскими буквами, но большую популярность
подобные языки не завоевали (исключение
составляет Встроенный язык программирования
1С:Предприятие).
Расширение набора используемых символов
сдерживается тем, что многие проекты
по разработке программного обеспечения
являются международными. Очень сложно
было бы работать с кодом, где имена одних
переменных записаны русскими буквами,
других - арабскими, а третьих -китайскими
иероглифами. Вместе с тем, для работы
с текстовыми данными языки программирования
нового поколения (Delphi 2006, C#, Java) поддерживают
Unicode.
Глава 6. «Развитие систем и
языков программирования»
Ассемблер
Язык Ассемблера -
это символическое представление машинного
языка. Язык Ассемблера - язык программирования низкого
уровня, мнемонические команды которого (за
редким исключением) соответствуют инструкциям процессора вычислительной системы. Трансляция
программы в исполняемый машинный код производится ассемблером (от англ. assembler - сборщик) - программой-транслятором,
которая и дала языку ассемблера его название.
Язык Ассемблера облегчает процесс программирования
по сравнению с программированием в машинных
кодах. Программисту не обязательно употреблять
настоящие адреса ячеек памяти с размещенными
в них данными, участвующими в операции,
и вычисляемые результаты, а также адреса
тех команд, к которым программа не обращается.
Некоторые задачи, например, обмен с нестандартными
устройствами обработки данных сложных
структур невозможно решить с помощью
языков программирования высокого уровня.
Это под силу ассемблеру.
В принципе, язык Ассемблер является
машинным языком. И программист реализующий
какую-либо задачу на языках высокого
уровня, с помощью Ассемблера может определить
осмыслено ли решение данной задачи, с
точки зрения использования ЭВМ. Умение
разобраться в распечатке языка ассемблера,
дает возможность облегчить поиск ошибок
в программах, т.к. некоторые языки являются
компиляторами.
Turbo Assembler передаёт аргументы в процедуры
на языках высокого уровня в кадре стека,
помещая аргументы перед вызовом процедуры
в стек. Процедуры, написанные на языках
высокого уровня, считывают аргументы
из стека по мере необходимости. При выходе
процедура может удалять аргументы из
стека или оставлять эту операцию для
вызывающей процедуры. Традиционным способом,
с помощью которого объединяются программы,
написанные на С++ и ассемблере, является
разделительная компиляция с последующей
компоновкой в один исполняемый файл.
При этом можно использовать компилятор
Borland C++, который вызывает Turbo Assembler для
трансляции ассемблерной программы.
Ассемблер предоставляет программисту
полную свободу действий при разработке
программы, что одновременно является
и его достоинством, и недостатком, так
как требует от разработчика знания системы
команд данного компьютера и его операционной
системы. Кроме того, несмотря на минимальный
размер выполняемого файла при максимальной
скорости работы, время, необходимое для
создания программы, резко возрастает
с увеличением объёма разрабатываемого
проекта. Поэтому ассемблер был и остаётся
языком программирования для профессионалов.
В тоже время программисты, работающие
на языках высокого уровня, столкнувшись
с ограничениями, которые неизбежны при
использовании этих языков, не должны
полностью переписывать свои программы
на ассемблере. Чаще всего бывает достаточно
перевода нескольких фрагментов кода,
критичных по времени выполнения, чтобы
все проблемы исчезли. Кроме того существует
много библиотек, которые написаны на
языках высокого уровня, но с успехом могут
применяться и в ассемблерных программах.
Лисп
Лисп (LISP, от англ. LISt Processing language —
«язык обработки списков»; современное
написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Второй старейший язык программирования
Лисп (List Information Symbol Processing), Дж. Маккарти
в 1962 г. скорее для работы со строками символов,
нежели для работы с числами. Это особое
предназначение Лиспа открыло для программистов
новую область деятельности, известную
ныне, как «искусственный интеллект».
В настоящее время Лисп успешно применяется
в экспертных системах, системах аналитических
вычислений и т.п.