Добавлен: 28.03.2023
Просмотров: 367
Скачиваний: 5
СОДЕРЖАНИЕ
Глава 1. Языки программирования
1.1. История развития языков программирования
1.2. Языки программирования высокого уровня
Глава 2. Обзор языков программирования высокого уровня
2.1 Классификация языков программирования высокого уровня
2.2 Процедурно-ориентированные языки
2.3 Предметно-ориентированные языки
ВВЕДЕНИЕ
В современном мире существуют бесчисленное множество языков программирования. Как и естественные языки трансформируются и изменяются практически непрерывно, так и языки программирования изменяются и дополняются, а кроме того создаются новые. Одни языки используются лишь небольшим количеством их разработчиков, другие используются почти повсеместно. Профессиональным программистам в своей работе необходимо уметь использовать несколько языков программирования и иметь представление о возможностях остальных. Большинство из этих языков – это языки программирования высокого уровня, так как они намного более просты в использовании чем языки низкого уровня, и позволяют решать актуальные и сложные задачи.
В нашем исследовании мы проведем обзор наиболее известных языков программирования высокого уровня, рассмотрим их достоинства и недостатки, определим область применения.
Для достижения этой цели рассмотрим следующие задачи:
Рассмотреть историю развития языков программирования
Охарактеризовать языки высокого уровня и рассмотреть работу компилятора
Выявить классификацию языков программирования высокого уровня
Согласно классификацию рассмотреть наиболее известные языки высокого уровня
Выявить их особенности, достоинства и недостатки.
В качестве способов в нашей работе мы будем использовать наблюдение и анализ. В качестве источников мы будем опираться на учебные пособия, одобренные Министерством образования, иностранные статьи, размещенные на крупных специализированных сайтах, а также монографии известных научных исследователей.
Структура работы включает в себя две главы, первая из которых содержит два параграфа, а вторая – четыре. Кроме того, в структуру работы включены такие элементы, как содержание, введение, заключение и список использованной литературы.
Глава 1. Языки программирования
1.1. История развития языков программирования
Основным понятием, которое в дальнейшем мы будем использовать, является «язык программирования». Дадим определение этому термину.
Язык программирования - это формальный искусственный язык, который, как и любой естественный язык, имеет алфавит, лексику, морфологию и синтаксис, а также семантику.
Говоря об общем понимании термина «язык программирования» в среде программистов-профессионалов и, прежде всего, создателей отдельных разновидностей языков программирования, можно выделить три основные точки зрения:
1) язык программирования как функция, так как он предназначен для написания компьютерных программ, которые применяются для передачи компьютеру инструкций по выполнению того или иного вычислительного процесса и организации управления отдельными устройствами;
2) язык программирования как задача: такое понимание связано с явным отличием этого средства от естественных языков, заключающегося в предназначенности его для передачи команд и данных от человека компьютеру, в то время как естественные языки используются лишь для общения людей между собой. Другими словами, язык программирования не может служить цели простого обмена информацией, как любой естественный язык;
3) язык программирования как исполнение: это понимание связано с тем, что язык программирования может использовать специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений.
Теперь обратимся к истории. С момента создания первых электронных вычислительных машин (ЭВМ), прилагались усилия по упрощению и автоматизации кодирования программ. Первые ЭВМ программировались исключительно на машинных языках (последовательности нулей и единиц), которые явно указывали компьютеру, какие операции и в каком порядке должны быть выполнены.
Надо отметить, что такое программирование было очень медленным, утомительным и подверженным ошибкам. Программу было очень трудно контролировать. Кроме того, при программировании в машинных кодах надо хорошо знать внутреннюю структуру ЭВМ, принцип работы каждого блока. И самое плохое в таком языке, что программы на данном языке являются машинозависимыми, т.е. для каждой ЭВМ необходимо было составлять свою программу, а также программирование в машинных кодах требует от программиста много времени, труда, повышенного внимания.
Довольно скоро стало понятно, что процесс формирования машинного кода можно автоматизировать. Уже в 1950 году для записи программ начали применять мнемонический язык - язык assembly. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова, которые отражали суть команды. Дадим определение этому понятию.
Язык ассемблера — система обозначений, используемая для представления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления).
Во второй половине 1950-х годов появляются первые языки программирования высокого уровня. Философия, стоящая за этими языками, заключается в создании высокоуровневой системы обозначений, облегчающей программисту написание программ для численных вычислений, бизнес-приложений и символьных программ. В последующие десятилетия было создано множество языков программирования с новыми возможностями, которые сделали написание программ более простым, естественным и надёжным. Рассмотрим более подробно их ключевые особенности в следующем параграфе.
1.2. Языки программирования высокого уровня
Перейдем непосредственно к языкам программирования высокого уровня. В первую очередь обратимся к истории, чтобы понять предпосылки их появления.
Середина 50-х гг. характеризуется стремительным прогрессом в области программирования. Роль программирования в машинных кодах стала уменьшаться, стали появляться языки программировании нового типа, выступающие в роли посредника между машинами и программистами. Эти языки программирования были машинонезависимыми (не привязаны к определенному типу ЭВМ).
Но для каждого языка были разработаны собственные компиляторы - программа, выполняющая компиляцию. Рассмотрим этот процесс более подробно, так как хоть он и является для многих черным ящиком, но является основополагающим в создании и использовании языков программирования высокого уровня.
Компиляция - трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера).
Компилятор (от англ. compile – составлять, компоновать) – это транслятор, который осуществляет перевод исходной программы в эквивалентную ей результирующую программу на машинном языке или на языке ассемблера. Результирующая программа компилятора называется объектной программой, или объектным файлом. Даже в том случае, когда результирующая программа порождается на машинном языке, между объектным файлом и исполняемым файлом есть существенная разница.
Для связывания между собой объектных файлов, порождаемых компилятором, а также файлов библиотек предназначен компоновщик, или редактор связей (от англ. link – связывать, сцеплять). Результатом его работы является единый файл (исполняемый файл), который содержит весь текст результирующей программы на машинном языке. Для выполнения этой задачи компоновщик проходит по объектному коду, начиная с точки входа (главной исполняемой функции), находит все вызовы внешних процедур и функций, обращений к внешним переменным и увязывает их с кодом тех модулей, в которых они описаны. Функции, описанные в разных модулях исходной программы, могут вызывать друг друга сколь угодно много раз. Компоновщик должен найти соответствие каждому из этих вызовов и определить («разрешить») соответствующую ссылку. Ссылки, которым компоновщик не смог найти соответствие, называются неразрешёнными. В этом случае компоновщик выдаёт сообщение об ошибке.
Основная функция компилятора – отображение входной программы в эквивалентную ей исполняемую программу. Это отображение разделяется на две части: анализ и синтез. Анализ разбивает входную программу на составные части и накладывает на них грамматическую структуру. Затем он использует эту структуру для создания промежуточного представления входной программы. Если анализ обнаруживает, что входная программа неверно составлена синтаксически либо семантически, он должен выдать информативные сообщения об этом, чтобы пользователь мог исправить обнаруженные ошибки.
Анализ также собирает информацию об исходной программе и сохраняет её в структуре данных, именуемой таблицей идентификаторов (символов), которая передаётся вместе с промежуточным представлением синтезу.
Синтез строит требуемую целевую программу на основе промежуточного представления и информации из таблицы идентификаторов. Анализ часто называют начальной стадией, а синтез – заключительной. Если рассмотреть процесс компиляции более детально, можно увидеть, что он представляет собой последовательность фаз, каждая из которых преобразует одно из представлений входной программы в другое. На практике некоторые фазы могут объединяться, а межфазное промежуточное представление может не строиться явно. Таблица идентификаторов, в которой хранится информация обо всей входной программе, используется всеми фазами компилятора. Рассмотрим подробнее каждую из фаз и их функции.
Первая фаза компиляции называется лексическим анализом или сканированием. Лексический анализатор читает поток символов, составляющих входную программу, и группирует эти символы в значащие последовательности, называемые лексемами. Лексемы передаются последующей фазе компилятора, синтаксическому анализу.
Вторая фаза компилятора – синтаксический анализ или разбор. Во время выполнения этой фазы используются лексемы, полученные от лексического анализатора, для создания древовидного промежуточного представления программы, которое описывает грамматическую структуру потока лексем.
Типичным промежуточным представлением является синтаксическое дерево, в котором каждый внутренний узел представляет операцию, а дочерние узлы – аргументы этой операции. Семантический анализатор использует синтаксическое дерево и информацию из таблицы идентификаторов для проверки входной программы на семантическую согласованность с определением языка программирования. Он также собирает информацию о типах и сохраняет её в синтаксическом дереве или в таблице идентификаторов для последующего использования в процессе генерации промежуточного кода.
После синтаксического и семантического анализа исходной программы компиляторы генерируют низкоуровневое промежуточное представление входной программы, которое можно рассматривать как программу для абстрактной вычислительной машины. Такое промежуточное представление должно обладать двумя важными свойствами: оно должно легко генерироваться и легко транслироваться в целевой машинный язык.
Таким образом, в данной главе мы рассмотрели предпосылки к появлению языков программирования высокого уровня и их функции. Мы подробно описали, каким образом происходит работа компилятора, который является неотъемлемой частью в программировании на языках высокого уровня.
Глава 2. Обзор языков программирования высокого уровня
2.1 Классификация языков программирования высокого уровня
Существует несколько классификаций языков программирования: по системе типизации, по уровню абстракции, по поколению, по модели исполнения, по парадигме. В нашей работе мы будем придерживаться классификации, характерной для языков программирования высокого уровня.