Языки программирования высокого уровня
ЯЗЫКИ ПРОГРАМИРОВАНИЯ
Число когда-либо разработанных языков программирования вместе с их модификациями в настоящее время достигает трех тысяч, однако подавляющая их часть не получила сколько-нибудь широкого распространения; в практической деятельности используется не более нескольких десятков. Такое многообразие языков программирования определяется разнотипностью решаемых задач (вычислительных, экономических, графических, экспертных и др.), ориентацией на конкретную архитектуру ЭВМ, удобством для пользователя, реализацией личных вкусов и идей разработчиков.
Языки программирования по мере их близости или удаленности от языка машинных команд принято делить на две основные группы – языки низкого и высокого уровня.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ НИЗКОГО УРОВНЯ
Эти языки в настоящее время используются для реализации лишь специальных частей программ, в которых необходимо обеспечить наивысшую эффективность. Операторы близки к машинному коду и ориентированы на конкретный тип процессора; таким образом, программа, написанная на языке низкого уровня, может использоваться только в той среде, в которой она была создана.
Языки программирования в машинных кодах
Программа представляет собой набор двоичных данных – весьма сложную структуру, доступную для понимания лишь специалистам высокого класса. Сейчас в машинных кодах практически не программируют.
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 г. швейцарским ученым Никлаусом Виртом и назван в честь великого французского математика, физика, изобретателя и философа Блеза Паскаля. В Паскале получило наивысшее отражение развитие идеи Алгола о структуризации разработки алгоритмов. Паскаль разрабатывался как учебный язык и наряду с Бейсиком долгое время являлся одним из основных языков обучения программированию, однако его высокие в совокупности качества позволили использовать его и в профессиональных целях.
В основу Паскаля положен переход от общей задачи к частным – более простым и меньшим по объему. К основным принципам, реализованным в Паскале, можно отнести структурное программирование, основанное на испо
