Cтраница 2
Контроль соответствия типов может быть связан с довольно большими расходами в период исполнения и поэтому имеет смысл обнаруживать ошибки как можно раньше. В приведенном выше примере вызов ввести ( z) можно было бы реализовать как приглашение пользователю вводить данные с некоторого устройства ввода. Если вводимая структура данных оказывается большой и чувствительной к нескольким ошибкам, то было бы очень неэффективно сначала вводить ее всю и лишь затем производить контроль соответствия типов; гораздо лучше продолжать ввод данных только до тех пор, пока не встретится первая ошибка. Исходя из этих соображений, мы получим значительное преимущество, если стратегия управления, заложенная в интерпретаторе, будет включать в себя возможность работать в сопрограммам режиме. [16]
Программист пишет одно определение шаблона функции. Исходя из типа аргументов, задаваемых при вызовах этой функции, C автоматически генерирует объектный код для отдельных функций, обрабатывающих вызовы каждого типа. Однако макросы оставляют возможность для серьезных побочных эффектов и не позволяют компилятору осуществлять контроль соответствия типов. Шаблоны функций, подобно макросам, дают компактное решение проблемы, но при этом обеспечивают полную проверку типов. [17]
Далее процесс контроля соответствия типов продолжаться не может до тех пор, пока не будут введены новые конкретные данные, поэтому управление вновь возвращается к процессу ввода и запрашивает пользователя, который вводит теперь, скажем, x: t ( TIP, TIP) и, стало быть, заполняет еще одну компоненту структуры данных. Она в свою очередь подвергается контролю соответствия типов, и, наконец, пользователь заполняет последнюю компоненту, скажем у: Т1Р, которая затем также проверяется. Таким образом, вся структура данных z: t ( t ( TIP TIP) TIP) введена по этапам, разделяемым контролем соответствия типов, так что ошибка на каком-либо этапе будет обнаружена до того, как произойдет переход к следующему этапу. Заметим, наконец, что логические программы способны обрабатывать частично определенные данные в виде термов, которые содержат переменые, не связанные никакими другими термами. Выше мы видели, что частично определенная структура t ( x y) могла передаваться процедурам контроля соответствия типов и частично обрабатываться до того, как стали известными конкретные значения переменных х или у. Этот вид поведения не имеет прямых аналогов во многих традиционных языках программирования. [18]
Используемый для сохранения групп переменных или объектов. Экземпляр класса СОЬАггау хранит множество указателей на объекты класса CObject ( или любого класса, порожденного от CObject) в структуре данных, подобной массиву. CObject - это MFC-класс, от которого прямо или косвенно порождаются практически все остальные классы. Однако вместо использования экземпляра класса общего назначения СОЬАггау программа MiniDraw использует шаблон CTypedPtrArray, спроектированный специально для хранения объектов класса CLine. Это позволяет компилятору выполнять более интенсивный контроль соответствия типов данных, уменьшать число ошибок и сокращать число операций приведения типов при использовании объектов класса. [19]