В серии: Библиотека alt м. В. Сысоева, И. В. Сысоев


Типизация в языках программирования


Download 0.87 Mb.
bet8/40
Sana23.04.2023
Hajmi0.87 Mb.
#1387407
TuriКнига
1   ...   4   5   6   7   8   9   10   11   ...   40
Bog'liq
Боши Лекция Парадигма и методы программирование

1.3 Типизация в языках программирования


Все данные в компьютере хранятся в виде последовательностей нулей и единиц подряд. Для удобства эти последовательности группируют по 8 цифр подряд и такую группу называют байтом (два байта называются машинным словом). Однако оперировать последовательностями битов напрямую при написании больших программ неудобно, поэтому вводят дополнительные договорёности о спо-
собе интерпретации отдельных байтов в памяти. Эти договорённости и можно назвать типами данных. Все языки программирования можно разделить на:
• нетипизированные (бестиповые),

  • типизированные.

Нетипизированными являются языки ассемблера, а также язык программирования встраиваемых устройств Forth. По сути, бестиповые — это наиболее низкоуровневые языки, предоставляющие прямой доступ к манипулированию отдельными битами прямо в регистрах процессора. Все компилируемые и интерпретируемые широко используемые языки, такие как Pascal, C, Python, PHP и другие, являются типизированными.
У отсутствия типизации есть некоторые преимущества:

  • татор не будет мешать какими-либо проверками типов, запрещая те илиПолный контроль над действиями компьютера. Компилятор или интерпреиные действия.

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

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

Недостатки отсутствия типизации:

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

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

  • Высокие требования к квалификации программиста и фактическим знани-ям об архитектуре целевой ЭВМ.

Типизированные языки делятся ещё на несколько пересекающихся категорий.

  1. Сильная/слабая типизация (также иногда говорят строгая / нестрогая). Сильная типизация означает, что язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования, например, нельзя вычесть из строки множество. Языки со слабой типизацией выполняют множество неявных преобразований автоматически, даже если может произойти потеря точности или преобразование неоднозначно. В действительности почти все популярные языки: C, Java, Python, Pascal и другие имеют условно сильную типизацию, позволяя некоторые автоматические преобразования типов. Самые распространённые примеры: автоматическое приведение целых чисел к действительным и действительных к комплексным, а также символов к строкам. Крайний случай слабой типизации — отсутствие типов вообще.

Преимущества сильной типизации:

      • Надежность — вместо неправильного поведения вы получите исклю-чение или ошибку компиляции.

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

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

      • Определенность — когда вы пишете преобразования вручную, выно знаете, что вы преобразуете и во что. Также вы всегда будете по-точнимать, что такие преобразования могут привести к потере точности, затратам машинного времени или стать причиною логической ошибки. Преимущества слабой типизации:

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

      • числа явных преобразований типов.Скорость разработки: не нужно тратить время на написание большого

      • Краткость записи.

  1. Явная/неявная типизация. Явно-типизированные языки отличаются тем, что тип новых переменных/функций/их аргументов нужно писать явно. Соответственно, языки с неявной типизацией перекладывают эту задачу на компилятор/интерпретатор, такой способ называется автоматическим выведением типов. Все компилируемые языки — наследники 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: ): ;

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

  1. Статическая/динамическая типизация. Статическая типизация определяется тем, что конечные типы переменных и функций устанавливаются на этапе компиляции. Т.е. уже компилятор на 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. Типизация в языках программирования

JavaScript

Динамическая

Слабая

Неявная

Ruby

Динамическая

Сильная

Неявная

Python

Динамическая

Сильная

Неявная

Java, C#

Статическая

Сильная

Явная

PHP

Динамическая

Слабая

Неявная

C, C++, Objective-C

Статическая

Слабая

Явная

Perl

Динамическая

Слабая

Явная

Haskell, Ocaml, Standard ML

Статическая

Сильная

Неявная

Lisp

Динамическая

Сильная

Неявная

D

Статическая

Сильная

Явная

Fortran 90/95/2003/2008

Статическая

Сильная

Явная

Pascal, ObjectPascal/Delphi, Ada

Статическая

Сильная

Явная

Download 0.87 Mb.

Do'stlaringiz bilan baham:
1   ...   4   5   6   7   8   9   10   11   ...   40




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling