Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ).pdf
Добавлен: 31.03.2023
Просмотров: 289
Скачиваний: 1
СОДЕРЖАНИЕ
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Исторические аспекты развития языков программирования
Низкоуровневые языки. Ассемблер и его реализация
Первые языки структурного программирования: Fortran и Algol
Языки структурного программирования. Возникновение ООП
1.5 Языки объектно-ориентированного программирования
Современные языки программирования
ГЛАВА 2. КРИТЕРИИ ВЫБОРА СРЕДЫ И ЯЗЫКА РАЗРАБОТКИ ПРОГРАММ
2.1 Языки программирования, особенности и критерии отбора
Функции в Fortran также имеют собственные конструкции. Кроме этого, в отличие от Assembler здесь впервые появляется библиотека встроенных функций, которая дает возможность сократить количество кода за счет их использования[18].
Также стоит отметить, что в случае арифметических выражений производится учет приоритета операций. Необходимо понимать, что это делает грамматику в общем случае не контекстно-свободной и требуется специальное задание приоритета для того, чтобы в некоторых позициях в строке определить какое действие необходимо делать – сдвиг к следующему символу или построение новой вершины дерева, описывающего процесс вычисления выражения[19].
Управляющие конструкции в Fortran представляют собой выражения, приведенные ниже. Это безусловный переход (GO TO); условный переход, исходя из значения переменной по строкам; присвоение значения переменной; вычисляемый условный переход, исходя из значения переменной, где значение переменной должно указывать на ветку, по которой осуществляется переход; SENSE LIGHT – зажигает или отключает определенную лампу на консоли 704 (специальная консоль для устройства IBM704)[20]; IF (SENSE LIGHT i), IF(SENSE SWITCH) – переход, исходя из того, включена ли лампа Sense Light на консоли IBM704; проверки переполнения и деления на ноль; пауза; остановка машины и цикл DO[21].
Как можно заметить, что, в отличие от современных языков программирования, в Fortran управляющие конструкции включают в себя не только непосредственно управление порядком работы программы, но и обращение к аппаратным возможностям самого устройства, что по идее может свидетельствовать о недостаточном отделении абстрактных управляющих конструкций от конструкций для работы с вычислительным устройством.
Также в первичной реализации Fortran присутствует широкий набор для ввода и вывода, учтена возможность записи работы с магнитной лентой[22].
Спецификационные конструкции Fortran могут представлять собой объявление массива. Оно представляет собой такое же выражение, как и обращение к элементу, предваряемое словом DIMENSION. Другая конструкция, EQUIALENCE позволяет программисту контролировать местоположение переменных в сегментах и создавать объединения, когда несколько переменных указывают на один участок памяти[23].
Отдельно стоит отметить конструкцию FREQUENCY. Она позволяет задать вероятность исполнения той или иной ветки программы. Это могло быть необходимо, так как в случае процессора, это могло бы определить частоту переходов и за счет оптимизации предсказания переходов сократить время, затрачиваемое на переходы[24].
Можно сказать, что Fortran действительно является первым высокоуровневым языком с собственным интерпретатором. Это предоставило возможность программистам конструировать куда более сложные программы и писать более понятный программный код. Однако реализация не была лишена изъянов, присущих языкам, близким к машинным кодам: управляющие конструкции были смешаны с конструкциями самого устройства, был малый набор функций библиотеки, конструкция FREQUENCY и.т.д. Стоит отметить, что язык Fortran совершенствовался все эти годы и остается популярным до сих пор. В новом стандарте данного языка присутствуют конструкции ООП, а также средства для работы с многопоточностью, столь необходимые современному программисту.
Другим языком, который в дальнейшем очень сильно повлиял на развитие языков программирования и языков для структурного программирования в частности является Алгол, изобретенный в 1958г. Данный разрабатывался комитетом по языку высокого уровня IFIP и позднее был усовершенствован в 1964-1968 годах[25].
При разработке данного языка впервые использовалась форма записи продукционных правил, в дальнейшем именуемая как БНФ – форма Бэкуса-Наура.
Данная форма описывается следующим образом:
<определяемый символ> ::= <посл.1> | <посл.2> | . . . | <посл.n>, где, посл.1, посл.2, посл. n — последовательности символов::= — разделяет левую и правую часть продукционных правил | — позволяет задать несколько последовательностей, соответствующих одному символу[26].
Также в языке использовалось три различных синтаксиса – референсный и стандартизованный, публикационный, а также синтаксис для реализации, который должен был решить проблемы портирования языка на новое устройство.
Помимо этого, были такие новшества в языке, как условная конструкция if…then, а также for и while, которые потом были использованы с теми или иными изменениями во всех существующих на текущий момент императивных языках.
Кроме этого, Алгол вводит понятие блока исполняемого кода, а также понятие процедуры, которое отсутствовало в изначальном стандарте Fortran[27].
Это привело к тому, что появились куда более совершенные блоки кода, позволяющие повторное использование.
Также впервые в Алгол появилось объявление типа данных переменной такое, как оно выглядит в современных языках программирования со статической типизацией в виде выражения «<тип переменной> <имя переменной>». Были описаны такие типы, как real, integer,array, boolean и другие.
Стоит отметить, что реализации самого языка довольно сильно отличались от устройства к устройству. Этому отчасти способствовал и сам стандарт, давая возможность в зависимости от реализации определять свои ключевые слова.
Однако определяемых императивных создания кода, типизация переменных и наличие полноценных функций, пользователем дали существенный толчок к развитию языков программирования и возможностей более быстрого в дальнейшем, идеи языков Алгол и Fortran получили развитие в других языках структурного программирования[28].
Языки структурного программирования. Возникновение ООП
Еще одним языком, который, был положен в основу многих других языков структурного программирования, является изобретенный в 1964г. Т. Курцем и Дж. Кемени, Basic[29]. Данный язык задумывался как инструмент, с помощью которого студенты, не знакомые изначально с программированием могли самостоятельно создавать программы для решения несложных задач. Изначально язык был реализован на мейнфрейме GE-265.
В основу нового языка были положены такие принципы, как[30]:
- простота в использовании для начинающих; нацеленность на разработку программ общего назначения; присутствие возможности расширения функциональности; интерактивность; ясность в сообщениях об ошибках;
- быстрая работа в случае малых программ; отсутствие знания аппаратного обеспечения целевой платформы; защита пользователя от небезопасных команд, ОС.
Именно, в Basic впервые был поставлен вопрос о защите пользователя от операционной системы, т.е. построении такой семантической модели, при которой пользовать не мог бы совершить неверное действие. Кроме этого, впервые был поставлен вопрос о том, как изолировать пользователя от аппаратного обеспечения, предоставив ему возможности, не зависящие от машины, на которой будет исполняться программа. Таким образом, программист на BASIC мог уже не думать о возможностях, предоставляемых машиной и программировать с учетом текущей машины[31].
В отличие от языков Алгол и Fortran, программа на BASIC в изначальном варианте могла иметь всего два вида управляющих операторов – проверку условия и цикл FOR, который мог иметь специальный параметр, указывающий на то, как будет инкрементироваться счетчик. Отчасти, это можно считать предшественником более поздней структуры цикла с подсчетом в языке C: «for(<инициализация счетчика>;<условие завершения цикла>;<действие перед переходом на следующую итерацию>)»[32].
Также в языке присутствовал довольно небольшой набор математических функций и поддержка массивов[33].
Впоследствии данный язык довольно бурно развивался, в нем появлялась поддержка разбиения на модули и, впоследствии, поддержка ООП. Самая последняя версия языка реализована на платформе .NET CLR и дает доступ к огромному набору функций и объектов, позволяя реализовывать современные методы вычисления.
Также в 1959 году был разработан другой довольно популярный язык программирования - COBOL. Название языка (COmmon Business Oriented Language) указывает на ориентацию языка для описания бизнес-приложений[34].
Кобол хотя и подвергается критике за довольно длинные и многословные конструкции по праву считается языком, на котором написано огромное количество программ. К примеру, по информации журнала Dr. Dobbs в 1997 году 90 % финансовых транзакций в мире обрабатывалось программами на COBOL, а общая стоимость кода на COBOL имеет цену порядка двух триллионов долларов[35].
Почему же Кобол стал образцом языка, на котором все конструкции обладают громоздкостью?
Дело в том, что во многих компьютерных лингвистах и программистах имелась и имеется идея некого «literate programming», т.е. такого подхода к программированию, при котором код программы пишется на естественном языке, а компьютер его исполняет в точности так, как указывает пользователь[36]. Если не вдаваться в подробности, то у данной идеи существуют такие проблемы, как большая сложность разбора естественного языка, которая зависит от самого языка, неполнота спецификаций программы, которая может быть дана программистом, а также сам процесс трансляции спецификации в конечную программу. Этот процесс, который в производственном процессе выполняет программист-кодировщик, представляет собой сложную нетривиальную проблему, которая не решена до сих пор.
Однако, создатели COBOL решили максимально приблизить конструкции к английскому языку, таким образом частично решив данную задачу. Таким образом, некоторые конструкции языка COBOL могут быть интерпретированы, как примитивные предложения на английском языке (EXIT PROGRAM, DISPLAY ―STRING‖)[37]
Также, именно COBOL стал первым языком, в котором появился тип данных record, т.е. запись или структура, которая могла включать в себя поля различных типов. Таким образом, появилась возможность обрабатывать данные, состоящие уже из нескольких компонентов.
Еще одним популярным языком структурного программирования стал язык программирования Си, разработанный в 1969-1973г[38].
Первоначально данный язык был разработан для реализации операционной системы UNIX, но, потом, был портирован на довольно большое количество других платформ. Благодаря возможности использования его в качестве высокоуровневого ассемблера, этот язык получил широкое применение при создании системного программного обеспечения и прикладного программного обеспечения для решения широкого круга задач. При этом необходимо понимать, что ключевым фактором, обеспечившим долгосрочное применение данного языка была его скорость, которая в последнее время стала обеспечиваться применением оптимизирующего компилятора, запускающего порой сложные оптимизации[39].
Такие оптимизации привели в конечном итоге к тому, что вывод в машинном коде стало сложно предсказать, и соответственно, сейчас язык Си уже практически не используется в качестве высокоуровневого ассемблера, хотя в большинстве случаев он может оптимизировать программу, лучше чем программист.
Классический компилятор Си, включал помимо обычных возможностей высокоуровневого языка тех времен, структуры, как в COBOL, поддержку длинного целого, целое без знака, операторы, которые позволяли записать коротко увеличение переменной, уменьшение, умножение и.т.п[40]. После этого в стандарт, также были добавлены функции, не возвращающие значение, указатели, не имеющие типа, функции, возвращающие объединения и структуры, присваивания структур, спецификатор констант стандартная библиотека, включающая довольно большое число различных функций и тип числа с плавающей запятой одинарной точности.
Стоит отметить, что таблица приоритетов различных операций в языке Си довольно неоднородна и также включает в себя 17 различных приоритетов, в связи с нетривиальной работой с памятью[41].
Такой широкий набор операций – от набора операций для работы с памятью, которые можно отнести к низкоуровневым, стандартной библиотеки, которая иногда содержала в себе, довольно низкоуровневые операции, а также высокоуровневые конструкции для управления потоком исполнения обеспечили языку серьезную популярность[42].
Такое разнообразие объясняется тем, что хоть язык Си можно лишь частично назвать потомком Алгол и Fortran в синтаксическом смысле, так как его непосредственным предком является B. B в свою очередь - потомок языков BCPL и CPL, которые были предназначены для программирования ОС. Предкам Си не хватало возможностей высокоуровневых языков и эта проблема была решена в его реализации[43].