Формализованные языки программирования примеры. Формальные языки и грамматики

Программирование - это целая наука, позволяющая создавать компьютерные программы. Она включает в себя огромное количество различных операций и алгоритмов, которые образуют единый язык программирования. Итак, что же это такое и какими бывают языки программирования? В статье даны ответы, а также приведен обзорный список языков программирования.

Историю возникновения и изменения программных языков следует изучать наравне с историей развития компьютерных технологий, ведь эти понятия связаны между собой напрямую. Без языков программирования невозможно было бы создать никакую программу для работы компьютера, а значит, создание вычислительных машин стало бы бессмысленным занятием.

Первый машинный язык был придуман в 1941 году Конрадом Цузе, который является изобретателем аналитической машины. Чуть позже, в 1943 г., Говард Эйкен создал машину "Марк-1", способную считывать инструкцию на уровне машинного кода.

В 1950-х годах начался активный спрос на разработку программного обеспечения, а машинный язык не выдерживал большие объемы кода, поэтому был создан новый способ общения с компьютерами. "Ассемблер" является первым мнемоническим языком, заменившим машинные команды. С годами список языков программирования только увеличивается, ведь область применения компьютерных технологий становится обширнее.

Классификация языков программирования

На данный момент существует более 300 языков программирования. Каждый из них имеет свои особенности и подходит для одной определенной задачи. Все языки программирования можно условно разделить на несколько групп:

  • Аспектно-ориентированные (основная идея - разделение функциональности для увеличения эффективности программных модулей).
  • Структурные (в основе лежит идея создания иерархической структуры отдельных блоков программы).
  • Логические (в основе лежит теория аппарата математической логики и правил резолюции).
  • Объектно-ориентированные (в таком программировании используются уже не алгоритмы, а объекты, которые принадлежат определенному классу).
  • Мультипарадигмальные (сочетают в себе несколько парадигм, и программист сам решает, каким языком воспользоваться в том или ином случае).
  • Функциональные (в качестве основных элементов выступают функции, которые меняют значение в зависимости от результатов вычислений исходных данных).

Программирование для начинающих

Многие задаются вопросом, что же такое программирование? По сути, это способ общения с компьютером. Благодаря языкам программирования мы можем ставить перед различными устройствами определенные задачи, создавая специальные приложения или программы. При изучении данной науки на начальном этапе самое главное - это выбрать подходящие (интересные для вас) языки программирования. Список для начинающих приведен ниже:

  • Basic придуман в 1964 году, относится к семейству высокоуровневых языков и используется для написания прикладных программ.
  • Python ("Питон") довольно легко выучить благодаря простому читаемому синтаксису, преимущество же в том, что на нем можно создавать как обычные десктопные программы, так и веб-приложения.
  • Pascal ("Паскаль") - один из древнейших языков (1969 г.), созданных для обучения студентов. Его современная модификация имеет строгую типизацию и структурированность, однако "Паскаль" - вполне логичный язык, который понятен на интуитивном уровне.

Это не полный список языков программирования для начинающих. Существует огромное количество синтаксисов, которые доступны для понимания, и обязательно будут востребованы в ближайшие годы. Каждый вправе самостоятельно выбрать то направление, которое будет интересным для него.

Новички имеют возможность ускорить изучение программирования и его основ благодаря специальным инструментам. Основной помощник - это интегрированная среда разработки программ и приложений Visual Basic («Визуал Бейсик» одновременно является и языком программирования, который унаследовал стиль языка Basic 1970-х годов).

Уровни языков программирования

Все формализованные языки, предназначенные для создания, описания программ и алгоритмов для решения задач на компьютерах, делятся на две основных категории: языки программирования низкого уровня (список приведен ниже) и высокого уровня. Поговорим о каждом из них отдельно.

Низкоуровневые языки предназначены для создания машинных команд для процессоров. Главное их преимущество в том, что они используют мнемонические обозначения, т. е. вместо последовательности нулей и единиц (из двоичной системы счисления) компьютер запоминает осмысленное сокращенное слово из английского языка. Самые известные языки низкого уровня - это "Ассемблер" (существует несколько подвидов этого языка, каждый из которых имеет много общего, а отличается лишь набором дополнительных директив и макросов), CIL (доступен в платформе.Net) и Байт-код JAVA.

Языки программирования высокого уровня: список

Высокоуровневые языки созданы для удобства и большей эффективности приложений, они являются полной противоположностью низкоуровневых языков. Их отличительная черта - наличие смысловых конструкций, которые емко и кратко описывают структуры и алгоритмы работы программ. В языках низкого уровня их описание на машинном коде было бы слишком длинным и непонятным. Языки же высокого уровня обладают независимостью от платформы. Вместо них функцию транслятора совершают компиляторы: они переводят текст программы в элементарные машинные команды.

Следующий список языков программирования: C ("Си"), C# ("Си-шарп"), "Фортран", "Паскаль", Java ("Ява") - входит в число самых используемых высокоуровневых синтаксисов. Он обладает следующими свойствами: эти языки работают с комплексными структурами, поддерживают строковые типы данных и операции с файлами ввода-вывода информации, а также имеют преимущество - с ними гораздо проще работать благодаря читабельности и понятному синтаксису.

Самые используемые языки программирования

В принципе, написать программу можно на любом языке. Вопрос в том, будет ли она работать эффективно и без сбоев? Вот почему для решения различных задач следует выбирать наиболее подходящие языки программирования. Список по популярности можно охарактеризовать так:

  • языки ООП: Java, C++, Python, PHP, VisualBasic и JavaScript;
  • группа структурных языков: Basic, Fortran и Pascal;
  • мультипарадигмальные: C#, Delphi, Curry и Scala.

Область применения программ и приложений

Выбор языка, на котором написана та или иная программа, во многом зависит от области ее применения. Так, например, для работы с самим "железом" компьютера (написания драйверов и поддерживающих программ) лучшим вариантом станет C ("Си") или С++, которые входят в основные языки программирования (список смотрите выше). А для разработки мобильных приложений, в том числе игр, следует выбрать Java или С# ("Си-шарп").

Если вы еще не определились, в каком направлении работать, то рекомендуем начать изучение с языков C или C++. Они имеют весьма понятный синтаксис, четкое структурное разделение на классы и функции. К тому же, зная C или С++, можно с легкостью выучить любой другой язык программирования.

Виды программирования Языки программирования - это формальные языки специально соз-данные для общения человека с компьютером. Каждый язык програм-мирования, равно как и естественный» язык (русский, английский и т.д.), имеет алфавит, словарный запас, свою грамматику и синтаксис, а также семантику.

Алфавит - фиксированный для данного языка набор основных сим-волов, допустимых для составления текста программы на этом языке. Синтаксис - система правил, определяющих допустимые конструк-ции языка программирования из букв алфавита. Семантика - система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных. При описании языка и его применении используют понятия языка. Понятие подразумевает некоторую синтаксическую конструкцию и оп-ределяемые ею свойства программных объектов или процесса обработ-ки данных. Взаимодействие синтаксических и семантических правил определяют те или иные понятия языка, например, операторы, идентификаторы, переменные, функции «процедуры, модули и т.д. В отличие от естественных языков правила грамматики и семантики для языков программиро-вания, как и для всех формальных языков, должны быть явно, одно-значно и четко сформулированы. Языки программирования, имитирующие естественные языки, обла-дающие укрупненными командами, ориентированными на решение прикладных содержательных задач, называют языками «высокого уров-ня». В настоящее время насчитывается несколько сотен таких языков, а если считать и их диалекты, то это число возросло до нескольких тысяч. Языки программирования высокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков. Во-первых, ма-шинная программа, в конечном счете, записывается с помощью лишь двух символов О и I. Во-вторых, каждая ЭВМ имеет ограниченный на-бор машинных операций, ориентированных на структуру процессора. Как правило, этот набор состоит из уравнительно небольшого числа простейших операций, типа: переслать число в ячейку; считать число из ячейки; увеличить содержимое ячейки на +1 и т.п. Команда на машин-ном языке содержит очень ограниченный объем информации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содер-жит код и адреса ячеек, с содержимым которой выполняется закодиро-ванное действие.

Языки программирования высокого уровня имеют следующие дос-тоинства:

Алфавит языка значительно шире машинного, что делает его гораздо боли выразительным и существенно повышает наглядность и понят-ность текста;

Набор операций, допустимых для использования, не зависит от на-бора машинных операций, а выбирается из соображений удобства фор-мулирования алгоритмов решения задач определенного класса;



Конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде;

Используется аппарат переменных и действия с ними;

Поддерживается широкий набор типов данных. Таким образом, языки программирования высокого уровня являются машинно-независимыми и требуют использования соответствующих программ-переводчиков (трансляторов) для представления программы на языке машины, на которой она будет исполняться. Алгоритмическое программирование. На заре вычислительной техники компьютеры имели весьма небольшой по современным меркам объем оперативной памяти, который достигал десятков ки-лобайт. Обычный размер программ тех лет составлял несколько де-сятков строк кода. Такие программы разрабатывали методом алго-ритмического программирования: сначала готовили алгоритм в ви-де наглядной блок-схемы, а потом записывали его операторами того или иного языка программирования. Программа, составленная методом алгоритмического програм-мирования, начинается в одной точке, затем последовательно ис-полняет все инструкции и завершается в другой точке. Конечно, та-кие программы могут иметь и циклы, и ветвления, но общая логика работы программы все-таки последовательная: от начала к концу. Языки программирования 50-70 гг. XX в. были рассчитаны на алгоритмическое программирование. Основными языками тех лет были ФОРТРАН и АЛ ГОЛ-60. Язык ФОРТРАН имел упрощенный синтаксис, и его предпочитали инженеры, а язык АЛГОЛ-60 отли-чался строгими требованиями, и его предпочитали ученые, в основ-ном математики и физики. Несколько позже, в середине 60-х гг. был разработан язык алгоритмического программирования Бейсик, который и сегодня используют для начального знакомства с алгорит-мами и алгоритмическим программированием. Если цель обучения программированию состоит только в освоении приемов создания простейших алгоритмов, то язык Бейсик для этого вполне достато-чен. Процедурное программирование. Понятие подпрограммы было введено еще в ранних языках программирования. В алгоритмиче-ском программировании их использовали для того, чтобы выделить в отдельные блоки некоторые часто повторяющиеся операции. Обычно программа, записанная на алгоритмическом языке, содер-жит до десятка подпрограмм, которые делают ее более понятной. При желании без них можно обойтись, просто текст программы становится несколько более запутанным. В 70-х гг. XX в. размеры оперативной памяти компьютеров дос-тигли сотен килобайт. Появились дисковые накопители, с которыми программы могли обмениваться данными без участия человека. Это позволило увеличить размеры программ до тысяч операторов, и то-гда недостатки языков алгоритмического программирования стали сдерживать работу программистов. Если написать на алгоритмическом языке очень длинную про-грамму, то с ней трудно разобраться. Переходы из одних мест в другие кажутся запутанными, а большое количество переменных не укладывается в голове. Легко забыть, что хранится в той или иной переменной, и перепутать их имена. Выход из тупика был найден в более широком использовании подпрограмм. Программа, записанная на языке процедурного про-граммирования, выглядит как множество циклов, вложенных друг в друга. Она непрерывно «крутится» в этих циклах и время от време-ни вызывает исполнение функций и процедур. Даже если в про-грамме тысячи строк, разобраться с ней становится гораздо проще. Программист всегда может легко определить, внутри какого цикла в данный момент работает программа, и если там происходит какой-то сбой, то быстро выясняются имена подпрограмм, которые могут его вызвать. Алгоритмы для процедурного программирования тоже можно изображать графически, только называются они не блок-схемами, а структурными диаграммами. Вход в программу обычно один, но выходов из нее (в отличие от алгоритмического программирования) может быть много, и они не всегда размещаются в конце листинга. Для выхода из программы достаточно просто из любого места вы-звать завершающую процедуру. Первым языком процедурного программирования стал язык Пас-каль (Pascal). Это не значит, что на нем нельзя писать программы методом алгоритмического программирования, просто для проце-дурного программирования он подходил лучше, чем любой другой язык своего времени. Вскоре появился другой популярный язык процедурного программирования - СИ (С). Все первые языки, предназначенные для создания баз данных (Clipper, dBASE II, Fox-Pro, Paradox и мн. др.), тоже были рассчитаны на процедурное про-граммирование. Средствами процедурного программирования была создана ос-новная масса программ 70-80 гг. XX в. Большинство программ для MS-DOS (текстовых редакторов, бухгалтерских систем, баз данных и т. п.), используемых и по сей день, тоже были созданы этим прие-мом. Так же создавалось и большинство компьютерных игр для MS-DOS вплоть до начала 90-х гг. Усложнение подпрограмм. С развитием процедурного програм-мирования программисты поняли, какую огромную роль имеют подпрограммы. Неожиданно выяснилось, что программы самых разных классов - от служебных до игровых, могут быть очень по-хожи по структуре, а различаются лишь содержанием подпрограмм. Тогда программисты стали пытаться сделать подпрограммы такими, чтобы их можно было использовать многократно в разных проек-тах. Отдельные процедуры и функции стали приобретать такую мощь, что одним вызовом процедуры можно было выполнить сложнейшие действия, для которых раньше требовались недели программирования. Типизация подпрограмм. Чем мощнее становились процедуры и функции, тем выше был соблазн стандартизовать их так, чтобы без изменений использовать в разных программах. И тогда выяснилось, что одни подпрограммы подходят для этого хорошо, а другие - не очень. Нетрудно присоединить к любой программе процедуру или функцию, которая не обменивается с программой параметрами (ти-па RND), а просто выполняет какое-то действие, но чем больше па-раметров участвует в работе процедуры, тем труднее ее встроить в другую программу без специальной настройки. В итоге к середине 80-х гг. XX в. большинство компаний, вы-пускающих программы, занялись стандартизацией используемых процедур. Объектный подход. Чтобы подпрограммы стали стандартными и могли использоваться без переделок (но с поднастройками) повсе-местно, потребовалось изобрести для них классификацию и разра-ботать принципы их создания, документирования и применения. Эти принципы назвали объектно-ориентированным подходом. Достаточно сложные и мощные подпрограммы, поставлявшиеся вместе с языками программирования, стали считаться стандарт-ными объектами. Их можно было использовать в своих программах после несложной настройки параметров. Возьмем, к примеру, под-программу, выполняющую поиск слов в тексте. Ее можно исполь-зовать в разных программах, причем по-разному. При вызове с од-ними параметрами она способна искать заданные слова по содер-жащимся в них символам, при вызове с другими параметрами - по использованному шрифту, а при вызове с третьим набором пара-метров она не только найдет слова с ошибками, но и исправит их. Объекты стали считаться новыми, особыми типами данных, в которых сочетаются программный код и сами данные. Свойства объектов. С понятием объекта неразрывно связано по-нятие его свойств. Все объекты имеют свойства и различимы по своим свойствам. В итоге использование в программах готовых объектов стало очень простым: вызвали объект, настроили его свойства - получили готовый программный код. Использование готовых объектов с настраиваемыми свойствами позволило созда-вать программы без программирования. Если раньше для рисования правильного треугольника на экране программист должен был писать одну процедуру, а для рисования квадрата - другую, то при объектно-ориентированном подходе он может вызвать стандартный объект Shape (Фигура) и настроить его свойство, отвечающее за количество вершин. Более того, он может еще настроить такие свойства, как толщина, цвет и вид линии (сплошная, пунктирная и т. п.). Настройка свойств объектов выпол-няется простой операцией присвоения значений. То есть для про-граммиста свойства объектов - это обычные, хорошо знакомые пе-ременные, которым можно присваивать значения. Итак, объекты в программировании - это аналог подпрограмм. Свойства объектов - это аналог переменных, используемых в подпрограммах, а аналогом рабочего кода стали методы объектов. Методы объектов - это стандартные процедуры, которые свя-заны со своими объектами. Разным типам объектов соответствуют разные свойства и разные методы. Например, объекты, относящиеся к типу «окно», можно открывать и закрывать - это два типичных метода для окон. Объекты, относящиеся к типу «фигура», можно закрашивать разными цветами -за это отвечает метод, называе-мый заливкой. А с объектом «целое число» связаны знакомые нам методы сложения, умножения, деления и вычитания. Классификация объектов. Если бы объект был просто совокупно-стью методов и свойств, то ничего нового он программистам бы не дал - это была бы самая обычная стандартная подпрограмма с па-раметрами. Раньше каждая компания накапливала библиотеки про-цедур для себя, теперь появилась возможность всемирной стандар-тизации. Теперь, когда компания Borland или Microsoft включает в свою систему программирования класс объектов Frame, то любой программист в мире знает, что при его вызове на экране получится окно. Он также знает, как вызвать метод его закрытия или откры-тия, и каким свойствам надо присвоить значения, чтобы окно полу-чилось нужного размера. То же относится к другим объектам: Shape (Фигура), Table (Таблица) и др. Если сравнить программирование со строительством дома, то во времена процедурного программирования каждая фирма сама лепи-ла и обжигала для себя кирпичи (подпрограммы) и сохраняла в тай-не приемы работы с ними. С введением объектно-ориентированного подхода все программисты получили одинаковые заготовки (объек-ты) для кирпичей, труб, плит и панелей. Для их использования надо знать методы и свойства, связанные с каждым типом.

Наследование свойств и методов. Возможность классификации и стандартизации - не единственное достоинство объектно-ориентированного программирования. Важную роль сыграла также возможность наследования свойств и методов. Если бы все про-граммисты составляли свои программы только из заранее заготов-ленных объектов (стандартных классов), то все программы были бы удивительно похожи. С одной стороны, это хорошо, а с другой - плохо. Для служебных программ, например приложений Windows, это хорошо, потому что упрощается их изучение и освоение. Но для развлекательных программ это плохо: им требуется разнообразие. Но программист не обязан пользоваться только готовыми клас-сами объектов. Он может создавать свои объекты - для этого ему достаточно запрограммировать связанные с ними методы и подго-товить свойства. Более того, программист не должен делать это «с нуля». Он может взять какой-то готовый класс объектов и на его основе создать свой. Большинство методов и свойств ему не при-дется создавать - они наследуются автоматически. Конструирование вместо программирования. Создать программу, рисующую на экране красивое окно, весьма непросто, а использо-вать готовый объект Frame и настроить его свойства, чтобы окно было таким, каким надо, может каждый начинающий программист. После настройки свойств объекта он получает готовый программ-ный код длиной в десятки килобайт, хотя на самом деле присвоил всего лишь несколько значений переменным, выражающим свойст-ва объекта. Так благодаря объектно-ориентированному подходу программи-рование стало превращаться в конструирование программ из гото-вых блоков. Единственное, что остается для ручного программиро-вания, - запись строк, в которых свойства объектов получают нужные значения. Иногда программисты сталкиваются с тем, что для своих задач не находят готовых объектов. В этом случае им приходится дейст-вительно серьезно заниматься программированием, чтобы создать методы и описать свойства нестандартных объектов. Впрочем, и эта задача значительно упрощается, если программист не изобретает новый объект «с нуля», а использует для его создания другой, ранее созданный объект. Таким образом, объектно-ориентированный подход позволил создавать новые программы путем перенастройки старых. Это позволило значительно поднять производительность труда про-граммистов и перейти во второй половине 90-х гг. к созданию про-грамм размером в миллионы строк кода. Наглядный пример - опе-рационная система Windows. Над первой версией (Windows 95) компания Microsoft работала много лет. Сегодня новые версии Win-dows выходят каждый год: 1998 Windows 98 1999 Windows 98 SE 2000 Windows 2000, Windows Me 2001 Windows XP (версии Ноте и Professional) 2002 Windows XP (Server и Advanced Server). Объектно-ориентированные языки программирования. Переход к объектно-ориентированному программированию в середине 80-х годов XX в. состоялся не сразу, а только после создания языков программирования нового поколения. Вместе с новой концепцией программирования были разработаны и новые компиляторы, и биб-лиотеки объектов. Одним из первых объектно-ориентированных языков стал язык СИ++ (C++). Язык Паскаль (Pascal) развился в язык Object Pascal. Появились и другие объектно-ориентированные языки программирования, например язык Java, разработанный кор-порацией Sun Microsystems, - ныне он широко используется при создании приложений, работающих в Интернете. Визуальное программирование В операционной системе Win-dows немало стандартных элементов управления, таких как окна, меню, списки, переключатели, флажки и пр. Стандартны приемы работы с мышью: наведение, щелчок, двойной щелчок и прочие. Эти элементы и приемы управления стали настолько стандартными, что их унаследовало и большинство программ, написанных для ра-боты с Windows. Стандартизация графических элементов управле-ния и приемов работы с ними с помощью мыши позволила вновь изменить стиль программирования и перейти к так называемому визуальному программированию.

Системы визуального программирования. Переход к визуальному программированию наметился еще во времена операционной среды Windows 3.1 (1992-1994), но подлинное развитие новый метод по-лучил только после 1995 г., когда стали появляться специальные программные комплексы, получившие название систем визуального программирования. По-английски они также называются RAD-системами (RAD - Rapid Application Development - среда быст-рой разработки приложений). Языку Object Pascal соответствует система Delphi, языку Бейсик (Basic) - система Visual Basic, языку СИ ++ (C++) - система C++ Builder, языку Java - система Java Builder. Принципы визуального программирования. До визуального про-граммирования программист использовал в работе печатные спра-вочники или программные справочные системы, в которых были описаны правила создания объектов из стандартных классов, при-ведены основные методы и свойства объектов и правила их исполь-зования и настройки. Визуальное программирование позволило во многих случаях отказаться от справочников и создавать объекты с помощью мыши, что и удобно, и наглядно. Общий принцип визу-ального программирования такой. 1. Стандартные классы объектов, например такие, как окна, кнопки, списки, поля, переключатели, флажки и мн. др., представлены в системе визуального программирования в ви-де значков на инструментальной панели. Эти значки называ-ются компонентами. То есть компоненты - это инструменты для создания объектов. 2. Для вставки объекта в свою программу программист выбира-ет нужный компонент, после чего с помощью мыши помеща-ет в заготовку окна (она называется формой) заготовку буду-щего элемента управления. 3. Поместив объект на форму, программист щелчком мыши вы-зывает окно свойств этого объекта и настраивает их. После настройки объект приобретает размеры, местоположение, имя, надпись и т. п. Свойства могут иметь внутренние свой-ства, например, надпись на кнопке может иметь заданный цвет, шрифт, размер и т. п.

