Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ).pdf
Добавлен: 31.03.2023
Просмотров: 298
Скачиваний: 1
СОДЕРЖАНИЕ
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Исторические аспекты развития языков программирования
Низкоуровневые языки. Ассемблер и его реализация
Первые языки структурного программирования: Fortran и Algol
Языки структурного программирования. Возникновение ООП
1.5 Языки объектно-ориентированного программирования
Современные языки программирования
ГЛАВА 2. КРИТЕРИИ ВЫБОРА СРЕДЫ И ЯЗЫКА РАЗРАБОТКИ ПРОГРАММ
2.1 Языки программирования, особенности и критерии отбора
ВВЕДЕНИЕ
Язык программирования служит двум взаимосвязанным целям: он дает программисту аппарат для определения действий, которые должны быть выполнены, и формирует понятия, которые использует программист, и думает о том, что делать. В идеале на первую цель отвечает язык, «ориентированный на машину», так что все основные аспекты машины могут быть легко и просто реализованы так, чтобы это было достаточно очевидно для программиста. На вторую цель в идеале отвечает язык, который настолько «близок к решаемой проблеме», что концепции ее решения можно выразить прямо и кратко.
Отношения между языком, на котором мы думаем / программируем, и задачами и решениями, которые мы можем представить в нашем воображении, очень близки. По этой причине в лучшем случае опасно ограничивать характеристики языка целью устранения ошибок программирования. Как и в случае с естественными языками, большим преимуществом является, по крайней мере, двуязычность. Язык предлагает программисту ряд концептуальных инструментов. Если они не выполняют задачу, их просто игнорируют. Например, строгие ограничения концепции указателя вынуждают программиста использовать векторы и целую арифметику для реализации структур, указателей и так далее. Хороший дизайн и отсутствие ошибок не могут быть гарантированы только за счет языковых средств.
Это может показаться удивительным, но конкретный компьютер может работать с программами, написанными на его машинном языке.
Машинных языков почти столько же, сколько компьютеров, но все они являются вариантами идеи: простые операции выполняются с двоичными числами с молниеносной скоростью.
В компьютерах IBM используется машинный язык микропроцессоров семейства 8086, поскольку ваше оборудование основано на этих микропроцессорах.
Можно писать программы прямо на машинном языке, хотя это сложно. В начале компьютеризации (в начале 1950-х годов) машинный язык был единственным языком, который человек до сих пор не изобрел. Чтобы защитить программистов от жесткого машинного языка программирования, были созданы языки высокого уровня (то есть не машинные языки), которые образовывали своего рода мост между человеческим и компьютерным языком. Языки высокого уровня используют программы перевода, которые вводят «исходный код» (смесь английских слов и математических выражений, читаемых машиной) и в конечном итоге заставляют компьютер выполнять соответствующие инструкции, указанные на машинном языке. Существует два основных типа переводчиков: интерпретаторы, которые сканируют и проверяют исходный код за один шаг, и компиляторы, которые сканируют исходный код для создания текста на машинном языке, который затем выполняется отдельно.
Робот, производственная машина или бытовой прибор управляется одним человеком. В то же время, человек не находится на устройстве и не дает ему последовательных команд, но каким-то образом записывает их порядок в памяти машины. Последовательность команд, определяющая работу компьютера в конкретной среде, представляет собой программу. Компиляция таких программ - это программирование, которое сегодня является распространенным видом человеческой деятельности.
Программа - это план действий исполнителя (например, компьютера) для решения определенного типа задач. Для составления плана важны логические и другие способы мышления, знание условий выполнения программы и возможностей исполнителя, прогнозирование потенциальных ошибок и способность писать программы на языке, который понимает исполнитель - конкретный язык программирования. Это основные навыки и умения программиста.
Объект работы – языки программирования.
Предмет работы – особенности и критерии выбора языков программирования.
Цель работы – проанализировать особенности и критерии выбора языков программирования.
Задачи работы:
- изучить теоретические и исторические аспекты языков программирования;
- проанализировать критерии выбора среды и языка разработки программ.
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Исторические аспекты развития языков программирования
Существует достаточно большое количество различных генеалогических деревьев, описывающих то, как возникали те или иные формальные языки. Например, некоторые источники приводят такое генеалогическое дерево языков программирования[1]:
Рисунок 1. Генеалогическое дерево языков программирования[2]
Такое разнообразие объясняется тем, что языков программирования было создано огромное количество[3], в котором хоть и выделяют несколько семейств, но у авторов может различаться мнение по поводу того, какой язык считается основоположником или лучшим образцом семейства.
Каждые семейство может представлять собой различный подход к программированию, однако идеи некоторых языков (например LISP[4]) трансформировались спустя десятилетия. Некоторые языки встраивались в другие языки, с определенными изменениями (к примеру, в современном языке C++[5] реализованы ассемблерные вставки, которые предоставляют дополнительные возможности для оптимизации кода или взаимодействия с внешними устройствами).
Можно выделить такие семейства языков программирования, как низкоуровневые языки, языки для структурного программирования, объектно-ориентированные языки, аспектно-ориентированные языки и другие.
Низкоуровневые языки. Ассемблер и его реализация
Ассемблер, не будучи первым языком программирования (таковым принято считать Планкалкюль Конрада Цузе), является первым языком программирования, который был реализован на реальном вычислительном устройстве[6]. Первая реализация ассемблера была запрограммирована на Electronic Delay Storage Automatic Calculator в 1949г. Последующие реализации включают в себя реализацию Натаниела Рочестера для IBM701, а также реализацию Стена Поли для IBM650.
Если учесть тот факт, что до этого ввод программ осуществлялся исключительно в машинных кодах, то появление такого языка являлось существенным шагом вперед. Теперь, вместо записи машинных кодов вводились мнемоники, которые описывали те или иные операции вычислительного устройства.
Как правило, одна команда ассемблера выглядит следующим образом:
<операция> <параметры операции, через запятую>[7]
Это описание создает довольно простой язык, который может быть разобран регулярной грамматикой за линейное время и который может быть легко транслирован в машинный код, если операция будет кодирована конкретными битами машинного слова, а операции – другими битами. Стоит понимать, что при этом набор операций очень сильно зависит от конкретного устройства, а также его конфигурации.
Чтобы проиллюстрировать это утверждение, к примеру архитектура процессоров x86 поддерживает операцию MOV, которая в зависимости от параметров может производить чтение из оперативной памяти в регистр, а также запись в оперативную память из регистра, а также задавать адрес в виде суммы регистра и смещения[8]. Однако при этом некоторые RISC-процессоры не поддерживают эту операцию, заменяя еѐ парой операций ST, LD, которые осуществляют запись и чтение по адресу из оперативной памяти. Таким образом, каждая реализация ассемблера может иметь свои операции, используемые для конкретного процессора.
Более того, набор регистров может отличаться в зависимости от процессора, чего ассемблер может не учитывать[9].
Кроме этого, в ассемблере могут присутствовать директивы данных, указывающие какие данные каким образом расположены в оперативной памяти.
Со временем, так как стали появляться общие шаблоны программирования на ассемблере, которые описывают более высокоуровневые конструкции. Эти шаблоны могут повторяться для различных параметров. Для того, чтобы облегчить работу программиста с такими шаблонами были реализованы макросы. В некотором роде, первичная поддержка макросов появилась в автокодерах макросов IBM.
К примеру, в FASM макрос записывается так: <имя макроса> macro <список параметров> <список команд>endm[10].
Таким образом, макросы представляют собой определения собственных мнемоников. При этом, также необходимо понимать, что первичный способ реализации компилятора ассемблера должен быть изменен, так как не всегда за один проход обработки можно сгенерировать машинный код полностью, так как некоторые макросы могут быть использованы до его объявления.
Со временем, в ассемблере стали появляться, конструкции, упрощающие работу с структурным программированием, объявление структур, процедуры, однако под «классическим» ассемблером, понимается именно непосредственный набор директив объявления данных, а также набор команд[11].
К достоинствам ассемблера стоит отнести, то, что он дает определенную абстракцию над работой вычислительного устройства, в отличие от машинных кодов, вместе с тем предлагая полный доступ к еѐ возможностям.
К недостаткам ассемблера стоит отнести то, что каждая архитектура процессора, и, после возникновения операционной системы, ОС требует своей реализации ассемблера[12]. Также к недостаткам стоит отнести недостаточную абстракцию, отсутствие простого способа записи арифметических выражений, сложную отладку, из-за того, что необходимо знать, какие данные какой регистр содержит в данный момент. Это усугубляется тем, что при отладке нет возможности узнать, как представлен тип в памяти компьютера, так как в «классическом» ассемблере нет простых обозначений для сложных типов (объединений, классов, перечислений).
Первые языки структурного программирования: Fortran и Algol
Для того, чтобы избавиться от проблем, возникающих при программировании на низкоуровневых языках появилась концепция структурного программирования – методологии, согласно которой программа может быть представлена в виде иерархии блоков.
Первой реализацией можно считать реализацию языка Fortran в 1957г.[13], при этом концепция самого языка была создана в 1954-1955гг.
Первичная спецификация самого языка включала в себя 32 вида выражения: 15 управляющих конструкций, 13 конструкций для ввода-вывода, 3 специфицирующих конструкций и арифметическую конструкцию[14].
Кроме этого, в самом языке наличествует понятие констант, в том числе констант для описания чисел с плавающих запятой. Стоит понимать, что если описания чисел в ассемблере, в основном представляют собой целые числа (также строки в некоторых диалектах[15]), то, в случае, констант при лексическом разборе появляются условные конструкции для разбора частей после запятой; конструкций для описания экспоненциальной части, что существенно усложняет саму грамматику. Однако при этом появляется впервые возможность прямым образом описать числа с плавающей запятой и упростить программирование научных расчетов[16].
Кроме этого, в языке реализуется понятие переменной. Кодирование имени переменной производится по схеме, сходной с другим языком – Plankalkül, в котором кодирование семантического значения переменной происходит прямо в еѐ имени. Здесь же, подобно, целочисленные переменные (и переменные с фиксирующей точкой) описываются идентификаторами из цифр и букв, начинающиеся с I,J,K,L,M,N, а также переменные, описывающие числа с плавающей запятой, не могут с них начинаться[17]. Длина идентификатора при этом ограничена шестью символами, что может являться техническим ограничением для экономии оперативной памяти.
Также в спецификации самого языка вводится само понятие массива, а для доступа к нему используется операция, в которой с левой стороны стоит переменная-массив, которая до этого должны быть объявлена специальным образом, а в скобках – индекс. В случае ассемблера для взятия индекса потребовалось бы дополнительно учитывать размер типа в массиве, однако Fortran здесь упрощает работу программиста, давая возможность работать с массивами значений гораздо проще, чем было до этого.