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

Классификация языков программирования не закреплена каким-либо стандартом. Однако, в учебных целях, существующие языки программирова­ния можно классифицировать по четырём основным группам: процедурные, объектно-ориентированные, функциональные и логические.

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

Одним из первых процедурных языков программирования высокого уровня был Фортран (Fortran), разработанный в начале 50-х гг. фирмой IBM (широко используется в первую очередь в целях научных и инженерных вы­числений). Долгие годы был одним из самых распространенных языков в мире. Одно из преимуществ Фортрана - большое количество написанных и накопленных на нём программ и их библиотек. Ряд таких библиотек создава­лись на протяжении десятилетий и популярны (главным образом в научной среде) по сей день. Современный Фортран приобрёл черты, необходимые для эффективного программирования в среде новых вычислительных архитектур (позволяет применять современные технологии программирования). Фор­тран имеет достаточно большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами. Выразительные средства языка изначально были весьма скудны, поскольку Фортран был одним из первых языков высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, функционального и даже объектно-ориентированного про­граммирования.

В конце 50-х гг. был разработан язык Кобол (COmmom Business Oriented Language - общепринятый деловой язык) – язык программирования, ориен­тированный, в первую очередь, для разработки бизнес приложений (предна­значался для решения экономических задач, обработки данных для банков, страховых компаний и других учреждений подобного рода). Отличительной особенностью языка является возможность эффективной работы с большими массивами данных (что характерно именно для коммерческих приложений). Популярность Кобола столь высока, что даже сейчас, при всех его недостат­ках (его обычно критикуют за многословность и громоздкость) появляются новые его диалекты и реализации. Язык позволяет эффективно работать с большим количеством данных, он насыщен разнообразными возможностями поиска, сортировки и распределения (что и обеспечивает ему долгую жизнь в бизнес приложениях).

В 1960 году был разработан язык Алгол, который предназначался для записи алгоритмов, построенных в виде последовательности процедур, при­меняемых при составлении программ для решения научно-технических за­дач. Язык был достаточно интересен, так как обладал многими уникальными на тот момент характеристиками. Язык появился в результате международ­ного сотрудничества группы специалистов и сыграл большую роль как в ста­новлении основных понятий программирования, так и в обучении програм­мистов. В нем впервые были введены понятия «блочная структура» (внутри блока в Алголе можно вводить локальные обозначения, которые не зависят от остальной части программы), «динамическое распределение памяти» и др. Несмотря на свое интернациональное происхождение, Алгол получил меньшее распространение, чем, скажем, Фортран (из-за более сложной структуры). В 1968 году была создана версия Алгол-68, по своим возможно­стям и сегодня опережающая многие языки программирования, однако из-за отсутствия достаточно эффективных средств, для нее не удалось своевре­менно создать хорошие компиляторы.

В начале 60-х гг. каждый из существующих языков программирования был ориентирован на разные классы задач и предпринимались попытки пре­одолеть этот недостаток путем создания универсального языка программиро­вания. ПЛ/1 (PL/1Programming Language One) – первый многоцелевой универсальный язык, разработан фирмой IBM в середине 60-х гг. (обладает исключительным богатством синтаксических конструкций). При разработке PL/1 широко использовались основные понятия и средства языков Фортран, Алгол, Кобол. Он хорошо приспособлен для решения задач в области вычис­лительной техники: исследования и планирования вычислительных процес­сов, моделирования, решения логических задач и исследования логических схем. PL/I содержит все основные конструкции, характерные для так назы­ваемых языков высокого уровня, а также ряд специфичных средств, удобных для практического программирования (напоминает конструктор с большим числом деталей и пользователю достаточно освоить только те части языка, которые ему практически необходимы). Его операторы довольно емки, что часто позволяет получить запись программы более компактную, чем на других языках. Вместе с тем, PL/I имеет и ряд недостатков, затруд­няющих изучение и использование этого языка. Основные из них: во-первых, имеется много дублирующих друг друга средств и их сложно запомнить, во-вторых, программы получаются не совсем машинно-независимыми.

