Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (Понятие языка программирования).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 24.04.2023

Просмотров: 206

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Таким образом, появляется новый элемент понятия формального языка - языковая дескриптивная система. Опять-таки, для определения этой системы будем двигаться от абстрактного к конкретному. Считая, что порождение более весомым (ведущим) аспектом сравнению с восприятием, сначала сосредоточимся на порождении.

Интуитивное понимание порождение заключается в том, что это процесс, который ведет от определенных начальных элементов в заключительных элементах (окончательно порожденных элементов). Основные вопросы для уточнения этой модели заключаются в следующем:

1. Элементы которой множества используются в процессе порождения?

2. Какие элементы являются начальными?

3. Какие элементы являются заключительными?

4. Как именно задаются операции порождения одних элементов от других?

Будем считать, что в процессе порождения происходит создание (преобразования) элементов множества St, начальные элементы задаются опилками I, а заключительные - опилками F с St. Остается вопрос о способах порождения новых элементов. Самым простым (абстрактные) является случай, когда порождение задается бинарным отношением преобразований (переходов, транзиций) tr St St..

Таким образом, получили первую над-абстрактную модель порождающей системы TS, которая задается параметрами (St, I, F, tr). Такая система порождает множество элементов L (TS) следующим образом: берется элемент a с I, далее берется элемент b, такой что (a, b) принадлежит tr, затем этот процесс повторяется, пока не будет получен элемент c F. Этот элемент и входит в L (TS). Здесь фактически описан процесс построения рефлексивного транзитивного замыкания tr * отношение tr и выбора тех пар, первый элемент которых принадлежит I, а второй - F. Это позволяет записать формулу TS) = { c |(a,ctr*, aÎI, cÎF}.}.

Приведенную модель в литературе часто называют транзиционной системой.

Транзиционные системы являются моделями абстрактных динамических систем, но чисто языковые характеристики в них отсутствуют.

Абстрактную модель порождающей системы толкуем как порождающий грамматику G = (N, T, P, S) с приведенными выше параметрами, является конкретизацией транзиционной системы TS = (St, I, F, tr) и определяет формальный язык L (G) указанным выше образом.

Четыре построенных модели и их характеристики представлены на рис. 2.

Экзенстенциальные множественные модели


Модель 1. Язык – определенное множество элементов

Дескриптивно-множественные модели

Модель 3. Язык - определенное множество элементов, которая задается транзиционной системой

Модель 2. Язык – определенное множество элементов, которые являются конечными последовательностями

Модель 4. Язык - определенная множество элементов, которые являются конечными последовательностями, и которая задается порождающей грамматик.

Рисунок 2- Модели языков и грамматик разного уровня абстракции

Рисунок представляет взаимосвязь моделей формальных языков. Он демонстрирует, что определения формального языка имеет по меньшей мере два измерения: первый уровень (вертикальный) задает уровень абстракции составляющих, второй уровень вводит новую дескриптивную составляющую.

Различение уровней абстракции определений формального языка и порождающих грамматик позволяет исследовать их свойства на более адекватном (более абстрактном) уровне, где такие исследования будут простыми. Далее определенные свойства переносятся (наследуются) на более конкретные уровни. Например, теоретико- множественные свойства верхнего уровня (пустоту языка, конечности и т.д.) переносятся на более конкретные уровни.

1.2. Классификация языков программирования

Современные языки программирования прошли свою историю развития.

Поколение 1. - 1GL (First Generation Languages):

Начало 1950-х годов - языка первых компьютеров. Первая речь асемблера, созданная по принципу «одна инструкция - одна лента». Процесс программирования предусматривал запись всех алгоритмов непосредственно машинной. .

2 поколение - 2GL. Конец 1950-х - начало 1960-х гг - разработан символьный асемблер, в котором появилось понятие переменной. Это первая полноценная речь программирования. Программы применяются для создания драйверов оборудования компьютеров.


3 поколения - 3GL

1960-е гг - языки программирования высокого уровня. Их характеристики:

- относительн-ая простота;

- независимость от конкретного компьютера;

- возможность использования мощных синтаксических конструкций[8].

В связи с проблемой переноса программ с одной машины на другую и отсутствием общей точки зрения на то, что именно считать стандартом этого языка программирования, Американский национальный институт стандартов (ANSI) и Международная организация по стандартизации (ISO) приняли стандарты для множества популярных языков программирования.

4 поколение - 4GL Начало 1970-х гг до сегодняшнего времени. – языки, предназначенные для реализации крупных проектов. Проблемно-ориентированные языки, оперирующие конкретными понятиями узкой области. Это уже не языки, а системы программирования или средства, ориентированные на создание больших программных комплексов. Эти языки или средства программирования интегрированы в пользовательские оболочки и имеют простой и удобный интерфейс. Основная сфера их применения – проектирование приложений с использованием баз данных, широкое применение прототипов (структур без данных, экранных форм, отчетов), средств визуального проектирования.

