Добавлен: 29.04.2023
Просмотров: 398
Скачиваний: 4
СОДЕРЖАНИЕ
Глава 1 Структурные модели и функции языков программирования
1.1 Разнообразие языков программирования
1.2 Парадигмы программирования
1.2.4 Особенности функционального и логического программирования
1.2.6 Концепции модульного программирования
1.2.7 Объектно-ориентированные языки программирования
1.2.9 Динамическая прикладная среда для бизнес-объектов
Глава 2 Трансляция и типизация данных
2.2.1 Простые и составные типы данных
Использование почти всеми языками объектно-ориентированного подхода наряду с «классическим» процедурным, обусловлено возрастающей сложностью современных задач. Создание больших распределенных систем просто не мыслимо без создания структурной модели, а работа с объектами, в любых их проявлениях, значительно облегчает разработку и отладку таких систем.
1.2.9 Динамическая прикладная среда для бизнес-объектов
Рассмотрим динамическую интерпретацию мета-моделей. Как же императивные и декларативные конструкции влияют друг на друга? Понятно, мы анализируем декларативные описатели — некий формализованный формат данных, регулярную грамматику, которую можно без труда отпарсить регулярными выражениями, строковыми операциями или берем уже готовый парсер (например, JSON или XML). Таким образом, императивный алгоритм может менять структуру и последовательность исполнения кода. Но более того, мета-модель содержит еще и интерпретируемые скрипты для выражения бизнес-логики, скрипты получают уже развернутую в памяти декларативную часть мета-модели в свое полное распоряжение и могут обращаться к библиотеками. Как пример – JavaScript. Скрипты из мета-модели не имеют доступа к интраспекции «виртуальной машины», а только к данным и метаданным, т.е. к модели предметной области. Такой скрипт может не знать даже, где он запущен, на клиенте или на сервере. Прикладная среда — это прослойка между прикладной моделью и операционной системой, позволяющая виртуализировать прикладное приложение, отвязывая его от системы и платформы.
Облачные технологии и виртуализация сейчас поднялись только до уровня инфраструктуры и платформы, следующий же, прикладной уровень практически не затронут. Все более четко проявляется потребность в новой архитектуре прикладных приложений. Сервисная архитектура (SOA), несомненно позволяет удовлетворить большинство нужд корпоративных систем, однако, в силу своей тяжеловесности, статичности и сложности разработки, только крупные компании могут себе позволить разработку ПО в этой технологии. Это обусловлено сложным технологическим циклом создания ПО, включающем проектирование, программирование, отладку, тестирование, сборку, доставку пользователю, инсталляцию, настройку и поддержку. Каждая новая версия прикладной системы требует множества шагов для того, чтобы стать доступной на рабочем месте пользователя. А переход между версиями сопряжен со сложностями конвертации данных и обратной совместимости форматов обмена данными и форматов файлов. Все это является результатом следующих особенностей архитектуры программных систем:
- Смешивание в программном коде абстракций разного уровня внутри одного класса или модуля. Например, реализация чтения/записи из БД, бизнес-логики и визуализации в одном классе.
- Высокая связанность кода двух смежных абстрактных слоев приложения. С односторонней или двухсторонней зависимостью слоев. Часто, высокая связанность выражена в наличии зашитых в коде идентификаторов классов и функций, интерфейсов и параметров, таблиц и полей.
- Сборочно-ориентированный жизненный цикл и компиляция бизнес-моделей в машинный код или в байт-код с последующий ручным развертыванием на сервере.
- Жесткая фиксация интерфейсов между модулями системы и сетевых интерфейсов (по структуре, параметрам вызова и типам данных).
Применение динамической прикладной среды с использованием интерпретируемых метаданных при подготовке бизнес-моделей к запуску в «виртуальной машине», позволяет нам резко сократить время на модификацию систем, вплоть до того, что сделать гибкую модификацию обычным штатным режимом работы прикладной системы, а не зашивать модель в компилируемый код.
Глава 2 Трансляция и типизация данных
2.1 Трансляторы
2.1.1 Компилятор
Поскольку текст, записанный на языке программирования, непонятен компьютеру, то требуется перевести его на машинный код. Такой перевод программы с языка программирования на язык машинных кодов называется трансляцией, а выполняется она специальными программами- трансляторами.
Транслятор – обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.
В настоящее время трансляторы разделяются на две основные группы: компиляторы и интерпретаторы.
Компилятор – это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7–10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд. Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам).
2.1.2 Интерпретатор
Интерпретатор – программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. Интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее.
Простой интерпретатор – анализирует и тут же выполняет (собственно интерпретация) программу покомандно (или построчно), по мере поступления исходного кода на вход интерпретатора. Достоинством такого подхода является мгновенная реакция. Недостаток – такой интерпретатор обнаруживает ошибки в тексте программы только при попытке выполнения команды (или строки) с ошибкой.
Интерпретатор компилирующего типа – это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большое быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки – большее требование к ресурсам и требование на корректность исходного кода.
Достоинства интерпретаторов:
- Большая переносимость интерпретируемых программ – программа будет работать на любой платформе, на которой есть соответствующий интерпретатор.
- Как правило, более совершенные и наглядные средства диагностики ошибок в исходных кодах.
- Упрощение отладки исходных кодов программ. Интерпретатор позволяет начать обработку данных после написания даже одной команды.
- Меньшие размеры кода по сравнению с машинным кодом, полученным после обычных компиляторов.
Недостатки интерпретаторов:
- Интерпретируемая программа не может выполняться отдельно без программы–интерпретатора. Сам интерпретатор при этом может быть не очень компактным.
- Интерпретируемая программа выполняется медленнее, поскольку промежуточный анализ исходного кода и планирование его выполнения требуют дополнительного времени в сравнении с непосредственным исполнением машинного кода, в который мог бы быть скомпилирован исходный код.
- Практически отсутствует оптимизация кода, что приводит к дополнительным потерям в скорости работы интерпретируемых программ.
Виды трансляторов современных языков программирования представлены следующим образом (см. Таблица 3):
Таблица 3 –Трансляторы современных языков программирования
|
Язык программирования |
Транслятор |
|
Java |
компиляция в байт-код интерпретатор |
|
C |
компилятор |
|
C++ |
компилятор |
|
PHP |
компиляция в байт-код интерпретатор |
|
C# |
компиляция в MSIL-код интерпретатор |
|
Python |
компиляция в байт-код интерпретатор |
|
Visual Basic |
компиляция в MSIL-код интерпретатор, компилятор |
|
Objective C |
компилятор |
|
Perl |
компиляция в байт-код интерпретатор |
|
Delphi |
компилятор |
Современные языки программирования используют в равной степени компиляцию и интерпретацию.
Широкое использование компиляторов обусловлено большой скоростью работы программ, а также возможность использовать полностью все возможности конкретных платформ и создание «машинно-зависимых» участков кода и программ.
Использование интерпретации, напротив, позволяет оградить программиста от особенностей конкретных платформ, что наиболее востребовано в связи с развитием Интернет–технологий.
Среди интерпретируемых языков используются в основном интерпретаторы компилирующего типа, что обусловлено значительным увеличением скорости работы программ в сравнении с простыми интерпретаторами. При разработке больших и сложных приложений такое увеличение скорости может быть очень существенным.
2.2. Типизация данных
2.2.1 Простые и составные типы данных
Тип – относительно устойчивая и независимая совокупность элементов, которую можно выделить во всём рассматриваемом множестве.
Математически тип может быть определён двумя способами:
- Множеством всех значений, принадлежащим типу.
- Предикатной функцией, определяющей принадлежность объекта к данному типу.
Тип данных – фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций. Любые данные, которыми оперируют программы, относятся к определённым типам.
Типы данных различаются уже на нижних уровнях системы. Так, например, даже в Ассемблере х86 различаются типы «целое число» и «вещественное число». Это объясняется тем, что для чисел рассматриваемых типов отводятся различные объёмы памяти, используются различные регистры микропроцессора, а для операций с ними применяются различные команды Ассемблера и различные ядра микропроцессора.
В языках программирования типы данных не всегда строго соответствуют подобным математическим типам. Например, тип “целое число” большинства языков программирования не соответствует принятому в математике типу “целое число”, так как в математике указанный тип не имеет ограничений ни сверху, ни снизу, а в языках программирования эти ограничения есть. Как правило, в языках и системах имеется множество целых типов, отличающихся допустимым диапазоном значений (определяемым объёмом занимаемой памяти).
Наиболее часто используемые типы данных:
Простые:
- Перечислимый тип. Хранит значения прямо указанные в его описании.
- Целочисленный тип. Целое число со знаком и без знака.
- Вещественный тип. Вещественное число с запятой и с плавающей точкой.
- Символьный тип. Хранит один символ в различных кодировках.
- Множество. Совпадает с обычным математическим понятием множества.
- Логический тип. Принимает два значения ложь = 0 и истина = 1.
- Указатель. Хранит адрес в памяти, указывающий на какую–либо информацию, как правило – указатель на переменную.
Составные (сложные):
- Массив. Хранит индексированный набор элементов одного типа.
- Строковый тип. Хранит строку символов.
- Запись (структура). Набор различных элементов (полей), хранимый как единое целое.
- Файловый тип. Хранит только однотипные значения, доступ к которым осуществляется только последовательно.
- Класс, метакласс, интерфейс. Абстрактные типы данных в объектно–ориентированном программировании (ООП).
Как уже отмечалось ранее, любой тип данных в языках программирования определяет не только множество собственных значений, но и набор операций, способы хранения и присваивания значений. Типы переменных и параметров должны совпадать с присваиваемыми им значениями или вызываемыми для них функциями. Для обеспечения совместимости типов переменных и их значений в языках программирования существует контроль типов (типизация) – это процесс проверки и накладывания ограничений на использование типов.