4. Точно так же с помощью мыши программист может вызвать окно кода, связанного с объектом, и выполнить настройку ме-тодов объекта. Например, он может сделать так, чтобы при открытии окна раздавался звук, а перед его закрытием возникало предупреждающее сообщение. 5. После размещения всех необходимых элементов управления на форме, настройки их свойств и подключения необходимых методов программа готова. С помощью мыши выдается команда на ее трансляцию. Системы Delphi и C++ Builder выполняют компи-ляцию, а система Visual Basic - интерпретацию. Событийное программирование Существует три стиля управле-ния: командный, диалоговый и пакетный. Это относится не только к программированию, а вообще к любому управлению. Подобие диалоговой работы впервые возникло во второй половине 60-х гг., ко-гда в больших ЭВМ появились многозадачные операционные сис-темы, работавшие в режиме разделения времени. Компьютер одно-временно работал с десятками пользователей, мгновенно пере-ключаясь между ними и их задачами. Каждый пользователь пола-гал, что компьютер работает только с ним. Тогда впервые программисты стали общаться с ЭВМ напрямую. Их рабочие места осна-стили терминалами (монитор + клавиатура). Но диалог происходил не внутри программы, а на уровне операционной системы, то есть либо перед исполнением программы, либо после него. Получив ре-зультат расчета, программист мог повторить расчет с другими дан-ными или внести изменения в программу и вновь запустить ее ис-полнение. До середины 70-х гг. в языках программирования не бы-ло средств для организации диалога. Такие языки появились только после создания персональных компьютеров. Все диалоговые возможности компьютера основаны на том, что программа работает в некоем бесконечном цикле, в ходе которого бесконечно опрашивает внешние устройства управления (клавиату-ру, мышь, модем и др.), а после получения отклика входит в другой цикл и опять что-то опрашивает. Вплоть до конца 80-х гг. програм-мисты отводили сотни строк своих программ реализации этих цик-лов. В итоге прием стал настолько стандартным, что его передали операционной системе, и начиная с Windows 3.0 программист мог не опрашивать устройства управления, а ждать сигнала от Windows. Для операционной системы Windows нажатие клавиш на клавиату-ре, перемещение мыши и нажатие ее кнопок, открытие и закрытие окон, поступление сигналов от внутренних часов, модема, принтера и прочих периферийных устройств, называются событиями. С раз-ными объектами Windows связаны разные события. Например, для окна событиями являются его открытие и закрытие; для текстового поля - его изменение, а для командной кнопки - щелчок мышью, совершенный над ней. При получении от операционной системы сигнала о том, что произошло некое событие, связанное с объектом, автоматически запускается подпрограмма-метод, являющаяся обработчиком данного события. В ней программист может записать ал-горитм действий, которые он хочет выполнить при наступлении со-бытия. Выше мы говорили о том, что с объектами связаны две характеристики: свойства и методы. Теперь мы можем добавить третью - события, связанные с объектами. В качестве реакции на событие объект автоматически запускает подпрограмму-метод, пред-варительно подготовленную программистом, а она, в свою очередь, может вызвать изменение свойств данного объекта или иных объек-тов, а также вызвать другие события, связанные с другими объектами и т. д. Последовательность исполнения программы при ис-пользовании событийного механизма зависит от порядка, в котором наступают те или иные события, и от реакции программных объектов на эти события. Практически все прикладные программы Win-dows основаны на событийном механизме. Действие инструментов рисования в программе Paint зависит от того, на каком из них произошел щелчок (какой инструмент избрал пользователь) и как он управляет мышью в ходе рисования. Действие процедур формати-рования в программе WordPad также зависит от того, какие экран-ные элементы управления зафиксировали событие. Событийный механизм не является свойством тех или иных языков программи-рования - это свойство (и особенность) операционной системы компьютера. При объединении событийного механизма, предостав-ляемого операционной системой, и объектно-ориентированного подхода, предоставляемого языком программирования, образуется отличная возможность для простой реализации диалога с компьютером. Это сочетание и называют событийным программировани-ем.

Язык программирования - искусственный (формальный) язык, предназначенный для записи программ для исполнителя (например, компьютера или станка с числовым управлением). Язык программирования задается своим описанием. Описание языка программирования - это документ, специфицирующий возможности алгоритмического языка. Обычно описание содержит:

· алфавит допустимых символов и служебных (ключевых) слов;

· синтаксические правила построения из алфавита допустимых конструкций языка;

· семантику, объясняющую смысл и назначение конструкций языка.

Языки программирования служат для представления решения задач в такой форме, чтобы они могли быть выполнены на ЭВМ.

Машинный язык, который состоит из команд процессора ЭВМ, также является языком программирования. Но алгоритмы, записанные на машинном языке, трудны для чтения даже программисту-разработчику, кроме того, работа с таким языком требует знания архитектуры конкретного компьютера, поэтому в программировании, как правило, используют языки более высокого уровня, чем машинные языки. Язык высокого уровня - это язык программирования, понятия и структура которого удобны для восприятия человеком и не зависят от конкретного компьютера, на котором будет выполняться программа.

Для того чтобы программу, записанную на языке программирования высокого уровня, можно было выполнить на компьютере, ее надо перевести на машинный язык. Программное средство, выполняющее эту функцию, называется транслятором.

Транслятор - это программа, которая считывает текст программы, написанной на одном языке, и транслирует (переводит) его в эквивалентный текст на другом языке (обычно на машинном языке). Трансляторы бывают двух основных видов: компиляторы и интерпретаторы .

Компилятор преобразует текст исходной программы в набор инструкций для данного типа процессора (машинный код) и далее записывает его в исполняемый файл (exe-файл), который может быть запущен на выполнение как отдельная программа. Другими словами, компилятор переводит программу с языка высокого уровня на низкоуровневый язык.

Интерпретатор в результате трансляции выполняет операции, указанные в исходной программе. При этом программа остается на исходном языке и не может быть запущена на выполнение без интерпретатора.

Разделение на компилируемые и интерпретируемые языки является несколько условным. Так, для любого традиционно компилируемого языка, как, например, Pascal, можно написать интерпретатор, а для любого интерпретируемого языка можно создать компилятор, - например, язык Бейсик, изначально интерпретируемый, может компилироваться без каких бы то ни было ограничений.

Некоторые языки, например Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация. Подобный подход в некотором смысле позволяет использовать плюсы как интерпретаторов, так и компиляторов.

Со времени создания первых программируемых машин человечество придумало уже более двух с половиной тысяч языков программирования. Количество языков программирования постоянно растет, хотя этот процесс явно замедлился. Некоторыми языками пользуется только небольшое число программистов, другие становятся известны миллионам людей. Часть из них узкоспециализированны (предназначены для решения определенного класса задач), а часть - универсальны. Профессиональные программисты иногда применяют в своей работе более десятка разных языков программирования.

Классификацию языков программирования можно вести по нескольким критериям: машинно-ориентированные (ассемблеры) и машинно-независимые, специализированные и универсальные.

К специализированным языкам можно отнести язык АРТ (A utomatically P rogrammed T ools ) - первый специализированный язык программирования для станков с числовым управлением. Язык был разработан группой американских специалистов в 1956–1959 гг. под руководством математика Дугласа Т. Росса. Язык СOBOL (Co mmon B usiness–O riented L anguage ), созданный в США под руководством Грейс Мюррей Хоппер в 1959 г., ориентирован на обработку экономической информации. Математик Грейс Мюррей Хоппер возглавила проект по разработке СOBOL в чине капитана второго ранга, впоследствии она стана контр-адмиралом. Г.М. Хоппер называют “мамой и бабушкой” СOBOLа.


(Grace Murray Hopper)

К специализированным языкам можно отнести и современные языки web-программирования Perl и PHP. Языки Рапира, Е-язык (Россия), SMR (Великобритания), LOGO (США) можно отнести к языкам, предназначенным для обучения программированию.

Самыми распространенными универсальными языками программирования сегодня являются C++, Delphi, Java, Pascal, Visual Basic, Python.

Но, рассматривая языки программирования как самостоятельный объект исследования, можно провести их классификацию по концепции построения языка.

Классификация языков программирования

