Файл: Современные языки программирования (Метапрограммирование).pdf
Добавлен: 28.03.2023
Просмотров: 141
Скачиваний: 2
Функциональное программирование это одна из альтернативных подходов программирования в отношении императивному. В функциональном программирования отсутствует понятие о времени. Программы написанные в функциональном стиле представляют собой выражения, а исполнение программ заключается в вычислении этих выражений.
2.3. Структурная модель
Программирование в основе которого лежит представление программы в виде иерархической структуры блоков это есть парадигма структурной модели. В соответствии с данной парадигмой основными принципами являться:
- Программа разрабатываться пошагово методом «сверху-вниз»
- Полный отказ от оператора безусловного перехода GOTO
- Любая программа состоит из трех базовых управляющих конструкций. Этими конструкциями являются ветвление, цикл, последовательность
- В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.
- Повторяющиеся фрагменты программы могут оформляться в виде процедур или функций.
- Каждую логическую законченную группу команд (инструкций) оформлять нужно как блок.
- Все конструкции должны иметь один входи один выход.
Вот некоторые подходы реализующих в программировании структурную модель:
Объектно–ориентированное программирование (ООП) – это когда программа представляет собой описание совокупностей(классов) объектов, их свойства(атрибутов), отношений между ними, а также операций над объектами(методов).
Основными концепции и принципы объектно-ориентированного программирования являются:
- Полиморфизм – называется способность различных объектов по-разному обрабатывать одинаковые сообщения.
- Наследование – это такой механизм который позволяет создавать новые классы на основе уже существующих классов. При этом класс автоматический получает (или наследует) свойство исходного класса.
- Инкапсуляция – это такой механизм программирования, который связывает воедино код и данные, им обрабатываемые, чтобы обезопасить их как от внешнего вмешательства, так и от неправильного использования.
- Класс – это описание некоторой структуры программы, обладающей набором внутренних переменных – свойств, и функций имеющих доступ к свойствам – методов.
- Объект – это экземпляр класса или другими словами переменная тип которого задается классом. Объекты в отличие от классов реальны, то есть существуют и хранятся в памяти во время выполнения программы.
Модульное программирование – это разбиении одной программы на несколько независимых модулей(библиотеки), каждый из которых пишется отдельно программистами или группой программистов от главного модуля. Такое разбиение программного кода позволяет значительно уменьшить время на пересоздание при изменениях, вносимых лишь в небольшое количество исходных файлов, а также отладку. Упрощает групповую разработку программного обеспечения и возможностью приглашения удаленных программистов. Основная проблема данного вида программирования это согласования технического задания и документирования создаваемых модулей. Основное преимущество это возможность использовать ранее созданные модули(библиотеки) в последующих программах не привлекая дополнительные затраты на его создание.
2.4. Метапрограммирование
Метапрограммирование – это технология программирования, в которой как результат своей работы программы создают новые программы или модули, во время исполнения или на стадии компиляции, или самомодифицирующийся программы которые изменяют свой код во время выполнения.
Вот некоторые подходы которые реализуют данную модель программирования:
Генерация кода – это создание программы программой-генератором на основе более простой программы, то есть программа не пишется в ручную программистом а создается автоматически. Данная технология в основном реализуется двумя методами:
Шаблоны. Позволяют решать поставленные задачи, при соблюдение некоторых «правил» что сводится к вставке в программу повторяющихся (или почти повторяющихся) элементов программного кода. Одним из главных достоинств шаблонов является повторного его использования, что ускоряет создание программ и экономит время.
Внешне-языковые средства. В ряде случаев когда простые средства на подобии шаблонов недостаточно то помочь приходят внешне-языковые средства. Языки для генераторов создаются таким образом, при реализации правил парадигмы или специализированных функции, затрачивалось минимальными усилиями со стороны программиста или все это создавалось автоматически. Проще говоря генератор это есть транслятор, а язык программирования фактически является более высокоуровневый языком программирования. Генераторы создаются разработчиками программ, для реализации более сложных парадигм или для создания очень сильно специализированных программ, в которых где наибольшая часть стереотипна.[6]
В таблице 2 представлены основные парадигмы и подходы для решения различных задач в современных языках программирования.
Таблица 2 – Парадигмы программирования и основные подходы программирования [2]
Язык программирования |
Парадигмы программирования |
Основные подходы программирования |
Java |
императивная структурная |
объектно-ориентированный |
C |
императивная |
процедурный |
C++ |
мультипарадигмальный метапрограммирование |
процедурный объектно-ориентированный |
Python |
императивная декларативная структурная |
процедурный функциональный объектно-ориентированный |
Visual Basic.NET |
императивная структурная |
процедурный объектно-ориентированный |
C# |
мультипарадигмальный императивная |
процедурный объектно-ориентированный |
PHP |
мультипарадигмальный |
процедурный объектно-ориентированный |
JavaScript |
мультипарадигмальный |
функциональный объектно-ориентированный |
SQL |
мультипарадигмальный |
процедурный объектно-ориентированный |
Objective C |
мультипарадигмальный |
процедурный объектно-ориентированный |
Современные языки программирования не ограничиваются одной парадигмой, а используют несколько или даже являются мультипарадигмальными. Из-за этого разработчики стремятся создать язык ориентированный не на решение задач узкого круга, а для применения в различных областях то есть язык программирования общего назначения с поддержкой нескольких парадигм.
Использование программистами языков объектно-ориентированного подхода наряду с императивной моделью, дало возможность решать более сложные задачи на сегодняшний день. Без создания четкой и ясной структурной модели приложения невозможно создать большие распределенные системы. Разработка и отладка данных систем сильно облегчает работа с объектами, в любых их проявлениях. На сегодняшний день все больше в обновления стандартов, норм и самих языков можно увидите что разработчики все больше обращают внимание объектно-ориентированное программирование и смешанные модели.
Глава 3. Трансляторы
Программа записанная на языке программирования, воспринимается компьютером как постой текст. Для того что компьютер понял программу нужно его перевести на машинный код. Перевод такой программы с языка программирования на машинный код называется трансляцией, а специальная программа делающее такой перевод называется транслятором.
Транслятор – это программа, преобразующая исходный текст программы, предоставленную на входном языке программирования, в рабочую программу. Не которые трансляторы позволяют выполнить диагностику программы на ошибки, формируют словари на идентификаторов.
На сегодняшний день существующее трансляторы подразделяются на основные группы: компиляторы, интерпретаторы и Jit-компилятор.
3.1. Интерпретатор
Интерпретатор – устройство или программа, осуществляющее построчный анализ, обработку и выполнение исходной программы или запроса. Интерпретатор не создает на выходе готовую программу на машинном языке. Распознав команду исходного программу написанную на языке программирования, он ее сразу начинает выполнять.
Простой интерпретатор – анализирует и тут же исполняет (собственно говоря это и есть интерпретация) программу покомандно или построчно, по мере поступления исходного кода на вход интерпретатора. Основным достоинством этого подхода является мгновенная реакция, а главным недостатком то что интерпретатор обнаруживает сразу ошибки в тексте программы только при запуске на выполнение команды или строки с ошибкой.
Интерпретатор компилирующего типа – это система состоит из компилятора и интерпретатора , где компилятор транслирует исходный код в промежуточный (байт-код), а интерпретатор(виртуальная машина) его выполняет. К основным достоинствам можно отнести быстродействие исполнения программ, который достигается за счёт минимизации анализа в интерпретаторе, а также выноса анализа исходного кода в отдельный разовый проход. Главный недостаток – требование на корректность исходного программного кода и огромное потребление ресурсов.[7]
Достоинства интерпретаторов:
– Размер программ на много меньше чем машинный код, который получается после компиляции.
– Переносимость программ (межплатформеность) – программа будет работать на любой платформе или устройстве, где есть или установлен соответствующий интерпретатор.
– Средства диагностики ошибок в исходных кодах более наглядные и совершенны.
– Отладку исходного кода программы можно начать даже после написания первой строки программного кода.
Недостатки интерпретаторов:
– Слабая или отсутствие возможности оптимизация программного кода, в основном сказывается на скорости работы программы, то есть замедляет ее.
– Программа написанная интерпретируемом языке не будет работать без интерпретатора. В тоже время сам интерпретатор быть не очень компактным, труднодоступным или несовместимость с платформой.
– Интерпретируемая программа работает на много медленнее, чем машинный код. Так как промежуточный анализ программного кода и планирование его исполнения требуется время в отличии от исполнения программы скомпилирован в машинного код.
3.2. Компилятор
Компилятор – это специализированная программа для выполнения трансляцию на машинный код программы, записанной на исходном языке программирования. Компилятор проводит преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера или платформы). Но тем не менее, команды исходного языка сильно отличаются по мощности и организации от команд машинного языка. Есть такие языки, в которых одна команда исходного языка переводятся в 8–10 машинных команд. Но есть и такие языки, где каждой команде исходного языка может транслироваться в 100 и более машинных команд. В исходных языках достаточно часто используется так называемая строгая типизация данных, которая предварительно описывается в программе. По сути программист при написание программы может опираться не только на кодирование алгоритма, а более углублено обдумывать над создание классов или структур данных. Обычно компиляцией называется процесс трансляции с таких языков в машинные коды, а к языкам программирования высокого уровня или высокоуровневым языкам обычно относятся исходные языки.[7]
Достоинства компиляции:
- компиляция программы выполняется один раз;
- наличие компилятора на устройстве, для которого компилируется программа, не требуется.
Недостатки компиляции:
- компиляция — медленный процесс;
- при внесении изменений в исходный код, требуется повторная компиляция.
JIT-компилятор
JIT-компиляция или динамическая — трансляция, при которой исходный или промежуточный код преобразуется (компилируется) в машинный код непосредственно во время исполнения, «на лету» (англ. just in time, JIT). Компиляция каждого участка кода выполняется только один раз; скомпилированный код сохраняется в кеше и при необходимости используется повторно.