Современные методы разработки формальных языков программирования

Автор работы: Пользователь скрыл имя, 30 Мая 2013 в 11:47, отчет по практике

Краткое описание

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

Содержание

ВВЕДЕНИЕ 3
1. Современные языки программирования 5
2. Парадигмы программирования 8
2.1 Императивная модель 9
2.2 Декларативная модель 10
2.3 Структурная модель 11
2.4 Метапрограммирование 12
3. Трансляторы 15
3.1 Компилятор 15
3.2 Интерпретатор 16
4. Типизация данных 20
4.1 Динамическая типизация. 23
4.2 Статическая типизация. 24
ЗАКЛЮЧЕНИЕ 27
Список использованных источников 29

Вложенные файлы: 1 файл

Реферат - Современные языки программирования.doc

— 175.50 Кб (Скачать файл)

Класс – это тип, описывающий устройство объектов. Это в чистом виде абстрактный тип данных, создаваемый программистом.

Объект – сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса.

Понятие «класс» подразумевает  некоторое поведение и способ представления. Понятие «объект» подразумевает  нечто, что обладает определённым поведением и способом представления.[5]

2.4 Метапрограммирование

 

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

Есть несколько подходов реализующих  модель метапрограммирования:

Генерация кода – при этом подходе код программы не пишется вручную, а создается автоматически программой-генератором на основе другой, более простой программы. Реализуется двумя основными методами:

Шаблоны. Решают задачу, если соблюдение «правил» сводится к вставке в  программу повторяющихся (или почти  повторяющихся) кусков кода. Помимо этого, обладают еще рядом достоинств: например, помогают повторному использованию.

Внешне-языковые средства. Применяются в случаях, если простых средств вроде шаблонов недостаточно. Язык генератора составляется так, чтобы автоматически или с минимальными усилиями со стороны программиста реализовывать правила парадигмы или необходимые специальные функции. Фактически, это – более высокоуровневый язык программирования, а генератор – не что иное, как транслятор. Генераторы пишутся, как правило, для создания специализированных программ, в которых очень значительная часть стереотипна, либо для реализации сложных парадигм.[6]

Основные парадигмы и подходы  к решению задач в современных  языках программирования представлены в таблице 2.

Таблица 2 – Парадигмы и подходы языков программирования [2]

Язык

программирования

Парадигмы

программирования

Основные подходы

программирования

Java

императивная

структурная

объектно-ориентированный

C

императивная

процедурный

C++

мультипарадигмальный

 метапрограммирование

процедурный

объектно-ориентированный

PHP

мультипарадигмальный

процедурный

объектно-ориентированный

C#

мультипарадигмальный

 императивная

процедурный

объектно-ориентированный

Python

императивная

декларативная

структурная

процедурный

функциональный

объектно-ориентированный

Visual Basic

императивная

структурная

процедурный

объектно-ориентированный

Objective C

мультипарадигмальный

процедурный

объектно-ориентированный

Perl

мультипарадигмальный

 декларативная

функциональный

объектно-ориентированный

Delphi

императивная

структурная

процедурный

объектно-ориентированный


 

 

 

 

 

 

 

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

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

 

3. Трансляторы

 

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

Транслятор – обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.

В настоящее время трансляторы  разделяются на две основные группы: компиляторы и интерпретаторы.

 

 

3.1 Компилятор

 

Компилятор – это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7–10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд. Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам).[7]

3.2 Интерпретатор

 

Интерпретатор – программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. Интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее.

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

Интерпретатор компилирующего типа – это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является бо́льшее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки – большее требование к ресурсам и требование на корректность исходного кода.[7]

 

 

 

 

Достоинства интерпретаторов:

– Бо́льшая переносимость интерпретируемых программ – программа будет работать на любой платформе, на которой есть соответствующий интерпретатор.

– Как правило, более совершенные  и наглядные средства диагностики  ошибок в исходных кодах.

– Упрощение отладки исходных кодов программ. Интерпретатор позволяет начать обработку данных после написания даже одной команды.

– Меньшие размеры кода по сравнению с машинным кодом, полученным после обычных компиляторов.

 

Недостатки интерпретаторов:

– Интерпретируемая программа не может выполняться отдельно без программы–интерпретатора. Сам интерпретатор при этом может быть не очень компактным.

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