Языки программирования можно разделить на два класса: процедурные и непроцедурные. Процедурные (императивные ) языки - это языки операторного типа. Описание алгоритма на этом языке имеет вид последовательности операторов. Характерным для процедурного языка является наличие оператора присваивания (Basic, Pascal, С). Программа, написанная на императивном языке, очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер. Программируя в императивном стиле, программист должен объяснить компьютеру, как нужно решать задачу.

Непроцедурные (декларативные ) языки - это языки, при использовании которых в программе в явном виде указывается, какими свойствами должен обладать результат, но не говорится, каким способом он должен быть получен. Непроцедурные языки делятся на две группы: функциональные и логические.

Декларативные языки программирования - это языки программирования высокого уровня, в которых операторы представляют собой объявления или высказывания в символьной логике. Типичным примером таких языков являются языки логического программирования (языки, основанные на системе правил и фактов). Характерной особенностью декларативных языков является их декларативная семантика. Основная концепция декларативной семантики заключается в том, что смысл каждого оператора не зависит от того, как этот оператор используется в программе. Декларативная семантика намного проще семантики императивных языков, что может рассматриваться как преимущество декларативных языков над императивными.

Логические языки

В программах на языках логического программирования соответствующие действия выполняются только при наличии необходимого разрешающего условия на вывод новых фактов из данных фактов согласно заданным логическим правилам. Логическое программирование основано на математической логике (см. “Логические операции. Кванторы ”, “Логические выражения ”).

Первым языком логического программирования был язык Planner, он был разработан Карлом Хьюитом в Лаборатории искусственного интеллекта Массачусетсского технологического института в 1969 г. В этом языке была заложена возможность автоматического вывода (получения) результата из данных и заданных правил путем перебора вариантов (совокупность которых называлась планом). Но самым известным языком логического программирования является ПРОЛОГ (Prolog), который был создан во Франции в Марсельском университете в 1971 г. Аленом Кольмеро (Colmerauer).

Ален Кольмеро
(Alain Colmerauer)

Программа на языке ПРОЛОГ содержит две составные части: факты и правила. Факты представляют собой данные, с которыми оперирует программа, а совокупность фактов составляет базу данных ПРОЛОГа, которая, по сути, является реляционной базой данных. Основная операция, выполняемая над данными, - это операция сопоставления, называемая также операцией унификации или согласования. Правила состоят из заголовка и подцелей. Выполнение программы, написанной на ПРОЛОГе, начинается с запроса и состоит в доказательстве истинности некоторого логического утверждения в рамках заданной совокупности фактов и правил. Алгоритм этого доказательства (алгоритм логического вывода) и определяет принципы исполнения программы, написанной на ПРОЛОГе.

В отличие от программ, составленных на языках процедурного типа, предписывающих последовательность шагов, которые должен выполнять компьютер для решения задачи, на ПРОЛОГе программист описывает факты, правила, отношения между ними, а также запросы по проблеме. Например, пусть у нас есть следующие факты относительно того, кто является чьей мамой:

мама("Даша","Маша").

мама("Наташа","Даша").

Кроме этого, имеется правило, вводящее отношение бабушка:

бабушка(X,Y):-

Теперь мы можем делать запросы на предмет того, кто бабушка того или иного человека, или кто является внучкой (внуком) определенной женщины:

бабушка("Наташа",X).

Ответ на этот запрос система ПРОЛОГ выдаст так:

Возможности применения языка ПРОЛОГ весьма обширны. Среди наиболее известных - применение в символической математике, планировании, автоматизированном проектировании, построении компиляторов, базах данных, обработке текстов на естественных языках. Но, наверное, самое характерное применение ПРОЛОГа - это экспертные системы.

На сегодняшний день существует целый класс логических языков; так, от языка Planner также произошли логические языки программирования QA-4, Popler, Conniver и QLISP. Языки программирования Mercury, Visual Prolog, Oz и Fril произошли уже от языка Prolog.

Функциональные языки

Первым языком функционального типа является язык ЛИСП, созданный в Массачусетсском технологическом институте в 1956–1959 гг. Джоном Маккарти, который в 1956 г. на Дармутской конференции (США) впервые предложил термин “искусственный интеллект”.

Джон Маккарти (John McCarthy)

И хотя до сих пор не утихают споры вокруг этого термина и развившегося научного направления в его рамках, исследователи единодушны в использовании функциональных и логических языков для данной области. Значительное число работ по искусственному интеллекту реализовано на ЛИСПе.

После своего появления ЛИСПу присваивали много эпитетов, отражающих его черты: язык функций, символьный язык, язык обработки списков, рекурсивный язык. С позиций сегодняшней классификации ЛИСП определяется как язык программирования функционального типа, в основу которого положен метод -исчисления (метод -исчисления разработан в 30-е годы прошлого столетия А.Черчем в качестве строгой математической модели для вычислимых функций, см. “Теория алгоритмов” ).

Программа, написанная на функциональном языке, состоит из неупорядоченного набора уравнений, определяющих функции и значения, которые задаются как функции от других значений. Программы и данные ЛИСПа существуют в форме символьных выражений, которые хранятся в виде списковых структур. ЛИСП имеет дело с двумя видами объектов: атомами и списками . Атомы - это символы, используемые для идентификации объектов, которые могут быть числовыми и символьными (понятия, материалы, люди и т.д.). Список - это последовательность из нуля или более элементов, заключенных в круглые скобки, каждый из которых является либо атомом, либо списком. Над списками выполняются три примитивные операции: извлечение первого элемента списка; получение оставшейся части списка после удаления первого элемента; объединение первого элемента списка L и оставшейся части списка Q.

Тексты программ на функциональных языках программирования только описывают способ решения задачи, но не предписывают последовательность действий для решения.

В качестве основных свойств функциональных языков программирования обычно рассматриваются следующие: краткость и простота; строгая типизация; модульность; функции - объекты вычисления; чистота (отсутствие побочных эффектов); отложенные (ленивые) вычисления.

Кроме ЛИСПа, к функциональным языкам относят РЕФАЛ (разработан в середине 60-х годов В.Ф. Турчиным в МГУ им. М.В. Ломоносова), Haskell, Clean, ML, OCaml, F#.

Приведем пример описания известного алгоритма быстрой сортировки списка на языке Haskell:

qsort (x:xs) = qsort elts_lt_x ++ [x]

Qsort elts_greq_x where

elts_lt_x =

elts_greq_x =

Здесь записано, что пустой список уже отсортирован. А сортировка непустого списка состоит в том, чтобы разбить список на три: список элементов, меньших головы исходного списка, голова исходного списка ([x]) и список элементов хвоста исходного списка, больше или равных x.

Объектно-ориентированные языки

Объектно-ориентированные языки - это языки, в которых понятия процедуры и данных, используемых в обычных системах программирования, заменены понятием “объект” (см. статью “Объектно-ориентированное программирование ”). Языком объектно-ориентированного программирования в чистом виде считается SmallTalk, возможности объектно-ориентированного программирования заложены также в Java, C++, Delphi.

Дальнейшее развитие современного программирования связано с так называемым “параллельным программированием”. Для реализации этой технологии разрабатываются специализированные объектно-ориентированные языки. К языкам такого типа относят, например, MC# (mcsharp ) - высокоуровневый объектно-ориентированный язык программирования для платформы.NET, поддерживающий создание программ, работающих в распределенной среде с асинхронными вызовами.

Структура языка программирования

Между существующими языками программирования есть принципиальные расхождения в концепции построения языков, особенно это справедливо для более ранних языков, но все эти языки потому и называются языками программирования, что они с точки зрения внутренней системы построения имеют одинаковое формальное строение.

