Типизация: слагаемые успеха
Типизация: слагаемые успеха
Каковы механизмы реалистичной статической типизации? Все они введены в предыдущих лекциях, а потому нам остается лишь кратко о них напомнить. Их совместное перечисление показывает согласованность и мощь их объединения.
Наша система типов полностью основана на понятии класса. Классами являются даже такие базовые типы, как INTEGER, а стало быть, нам не нужны особые правила описания предопределенных типов. (В этом наша нотация отличается от "гибридных" языков наподобие Object Pascal, Java и C++, где система типов старых языков сочетается с объектной технологией, основанной на классах.)
Развернутые типы дают нам больше гибкости, допуская типы, чьи значения обозначают объекты, наряду с типами, чьи значения обозначают ссылки.
Решающее слово в создании гибкой системы типов принадлежит наследованию и связанному с ним понятию совместимости. Тем самым преодолевается главное ограничение классических типизированных языков, к примеру, Pascal и Ada, в которых оператор x := y требует, чтобы тип x и y был одинаковым. Это правило слишком строго: оно запрещает использовать сущности, которые могут обозначать объекты взаимосвязанных типов (SAVINGS_ACCOUNT и CHECKING_ACCOUNT). При наследовании мы требуем лишь совместимости типа y с типом x, например, x имеет тип ACCOUNT, y - SAVINGS_ACCOUNT, и второй класс - наследник первого.
На практике статически типизированный язык нуждается в поддержке множественного наследования. Известны принципиальные обвинения статической типизации в том, что она не дает возможность по-разному интерпретировать объекты. Так, объект DOCUMENT (документ) может передаваться по сети, а потому нуждается в наличия компонентов, связанных с типом MESSAGE (сообщение). Но эта критика верна только для языков, ограниченных единичным наследованием.
Рис. 17.2. Множественное наследование
Универсальность необходима, например, для описания гибких, но безопасных контейнерных структур данных (например class LIST [G] ...). Не будь этого механизма, статическая типизация потребовала бы объявления разных классов для списков, отличающихся типом элементов.
В ряде случаев универсальность требуется ограничить, что позволяет использовать операции, применимые лишь к сущностям родового типа. Если родовой класс SORTABLE_LIST поддерживает сортировку, он требует от сущностей типа G, где G - родовой параметр, наличия операции сравнения. Это достигается связыванием с G класса, задающего родовое ограничение, - COMPARABLE:
class SORTABLE_LIST [G -> COMPARABLE] ...
Любой фактический родовой параметр SORTABLE_LIST должен быть потомком класса COMPARABLE, имеющего необходимый компонент.
Еще один обязательный механизм - попытка присваивания - организует доступ к тем объектам, типом которых ПО не управляет. Если y - это объект базы данных или объект, полученный через сеть, то оператор x ?= y присвоит x значение y, если y имеет совместимый тип, или, если это не так, даст x значение Void.
Утверждения, связанные, как часть идеи Проектирования по Контракту, с классами и их компонентами в форме предусловий, постусловий и инвариантов класса, дают возможность описывать семантические ограничения, которые не охватываются спецификацией типа. В таких языках, как Pascal и Ada, есть типы-диапазоны, способные ограничить значения сущности, к примеру, интервалом от 10 до 20, однако, применяя их, вам не удастся добиться того, чтобы значение i являлось отрицательным, всегда вдвое превышая j. На помощь приходят инварианты классов, призванные точно отражать вводимые ограничения, какими бы сложными они не были.
Закрепленные объявления нужны для того, чтобы на практике избегать лавинного дублирования кода. Объявляя y: like x, вы получаете гарантию того, что y будет меняться вслед за любыми повторными объявлениями типа x у потомка. В отсутствие этого механизма разработчики беспрестанно занимались бы повторными объявлениями, стремясь сохранить соответствие различных типов.
Закрепленные объявления - это особый случай последнего требуемого нам языкового механизма - ковариантности, подробное обсуждение которого нам предстоит позже.
При разработке программных систем на деле необходимо еще одно свойство, присущее самой среде разработки - быстрая, возрастающая (fast incremental) перекомпиляция. Когда вы пишите или модифицируете систему, хотелось бы как можно скорее увидеть эффект изменений. При статической типизации вы должны дать компилятору время на перепроверку типов. Традиционные подпрограммы компиляции требуют повторной трансляции всей системы (и ее сборки), и этот процесс может быть мучительно долгим, особенно с переходом к системам большого масштаба. Это явление стало аргументом в пользу интерпретирующих систем, таких как ранние среды Lisp или Smalltalk, запускавшие систему практически без обработки, не выполняя проверку типов. Сейчас этот аргумент позабыт. Хороший современный компилятор определяет, как изменился код с момента последней компиляции, и обрабатывает лишь найденные изменения.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Слагаемые бюджета на SEO
Слагаемые бюджета на SEO Современное SEO – не шаманство, а комплекс рациональных мер, вписанный в сферу цивилизованного интернет — маркетинга: кампания дробится на этапы, каждый – с конкретными задачами и KPI2. Однако в большинстве случаев, кто бы ни брался за раскрутку сайта
Как достичь успеха среди всеобщих неудач
Как достичь успеха среди всеобщих неудач Когда менеджеров компании Newport News спросили, как им удалось добиться рекордных продаж по сравнению с другими магазинами модной одежды, они ответили, что все дело в новом подходе к представлению продукции на сайте.Вместо того чтобы
Магические принципы успеха
Магические принципы успеха Все спикеры, как вы наверняка заметили, исключительно успешные люди, которые добились успеха в бизнесе и жизни. И если вы внимательно читали все эти интервью, то наверняка заметили, что есть ключевые моменты успеха, о которых каждый выступающий
5. Разбор успеха по косточкам
5. Разбор успеха по косточкам В прошлом у вас, вероятно, были проблемы, но сейчас вы добились результата. Путь к успеху можно оформить в виде отдельного кейса. Разложите по полочкам, как вы добились
1. Разбейте рецепт успеха на 10 составных частей
1. Разбейте рецепт успеха на 10 составных частей Разбейте рецепт успеха в вашей сфере на 10 составных частей. Каждая сфера деятельности строится на нюансах. Успех – это результат не одного шага, а сочетания большого количества разных факторов. Выпишите для себя эти
Важнейшие факторы успеха
Важнейшие факторы успеха Успех проекта внедрения SAP зависит от самых различных факторов, каждый из которых рассматривается в этой главе.Прямое участие топ-менеджеровВнедрение SAP — это не информационно-технологический проект, а бизнес-стратегия. Как и в случае с другими
Статическая типизация (static typing)
Статическая типизация (static typing) Когда в системе происходит вызов некоторого компонента определенным объектом, как узнать, что объект способен обработать вызов? (В терминологии сообщений: как узнать, что объект может обработать сообщение?) Чтобы гарантировать корректное
Типизация при наследовании
Типизация при наследовании Замечательная гибкость, обеспечиваемая наследованием, не связана с потерей надежности, поскольку используется статическая проверка типов, гарантирующая во время компиляции отсутствие некорректных комбинаций типов во время
Типизация и повторное объявление
Типизация и повторное объявление Повторное объявление компонентов не требует сохранения сигнатуры. Пока оно виделось нам как замена одного алгоритма другим или - для отложенного компонента - запись алгоритма, соответствующего ранее заданной спецификации.Но, воплощая
Лекция 17. Типизация
Лекция 17. Типизация Эффективное применение объектной технологии требует четкого описания в тексте системы типов всех объектов, с которыми она работает на этапе выполнения. Это правило, известное как статическая типизация (static typing), делает наше ПО: более надежным,
Статическая и динамическая типизация
Статическая и динамическая типизация Хотя возможны и промежуточные варианты, здесь представлены два главных подхода:[x]. Динамическая типизация: ждать момента выполнения каждого вызова и тогда принимать решение.[x]. Статическая типизация: с учетом набора правил
Статическая типизация: как и почему
Статическая типизация: как и почему Хотя преимущества статической типизации очевидны, неплохо поговорить о них еще
Типизация и связывание
Типизация и связывание Хотя как читатель этой книги вы наверняка отличите статическую типизацию от статического связывания, есть люди, которым подобное не под силу. Отчасти это может быть связано с влиянием языка Smalltalk, отстаивающего динамический подход к обеим задачам
ГОЛУБЯТНЯ: Секрет успеха
ГОЛУБЯТНЯ: Секрет успеха Автор: Сергей ГолубицкийЯ понимаю, что название у "Голубятни" получилось чудовищное, но не спешите четвертовать - дождитесь denouement[Литературный термин для обозначения сюжетной развязки (фр.).] и сразу поймете, что заставило меня скрипнуть сердцем и