Cтраница 1
Контроль соответствия типов может быть связан с довольно большими расходами в период исполнения и поэтому имеет смысл обнаруживать ошибки как можно раньше. В приведенном выше примере вызов ввести ( z) можно было бы реализовать как приглашение пользователю вводить данные с некоторого устройства ввода. Если вводимая структура данных оказывается большой и чувствительной к нескольким ошибкам, то было бы очень неэффективно сначала вводить ее всю и лишь затем производить контроль соответствия типов; гораздо лучше продолжать ввод данных только до тех пор, пока не встретится первая ошибка. Исходя из этих соображений, мы получим значительное преимущество, если стратегия управления, заложенная в интерпретаторе, будет включать в себя возможность работать в сопрограммам режиме. [1]
Далее процесс контроля соответствия типов продолжаться не может до тех пор, пока не будут введены новые конкретные данные, поэтому управление вновь возвращается к процессу ввода и запрашивает пользователя, который вводит теперь, скажем, x: t ( TIP, TIP) и, стало быть, заполняет еще одну компоненту структуры данных. Она в свою очередь подвергается контролю соответствия типов, и, наконец, пользователь заполняет последнюю компоненту, скажем у: Т1Р, которая затем также проверяется. Таким образом, вся структура данных z: t ( t ( TIP TIP) TIP) введена по этапам, разделяемым контролем соответствия типов, так что ошибка на каком-либо этапе будет обнаружена до того, как произойдет переход к следующему этапу. Заметим, наконец, что логические программы способны обрабатывать частично определенные данные в виде термов, которые содержат переменые, не связанные никакими другими термами. Выше мы видели, что частично определенная структура t ( x y) могла передаваться процедурам контроля соответствия типов и частично обрабатываться до того, как стали известными конкретные значения переменных х или у. Этот вид поведения не имеет прямых аналогов во многих традиционных языках программирования. [2]
При раздельной трансляции не производится контроля соответствия типов параметров раздельно транслируемых компонентов. При осторожном использовании раздельная трансляция может применяться при создании больших программных комплексов. Однако раздельная трансляция оказывается практически бесполезной для создания библиотек подпрограмм вследствие ограничений, связанных с размерами массивов, которые должны быть известны на этапе трансляции. [3]
Обеспечивается ли в этом языке программирования контроль соответствия типов в раздельно транслируемых программных единицах. За исключением очень маленьких программ, возможность раздельной трансляции разных программных единиц и последующей компоновки полученных объектных модулей имеет чрезвычайно большое значение. Возможность компоновки объектных библиотек из предварительно оттранслированных программных единиц имеет большое значение даже в случае очень маленьких программ. [4]
Язык Си традиционно очень либерален в вопросах контроля соответствия типа выражений контексту, в которых они используются. [5]
Поэтому в программе, предназначенной для обработки L, можно было бы сначала выполнить контроль соответствия типов с помощью вызова список ( L), используя при этом процедуры, которые проверяли бы, что длина п списка L неотрицательна и единственна и что на каждой его позиции с целым номером i, заключенным в пределах от / до п, находится в точности один элемент. [6]
Для того чтобы оценить структурную правильность представлений посредством фактов, иногда может потребоваться подвергать их контролю соответствия типов. [7]
Тип множестра, введенный в языке Паскаль, представляется весьма удачной идеей, обеспечивающей удобство формы записи и некоторую свободу от контроля соответствия типов. [8]
В этом случае практически невозможно осуществить необходимый контроль соответствия типов на этапе трансляции, что приводит к необходимости генерировать объектный код, содержащий в себе контроль соответствия типов, проводимый на этапе выполнения. Одним из возможных путей решения этой проблемы является указание типов процедур и функций, используемых в качестве формальных параметров, и типов параметров этих функций. В этом случае имеется единообразие с требованием указания типов всех без исключения параметров. По-видимому, такой подход является более правильным, чем попытки избавиться от побочных эффектов и введения искусственного различия между процедурами и функциями. [9]
Далее процесс контроля соответствия типов продолжаться не может до тех пор, пока не будут введены новые конкретные данные, поэтому управление вновь возвращается к процессу ввода и запрашивает пользователя, который вводит теперь, скажем, x: t ( TIP, TIP) и, стало быть, заполняет еще одну компоненту структуры данных. Она в свою очередь подвергается контролю соответствия типов, и, наконец, пользователь заполняет последнюю компоненту, скажем у: Т1Р, которая затем также проверяется. Таким образом, вся структура данных z: t ( t ( TIP TIP) TIP) введена по этапам, разделяемым контролем соответствия типов, так что ошибка на каком-либо этапе будет обнаружена до того, как произойдет переход к следующему этапу. Заметим, наконец, что логические программы способны обрабатывать частично определенные данные в виде термов, которые содержат переменые, не связанные никакими другими термами. Выше мы видели, что частично определенная структура t ( x y) могла передаваться процедурам контроля соответствия типов и частично обрабатываться до того, как стали известными конкретные значения переменных х или у. Этот вид поведения не имеет прямых аналогов во многих традиционных языках программирования. [10]
В серьезных программах для организации баз данных также может потребоваться выполнять проверки правильности данных, особенно во время их обновления. Правила, регулирующие правильность данных, называются ограничениями целостности; обычный контроль соответствия типов является как раз простым примером более общего процесса, который проверяет, удовлетворяет ли какой-либо набор данных своим ограничениям целостности. В приведенном ранее примере с заказом мест в гостинице одним из возможных органичений могло бы быть следующее утверждение, которое предохраняет от накладок при заказе номеров при условии, конечно, что данные всегда ему удовлетворяют. [11]
Встроенные функции обладают преимуществами перед макросами препроцессора ( см. главу 13), также расширяющимися в месте вызова макроса. Следовательно, при обращениях к встроенным функциям выполняется надлежащий контроль соответствия типов; макросы препроцессора не поддерживают контроля соответствия типов. Другим преимуществом является то, что встроенные функции исключают непредвиденные побочные эффекты, связанные с неправильным использованием макросов. [12]
Когда большие структуры данных собираются при помощи какого-либо метода, подверженного ошибкам ( например, при помощи ручного ввода), может оказаться выгодным осуществлять некоторый контроль этих данных перед выполнением основных действий, связанных с их обработкой. Хотя контроль мог бы включать в себя много различных видов тестов данных, наиболее фундаментальным из них является контроль соответствия типов, посредством которого данные проверяются на структурное соответствие имеющемуся в виду типу данных. [13]
Ряд трансляторов с языка Паскаль допускает возможность проведения раздельной трансляции, не обеспечивая1 проведение полного контроля соответствия типов в раздельно транслируемых компонентах программы. Как курьез, связанный с этой темой, автору вспомнилась одна статья ( к счастью, ненапечатанная), в которой на странице п язык Си критиковался за отсутствие контроля соответствия типов в раздельно транслируемых компонентах программы, а на странице п 1 предлагался способ нарушения механизма сильной типизации в языке Паскаль путем введения возможности проведения раздельной трансляции без проведения полного контроля соответствия типов в раздельно транслируемых компонентах программы. [14]
Далее процесс контроля соответствия типов продолжаться не может до тех пор, пока не будут введены новые конкретные данные, поэтому управление вновь возвращается к процессу ввода и запрашивает пользователя, который вводит теперь, скажем, x: t ( TIP, TIP) и, стало быть, заполняет еще одну компоненту структуры данных. Она в свою очередь подвергается контролю соответствия типов, и, наконец, пользователь заполняет последнюю компоненту, скажем у: Т1Р, которая затем также проверяется. Таким образом, вся структура данных z: t ( t ( TIP TIP) TIP) введена по этапам, разделяемым контролем соответствия типов, так что ошибка на каком-либо этапе будет обнаружена до того, как произойдет переход к следующему этапу. Заметим, наконец, что логические программы способны обрабатывать частично определенные данные в виде термов, которые содержат переменые, не связанные никакими другими термами. Выше мы видели, что частично определенная структура t ( x y) могла передаваться процедурам контроля соответствия типов и частично обрабатываться до того, как стали известными конкретные значения переменных х или у. Этот вид поведения не имеет прямых аналогов во многих традиционных языках программирования. [15]