Любой язык программирования состоит из предложений (операторов). Предложения (как и слова) определены над неким алфавитом С. Синтаксис языка описывает множество предложений над алфавитом С, которые внешне представляют правильно сформированные программы.

Синтаксис языка - это правила получения слов и предложений этого языка. Синтаксис схематически описывается с помощью определенных грамматических правил.

Знание формального языка (алфавита + синтаксиса) хотя и достаточно для установления синтаксической корректности программы, однако недостаточно для понимания ее назначения и способа действий. Значение и способ действия программы на языке программирования уточняются путем задания семантики.

Семантика языка - это правила интерпретации слов формального языка, т.е. установления значения отдельных языковых элементов.

Для определения формальных языков, в том числе для языков программирования, используют БНФ (формы Бэкуса - Наура) и синтаксические диаграммы. Это два взаимозаменяемых способа описания.

При описании языка программирования через БНФ используются следующие обозначения:

1) <..>- определяемое слово;

2) R - правило из синтаксиса для формирования слова;

3) ::= - БНФ-правило.

Каждое R состоит из терминальных слов или лексем языка и, возможно, следующих символов:

· [..] - данный элемент присутствует в БНФ;

· {..} - данное вхождение может быть использовано в БНФ;

· {..}* - данное вхождение может быть использовано в БНФ конечное число раз.

Пример 1. Приведем пример БНФ-правила, определяющего целое число.

Читается это правило так: “Целое число - это символ 0 или последовательность символов, которая может начинаться символом “–”, а далее следует отличная от нуля цифра, вслед за которой может следовать любая конечная последовательность цифр”.

Специальную, схожую с БНФ, форму описания формальных языков представляют синтаксические диаграммы. В синтаксических диаграммах используются три типа элементов: овал/круг, прямоугольник, стрелки. В овалах помещаются терминальные слова или лексемы, в прямоугольниках - определяемые слова. Графическое представление языка через синтаксические диаграммы делает описание языка наглядным.

Пример 2 . Описание целого числа с помощью синтаксической диаграммы.

Согласно Примерной программе, необходимо, чтобы школьники представляли современную классификацию языков программирования, а также ориентировались в областях применения каждого из них. Проще всего изложение данной темы проводить после того, как уже произошло подробное знакомство с одним из языков программирования.

Следует рассказать, почему возникают новые языки и совершенствуются старые: в первую очередь это происходит при поиске средства для быстрого написания сложных программ, которые к тому же не содержали ошибок. Известен пример, когда создание языка АДА (назван так в честь первой женщины-программиста Ады Лавлейс, дочери Байрона) было инициировано в 1974 году в Министерстве обороны США. Американские военные осознали, что они теряют много времени, усилий и денег на разработку и сопровождение встроенных компьютерных систем (например, систем наведения ракет), а трудноуловимые ошибки языков программирования приводят к настоящим катастрофам.

Декларативные языки были очень популярны в конце 80-х - начале 90-х годов прошлого столетия, они были названы языками программирования искусственного интеллекта для компьютеров пятого поколения. Однако надежды на их широкое распространение пока не оправдались. Возможно, потому, что существующие системы функционального и логического программирования не позволяют создавать быстро работающие программы для содержательных задач. Не исключено, что их время просто еще не наступило.

Выбирая стратегию преподавания темы “Алгоритмизация и программирование”, необходимо учитывать, что задача общеобразовательного курса - это в большой степени выработка определенного стиля мышления, формирование наиболее общих навыков, умений и представлений, нежели освоение тех или иных конкретных языков и технических средств программирования. В то же время, такой курс должен служить базой для последующего профессионального изучения программирования в высшей школе или старших классах средней школы (в рамках профессионального обучения).

В настоящее время существуют два наиболее распространенных подхода к преподаванию программирования:

1) преподавание на основе специально разработанного языка учебного языка, ориентированного на обучение основным навыкам программирования;

2) изучение одного или нескольких языков программирования, широко используемых на практике при решении научных и хозяйственных задач (такие языки можно назвать стандартными).

Первый подход часто используется при преподавании основ программирования в младших классах средней школы с использованием специальных языков, например, Рапиры, Е-языка, LOGO. Эти языки учитывают возможности школьников младших классов. Такой подход хорош при углубленном изучении информатики в 5–6-х классах.

Относительно второго подхода можно сказать, что большинство современных реализаций стандартных языков загружено большим количеством технических деталей и сложны в изучении. Тем не менее наиболее приемлемым для общеобразовательной школы, где курс информатики преподается в 8–11-х классах, является обучение теоретическим основам программирования на базе стандартного языка. При этом не обязательно вдаваться в глубины языка. Учащиеся, которых он заинтересует, могут сделать это и сами. Наибольшее внимание следует уделить переходу от алгоритмических структур к их программной реализации на языке программирования.

Здесь стоит отметить, что Pascal первоначально создавался как учебный язык, но со временем получил широкое распространение в качестве стандартного языка и развитие в виде объектно-ориентированного языка с визуальной технологией программирования Delphi. За основу курса в 8–9-х классах можно взять Pascal или Basic, а в качестве расширенного (факультативного) курса в 10–11-х классах ознакомить учащихся с их объектно-ориентированными расширениями (Delphi и Visual Basic). У каждого языка есть свои сторонники и противники, и конечный выбор остается за учителем.

Существует два основных подхода к изучению языка программирования: формальный и “программирование по образцу”. Первый основан на формальном (строгом) описании конструкций языка программирования (синтаксиса языка и его семантики ) тем или иным способом (с помощью синтаксических диаграмм, мета-языка или формального словесного описания, в частности, семантики) и использовании при решении задач только изученных, а следовательно понятных, элементов языка. При втором подходе школьникам сначала выдаются готовые программы, рассказывается, что именно они делают, и предлагается написать похожую программу или изменить имеющуюся, не объясняя до конца ряд “технических” или несущественных, с точки зрения учителя, для решения задачи деталей. При этом говорится, что точный смысл соответствующих конструкций вы узнаете позднее, а пока поступайте аналогичным образом. Второй подход дает возможность так называемого “быстрого старта”, но создает опасность получить полуграмотных пользователей среды программирования, т.е. людей, которые используют в своей практике достаточно сложные конструкции, но не могут четко объяснить, почему в том или ином случае нужно применять именно их, и как они работают. В результате рано или поздно такие “программисты” сталкиваются с ошибками, исправить которые они просто не в состоянии - им не хватает знаний.

Одна из задач школьной информатики - научить именно формальному подходу, в частности, при применении различных определений. И формальное изучение языка программирования этому немало способствует. Но и без хороших примеров (образцов) при обучении программированию школьников не обойтись. И чем младше ученики, тем больше примеров необходимо приводить при описании языка (иногда даже заменяя ими строгое определение). Другое дело, что следует добиваться того, чтобы в результате обсуждения примера все его детали оказались понятны школьникам (обязательно нужно объяснить, как и почему это работает, в том числе опираясь на уже изученный формальный материал). В этом случае сильные ученики получат возможность понять все досконально и смогут использовать полученные знания в дальнейшем, а остальные приобретут конкретные навыки и оставят для себя возможность вернуться при необходимости к формальным определениям позже.

