86 Глава 2. Влияние машинной архитектуры
в FORTRAN должны быть определены во время трансляции. В ML подобное свя
зывание может быть отложено до момента выполнения программы, когда будут
известны входные данные и определятся наиболее подходящие связывания для
конкретных входных данных.
В языках, подобных FORTRAN, большая часть связываний происходит на эта
пе трансляции. Эта ситуация носит название раннего связывания. Если же связы
вания происходят в основном при выполнении программы, как в ML или в HTML,
то говорят о позднем связывании.
Сравнительные преимущества и недостатки раннего и позднего связывания
связаны с противоречием между гибкостью и эффективностью. Языки, для кото
рых эффективность выполнения программ играет решающую роль (например,
FORTRAN, Pascal и С), обычно конструируются таким образом, чтобы максималь
но возможное количество связываний выполнялось во время трансляции. Если
же определяющее значение имеет гибкость (как в LISP и ML), большая часть свя
зываний откладывается до момента выполнения программы, чтобы обеспечить
возможность учета входных данных, от которых зависят связывания. Если же тре
буется создать язык, который был бы одновременно и эффективным, и гибким (при
мером чего служит Ada), следует обеспечить возможность управления временем
связывания.
Время связывания и реализация языка
В определении языка обычно не накладывается строгих определений на время свя
зывания. При определении языка предполагается, что какоето конкретное связы
вание будет сделано, например, во время трансляции, но окончательно это опреде
ляется только при реализации языка. В частности, Pascal устроен так, что тип
переменных определяется во время компиляции; но в какойлибо конкретной реа
лизации языка Pascal тип переменных может проверяться только при выполнении
программы. То есть хотя в определении Pascal предполагается, что проверка типов
переменных происходит во время компиляции, это не является строгим требова
нием. Вообще говоря, в определении языка указывается самое раннее время, когда
в процессе обработки программы может произойти связывание, а при реализации
языка связывание фактически может быть отложено до более позднего времени.
Тем не менее обычно в различных реализациях данного языка конкретное связы
вание происходит в одно и то же время. Если язык был определен таким образом,
чтобы большинство связываний происходило во время компиляции, то отклады
вание этих связываний до момента выполнения программы, вероятнее всего, про
сто уменьшит эффективность работы и не принесет выигрыша в гибкости, как по
казано в приведенном выше примере с Pascal.
Следует, однако, обратить внимание на то, что часто кажущиеся незначитель
ными изменения в языке могут привести к серьезному изменению времени связы
вания. Например, введение в FORTRAN 90 рекурсии изменяет время связывания
многих важнейших свойств этого языка. Поскольку время связывания зависит от
реализации языка, то важно знать, какая конкретная реализация используется. При
использовании локальной реализации языка программист должен принимать во
внимание времена связывания в этой конкретной версии. Являются ли они обыч
ными или локальные изменения языка привели к их модификации?