Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсова1.doc
Скачиваний:
2
Добавлен:
11.07.2019
Размер:
146.94 Кб
Скачать

Таблиці ідентифікаторів. Організація таблиць ідентифікаторів

Призначення та особливості побудови таблиць ідентифікаторів

Перевірка правильності семантики та генерація коду вимагають знання характери ¬ стик змінних, констант, функцій та інших елементів, що зустрічаються в про ¬ грамі мовою оригіналу.Всі ці елементи у вихідній програмі, як прави ¬ ло, позначаються ідентифікаторами. Виділення ідентифікаторів і інших елементів вихідної програми відбувається на фазі лексичного аналізу.Їх характеристики визначаються на фазах синтаксичного розбору, семантіч ¬ ського аналізу та підготовки до генерації коду. Склад можливих характеристик та методи їх визначення залежать від семантики вхідної мови.У будь-якому випадку компілятор повинен мати можливість зберігати всі знайдені ідентифікатори та пов'язані з ними характеристики протягом усього процесу компіляції, щоб мати можливість використовувати їх на різних фазах компіляції.Для цієї мети, як було сказано вище, 'в компіляторах викорис ¬ ються спеціальні сховища даних, що називаються таблицями символів, або таблицями ідентифікаторів.

Будь-яка таблиця ідентифікаторів складається з набору полів, кількість яких дорівнює кількості різних ідентифікаторів, знайдених у вихідній програмі. Кожне поле містить в собі повну інформацію про даному елементі таблиці.Компілятор може працювати з однією або кількома таблицями ідентифіка ¬ торів - їх кількість залежить від реалізації компілятора. Наприклад, можна організовувати різні таблиці ідентифікаторів для різних модулів вихідної програми або для різних типів елементів вхідного мови.Склад інформації, що зберігається в таблиці ідентифікаторів для кожного елемента вихідної програми, залежить від семантики вхідної мови і типу елемента. На ¬ приклад, в таблицях ідентифікаторів може зберігатися наступна інформація:

□ для змінних:

Про ім'я змінної;

Про тип даних змінної;

Про область пам'яті,пов'язана зі змінною;

□ для констант:

Про назву константи (якщо воно є); -

Про значення константи;

Про тип даних константи (якщо потрібно);

□ для функцій:

Про ім'я функції;

Про кількість і типи формальних аргументів функції;

Про тип повертається результату;

Про адресу коду функції.Наведений вище склад збереженої інформації, звичайно ж, є тільки зразковим. Інші приклади такої інформації вказані в [17, 32, 50]. Конкрет ¬ ве наповнення таблиць ідентифікаторів залежить від реалізації компілятора.Крім того, не вся інформація, що зберігається в таблиці ідентифікаторів, заповнює ¬ ся компілятором відразу - він може кілька разів виконувати звернення до дан ¬ вим в таблиці ідентифікаторів на різних фазах компіляції.Наприклад, імена змінних можуть бути виділені на фазі лексичного аналізу, типи даних для змінних - на фазі синтаксичного розбору, а область пам'яті пов'язується зі змінною тільки на фазі підготовки до генерації коду.Незалежно від реалізації компілятора принцип його роботи з таблицею ідентифікаторів залишається одним і тим же - на різних фазах компіляції компілятор змушений багаторазово звертатися до таблиці для пошуку інформації ¬ ції і запису нових даних.

УВАГА

Компілятору доводиться виконувати пошук необхідного елемента в таблиці ідентифікаторів на ім'я частіше, ніж поміщати новий елемент до таблиці, тому що кожен ідентифікатор може бути описаний тільки один раз, а використаний - кілька разів.

Звідси можна зробити висновок, що таблиці ідентифікаторів повинні бути орга ¬ нізованной таким чином, щоб компілятор мав можливість максимально швидкого пошуку потрібного йому елемента [23].

Найпростіші методи побудови таблиць ідентифікаторів

Найпростіший спосіб організації таблиці полягає в тому, щоб додавати еле ¬ менти в порядку їх надходження.Тоді таблиця ідентифікаторів буде пред ¬ ставлять собою неупорядкований масив інформації, кожна клітинка якого міститиме дані про відповідному елементі таблиці.Пошук потрібного елемента в таблиці буде в цьому випадку полягає в подальшому ¬ вательно порівнянні шуканого елемента з кожним елементом таблиці, поки не буде знайдений відповідний.Тоді, якщо за одиницю часу прийняти час, за ¬ трачіваемое компілятором на порівняння двох елементів (як правило, це срав ¬ ня двох рядків), то для таблиці, яка містить N елементів, в середньому буде виконано N / 2 порівнянь [12].