В середине 60-х гг. был создан специализированный язык программиро­вания, который состоял из простых английских слов и его назвали универ­сальным символическим кодом для начинающих (Beginner's All-purpose Symbolic Instruction Code) или сокращенно Basic (Бейсик). При проектирова­нии языка использовались следующие принципы:

· быть простым в использовании для начинающих;

· быть языком программирования общего назначения;

· предоставлять возможность расширения функциональности;

· быть интерактивным;

· предоставлять ясные сообщения об ошибках;

· быстро работать на небольших программах;

· не требовать понимания работы аппаратного обеспечения;

· быть посредником меду пользователем и операционной системой.

Язык получил самое широкое распространение при работе на персо­нальных компьютерах в режиме интерактивного диалога. Популярность Бей­сика объясняется как простотой его освоения, так и наличием достаточно мощных универсальных средств, пригодных для решения научных, техниче­ских, экономических задач, а также задач бытового назначения. Возникло не­сколько версий этого языка (зачастую мало совместимых друг с другом). Однако, зная одну из них, можно без особого труда освоить любую другую. Начиная с конца 80-х, компьютеры усложнились и стали предоставлять но­вые возможности (такие как графический интерфейс пользователя), делая Бейсик уже не столь удобным для программирования (он начал сдавать свои позиции). Вторую жизнь Бейсик получил с появлением Visual Basic, который стал одним из наиболее часто используемых языков на платформе Microsoft Windows. Позже появились другие варианты, например, вариант Visual Basic for Applications (VBA) и др.

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

· методологию структурного программирования, которая основана на исполь­зовании подпрограмм и независимых структур данных, объеди­няющих связанные между собой совокупности данных (структурный подход обеспечивает создание более понятных и легко читаемых про­грамм, упрощает их тестирование и отладку).

· программирование сверху вниз - задача делится на простые, самостоя­тельно решаемые подзадачи, а на основе решенных подзадач выстраива­ется решение исходной задачи полностью – сверху вниз.

В основу разработки языка Паскаль был положен Алгол-60, но в нем ужесточен ряд требований к структуре программы и имеются возможности, позволяющие успешно применять его для создания крупных проектов. Пас­каль реализован для всех типов компьютеров, в настоящее время использу­ется во многих учебных заведениях для обучению программированию, а также для создания больших реальных проектов. Достоинства языка побу­дили многие организации продолжать разрабатывать и развивать системы программирования на основе языка Паскаль, подвергая язык произвольному расширению, добавляя в него, часто совершенно механически, новые сред­ства и синтаксические конструкции. Наиболее известной такой реализацией Паскаля является система Turbo Pascal (выросшая затем в Borland Pascal и далее в Delphi), в которой язык был значительно расширен, были устранены некоторые недостатки языка, добавлены новые возможности.

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

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

Первым разработанным функциональным языком (1958 г.) стал Лисп(LISP), в основу которого положен серьезный математический аппарат (слово «lisp» имеет также значение «детский лепет», что не случайно, так как тематика, которая интересовала создателя Лиспа была тесным образом связана с исследованиями человеческой речи), ориентированный на разра­ботку программ для решения задач не численного характера. Основная об­ласть применение этого языка - «обработка списков». В виде списков удобно представлять алгебраические выражения, графы, элементы конечных групп, множества, правила вывода и многие другие сложные объекты. Большим достоинством Лиспа является его функциональная направленность, т.е. про­граммирование ведется с помощью функций. Причем функция понимается как правило, соотносящее элементам некоторого класса соответствующие элементы другого класса. Сам процесс сопоставления не оказывает никакого влияния на работу программы, важен только его результат – значение функ­ции. Это позволяет относительно легко писать и отлаживать большие про­граммные комплексы. Ясность программ, четкое разграничение их функций, отсутствие каверзных побочных эффектов при их выполнении является обя­зательными требованиями к программированию таких логически сложных задач, каковыми являются задачи искусственного интеллекта (после появле­ния Лиспа различными авторами был предложен целый ряд других алгорит­мических языков ориентированных на решение задач в области искусствен­ного интеллекта, однако это не помешало ему остаться наиболее популяр­ным языком для решения таких задач). Язык Лисп послужил основой широ­кого спектра исследований и прикладных разработок, оказавших существен­ное влияние на расширение и распространение компьютерных и информаци­онных технологий, по существу являющихся ключевыми для анализа и фор­мирования многих сфер деятельности. На протяжении почти сорокалетней истории его существования появился ряд диалектов этого языка. Различия между ними не носят принципиального характера и в основном сводятся к несколько отличающемуся набору встроенных функций и некоторой разнице в форме записи программ. Поэтому программист, научившийся работать на одном из них без труда сможет освоить и любой другой.

Логическое программирование. Логическое программирование осно­вано на теории и аппарате математической логики с использованием матема­тических принципов резолюций. Концепция логического программирования основана на понятии отношение. Логическая программа – это совокупность аксиом и правил, определяющих отношения между объектом (в терминах ус­ловий или ограничений) и целью (запросом). Процесс выполнения программы представляет собой попытку доказательства логического утверждения, по­строенного из программы по правилам, определенным семантикой исполь­зуемого языка. Результатом вычислений является вывод следствий из аксиом. В реляционном программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность ша­гов, которые требуется выполнить. Это свидетельствует о декларативности языка логического программирования. Она метко выражена в формуле: «ал­горитм = логика + управление». Языки логического программирования ха­рактеризуются:

· высоким уровнем;

· строгой ориентацией на символьные вычисления;

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

· возможной логической неполнотой, поскольку зачастую невозможно выра­зить в программе определенные логические соотношения, а также не­возможно получить из программы все выводы правильные.

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

Самым известным языком логического программирования является Пролог (PROLOG) - язык универсального назначения (разработан в 1973 г.). Он используется для создания прикладных систем различных типов и отно­сится к числу важнейших языков, используемых в символьной обработке, в исследованиях по искусственному интеллекту (экспертных систем, про­грамм доказательства теорем, систем машинного перевода, баз данных, баз знаний и др.). Пролог-программа является собранием правил и фактов. Реше­ние задачи достигается интерпретаций этих правил и фактов. При этом от пользователя не требуется обеспечивать детальную последовательность ин­струкций, чтобы указать каким образом осуществляется управление ходом вычислений на пути к результату. Вместо этого он только определяет воз­можные решения задачи и обеспечивает программу фактами и правилами, которые позволяет ей отыскать требуемое решение (относится к так назы­ваемым декларативным языкам, требующим от автора умения составить формальное описание ситуации). Перечень возможных синтаксических кон­струкций Пролога невелик, и в этом смысле язык прост для изучения. Он реализован практически для всех известных операционных систем и плат­форм (в их число входят OS для мэйнфреймов, всё семейство Unix, Windows, OS для мобильных платформ).

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

· система состоит из объектов;

· объекты некоторым образом взаимодействуют между собой;

· каждый объект характеризуется своим состоянием и поведением;

· состояние объекта задается значением полей данных;

· поведение объекта задается методами.

Таким образом, программа представляет собой набор объектов, имею­щих состояние и поведение. Объекты взаимодействуют посредством сооб­щений. Устойчивость и управляемость системы обеспечивается за счёт чёт­кого разделения ответственности объектов, однозначного определения ин­терфейсов взаимодействия между объектами и полной изолированности внутренней структуры объекта от внешней среды.

Основными (ключевыми) понятиями (принципами) в ОПП являются:

· инкапсуляция – объединение данных и свойственных им процедур обра­ботки в одном объекте, детальная реализация которых остается скрытой для пользователей (принцип, согласно которому любой класс должен рас­сматриваться как «черный ящик», т.е. пользователь класса должен ви­деть и использовать только интерфейсную часть класса и не вникать в его внутреннюю реализацию).

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

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

Инкапсуляция, наследование и полиморфизм - фундаментальные свой­ства, требуемые от языка, претендующего называться объектно-ориентиро­ванным.

Наиболее распространенными современными языками программирова­ния, являются языки С++ и Java. С++ - компилируемый строго типизирован­ный язык программирования общего назначения (разработан в начале 80-х гг.). Он поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную, но наибольшее внимание уделено поддержке объектно-ориентированного программирования. За исключением второсте­пенных деталей он содержит язык Си как подмножество (имеет синтаксис, основанный на синтаксисе Си) и обладает многими новыми возможностями, позволивших резко повысить производительность труда программистов. Ес­тественная область его применение – системное программирование (кроме того, С++ успешно используется во многих областях приложения, выходя­щих за эти рамки). Реализация С++ имеется практически на всех типах ЭВМ и для всех операционных систем. Язык Java зародился как часть проекта соз­дания передового программного обеспечения для различных бытовых элек­тронных приборов. Реализация проекта была начата на языке С++ (синтак­сис языков С++ и Java практически полностью совпадает), но вскоре воз­никли проблемы, наилучшим средством борьбы с которыми было изменение самого инструмента - языка программирования. Изначально этот язык назы­вался Oak (основным достоинством которого было обеспечение сетевого взаимодействия различных по типу устройств), а новая интегрируемая в Internet версия получила название Java (1995 г.). С точки зрения возможно­стей объектно-ориентируемых средств, Java имеет ряд преимуществ перед С++, а потому является одним из самых популярных в мире.

С середины 90-х гг. многие объектно-ориентированные языки реализу­ются как системы визуального программирования. Такие системы имеют ин­терфейс, позволяющий при составлении текста программы видеть те графи­ческие объекты, для которых она пишется. Особенностью этих систем явля­ется наличие в них среды разработки программ из готовых «строительных блоков», позволяющих создавать интерфейсную часть программного про­дукта в диалоговом режиме, практически без написания программных опера­ций. Система берет на себя значительную часть работы по управлению ком­пьютером, что делает возможным в простых случаях обходиться без особых знаний о деталях ее работы. Она сама пишет большую часть текста про­граммы: описания объектов, заголовки процедур и многое другое. Програм­мисту остается только вписать необходимые строки, определяющие индиви­дуальное поведение программы, которые система не в состоянии предвидеть. Но даже в этих случаях система сама указывает место для размещения таких строк. К объектно-ориентированным системам визуального проектирования относятся: Visual Basic, Delphi, C++ Builder, Visual C++.

Языки программирования баз данных. Среди языков особое место занимают языки программирования баз данных. Они отличаются от алгорит­мических прежде всего своим функциональным назначением (специалисты говорят, что это - информационно-логические языки, а не языки программи­рования). При работе с базами данных наиболее часто выполняются следую­щие операции: создание, преобразование, удаление таблиц в базе данных, поиск, отбор, сортировка по запросам пользователей, добавление новых за­писей или модификация существующих, удаление записей и др. Для обра­ботки больших массивов информации и выборки записей по определенным признакам был создан (в начале 70-х гг.) структурированный язык запросов SQL (Structured Query Language), который в дальнейшем (в 1986 г.) стал стандартом языка работы с реляционными базами данных. С помощью SQL программист описывает только то, какие данные нужно извлечь или моди­фицировать, а то, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса (хотя, надо сказать, что ему при этом полезно представлять, как СУБД будет разбирать текст его запроса, особенно при работе с большими базами данных и со сложными запросами). Заметим, что целью разработки SQL было создание простого непроцедурного языка, кото­рым мог воспользоваться любой пользователь, даже не имеющий навыков программирования. Однако, в конце концов, он стал настолько сложным, что превратился в инструмент программиста. Кроме того, практически в каждой СУБД помимо поддержки языка SQL имеется также свой уникальный язык, ориентированный на особенности этой СУБД и не переносимый на другие системы.

Языки программирования для компьютерных сетей. Появление и активное развитие компьютерных сетей вообще и глобальной сети Internet, в частности, стало причиной создания многочисленных версий популярных языков программирования, адаптированных для использования в сетях. Все они отличаются характерными особенностями: языки являются интерпрети­руемыми, интерпретаторы для них распространяются бесплатно, а сами про­граммы - в исходных текстах. Такие языки называют скрипт-языками.

HTML (Hyper Text Markup Language) – универсальный язык разметки гипертекста (представляет собой набор текстов, содержащих узлы пере­хода от одного текста к какому-либо другому, позволяющие избирать чи­таемые сведения или последовательность чтения), используемый для под­готовки Web-документов для сети Internet. Он очень прост, содержит элемен­тарные команды форматирования текста, добавления графических объектов, задания шрифтов и цвета, организации ссылок и таблиц. Текстовые доку­менты, содержащие код на языке HTML (такие документы традиционно имеют расширение html или htm), обрабатываются специальными приложе­ниями, которые отображают документ в его форматированном виде. Эти приложения, называемые браузерами или интернет-обозревателями, обычно предоставляют пользователю удобный интерфейс для запроса Web-страниц, их просмотра (вывода на внешние устройства) и, при необходимости, от­правки введённых пользователем данных на сервер. Наиболее популярными на сегодняшний день браузерами являются Internet Explorer, Firefox, Safari, Google Chrome, Opera.

Perl (Practical Extraction and Report Language – практический язык для извлечения данных и составления отчетов). Основной особенностью языка является его богатые возможности работы с текстом (обработки больших текстовых файлов), генерации текстовых отчетов и управления задачами. В его состав входят многочисленные функции работы со строками, массивами, всевозможные средства преобразования данных, управления процессами, ра­боты с системной информацией и др.

VRML (Virtual Reality Modeling Language язык моделирования вирту­альной реальности) - был создан для организации виртуальных трехмерных интерфейсов в Интернете. Он ориентирован на описание разнообразных трехмерных образов, цвето-теневого освещения, позволяет создавать различ­ные сценарии миров, путешествовать по ним, «облетать» со разных сторон, вращаться в любых направлениях, масштабировать, управлять освещенно­стью и многое другое (движение, звуки, освещение и другие аспекты вирту­ального мира могут появляться как реакция на действия пользователя или же на другие внешние события).