Современных языков программирования

 

Все языки программирования можно сгруппировать по некоторым признакам в ряд подгрупп (с определенной степенью условности). На рис. 4.2 представлен один из вариантов такого разбиения.

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

 


Рис. 4.2. Классификация

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

 

 

Программирование в машинных кодах в настоящее время не используется программистами (за исключением некоторых узкоспециализированных приложений). Однако программирование на Ассемблере (Assembly System) практикуется достаточно широко, поскольку все системное программирование, программирование нестандартных периферийных устройств, программирование процессов реального времени и т.п. в той или иной мере связано с использованием Ассемблера. Язык Ассемблера – первый шаг по автоматизации программирования, избавлению программиста от мелочей двоичного кодирования. Использование символов, отражающих суть ма­шинной команды (например, LOAD – загрузить, ADD – сложить), вместо соответствую­щих им кодов команд, а также
запись программ без привязки к конкретным адресам ЭВМ значительно облегчают работу программиста. При этом часть работы возлагается на компьютер, который с помощью программы транслятор-ассемблер переводит текст программы на машинный язык и определяет его место в поле оперативной памяти. Дальнейшее совершенствование Асемблеров связано с появлением макроассемблеров (или макросов), позволяющих писать более компактные программы. Это объясняется тем, что в макроассемблерах часто повторяющиеся последовательности команд Ассемблера объединяются и им присваиваются новые символы. Транслятор с языка Ассемблера является необходимым атрибутом любого современного компьютера, так как программирование на этом языке позволяет в полной мере использовать ресурсы вычислительных систем. В то же время использование этого языка предполагает доскональное изучение технических средств и архитектурных особенностей программируемой машины.

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

Если во многих применениях сравнительно рано были созданы языки высокого уровня, каждый из которых стал мировым стандартом в своей области, то ни одному из языков реального времени высокого уровня не удалось стать таковым. В Великобритании необходимость в языке программирования задач в реальном масштабе времени привела к появлению языка Корал (сокращение от «язык программирования для реализации радиолокационных систем»), построенного на идеях Алгола. Корал – один из немногих языков данного типа, на который имеется стандартное определение.

В США использовался Фортран реального времени (разработка университета Purdue), во Франции – язык Прокол (также на основе Фортрана), в Германии – Пеарл. Программирование задач реального времени для микропроцессорных систем привело к появлению таких языков высокого уровня, как PL/M, PLZ, MPL, предназначенных для семейств микропроцессоров фирм Intel, Zilog и Motorola соответственно. У этих языков было много приверженцев и они получили высокую оценку пользователей. Особое место в списке языков реального времени занимает Форт: он не имеет аналогов в машинно-независимых языках и позволяет сочетать программирование на языках высокого и низкого уровней.

Машинно-ориентированные языки высокого уровня применялись и при системном программировании – разработке операционных систем и инструментов программной поддержки компьютерных систем. Так, фирма IBM для этих целей использовала языки PLS (диалект PL/1), DEC-BLISS (на базе ALGOL), Burroughs – Extended ALGOL. В настоящее время в качестве основного инструмента для создания операционных систем используется язык С.

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

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

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

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

Языки подготовки сценариев. Первый такой язык – Sh (Shell – оболочка), изначально состоявший из набора команд, интерпретируемых как вызов системных программ, выполняющих служебные функции (например, управление файлами) и их простую фильтрацию. Затем на этой основе были добавлены переменные операторы потока управления, функции и т.п., в результате получили универсальный язык программирования, разработанный в Bell Lab., – AWK.

Разработанный Лари Уоллом язык Perl изначально составлял комбинацию Sh и АWК, затем получил значительное развитие и сейчас является достаточно мощным, выходящим за рамки сценариев, особенно в связи с развитием WWW, языком. Он очень удобен для программирования интерфейса CGI (Common Gatway Intertace – общий шлюзовой интерфейс).

Программирование в среде Windows. Создание графических оболочек связано с такими инструментальными средствами, как Turbo Vision, VB, VBA, VC++, Delphy, .NETVision.

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

