- •Внимание! Серым цветом выделен необязательный материал! Глава «Введение» - также для общего развития.
- •Курс лекций по программированию на языке Pascal Содержание курса
- •Введение
- •Программное управление компьютером
- •Этапы разработки программного обеспечения. Языки программирования.
- •Языки программирования
- •Трансляция
- •Алгоритмы и структурное программирование
- •Основные структуры алгоритмов. Понятие о структурном подходе к разработке алгоритмов
- •Методы разработки программного обеспечения
- •Структуры данных
- •Сортировка
- •Стратегии распределения памяти
- •Объектно-ориентированное программирование
- •Базовые элементы языка тurbo рascal
- •Алфавит
- •Константы и переменные
- •Выражения и операции
- •Структура программы
- •Типы данных языка тр
- •Простые типы
- •Целые типы
- •Логический тип
- •Символьный тип
- •Перечисляемый тип
- •Вещественный тип
- •Математические функции
- •Математические процедуры
- •Структурированные типы
- •Массивы
- •Множества
- •Процедуры преобразования
- •Совместимость и преобразование типов
- •Управляюшие структуры языка turbo pascal Операторы
- •Простой и составной оператор
- •Условный оператор
- •Оператор множественного выбора
- •Оператор цикла "пока" (с предусловием)
- •Оператор цикла "до" (с постусловием)
- •Оператор цикла с параметром (цикл по счетчику)
- •Оператор безусловного перехода
- •Процедуры и функции
- •Особенности функций
Языки программирования
Следует еще раз повторить, что компьютер может обрабатывать команды и данные только тогда, когда они представлены в машинном коде, т.е. выражены на языке нулей и единиц, непосредственно связанном с электронной «начинкой» компьютера. Машинная команда состоит из кода операции и адресной части (рис.). Код операции указывает вид выполняемого действия (сложить, вычесть и т.д.). Адресная часть содержит адреса (номера) ячеек памяти, в которых расположены операнды, и адрес ячейки, куда следует поместить результат. Преимущества машинного кода – детализация управления, максимальная эффективность. Недостатки – трудность написания кода, его тестирования и последующего сопровождения.
Создание программ в более привычном человеку виде, нежели машинный код, связано с использованием машинно-ориентированных языков (языков ассемблера). Такие языки отличаются от машинного кода тем, что коды операций заменены буквенными обозначениями и вместо номеров ячеек используются символические адреса. Время появления языка ассемблера относится к началу 50-х годов, когда авторы машины «ЭДСАК» ввели систему мнемоники, где каждая машинная команда представлялась одной заглавной буквой (S – вычитание, I – прочитать следующий ряд дырочек во входной бумажной ленте, Т – передать информацию в память, Z – остановка машины). Они назвали эту систему assembly system (собирающая система), отсюда название ассемблер (кроме мнемоники, также была введена библиотека стандартных подпрограмм).
Программа называется программой ассемблера, или, кратко ассемблером, если она преобразует мнемонику языка ассемблера непосредственно в двоичные представления машинных команд.
Языки ассемлера используются и в настоящее время, поскольку тесно связаны с машиной; дествительно, язык ассемлера – это машинно-зависимый язык, спроектированный так, чтобы он соответствовал набору машинных команд, заложенных в центральный процессор конкретного компьютера. Язык ассемлера предпочитают те программисты, которые стремяться сжать свои программы до минимального размера, что позволяет выполнить их максимально быстро и эффективно. Однако ассемблер имеет и свои недостатки. Поскольку он ближе к языку машины, чем к естественному языку, то весьма труден для работы. Тот кто пользуется языком ассемлера, должен быть близко знаком с работой компьютера – например, должен знать шаги, которые выполняет компьютер при том или ином действии. Более того, поскольку ассемблер машинно-зависим, программа, написанная на ассемблере одного компьютера, абсолютно непонятна компьютеру другого типа. Языки ассемблера – это языки низкого уровня. 8088 (ХТ) - ассемблер работает только с целыми числами. 8087 - сопроцессор позволяет работать и с вещественными.
Языки программирования, имиттирующие естественные языки и способные на основании одного предложения строить несколько команд компьютера, принято считать языками высокого уровня. Но по сравнению с естественными языками, они, как правило, более строги и точны, в них остутствует многозначность слов, употребление их в переносном смысле, игра слов и т.д. В настоящее время насчитывается несколько сотен таких языков; если же учитывать все их варианты, называемые диалектами то, возможно, и более тысячи.
Варианты языков – подмножества, расширения, диалекты. Подмножество – это версия языка, включающая только часть возможностей полного языка. Расширение – это расширенная версия, дополненная новыми свойствами, делающими язык более разносторонним. Диалекты содержат незначительные изменения, которые способствуют либо настройке языка на специальное применение, либо выявлению сильных сторон конкретного компьютера. Диалекты несовместимы как с исходным языком, так и с другими диалектами того же языка (программа, написанная на одном диалекте, не может транслироваться компилятором, разработанным для другого диалекта).
Языки программирования служат самым разнообразным целям - от решения сложных математических задач и проведения экономико-математических расчетов до создания музыкальной партитуры и машинной графики. Не существет языка, который бы в равной мере годился для всех случаев. Выбор языка обычно определяется одним или, возможно, несколькими из трех факторов: язык должен быть удобен для программиста, пригоден для данного компьютера и для решения данной задачи.
Самого лучшего языка программирования не существует, как нет самого лучшего естественного языка.
Теоретически для решения большинства задач можно использовать любой язык. Однако на практике оказывается, что написать программу для конкретной задачи гораздо легче на одних языках, чем на других. Это связано с тем, что в языках программирования способ выражения те или иных понятий приспособлен к потребностям конкретного образа мыслей.
Каждый язык имеет свой собственный набор так называемых ключевых слов, букв, чисел или других символов. Ключевые слова соответствуют конкретным операциям или последовательностям операций, которые должен произвести компьютер. Одни выполняют функцию глаголов, другие - существительных, определений или знаков препинания. Они связываются друг с другом в соответствии с синтаксическими правилами, образуя предложения языка программирования.
При выборе наиболее подходящего языка для решения той или иной задачи следует учитывать ряд факторов, в том числе, степень квалификации программиста и размер будущей программы.
БЕЙСИК (BASIC). Сравнительно несложен для изучения и хорошо подходит для разработки коротких и простых программ. В то же время большие программы на этом языке могут оказаться неуклюжими и плохо организованными. В свое время завоевал признание своей компактностью и пригодностью для первых персональных компьютеров с их ограниченным объемом памяти. VB хорош для маленьких приложений, которые должны быть написаны быстро и относительно неопытными программистами. Недостаток VB – не поддерживает некотороые важные конструкции: указатели или числовые типы данных без знака (абстрактные переменные?).
Языки сценариев предназначаются для иных задач, нежели языки программирования систем, а потому фундаментально отличаются от них. Последние проектировались с расчетом на построение структур данных и алгоритмов, начиная с самых примитивных компьютерных компонентов, таких как слова памяти. Языки сценариев создавались для "склеивания" мощных готовых компонентов в предположении, что большинство из них уже существует и надо лишь связать их между собой. Языки программирования систем, как правило, сильно типизированы, что помогает справиться со сложностью, в то время как языки сценариев являются бестиповыми, что упрощает связи между компонентами и обеспечивает быструю разработку приложений. Сами по себе современные компьютеры принципиально бестиповые. Современные языки программирования систем, напротив, сильно типизированы. Типизация обеспечивает ряд преимуществ. Во-первых, она делает большие программы более управляемыми благодаря точному определению используемых сущностей и их отличий от других. Во-вторых, компиляторы используют информацию о типах для обнаружения определенных видов ошибок, таких как попытка задействовать величину с плавающей точкой как указатель. В-третьих, типизация повышает эффективность исполнения, позволяя компилятору генерировать специализированный код.
Языки Perl [4], Python [5], Rexx [6], Tcl [7], Visual Basic и оболочки Unix (shell) представляют стиль программирования, отличный от присущего языкам программирования систем. Этот стиль предполагает, что набор полезных в контексте решаемой задачи компонентов уже существует и остается должным образом их скомбинировать. Например, Tcl и Visual Basic могут служить для размещения на экране набора управляющих элементов пользовательского интерфейса, а написанные на shell командные файлы позволяют собрать программы-фильтры в конвейеры. Хотя языки сценариев часто используются для расширения свойств компонентов, они мало пригодны для программирования сложных алгоритмов и структур данных, обычно как раз и обеспечиваемых компонентами. Вот почему языки сценариев часто называют склеивающими языками (glue languages) или языками интеграции систем (system integration languages).
ПАСКАЛЬ (PASCAL). Обеспечивает возможность создания больших программ, поддерживая их строгую логическую структуру. Это ценно для начинающих программистов, создающих серьезные программы, т.к. приучает их к определенной дисциплине. Для коротких программ может оказаться слишком громоздким. Считается важнейшим инструментом для обучения методам структурного программирования. Компилятор Турбо Паскаль был выпущен в продажу фирмой Борланд в 1983 году. Начиная с версии 7.0, язык стал называться Борланд Паскаль, а с появлением системы Delphi был переименован в Объектный Паскаль. Сейчас входной язык Delphi содержит уже очень много синтаксических расширений по сравнению со стандартным Паскалем. Существует даже мнение, что именно отсутствие необходимости придерживаться стандарта языка объясняет тот факт, что визуальная среда программирования была создана компанией Борланд сначала для Паскаля, а уж потом для Си. Но думаю также, что не менее, а скорее более важной причиной этого было то, что разработкой Delphi занимался выдающийся программист A.Хейльсберг.
Компилятор, встроенный в Delphi, обеспечивает высокую производительность, необходимую для построения приложений в архитектуре "клиент-сервер". Этот компилятор в настоящее время является самым быстрым в мире, его скорость компиляции составляет свыше 120 тысяч строк в минуту на компьютере 486DX33. Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL. Кроме того, Delphi обеспечивает быструю разработку без необходимости писать вставки на Си или ручного написания кода (хотя это возможно). Еще до компиляции он видит результаты своей работы - после подключения к источнику данных их можно видеть отображенными на форме, можно перемещаться по данным, представлять их в том или ином виде. В этом смысле проектирование в Delphi мало чем отличается от проектирования в интерпретирующей среде, однако после выполнения компиляции мы получаем код, который исполняется в 10-20 раз быстрее, чем то же самое, сделанное при помощи интерпретатора. Кроме того, компилятор компилятору рознь, в Delphi компиляция производится непосредственно в родной машинный код, в то время как существуют компиляторы, превращающие программу в так называемый p-код, который затем интерпретируется виртуальной p-машиной. Это не может не сказаться на фактическом быстродействии готового приложения. Cреда Delphi включает в себя полный набор визуальных инструментов для скоростной разработки приложений (RAD - rapid application development), поддерживающей разработку пользовательского интерфейса и подключение к корпоративным базам данных. VCL - библиотека визуальных компонент, включает в себя стандартные объекты построения пользовательского интерфейса, объекты управления данными, графические объекты, объекты мультимедиа, диалоги и объекты управления файлами, управление DDE и OLE. Единственное, что можно поставить в вину Delphi, это то, что готовых компонент, поставляемых Borland, могло бы быть и больше. Однако, разработки других фирм, а также свободно распространяемые программистами freeware-компоненты уже восполнили этот недостаток. Постойте, - скажете вы, ведь это уже было. Да, это было в Visual Basic. Соответствующий стандарт компонент назывался VBX. И этот стандарт так же поддерживается в Delphi. Однако, визуальные компоненты в Delphi обладают большей гибкостью. Вспомним, в чем была проблема в VB. Прикладной программист программировал, вообще говоря, в среде языка бэйсик. А компоненты в стандарте VBX готовили ему его коллеги-профессионалы на С++. VBX'ы приходили, "как есть", и ни исправить, ни добавить ничего было нельзя. А для изготовления VBX надо было осваивать "кухню" языка C++. В Delphi визуальные компоненты пишутся на объектном паскале, на том же паскале, на котором пишется алгоритмическая часть приложения. И визуальные компоненты Delphi получаются открытыми для надстройки и переписывания. Чувствуете разницу?
ФОРТРАН (FORTRAN). В основном используется для программ, выполняющих естественно-научные и математические расчеты. Существует мнение, что этот язык оказал долговременное влияние «в том смысле, что начиная с 1957 г. все исследования в области языков программирования имели своей целью преодоление недостатков, присущих Фортрану».
В 1995 г. Международная организация по стандартам (ISO) предложила проект нового стандарта языка — Fortran 95. Он был принят взамен Fortran 90 в октябре 1996 г. Однако Американский национальный институт по стандартам (ANSI), на решения которого ориентируются все разработчики США, утвердил этот стандарт лишь летом 1997 г. В стандарт Fortran 95 включено 17 новых функций, многие из них являются расширением существовавших операторов языка. Одновременно из него удалено пять старых конструкций. Кроме того, составлен список устаревающих операторов — кандидатов на удаление при следующей ревизии стандарта. В целом нововведения в Fortran 95 представляются не очень существенными, большинство из них уже было реализовано во многих компиляторах как неофициальные расширения языка. Во всяком случае, эти нововведения не идут ни в какое сравнение с революционными изменениями, произошедшими при переходе к Fortran 90.
В начале 1997 г. Microsoft объявила о прекращении своей деятельности по развитию средств разработки на базе языка Фортран. Данное решение тогда вызвало явную озабоченность программистов, пишущих на Фортране, который продолжает оставаться весьма популярной системой в сфере математических расчетов. Довольно значительная часть задач решается именно на ПК, а для них Фортран-инструменты Microsoft занимали лидирующие позиции. Следует напомнить, что речь шла о трех выпущенных в 90-х годах пакетах, которые довольно широко применяются и в настоящее время: 2 MS Fortran 5.1 (выпуск 1990 г.). Система для MS-DOS, позволяющая создавать 16-разрядные DOS-приложения, способные работать с оперативной памятью до 64 Мб; 2 MS Fortran PowerStation (FPS) 1.0 (1993 г.). Разработка и отладка программ ведется в среде Windows, в результате чего получаются 32-разрядные приложения для DOS, использующие до 4 Гб оперативной памяти; 2 MS Fortran PowerStation 4.0 (1995 г.). Создание 32-разрядных приложений под Windows 95 и NT. Полная поддержка стандарта Fortran-90. Однако уход Microsoft сопровождался заключением соглашения с корпорацией Digital Equipment, по которому последняя лицензировала среду MS Developer Studio для своего нового пакета Visual Fortran (DVF) 5.0 под Windows NT (Intel, Alpha) и Windows 95. В обращении к своим пользователям Microsoft рекомендовала для будущего обновления именно пакет DVF 5.0. Таким образом, Digital, имевшая многолетний опыт создания средств разработки для Фортрана (в основном для Unix-систем), получала отличную возможность продвинуться в сферу ПК. А Microsoft не только продавала свою среду разработки, но и обеспечивала тем самым высокую степень интеграции собственных инструментальных средств с новым продуктом Digital. Переходя к характеристике основных возможностей DVF 5.0, о выпуске которого было официально объявлено весной 1997 г., мы рассмотрим их с точки зрения трех главных компонентов — самого языка программирования, среды разработки и вариантов получения законченных приложений, обратив особое внимание на новшества DVF 5.0 по сравнению с FPS 4.0. Основные характеристики DVF 5.0 Компилятор DVF 5.0 (как и FPS 4.0) поддерживает три основных стандарта языка — FORTRAN 66, FORTRAN 77 и Fortran 90. Кроме того, в нем можно использовать большое число специфических расширений языка, имеющихся в FPS 4.0, а также в Digital Fortran, для других компьютерных платформ. DVF 5.0 включает также все новшества самого последнего стандарта языка — Fortran 95. Однако варианта компиляции в режиме Fortran 95 как такового в DVF 5.0 нет, поскольку к моменту выпуска продукта этот стандарт еще не был официально утвержден. В DVF 5.0 используется интегрированная среда разработки Developer Studio, которая применяется в качестве основы всего семейства средств разработки Microsoft (ее предыдущий вариант имелся и в FPS 4.0). Она представляет собой многооконный редактор текста с широкими возможностями настройки среды и включает целый ряд универсальных средств: отладчик кода, встроенную справочную систему, профайлер для изучения частоты обращения к отдельным частям программы, средство просмотра структуры программы и межпроцедурных ссылок, редактор для создания компонентов графического интерфейса пользователя и пр. В рамках одного проекта можно использовать исходные модули, написанные на разных языках, что существенно упрощает разработку приложений методом смешанного программирования, в том числе на VC++, VB, VJ++ и MASM. С помощью DVF можно получать библиотеки подпрограмм (статические OBJ и динамические DLL) и исполняемые модули. Для создания законченных приложений разработчик может выбрать один из следующих типов исполняемых модулей. 3 Console application. Такая программа вообще не содержит графики и реализует наиболее простую форму диалогового интерфейса — ввод данных в традиционном стиле MS-DOS. Это самый быстрый и наиболее легко переносимый на другие платформы тип рабочей программы. 3 Standard Graphics. Данный вариант исполняемого модуля имеет однооконный графический интерфейс. Его рекомендуется применять в тех случаях, когда есть необходимость графического вывода, но не нужен развитой интерфейс пользователя. 3 QuickWin Graphics Application. При создании модуля этого типа используется библиотека QuickWin, позволяющая применять сокращенный набор функций WinAPI 32, с помощью которого можно создать многооконный интерфейс. 3 Win32 Application. Этот модуль является полнофункциональным Windows-приложением, которому доступны все ресурсы WIN32 API. Все эти варианты Fortran-приложения были реализованы и в FPS 4.0. Новшеством DVF 5.0 является встроенное средство Fortran Module Wizard, которое обеспечивает генерацию исходных модулей на языке Fortran 90 для обращения к процедурам DLL-библиотек, методам ActiveX-объектов, а также функциям COM-серверов. Формирование текстов этих модулей производится в автоматическом режиме в процессе заполнения экранных форм, запрашивающих информацию об объекте. DVF 5.0 поставляется в двух редакциях — Standard и Professional. Последняя появилась в конце 1997 г. и дополнительно включает известную математическую библиотеку IMSL фирмы Visual Numerics, которая входила ранее и во все Фортран-инструменты Microsoft. Стоимость данных редакций DVF 5.0 составляет соответственно 599 и 799 долл., причем документацию и лицензию можно приобрести отдельно. Имеются льготные цены для пользователей Фортран-инструментов (причем не только от Digital и Microsoft). Научные бюджетные институты и вузы могут приобрести пакет с “академической” скидкой.
СИ (C). Стал очень популярен благодаря многим решениям, сделавшим запись программы на Си весьма компактной. Накладывает на программиста не слишком много ограничений. С++ - первоначальное название "Си с классами". В язык Си Бъярном Строуструпом введены средства ООП и ряд других добавлений. До последнего времени самый модный язык. Сейчас принято считать, что Си++ сложноват и не слишком надежен.
АДА (ADA). Официальный язык программирования американских военных. Происходит от Паскаля, но заметно сложнее его.
МОДУЛА-2 (MODULA-2). Язык, который должен был заменить Паскаль, устранив основное его ограничение – отсутствие модульности. Но этого в полной мере не произошло. Благодаря политике компании Борланд, которая в тот момент, когда нужно было обеспечить модульность в создаваемых ею системах программирования, решила, что выгоднее добавить новые элементы в Паскаль, а не переходить на Модулу-2. Тем не менее, известно, что Модула-2 использовалась и используется в проектах, где важнейшую роль играет надежность. Средства межмодульного контроля Модулы-2 заметно совершенней аналогичных возможностей Турбо Паскаля и Си.
Оберон (OBERON). Разработан Н.Виртом в 1987 году. Представляет собой существенно упрощенный вариант Модулы-2, в который добавлены расширяемые записи – основной механизм ООП. Язык необычайно прост. При этом сохраняет универсальность и в функциональном отношении не уступает другим языкам. В 1992 году были приняты расширения языка Оберон-2, предложенные молодым коллегой Н.Вирта Ханспетером Мёссенбёком. В язык введены так называемые связанные процедуры – аналог виртуальных методов в других языках.
ЯВА (JAVA). Самый молодой и самый обсуждаемый ныне язык. Является непосредственным наследником Си++. Отличается от него отсутствием некоторых потенциально ненадежных механизмов, а также тем, что устранены любые, не относящиеся к ООП, средства. Объекты и ничего кроме объектов. Говорят, что Ява простой язык. Но стоит заглянуть в его официальное описание (James Gosling, Bill Joy, Guy Steele. The Java Language Specification Version 1.0), как возникает повод усомниться. Тяжелый (в прямом и переносном смысле) 700-страничный документ, насыщенный многословными и громоздкими определениями.
Немалую роль играют пропаганда и мода. Сейчас, например, мы все являемся свидетелями массированной пропагандистской кампании, развернутой вокруг языка Ява. Впервые язык программирования выводится на рынок такими же маркетинговыми приемами, что и традиционные товары.
ЛИСП (LISP, LISt Processing - обработка списков). Используется в области искусственного интелекта - направления, которое занимается созданием ПО, имиттирующего человеческий разум. Создан в конце 50-х годов математиком из МТИ Джоном Маккарти. Лучше подходит для задач, связанных с манипулированием символами, чем для обработки обычных чисел.
КОБОЛ (COBOL, COmmon Business Oriented Language - общий язык, ориентированный на деловые задачи). Создан в Пентагоне в 1960 г. совместными усилиями федерального правительства и производителей компьютеров. Основной целью было создать язык, который могли бы легко понимать деловые люди, профессионально не связанные с программированием. Структура и словарь близки к обычному английскому языку. Является основным языком в США для обработки данных в таких учереждениях как банки и страховые компании.
ФОРТ (FORTH - четвертый, по мнению автора язык четверого поколения). Идея создания принадлежит Чарлзу Муру, который разработал его в конце 60-х - начале 70-х годов как персональное средство повышения производительности труда. Стал широко применять в задачах управления после того, как Мур использовал его для реализации программы, предназначенной для управления радиотелескопом Аризонской обсерватории.
Языки программирования (ЯП) по своим возможностям и времени создания принято делить на несколько поколений (Generation Language, GL). (Пятое поколение -- языки программирования или прикладные системы? PC Week/RE Сергей Бобровский 1997). Каждое из последующих поколений по своей функциональной мощности качественно отличается от предыдущего. К сегодняшнему дню насчитывается пять поколений ЯП.
В первое поколение (1GL) входят языки, созданные в 40-50 гг., когда компьютеры только появились на свет. В то время программы писались в машинных кодах, то есть каждая компьютерная команда вместе с ее операндами вводилась в ЭВМ в двоичном виде. Это требовало огромных усилий по набору цифровых текстов и приводило к множеству трудноуловимых ошибок. Конечно, ни о каких мало-мальски больших проектах речи идти не могло. Ситуация качественно изменилась в середине 50-х годов, когда был написан первый ассемблер , что само по себе можно считать подвигом, учитывая довольно сложную логику программы. Хотя этот ассемблер был неполноценным в сегодняшнем понимании, но он позволял задавать названия команд в символическом виде и указывать числа не только в двоичном, но и в десятичном или шестнадцатиричном формате, что существенно облегчало работу программистов. Языки первого поколения продолжают использоваться и сегодня, хотя в значительно меньшем объеме. Чаще всего приходится писать программы в машинных кодах для новых микропроцессоров, для которых еще не разработаны компиляторы, поддерживающие требуемый набор команд.
Расцвет второго поколения языков программирования (2GL) пришелся на конец 50-х - начало 60-х годов. Был создан символический ассемблер, позволявший писать программы без привязки к конкретным адресам памяти. В него было введено понятие переменной, и он по сути стал первым настоящим (хоть и машинно-ориентированным) языком программирования со своим компилятором. Скорость создания и эффективность программ резко возросли. Ассемблеры активно применяются в настоящее время, как правило, для создания программ, максимально использующих возможности аппаратуры -- различных драйверов, модулей состыковки с нестандартным оборудованием и т. д. В некоторых областях, например, в машинной графике, на ассемблере пишутся библиотеки, эффективно реализующие стандартные алгоритмы обработки изображений. Кроме того, среди программистов просто есть немало людей, предпочитающих использовать ассемблер в своей работе. Как правило, это специалисты, хорошо разбирающиеся в электронике.
Третье поколение ЯП (3GL) принято относить к 60-м годам. В это время родились языки, которые называют универсальными языками высокого уровня, с их помощью можно решать задачи из любых областей. Это общеизвестные Фортран, Кобол, Алгол и др. Такие качества новых языков, как относительная простота, независимость от конкретного компьютера и возможность использования мощных синтаксических конструкций позволили резко повысить производительность труда программистов. Кроме того, понятная большинству пользователей процедурная идеология этих языков позволила привлечь к написанию небольших программ (как правило, расчетного или учетного характера), большое количество специалистов из некомпьютерных областей. Подавляющее большинство языков 3GL успешно применяется и сегодня. Современные компиляторы с интегрированными средами разработки предоставляют очень удобные средства поддержки процесса создания программ, легко осваиваемые студентами компьютерных специальностей первых курсов, благодаря чему простые в освоении языки 3-го поколения используются для разработки программ абсолютным большинством людей, зарабатывающих на жизнь программированием. Практически все современные коммерческие продукты, рассчитанные на массовый рынок, написаны на языках 3-го поколения.
С начала 70-х годов по настоящее время тянется период языков четвертого поколения (4GL). После первых восторгов по поводу безграничных способностей ЭВМ стали более ясны возможности существующих языков программирования. Несмотря на рождение новых технологий (ООП, визуальное программирование, CASE-методологии, системный анализ), процесс создания больших программных комплексов оказался очень трудоемкой задачей, так как для реализации крупных проектов требовался более глобальный подход к решаемым задачам, чем предлагали имевшиеся средства разработки. Языки 4GL частично снимали эту проблему. Целью их создания было в первую очередь стремление к увеличению скорости разработки проектов, снижение числа ошибок и повышение общей надежности работы больших программных комплексов, возможность быстрого и легкого внесения изменений в готовые проекты, упрощение самих языков для конечного пользователя, активное внедрение технологий визуальной разработки и т. д. Все средства разработки 4-го поколения имеют мощные интегрированные оболочки и обладают простым и удобным пользовательским интерфейсом. Они чаще всего используются для проектирования баз данных и работы с ними (встроенные языки СУБД), что объясняется возможностью формализации всех понятий, используемых при построении реляционных баз данных. Языки 4GL активно применяются в различных специализированных областях, где высоких результатов можно добиться, используя не универсальные, а проблемно-ориентированные языки, оперирующие конкретными понятиями узкой предметной области. Как правило, в эти языки встраиваются мощные примитивы, позволяющие одним оператором описать такую функциональность, для реализации которой на языках младших поколений потребовалось бы написать тысячи строк кода.
Однако пользователям, использующим языки 4GL для создания законченных приложений, по прежнему необходимо кодировать программу вручную, используя обычный процесс последовательного ввода команд. При этом сохраняется главный недостаток языков предыдущих поколений. Он заключается в том, что все они в значительной степени ориентированы на чуждую человеческому мышлению чисто компьютерную идеологию (работа с памятью, переменными, базами данных, последовательностями абстрактных операторов и т. п.), что требует от людей хорошего понимания принципов функционирования компьютера и операционных систем. Кроме того, парадигма функционального программирования по прежнему присутствует в языках 4GL во всей полноте, не позволяя перейти к более высокому уровню абстракций при разработке программных систем.
Рождение языков пятого поколения относится к настоящему времени. Довольно неожиданно вокруг самого названия 5GL разгорелись жаркие споры. Возникло несколько программистских "школ", представители каждой из которых имеют свое мнение о том, какие средства разработки считать языками 5-го поколения, а какие нет. Например, на страницах лондонского журнала SURPRISE (Surveys and Presentations in Information Systems Engineering), выпускаемого при поддержке английских министерств по электронике и вычислительной технике, публикуются статьи известных специалистов в компьютерной области -- профессоров Лондонского научного колледжа, разработчиков популярных английских программ и др. Представители "английского" направления рассматривают средства разработки 5-го поколения в более широком аспекте, чем это принято делать в отношении обычных языков программирования. Они считают, что к системам 5GL можно отнести не только новые мощные языки, но и системы создания программ, ориентированные на непрограммиста. Подобные системы отличаются стремлением предоставить конечному пользователю-неспециалисту богатые возможности создания прикладных программ с помощью визуальных средств разработки без знания программирования. Главная идея, которая закладывается в эти системы 5GL -- возможность компьютерного интерактивного или полностью автоматического преобразования инструкций, вводимых в систему наиболее удобными человеку методами в максимально наглядном виде, в текст на универсальных языках программирования, описывающий готовую программу. Наличие подобного промежуточного этапа (получение не готового исполняемого модуля, а только исходных текстов, требующих дальнейшей обработки) объясняется низкой эффективностью автоматически генерируемого кода приложений, созданных с использованием подобных систем 5-го поколения, связанной с внутренней сложностью последних, и стремлением создавать независимые от платформы продукты. Исходные тексты обычно генерируются на языках более низкого уровня, как правило, третьего поколения. Благодаря автоматическому процессу получения текстов программы результирующий код получается хоть и неэффективным, но высоконадежным и не содержащим ошибок. Правда, при этом возникает проблема совместимости с имеющимися на рынке компиляторами. После генерации кода созданного приложения необходимо перевести его в машинное представление. Для этого требуется тесная интеграция с имеющимися коммерческими компиляторами, легкая настройка, ориентированная на пользователя- непрограммиста и соответствие получаемого кода требованиям конкретных средств разработки. В большинстве случаев из-за острой конкурентной борьбы решить проблему совместимости в целом не удается, поэтому системы разработки 5GL ориентируются обычно на определенные версии компиляторов.
Ряд современных языков 5GL созданы на основе успешно реализованных продуктов 4GL, и граница между этими поколениями сильно размыта. Пока системы разработки 5-го поколения только появляются на свет, и нередко аббревиатура 5GL используется больше для рекламы -- дескать смотрите, мы впереди конкурентов!
Таким образом, определенная часть компьютерных экспертов считают продукты последнего поколения уже не языками, а средствами разработки, прикладными пакетами, не имеющими к процессу создания программ с помощью ЯП никакого отношения. Проектирование программы происходит в специализированном визуальном редакторе, и работа с исходными текстами отсутствует.
Пока сложно сказать, насколько успешной окажется тенденция стремления к полной и недостижимой универсальности. На практике с помощью систем 5GL этого направления пока удавалось создать небольшие и логически простые приложения, которые при реализации на языках 3-го поколения потребовали бы не более 10 000 исходных строк кода. При попытках разработки сложных программ возникает проблема, типичная для более старых языков -- необходимость отладки, что требует от пользователя высокой квалификации.
Языки 5GL, ориентированные на конкретные области применения, уже в ближайшее время могут завоевать самую широкую популярность. Наиболее вероятно это для продуктов, позволяющих создавать приложения для работы с базами данных, области информатики, наиболее успешно поддающейся формализации. Наглядное подтверждение этому -- тенденции развития практически всех известных СУБД корпоративного уровня. Вслед за встроенными языками СУБД появляются и другие проблемные ЯП. Кроме того, универсальные языки логического программирования наподобие Пролога , основанные на мощных математических аппаратах, совсем не канули в Лету, как может иногда показаться на фоне мелькания сплошных Си и Яв читающим российскую компьютерную прессу. Эти языки продолжают более чем успешно развиваться, другое дело, что для их грамотного применения требуется высокая культура программирования (и проектирования) в сравнении с тем же Си++. И используются они для несколько других задач, чем создание коробочных бухгалтерий (хотя для этих целей они также подходят значительно лучше Си или Паскаля). Неудивительно, что в нашей стране мощными зарубежными средствами разработками, реализующими алгоритмы искусственного интеллекта или имеющими в своей основе уникальные математические теории, нередко наиболее активно интересуется ФАПСИ, что явствует хотя бы из открытых семинаров ведущих российских фирм-дистрибьютеров соответствующих продуктов. Хочется надеяться, что рано или поздно и коммерческие фирмы поймут выгоду использования хоть и дорогих, но очень мощных по своим возможностям систем создания приложений сверхвысокого уровня.
Какой язык проще, а какой сложнее? Было проведено исследование (PC Week/RE #42-43, 1998, Арифметика синтаксиса Сергей Свердлов), где в качестве меры сложности языка программирования количественные характеристики формализованного описания его синтаксиса (общее число лексем – подробности ниже).
Правила, записанные на РБНФ - расширенные формулы Бэкуса-Наура (РБНФ), (как и текст на языке программирования) состоят из отдельных элементов – лексем. Лексемами являются названия понятий, называемые в теории формальных языков нетерминальными символами или просто нетерминалами. Общее число лексем в описании синтаксиса языка может служить обобщенной характеристикой размера этого описания. Число лексем использовать в качестве меры объема гораздо лучше, чем, скажем, число знаков в описании. В этом случае значение нашего критерия не будет зависеть от того, на каком языке (русском, английском) или какими конкретно словами названы нетерминалы – понятия языка. Число различных нетерминалов – следующая характеристика, которую мы будем вычислять. Количество используемых для описания языка понятий – несомненно важнейшее свойство, от которого зависит легкость освоения этого языка. Можно заметить, что число нетерминалов должно быть равно числу правил в описании синтаксиса, поскольку для каждого понятия обязано существовать ровно одно правило. Набор и количество различных терминальных символов языка, упомянутых в синтаксических формулах, характеризуют лексику языка – набор знаков и специальных символов. Во всех обсуждаемых нами языках существуют служебные слова, которые могут употребляться только в строго определенном смысле. Их, программист, вообще-то, должен знать наизусть. Подсчет количества служебных слов позволит оценить объем зубрежки.
Результаты
Элементы |
A-60 |
Паскаль |
ТП2 |
ТП5 |
ТП5.5 |
ТП6 |
ОП |
М2 |
О |
О2 |
Си |
Си++ |
Java |
Ада |
Лексемы |
1085 |
1012 |
1184 |
1331 |
1410 |
1488 |
1825 |
887 |
765 |
726 |
917 |
1662 |
1771 |
2206 |
Нетерминалы |
119 |
110 |
124 |
127 |
135 |
143 |
180 |
70 |
62 |
43 |
917 |
126 |
174 |
226 |
Терминалы |
92 |
84 |
87 |
87 |
87 |
89 |
90 |
88 |
90 |
91 |
123 |
131 |
121 |
102 |
Служебные слова |
25 |
35 |
42 |
48 |
52 |
55 |
83 |
39 |
32 |
34 |
27 |
47 |
48 |
63 |
Р
езультаты
приведены на рис. 4. Линия Вирта,
начинающаяся от Алгола-60 и образованная
языками Паскаль, Модула-2, Оберон и
Оберон-2, автором которых является
Никлаус Вирт, и, что самое главное, линия,
которой Вирт неуклонно придерживается:
наращивание мощи языка без его усложнения.
Паскаль намного богаче Алгола, но не
сложнее его. Модула существенно мощнее
и совершеннее Паскаля, но проще. Оберон
обогатил Модулу средствами
объектно-ориентированного программирования
– расширяемыми записями, и при этом не
только не стал более сложным, но заметно
упрощен. Удивительным выглядит то, что
Оберон-2 оказался проще Оберона,
расширением которого является.
В отношении размера определения синтаксиса так оно и есть. Да и по существу нововведения Оберона-2 оформлены очень экономно. Кроме того авторы языка объединили отдельные правила для каждой разновидности операторов в одно правило для нетерминала "Оператор". То же сделано в отношении правил для типов. По-другому, более компактно, определен синтаксис некоторых конструкций. И хотя получившееся упрощение отчасти формальное, но экономия понятий – это именно то, к чему и следует стремиться, как заметил еще У.Оккам почти 700 лет назад. Кроме того, что остаются простыми формальные описания синтаксиса языков Н.Вирта, очень лаконичны и полные тексты спецификаций этих языков. Сравнивая авторское описание Паскаля, тоже очень небольшое, и описания языков Оберон и Оберон-2, можно увидеть как маэстро совершенствовал свое мастерство. Я очень рекомендую специалистам по Си++ и Яве почитать спецификацию Оберона, даже если вы не собираетесь использовать этот язык. Всего 20 страниц! И при том, это документ, необходимый и достаточный для реализации языка. Сравните с аналогичного назначения книгами Б. Строуструпа и Д. Гослинга по Си++ и Яве.
Линия Борланд берет начало от виртовского Паскаля, а дальше "все выше и выше и выше...". Версии Турбо - Борланд - Объектного Паскаля становятся сложнее и сложнее. По другому просто не может быть, поскольку, избрав однажды путь расширения старого языка с сохранением обратной совместимости, язык можно только усложнять. Отказаться от чего-либо уже невозможно. Недаром по линии Борланд идет монотонный рост всех без исключения критериев.
Что же в результате. Из простого и изящного Паскаля получился язык, приближающийся по сложности к языку Ада. По большому счету Паскаль в версии Борланд (Inprise) уже не может считаться общемировым языком программирования. Это фирменный язык одной не очень большой американской компании. В этом смысле он ничем не отличается от Бейсика, языка другой, правда более крупной фирмы. Отсутствие переносимости даже делает не вполне правомерным сравнение этого языка с Си, Си++, Явой, Модулой, Обероном и Адой.
Одним из неожиданных результатов измерений стало то, что Си оказался не простым, а очень простым языком. По некоторым параметрам он даже проще Оберона. Недаром же он завоевал в свое время такую популярность. И в самом деле Си весьма гармоничен. И хотя поощряемый им стиль принимают не все, но в изяществе языку не откажешь. Ничего хорошего в смысле простоты нельзя сказать про Си++. Сейчас признание чрезмерной сложности этого языка стало общим местом. Так что неожиданностей наши измерения не дали. Разве что можно заявить о том, что Си++ сложнее Си практически вдвое. Вообще, если Си – конструкция весьма цельная, то Си++ представляется достаточно противоестественным соединением языка с незамаскированными понятиями низкого уровня и высокоуровневой концепции объектов. К тому же, мне кажется, что популярность Си возникла естественным путем., а Си++ – искусственно "раскрученный" язык.
Судя по вычисленным нами критериям Ява не только не может считаться простым, но является одним из самых сложных языков, более сложным чем Си++, и вдвое более сложным чем Оберон.
