Cтраница 1
Сильная типизация гарантирует, что программные единицы будут использованы в строгом соответствии с их спецификациями независимо от того, использовалась или нет раздельная трансляция. Кроме того, сильная типизация предотвращает программиста от внесения в программные единицы произвольных изменений, которые могут привести к тому, что эта программная единица перестанет соответствовать своим спецификациям. Более того, тело программной единицы обязано соответствовать спецификации этой программной единицы, т.е. той спецификации, на которой основано использование этой программной единицы другими программистами. [1]
Сильная типизация имеет различные проявления. Так, параметры, передаваемые в процедуры и функции, подвергаются контролю на соответствие типов. [2]
Механизм сильной типизации приобретает все большую значимость в глазах специалистов по языку Си. Реализации языка Си становятся более строгими с точки зрения типов данных и работы с ними. [3]
Противники сильной типизации утверждают, что механизм сильной типизации препятствует легкости программирования и гибкости, однако, за исключением некоторых проблем с производными типами ( обсуждаемых ниже в § 7.3.4), автору не удалось обнаружить подтверждения этого. Еще один аргумент, часто выдвигаемый противниками сильной типизации, заключается в том, что ряд программ, таких, например, как распределитель памяти, которые нарушают механизм сильной типизации, не может быть написан вообще при использовании языков программирования с сильной типизацией. В языке Ада имеется предопределенная библиотечная настраиваемая функция UNCHECKED CONVERSION, представляющая собой механизм, обеспечивающий возможность нарушения явным образом механизма сильной типизации, использование которой легко позволяет писать на языке Ада программы типа распределителя памяти. К тому же программы, в которых осуществляется нарушение механизма сильной типизации, легко могут быть обнаружены по использованию в них предопределенной библиотечной настраиваемой функции UNCHECKED CONVERSION, что облегчает сопровождение и перенос таких программ. [4]
Механизм сильной типизации в языке Паскаль облегчает выявление разного рода описок, возникающих в процессе написания программ. Весьма полезны и проверки, осуществляемые на этапе выполнения, позволяющие, в частности, выявлять ошибки, связанные с выходом за границы массивов. [5]
Языки программирования с сильной типизацией не могут быть использованы для решения задач системного программирования, поэтому для решения этих задач необходимо включение в язык программирования с сильной типизацией средств, обеспечивающих возможность нарушения механизма сильной типизации. Однако намного лучше включать в язык программирования одно средство, предназначенное для нарушения механизма сильной типизации, чем несколько различных средств, каждое из которых позволяет нарушать механизм сильной типизации. В таком случае все нарушения механизма сильной типизации легко локализуются и изолируются. Например, в языке Ада введена предопределенная библиотечная настраиваемая функция UNCHECKED CONVERSION, обращение к которой обеспечивает возможность нарушения механизма сильной типизации. К сожалению, в языке Си механизм сильной типизации может быть нарушен несколькими различными способами, позволяющими трактовать представление значения как данных различных типов. [6]
Одним из следствий использования механизма сильной типизации является то, что типы формальных и фактических параметров должны совпадать. Рассмотрим пример из практики. [7]
Вирт называет его языком программирования с сильной типизацией. Однако в языке Паскаль отсутствует механизм, обеспечивающий возможность явного указания намерения нарушить правила строгого контроля типов, хотя для этого и имеются готовые средства - записи с вариантами. Поскольку в языке Паскаль отсутствуют средства, обеспечивающие контроль типов меток вариантов, то поля записей с вариантами представляют собой потенциальную опасность. Вирт пишет о потенциальной опасности отсутствия средств контроля типов меток вариантов, которое может стимулировать порочную практику программирования. [8]
Противники сильной типизации утверждают, что механизм сильной типизации препятствует легкости программирования и гибкости, однако, за исключением некоторых проблем с производными типами ( обсуждаемых ниже в § 7.3.4), автору не удалось обнаружить подтверждения этого. Еще один аргумент, часто выдвигаемый противниками сильной типизации, заключается в том, что ряд программ, таких, например, как распределитель памяти, которые нарушают механизм сильной типизации, не может быть написан вообще при использовании языков программирования с сильной типизацией. В языке Ада имеется предопределенная библиотечная настраиваемая функция UNCHECKED CONVERSION, представляющая собой механизм, обеспечивающий возможность нарушения явным образом механизма сильной типизации, использование которой легко позволяет писать на языке Ада программы типа распределителя памяти. К тому же программы, в которых осуществляется нарушение механизма сильной типизации, легко могут быть обнаружены по использованию в них предопределенной библиотечной настраиваемой функции UNCHECKED CONVERSION, что облегчает сопровождение и перенос таких программ. [9]
Язык Паскаль почти является языком программирования с сильной типизацией. Грубо говоря, это означает, что в программе, написанной на языке Паскаль, каждый объект имеет тип, определяющий допустимые значения этого объекта и набор операций, применимых к этому объекту. При этом транслятор с языка Паскаль гарантирует невозможность присваивания объектам недопустимых значений и применения к объектам недопустимых операций за счет некоторой совокупности проверок, осуществляемых как на этапе трансляции, так и на этапе выполнения. Однако, конечно же, реальные трансляторы с языка Паскаль могут не обеспечивать проведения всех без исключения проверок, являющихся обязательными с точки зрения языка Паскаль. Более того, не следует путать сильную типизацию с анализом размерности. [10]
Строго говоря, в языке Паскаль в механизме сильной типизации имеется огромная дыра в районе записей с вариантами, использование которой в совокупности с некоторыми трюками позволяет, хотя и весьма искуственно осуществлять написание программ, относящихся к вышеупомянутой категории. [11]
Хотя язык Си и нельзя считать языком программирования с сильной типизацией, тем не менее программа, написанная на языке Си, в которой не выявлено ошибок верификатором lint, по-видимому, может считаться написанной на языке программирования с сильной типизацией. [12]
Язык Паскаль почти соответствует приведенному выше определению языка программирования с сильной типизацией. Убрать слово почти из предыдущего предложения не позволяют, например, следующие два обстоятельства: наличие в языке Паскаль механизма записей с вариантами и возможность передачи в качестве параметров имен процедур и функций. Хотя в язык Си введены типы данных, тем не менее он очень далеко отстоит от языков программирования с сильной типизацией. Язык Си был разработан для того, чтобы дать возможность программисту активно использовать механизм трактовки представления значения как данных различных типов. Поэтому в языке Си обеспечивается несколько различных способов, позволяющих трактовать представление значения как данных различных типов, например, такие механизмы, как объединения, указатели, передача параметров, именование компонентов ( полей) структур. [13]
Опыт автора по использованию языка Ада ( имея в виду вопросы, связанные с сильной типизацией) может быть оценен как очень положительный. Почти все семантические ошибки, такие, как несоответствие типов или ошибочные ссылки на объекты ( а подавляющее большинство этих ошибок пришлось на тот этап, когда автор осваивал язык Ада), были выявлены на этапе трансляции. [14]
Автор убежден, что введение в язык Ада средств совмещения ведет к уничтожению ( по крайней мере до некоторой степени) некоторых из преимуществ сильной типизации. Более того, наличие средств совмещения существенно усложняет проблему соответствия типов в целом. С другой стороны, средства совмещения предоставляют программисту возможность, которая оказывается весьма удобной при решении многих задач. [15]