Sembol tablosu - Symbol table

Gelen bilgisayar bilimleri , bir simge tablosu bir olan veri yapısı bir dil kullandığı çevirmen böyle bir olarak derleyici veya yorumlayıcı her tanımlayıcı bir programın içinde (veya sembol) kaynak kodunda bilgi kaynağı kendi beyanı veya görünüşü ile ilgili ilişkilidir. Başka bir deyişle, bir sembol tablosunun girişleri, girişin karşılık gelen sembolüyle ilgili bilgileri depolar.

Arka plan

Bir sembol tablosu yalnızca çeviri işlemi sırasında bellekte bulunabilir veya daha sonra kullanılmak üzere bir ABI nesne dosyasında olduğu gibi çevirinin çıktısına gömülebilir . Örneğin, etkileşimli bir hata ayıklama oturumu sırasında veya bir programın yürütülmesi sırasında veya sonrasında bir tanılama raporunu biçimlendirmek için bir kaynak olarak kullanılabilir .

Açıklama

Bir çevirmen tarafından kullanılan bir sembol tablosunda yer alan minimum bilgi, sembolün adını ve yerini veya adresini içerir. Yeniden yerleştirilebilirlik kavramına sahip bir platformu hedefleyen bir derleyici için, yeniden yerleştirilebilirlik niteliklerini (mutlak, yeniden yerleştirilebilir, vb.) ve yeniden yerleştirilebilir semboller için gerekli yer değiştirme bilgilerini de içerecektir. Yüksek seviyeli programlama dilleri için sembol tabloları , sembolün türünü saklayabilir: string, tamsayı, kayan nokta, vb., boyutu ve boyutları ve sınırları. Bu bilgilerin tümü çıktı dosyasında bulunmaz, ancak hata ayıklamada kullanılmak üzere sağlanabilir . Çoğu durumda, sembolün çapraz referans bilgileri, sembol tablosuyla birlikte saklanır veya ona bağlanır. Çoğu derleyici, çevirinin sonunda bu bilgilerin bir kısmını veya tamamını sembol tablosunda ve çapraz referans listelerinde yazdırır.

uygulama

Tabloları uygulamak için çok sayıda veri yapısı mevcuttur. Ağaçlar, doğrusal listeler ve kendi kendini organize eden listelerin tümü bir sembol tablosunu uygulamak için kullanılabilir. Sembol tablosuna, sözlük analizi ile başlayan ve optimizasyon ile devam eden bir derleyicinin çoğu aşaması tarafından erişilir .

Bir derleyici, tüm semboller için büyük bir sembol tablosu kullanabilir veya farklı kapsamlar için ayrılmış, hiyerarşik sembol tabloları kullanabilir . Örneğin, Algol veya PL/I gibi kapsamlı bir dilde bir "p" sembolü, birkaç prosedürde, belki de farklı niteliklerle ayrı ayrı bildirilebilir. Her bildirimin kapsamı, programın "p"ye yapılan referansların bu bildirime çözümlendiği bölümüdür. Her bildirim benzersiz bir "p" tanımlayıcısını temsil eder. Sembol tablosu, farklı "p"lere yapılan referansları ayırt etmek için bazı araçlara sahip olmalıdır.

Sembol tablolarını uygulamak için kullanılan yaygın bir veri yapısı karma tablosudur . Karma tablolarda arama süresi, tabloda depolanan eleman sayısından bağımsızdır, bu nedenle çok sayıda eleman için verimlidir. Ayrıca, hash anahtarının hesaplanmasına sınıflandırmayı dahil ederek, değişmez değerlerin tablo biçiminde sınıflandırılmasını basitleştirir.

Sözlüksel çözümleyici zamanının büyük bir bölümünü sembol tablosunu aramakla geçirdiğinden, bu aktivitenin derleyicinin genel hızı üzerinde çok önemli bir etkisi vardır. Bir sembol tablosu, girişlerin mümkün olduğu kadar çabuk bulunabileceği şekilde düzenlenmelidir. Hash tabloları genellikle bir sembol tablosunu düzenlemek için kullanılır, burada anahtar kelime veya tanımlayıcı bir dizi alt indisi üretmek için 'karma' yapılır. Bir karma tablosunda çarpışmalar kaçınılmazdır ve bunları ele almanın yaygın bir yolu, eşanlamlıyı tablodaki bir sonraki boş alana depolamaktır.

Uygulamalar

Bir nesne dosyası , içerdiği ve dışarıdan görülebilen tanımlayıcıların bir sembol tablosunu içerecektir. Farklı nesne dosyalarının bağlanması sırasında, bir bağlayıcı bu sembol referanslarını belirleyecek ve çözecektir. Genellikle tüm tanımsız dış semboller bir veya daha fazla nesne kitaplığında aranır . Bu sembolü tanımlayan bir modül bulunursa, ilk nesne dosyasıyla birlikte bağlanır ve tanımlanmamış harici tanımlayıcılar, aranacak tanımlayıcılar listesine eklenir. Bu işlem, tüm dış referanslar çözülene kadar devam eder. İşlem sonunda bir veya daha fazla çözümsüz kalırsa bu bir hatadır.

Bir yürütülebilir dosyada tersine mühendislik yapılırken , birçok araç, global değişkenlere ve bilinen işlevlere hangi adreslerin atandığını kontrol etmek için sembol tablosuna başvurur. Sembol tablosu kaldıysa soyulmuş veya çalıştırılabilir bir dosya dönüştürülmeden önce temizlenmiş, araçlar daha zor adreslerini belirlemek veya program hakkında bir şey anlamak için bulacaksınız.

Örnek

