Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ. ( Процедурные языки программирования ).pdf
Добавлен: 31.03.2023
Просмотров: 92
Скачиваний: 2
СОДЕРЖАНИЕ
1. Классификация языков программирования
2. Процедурные языки программирования
3. Машинно-зависимые языки программирования
4. Машинно-независимые языки программирования
5. Непроцедурные языки программирования
6. Объектно-ориентированные языки программирования
7. Декларативные языки программирования
8. Переменные и типы данных в языках программирования
9. Статическая типизация. Язык С#
10. Динамическая типизация в языках программирования и структуры данных
11. Области видимости переменных
12. Критерии выбора языка и среды разработки программного обеспечения
8. Переменные и типы данных в языках программирования
Любой язык программирования оперирует данными в процессе своего исполнения. Данные могут быть постоянными или изменяющимися, но вне зависимости от этого, их необходимо хранить. Для этого под данные отводятся адресованные пространства памяти. Именно благодаря механизму именования переменных, перед разработчиком не ставится задача прямой адресации области в памяти, в которой хранятся определенные данные. В этой задаче на помощь приходит переменная, которая как раз таки позволяет задать имя определенному пространству памяти. Приведем определение переменной.
Переменная — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным[6]. Переменные можно классифицировать по различным признакам, но в первую очередь – по типизации, т.е. к какому типу значений относится перменная.
9. Статическая типизация. Язык С#
Если тип данных определяется на этапе компиляции, имеет место статическая типизация, а если на этапе выполнения программы — динамическая. В последнем случае иногда говорят, что переменная не имеет типа, хотя данные, содержащиеся в ней, безусловно, относятся к определённому типу данных, но выясняется это уже во время выполнения программы.
В том случае, когда тип переменной задаётся при компиляции, имеет место статическая типизация. Это довольно широко используемый в программировании приём, который означает, что значение типа связывается с переменной в момент её объявления и не может быть изменён.
Статическая типизация имеет ряд преимуществ[7]:
- ошибки, связанные с типами переменных, в большинстве случаев исключаются на этапе сборки;
- статическая типизация предполагает наиболее простой машинный код;
- в различных IDE для языков программирования с сильной типизацией реализован наиболее удобный и четкий механизм автодополнения, т.к. ненужные варианты отбрасываются при фильтрации по типу;
- статическая типизация отлично проявляет себя при написании сложного кода.
Разумеется, существуют и некоторые недостатки, главным из которых является затрудненность работы с языками, которые имеют слабый математический фундамент: приходится каждый раз явно указывать, какой тип будет иметь переменная.
Рассмотрим далее один из статически типизированных языков программирования - C#.
C# - объектно-ориентированный язык программирования, который был разработан инженерами компании Microsoft в конце 1990-х годов и презентован в 2001-ом году. Первоначально C# задумывался как языковое средство разработки приложений для Microsoft .NET Framework[8].
Данный язык имеет C-подобный синтаксис и основан на статической типизации.
В C# существуют две категории типов: ссылочные типы и типы значений.
Переменные типа значений содержат данные, а переменные ссылочного типа содержат в себе ссылку на необходимые данные, которые носят названия объектов. При этом две ссылочные переменные могут содержать указатель на один объект, поэтому может произойти ситуация, когда выполнение операции с одной из этих переменных повлияет на объект, который адресуется второй переменной ссылочного типа.
В C# типы значений подразделяются на несколько категорий. Рассмотрим каждую из них.
Простые типы. Простыми типами называют набор предопределенных типов структур, включающих ряд типов. Простые типы определяются при помощи ключевых слов, являющихся псевдонимами для предопределенных типов структур в пространстве имён System[9]. Главным отличием простых типов от структур является то, что простые типы допускают создание констант. Константы – это переменные, значения которых являются постоянными и не подразумевают изменения. Кроме создания констант, простые типы можно объявлять с помощью литералов, т.е. неявно. К примеру, запись ‘B’ будет являться переменной символьного типа, а запись 2003 - переменной целого типа. Типы переменных, относящихся к простым, представлены в таблице 1.
Таблица 1. Простые типы переменных в C#
Тип |
Диапазон |
Размер |
---|---|---|
sbyte |
От -128 до 127 |
8-разрядное целое число со знаком |
byte |
От 0 до 255 |
8-разрядное целое число без знака |
char |
От U+0000 до U+ffff |
Символ Юникода (16-разрядный) |
short |
От -32 768 до 32 767 |
16-разрядное целое число со знаком |
ushort |
От 0 до 65 535 |
16-разрядное целое число без знака |
int |
От -2 147 483 648 до 2 147 483 647 |
32-разрядное целое число со знаком |
uint |
От 0 до 4 294 967 295 |
32-разрядное целое число без знака |
long |
От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
64-разрядное целое число со знаком |
ulong |
От 0 до 18 446 744 073 709 551 615 |
64-разрядное целое число без знака |
float |
От ±1,5 x 10−45 до ±3,4 x 1038 |
6–9 цифр |
double |
от ±5,0 × 10−324 до ±1,7 × 10308 |
15–17 цифр |
decimal |
от ±1,0 x 10-28 до ±7,9228 x 1028 |
28-29 знаков |
bool |
true, false |
логический тип |
Типы перечисления. Тип перечисления задается при помощи ключевого слова enum и по своей сути является списком констант, т.е. переменные типа перечислений могут иметь только одно из тех значений, которое входит в список, соответствующий данному именованному типу перечисления. В качестве примера можно привести пользовательский перечислимый тип Days:
enum Days{ ‘Понедельник’, ‘Вторник’, ‘Среда’, ’Четверг’, ’Пятница’, ’Суббота’, ’Воскресенье’}.
Таким образом, для переменной типа Days доступны только указанные значения дней недели. При компиляции все ссылки на отдельные значения преобразуются в числовые литералы.
Типы структур. Типы структур, как и классы, представляют способ создания собственных типов данных. По своей сути, структура схожа классу в ООП – может хранить состояние в виде переменных структуры и определять поведение при помощи методов структуры. Помимо этого, структуры имеют конструкторы, однако для создания переменной данной структуры, конструктор вызывать необязательно. Приведем пример структуры:
struct man
{
public string sex;
public string fullName;
public int age;
}
В примере продемонстрирована структура man, имеющая переменные пол, ФИО и возраст, которые в свою очередь являются переменными простых типов. Однако нет ограничения на применение структур и классов, перечислимых типов в качестве вложенных в структуру переменных.
Nullable. Данный тип переменных является расширением для любого типа и представляют все значения базового типа и null. Такой тип прекрасно подходит для ситуаций, когда необходимо представить переменную базового типа, значение которой ещё не определено.
Ссылочные типы.
К ссылочным типам относятся те типы данных, которые хранят в себе ссылку на объект. Одним из наиболее часто используемых ссылочных типов является тип класса.
К типу классов относятся следующие подтипы.
- string;
- object;
- class.
Тип string представляет последовательность, состоящую из нуля или более символов в кодировке Юникод. Строки неизменяемы, т. е. содержимое созданного строкового объекта изменить нельзя, хотя синтаксис выглядит так, будто это возможно. Например, при написании кода компилятор фактически создает новый строковый объект для хранения новой последовательности символов, а затем этот новый объект назначается b.
Тип object является базовым для всех остальных типов и его методы полностью унаследованы любым из типов переменных в языке C#.
Тип class - это обертка (шаблон), которая определяет форму объектов. Объекты, в свою очередь, — это экземпляры класса. Определяя класс, мы создаем данные. В данном случае данные — это переменные-экземпляры класса. Над данными должен выполняться определенный код. Реализация кода находится в методах класса.
Interface. Тип интерфейса. Интерфейс содержит только сигнатуры методов, свойств, событий или индексаторов. Класс или структура, реализующие интерфейс, должны реализовать члены интерфейса, заданные в определении интерфейса.
Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем. Это хороший пример ссылочного типа переменных. Массивы могут быть n-мерными. Массивы служат самым разным целям, поскольку они предоставляют удобные средства для объединения связанных вместе переменных. Тем не менее, у них имеется одна особенность: они реализованы в виде объектов.
Delegate. Тип делегатов представляет собой основу для событий. Экземпляры делегата могут создаваться путем его связывания с именованным или анонимным методом. Делегат должен быть создан при помощи метода или лямбда-выражения, имеющего совместимые возвращаемый тип и входные параметры.
В данном разделе были рассмотрены типы переменных, реализованные путем статической типизации на примере языка C#. В языке C# переменные также подразделяются на две большие группы, включающие свои типы переменных: это типы значений и ссылочные типы.
10. Динамическая типизация в языках программирования и структуры данных
Под динамической типизацией понимается приём, когда тип переменной определяется её значением в момент их связывания, т.е. присвоения переменной значения. Ввиду этого, переменная может принимать значения различных типов в разные моменты выполнения программы[10].
Этот прием широко используется, чаще всего он применяется в языках программирования, которые ориентированы на веб и мобильные платформы: Objective-C, PHP, JavaScript.
Механизм динамической типизации обладает рядом достоинств:
- упрощение написания простых программ и скриптов;
- упрощается работа с СУБД.
Разумеется, динамическая типизация в некоторых случаях серьёзно проигрывает статической. В первую очередь, языки с динамической типизацией тратят большее количество вычислительных мощностей на динамическую проверку типа и хранение переменных. Кроме того, при использовании динамической типизации возникают ошибки, связанные с невнимательностью программиста: если в случае со статической типизацией, на этапе компиляции переменной целочисленного типа не удастся присвоить строковое значение, то в динамически типизируемых языках результат работы функции, где данные были перепутаны, будет известен только после выполнения кода.
На рисунке 5 представлен пример кода на JavaScript, где показан пример динамической типизации.
Рисунок 5 – пример динамической типизации в JavaScript.
Таким образом, переменная res может быть как строкой, так и числом.
Приведем обзор типизации в JavaScript. В этом языке любая переменная объявляется ключевым словом var, после которого следует название переменной. Это очень просто и удобно. Для объявления констант следует назвать переменную символами в верхнем регистре клавиатуры.
Стоит также рассмотреть некоторые динамические типы переменных. К ним относятся стек, куча и очередь.
Стек – тип данных, который по своей сути является списком элементов, организованных по принципу «последним пришёл – первым вышел».
Зачастую стек реализуется в виде однонаправленного списка (каждый элемент в списке содержит помимо хранимой информации в стеке указатель на следующий элемент стека).
Но также часто стек располагается в одномерном массиве с упорядоченными адресами. Такая организация стека удобна, если элемент информации занимает в памяти фиксированное количество слов, например, 1 слово. При этом отпадает необходимость хранения в элементе стека явного указателя на следующий элемент стека, что экономит память. При этом указатель стека (Stack Pointer, — SP) обычно является регистром процессора и указывает на адрес головы стека.
Предположим для примера, что голова стека расположена по меньшему адресу, следующие элементы располагаются по нарастающим адресам. При каждом вталкивании слова в стек, SP сначала уменьшается на 1 и затем по адресу из SP производится запись в память. При каждом извлечении слова из стека (выталкивании) сначала производится чтение по текущему адресу из SP и последующее увеличение содержимого SP на 1.
При организации стека в виде однонаправленного списка значением переменной стека является указатель на его вершину — адрес вершины. Если стек пуст, то значение указателя равно NULL.
На рисунке 6 представлен пример стека на языке С.
Рисунок 6. Стек на С. Пример реализации.
Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и чтение головного элемента (peek).
Во время операции push в стек добавляется новый элемент, который указывает на тот элемент, который до этого был головным. Сам элемент становится головным.