Классификация и обзор языков программирования
Классификация языков программирования не закреплена каким-либо стандартом. Однако, в учебных целях, существующие языки программирования можно классифицировать по четырём основным группам: процедурные, объектно-ориентированные, функциональные и логические.
Процедурное (императивное) программирование. Программа, написанная на процедурном языке, представляет собой последовательность команд, определяющих алгоритм решения задачи. Программа отделяется от данных (и состоит из последовательности команд, обрабатывающих эти данные), которые, как правило, хранятся в виде переменных. Весь процесс вычисления сводится к изменению их содержимого.
Одним из первых процедурных языков программирования высокого уровня был Фортран (Fortran), разработанный в начале 50-х гг. фирмой IBM (широко используется в первую очередь в целях научных и инженерных вычислений). Долгие годы был одним из самых распространенных языков в мире. Одно из преимуществ Фортрана - большое количество написанных и накопленных на нём программ и их библиотек. Ряд таких библиотек создавались на протяжении десятилетий и популярны (главным образом в научной среде) по сей день. Современный Фортран приобрёл черты, необходимые для эффективного программирования в среде новых вычислительных архитектур (позволяет применять современные технологии программирования). Фортран имеет достаточно большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами. Выразительные средства языка изначально были весьма скудны, поскольку Фортран был одним из первых языков высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, функционального и даже объектно-ориентированного программирования.
В конце 50-х гг. был разработан язык Кобол (COmmom Business Oriented Language - общепринятый деловой язык) – язык программирования, ориентированный, в первую очередь, для разработки бизнес приложений (предназначался для решения экономических задач, обработки данных для банков, страховых компаний и других учреждений подобного рода). Отличительной особенностью языка является возможность эффективной работы с большими массивами данных (что характерно именно для коммерческих приложений). Популярность Кобола столь высока, что даже сейчас, при всех его недостатках (его обычно критикуют за многословность и громоздкость) появляются новые его диалекты и реализации. Язык позволяет эффективно работать с большим количеством данных, он насыщен разнообразными возможностями поиска, сортировки и распределения (что и обеспечивает ему долгую жизнь в бизнес приложениях).
В 1960 году был разработан язык Алгол, который предназначался для записи алгоритмов, построенных в виде последовательности процедур, применяемых при составлении программ для решения научно-технических задач. Язык был достаточно интересен, так как обладал многими уникальными на тот момент характеристиками. Язык появился в результате международного сотрудничества группы специалистов и сыграл большую роль как в становлении основных понятий программирования, так и в обучении программистов. В нем впервые были введены понятия «блочная структура» (внутри блока в Алголе можно вводить локальные обозначения, которые не зависят от остальной части программы), «динамическое распределение памяти» и др. Несмотря на свое интернациональное происхождение, Алгол получил меньшее распространение, чем, скажем, Фортран (из-за более сложной структуры). В 1968 году была создана версия Алгол-68, по своим возможностям и сегодня опережающая многие языки программирования, однако из-за отсутствия достаточно эффективных средств, для нее не удалось своевременно создать хорошие компиляторы.
В начале 60-х гг. каждый из существующих языков программирования был ориентирован на разные классы задач и предпринимались попытки преодолеть этот недостаток путем создания универсального языка программирования. ПЛ/1 (PL/1 – Programming 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 язык моделирования виртуальной реальности) - был создан для организации виртуальных трехмерных интерфейсов в Интернете. Он ориентирован на описание разнообразных трехмерных образов, цвето-теневого освещения, позволяет создавать различные сценарии миров, путешествовать по ним, «облетать» со разных сторон, вращаться в любых направлениях, масштабировать, управлять освещенностью и многое другое (движение, звуки, освещение и другие аспекты виртуального мира могут появляться как реакция на действия пользователя или же на другие внешние события).