Курс Основы построения трансляторов


Связывание. Сравнительная характеристика языков программирования - часть 4


Этот принцип легко проиллюстрировать средствами языка Си, в котором все действия, связанные с динамическими данными и поздним связыванием производятся только в явном виде. Возьмем, к примеру, массивы:

- обычное статическое определение массива предполагает его связывание с памятью во время трансляции программы, поэтому тип сохраняемых в нем элементов и их количество должны быть величинами неизменными:

 

      int A[100];

 

- динамический массив, размерность которого определяется в процессе работы программы, может быть вычислена в момент создания, но затем не меняется , может быть представлен в Си указателем на динамическую переменную (массив) соответствующей размерности, создаваемую и уничтожаемую внешними функциями. Легко представить себе язык программирования, в котором массивы такого рода определяются в самом трансляторе, в этом случае можно говорить о связывании массива с его размерностью и памятью во время выполнения программы, например, в момент входа в модуль (блок):

 

double *p;

p = malloc(sizeof(double)*n);      // или

p = new double[n];

for (i=0; i<n; i++) p[i] = 5.44;

// ПРИМЕР СИНТАКСИСА ДИНАМИЧЕСКОГО МАССИВА

// n = getnum();

// ReDim double A[n];

 

- виртуальный массив, размерность которого может меняться уже в процессе работы программы, по мере заполнения его данными, в Си также может быть смоделирован  с использованием функций перераспределения динамической памяти  realloc. При определении таких массивов  в самом трансляторе можно говорить о связывании массива с его размерностью и памятью во время выполнения программы, причем многократной, во время заполнения его данными, то есть в любой точке программы:

 

double *p; int n=10;

p = malloc(sizeof(double)*n);

for (i=0; i<10000; i++)

{

if (i >= n)            // Если надо,

{ n = n+10;      // увеличить размерность

p = realloc(p, sizeof(double)*n);

}

p[i] = 5.44

}

// ПРИМЕР СИНТАКСИСА ВИРТУАЛЬНОГО МАССИВА

// ReDim double A[];

// for (i=0; i<10000; i++) A[i]=5.44;




Начало  Назад  Вперед



Книжный магазин