– Практически отсутствует оптимизация  кода, что приводит к дополнительным потерям в скорости работы интерпретируемых программ.

 

Виды трансляторов современных языков программирования представлены в таблице 3.

 

 

 

 

 

 

 

 

 

 

 

Таблица 3 – Трансляторы современных  языков программирования [2]

Язык

программирования

Транслятор

Java

компиляция в байт-код интерпретатор

C

компилятор

C++

компилятор

PHP

компиляция в байт-код интерпретатор

C#

компиляция в MSIL-код

интерпретатор

Python

компиляция в байт-код интерпретатор

Visual Basic

компиляция в MSIL-код

интерпретатор,

компилятор

Objective C

компилятор

Perl

компиляция в байт-код интерпретатор

Delphi

компилятор


 

 

 

 

 

 

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

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

Использование интерпретации, напротив, позволяет оградить программиста от особенностей конкретных платформ, что  наиболее востребовано в связи с  развитием Интернет–технологий.

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

 

4. Типизация данных

 

Тип – относительно устойчивая и независимая совокупность элементов, которую можно выделить во всём рассматриваемом множестве.

Математически тип может быть определён  двумя способами:

    • Множеством всех значений, принадлежащим типу.
    • Предикатной функцией, определяющей принадлежность объекта к данному типу.

Тип данных – фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций. Любые данные, которыми оперируют программы, относятся к определённым типам.

Типы данных различаются уже на нижних уровнях системы. Так, например, даже в Ассемблере х86 различаются типы «целое число» и «вещественное число». Это объясняется тем, что для чисел рассматриваемых типов отводятся различные объёмы памяти, используются различные регистры микропроцессора, а для операций с ними применяются различные команды Ассемблера и различные ядра микропроцессора.

В языках программирования типы данных не всегда строго соответствуют подобным математическим типам. Например, тип “целое число” большинства языков программирования не соответствует принятому в математике типу “целое число”, так как в математике указанный тип не имеет ограничений ни сверху, ни снизу, а в языках программирования эти ограничения есть. Как правило, в языках и системах имеется множество целых типов, отличающихся допустимым диапазоном значений (определяемым объёмом занимаемой памяти).[1]

 

 

 

Наиболее часто используемые типы данных:

Простые:

    • Перечислимый тип. Хранит значения прямо указанные в его описании.
    • Целочисленный тип. Целое число со знаком и без знака.
    • Вещественный тип. Вещественное число с запятой и с плавающей точкой.
    • Символьный тип. Хранит один символ в различных кодировках.
    • Множество. Совпадает с обычным математическим понятием множества.
    • Логический тип. Принимает два значения ложь = 0 и истина = 1.
    • Указатель. Хранит адрес в памяти, указывающий на какую–либо информацию, как правило – указатель на переменную.

Составные (сложные):

    • Массив. Хранит индексированный набор элементов одного типа.
    • Строковый тип. Хранит строку символов.
    • Запись (структура). Набор различных элементов (полей), хранимый как единое целое.
    • Файловый тип. Хранит только однотипные значения, доступ к которым осуществляется только последовательно.
    • Класс, метакласс, интерфейс. Абстрактные типы данных в объектно–ориентированном программировании (ООП).

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

Существует два вида контроля типов:

  • Статическая типизация – при которой переменная, параметр подпрограммы, возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменён позже. Переменная или параметр будут принимать, а функция возвращать значения только этого типа.
  • Динамическая типизация – при которой переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов.

Определение соответствия типов тоже является важным моментом, для этого используется следующие два подхода:

  • Строгая типизация – совместимость типов автоматически контролируется транслятором, она должна быть явно указана (наследована) при определении типа или определяется структурой самого типа (типами элементов, из которых построен составной тип).
  • Слабая типизация – совместимость типов никак транслятором не контролируется. В языках со слабой типизацией обычно используется подход под названием «утиная типизация» – когда совместимость определяется и реализуется общим интерфейсом доступа к данным типа.

На сегодняшний день не существует единого мнения о том, какой вид  типизации лучше. Рассмотрим основные достоинства и недостатки каждого  вида контроля типа.[1]

 

 

4.1 Динамическая типизация.

 

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

Информация о работе Современные методы разработки формальных языков программирования