Файл: Современные языки программирования (Метапрограммирование).pdf
Добавлен: 28.03.2023
Просмотров: 136
Скачиваний: 2
Достоинства динамической компиляции по сравнению с компиляцией:
- скорость работы динамически компилируемых программ близка к скорости работы компилируемых программ;
- отсутствие необходимости перекомпиляции программы при переносе на другую платформу.
Недостатки динамической компиляции по сравнению с компиляцией и чистой интерпретацией:
- Большая сложность реализации;
- Большие требования к ресурсам.
Динамическая компиляция хорошо подходит для веб-приложений.
В таблице 3 представлены виды трансляторов в современных языках программирования.
Таблица 3 – Трансляторы
Язык программирования |
Транслятор |
Java |
компиляция в байт-код интерпретатор |
C |
компилятор |
C++ |
компилятор |
Python |
компиляция в байт-код интерпретатор |
Visual Basic.NET |
компиляция в MSIL-код интерпретатор, компилятор |
C# |
компиляция в байт-код интерпретатор |
PHP |
компиляция в байт-код интерпретатор |
JavaScript |
компиляция в байт-код интерпретатор |
SQL |
компиляция в байт-код интерпретатор |
Objective C |
компилятор |
Современные языки программирования используют в равной степени различные трансляторы.
Широкое применение компиляторов обусловлено большой скоростью выполнением программ. Использование компиляторов предоставляет полностью все возможности конкретных платформ и создание «машинно-зависимых» участков кода и программ.
Использование интерпретаторов, напротив, дает возможность программисту не зависит от особенностей конкретных платформ, что наиболее востребовано сегодня в связи с развитием Интернет–технологий.
Среди интерпретируемых языков используются в огромной популярностью пользуются основном интерпретаторы компилирующего типа. Это обусловлено тем что значительное увеличение скорости выполнении программ в сравнении с простыми интерпретаторами. При разработке больших и сложных программ такое увеличение скорости может быть очень важным фактором.
Глава 4. Типизация данных
Тип – определяет множество значений, которые могут принимать элементы данных, и совокупность допустимых над ним операций.
Тип данных одновременно характеризуется:
- Множеством допустимых значений, которые могут принимать данные, принадлежащие к этому типу.
- Набор операций, которые можно осуществлять над данными, принадлежащим к этому типу.
Тип данных в теории программирования это и есть основное понятие. Значения данных, набор возможных операции над ними, способы хранения их, и выполнении операций над ними, все это определяет типы данных. Все данные обрабатываемые программами, имеют свой определённый тип.
Типы данных даже в одном языке программирования отличаются друг от друга. Например в языке программирования Python различаются тип целочисленные(int) и вещественные(float). Для каждого из них резервируется различный объем памяти то есть для целочисленного 4 байта а для вещественного 8 байт, так и для обработки используется различные регистры процессора, и операции с этими данными применяются разные команды Pythona и разные ядра микропроцессора.
На математических типах данных хоть и построены большинство языков программирования, но они неодинаковые ( т.е. соответствие не строгое). К примеру, целочисленный тип в языках программирования не соответствует математическому типу “целое число”, в языках программирования есть ограничения снизу, сверху, а в математике этих ограничения нет. в языках и системах программирования есть большое количество целочисленных типов, и отличаются они объёмом занимаемой памяти (определяемым допустимым диапазоном значений).[1]
В таблице 4 представлены используемые в языках программирования типы данных.
Таблица 4 типы данных в языках программирования
Простые типы |
|
Перечислимый тип |
Хранит набор уникальных идентификаторов (константы) |
Целочисленный тип |
Положительные или отрицательные целые числа |
Вещественный тип |
Положительные или отрицательные дробные (дробные) числа |
Символьный тип |
Хранит один символ в любой кодировке |
Логический (булевский) тип |
Принимает одно значение ложь (false или 0) или истина (true или 1). |
Множество |
Однотипные логический связанные с друг другом данные |
Указатель |
Хранит адреса ячеек памяти |
Составные (сложные) типы |
|
Строковый тип |
Хранит символьную строку |
Массив |
Набор однотипных проиндексированных элементов. |
Запись |
Структурированный тип данных |
Файловый тип |
Набор данных хранимый на магнитном носителе |
Абстрактные типы |
Класс, метакласс, интерфейсы |
В языках программирования при присвоение к переменной значения, тип переменной и тип значения должны быть одинаковыми. Для того чтобы это правило соблюдалось есть проверка на совместимость или контроль типов. Контроль типов это процесс проверки и установление ограничений для типов. При этом проверяется не только переменные и их значения, но и все что может в программе иметь тип то есть функции, классы, и т.д., а так же операции, способы хранения, извлечения, передачи значения данных. Контроль типов предотвращает ошибки и помогает программистам вовремя отладки программы.
Есть два вида контроля типов:
- Динамическая типизация - это когда тип переменной определяется в момент присвоение ему значения. Поэтому тип переменной данной типизации может изменяться во время исполнения программы.
- Статическая типизация - это когда тип переменной определяется вовремя объявления переменной, и не меняется вовремя исполнения программы.
Одним из важных моментов является определение на соответствии типов, на сегодняшний день используется два подхода:
- Слабая типизация – совместимость проверяется только при выполнении программы или кода, и поэтому транслятором он не контролируется.
В языках программирования с данной типизацией применяется так называемая «утиная типизация». «Утиная типизация» или неявная типизация это когда граница использования объекта определяется его текущим набором методов и свойств.
- Строгая типизация – при такой совместимость типов транслятор автоматический контролирует все типы, при объявление такого типа, она должна быть явной или определяется структурой указываемого типа.
Среди программистов нет единого мнения что лучше динамическая или статическая типизация. Поэтому будем рассматривать каждый вид по отдельности, и выясним их достоинства и недостатки. [1]
4.1. Динамическая типизация.
При динамической типизации не возможно контролировать тип данных на стадии разработки программы, так как тип переменной присваивается только со значением и входе выполнении программы тип переменой может неоднократно меняются. Для этого в трансляторе есть встроенная или сторонняя программа которая проводит динамическую проверку типов.
Вот некоторые недостатки языков программирования с динамической типизации:
- Из-за постоянной поверки типов снижается скорость выполнения программы.
- Ошибки и опечатками при использовании имен переменных.
- Выявление простых ошибок «по недосмотру», постоянно требуется выполнить данный участок кода.
- В объектно–ориентированных языках не действует либо действует с ограничениями автодополнение : трудно или невозможно понять, к какому типу относится переменная, и вывести набор её полей и методов.
Учитывая все эти недостатки, при написания сложного кода приходиться придерживаться венгерская нотация, делать юнит–тестирование. Кроме этого в языках программирования отсутствует интерфейсная часть модуля, которая является существенной частью документации, а иногда позволяет обойтись без документирования.
А теперь рассмотрим основные достоинства языков программирования с динамической типизации:
- Быстрая работа транслятора может быть существенным при разработке больших проектов.
- Языки программирования с данной типизацией очень гибкие. Реализация функции, вычисляющей значение выражения любого типа.
- Уменьшается количество строк программы, так как нет дополнительных строк с определением типа и объявлением переменных.
- Упрощается написание простых программ так как отсутствуют операции приведения типа, например скрипты.
4.2. Статическая типизация.
При статической типизации это когда тип переменной объявляется заранее и только после присваивается значение, и тип переменной не меняется вовремя выполнения программы. Что дает возможность контроля уже при написании кода и постоянно проверяется.
Рассмотрим основные недостатки языков программирования с статической типизацией:
- Не гибкость языка программирования.
- Медленная работа компилятора.
Рассмотрим некоторые достоинства языков программирования с статической типизацией:
- Из-за отсутствием проверки типов на этапе выполнения программы повышается скорость выполнения программы.
- Практический нет ошибок связанных с некорректным использованием типа переменной.
- Читабельность, понятность кода и документирование программы становится легче.
Контроль типов как для динамического так и для статического типов с учтенном строгой и слабой типизации разрабатывается по разному на различных языках программирования, что может увеличить достоинства языка, так и увеличить недостатки.
В таблице 5 представлены виды типизации в современных языках программирования.
Таблица 5 – Типизация в современных языках программирования [2]
Язык программирования |
Типизация |
Java |
статическая, строгая |
C |
статическая |
C++ |
статическая |
Python |
динамическая, строгая |
Visual Basic.NET |
динамическая |
C# |
статическая, строгая |
PHP |
динамическая |
JavaScript |
динамическая |
SQL |
статическая, строгая |
Objective C |
статическая /динамическая |
На сегодняшний день программисты и разработчики используют языки программирования как с динамической типизацией так и со статистической. Стоит отметить, что статическая типизация в основном используется для компилируемых языков, а динамическая типизация больше для интерпретируемых. Такое деление является законным так как в интерпретаторах есть возможность при исполнении команд анализировать используемые типы данных и провести операции по приведению типов, и гораздо труднее выполнение данных операций для скомпилированных программ.
Но не смотря на все правила существует возможность использования типов с динамическими свойствами в языках программирования со статической типизацией. Для использования данной технологии нужно воспользоваться специальными агрегаторами которые хранят данные о типе значений. Использование таких технологий программирования с агрегаторами появляются накладные расходы сравнимые с использованием динамической типизацией и возникают трудности в работе.
Одна из трудоемких и сложных задач это реализация статической проверки типов в языках программирования с динамической типизацией. В некоторых языках программирования есть поддержка статической типизация на уровне языка, в этом случае компилятор проведет полную этих типов и полностью исключит лишние вычисления при их применении. В случае отсутствии такой поддержки в языке программирования ее реализация производиться добавлением дополнительных проверок, что усложняет программу, работу программиста и потерями во временем при написании кода.