5 поколение - 5G. С середины 1990-х гг - по настоящее временя системы программирования, назначение которых заключается в превращении инструкций на тексты программ универсальном языке программирования.

Таким образом, исторически сложилось три парадигмы программирования.

1) по функциональному признаку: - универсальные языки (в них можно промоделировать, условно говоря, любой алгоритм)

- специализированные языки (ориентированные на определенные классы задач)

2) по предметной ориентацией:

Языка для решения определенного класса задач, например, языка программирования для решения задач символьной обработки (Lisp, Cobol), языки для обработки флэш-клипов (АctionScript) и т. п.

3) По уровню абстракции:

- языка низкого уровня (машинно-зависимые) - Assembler и т. д.;

- языка высокого уровня (ориентированные на пользователя в определенной мере) - Pascal, C, Fortran и т. д.;

Как отдельное направление следует выделить языка программирования баз данных, предназначены для манипуляции большими централизованными массивами данных и получения из них информации. Многие из этих языков (Access, FoxPro, 4GL и др.) имеют развитые процедурные элементы. Фактическим стандартом стала речь запросов к базам данных SQL

Языки программирования низкого уровня ориентированы на конкретный тип процессора и учитывают его особенности.


Преимущества: с помощью языков низкого уровня создаются эффективные и компактные программы, поскольку разработчик получает доступ ко всем возможностям процессора.

Недостатки: программист, работающий с языками низкого уровня, должна быть высокой квалификации, хорошо понимать устройство компьютера, а также результирующая программа не может быть перенесена на компьютер с другим типом процессора.

Языки низкого уровня, как правило, используют для написания некрупных системных приложений, драйверов устройств, модулей стыков с нестандартным оборудованием, когда важнейшими требованиями являются компактность, ко и возможность прямого доступа к аппаратным ресурсам.

Языки программирования высокого уровня позволяют писать программы в форме, более приближенной к обычной речи. Программу, написанную на языке высокого уровня, можно более легко читать и модифицировать, и это значительно облегчает работу программиста по сравнению с написанием машинного кода. Для перевода программ, написанных на языке высокого уровня, в машинные коды, должны существовать специальные программы. Такие программы называются трансляторами.[9]

Важной особенностью языков высокого уровня является их относительная независимость от машины. В связи с проблемой переноса программ с одной машины на другую и отсутствием общей точки зрения на то, что именно считать стандартом этого языка программирования, Американский национальный институт стандартов (ANSI) и Международная организация по стандартизации (ISO) приняли стандарты для многих популярных языков программирования. Каждый язык высокого уровня должен иметь формальное описание. В этом описании должны быть определены правила записи программных конструкций (синтаксис) и то, каким образом эти конструкции выполняются (семантика).

Глава 2. Критерии выбора среды и языка разработки программ

2.1. Основные парадигмы программирования

Выделяют четыре основные парадигмы программирования: процедурное, функциональное, логическое и объектно-ориентированное программирование.


Процедурное программирование. Концепция процедурного программирования является исторически первой и наиболее близкой к классическому определению программы. Главный акцент процедурном программировании делается на обработке, то есть на алгоритме. В основу программы, построенной по процедурным принципам, лежит прогрессивный принцип-на изменение входных данных, пока не будет получен результат, причем каждая операция расписывается в явном виде. Данные, с которыми оперирует программа, сохраняются в именуемых участках оперативной памяти, которые называются измененными[10].

Функциональное программирование. Исполнение программы рассматривается как вызов некоторой функции, которая, в свою очередь, может вызвать другие функции. Наиболее известным представителями концепции парадигмы является ЛИСП.

Логическое программирование. В основе выполнения программы лежит механизм автоматического доведения теорем на основе логического вывода. Наиболее известный представитель - Пролог.

Объективно -ориентированное программирование. Данная парадигма является на сегодня наиболее популярной и стремительно развивается. Объектная программа рассматривается как совокупность параллельно существующих объектов, которые взаимодействуют между собой. Каждый объект умеет выполнять определенные операции и характеризуется определенным поведением. Исторически, первым объектным языком считается Smalltalk. Наиболее известными представителями этой парадигмы является C ++, Object Pascal, лежащий в основе системы визуального программирования Delphi, Java.

В машине Тьюринга связаны между собой информация представляется структурой, для которой выделяется блок ленты. Например, если нужно хранить информацию о человеке, первые несколько элементов блока будут содержать имя, несколько следующих элементов - возраст и так далее. Спустя почти столетие лента Тьюринга прежнему неплохо описывает компьютерную память и арифметику указателей языка программирования[11], в которой для доступа к элементам структуры используется адресация база-плюс- смещения. Используя язык C, можно написать:

typedef struct {

char * name;

double age, height;

} person;

person Ivanov = {.name="Іванов", .age=28,

.height=173}

Здесь переменная Ivanov будет указывать на блок памяти, а Ivanov.height будет указывать на ленту сразу же после имени и возраста (и после каких-либо дополнительных элементов, которые включаются с целью выравнивания на границе слова).