Файл: Классификация языков программирования высокого уровня.pdf
Добавлен: 30.03.2023
Просмотров: 472
Скачиваний: 2
СОДЕРЖАНИЕ
1.1 История развития языков программирования
2. Обзор современных языков программирования
3. Классификация языков программирования
3.2. Языки программирования низкого уровня
3.3. Языки программирования высокого уровня
3.4. Объектно-ориентированные языки
3.5. Декларативные языки программирования
3.6 Логическое программирование
3.7. Языки сценариев (скрипты)
Ваsic (Бейсик). Многоцелевая речь символических инструкций, разработанная в 1965 г. Созданный как учебный язык для начинающих. Согласно концепциям, заложенным в Basic, этот язык в смысле строгости и стройности является антиподом языка Pascal. В частности, в нем широко распространены различные правила умолчания, что считается плохим тоном в большинстве языков программирования подобного типа. Существует много диалектов этого языка, мало совместимых между собой.
Раsсаl (Паскаль). Созданный Н. Виртом в 1970г. специально для изучения программирования. Предъявляет жесткие требования к структуре программы, поддерживает большое количество пользовательских типов данных. Кроме того, в языке реализована концепция определения новых типов данных на основе уже имеющихся.
Перл, созданный Д.Ритчи в начале 1970-х годов для разработки операционной системы UNIX. Имеет средства для прямой работы с памятью. Был задуман как язык системного программирования для замены ассемблера, чтобы иметь возможность создавать такие же эффективные и короткие программы, но не зависеть от конкретного процессора. Он является самым популярным языком для создания системного программного обеспечения. Однако, большой набор операций и типов данных, современное оформление и высокая степень машино-независимости сделали его привлекательным языком программирования общего назначения. Несмотря на то, что он разрабатывался для новичков, он активно используется для обучения программированию. В дальнейшем синтаксис языка стал основой для многих других языков. На нем написано множество прикладных и системных программ и ряд известных ОС (в частности, UNIX).
Дальнейшим развитием идеи алгоритмического языка стали языки программирования более общего, не обязательно алгоритмического характера. Как и алгоритмические языки, такие языки, в конце концов, тоже нацелены на получение машинных программ, но во многих случаях их тексты допускают определенную свободу в исполнении и, как правило, дают лишь материал для синтеза искомых алгоритмов, а не сами эти алгоритмы. Такими языками, например, являются:
С ++. Объектно-ориентированное расширение языка С, созданное Б. Страуструпом в 1980 р. Объединяет свойства как высокоуровневых, так и низкоуровневых языков. Основан на использовании классов и объектов.
При создании языка С ++ стремились сохранить его синтаксис, совместимый с языком С. Большинство программ, написанных на языке С, исправно работают и с компилятором языка С ++. Нововведениями языка С ++ по сравнению с языком С является поддержка объектно-ориентированного программирования через классы и объекты, поддержка обобщенного программирования через шаблоны, дополнения к стандартной библиотеки, дополнительные типы данных, обработка исключений (исключений), пространства имен, встроенные функции, переопределение операторов и имен функций, ссылки и операторы управления свободно распределенной памятью.
Языки программирования можно разделить на универсальные и специализированные: универсальные языки используются для решения различных задач; специализированные - предназначены для решения задач одного или нескольких видов. Например, работа по базам данных, web-программирование, написание скриптов для администрирования операционных систем. Примерами таких языков программирования являются:
PHP. Скриптовый язык программирования общего назначения, интенсивно применяется для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических веб-сайтов.
ActionScript. Объектно-ориентированный язык программирования, который добавляет интерактивность, обработку данных и многое другое к содержимому Flash-приложений. ActionScript выполняется виртуальной машиной (ActionScript Virtual Machine), которая является составной частью Flash Player. ActionScript компилируется в байт-код, который включается до swf-файла.
Сегодня говорят уже о различных технологиях программирования и соответствующие им средства языковой поддержки. В общем, с точки зрения функциональных возможностей различают пять поколений средств программирования:
Ассемблеры, созданные по принципу "одна инструкция - одна строка".
Символический ассемблер, в котором появилось понятие переменной. Он стал первым полноценным языком программирования. Благодаря его возникновению заметно возросли скорость разработки и надежность программ.
Универсальные языки высокого уровня, с помощью которых можно решать любые прикладные задачи. Характеризуются относительной простотой, независимостью от конкретного ПК, возможностью использования мощных синтаксических конструкций (Fortran, Cobol, А1gо1, PL / 1, Basic, Pascal, C / C ++, Javа, ...).
Проблемно-ориентированные языки, предназначенные для реализации крупных проектов, повышение их надежности и скорости создания. Как правило, имеют встроенные мощные операторы, позволяющие одной строкой описать функциональность, для реализации которой на языках младших поколений потребовались бы тысячи строк кода. Ориентированы на специализированные области применения, где хороших результатов можно добиться, используя языки, оперирующие конкретными понятиями узкой предметной области (PROLOG - язык для логического программирования, SQL - язык программирования баз данных, НТМL - язык разметки для Internet, UML - язык графического моделирования).
Системы автоматизированного создания приложений, в том числе и с помощью визуальных средств разработки (RAD-сред). Характеризуются возможностью автоматического формирования результирующего текста на универсальных языках программирования (Delphi, Borland C, MS Visual Studio и т.д.).
На сегодняшний день количество языков программирования измеряется уже тысячами и продолжает расти.
Программа, написанная на языке программирования высокого уровня не может быть непосредственно выполнена на ЭВМ - она содержит только текст, описывающий, например, последовательность действий. Чтобы получить работающую программу, надо этот текст перевести на машинный язык.
Процесс перевода исходного текста программы, написанного на языке высокого уровня, в машинный язык называется трансляцией (от англ. translation - перевод). Трансляция - это чисто техническая работа и ее поручают компьютеру.
Существует два способа трансляции:
- интерпретация (от англ. interpretation) - пооператорный перевод и выполнения команд программы. Каждая инструкция программы переводится в машинный код и выполняется, и только после этого процессор переходит к обработке следующей инструкции. Процесс продолжается до первой ошибки или, если ошибок нет, - до конца программы.
- компиляция (от англ. compile - собирать) - автоматический перевод всего текста программы в машинный код и формирования объектного модуля, который впоследствии может быть выполнен самостоятельно. При этом параллельно осуществляется синтаксический контроль программы в целом. Транслированная программа не выполняется немедленно, а сохраняется в памяти компьютера. При просмотре программы компилятор выделяет место в памяти для каждой переменной.
Компиляцию можно сравнить с письменным переводом книги, интерпретацию - с синхронным переводом речи.
Каждый из способов трансляции имеет свои преимущества и недостатки. Так откомпилированные программы выполняются быстрее, чем те, что интерпретируются; однажды откомпилирована программа не требует в дальнейшем компилятора. Программы же, написанные на языках, ориентированных на интерпретацию, требуют присутствия в памяти компьютера интерпретатора, который осуществляет трансляцию программы в ходе ее выполнения.
Однако, интерпретатор полезен как при отладке, так и при трансляции программ, подверженных частым изменениям: исправленную программу можно сразу запустить на выполнение, чтобы проверить ее работоспособность. При использовании же компилятора исправленную программу приходится перекомпилировать. Интерпретатор используется в тех случаях, когда требуется простота трансляции (Basic), или там, где другой способ перевода очень сложный или даже невозможен (Lisp).
Для реализации процесса трансляции служат специальные программы - трансляторы, которые обрабатывают команды языка программирования, как входные данные и, в соответствии с существующими правилами, переводят в эквивалентные машинные коды. Соответственно, трансляторы делятся на две категории: интерпретаторы и компиляторы. Как компилятор, так и интерпретатор должны соответствовать правилам конкретного языка высокого уровня, которую они транслируют.
Языках интерпретирующего типа является Basic, LISP, Perl, Prolog, Java; компилируя типа - Fortran, Pascal, С, C ++.
В целом процесс трансляции программы проходит в четыре этапа. На первом этапе - лексического анализа - группы символов текста программы превращаются в точки, понятны транслятора. Затем следует этап синтаксического анализа, когда эти отметки размещаются в иерархическом порядке, который отражает логику программы. На третьем этапе - контроль типов проверяется согласованность данных отметок друг с другом, что позволяет выявить ошибки в программе. И наконец, генератор кода формирует машинные команды процессору. Рассмотрим более подробно данные этапа.
Лексический анализ. Лексический анализ является первой фазой трансляции. Его основная задача - превратить исходный текст программы, состоящий из последовательности одиночных символов, последовательность осмысленных токенов - специальных отметок, которые понятны транслятору. Программа или функция, которая выполняет лексический анализ, называется лексическим анализатором или сканером.
Сканер читает буквы исходного кода программы одна за другой и в соответствии с грамматическими правилами языка объединяет их в лексемы. Например, строка программы на языке С / C ++
len = 3.14 * r;
состоит из следующих лексем: len, =, 3.14, * r,;. При выделении лексем сканер игнорирует пробелы между ними и сдвиги строк исходной программы, поскольку эта информация для трансляции является несущественной.
Большинство сложившихся сканером лексем имеют точно определенный правилами языка содержание: ключевые слова (например, if, for, while) указывают на действия, которые задаются синтаксисом языка программирования; операции (типа "+", "*") указывают на определенные действия (арифметические, логические) или на пересылку данных; числа задают реальные числовые значения (скажем 5 или 7); знаки препинания помогают транслятора разобраться в структуре программы. Другая разновидность лексем - идентификаторы - не имеют точно определенного правилам языка содержания, например, имя программы, имена переменных или констант.
Каждая выделенная лексема дополняется специальной пометкой, что определяет тип данной лексемы. Данная конструкция называется токеном. Например,
|
Т Океан |
П риклады лексем |
В пис |
Примечание |
|
if |
if |
оператор |
одна лексема |
|
relation |
>, <= |
операции отношения |
<Или <= или = или <> или> = или> |
|
id |
count, Name1 |
идентификатор |
много лексем |
|
num |
13 |
числовая стала |
много лексем |
|
string |
"Речь C ++" |
строчная стала |
много лексем |
Токены всех лексем и их лексическое значение заносятся в специальную таблицу. Для дополнительной информации о лексемы в таблице остаются свободные места. Они заполняются на последующих этапах работы транслятора. Сканер обрабатывает только одну лексему за раз.
Синтаксический анализ (от англ. Parsing). Это процесс анализа полученных на предыдущем этапе токенов с целью разбора грамматической структуры текста программы в соответствии с заданной формальной грамматикой.
Синтаксический анализатор (англ.parser) получает от сканера токены и оформляет их в структуру данных, обычно - в синтаксическое дерево (дерево разбора), которое соответствует синтаксической структуре входной последовательности и хорошо подходит для дальнейшей обработки.
Токен может быть либо «отцом», или «сыном», или тем и другим одновременно. Синтаксический анализатор размещает токен в дереве, анализируя его смысл, содержание токена, предшествующий данному, а иногда и на следующий токен. Группы токенов объединяются в операторы - основные структурные единицы программы.
Пример синтаксического дерева разбора для выражения:
Построением дерева управляет набор явно записанных правил: каждой последовательности токенов отвечает один-единственный способ размещения их в дереве. Встречая последовательность токенов, к которой подходит ни правило, синтаксический анализатор считает, что в программе содержится ошибка. В таком случае транслятор посылает сообщение об ошибке, в котором содержится информация о месте и тип ошибки.
В компиляторе и интерпретаторе синтаксический анализ (разбор) идет несколько по-разному. В интерпретаторе отбирается ровно столько токенов, сколько надо для образования логично связанного фрагмента исходного языка (оператора). После синтаксического анализа этот фрагмент передается на следующий этап транслятора. Очередной фрагмент выделяется только после завершения обработки и выполнения текущего фрагмента. Синтаксический анализ в компиляторе обрабатывает всю программу целиком, не выполняя ее: после разбора вся программа передается на следующий этап.