Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 13
Текст из файла (страница 13)
Обыкновенное бизнес- приложение таблиц решений является формой языка, основанного на системе правил. В данном случае разрешающие условия для данных обусловливаются наличием пли отсутствием допустимых значений в записях данных. Программирование обычно сводится к построению матрицы (таблицы) возможных условий и заданию соответствующих действий в случае выполнения этого условия (отсюда и название), Методы синтаксического разбора НФБ (оппсываемые в главе 3) и средства синтаксического разбора типа гАСС ( тег Аггог!гег Сошрг1ег Согпрг1ег) относятся к технологиям, основанным на системе правил, в которых формальньш синтаксис программы рассматривается в качестве разрешающего условия.
Объектно-ориентированное программирование. Как будет показано в главе 7, значимость объектно-ориентированной модели поютоянно возрастает. В этой модели строятся сложные объекты данных, а затем для операпий над этими данными описывастся ограниченный набор функций. Сложные объекты создаются как расширения более простых обьектов и наследуют их свойства. Как мы покажем, на самом деле зта модель является попыткой объединить лучшие свойства других моделей. Благодаря возможности строить конкретные объекты данных объектноориентированная программа приобретает эффективность императивного языка. Построение классов функций, которые используют ограниченный набор объектов дагшых, дает нам гибкость и надежность, свойственные аппликативному языку.
Универсальность вычислительной модели При описании конкретных вычислительных моделей мы специальгю старались использовать термин «поддерживать», а не «реагиэовынать». То, как программист 46 Глава 1. Проблемы разработки языка использует язык, зависит только от него самого.
Императивный язык упрощает операторно-ориентированное программирование, управляющее внутренним машинным состоянием компьютера; но, в принципе, можно написать программы, которые будут выполняться последовательно и выполнять те же функции, на языках 1 15Р или Рго!ой. Также на языке С относительно легко написать программу, состоящую только из вызовов функций и поэтому похожую на аппликативную. Об этом необходимо помнить, когда в дальнейшем будут обсуждаться различные возможности и свойства языков. Исторически сложилось так, что императивные языки составили первый широко используемьй класс языков и в настоящее время остаются доминирующими в программировании. Одним из наиболее интересных результатов исследований 70— 80-х гг.
оказался тот факт, что аппликативпая методика обеспечивает эффективные способы верификации программ и доказательства их корректности. Это видно из блок-схем, представленных парис. 1.2. На рис. 1.2, и изображена блок-схема, типичная для программ 60-х гг. В ней нет никакой явной структуры, н кажется, что передача управлсния происходит чуть ли не случайным образом. Сейчас такие программы обычно называют лрограисними-спагетти (с болыпим чцслом нерациональных передач управления назад и вперед), поскольку маршруты управления напоминают г арелку со спагсттп. В таких программах часто бывает трудно понять, каково состояние программы в каждьй момент времени в процессе ее выполнения, Структурированная программа б Программа-спагетти Рис.
1.2. Аппликативные методы в императивных языках На рис. 1.2, 6 приведена более структурированная конструкция. Каждый сегмент данной блок-схемы можно заключить в пунктирный прямоугольник. Каждьгй из четырех прямоугольников паатой схеме имеет одну входную и одну выходную стрелки. Эту программу можно рассматривать как композицию четырех функций, и поведение программы можно определить как функцию, которая получает данное со- 1.3. Роль языков программирования 47 стояние на входе выделенного пунктиром прямоугольника и преобразует его в результ~Рукпцее состояние на выходе пз него.
Однако это всего-навсего форма аппликативной модели, описанной ранее. В дальнейшем, при описании простых программ в разделе 8.33, мы обсудим этот момент подробнее. В основе большинства исследований по проверке программ с использованием формальных доказательств правильности программы лежит применение аппп икати иных методов к императивным программам. Как будет показано в главе 4, некоторые из предикатных и алгебраических методов основаны на аппликативной модели.
Также мы увидим, что объектно-ориентированное программирование является альтернативной возможностью применения аппликативной модели к императивным программам. 1.3.3. Стандартизация языка Что описывает язык программирования? Рассмотрим следующий код, написанный на языке С: 1Пг П НЧ1аа2Ы3, Действительно ли это правильный синтаксис С? Каково значение 1? Как бы вы ответили на эти вопросы?' Как правило, чтобы ответить на подобные вопросы, применяют три подхода: 1.
Прочитать в справочном руководстве по языку определение соответствующих операций и выяснить, что означает написанный код. 2. Написать программу и посмотреть, что она вычислит. 3. Прочитать определение операций в описании стандарта языка. Второй способ, наверное, является самым распространенным, поскольку сесть и написать программу из двух-трех строчек и посмотреть, что получится, не составляет труда. Вообще-то концепция языка программирования тесно связана с конкретной его реализацией, используемой на локальном компьютере.
Если вы предпочитаете более научный подход, можно обратиться к справочному руководсгву по языку, которое обычно издается поставщиком конкретного компилятора С. Поскольку немногие имеют доступ к описанию стандарта языка, третий способ применяется сравнительно редко. Первый и второй способы подразумевают, что концепция языка программирования связана с его конкретной реализацией.
Но является лп зта реализация правильной? А что, если понадобится перенести программу, написанную на языке С и состоящую из 50 000 строчек, на другой компьютер, где установлен компилятор С от другого поставщика? По-прежнему ли программа будет правильно скомпилирована и при выполнении выдаст тот жс результат? Если нет, то почему? Зачастую идеология языка включает в себя некоторые неочевидные детали, интерпретация которых может различаться в различных реализациях, что порождает несколько разное поведение программы при ес выполнении на различных компьютерах.
Однако некоторые поставщики программного обеспечения могут решить, что новая возможность, добавленная в язык при его реализации, пойдет ему на пользу. Заметив ртла акюоиытиых), шо ответы иа первый и второй аопрогы оютвететвеиио «да» и а4н 48 Глава 1. Проблемы разработки языка Допустимо лп такое? Например, если добавить в язык С новый способ объявления динамических массивов, можно ли язык с подобным расширением по-прежнему называть языком С? Если это случится, то программу, использующую эту новую возможность и компилирующуюся на локальном компиляторе, в котором подобная возможность реализована, невозможно будет скомпилировать в другой системе, использующей другой компилятор языка.
Для разрешения подобных проблем многие языки имеют стандартные определения, Все реализации должны придерживаться этого стандарта. Стандарты обычно бывают двух видов. 1. Частный стандарт. Сюда входят определения, сделанные той компанией, которая разработала язык и имеет на него авторские права. В большинстве случаев для популярных и широко используемых языков такие стандарты не работают, поскольку в этих случаях часто появляются новые реализации, усовершенствованные и несовместимые. 2. Согласительный стандарт.
К нему относятся созданные специальными организациями документы, основанные на соглашении всех заинтересованных участников. Согласительный стандарт, или просто стандарт, является основным способом обеспечения единообразия различных реализаций языка. В каждой стране, как правило, есть одна или несколько организаций, наделенных правом разработки станлартов. В Соединенных Штатах зто Американский национальный институт стандартов (А!ЧЯ! — Ашег1сап !ЧаПопа! Згапг(агг!з 1пэгйпге). Стандарты языков программирования могут разрабатываться комитетом ХЗ Ассоциации производителей делового компьютерного оборудования (СВЕМА — Со|прпгег Впгйпевв ЕЧп1ршепг Мапо(асгпгеэ Аэзос)аг1оп), а также Институгом инженеров по электротехнике и электронике (1ЕЕŠ— 1пвгйпге о( Е!ессНса! апд Е!ее!гоп(с Епя1пеегэ).
В Великобритании такими полномочиями наделен Британский институт стандартов (ВЯ1 — ВгШэ!1 Ягапдагг!в 1пэг1гпге). Международные стандарты создаются Организацией международных стандартов (!ЯΠ— 1пгегпаПопа! Бгапг1агдз Огйап!хаг!оп), штаб-квартира которой находится в Женеве (Швейцария), В Соединенных Штатах следование стандартам — дело добровольное.
Национальный институт стандартов и технологий (й)1ЯТ вЂ” Маг!она! 1пвгйпге о1 Згапс1агг(в апг( Тесово!оду), являюпгийся правительственным органом, создает федеральные стандарты. Выполнение этих стандартов является обязательным только для поставщиков программного обеспечения, продающих продукцию федеральным органам. Частные же компании могут не следовать этим стандартам.