Файл: Современные языки программирования (Типизация данных).pdf

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

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

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

Добавлен: 26.05.2023

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

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

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

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

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

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

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

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

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

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

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

3.1 Компилятор

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Множеством всех значений, принадлежащим типу.

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

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

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

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

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

Простые:

Перечислимый тип. Хранит значения прямо указанные в его описании.


Целочисленный тип. Целое число со знаком и без знака.

Вещественный тип. Вещественное число с запятой и с плавающей точкой.

Символьный тип. Хранит один символ в различных кодировках.

Множество. Совпадает с обычным математическим понятием множества.

Логический тип. Принимает два значения ложь = 0 и истина = 1.

Указатель. Хранит адрес в памяти, указывающий на какую-либо информацию, как правило - указатель на переменную.

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

Массив. Хранит индексированный набор элементов одного типа.

Строковый тип. Хранит строку символов.

Запись (структура). Набор различных элементов (полей), хранимый как единое целое.

Файловый тип. Хранит только однотипные значения, доступ к которым осуществляется только последовательно.

Класс, метакласс, интерфейс. Абстрактные типы- данных в объектно-ориентированном программировании (ООП).

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

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

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

Динамическая типизация - при которой переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов.

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

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

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


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

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

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

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

Ошибки, связанные с опечатками при использовании имени переменной.

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

В объектно-ориентированных языках не действует либо действует с ограничениями автодополнение: трудно или невозможно понять, к какому типу относится переменная, и вывести набор её полей и методов.

Учитывая эти недостатки, для написания сложного кода нужна особая культура программирования: венгерская нотация, юнит-тестирование. Кроме того, в таких языках программирования отсутствует интерфейсная часть модуля (описания типов, заголовки процедур и т. д. - то, что соответствует interface-секции в Паскале и h-файлу в Си), которая сама по себе является существенной частью документации, а изредка вообще позволяет обойтись без документирования.

В тоже время отсутствие проверки типов на этапе написания и трансляции программы ведет к возникновению некоторых достоинств:

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

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

Нет дополнительных строк с вязанных с определением типа и даже с объявлением переменных. Отсутствуют операции приведения типа. Соответственно, упрощается написание простых программ. В различных языках программирования динамический контроль типов реализован по-разному. Благодаря этому в некоторых языках недостатки этого вида типизации могут быть сведены к нулю, в прочем, как и достоинства.