Среды и реализации языков программирования
Среда программирования - это совокупность инструментов, используемых при разработке программного обеспечения. Этот набор обычно состоит из файловой системы, текстового редактора, редактора связей и компилятора. Дополнительно он может включать большое количество инструментальных комплексов с единообразным интерфейсом пользователя.
Старейшей средой программирования считается UNIX - машинно-независимая операционная система с разделением времени. Она предоставляет многочисленные мощные инструментальные средства для производства ПО и эксплуатации разнообразных языков. Работа с этой средой осуществляется с помощью графического интерфейса, устанавливаемого поверх нее. Во многих случаях этим интерфейсом является Common Desktop Environment (CDE).
Последнюю стадию развития сред разработки ПО представляют Microsoft Visual C++, Visual BASIC, Delphi и Java Development Kit, которые предлагают легкий способ создания графических интерфейсов для программ пользователя.
Ключевой вопрос реализации языка программирования заключается в том, какое представление имеет программа во время ее выполнения на реальном компьютере, является ли этот язык машинным языком данного компьютера или нет? В зависимости от ответа на этот вопрос языки (вернее, их реализации) делятся на компилируемые и интерпретируемые.
Компилируемые языки. Компилируемыми принято считать такие языки как С, C++, FORTRAN, Pascal и Ada. Это означает, что программы, написанные на этих языках, транслируются в машинный код данного компьютера перед началом выполнения. Программная интерпретация при этом ограничивается только интерпретацией набора программ поддержки выполнения, которые моделируют элементарные операции исходного языка, не имеющие близкого аналога в машинном языке.
Транслятор компилируемого языка является большой и сложной программой, и при трансляции основное значение имеет создание максимально эффективных (с точки зрения их выполнения) исполняемых программ.
Интерпретируемые языки. Реализуются с использованием программного интерпретатора. К таковым относятся языки LISP, ML, Perl, Postscript, Prolog и Smalltalk. При такой реализации транслятор выдает не машинный код используемого компьютера, а некую промежуточную форму программы. Эта форма легче для выполнения, чем исходная программа, но все же она отличается от машинного кода.
Использование необходимого для этого программного интерпретатора приводит к относительно медленному выполнению программы. Основная сложность здесь реализуется в программном обеспечении процесса интерпретации, поэтому трансляторы интерпретируемых языков обычно представляют собой довольно простые программы.
Развитие Всемирной паутины WWW и появление языка Java внесли изменения в описанную схему. Язык Java похож скорее на Pascal и C++, чем на LISP, но в большинстве случаев реализуется как интерпретируемый язык. Компилятор Java вырабатывает промежуточный набор байт-кодов для виртуальной машины Java. Передача байт-кодов на локальный компьютер (даже если он медленнее, чем web-сервер) выгоднее в отношении временных затрат, чем передача результатов выполнения программы на web-сервере. Однако web-сервер не в состоянии предугадать машинную архитектуру хост-компьютера. Поэтому браузер создает виртуальную машину Java, которая и выполняет стандартный набор байт-кодов Java.
СТРУКТУРЫ УПРАВЛЕНИЯ И ПОДПРОГРАММЫ
ТЕОРИЯ ПЕРВИЧНЫХ ПРОГРАММ
Теория первичных программ была предложена Маддуксом в качестве обобщения методологии структурного программирования для определения однозначной иерархической декомпозиции блок-схем. В этой теории предполагается, что графы программ могут содержать три класса узлов (рис. 2):
функциональные узлы — представляют вычисления, производимые программой, и изображаются прямоугольниками с одной входящей в этот узел дугой и одной выходящей. Функциональные узлы представляют операторы присваивания, выполнение которых вызывает изменение состояния виртуальной машины;
узлы принятия решения - изображаются в виде ромбов с одной входящей дутой и двумя выходящими (истина и ложь). Эти узлы представляют предикаты, и управление из узла принятия решения передается дальше либо по ветви истина, либо по ветви ложь;
узел соединения — представляется в виде точки, в которой сходятся две дуги графа, чтобы сформировать одну выходную дугу.
Любая блок-схема состоит только из этих трех компонентов.
Правильная программа — блок-схема, являющаяся некоторой формальной моделью структуры управления, которая имеет: одну входящую дугу; одну выходящую дугу; путь от входящей дуги к любому узлу и из любого узла - к выходящей дуге.
Первичная программа является правильной программой, которую нельзя разделить на более мелкие правильные программы. Исключением из этого правила является последовательность функциональных узлов, которая считается одной первичной программой.
На рис. 3 изображены все первичные программы, которые включают в себя не более четырех узлов. Первичные программы а, б, д, и представляют собой последовательности функциональных узлов. Первичная программа е — конструкция if-then, .ж — do-while, з - repeat-until, к - if-then-else, л - do-while-do.
Первичные программы в, г, м-т состоят только из узлов принятия решения и соединения. В них нет функциональных узлов, поэтому они не изменяют пространство состояний виртуальной машины. Ни один из этих вариантов первичных программ не представляет эффективной структуры управления в программе.
Многие из описанных выше наборов управляющих структур были включены в существующие языки программирования. Эти структуры представляют собой первичные программы с небольшим количеством узлов и просты для понимания.
Перечислив все первичные программы, можно сделать очевидный вывод, что конструкция do-while-do является естественной структурой управления, хотя она была проигнорирована разработчиками языков.
АЛЬТЕРНАТИВЫ
Операторы выбора используются для выбора одного из нескольких возможных путей, по которому должно выполняться вычисление. Обобщенный оператор выбора называется case-оператором (switch-оператор в языке С).
Условный оператор является частным случаем case- или switch-оператора, в котором выражение имеет булев тип. Так как булевы типы имеют только два допустимых значения, условный оператор делает выбор между двумя возможными путями. Конструкция для двух альтернатив на Паскале имеет следующий вид:
if L
then begin
{Действие при L-True} end; else begin
{Действие при L=False} end; здесь L-логическое выражение.
Вариант конструкции для нескольких альтернатив имеет вид:
Switch : = 0;
L1 : = . . .
L2 : = . . .
L3 : = . . .
if L1 then Swich : = 1;
if L2 then Swich : = 2;
if L3 then Swich : = 3;
case Swich of 1: begin
{Действие при L1=True} end; 2 : begin
{Действие при L2=True} end; 3:begin
{Действие при L3=Тrие} end; else begin
{Вывод сообщения об ошибочном кодировании модуля} end; end; {End of Case}
2.3. ЦИКЛЫ
Оператор цикла имеет одну точку входа, последовательность операторов, которые составляют цикл, и одну или несколько точек выхода. Чтобы циклы завершались, с точкой выхода бывает связано условие, которое определяет, следует сделать выход или продолжить выполнение цикла. Циклы различаются числом, типом и расположением условий выхода. Универсальные циклы в Паскале имеют следующие конструкции.