В серии: Библиотека alt м. В. Сысоева, И. В. Сысоев
Типизация в языках программирования
Download 0.87 Mb.
|
Боши Лекция Парадигма и методы программирование
1.3 Типизация в языках программированияВсе данные в компьютере хранятся в виде последовательностей нулей и единиц подряд. Для удобства эти последовательности группируют по 8 цифр подряд и такую группу называют байтом (два байта называются машинным словом). Однако оперировать последовательностями битов напрямую при написании больших программ неудобно, поэтому вводят дополнительные договорёности о спо- собе интерпретации отдельных байтов в памяти. Эти договорённости и можно назвать типами данных. Все языки программирования можно разделить на: • нетипизированные (бестиповые), типизированные. Нетипизированными являются языки ассемблера, а также язык программирования встраиваемых устройств Forth. По сути, бестиповые — это наиболее низкоуровневые языки, предоставляющие прямой доступ к манипулированию отдельными битами прямо в регистрах процессора. Все компилируемые и интерпретируемые широко используемые языки, такие как Pascal, C, Python, PHP и другие, являются типизированными. У отсутствия типизации есть некоторые преимущества: татор не будет мешать какими-либо проверками типов, запрещая те илиПолный контроль над действиями компьютера. Компилятор или интерпреиные действия. Получаемый код обычно имеет высокую эффективность, которая, правда,зависит в первую очередь от квалификации программиста. Прозрачность инструкций. При знании языка обычно нет сомнений, что изсебя представляет тот или иной код. Недостатки отсутствия типизации: Сложность написания программы быстро растёт с ростом необходимой аб-стракции и общности. Даже операции с такими, казалось бы, несложными объектами, как списки, строки или записи, уже требуют существенных усилий. Отсутствие проверок и как следствие огромное число трудноуловимых оши-бок на этапе компиляции. Любые бессмысленные действия, например вычитание указателя на массив из символа будут считаться совершенно нормальными. Высокие требования к квалификации программиста и фактическим знани-ям об архитектуре целевой ЭВМ. Типизированные языки делятся ещё на несколько пересекающихся категорий. Сильная/слабая типизация (также иногда говорят строгая / нестрогая). Сильная типизация означает, что язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования, например, нельзя вычесть из строки множество. Языки со слабой типизацией выполняют множество неявных преобразований автоматически, даже если может произойти потеря точности или преобразование неоднозначно. В действительности почти все популярные языки: C, Java, Python, Pascal и другие имеют условно сильную типизацию, позволяя некоторые автоматические преобразования типов. Самые распространённые примеры: автоматическое приведение целых чисел к действительным и действительных к комплексным, а также символов к строкам. Крайний случай слабой типизации — отсутствие типов вообще. Преимущества сильной типизации: Надежность — вместо неправильного поведения вы получите исклю-чение или ошибку компиляции. с сильной типизацией необходимо писать их явно, что заставляет про-Скорость — преобразования типов могут быть довольно затратными, граммиста как минимум знать, что этот участок кода может быть медленным, или избегать их. ния типов программист пишет все сам, а, значит, примерно понимает,Понимание работы программы — опять же, вместо неявного приведечто сравнение строки и числа происходит не само собой и не по волшебству, а использовать действительнозначную переменную в качестве счётчика цикла опасно из-за ошибок округления. Определенность — когда вы пишете преобразования вручную, выно знаете, что вы преобразуете и во что. Также вы всегда будете по-точнимать, что такие преобразования могут привести к потере точности, затратам машинного времени или стать причиною логической ошибки. Преимущества слабой типизации: рование целых и вещественных чисел).Удобство использования смешанных выражений (например, комбини- числа явных преобразований типов.Скорость разработки: не нужно тратить время на написание большого Краткость записи. Явная/неявная типизация. Явно-типизированные языки отличаются тем, что тип новых переменных/функций/их аргументов нужно писать явно. Соответственно, языки с неявной типизацией перекладывают эту задачу на компилятор/интерпретатор, такой способ называется автоматическим выведением типов. Все компилируемые языки — наследники ALGOL 60 – имеют явную типизацию. Это C, C++, D, Java, C#, Pascal, Modula 2, Ada и другие. Напротив, языки семейства ML (Standard ML и Ocaml), Haskell, почти все интепретируемые языки: Pyhton, Ruby, Perl, PHP, JavaScript, Lua имеют неявную. Преимущества явной типизации: Многие логические ошибки, ведущие к неверному приведению типов, можно отловить на этапе компиляции. Либо эти ошибки вовсе не возникают, поскольку попытка выписать тип выражения приводит к мысли, что само выражение неверно. Знание того, какого типа значения могут храниться в конкретной переменной, снимает необходимость помнить это при отладке и дальнейшей модификации программы. Существенно упрощается написание компиляторов, поскольку компилятор не должен уметь определять тип переменной. Как следствие, часто можно произвести ряд дополнительных оптимизаций уже на этапе компиляции автоматически. Преимущества неявной типизации: • Сокращение записи (сравните Python и Pascal): add(x, y): add(x: ; y: ): ; Полиморфизм (универсальность). Одна и та же функция может быть написана для переменных разных типов, если используемые в ней операции определены для них. В языках с явною типизацией в такой ситуации приходится писать много одинаковых функций, отличающихся только типом аргументов и результата (это называется перегрузкою функции), либо эмулировать неявную типизацию за счёт шаблонов и генериков. Статическая/динамическая типизация. Статическая типизация определяется тем, что конечные типы переменных и функций устанавливаются на этапе компиляции. Т.е. уже компилятор на 100% уверен, какой тип, где находится. В динамической типизации все типы выясняются уже во время выполнения программы. Примеры языков со статическою типизацией: C, Java, C#, Ada, С++, D, Pascal. Примеры языков с динамическою типизацией: Python, JavaScript, Ruby, PHP, Perl, JavaScript, Lisp. При статической типизации параметр подпрограммы и возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменён позже (переменная или параметр будут принимать, а функция — возвращать значения только этого типа). Некоторые статически типизированные языки позже получили возможность также использовать динамическую типизацию при помощи специальных подсистем. Например, тип Variant в Delphi, Data.Dynamic в Haskell, C# поддерживает псевдо-тип dynamic. Преимущества статической типизации: Статическая типизация даёт самый простой машинный код. Многие ошибки исключаются уже на стадии компиляции. Статическая типизация хороша для написания сложного, но быстрогокода. (В интегрированной среде разработки осуществимо автодополнениесреда разработки сама догадывается и дописывает часть кода за программиста), особенно если типизация — строгая статическая: множество вариантов можно отбросить как не подходящие по типу. Чем больше и сложнее проект, тем большее преимущество дает стати-ческая типизация, и наоборот. Недостатки статической типизации: Языки с недостаточно проработанной математической базой оказы-ваются довольно многословными: каждый раз надо указывать, какой тип будет иметь переменная. В некоторых языках есть автоматическое выведение типа, однако оно может привести к трудноуловимым ошибкам. Тяжело работать с данными из внешних источников (например,ляционных СУБД/ десериализация данных). в ре- При динамической типизации переменная связывается с типом в момент присваивания значения, а не в момент её объявления (как правило, она вообще не объявляется нигде до момента первого использования). Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов. Преимущества динамической типизации: Упрощается написание несложных программ. Облегчается работа прикладного программиста с СУБД, которыепринципиально возвращают информацию в «динамически типизированном» виде. Поэтому динамические языки ценны, например, для программирования веб-служб. Иногда требуется работать с данными переменного типа. Например,может понадобиться выдать массив или одно число, или вернуть специальное значение типа «ничто». В языке со статическою типизацией такое поведение приходится эмулировать: одно число заменять массивом размером в 1 элемент; при возможности появления особого значения — вводить так называемые «вариантные типы», как сделано в OCaml. Недостатки динамической типизации: Статическая типизация позволяет уже при компиляции заметить про-стые ошибки «по недосмотру». Для динамической типизации требуется как минимум выполнить данный участок кода. ки: разработчик может несколько раз просмотреть неработающий кодОсобенно коварны в динамическом языке программирования опечати ничего не увидеть, пока наконец не найдёт набранный с ошибкой идентификатор. Не действует либо действует с ограничениями автодополнение в средеразработки: трудно или невозможно понять, к какому типу относится переменная, и вывести набор её полей и методов. Низкая скорость, связанная с динамической проверкой типа,шие расходы памяти на переменные, которые могут хранить «что угод-и больно». К тому же большинство языков с динамической типизацией интерпретируемые, а не компилируемые. Невозможна перегрузка процедур и функций по типу данных — толькопо количеству операндов (правда, она, как правило, и не требуется). В действительности, практически все языки, имеющие сильную типизацию, допускают некоторые послабления. Например, Pascal и D допускают смешивание в одном выражении целых и действительных чисел (но результат обязан быть действительным), строк и символов (результат обязан быть строкою), то есть допускают сведение типа к более общему. Аналогично C хотя и относят к языкам со слабою в целом типизацией (можно смешивать в одном выражении логические переменные, числа, указатели и строки), всё же не лишён ряда проверок типов. Таблица 1.2. Типизация в языках программирования
Download 0.87 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling