Рассматриваются основные понятия учебного курса: язык программирования, история развития языка и процесса программирования, проблематика разработки языка программирования. Приведены основные положения классификации языков и методов формального описания языков программирования.
Ключевые слова: язык программирования, процесс программирования, формальная модель языка, типизация языков программирования
Что дает знание языков программирования
К настоящему моменту разработаны и используются сотни языков программирования. Например, проведенное обследование проектов в министерстве обороны США выявило, что общее количество языков программирования, используемых исполнителями заказов министерства – более 500.
Обычно программист работают с определенными приложениями и используют чаще всего один процедурный и один объектно-ориентированный языки. Какую же пользу может получить программист от изучения множества различных языков, которыми едва ли станет пользоваться?
Если есть стремление постичь концепции языка и как они влияют на его реализацию, то в поддержку этого можно отметить шесть главных мотивов [Пратт, стр.17].
- Вы сможете разрабатывать более эффективные алгоритмы: например, рекурсию и итерации. В литературе постоянно появляются описания новых методов программирования. Для наилучшего использования концепций объектно-ориентированного, логического или параллельного программирования необходимо понимание конкретных языков, в которых эти концепции реализованы. Новые технологии, такие как новая среда .NET, Интернет и Всемирная паутина, в корне изменили природу программирования. Создание методов программирования, оптимально отвечающих этим новым условиям, требует достаточно глубокого понимания существа языков программирования.
- Вы сможете более эффективно использовать тот язык программирования, которым обычно пользуетесь. Например, понимание того, как создаются массивы, строки, списки или записи и как они обрабатываются в данном языке, знание подробностей реализации рекурсии или понимание того, как строятся классы объектов, позволят вам создавать с помощью этих компонентов более эффективные программы.
- Вы пополните набор полезных программных конструкций. Знание одного языка программирования накладывает ограничение на ваше мышление (замечаете вы это или нет, но это так): например, при поиске способов представления данных и методов их обработки, подходящих для решения некоторой задачи, человек думает только о структурах, которые непосредственно реализованы в знакомом ему языке. Изучив конструкции, имеющиеся в разных языках, программист расширяет свой кругозор. Понимание способов реализации конструкций в разных языках особенно важно, поскольку, чтобы использовать некую конструкцию в языке, в котором она не представлена непосредственно, программист должен осуществить ее реализацию в терминах базовых элементов этого языка. Если в вашем языке нет структуры управления подпрограммами (только немногие языке реализуют данную возможность), но знание концепции так называемой сопрограммы поможет реализовать ее, например, на языке С или С++ в вашем проекте.
- Вы сможете выбирать язык программирования, наиболее подходящий для реализации конкретного проекта. Приложения для задач искусственного интеллекта лучше выполнять на языке Пролог, а приложения, в которых больше вычислений – на Фортране или С. Для Интернет-приложений лучше подходит Perl или Java.
- Вам будет легче изучать новые языки. Лингвист, глубоко понимающий структуры, лежащие в основе естественных языков, может выучить новый язык легче и быстрее, чем начинающий, который плохо представляет структуру даже родного языка. Также и основательное знание конструкций и способов реализаций ряда языков программирования позволяет программисту в случае необходимости изучить новый язык.
- Вам будет легче разрабатывать новые языки. Большинство программистов и не помышляют о разработке нового языка программирования, хотя создаваемые ими приложения в действительности являются некоторой формой языка программирования. Разработчики пользовательского интерфейса для большой программы – текстовый редактор, графический пакет – неизбежно сталкиваются с многими из тех проблем, которые встречаются и при разработке языков программирования общего назначения. Многие новые языки основаны на моделях реализации языков С или Pascal.
История развития языков программирования
Первые версии FONTRAN и LISP были разработаны в 50-е гг., история языков Ada, C, Pascal, Prolog начинается в 70-х гг., в 80-е возникли такие языки, как С++,ML, Perl, Postscript, а язык Java – самый молодой, он появился в 90-х.
Первые языки программирования
1957г – Jon Backus (Джон Бэкус) – язык FORTRAN (транслятор формул – FORmula TRANslator) – ориентация на численные вычисления., но конечной целью было создание полного языка программирования. IBM финансировал проекты FORTRAN II, FORTRAN IV – 1966г.
1960г – Peter Naur (Питер Наур) проект ALGOL - 60 (ALGOrithmic Language). Первое название языка IAL (International Algorithmic Language).
Если FONTRAN разрабатывался для эффективного использования на IBM 704, перед разработчиками языка ALGOL стояли совершенно другие цели:
- Сделать систему обозначений в ALGOL как можно ближе к стандартной математической.
- ALGOL должен быть приспособлен для описания алгоритмов.
- Программа на ALGOL должны быть компилироваться на машинный язык.
- ALGOL не должен был привязан к конкретной машинной архитектуре.
Бэкус был редактором отчета, в котором определялся язык ALGOL. Он использовал синтаксическую систему обозначений, сопоставимую с концепцией контекстно-свободного языка, разработанной Хомским (Chomsky). Так произошло внедрение теории формальных грамматик в область языков программирования. Поскольку Бэкус и Наур внесли огромный вклад в концепцию разработки ALGOL, эта система обозначений носит их имя – нормальная форма Бэкус- Наура (НФБ) (Backus-Naur Form – BNF).
В 60-е гг. была разработана концепция пользовательских типов данных, которая не была реализована ни в FONTRAN, ни в ALGOL.
Язык Simula-67, разработанный норвежцами Найгардом (Nygaard) и Далом (Dahl), ввел концепцию классов в ALGOL. В 80-е гг. это подтолкнуло Страуструпа (Stroustrup) на идею создать С++ как расширение С с добавлением понятия классов.
70-е гг. – Wirth (Вирт) разработал Pascal, который стал языком научного программирования тех лет.
Начиная с 1963г – выпуск IBM 360 и для него создали новый язык – NPL (New Programming Language) – затем новое название MPPL (Multy – Purpose Programming Language) à PL/1. Сейчас он забыт и полностью вытеснен С, С++ и Ada.
BASIC был разработан, чтобы удовлетворить в численных расчетах людей, не имеющих отношения к науке, однако в дальнейшем его возможности были значительно расширены и вышли далеко ша рамки первоначальных целей.
Языки обработки деловой информации. 1960г. Разработан COBOL (COmmon Business Oriented Language) – по заказу министерства обороны США создать бизнес-ориентированный, максимально использующий английский язык в качестве системы обозначений в программах.
Языки искусственного интеллекта. Огромный шаг – Джон Мак-Карти (Jon McCarthy) из Массачусетского технологического института (МIT) – язык LISP (LISt Processing), который развивается и в настоящее время.
LISP разрабатывался как функциональный язык обработки списков. Естественной областью приложения LISP явилась разработка стратегии ведения игры, поскольку обычная программа на LISP, могла создавать дерево возможных направлений движения (как связанный список) и, двигаясь по этому дереву, искать оптимальную стратегию. Другой естественной областью применения этого языка стал автоматический перевод текста, где одна цепочка символов может замещаться на другую. В этой области первой разработкой был язык COMIT, созданный Ингве (Yngve). Затем появился SNOBOL – разработчики из AT&T Bell Telephone Laboratiries.
Prolog – стал специализированным языком со структурами управления и стратегией реализации, основанными на понятиях математической логики.
Системные языки. В системной области довольно долго использовался ассемблер. И только с появлением С (70-е гг.) была доказана эффективность использования языков высокого уровня и в системной области – среда UNIX была реализована на С.
Эволюция архитектуры программного обеспечения
На конструирование языков огромное влияние оказывает оборудование, на котором должны выполняться написанные на них программы.
Язык как средство выполнения задачи – составная часть используемой технологии.
Операционная среда
Внешняя среда, поддерживающая выполнение программ, называется операционной средой.
Среда разработки
Среда, в которой программа разрабатывается, кодируется, тестируется и отлаживается, или среда разработки (host environment), и операционная среда, в которой программа в конечном счете используется, могут отличаться друг от друга.
Всего мы имеем три эры – универсальные ЭВМ, персональные компьютеры, сетевая эра.
Эра универсальных ЭВМ
40-е гг -- 70-е гг. – это большие универсальные ЭВМ.
Пакетные среды
Интерактивные среды
Влияние на языки программирования – языки пакетной и интерактивной обработки – С, Pascal.
Эра персональных компьютеров
Персональные компьютеры. 70-е гг. – могут быть названы эрой мини-компьютеров – типа PDP – 7. Стандартные универсальные ЭВМ превратились в небольшие по размерам: из комнат à в шкафы.
1978 г. à Apple II – первый коммерческий компьютер с BASIC. Эта машина оказала огромное влияние на рынок образовательных услуг; однако деловой и научный мир скептически отнесся к первому персональному компьютеру.
Но уже в 1980 г. IBM выпустила свой первый РС, а фирма Lotus - разработало свое первое приложение Lotus 1-2-3, основанное на программе обработки электронных таблиц Visi-Calc. Эта программа стала первой из прикладных программ – «приманок» (для расширения круга потенциальных заказчиков), которыми промышленность была вынуждена пользоваться.
Началом современной эры РС – январь 1984г., когда в США проходили матчи на кубок по американскому футболу и на трансляциях этих матчей была показана реклама компьютера Macintosh фирмы Apple: оконный интерфейс и мышь для ввода!!! И хотя фирма Xerox разработала эту технологию первой, но коммерческий успех пришелся на Macintosh.
Среда встроенных систем, (или системы реального времени: СРВ). Они являются боковой ветвью развития РС. Требования надежности точности. Особые требования к языкам программирования систем РВ: например, строгие описания типов. В этой области широко используются языки Ada, C, C++.
Влияние на языки программирования. С появлением РС вновь изменилась роль языка. Во многих прикладных областях производительность перестала быть основным требования.
Компьютер управляется одним пользователем – исчезла необходимость в разделении времени.
Важно иметь хороший интерфейс пользователя с РС – поэтому потребовалась разработка языков с хорошей интерактивной графикой.
Итак, среда - РС плюс многооконный интерфейс.
Естественной моделью для данной среды является объектно-ориентированное программирование. Использование языков Java и C++ с их иерархией классов облегчает взаимодействие с пакетами, разработанными сторонними организациями.
Еще замечания по влиянию на языки со стороны СРВ. Программы для СРВ работают без ОС и обычной среды взаимодействия с файлами ввода-вывода. Стандартные процедуры ввода-вывода – мало внимания к ним. Главное – работа с нестандартными устройствами с использованием тех средств языка программирования, которые используют доступ к конкретным аппаратным средствам, областям памяти, обработчикам прерываний или к подпрограммам, написанным на ассемблер или другом языке низкого уровня. Важна обработка ошибок и выявление последних на уровне тестирования и отладки, не в процессе эксплуатации.
Сетевая эра
Распределенная обработка данных. Деловой мир: главный офис + отделения. Архитектура клиент-сервер и телекоммуникационный доступ к данным со стороны клиентов.
Интернет. В середине 90-х гг. наблюдалось преобразование распределенных ЛВС в международную глобальную сеть Интернет. В 1970 г. DARPA (Defense Advanced Research Projects Agency) начало разработку проекта по соединению универсальных вычислительных машин в большую, надежную и защищенную сеть. Целью ее создания было обеспечение избыточности на случай войны, так чтобы военные могли иметь доступ к компьютерам из любой точки страны. Но в середине 80-х гг. военная сеть ARPANET преобразовалась в ориентированную на исследователей сеть Интернет.
На заре функционирования глобальной сети Интернет доступ в нее требовал наличия двух типов компьютеров. Пользователь должен был находиться за клиентским персональным компьютером. Для получения информации он должен был подсоединиться к соответствующему серверу. Для этого использовались протоколы telnet и протокол передачи данных FTP (file transfer protocol). Протокол telnet позволял на компьютере пользователя эмулировать удаленный терминал сервера, что позволяло пользователю непосредственно обращаться с удаленным сервером, в то время как протокол FTP просто позволял клиентской машине посылать файлы на сервер или получать их с сервера.
В то же время был разработан третий протокол – простой протокол передачи сообщений (SMTP – Simple Mail Transfer Protocol). Протокол SMTP – основа сегодняшней электронной почты. Каждый пользователь локальное регистрационное имя на клиентской машине, а каждая машина имеет уникальное собственное имя. Послать сообщение можно, используя программу, поддерживающую протокол SMTP, и имя пользователя и имя машины, на которой он зарегистрирован. Нет необходимости знать точный адрес компьютера, на котором зарегистрирован данный пользователь. Нет необходимости знать точный адрес машины в Интернете.
В конце 80-х гг. основной целью стало упрощение поиска информации в Интернете. Прорыв осуществился в Европейском институте ядерных исследований (CERN), Женева, Швейцария. Бернерс-Ли разработал концепцию ГИПЕРССЫЛОК в рамках языка HTML (HyperText Markup Language) как способа навигации в Интернете. После создания в 1993 г. Web-браузера Mosaic и добавления к Интернет-технологиям протокола передачи гипертекстов HTTP (HyperText Transfer Protocol) произошло наконец-то открытие Интернета для широких слоев населения.
Влияние на языки программирования. Появление всемирной паутины (WWW – World Wide Web) вновь изменило роль языков программирования. Вычисления вновь стали централизованными, но существенно иным образом, нежели в раннюю эру универсальных компьютеров. По всему миру создаются крупные серверы информационных архивов. Для получения информации пользователи подключаются к этим серверам через Интернет, а для ее обработки (например, для создания отчета) используют локальные клиентские машины. Вместо того, чтобы распространять миллионы копий нового программного обеспечения, поставщик может просто выложить продукт на сайт WWW, а пользователь может загрузить его себе на машину для локального использования. Чтобы пользователь мог загрузить программный продукт, а поставщик программного обеспечения имел возможность получить плату за пользование этого продукта, необходим язык программирования, позволяющий вести диалог между клиентским компьютером и сервером. Развитие электронной торговли напрямую зависит от наличия языка с такими возможностями.
Изначально web-страницы были статическими: можно было посмотреть текст, рисунки или графики. Для доступа к другой странице пользователь мог щелкнуть на ее адрес URL (Uniform Resource Locator). Однако для развития электронной коммерции информация должна передаваться в обоих направлениях между клиентской машиной и сервером, поэтому web-страницы должны были стать более активными. Подобные вопросы обеспечиваются такими языками программирования, как Perl и Java.
WWW поставила две проблемы: безопасность как клиентской машины, так м сервера. И второе, производительность: при большом потоке задач на сервере будет узкое место и поэтому можно предоставить вести обработку на клиентской машине. Сервер должен переслать клиенту небольшую исполнительную программу. Проблема состоит в том, что сервер не знает: какой машиной обладает клиент. В языке Java есть такие средства!
Области применения
Выбор языка часто зависит от предметной области, для которой решается задача.
Таблица 1.1. Использование языков в различных областях
Период |
Область применения |
Основные языки |
Другие языки |
1960-е гг. |
Обработка деловой информации
Научные вычисления
Системная область
Искусственный интеллект |
COBOL
FORTRAN
Assembler
LISP |
Assembler
ALGOL, BASIC, APL
JOVIAL, Forth
SNOBOL |
Настоящее время |
Обработка деловой информации
Научные вычисления
Системная область
Искусственный интеллект
Издательская деятельность
Создание процессов
Новые парадигмы |
COBOL, C++, Java
FORTRAN, C, C++, Java
C, C++, Java
LISP, Prolog
TeX, Postscript
UNIX, shell, TCL, Perl, JavaScrpit
ML, Smslltalk |
C, PL/1, 4GLS
BASIC
Ada, BASIC, Modula
AWK, Marvel, SED
Eifell |
Роль языков программирования
Как и естественные языки, языки программирования развиваются и в конце концов выходят из употребления, умирают. Например, язык ALGOL, затем Pascal, затем C, C++, Java.
На принципы конструирования новых языков влияют следующие факторы:
1. Возможности компьютеров.
2. Области применения
3. Методы программирования. Структурное строение языка отражает изменяющееся с течением времени наше представление о том, что является хорошим методом написания большой и сложной программы, а также изменяющуюся со временем среду, в которой осуществляется программирование.
4. Методы реализации. Усовершенствование методов реализации отражается в выборе тех новых свойств , которые добавляются во вновь разрабатываемые языки.
5. Теоретические исследования. Исследование концептуальных основ разработки и реализации языка с помощью формальных математических методов углубляет понимание сильных и слабых сторон конкретного языка, что отражается на добавлении тех или иных свойств при создании новых языков.
6. Стандартизация. Необходимость в стандартных языках, которые могут легко реализованы в различных компьютерных системах ( что позволяет переносить программы с одного компьютера на другой), сильно влияет на развитие – эволюцию принципов разработки языков программирования.
Принципы сравнительного анализа языков
Механизмы разработки языка высокого уровня должны постоянно совершенствоваться. Каждый язык имеет свои достоинства и недостатки, тем не менее одни из них развиваются и продолжают жить, а другие уходят со сцены.
Некоторые факторы – внешние по отношению к языку:
- COBOL и Ada – по постановлению правительства США;
- FORTRAN – поддерживали производители ВТ (например, IBM);
- LISP и Pascal – изучались в вузах как базовые.
И все же именно программисты определяют и решают быть или не быть языку. Существует множество причин, по которым программисты предпочитают язык. Некоторые из них:
- Ясность, простота и единообразие понятий языка. Язык программирования обеспечивает как систему понятий для обдумывания алгоритмов, так и средства выражения этих алгоритмов. Он должен предоставить ясный, простой и единообразный набор понятий, которые могут быть использованы в качестве базовых при разработке алгоритмов. Поэтому желательно иметь минимальное количество различных понятий с как можно более простыми и систематизированными правилами их комбинирования. Это свойство мы называем концептуальной целостностью. Синтаксис языка влияет на удобство и простоту написания и тестирования программы, а в дальнейшем способствует ее пониманию и модификации. Центральным моментом здесь является удобочитаемость программы. Слишком лаконичный синтаксис может оказаться удобным при написании программы (особенно для опытного программиста), однако, когда такую программу нужно модифицировать, то в ней оказывается нелегко разобраться. (Это относится к программам на APL). Хороший язык характеризуется тем, что конструкции, обозначающие разные понятия, должны и выглядеть совершенно по разному, то есть семантические отличия должны отражаться на синтаксис.
- Ортогональность. Термин «ортогональность» означает, что любые возможные комбинации различных языковых конструкций будут осмысленными. Например, предположим, что язык позволяет задать выражение, которое вычисляет численное значение, а также задать условный оператор, в котором вычисляется выражение, с единственной целью – получить булево значение «истина» или «ложь». Эти две языковые конструкции (выражение и условный оператор) ортогональны, если любое выражение можно использовать (и вычислить) внутри условного оператора. Когда конструкции ортогональны, язык легче выучить и на нем легче писать программы, поскольку в нем меньше исключений и специальных случаев, требующих запоминание.
- Естественность для приложений. Язык должен предоставлять соответствующие решаемой задаче структуры данных, операции, структуры управления и естественный синтаксис. В качестве примера языков с очевидной направленностью на решение конкретных классов задач можно привести Prolog с уклоном в сторону дедукции и С++, предназначенный для объектно-ориентированных разработок.
- Поддержка абстракций. Даже в наиболее естественном для данной предметной области языке программирования остается некоторый существенный пробел. Это пробел между абстрактными структурами данных и операциями, которые характеризуют решение задачи, и конкретными базовыми структурами данных и операциями, встроенными в язык. И даже, если в конкретном языке (например, в С) не существует напрямую естественных для приложения «Учебный процесс» абстрактных структур типа студент, курс лекций, преподаватель – то важной частью работы программиста является разработка конкретных абстракций для решения задачи и их последующая реализация с использованием базовых возможностей языка. Но таких возможностей в языке С – нет. В идеале, язык должен позволять определять структуры данных, типы данных и операции и поддерживать их как самодостаточные абстракции. Эта возможность есть в С++, Ada.
- Удобство верификации. Основным требованием является надежность программы, написанной на том или ином языке. Множество технологий для проверки правильности выполнения программой свих функций: с помощью формальных методов верификации, проверкой без выполнения (чтение и исправление ошибок), тестированием с тестовыми входными данными. Основной фактор, влияющий на проверку программы, - простота семантики и синтаксических структур.
- Среда программирования. Факторов среды много – основной есть наличие надежной, эффективной и хорошо документированной реализации языка программирования.
- Переносимость программ.
- Стоимость использования.
- Стоимость выполнения программы
- Стоимость трансляции программы
- Стоимость создания, тестирования и использования программы
- Стоимость сопровождения программы.
Синтаксис и семантика
Синтаксис языка программирования определяет то, как выглядит программа на этом языке. Определить синтаксические правила – значит объяснить, как пишутся операторы, объявления и другие языковые конструкции.
Семантика программирования определяет смысловые значения различных синтаксических конструкций.
Например, синтаксис задания вектора на языке С:
int V[10]:
На Pascal – по-другому:
V: array[0..9] of integer:
Чтобы понять смысл этих объявлений, необходимо знать семантику объявлений массивов в языках С и Pascal. То есть вы должны знать, что если поместить это объявление в начало подпрограммы, то при каждом ее вызове будет создаваться вектор, содержащий указанное число элементов, а по завершении программы он будет уничтожаться. Во время выполнения подпрограммы на вектор можно ссылаться по имени V.
Однако, если вы объявите объект V как список в языке LISP, необходимо знать, что размер его может быть произвольным и определяться непосредственно в момент создания ( а не объявления).
В руководствах по языкам программирования и в справочниках принято строить описание языка на основе его синтаксических конструкций. Как правило, вначале приводится синтаксис некоторой синтаксической конструкции, а затем поясняется семантика этой конструкции, то есть описывается ее смысл. При этом используется система обозначений НФБ – она является сейчас основной системой обозначений.
Но есть другой способ описания: он основан на СТРУКТУРАХ, связанных с выполнением программы. Иногда такие структуры данных и операций непосредственно связаны с конкретными синтаксическими конструкциями, но чаще эта связь является более опосредованной. Например, описанный выше вектор описан в явном виде. Но скомпилированная программа может иметь другие структуры данных, такие как центральный стек, содержащий активационные записи подпрограмм, которые напрямую не связаны с синтаксисом языка.
Эти скрытые структуры так же важны для понимания языка, как и видимые структуры, напрямую соответствующие тому, что программист написал в программе. ИМЕННО поэтому – рассмотрение элементов языка НАДО организовывать вокруг ВЫПОЛНЯЕМЫХ структур, а не синтаксических элементов. КОНКРЕТНЫЙ элемент, создаваемый во время выполнения программы, может не иметь синтаксического представления в программе, может быть представлен напрямую единственным синтаксическим элементом, может выражаться через несколько различных синтаксических элементов, которые собираются транслятором воедино для создания одного элемента виртуального компьютера.
Парадигмы языка
Существуют четыре основные вычислительные модели, которые описывают большинство сегодняшних методов программирования: императивная, аппликативная, основанная на системе правил, объектно-ориентированная.
Императивные языки. Императивные (или процедурные) языки – это управляемые командами или операторно-ориентированные языки программирования. Основной концепцией является состояние машины – множество всех значений всех ячеек памяти машины. Программа состоит из последовательности операторов, выполнение каждого из которых влечет за собой изменение значения в одной или нескольких ячеек памяти, то есть переход машины в новое состояние.
Синтаксис такого языка:
Оператор1;
Оператор2;
…………..;
Операторn
Рис. 1.1.а) отображает этот процесс. Пусть память состоит из набора шариков в коробочках, а выполнение оператора (например, сложение двух переменных для получения значений третьей) может быть представлено как обращение к ячейке памяти, выполнение преобразования значений шариков и засылка результата (нового шарика) в новую ячейку. Разработка программы состоит в построении последовательности состояний машины, необходимой для достижения результата.
Языки, поддерживающие эту концепцию: С, С++, FORTRAN, ALGOL, PL/1, Pascal, Ada, Smalltalk, COBOL. Эта модель вытекает из особенностей аппаратной части стандартного компьютера, выполняющей инструкции(команды) последовательно.
Рис. 1.1. Вычислительные модели языков программирования
Аппликативные языки. Взгляд на вычисления, производимые с помощью языка программирования, РАССМОТРЕНИЕ ФУНКЦИИ, которую выполняет программа, а не отслеживание изменяемых состояний машины во время выполнения программы. Мы может достичь этого, сосредоточив внимание на ОЖИДАЕМОМ РЕЗУЛЬТАТЕ. Другими словами, вместо того, чтобы рассматривать последовательность состояний, через которые должна пройти машина для получения ответа, вопрос следует поставить по-другому: какую функцию необходимо применить к начальному состоянию (путем выбора начального набора переменных и комбинирования их определенным образом), чтобы получить требуемый ответ? Языки, в которых акцентирован именно этот взгляд на вычисления, называются аппликативными или функциональными.
Разработка программ сводится к созданию из уже имеющихся простых функций более сложных функций, которые поочередно воздействуют на начальный набор данных до тех пор, пока последняя функция не выдаст желаемый результат. Синтаксис такого языка, как правило, выглядит следующим образом: функцияn(…функция2(функция1(данные)…).
Функциональную модель поддерживают ряд языков, в том числе ML, LISP.
Языки, основанные на системе правил. Языки, основанные на системе правил, осуществляют проверку наличия необходимого разрешающего условия и в случае его обнаружения выполняют соответствующее действие. Известный язык – Prolog. Он называется также языком логического программирования. На рис. 1.1.в языки, основанные на системе правил, схематически представлены с помощью системы фильтров, которые нужно применить к данным, находящимся в памяти. Выполнение программы, написанной на Prolog, похоже на выполнение программы на императивном языке, за исключением того, что операторы выполняются не в той последовательности, в которой они определены в программе. Разрешающие условия определяют порядок выполнения. Синтаксис такого языка выглядит:
разрешающее условие 1à действие 1
разрешающее условие 2à действие 2
………………………………………..
разрешающее условие nà действие n
Хотя Prolog – известный язык, но существует множество языков, использующих эту парадигму. Обыкновенные бизнес-приложения таблиц решений являются формой языка, основанного на системе правил. В данном случае разрешающие условия для данных обуславливаются наличием или отсутствием допустимых значений в записях данных. Программирование обычно сводится к построению таблицы (матрицы) возможных условий и заданию соответствующих действий в случае выполнения этого условия. Далее, методы синтаксического разбора НФБ и средства синтаксического разбора типа YACC (Yet Another Compiler Compiler) относятся к технологиям, основанным на системе правил, в которых формальный синтаксис программы рассматривается в качестве разрешеающего условия.
Объктно-ориентированное программирование. Значимость этой модели растет. В этой модели строятся сложные объекты данных, а затем для операций над этими данными описывается ограниченный набор функций. Сложные объекты создаются как расширения более простых объектов и наследуют их свойства. Эта модель является попыткой объединить лучшие свойства других моделей. Благодаря возможности строить конкретные объекты данных объектно-ориентированная программа приобретает эффективность императивного языка. А построение классов функций, которые используют ограниченный набор объектов данных, дает гибкость и надежность, свойственные аппликативному языку.
Универсальность вычислительной модели
При описании конкретных вычислительных моделей следует использовать термин «модель поддерживает» вместо «модель реализует». Дело в том, что то как программист использует язык à зависит только от него самого. Императивный язык упрощает операторно-ориентированное программирование, но в принципе можно написать программы, которые будут выполнять те же самые функции, на языках LISP или Prolog. Также на процедурном языке С можно написать программу, состоящую только из вызовов функций и поэтому похожую на аппликативную. Об этом необходимо помнить, когда в дальнейшем будем обсуждать различные возможности и свойства языка.
Исторически сложилось так, что императивные языки – это в настоящее время самый широкий класс языков программирования. ОДНИМ ИЗ НАИБОЛЕЕ ИНТЕРЕСНЫХ результатов исследований 70-х гг. оказался тот факт, что АППЛИКАТИВНАЯ методика обеспечивает эффективные способы ВЕРИФИКАЦИИ программ и ДОКАЗАТЕЛЬСТВА их корректности.
Например, преобразование программы-спагетти (программы, где условные переходы в большом хаосе) в ясную структурированную последовательность укрупненных блоков операторов – однако новая программа это есть аппликативная форма, описанная нами ранее. В основе исследований по проверке программ с использованием формальных доказательств правильности программы лежит применение АППЛИКАТИВНЫХ методов к императивным программам.
Также можно утверждать, что объектно-ориентированное программирование является альтернативной возможностью применения аппликативной модели к императивным программам.
Стандартизация языка
Вопрос ставиться так: можно ли поставщику программного обеспечения в реализацию языка вносит новую возможность (расширяющую описание массивов, например) и не опасаться того, что разработанная на локальном компьютере программе при переносе ее (программы) на другой компьютер с другим компилятором языка, будет нормально компилироваться?
Для разрешения подобных проблем многие языки имеют стандартные определения. Все реализации должны придерживаться этого стандарта. Стандарты обычно бывают двух видов.
- Частный стандарт. Сюда входят определения, сделанные той компанией, которая разработала язык и имеет на него авторские права. В большинстве случаев для популярных языков такие стандарты не работают, поскольку в таких случаях часто появляются новые реализации, усовершенствованные и несовместимые.
- Согласительный стандарт. К нему относятся созданные специальными организациями документы, основанные на соглашениях всех заинтересованных участников. Согласительный стандарт, или просто стандарт, является основным способом обеспечения единообразия различных реализаций языка.
В каждой стране, как правило, есть одна или несколько организаций, наделенных правом разработки стандартов. В США – это ANSI (American National Standards Institute), IEEE(Institute of Electrical and Electronic Engineers).
В США следование стандартам – дело добровольное. Правда, для федеральных органов в США есть специальный – национальный институт стандартов и технологий, который регулирует стандарты для федеральных служб и все остальные комитеты и институты конечно согласовывают свои проекты с NIST (National Institute of Standards and Technology).
Проблема интернационализации. Коды символов (8-ми битный код или 16-битный код) схема упорядочения, формат времени и даты, денежные единицы – это все предметы специальных соглашений.
Среда программирования
Понятие среды программирования. Среда программирования состоит из набора средств поддержки и команд их активизации. Каждое из средств поддержки является программой и может быть использовано программистом как вспомогательное средство на стадиях создания программы. Однако, как правило, среда программирования меньше влияет ан СТРОЕНИЕ ЯП, нежели операционная среда, использующаяся для запуска программ. Обычно, в средства поддержки входят редакторы, отладчики, верификаторы, генераторы тестовых данных и программа печати.
Влияние на разработку языка
Среда программирования влияет на разработку языка в двух основных областях:
- на возможности языка, облегчающие раздельную к
Похожие статьи:
|