платформенная независимость;

защита информации от несанкционированного доступа;

обеспечение высокого быстродействия.

Для программирования активных Web-серверов в наибольшей степени удовлетворяют перечисленным требованиям язык Java (C-), разработанный фирмой Sun, а также платформа .NET(DOT NET), включающая язык С# фирмы Microsoft.

Для разметки гипертекста, создания Web-сценариев (Web-дизайна) применяются: HTML(H(yper) T(ext) M(arkup) L(anguage)), XTML, Perl, Java Script, VB Script, используемые для программирования со стороны клиента, для программирования серверной части сценариев используется ASP (Active Server Payes).

Основные языки для работы с данными. Таким языком в рамках стандарта ANSI является SQL (Structured Query Language – язык структурированных запросов).

Среди узкоспециализированных языков, которых за последние 50 лет появилось великое множество, можно отметить APG, используемый для генерации деловых отчетов, АРТ, созданный для управления программируемыми устройствами, GPSS, разработанный для моделирования больших систем (включая большие информационные системы) и т.п.

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

Практически все языки научно-технического применения обеспечены средствами программирования графического вывода. Общим для всех языков являются средства программирования в среде Windows (Visual Basic, Delphy, Visual C т.п.), создание новых типов данных – объектно-ориентированное программирование.

К универсальным языкам на начальном этапе относили, прежде всего, PL/I (Programming Language I), CPL (Combined PL), APL, которые, хотя и используются, не получили широкого распространения.

Основным, всеми признанным де-факто, стандартом универсального языка стал разработанный в недрах Bell Laboratory крупнейшего американского концерна AT&T язык Си (С). Примечательно, что разработчики (отнюдь, не представляющие ведущие компьютерные фирмы) не ставили своей целью разработку универсального языка. Они создавали инструментальные средства для написания переносимой на различные компьютеры операционной системы UNIX (Кен Томпсон и Денис Ритчи). На первом этапе этот язык считался языком системного программирования. В 1980 г. Бьярн Страуструп разработал объектно-ориентированное расширение этого языка – Си ++.

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

В 1979 г. было объявлено о языке Ада, разработанном для министерства обороны США с его задачами реального времени. Однако до настоящего времени этот язык не вошел в практику широкого применения.

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

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

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

К таким языкам относятся функциональные языки (другое название – аппликативные). Типичным представителем этих языков является LISP (L(ist) I(nformation) S(ymbol) P(rocessing)) – язык обработки списков, разработанный Дж. Маккарти в 1961 г. для символьной обработки. Потребность в языках, работающих с символами, ощущалась в лингвистике, философии, математике. У психологов необходимость в таких средствах связана с моделированием человеческого мышления, у лингвистов – с обработкой текстов на естественном языке, у математиков – это язык доказательства теорем, дифференцирование, интегрирование и т.п. Кстати, такие математические пакеты, как Macsyma Reduce, Scratchpad, разработаны с помощью LISP.

К непроцедурным языкам относятся и языки логического программирования, которые являются декларативными. Разработка программы на этих языках заключается в представлении программы в виде символьной логики и использовании для получения результата процесса логического вывода (алгебра Буля – исчисление предиктов, см. гл. 1).

Логическое программирование является не процедурным, а декларативным. Это означает, что в них указывается лишь описание желаемого результата, а не детальная процедура его получения. Одним из представителей таких языков является разработанный на базе LISP язык PROLOG – PRO(gramming) in LOG(ic).

Оба указанных выше языка используются при разработке систем искусственного интеллекта.

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

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

Сегодня в полной мере задачу повышения уровня языка решить не удается, поскольку конкретные приложения пользователей значительно шире возможностей, предоставленных стандартными средствами. Практически все непроцедурные языки имеют средства традиционного программирования. Так, пакеты прикладных программ, разработанные фирмой Microsoft, имеют в своем составе Visual Basic. В то же самое время в языки LISP и Prolog при их практическом применении включаются элементы традиционных (императивных) языков.