C ile yazılmış aşağıdaki programı düşünün :

// Declare an external function
extern double bar(double x);

// Define a public function
double foo(int count)
{
    double sum = 0.0;

    // Sum all the values bar(1) to bar(count)
    for (int i = 1; i <= count; i++)
        sum += bar((double) i);
    return sum;
}

Bu kodu ayrıştıran AC derleyicisi, en azından aşağıdaki sembol tablosu girişlerini içerecektir:

Sembol adı Tip Kapsam
bar fonksiyon, çift dış
x çift fonksiyon parametresi
foo fonksiyon, çift küresel
count int fonksiyon parametresi
sum çift yerel engelle
i int for döngüsü ifadesi

Ek olarak, sembol tablosu ayrıca derleyici tarafından ara ifade değerleri (örneğin, idöngü değişkenini a öğesine dönüştüren ifade doubleve işlev çağrısının dönüş değeri bar()), ifade etiketleri vb. için oluşturulan girdileri de içerecektir .

Örnek: SysV ABI

Örnek tablo: SysV ABI
Adres Tip İsim
00000020 a T_BIT
00000040 a F_BIT
00000080 a I_BIT
20000004 T irqvec
20000008 T fiqvec
2000000c T InitReset
20000018 T _ana
20000024 T Son
20000030 T AT91F_US3_CfgPIO_useB
200005c T AT91F_PIO_CfgPeriph
200000b0 T ana
20000120 T AT91F_DBGU_Printk
20000190 T AT91F_US_TxHazır
200001c0 T AT91F_US_PutChar
200001f8 T AT91F_SpuriousHandler
20000214 T AT91F_DataAbort
20000230 T AT91F_Fetchİptal
2000024c T AT91F_Undef
20000268 T AT91F_Undefİşleyicisi
20000284 T AT91F_LowLevelInit
200002e0 T AT91F_DBGU_CfgPIO
2000030c T AT91F_PIO_CfgPeriph
20000360 T AT91F_US_Yapılandır
200003dc T AT91F_US_SetBaud Hızı
2000041c T AT91F_US_Baud hızı
200004ec T AT91F_US_SetTimeguard
2000051c T AT91F_PDC_Aç
2000059c T AT91F_PDC_DisableRx
200005c8 T AT91F_PDC_DisableTx
200005f4 T AT91F_PDC_SetNextTx
20000638 T AT91F_PDC_SetSonrakiRx
200067c T AT91F_PDC_SetTx
200006c0 T AT91F_PDC_SetRx
20000704 T AT91F_PDC_EnableRx
20000730 T AT91F_PDC_EnableTx
2000075c T AT91F_US_EnableTx
20000788 T __aeabi_uidiv
20000788 T __udivsi3
20000884 T __aeabi_uidivmod
2000089c T __aeabi_idiv0
2000089c T __aeabi_ldiv0
2000089c T __div0
200009a0 NS _veri
200009a0 A _etext
200009a0 NS selam
200009a4 A __bss_end__
200009a4 A __bss_start
200009a4 A __bss_start__
200009a4 A _edata
200009a4 A _son

Bir sembol tablosu örneği, farklı derleyicilerin, bağlayıcıların ve yükleyicilerin tutarlı bir şekilde bulabilmesi ve onunla çalışabilmesi için sembollerin ikili bir dosyada nasıl yerleştirileceğini zorunlu kılan SysV Uygulama İkili Arayüzü (ABI) belirtiminde bulunabilir. derlenmiş bir nesnedeki semboller.

SysV ABI, GNU binutils'in nm yardımcı programında uygulanmaktadır. Bu biçim, sıralanmış bir bellek adres alanı, bir "sembol türü" alanı ve bir simge tanımlayıcı ("Ad" olarak adlandırılır) kullanır.

SysV ABI'deki (ve nm'nin çıktısındaki) sembol türleri, sembol tablosundaki her girişin yapısını gösterir. Her sembol tipi tek bir karakterle temsil edilir. Örneğin, başlatılmış verileri temsil eden sembol tablosu girişleri "d" karakteri ile gösterilir ve işlevler için sembol tablosu girişleri "t" sembol tipine sahiptir (çünkü yürütülebilir kod bir nesne dosyasının metin bölümünde bulunur). Ek olarak, sembol tipinin büyük harf kullanımı bağlantı tipini gösterir: küçük harfler sembolün yerel olduğunu ve büyük harfler harici (genel) bağlantıyı gösterir.

Örnek: Python sembol tablosu

Python programlama dili sembol tabloları oluşturma ve işlenmesi için kapsamlı destek içerir. Sorgulanabilecek özellikler, belirli bir sembolün serbest değişken mi yoksa bağlı değişken mi olduğunu, blok kapsamı mı yoksa global kapsam mı olduğunu, içe aktarılıp aktarılmadığını ve hangi ad alanına ait olduğunu içerir.

Örnek: Dinamik sembol tabloları

Bazı programlama dilleri, sembol tablosunun çalışma zamanında manipüle edilmesine izin verir, böylece herhangi bir zamanda semboller eklenebilir. Raket böyle bir dilin bir örneğidir.

Hem LISP hem de Scheme programlama dilleri, keyfi, genel özelliklerin her bir sembolle ilişkilendirilmesine izin verir.

Prolog programlama dili aslında bir sembol tablo manipülasyon dilidir; sembollere atom denir ve semboller arasındaki ilişkiler üzerinde mantık yürütülebilir. Benzer şekilde, OpenCog olarak adlandırılan dinamik bir simge tablosu içerir atomspace için kullanılan, bilgi gösterimi .

Ayrıca bakınız

Referanslar