Естественные языки программирования (ЕЯП) определяют следующий шаг развития языков программирования, отличаясь отязыков запросов тем, что пользователь любого уровня освобождается от необходимости освоения каких-либо специальных словарей, грамматики и синтаксиса –предложения ЕЯП весьма похожи на предложения обычной человеческой речи. ЕЯП еще дальше отдаляют пользователя от ВС и ее СПО, существенно повышая интеллектуальный уровень интерфейсапервого с вычислительными ресурсами. В настоящее время на ПК успешно используются ЕЯП с ограниченными возможностями, такие, какClout, Q&A, Savvy Retriever, HAL и др. Основные разработки ЕЯП связываются с задачами ИИ и интеллектуализацией интерфейса в СУБЗ. В этом направлении непосредственную прикладную значимость (особенно в связи с массовым применением ПК) получили различного рода ЕЯП-интерфейсы с ЭВМ. Из ЕЯП такого типа можно отметитьрегламентированные языки (меню, анкетные, инструкций и др.), играющие большую роль в интеллектуализации интерфейса с ЭВМ при использовании различного рода ППО; большую роль они играют в различных системахинтервьюирования ,обучающих, экспертных и др., однако их использование жестко регламентировано определенными рамками, а в случае переноса систем срегламентированными ЕЯП на другие типы ЭВМ зачастую требуются существенные их переделки. Поэтому для более гибкого и естественного общения пользователя с ЭВМ более адекватен именноестественный язык.

Проблема использования естественного языка для организации интерфейса синтеллектуальной ВС на содержательном уровне с интересными иллюстративными примерами хорошо изложена в специальной литературе. Однако по данному вопросу следует сделать одно существенное замечание. Зачастую принимается на веру, чтоестественный язык является наилучшим способом организации интерфейса пользователя с ЭВМ. Данное предположение даже положено в основу проекта ЭВМ 5-го поколения. Однако оно не представляется нам столь ужочевидным.

В целом ряде случаев естественный язык выразителен менееграфического, тщательно отработанныйформальный язык предметной области бывает выразительнееестественного языка (также имеющегонемало недостатков). Более того, многие предметные области (математика, физика, химия, биология и др.) имеют свойязыковый сленг, в ряде случаев существенно отличающийся от обычного естественного языка. Поэтому, развитыйязыковый интерфейс может являтьсясимбиозом естественного иформальных языков либо представлять собойиерархию языков:естественный язык -формальный {структурированный) язык ЭВМ. В любом случае, данная проблема пока еще весьма далека от своего полного решения.

Лекция № 34 прикладное программное обеспечение

План лекции.

1. Прикладное программное обеспечение ЭВМ.

2. Классы пакетов прикладных программ.

3. Основные прикладные средства.

4. Качественные характеристики программного обеспечения.

34.1. Прикладное программное обеспечение эвм

В предыдущем разделе на самом общем уровне обсуждалась структура ППО, основу которого составляют ППП различных типов, назначения и организации. В связи с интенсивным вторжением в человеческую деятельность ПК и массовым характером пользования быстро растет удельный вес ППП в ПО ЭВМ. Учитывая важность данной компоненты, обеспечивающей интерфейс высокого уровня непрофессионального пользователя с вычислительными ресурсами ЭВМ, рассмотрим ее несколько детальнее, основываясь на трех уровнях:

(1) принцип организации ППП;

(2) требования к профессиональной подготовке пользователя;

(3) основные современные группы ППП.

Одной из характерных черт современных ППП является использование принципа синтеза рабочих программ из подпрограмм на основе содержательногоописания задачи на проблемно-ориентированном языке, близком к понятиям и терминам проблемной области пользователя. При таком подходе пользователь посредством специальногоязыка формирования пакета (ЯФП) содержательноописывает отдельную задачу или класс задач(требующих решения), формируяпрограмму генерации конкретного ППП из набора средствфиксированной илирасширяемой программнойсреды (рис. ЗЗа). На основе данной программы генерируется ППП для конкретного приложения со своимвходным языком (ВЯ) общения с пользователем. После создания ППП пользователь работает с ним в процессе решения своих задач. Как правило, описанный принцип организации используется дляпроблемно-ориентированных ППП, когда решаемый ими круг задач достаточно четко определен и задачи связаны какими-либо общими характеристиками, например численными методами, статистическим анализом, моделированием в конкретной предметной области и т.д. Спектр ППП подобной организации весьма широк - отбиблиотечной организации подпрограмм определенной направленности (например, статанализа) досложной программной среды (рис. ЗЗа), требующей специального ЯФП для формального описания предметной области, на которую должен быть ориентирован(сгенерирован) ППП. При создании конкретного пакета используются как средства собственно егопрограммной среды, так и вновь программируемые.

Создание ППП - достаточно длительный и трудоемкий процесс, требующий использования специальных инструментальных средств. Однако в общем случае такие системы оказываются весьма сложными, а создаваемые ими пакеты достаточно далекими от требуемой эффективности. Поэтому одним из способов устранения указанных недостатков является создание специализированных инструментальных систем, ориентированных насемейства проблемно-ориентированных ППП соднородными входными языками иодинаковыми принципами функционирования. Из отечественных средств данного типа можно отметитьмета системы САТУРН иPACKAGE . Так, вPACKAGE подобно другим аналогичным системам выделяются две вышеуказанных фазы:описание искомого ППП на специальном ЯФП (подсистемаКонструктор) игенерация ППП с его входным языком (подсистемаПрепроцессор); при этом обеспечивается технологичность программирования на основных этапахгенерации пакета: (1) описание класса решаемых пакетом задач и методов их решения; (2) создание входного языка ППП; (3) программирование и отладка необходимых программных модулей.

При указанной технологии разработка конкретного ППП начинается с описания на ЯФП подлежащих решению задач в терминах предметной области, т.е. производится программирование функциональных свойств искомого объекта - ППП посредством специальногометаязыка, включаявходной язык, на котором пользователь в последующем должен будет общаться с искомым пакетом. Результатом выполнения оттранслированной ЯФП-программы является искомый ППП с заданным емувходным языком. Таким образом, данная технология в общем случае предполагает наличие двух уровней пользователей- системного, генерирующего ППП с заданной предметной областью, ипроблемного, использующего созданный ППП посредством еговходного языка, близкого к понятиям предметной области или кестественному языку. Естественно, в случае достаточно простой программной среды, узко ориентированного класса решаемых задач и простого ЯФП функциисистемного ипроблемного пользователя может совмещать одно и то же лицо.

В настоящее время компьютерное экспериментирование (КЭ) становится одним из основных средств исследования крупных научно-инженерных, технических и общественных проблем: в космонавтике, ядерной физике и энергетике, прогнозировании и др.,сложность которых не позволяет, с одной стороны, достаточно строго исследовать иханалитически, а с другой - исследовать весьма дорогостоящими экспериментальными методами. Метод КЭ предполагает использование проблемными пользователями наборов различного назначения ППП, которые в силу экспериментального характера работы в значительной степени подвержены различного рода изменениям. Рассмотренный принцип организации ППП обладает достаточно гибкимиадаптационными возможностями для автоматизации подобного типа работ, хорошо отвечая как задачам модификации, так и расширению исходной программной среды пакета. Для повышения интеллектуального уровня интерфейса с пакетом, особенно эксплуатирующимся на ПК массовым пользователем, важную роль играет егографическая составляющая, которая также определяется в развитыхметасистемах проектирования игенерации ППП. Наряду с этим для повышениялогического уровня интерфейса уже существующих популярных ППП создаютсяграфические метасистемы, существенно расширяющиеграфический интерфейс пакетов, делая его более дружелюбным.

В отличие от рассмотренной организации ППП, обеспечивающей их гибкость и адаптируемость к предметной области и выдвигающей ряд требований к профессиональному уровню пользователя, для массового пользователя используется, как правило, жесткая организация, не позволяющая ему модифицировать пакет. Такая организация имеет два основных исполнения: (1) высокийлогический уровеньвходного языка пакета (ВЯП), ориентированного на пользователя и предметную область, ивнутреннего языка пакета, позволяющего создавать в его среде модули, обеспечивающие функции расширения пакета, а также создание документов для конкретных приложений пакета; (2) интерфейс с пакетом обеспечивается только на уровне проблемно-ориентированного ВЯП. Вобоих случаях практика создания ВЯП для пакета использует два основных подхода: (1) создание языка на основе уже существующего ЯВУ (который, как правило, является иязыком реализации пакета) и (2) разработкаоригинального входного языка. Припервом подходе существенно упрощается реализациявходного языка, тогда как для непрофессионального пользователя возникают дополнительные сложности по освоению пакета.Второй подход требует в ряде случаев значительно больших затрат на разработкувходного языка, однако позволяет сделать его легким в освоении и использовании (язык меню, элементы естественного профессионального языка, язык запросов, язык диалоговой графики и др.).