Заповнення такої таблиці буде відбуватися елементарно просто - додавання ¬ ем нового елемента в її кінець, і час, необхідний на додавання елемента (Т3) не буде залежати від числа елементів в таблиці N. Але якщо N велике, то пошук зажадає значних витрат часу.Час пошуку (Т ") в такій таблиці можна оцінити як Т" - O (N).Оскільки пошук в таблиці ідентифікаторів яв ¬ ляється найчастіше виконуваної компілятором операцією, а кількість разів ¬ особистих ідентифікаторів у реальному вихідній програмі дуже багато (від кількох сотень до кількох тисяч елементів),то такий спосіб організа ¬ ції таблиць ідентифікаторів є неефективним.

Пошук може бути виконаний більш ефективно, якщо елементи таблиці упор ¬ дочени (відсортовані) відповідно до деякого природному порядку.Оскільки пошук здійснюється по імені ідентифікатора, найбільш природний ¬ вим рішенням буде розташувати елементи таблиці в прямому або зворотному алфавітному порядку. Ефективним методом пошуку в упорядкованому списку з N елементів є бінарний, або логарифмічний, пошук.Алгоритм логарифмічного пошуку полягає в наступному: шуканий символ порівнюється з елементом (N + 1) / 2 в середині таблиці, якщо цей елемент не є потрібним, то ми повинні переглянути лише блок елементів, пронуме ¬ ваних від 1 до (N + 1) / 2-1,або блок елементів від (N + 1) / 2 + 1 до N в зави ¬ ності від того, менше або більше шуканий елемент того,з яким його срав ¬ нили.Потім процес повторюється над потрібним блоком в два рази меншого розміру. Так продовжується до тих пір, поки або шуканий елемент буде знайдений, або алгоритм дійде до чергового блоку, що містить один або два елементи (з якими можна виконати пряме порівняння шуканого елемента).Так як на кожному кроці число елементів, які можуть містити шуканий елемент, скорочується в 2 рази, максимальне число порівнянь одно 1 + log2 (N). Тоді час пошуку елемента в таблиці ідентифікаторів можна оцінити як Тп = 0 (log2 N).Для порівняння: при для N = 128 бінарний пошук зажадає мак ¬ симум 8 порівнянь, а пошук в невпорядкованою таблиці - в середньому 64 порівняй ¬ ня. Метод називають «бінарним пошуком», оскільки на кожному кроці обсяг

розглянутої інформації скорочується в 2 рази, а «логарифмічним» - оскільки час, що витрачається на пошук потрібного елемента в масиві, має ло ¬ гаріфміческую залежність від загальної кількості елементів у ньому.Недоліком логарифмічного пошуку є вимога упорядкування таблиці ідентифікаторів. Так як масив інформації, в якому виконується пошук, повинен бути впорядкований, то час його заповнення вже буде залежати від числа елементів в масиві.Таблиця ідентифікаторів часто переглядає ¬ ся компілятором ще до того, як вона заповнена повністю, тому потрібно, щоб умова впорядкованості виконувалося на всіх етапах обігу до неї.Отже, для побудови такої таблиці можна користуватися тільки алго ¬ ритмом прямого упорядкованого включення елементів.

При додаванні кожного нового елемента в таблицю спочатку треба визначити місце, куди помістити новий елемент, а потім виконати перенесення частини інфор ¬ мації в таблиці, якщо елемент додається не в її кінець.Якщо користуватися стандартними алгоритмами, що застосовуються для організації упорядкованих масивів даних [12], а пошук місця включення здійснювати за допомогою алго ¬ ритму бінарного пошуку, то середній час, необхідний на приміщення всіх еле ¬ ментів в таблицю, можна оцінити таким чином:

Т3 - 0 (N * log2 N) + k * 0 (N2)

Тут до - деякий коефіцієнт, що відображає співвідношення між часом, що витрачається комп'ютером на виконання операції порівняння та операції пе ¬ реноса даних.

У результаті при організації логарифмічного пошуку в таблиці ідентифікаторів ми добиваємося істотного скорочення часу пошуку потрібного елементу за рахунок збільшення часу на приміщення нового елемента в таблицю.Оскільки додавання нових елементів у таблицю ідентифікаторів відбувається сущест ¬ венно реже1, ніж звернення до них, цей метод слід визнати більш ефек ¬ вим, ніж метод організації невпорядкованою таблиці.