В.Ш. Кауфман - Языки программирования - концепции и принципы (1990) (1160787), страница 3
Текст из файла (страница 3)
бесспорные положения касаются, как правило, лишь конкретных ЯП. Например,
"Один из операторов в языке Паскаль - оператор присваивания. Устроен он так-
то. Служит для того-то". В хорошо известном учебнике программирования это
положение обобщено. Сказано так:"Фундаментальным действием в любом
алгоритмическом языке является присваивание, которое изменяет значение
некоторой переменной". И это уже неверно! Сейчас много внимания уделяется
так называемому функциональному программированию, аппликативным ЯП, где
присваивание не только не "фундаментальное" действие, но его вообще нет!
Значит, в области ЯП нет достаточно общих бесспорных положений? В
некотором смысле есть. Чаще не столь бесспорных, сколь заслуживающих
изучения. Правда, их общность - несколько другого характера. Примером может
служить упоминавшийся принцип однозначности. Да и приведенная фраза из
учебника - вполне бесспорное положение, если считать, что она характеризует
определенный класс ЯП, в который не попадает, скажем, язык Лисп - один из
самых "заслуженных", распространенных и в то же время перспективных. Итак,
даже если ограничиться лишь относительно бесспорными положениями, их все
равно нужно отбирать с определенных позиций, с определенной целью.
Естественная цель - стремиться принести читателю максимальную пользу. Опять
мы приходим к "угадыванию" будущих потребностей.
1.7. Зачем могут понадобиться знания о ЯП
Во-первых, каждая программа должна общаться (обмениваться информацией)
с внешним миром. Соглашения, определяющие способ общения - это язык, так что
понимание принципов построения языков - необходимая компонента грамотного
программирования. Исключительно важный компонент, потому что непосредственно
связан с внешним эффектом программы, со способом ее использования. При
разработке внешнего сопряжения своей программы программист обязан проявить
истинный профессионализм, предоставляя пользователю максимум услуг при
минимуме затрат. Особенно это важно при создании пакетов прикладных
программ, инструментальных систем, вообще любых программных изделий,
предназначенных для эксплуатации без участия автора.
Во-вторых, каждый ЯП - это своя философия, свой взгляд на деятельность
программиста, отражение определенной технологии программирования. Даже
представлений об Алголе 60, Фортране и Бейсике достаточно, чтобы
почувствовать, что имеется в виду.
Скажем, творцы Алгола (выдающиеся представители международного
сообщества ученых в области информатики под руководством Петера Наура) с
естественным для них академизмом придавали относительно много значения
строгости определения и изяществу языковых конструктов. Считалось, что самое
важное в работе программиста - сформулировать алгоритм (и, возможно,
опубликовать его). Переписать программу в расчете на конкретные устройства
ввода-вывода считалось не заслуживающей особого внимания технической
деятельностью. Не привлек должного внимания авторов языка и такой
"технический" аспект программистской деятельности, как компоновка программ
из модулей.
Творцы Фортрана (сотрудники фирмы IBM во главе с Джоном Бэкусом) в
значительной степени пренебрегли строгостью и изяществом языка и со
свойственным им в ту пору (1954-1957гг.) прагматизмом уже в первых версиях
языка уделили особое внимание вводу-выводу и модульности. Но ни Фортран, ни
Алгол не рассчитаны на работу в диалоговом режиме, в отличие от Бейсика
(созданного в Дартмундском колледже первоначально для обучения студентов).
Таким образом, изучение ЯП дает знание и понимание разнообразных
подходов к программированию. Это полезно при любой программистской
деятельности.
В-третьих, понимание общих принципов и концепций, определяющих строение
и применение ЯП, позволяет легче и глубже освоить конкретный язык - основной
профессиональный инструмент программиста.
В-четвертых, и это хотелось бы подчеркнуть особо, понятия и тенденции в
области ЯП с некоторым запаздыванием (в целом полезным), довольно точно
отражают понятия и тенденции собственно программирования как науки,
искусства и ремесла (и просто области человеческой деятельности). В этом
смысле мы обсуждаем основные принципы и понятия программирования, но со
специфически языковой точки зрения.
Все, о чем было сказано до сих пор, касалось интересов потенциального
пользователя ЯП. Но читатель может оказаться и руководителем коллектива,
которому требуется оценивать и выбирать ЯП для выполнения конкретного
проекта (учитывать, скажем, затраты на освоение этого ЯП или на обмен
написанными на нем программными изделиями). Если же он станет творцом ЯП,
создателем транслятора или руководства для пользователей, то ему понадобятся
столь разнообразные знания о ЯП, что их придется извлекать целеустремленным
изучением специальной литературы. Можно надеяться дать лишь первоначальный
импульс в нужном направлении.
Конечно, предсказать, для чего именно понадобятся приобретенные знания
- сложно. Могут напрямую и вовсе не понадобиться. Но наверняка пригодится
приобретенная обсуждениями, размышлениями и упражнениями культура работы со
сложными объектами при решении сложных задач. В нашем случае - это такие
задачи, как оценка, использование, разработка и реализация ЯП.
1.8. Принцип моделирования ЯП
Было бы неправильно ставить нашей целью научить свободному владению
конкретными ЯП, пусть даже особо привлекательными или перспективными. Для
этого служат специальные учебники, упражнения и, главное, практика.
Наша задача - познакомить с важнейшими понятиями и концепциями,
помогающими оценивать, использовать, реализовывать и разрабатывать ЯП, дать
представление о направлениях и проблемах их развития. Поэтому займемся, в
основном, изучением моделей ЯП. Другими словами, при изучении ЯП будем
систематически применять принцип моделирования (как самих реальных ЯП, так и
их отдельных аспектов). Наиболее важные по тем или иным причинам ЯП или их
конструкты иногда будут рассматрены довольно подробно, но прежде всего лишь
как примеры, иллюстрирующие более общие положения.
Например, важно понимать, что с каждым ЯП связан эталонный
(абстрактный) исполнитель, в котором в свою очередь определены данные,
операции, связывание, именование, аппарат прогнозирования и контроля, а
возможно и аппарат исключений, синхронизации и защиты. Важно понимать
перечисленные термины, понимать назначение соответствующих языковых
конструктов и уметь ими пользоваться при решении практических задач. Но не
очень важно помнить наизусть все связанные с ними тонкости в конкретных ЯП.
Последнее может оказаться важным лишь тогда, когда тонкости иллюстрируют
ключевые концепции рассматриваемого ЯП. Например, жесткие правила выбора
обозначений в Бейсике непосредственно связаны с его ориентацией на
относительно небольшие программы и простоту реализации.
1.9. Пять основных позиций рассмотрения ЯП
Итак, будем считать, что целевые установки согласованы в достаточной
степени, чтобы сделать следующий шаг - приступить к систематическому
изучению нашего предмета.
И сразу вопрос - с чего начать? Легко сказать "систематическому". Но
ведь системы бывают разные. Часто начинают "снизу" - с основных конструктов,
встречающихся почти во всех существующих ЯП. Тогда мы сразу погружаемся в
мир переменных, констант, параметров, процедур, циклов и т.п. Такой путь
привлекателен хотя бы тем, что им сравнительно легко пойти. Но на этом пути
за деревьями обычно не видно леса, не удается увидеть ЯП в целом, построить
его адекватную модель.
Поэтому выберем другой путь. Постараемся взглянуть на объект нашего
изучения - ЯП - с общих позиций. Нас будут особенно интересовать
технологическая, семиотическая и авторская позиции.
Первая названа технологической потому, что отражает взгляд человека,
желающего или вынужденного пользоваться ЯП как технологическим инструментом
на каком-либо из этапов создания и использования программных изделий
(другими словами, в течение их жизненного цикла). С таким человеком
естественно объясняться в технологических терминах.
Вторая позиция названа семиотической потому, что ее можно представить
себе как позицию человека, знакомого с некоторыми знаковыми системами
(русским языком, дорожными знаками, позиционными системами счисления) и
желающего узнать, чем выделяются такие знаковые системы, как ЯП. Следует
объяснить ему это в семиотических терминах.
Третья позиция - авторская. Автор создает ЯП, делает его известным
программистской общественности, исправляет и модифицирует его с учетом
поступающих предложений и критических замечаний.
Уделим внимание и другим позициям - математической и реализаторской.
Математик понимает, что такое математическая модель изучаемого обьекта,
и желает познакомиться с математическими моделями ЯП. С ним желательно
объясняться в математических терминах.
Реализатор обеспечивает возможность пользоваться ЯП как средством
практического программирования. Другими словами, он не только создают
трансляторы, но и пишет методические руководства, обучающие и контролирующие
программы, испытывает трансляторы и т.п.
Уместно подчеркнуть, что с разных позиций мы будем рассматривать один и
тот же объект. Начнем с технологической позиции. Установим связь ЯП с
производством программных услуг.
1.10. Что такое производство программных услуг
Напомним исходные понятия, известные из общего курса программирования
компьютеров. Понятие компьютер нужно уточнить лишь в той мере, в которой
это необходимо для нашей цели. Важно, что компьютер обладает двумя
фундаментальными способностями - хранить данные и выполнять планы.
Начнем со второй способности. Назовем исполнителем всякое устройство,
способное выполнять план. Так что и компьютер, и робот, и рабочий, и
солдат, и сеть компьютеров, и коллектив института способны играть роль
исполнителя.
Всего одна фундаментальная способность - выполнять план - дает
возможность исполнителю предоставить пользователю содержательно
разнообразные услуги. Определяя конкретные планы, можно настраивать
исполнителя на предоставление конкретных услуг. Важно лишь, чтобы в плане
фигурировали задания, посильные для выбранного исполнителя. Посильные - это
значит такие, для выполнения которых у исполнителя имеются соответствующие
ресурсы.
Для компьютеров как исполнителей характерны два вида ресурсов - память
и процессор. Память реализует первую из двух названных фундаментальных
способностей - служит для хранения данных. Это пассивный ресурс. Процессор
реализует вторую из названных способностей - служит для выполнения действий,
предусмотренных в планах. Это активный ресурс. Процессор характеризуется
определенным набором допустимых действий (операций, команд). Действия из
этого набора считаются элементарными (в плане не нужно заботиться о способе
выполнения таких действий).
Две названные способности связаны - выполнение достаточно сложного
плана требует его хранения в доступной исполнителю памяти. В свою очередь,
реализация хранения требует способности выполнять план (данные нужно
размещать, перемещать, делать доступными).
План для такого исполнителя, как компьютер, должен в итоге сводиться к
указанию конечной последовательности элементарных действий. Такой план
называют программой.
Людей как исполнителей характеризует прежде всего наличие у них модели
реального мира, в достаточной степени согласованной с моделью мира у
создателя плана. Поэтому в плане для людей можно указывать цели, а не
элементарные действия.
Ресурс, существенный почти для всех реальных исполнителей - это время.
Важное свойство компьютеров как исполнителей - способность выполнять
элементарные действия исключительно быстро (порядка микросекунды на
действие). Не менее важное свойство ЭВМ - способность хранить огромные
объемы данных (в оперативной памяти - мегабайты; на внешней - практически
неограниченно).
Именно способность компьютеров выполнять весьма длинные
последовательности элементарных действий над данными любого нужного объема
за практически приемлемое время предоставляет пользователям весьма
разнообразные по содержанию услуги (развлекать, играя с ним в
интеллектуальные и (или) азартные игры, давать справки, помогать в
составлении планов, управлять самолетами и танками, поддерживать светскую
беседу).
Чтобы настроить компьютер на конкретный вид услуг, нужно снабдить его
соответствующими этому виду услуг знаниями в приемлемой для него форме.
Принципиально важный для нас факт, ставший очевидным лишь относительно
недавно (по мере расширения и развития сферы представляемых компьютерами