При этом спектр пользовательской ориентированности ВЯП лежит в весьма широком диапазоне - от начинающего пользователя до профессионала в некоторой предметной области. Например,игровые пакеты имеют высокопонятийныйграфический интерфейс и не требуют особого освоения; пакетытекстовых редакторов также имеют развитый языксистемы меню, достаточно высокого понятийного уровня (например пакетMs Word); проблемно-ориентированные пакеты (например,MathCAD, Reduce. Mathematica обеспеченывходным языком, ориентированным на знакомого с математическим языком пользователя. Наконец,внутренний язык пакета ориентирован, главным образом, на программирование функций, непосредственно не поддерживаемых пакетом, либо программированиедокументов для конкретных его приложений. Часто в качествевнутреннего языка используется языкреализации пакета или его модификации (например пакетыReduce. Mathematica и др.); однако в ряде случаеввнутренний язык имеет ориентацию напредметную область пакета имеетвходной язык на основе простой и дружелюбной системы меню ивнутренний С-подобный SALT-язык, позволяющий легко и быстро создавать и выполнять в среде пакета SLT-документы (программы, модули для конкретных приложений пакета)].Сложность внутренних языков ППП различна, требует определенного программистского навыка для их освоения; однако они позволяют создавать развитые библиотеки документов, выполнение которых в среде пакета позволяетсущественно расширять его функции и область приложений.

Наконец, жесткая организация в сочетании с предметно-ориентированным ВЯП ориентирована на относительно небольшие по объему пакеты либо пакеты специальной направленности, но массового применения. В качестве ВЯП, как правило, выступают языки типа меню, диалоговой графики, запросные и др., ориентированные на непрофессионального пользователя. Примером такойорганизации могут служить простые пакеты текстовых редакторов, специальные пакеты и т.д. Вместе с тем более развитые из них располагают макросредствами, позволяющими оформлять на уровнемакросов наиболее часто используемыепоследовательности операций с пакетом (напримерChiWriter , Ms Word , Word Perfect vs . др.).

Согласно своей организации пакеты допускают различных уровней и типов расширения со стороны пользователя: от возможностиполной генерации пакета на конкретные условия применения (с учетом возможности расширения его программной среды) до отсутствия какой-либо возможности расширения пакета. Однако в большинстве случаев современные ППП допускаютрасширения, из которых для проблемного пользователя наиболееестественным способом является созданиебиблиотек (документов, программ, модулей, макросов) навнутреннем языке пакета, решающихзадачи в некоторой предметной области и выполняющихся в среде самого пакета. Целый ряд пакетов допускаютрасширение своих возможностей путем создания каквнешних (относительно основных модулей пакета), так ивстроенных функций. Однако в целяхсовместимости пакетов наиболее целесообразным является расширение пакета за счет еговнешних функций и средств, не дающее возможности пользователю модифицировать (с определенными оговорками)базовую часть пакета, поставляемую и поддерживаемую фирмой-разработчиком.

Большинство современных ППП перед началом использования требуют проведения операции инсталляции, состоящей в настройке пакета на конкретные условияэксплуатации (конфигурация аппаратных средств, режим решения задач и др.). Как правило, инсталляция проводится один раз и выполняется либовнутренними средствами пакета(Ms Word, Quattro и др.), либо посредствомспециальных утилит(Sprint, Mathematica и др.). Для простых пакетовинициализация, как правило, производится каждый раз автоматически при их загрузке средствами операционной системы(Framework , AutoSketch и др.).

Документация, поставляемая с пакетом, должна включать рекомендации по его инсталляции на конкретные условия применения. Рассмотревтри основных принципа организации ППП, кратко обсудимфункциональное наполнение пакетов, которое нафайловом уровне в общем случае можно представить, как: (1)модули обеспечения основных функций пакета; (2) конфигурационные файлы; (3) утилиты общего назначения и расширяющие функции пакета; (4) специализированная БД; (5) библиотека документов для выполнения их в среде пакета; (6) файлы, содержащие справочную, лицензионную информацию по пакету, а также документацию. Как правило, во всех современных ППП прослеживается отмеченнаяструктуризация ихфайловой системы.

Ряд известных пакетов (Expert Choice , Mathematica , MathCAD , Ms Excel и др.) поставляются также на уровне иллюстративных и/или обучающих версий, которые функционально ограничены относительно основного пакета, но позволяют проводить иллюстрацию пакета в действии, а также обучать основам работы в его среде, что в целом ряде случаев позволяет сделать более осознанный выбор данного средства для последующего коммерческого использования.

Конец

Начало

Повторять

Начало

Псевдокоды

Псевдокод представляет собой систему обозначений и правил, предназначенную для единообразной записи алгоритмов. Он занимает промежуточное место между естественным и формальным языком.

С одной стороны, он близок к обычному естественному языку, поэтому алгоритмы могут на нем записываться и читаться как обычный текст. С другой стороны, в псевдокоде используются некоторые формальные конструкции и математическая символика, что приближает запись алгоритма к общепринятой математической записи.

В псевдокоде не приняты строгие синтаксические правила для записи команд, присущие формальным языкам, что облегчает запись алгоритма на стадии его проектирования и дает возможность использовать более широкий набор команд, рассчитанный на абстрактного исполнителя. Однако в псевдокоде обычно имеются некоторые конструкции, присущие формальным языкам, что облегчает переход от записи на псевдокоде к записи алгоритма на формальном языке. В частности, в псевдокоде, так же как и в формальных языках, есть служебные слова, смысл которых определен раз и навсегда. Они выделяются в печатном тексте жирным шрифтом, а в рукописном тексте подчеркиваются. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций. В качестве примера приведем запись на одном из псевдокодов алгоритма:

алгоритм алгоритм Евклида;

пока первое число не равно второму

если числа равны

то стоп все;

иначе определить большее из двух чисел;

з аменить большее число на разность большего и меньшего чисел

конец;

взять первое число в качестве ответа

Этот алгоритм можно записать проще, но для демонстрации основных возможных конструкций псевдокода приведена именно такая запись. В силу своих особенностей псевдокоды, как и другие описанные выше средства записи алгоритмов, ориентированы на человека.

Выше отмечалось, что при записи алгоритма в словесной форме, в виде схемы или на псевдокоде допускается определенный произвол при изображении команд. Вместе с тем такая запись настолько точна, что позволяет человеку понять суть дела и исполнить алгоритм.

Однако на практике в качестве исполнителей алгоритмов используются специальные автоматы - электронные вычислительные машины (ЭВМ). Поэтому алгоритм, предназначенный для исполнения на ЭВМ, должен быть записан на языке, «понятном» ЭВМ. И здесь на первый план выдвигается необходимость точной записи команд, не оставляющей места для произвольного толкования их исполнителем. Следовательно, язык для записи алгоритма должен быть формализован. Такой язык принято называть языком программирования , а запись алгоритма на этом языке - программой для ЭВМ .


Язык программирования - это формализованный язык, который представляет собой совокупность алфавита, правил написания конструкций (синтаксис) и правил толкования конструкций (семантика).

В настоящее время насчитывается несколько сотен языков программирования, рассчитанных на разные сферы применения ЭВМ, т. е. на разные классы решаемых с помощью ЭВМ задач. Эти языки классифицируют по разным уровням, учитывая степень зависимости языка от конкретной ЭВМ.