ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
ЯЗЫКИ ПРОГРАМИРОВАНИЯ
Число когда-либо разработанных языков программирования вместе с их модификациями в настоящее время достигает трех тысяч, однако подавляющая их часть не получила сколько-нибудь широкого распространения; в практической деятельности используется не более нескольких десятков. Такое многообразие языков программирования определяется разнотипностью решаемых задач (вычислительных, экономических, графических, экспертных и др.), ориентацией на конкретную архитектуру ЭВМ, удобством для пользователя, реализацией личных вкусов и идей разработчиков.
Языки программирования по мере их близости или удаленности от языка машинных команд принято делить на две основные группы – языки низкого и высокого уровня.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ НИЗКОГО УРОВНЯ
Эти языки в настоящее время используются для реализации лишь специальных частей программ, в которых необходимо обеспечить наивысшую эффективность. Операторы близки к машинному коду и ориентированы на конкретный тип процессора; таким образом, программа, написанная на языке низкого уровня, может использоваться только в той среде, в которой она была создана.
Языки программирования в машинных кодах
Программа представляет собой набор двоичных данных – весьма сложную структуру, доступную для понимания лишь специалистам высокого класса. Сейчас в машинных кодах практически не программируют.
Assembler
Версии машинных кодов, адаптированные под аппаратную платформу. Каждая архитектура имеет свою собственную версию Ассемблера. Каждая машинная команда представляется в виде символьных условных обозначений (символьных мнемоник). Программа на языке Ассемблера переводится в машинные коды (этот процесс называется транслитерацией). При этом каждой строке исходного текста ставится в соответствие одна команда процессора (принцип «одна инструкция – одна строка»). В символическом Ассемблере, разработанном в конце 50-х – начале 60-х гг., впервые появилось понятие переменной, что позволило ему стать первым полноценным языком программирования. В настоящее время эти языки используются только в компактных, но очень важных частях систем, в которых необходимо высокое быстродействие, т.к. разработчик получает доступ ко всем возможностям процессора.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
Особенности компьютерных систем не учитываются, перенос программ на уровне исходных текстов на другие платформы не создает трудностей, если в них создан транслятор этого языка. Чаще всего для разработки программ на языках высокого уровня используются интегрированные системы программирования, включающие в себя текстовый редактор, компоненту для перевода исходного текста программы в машинный код, называемую транслятором, и редактор связей.
Каждый язык программирования, как и естественный язык, имеет:
• алфавит – фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на этом языке;
• синтаксис – систему правил, определяющих допустимые конструкции языка программирования из букв алфавита;
• семантику – систему правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных.
При описании языка и его применении используют понятия языка. Понятие подразумевает некоторую синтаксическую конструкцию и определяемые ею свойства программных объектов или процесса обработки данных.
Взаимодействие синтаксических и семантических правил определяют те или иные понятия языка, например, операторы, идентификаторы, переменные, функции, процедуры, модули и т.д. В отличие от естественных языков правила грамматики и семантики для языков программирования, как и для всех формальных языков, должны быть явно, однозначно и четко сформулированы. Нарушение формы записи программы приводит к синтаксической ошибке, а формально правильно написанная, но не отвечающая алгоритму программа содержит семантическую (логическую) ошибку.
Языки программирования, имитирующие естественные языки, обладающие укрупненными командами, ориентированные на решение прикладных содержательных задач, называют языками высокого уровня.
Языки программирования высокого уровня имеют следующие достоинства:
• алфавит значительно шире машинного, что делает его гораздо более выразительным и существенно повышает наглядность и понятность текста;
• набор операций, допустимых для использования, не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определенного класса;
• конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде;
• используется аппарат переменных и действия с ними;
• поддерживается широкий набор типов данных.
Для описания классов этих языков используются следующие определения:
• процедура – именованная часть программы, в которую при вызове передаются параметры, и в соответствии с ними выполняется программный код, после чего управление передается в основную программу;
• функция – процедура, возвращающая значение;
• переменная – именованный участок памяти, хранящий значение;
• класс – набор взаимосвязанных переменных, процедур и функций;
• модульное программирование – часть программного кода записывается в виде процедур и функций, которые впоследствии могут вызываться из основной части программы, что позволяет избавиться от повторяющихся элементов кода, сделав программу более компактной, гибкой в использовании и универсальной.
Линейные языки
Одно из начальных направлений развития систем программирования. Эти языки не имеют процедур и функций; программный код в них исполняется последовательно. Их первые версии не имели даже механизмов ветвления, а программы на них представляли собой просто набор операторов для вычисления элементарных математических задач.
Short Code
Первая система кодирования машинных команд с помощью специальных символов, предложенная сотрудником Пенсильванского университета Джоном Моучли в 1949 г. В ней программист записывал решаемую задачу в виде математических формул, а затем, используя специальную таблицу, осуществлял посимвольный перевод в двухлитерные коды. В дальнейшем специальная программа ЭВМ превращала эти коды в двоичный машинный код. Эта система была, по существу, примитивным интерпретатором.
MATH-MATIC
Группа под руководством Грейс Хоппер в 1954 г. разработала систему, включавшую в себя язык программирования и компилятор. Первый же в мире компилятор был создан тем же коллективом в 1951 г., и тогда же был введен сам этот термин. Г. Хоппер принадлежит также ввод в обиход фундаментальных терминов «подпрограмма» и «отладка» (debugging).
Процедурные языки
На протяжении длительного времени основная традиционная методология программирования. Отражение фон-неймановской архитектуры компьютера. Основная идея процедурного программирования – использование памяти для хранения данных. Классическое процедурное программирование требует от программиста детального описания того, как решать задачу, т.е. формулировки алгоритма и его специальной записи. При этом ожидаемые свойства результата обычно не указываются. Основные понятия языков этой группы – оператор и данные. Основная команда – присвоение; с ее помощью определяется и меняется память компьютера. Программа производит преобразование содержимого памяти, изменяя его от исходного к результирующему состоянию. При процедурном подходе операторы объединяются в группы – процедуры, которые представляют собой, по сути, крупные логические блоки, обеспечивающие выполнение тех или иных операций. В них используется принцип модульного программирования. Основные преимущества этого класса языков:
• возможность легкого и быстрого написания небольших модулей;
• возможность неоднократного использования модулей общего назначения, что приводит к сокращению времени разработки программ;
• возможность отладки и тестирования модулей независимо от всей программы.
В свою очередь, процедурные языки подразделяются на операциональные и структурные.
Операциональные языки
Также называются фортраноподобными: по названию основоположника этой группы – языка Fortran.
Fortran
От англ. FORmula TRANslator – переводчик формул. Первая версия разработана в 1954 г. инженером корпорации IBM Джоном Бэкусом. В 1958 г. появилась версия Fortran II с поддержкой использования подпрограмм.
Cobol
От англ. COmmon Business Oriented Language – общий язык, ориентированный на деловые задачи. Разработан в 1960 г. под консультацией все той же Г. Хоппер на основе появившегося в 1958 г. компилятора FLOW-MATIC – первого языка для решения задач обработки коммерческих данных. Кобол создавался как основной язык для массовой обработки данных в сферах управления и бизнеса.
PL/1
От англ. Programm Language 1 – язык программирования 1. Разработан в 1967 г. компанией IBM, как заявлялось, на смену Фортрану. Исторически первый опыт создания универсального языка программирования высокого уровня. Предназначался для исследования и планирования вычислительных процессов, моделирования, решения логических задач, разработки систем математического обеспечения. Хотя в усеченных версиях его использовали многие программисты, в глобальном плане эта попытка не оправдала себя – универсализм языка приводил к неоправданной сложности конструкций, неэффективности компиляторов.
Basic
От англ. Beginner’s All-purpose Symbolic Instruction Code – универсальный символьный код для начинающих. Разработан в 1964 г. сотрудниками математического факультета Дартмутского колледжа Томасом Курцем и Джоном Кемени. К 1967 г., когда к разработке подключились крупные фирмы, были созданы три так называемые «дартмутские» версии, однако широкое практическое использование языка началось лишь в 1975 г. Самому широкому распространению Бейсика в значительной мере способствовали его ориентация на так называемых непрофессиональных программистов и использование как встроенного языка на появившихся в конце 70-х гг. прошлого века ПК. Поэтому Бейсик нашел применение, в частности, в качестве языка начального обучения программированию. Характерными особенностями Бейсика являются:
• чрезвычайное обилие версий, иногда сильно различающихся, при фактическом отсутствии базовой версии;
• неструктурность, выражающаяся в том, в Бейсике необязательно, хотя и вполне возможно, организовывать строго упорядоченные программные структуры. При разработке крупных программных комплексов это очевидный недостаток, а при разработке относительно небольших диалоговых программ, обработке строк (текстов), работе с графикой – преимущество.
В Бейсике отсутствуют:
• ряд структур данных (множества, записи, перечисляемые и интервальные типы);
• ссылочные типы и динамические переменные (в старших версиях возможно динамическое описание массивов);
• в большинстве версий – процедуры и функции (их слабым аналогом являются подпрограммы);
• модули (следовательно, возможности организации больших внешних библиотек).
Исторически Бейсик был ориентирован на трансляторы интерпретирующего типа, использовался на учебных и бытовых ЭВМ с малым объемом оперативной памяти и невысоким уровнем системного ПО, зачастую выполняя и функции ОС, был прост и примитивен, имел слабый пользовательский интерфейс. В своем развитии Бейсик стал системой программирования со всеми сервисными утилитами и инструментарием программиста. Современные усложненные версии Бейсик-систем используют истинные процедуры и другие средства, заимствованные из более мощных языков, а в качестве трансляторов – не интерпретаторы, а компиляторы, что повышает эффективность программ самой различной предметной ориентации.
C
Разработан в 1972 г. сотрудниками Bell Laboratories Брайаном Керниганом и Деннисом Ритчи. Вместе со своими производными наложил огромный отпечаток на современное программирование, благодаря чрезвычайной популярности в среде профессиональных программистов. Сочетает в себе черты как языка высокого уровня, так и машинно-ориентированного языка, обеспечивая (в отличие от Бейсика и Паскаля) доступ ко всем машинным ресурсам (функциональным узлам компьютера).
Особенности языка Си:
• отсутствие понятия процедуры; использование подпрограмм основано на понятии функции, которая может сочетать в себе возможности процедуры;
• богатый набор операторов: кроме набора средств, присущих современным языкам программирования высокого уровня (структурность, модульность, определяемые типы данных), в него включены средства для программирования «почти на уровне Ассемблера» (использование указателей, побитовые операции, операции сдвига);
• компактность, гибкость и выразительность конструкций;
• большое количество библиотек модулей, инструментальных средств разработки и отладки, облегчающих создание программ;
• высокая мобильность программ – без изменений они переносятся, транслируются и выполняются на машинах различных типов;
• широкое использование при разработке системного (в т.ч. ОС) и прикладного ПО.
Структурные языки
Появление и развитие этой тенденции в программировании связано с попытками создать универсальный язык программирования, предпринимавшимися в 60-70 гг. XX в, и дополнительным фиксированием некоторых полезных приемов технологии программирования. Языки этой группы также называются алголоподобными: по названию основоположника этой группы – языка Algol.
Algol
От англ. ALGOrithmic Language – алгоритмический язык. Разработан в 1958 г. коллективом авторов в результате международного сотрудничества в области программирования. Предназначен для записи алгоритмов, построенных в виде последовательности процедур, применяемых для решения поставленных задач. В нем впервые введены понятия блочной структуры программы и динамического распределения памяти. Его влияние на развитие других языков и теорию программирования оказалось весьма значительным. Наряду с Фортраном Алгол на долгие годы стал классическим базовым языком программирования при решении на ЭВМ математических, инженерно-технических и научных задач. В СССР же под руководством академика С.П. Ершова был создан транслятор Альфа – довольно удачная русифицированная версия Алгола.
Pascal
Разработан в 1971 г. швейцарским ученым Никлаусом Виртом и назван в честь великого французского математика, физика, изобретателя и философа Блеза Паскаля. В Паскале получило наивысшее отражение развитие идеи Алгола о структуризации разработки алгоритмов. Паскаль разрабатывался как учебный язык и наряду с Бейсиком долгое время являлся одним из основных языков обучения программированию, однако его высокие в совокупности качества позволили использовать его и в профессиональных целях.
В основу Паскаля положен переход от общей задачи к частным – более простым и меньшим по объему. К основным принципам, реализованным в Паскале, можно отнести структурное программирование, основанное на использовании подпрограмм и независимых структур данных, и программирование «сверху вниз», когда задача делится на простые, самостоятельно решаемые задачи.
Паскаль – жестко структурированный язык с большим количеством ограничений, однозначных правил и сильной типизацией данных. В Паскале используется сравнительно малое число четко оговоренных конструкций, допускающих чередование и вложения друг в друга. Программы на Паскале отличаются высокой надежностью; их легко читать и передавать для совершенствования и сопровождения. Вместе с тем Паскаль слабо пригоден для разработки системного ПО (во всяком случае, в своих классических версиях и особенно по сравнению с языком Си). В отличие от Си на Паскале невозможно или почти невозможно написать ОС или ее фрагмент, утилиты и т.п. Ряд трансляторов с Паскаля написаны на Си; обратное представить себе невозможно.
Отдельного упоминания заслуживает разработанная французом Филипом Каном система Turbo Pascal, объединяющая в едином интерфейсе последовательные этапы обработки программы – компиляцию, редактирование связей, отладку и диагностику ошибок.
Ada
Разработан в 1979 г. группой ученых во главе с французом Жаном Ишбиа в рамках проекта Пентагона по созданию универсального языка программирования. Назван в честь Ады Лавлейс – создательницы первых программ и крупного популяризатора информатики. Ада – прямой наследник языка Паскаль, предназначенный для создания и длительного многолетнего сопровождения больших программных систем, допускающий возможность параллельной обработки, управления процессами в режиме реального времени и др. Официально выпущенный в 1983 г., язык Ада почти 10 лет использовался в научных расчетах, а также в военных программах Министерства обороны США.
Непроцедурные языки
Представляют принципиально иное направление в программировании, которое, очевидно, имеет большое будущее. Иногда непроцедурные языки называют языками сверхвысокого уровня. К непроцедурным методологиям относятся декларативное и объектно-ориентированное программирование.
Декларативные языки
При использовании декларативного языка программист указывает исходные информационные структуры, взаимосвязи между ними и то, какими свойствами должен обладать результат. При этом процедуру его получения (алгоритм) программист не строит, по крайней мере, в идеале. В этих языках отсутствует понятие оператора (команды). Декларативное программирование иначе называется дескриптивным (описательным). В свою очередь, подразделяется на логическое и функциональное.
Логические языки
Базируются на принципах построения логических систем в терминах формальной логики и булевой алгебры. Программирование на логическом языке напоминает формальную запись предложений естественного языка с использованием различных логических моделей для имитации систем искусственного интеллекта. Логические программы не отличаются высоким быстродействием, т.к. процесс их выполнения сводится к построению прямых и обратных цепочек рассуждений разнообразными методами поиска. Программа строится из последовательности фактов и правил, а затем формулируется утверждение, которое язык пытается доказать с помощью правил. Язык сам ищет решение с помощью заложенных в нем методов поиска и сопоставления. В основе этой группы языков лежат достаточно сложная теория и узкая специализация, поэтому широкого распространения они не получили. Типичным представителем языков логического программирования является Prolog.
Prolog
От англ. PROgramming LOGic – программная логика. Разрабатывался в 1970-1978 гг. Очевидно, именно Пролог будет положен в основу аппаратной организации и разработки ПО ЭВМ 5-го поколения (обладающих искусственным интеллектом). Обладает существенными особенностями:
• программа на Прологе не является алгоритмом, а представляет собой запись условия задачи на языке формальной логики, понятийной системой которой он пользуется;
• Пролог предназначен для решения не вычислительных или графических, а логических задач, для моделирования процесса логического умозаключения человека; вычисления и графические построения выполняются в Прологе как побочный продукт логического вывода;
• Пролог требует от программиста особого стиля мышления, что затрудняет его изучение теми, кто привык к процедурному программированию.
Программирование на Прологе включает в себя следующие этапы:
• объявление фактов об объектах и отношениях между ними;
• определение правил взаимосвязи объектов и отношений между ними;
• формулировка вопроса об объектах и отношениях между ними.
Функциональные языки
Функциональный подход к программированию основан на той идее, что вся обработка информации и получение искомого результата могут быть представлены в виде вложенных и/или рекурсивных вызовов функций, выполняющих некоторые действия, так что значение одной функции используется как аргумент другой. Значение этой функции становится аргументом следующей и т.д., пока не будет получен конечный результат – решение задачи. Программы строятся из логически расчлененных определений функций. Определения состоят из управляющих структур, организующих вычисления, и из вложенных вызовов функций. Основными методами функционального программирования являются композиция и рекурсия. Все это представляет собой реализацию идей теории рекурсивных функций (рекурсия - метод определения или вычисления функции, процедуры или решения задачи посредством той же функции, процедуры и т.д.).
Функциональное программирование – это способ составления программ, в которых единственным действием является вызов функции. В функциональном программировании не используется память как место хранения данных, а, следовательно, не используются промежуточные переменные, операторы присваивания и циклы. Ключевым понятием функциональных языков является выражение. Программа, написанная на таком языке, представляет собой последовательность описания функций и выражений. Выражение вычисляется сведением сложного к простому.
Главным представителем группы функциональных языков является Lisp.
Lisp
От англ. LISt Processing – обработка списков. Разработан в 1962 г. сотрудником Массачусетского технологического института Дж. Маккарти. Подавляющее большинство программ искусственного интеллекта составлено именно на этом языке. До сих пор он считается стандартным языком разработки систем искусственного интеллекта. Его популярность особенно велика в США.
Язык Лисп – один из первых языков обработки данных в символьной форме. В нем и программа, и обрабатываемые ею данные представляются в одной и той же форме – в форме списка. Таким образом, программы могут обрабатывать и преобразовывать как другие программы, так и самих себя. Имеется большое число систем программирования на Лиспе, реализованных для компьютеров различных типов. Как правило, это интерпретирующие системы, работающие в интерактивном (диалоговом режиме).