Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 24
Текст из файла (страница 24)
Например, возможные альтернативные формы операторов, типы структур данных, программные структуры и т. п. определяются, как правило, во время определения языка. 84 Глава 2. Влияние машинной архитектуры 1. Набор возжожкмх типов длл переженной Х. Обычно для переменной в про грамме определен какой-либо тин данных — это может быть ~ отедег (целочисленный), геа1 (вещественный), Воо1еап (булев) или какой-то иной тип. Множество возможных типов для переменной Х обычно устанавливается при определении языка (например, могут допускаться только типы ~ пое9ег, геа1, Воо1еап, зет (множество) и сйагассег (символ)).
Может быть и так, что язык допускает определение новых типов переменных в каждой программе, как, например, в С, )ача и Аоа. В таком случае множество возможных типов для переменной Х устанавливается во время трансляции программьь 2. Тип переменной Х Конкретный тип данных, ассоциированный с перемен ной Х, часто устанавливается во время трансляции при помощи явного объявления в программе; например, в языке С для того, чтобы задать Х как переменную вещественного типа, используется объявление 11оаь Х, В таких языках, как, например, Рег! или Бща!!га!)с, тип данных переменной Хопределяется во время выполнения программы, в тот момент, когда переменной присваивается значение определенного типа, В этих языках переменная Х в одном месте может содержать целое значение, а в другом месте той же программы — строку символов.
Множество возможных знамений для переменной Х Если тип данных для переменной Х определен как вещественный (гев1), то при выполнении программы Х может принимать некоторые значения из определенного множества — множества последовательностей битов, представляющих в данном аппаратном компьютере вещественные числа. Множество возможных значений для переменной Х зависит от того, какие вещественные числа допустимы в данном виртуальном компьютере, определяемом языком программирования. Обычно это множество совпадает с множеством вещественных чисел, представление для которых предусмотрено в базовом аппаратном компьютере. Значение первже.
В любой момент выполнения программы переменная Х связана с каким-либо значением. Это то значение, которое присваивается данной переменной при выполнении программы. Операция присваивания Х = Х + 10 меняет значение переменной Х, заменяя старое значение новым, которое больше исходного на 10. Представление константы 10. Целое число 10 представлено одновременно как константа в тексте программы (с использованием строки 10) и как некая последовательность битов во время выполнения программы. Выбор десятичного представления этого числа (то есть символа 10 для десяти) обычно происходит во время определения языка программирования, а выбор конкретной последовательности битов для представления этого числа при выполнении программы происходит во время реализации языка.
Свойства операции «+». Выбор символа «+» для обозначения операции сложения происходит во время определения языка. Однако в зависимости от контекста этот символ может обозначать вегцестввнное сложение, целочисленное глажен, комплексное сложение и т. п. В компилируемом языке принято определять операцию, представляемую символом «+», во время 2.2. Виртуальные компьютеры и время связывания 85 компиляции. Роль мехаиизма, выполняющего это связывание, обычно играет механизм определения тинов переменных; если Х вЂ” целое число, то символ «+» обозиачает в данном контексте целочисленное сложение; если Х вЂ” вещественное число, то символ «+» обозначает веществеп нос сложение и т.
д. Подробное определение операции, обозначенной символом «+», может зависеть также от аппаратной части базового компьютера. Если в нашем примере Х будет иметь значение 2", то иа некоторых компьютерах для Х+ 10 ие будет возможности представить результат этого сложения. Подводя итог, можно сказать, что для яз гака, подобного С, символ «+» связывается с набором операций сложения во время определения языка. Затем во время реализации языка определяется каждый элемент из этого набора, во время трансляции программы каждое конкретное употребление символа «+» в программе связывается с конкретной операцией сложения, а конкретное значение результата операции сложения определяется уже во время выполнения программы.
Важность времени связывания В следующих главах мы займемся сравнительным анализом языков программирования. Во многих случаях в основе различия между языками лежат различия во временах связывания. Мы постоянно будем задавать вопрос: когда именно происходит связывание — во время траисляции или вовремя выполнения? Многие важные и тонкие отличия между языками заключаются именно в различиях во временах связывания. Например, почти для всех языков допустимы числа в качестве данных и предусмотрены арифметические операции с числами.
Но ие все языки одинаково хороши для создания программ, в которых требуется выполнять большое количество арифметических операций. Например, и М1., и ГОКТКАХ позволяют определять массивы чисел и манипулировать этими массивами. Но для решеиия задач, связанных с большими числовыми массивами и большим количеством вычислений, было бы весьма неблагоразумно использовать М1. при наличии язы- ка ГОКТКАХ. Если мы попытаемся отыскать причину превосходства РОКТКАХ, сравнивая характеристики ГОКТКАХ и М1, то в конце концов придем к выводу, что в данном случае лучше использовать ЕОКТКАХ, так как в М1.
большинство связываний происходит во время выполнения программы, а в ГОКТКАХ вЂ” во время трансляции Таким образом, при выполнении программы иа МЕ болыпая часть времени будет уходить иа создаиие и уничтожение связей. В такой же программе, написанной иа ЕОКТКАХ, основная часть связей устанавливается единожды во время трансляции, а при выполнении программы потребуется лишь незначительноее количество связываний. В итоге программа ца ГОКТКАХ будет работать зиачительио эффективнее. С другой стороны, можно задать такой вопрос почему ГОКТКАХ ие столь гибок в обработке строковых переменных и массивов, как М1? Ответ опять-таки сводится к различию во времени связывания.
Поскольку связываиие в ГОКТКАХ происходит по большей части во время трансляции, до того как становятся известны входиые данные, иа ГОКТКАХ трудно писать программы, которые могли бы приспосабливаться во время выполнения к большому количеству различных ситуаций, зависящих от входных данных.
Например, размер строк и тип переменных 86 Глава 2. Влияние машинной архитектуры в ЕОКТГхАХ должны быть определены во врел1я трансляции. В М1. подобное связывание может быть отложено до момента выполнения программы, когда будут известны входные данные и определятся наиболее подходящие связывания для конкретных входных данных, В языках, подобных ГОРСТКАХ, большая часть связываний происходит на этапе трансляции. Эта ситуация носит название раннего связывания.
Если же связывания происходят в основном при выполнении программы, как в МЕ или в НТМ1., то говорят о позднем связывании. Сравнительные преимушества и недостатки раннего и позднего связывания связаны с противоречием между гибкостью и эффективностью. Языки, для которых эффективность выполнения программ играет решающую роль (например, ГО КТВД, Разов! и С), обычно конструируются таким образом, чтобы максимально возможное количество связываний выполнялось во время трансляции. Если же определяющее значение имеет гибкость (как в 11ВР и М1), болыпая часть связываний откладывается до момента выполнения программы, чтобы обеспечить возможность учета входных данных, от которых зависят связывания. Если же требуется создать язык, который был бы одновременно и эффективным, и гибким(примером чего служит Ада), следует обеспечить возможность управления временем связывания.
Время связывания и реализация языка В определении языка обычно не накладывается строгих определений на время связывания. При определении языка предполагается, что какое-то конкретное связывание будет сделано, например, во время трансляции, но окончательно это определяется только при реализации языка. В частности, Рааса! устроен так, что тип переменных определяется во время компиляции; но в какой-либо конкретной реализации языка Рааса! тип переменных может проверяться только при выполнении программы, То есть хотя в определении Рааса! предполагается, что проверка типов переменных происходит во время колгпиляции, это не является строгим требованием.
Вообще говоря, в определении языка указывается самое раннее время, когда в процессе обработки программы может произойти связывание, а при реализации языка связывание фактически может быть отложено до более позднего времени. Тем не менее обычно в различных реализациях данного языка конкретное связывание происходит в одно и то же время. Если язык был определен таким образом, чтобы большинство связываний происходило во время компиляции, то откладывание этих связываний до момента выполнения программы, вероятнее всего, просто уменьшит эффективность работы и не принесет выигрыша в гибкости, как показана в приведенном выше примере с Рааса!. Следует, однако, обратить внимание на то, что часто кажущиеся незначительными изменения в языке могут привести к серьезному изменению времени связывания.
Например, введение в ГОКТКАХ 90 рекурсии изменяет время связывания многих важнейших свойств этого языка. Поскольку время связывания зависит от реализации языка, то важно знать, какая конкретная реализация используется. При использовании локальной реализации языка программист должен принимать во внимание времена связывания в атой конкретной версии. Являются ли они обычными или локальные изменения языка привели к их модификации? 2.2. Виртуальные компьютеры и время связывания 87 2.2.4. Обзор языка дача История.