Файл: Понятие переменной в программировании. Виды и типы переменных (Понятие переменной. Типы данных переменной).pdf
Добавлен: 31.03.2023
Просмотров: 75
Скачиваний: 4
Рис. 9 Динамическое решение на Python
Как видно из рис. 9 никаких проблем с тем, что список может содержать хоть числа, хоть списки, хоть другие массивы нет [2]. Это удобно и всё хорошо работает. Теперь решим ту же самую задачу на языке программирования С++.
Рис. 10 Статическое решение на языке программирование C++
Здесь каждая функция в отдельности похожа на версию из Python, но почему их три. Неужели статическое программирование проиграло? И да, и нет. Есть несколько методик программирования, одну из которых мы сейчас рассмотрим. Она называется обобщенное программирование, и язык C++ ее неплохо поддерживает. Давайте посмотрим на новую версию (рис. 11):
Рис. 11 Статистическое решение, обобщенное программирование C++
Реализация, показанная на рис. выглядит не сильно сложнее, чем версия на Python. Более того мы получили реализацию для всех массивов, а не только для трех, необходимых для решения задачи. В данном варианте мы совместили плюсы и статической и динамической типизации. Стоит добавить, что обобщенное программирование может быть реализовано удобнее и красивее (например в языке Haskell). Помимо обобщенного программирования также можно применить полиморфизм (результат будет хуже), перегрузку функций (аналогично) или макросы [3].
Многие статические языки позволяют использовать динамическую типизацию, например [5]:
- C# поддерживает псевдо-тип dynamic;
- F# поддерживает синтаксический сахар в виде оператора ?, на базе чего может быть реализована имитация динамической типизации;
- Haskell — динамическая типизация обеспечивается модулем Data.Dynamic;
- Delphi — посредством специального типа Variant.
Также, некоторые динамически типизированные языки позволяют воспользоваться преимуществами статической типизации:
Common Lisp — декларации типов.
Perl — с версии 5.6, довольно ограниченно.
Далее рассмотрим вопросы сильной и слабой типизации. Языки с сильной типизацией не позволяют смешивать сущности разных типов в выражениях и не выполняют никаких автоматических преобразований [7]. Также их называют «языки с строгой типизацией». Английский термин для этого — strong typing.
Слабо типизированные языки, наоборот всячески способствуют, чтобы программист смешивал разные типы в одном выражении, причем компилятор сам приведет все к единому типу. Также их называют «языки с нестрогой типизацией» [7]. Английский термин для этого — weak typing.
Слабую типизацию часто путают с динамической, что совершенно неверно. Динамически типизированный язык может быть и слабо и сильно типизирован.
Однако мало кто придает значение строгости типизации. Часто заявляют, что если язык статически типизирован, то программист сможет отловить множество потенциальных ошибок при компиляции. Это не так. Язык при этом должен иметь еще и сильную типизацию. Если компилятор вместо сообщения об ошибке будет просто прибавлять строку к числу, или что еще хуже, вычтет из одного массива другой, какая разница, если все «проверки» типов будут на этапе компиляции? Многие авторы учебников по программированию считаю, что слабая статическая типизация еще хуже, чем сильная динамическая. Рассмотри отдельно преимущества слабой и сильной типизации
Преимущества сильной типизации [5]:
- Надежность. Мы получаем исключение или ошибку компиляции, взамен неправильного поведения.
- Скорость работы программы. Вместо скрытых преобразований, которые могут быть довольно затратными, с сильной типизацией необходимо писать их явно, что заставляет программиста как минимум знать, что этот участок кода может быть медленным.
- Понимание работы программы. Вместо неявного приведения типов, программист пишет все сам, а значит, примерно понимает, что сравнение строки и числа происходит не само по себе и не по какому-либо волшебству.
- Определенность. Когда программист пишет преобразования вручную, то он точно знает, что и во что преобразуется. Также всегда понятно, что такие преобразования могут привести к потере точности и к неверным результатам.
Преимуществ слабой типизации [5]:
- удобство использования смешанных выражений (например из целых и вещественных чисел);
- абстрагирование от типизации и сосредоточение на задаче;
- краткость записи.
Далее перейдем к вопросу явной и неявной типизации.
Язык с явной типизацией предполагает, что программист должен указывать типы всех переменных и функций, которые объявляет. Английский термин для этого — explicit typing [5]. Язык с неявной типизацией, напротив, предлагает вам забыть о типах и переложить задачу вывода типов на компилятор или интерпретатор. Английский термин для этого — implicit typing [5].
Сначала можно решить, что неявная типизация равносильна динамической, а явная — статической, но дальше мы увидим, что это не так.
Есть ли плюсы у каждого вида, и опять же, есть ли их комбинации и есть ли языки с поддержкой обоих методов?
Преимущества явной типизации [5]:
- наличие у каждой функции сигнатуры (например int add(int, int)) позволяет без проблем определить, что функция делает;
- программист сразу записывает, какого типа значения могут храниться в конкретной переменной, что снимает необходимость запоминать это.
Преимущества неявной типизации [5]:
- сокращение записи — def add(x, y) явно короче, чем int add( int x, int y).
- устойчивость к изменениям. Например, если в функции временная переменная была того же типа, что и входной аргумент, то в явно типизированном языке при изменении типа входного аргумента нужно будет изменить еще и тип временной переменной.
Есть языки, с неявной типизацией по умолчанию и возможностью указать тип значений при необходимости. Настоящий тип выражения транслятор выведет автоматически. Один из таких языков — Haskell, давайте приведем простой пример, для наглядности (см. рис. 12).
Рис. 12 Явное и неявное указание типа
Как мы видим, это очень красиво и коротко. Запись функции занимает всего 18 символов на одной строчке, включая пробелы. Однако автоматический вывод типов довольно сложная вещь, и даже в таком языке как Haskell, он иногда не справляется. Есть ли языки с явной типизацией по умолчанию и неявной по необходимости? Конечно. В новом стандарте языка C++, названном C++11 (ранее назывался C++0x), было введено ключевое слово auto, благодаря которому можно заставить компилятор вывести тип, исходя из контекста (см. рис. 13)
Рис. 13 Явное и автоматическое определение типа в C++
В конце нашего исследования приведем список популярных языков программирования и опишем, как они подразделяются по каждой категории «типизации» (см. рис. 14).
Рис. 14 Классификация языков программирования по типизации
Стоит дать небольшие комментарии к рис.14 :
- C# — поддерживает динамическую типизацию, посредством специального псевдотипа dynamic с версии 4.0. Поддерживает неявную типизацию с помощью dynamic и var.
- С++ — после стандарта C++11 получил поддержку неявной типизации с помощью ключевых слов auto и decltype. Поддерживает динамическую типизацию, при использовании библиотеки Boost (boost::any, boost::variant). Имеет черты как сильной, так и слабой типизации.
- Common Lisp — стандарт предусматривает декларации типов, которые некоторые реализации могут использовать также для статической проверки типов.
- D — также поддерживает неявную типизацию.
- Delphi — поддерживает динамическую типизацию посредством специального типа Variant.
Вторая глава данной курсовой работы была посвящена вопросам типизации в различных языка программирования. Было дано определение понятию типизации. Система типов данных языка — это система, которая ставит в соответствие каждому значению, вычисленному в процессе выполнения программы, свой тип данных [8]. Описаны основные функции систем типов данных. Были подробно рассмотрены вопросы статической и динамической типизации, вопросы строгой и нестрогой типизации. В конце главы представлена классификация по типизации современных высокоуровненвых языков программирования.
ЗАКЛЮЧЕНИЕ
Данная курсовая работа была посвящена понятию переменной в программировании, а также видам и типам переменных. Актуальность данной работы заключалась в том, что ни одна программа не обходится без переменных и поэтому программист должен глубоко разбираться в видах переменных, уметь работать с ними.
Объектами исследования в данной курсовой работе являлись переменная в программировании и типы данных.
Целью данной работы было проведение всестороннего исследования понятия переменная в различных современных языках программирования.
Исходя из поставленной цели работы в ходе работы, были решены следующие задачи:
1. Дано определение понятию «переменная».
2. Дана трактовку переменной для программирования.
3. Исследованы свойства переменных в различных языках программирования.
4. Рассмотрены понятия «тип данных».
5. Исследованы различные варианты типизации в программировании.
Курсовая работа была логически разбита на две главы. В первой главе были решении первые четыре поставленные задачи. Решению пятой задачи была посвящена вторая глава курсовой работы.
По итогам работы можно сделать следующие выводы:
1 Под переменной в языках программирования понимают программный объект (число, слово, часть слова, несколько слов, символы), имеющий имя и значение, которое может быть получено и изменено программой [5].
2. Ни одна программа не обходится без переменных.
3. Все программы работаю с данными. Данные могут быть представлены в виде документа, графического фрагмента, видеоигры или мгновенного сообщения. Для их хранения программа использует именно переменные. Каждая переменная характеризуется следующими атрибутами [3]:
- именем;
- типом данных;
- значением;
- временем жизни;
- областью видимости.
4. общие правила именования переменных, которые характерны для всех языков программирования [5]:
- всегда начинаться с буквы, после которой могут другие буквы или цифры;
- в идентификаторе (имени) не должно быть пробелов, запятых или других непредусмотренных знаков;
- нельзя использовать в качестве имен переменных слова, которые являются служебными или операторами.
5. Тип данных характеризует внутреннее представление, множество допустимых значений для этих данных, а также совокупность операций над ними [5]
6. Переменные обязательно необходимо инициализировать.
7. Любая переменная обладает еще двумя основными характеристиками: временем жизни и областью видимости [3]. Они зависят от места и способа описания переменной.
8. Система типов данных языка — это система, которая ставит в соответствие каждому значению, вычисленному в процессе выполнения программы, свой тип данных [8].
9. Языки программирования по типизации принято делить на два больших лагеря — типизированные и нетипизированные (бестиповые). К первому, например относятся C, Python, Scala, PHP и Lua, а ко второму — язык ассемблера, Forth и Brainfuck [5].
10. Преимущества сильной типизации [5]:
- Надежность. Мы получаем исключение или ошибку компиляции, взамен неправильного поведения.
- Скорость работы программы. Вместо скрытых преобразований, которые могут быть довольно затратными, с сильной типизацией необходимо писать их явно, что заставляет программиста как минимум знать, что этот участок кода может быть медленным.
- Понимание работы программы. Вместо неявного приведения типов, программист пишет все сам, а значит, примерно понимает, что сравнение строки и числа происходит не само по себе и не по какому-либо волшебству.
- Определенность. Когда программист пишет преобразования вручную, то он точно знает, что и во что преобразуется. Также всегда понятно, что такие преобразования могут привести к потере точности и к неверным результатам.
11. Преимущества слабой типизации [5]:
- удобство использования смешанных выражений (например из целых и вещественных чисел);
- абстрагирование от типизации и сосредоточение на задаче;
- краткость записи.
Таким образом, все задачи курсовой работы выполнены. Цель работы достигнута.