Sembol tablosu - Symbol table

İçinde bilgisayar Bilimi, bir sembol tablosu bir veri yapısı bir dil tarafından kullanılıyor çevirmen gibi derleyici veya çevirmen her biri nerede tanımlayıcı (veya sembol) bir programın kaynak kodu kaynaktaki beyanı veya görünümüyle ilgili bilgilerle ilişkilendirilir. Başka bir deyişle, bir sembol tablosunun girişleri, girişin karşılık gelen sembolüyle ilgili bilgileri depolar.

Arka fon

Bir sembol tablosu yalnızca çeviri işlemi sırasında bellekte bulunabilir veya bir çeviri işleminde olduğu gibi çevirinin çıktısına gömülebilir. ABI nesne dosyası daha sonra kullanmak için. Örneğin, bir etkileşim sırasında kullanılabilir. hata ayıklama oturumu veya bir teşhis raporunu biçimlendirme sırasında veya sonrasında biçimlendirmek için bir kaynak olarak icra bir programın.[1]

Açıklama

Bir çevirmen tarafından kullanılan bir sembol tablosunda bulunan minimum bilgiler, sembolün adını ve konumunu veya adresini içerir. Yeniden konumlandırılabilirlik konseptine sahip bir platformu hedefleyen bir derleyici için, yeniden konumlandırılabilirlik özniteliklerini (mutlak, yeniden konumlandırılabilir, vb.) Ve yeniden yerleştirilebilir semboller için gerekli yeniden konumlandırma bilgilerini de içerecektir. İçin sembol tabloları üst düzey programlama dilleri sembolün türünü: dize, tam sayı, kayan nokta, vb., boyutunu ve boyutlarını ve sınırlarını saklayabilir. Bu bilgilerin tümü çıktı dosyasına dahil edilmez, ancak kullanım için sağlanabilir hata ayıklama. Çoğu durumda sembolün çapraz referans bilgiler, sembol tablosu ile birlikte saklanır veya tabloya bağlanır. Çoğu derleyici, bu bilgilerin bir kısmını veya tamamını sembol tablosunda ve çapraz referans listelerinde çevirinin sonunda yazdırır.

Uygulama

Sayısız veri yapıları tabloları uygulamak için mevcuttur. Ağaçlar, doğrusal listeler ve kendi kendini düzenleyen listeler tümü bir sembol tablosu uygulamak için kullanılabilir. Sembol tablosuna, bir derleyicinin çoğu aşamasıyla erişilir. sözcük analizi ve optimizasyon yoluyla devam ediyor.

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

Sembol tablolarını uygulamak için kullanılan ortak bir veri yapısı, karma tablo. Karma tablolarda arama süresi, tabloda depolanan öğe sayısından bağımsızdır, bu nedenle çok sayıda öğe için etkilidir. Aynı zamanda basitleştirir[Nasıl? ] değişmez değerlerin tablo biçiminde sınıflandırılması.

Sözcük analizcisi, zamanının büyük bir bölümünü sembol tablosuna bakarak geçirdiğinden, bu faaliyetin derleyicinin genel hızı üzerinde çok önemli bir etkisi vardır. Girişlerin olabildiğince çabuk bulunabileceği şekilde bir sembol tablosu düzenlenmelidir. Karma tablolar genellikle, anahtar kelime veya tanımlayıcının bir dizi alt simgesi oluşturmak için 'karma' olduğu bir sembol tablosunu düzenlemek için kullanılır. Bir hash tablosunda çarpışmalar kaçınılmazdır ve bunları ele almanın yaygın bir yolu, eşanlamlıyı tablodaki bir sonraki kullanılabilir boş alanda saklamaktır.

Başvurular

Bir nesne dosyası içerdiği tanımlayıcıların dışarıdan görülebilen 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 tanımlanmamış tüm harici semboller bir veya daha fazla nesne kitaplıkları. İlk nesne dosyasıyla bağlantılı olduğu sembolü tanımlayan bir modül bulunursa ve tanımlanmamış herhangi bir dış tanımlayıcı, aranacak tanımlayıcılar listesine eklenir. Bu süreç, tüm harici referanslar çözümlenene kadar devam eder. Sürecin sonunda bir veya daha fazla çözülmeden kalırsa bu bir hatadır.

Süre tersine mühendislik Bir çalıştırılabilir, 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 soyulmuş veya yürütülebilir bir dosyaya dönüştürülmeden önce temizlendiğinde, araçlar adresleri belirlemekte veya program hakkında herhangi bir şeyi anlamada daha zor olacaktır.

Misal

Şu dilde yazılmış programı düşünün C:

// Harici bir işlevi bildirindış çift bar(çift x);// Bir genel işlev tanımlayınçift foo(int Miktar){    çift toplam = 0.0;    // Bar (1) ile bar (sayım) arasındaki tüm değerleri topla    için (int ben = 1; ben <= Miktar; ben++)        toplam += bar((çift) ben);    dönüş toplam;}

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

Sembol adıTürDürbün
barişlev, çiftdış
xçiftfonksiyon parametresi
fooişlev, çiftküresel
Miktarintfonksiyon parametresi
toplamçiftyerel engelle
benintfor-loop deyimi

Ek olarak, sembol tablosu, ara ifade değerleri için derleyici tarafından üretilen girişleri de içerecektir (örneğin, ben döngü değişkenini bir çiftve işlev çağrısının dönüş değeri bar()), ifade etiketleri vb.

Örnek: SysV ABI

Örnek tablo: SysV ABI
AdresTürİsim
00000020aT_BIT
00000040aF_BIT
00000080aI_BIT
20000004tirqvec
20000008tfiqvec
2000000ctInitReset
20000018T_ana
20000024tSon
20000030TAT91F_US3_CfgPIO_useB
2000005ctAT91F_PIO_CfgPeriph
200000b0Tana
20000120TAT91F_DBGU_Printk
20000190tAT91F_US_TxReady
200001c0tAT91F_US_PutChar
200001f8TAT91F_SpuriousHandler
20000214TAT91F_DataAbort
20000230TAT91F_FetchAbort
2000024cTAT91F_Undef
20000268TAT91F_UndefHandler
20000284TAT91F_LowLevelInit
200002e0tAT91F_DBGU_CfgPIO
2000030ctAT91F_PIO_CfgPeriph
20000360tAT91F_US_Configure
200003dctAT91F_US_SetBaudrate
2000041ctAT91F_US_Baudrate
200004ectAT91F_US_SetTimeguard
2000051ctAT91F_PDC_Open
2000059ctAT91F_PDC_DisableRx
200005c8tAT91F_PDC_DisableTx
200005f4tAT91F_PDC_SetNextTx
20000638tAT91F_PDC_SetNextRx
2000067ctAT91F_PDC_SetTx
200006c0tAT91F_PDC_SetRx
20000704tAT91F_PDC_EnableRx
20000730tAT91F_PDC_EnableTx
2000075ctAT91F_US_EnableTx
20000788T__aeabi_uidiv
20000788T__udivsi3
20000884T__aeabi_uidivmod
2000089cT__aeabi_idiv0
2000089cT__aeabi_ldiv0
2000089cT__div0
200009a0D_veri
200009a0Bir_etext
200009a0DHolaamigosh
200009a4Bir__bss_end__
200009a4Bir__bss_start
200009a4Bir__bss_start__
200009a4Bir_edata
200009a4Bir_son

Bir sembol tablosunun bir örneği şurada bulunabilir: SysV Uygulama İkili Arayüzü (ABI) spesifikasyonu, nasıl semboller farklı derleyiciler, bağlayıcılar ve yükleyicilerin tümü, derlenmiş bir nesnedeki sembolleri tutarlı bir şekilde bulup onlarla çalışabilmesi için ikili bir dosyaya yerleştirilmelidir.

SysV ABI, GNU binutils ' nm Yarar. Bu format sıralı bir hafıza adresi alan, bir "sembol türü" alanı ve bir sembol tanımlayıcı ("Ad" olarak adlandırılır).[2]

SysV ABI'deki (ve nm'nin çıktısındaki) sembol türleri, sembol tablosundaki her bir girişin doğasını gösterir. Her sembol türü tek bir karakterle temsil edilir. Örneğin, başlatılmış verileri temsil eden sembol tablosu girişleri "d" karakteri ile gösterilir ve fonksiyonlar için sembol tablosu girişleri "t" sembol tipine sahiptir (çünkü çalıştırılabilir kod, Metin bir nesne dosyasının bölümü). Ek olarak, sembol türünün büyük harfle yazılması bağlantı türünü belirtir: küçük harfler, sembolün yerel olduğunu ve büyük harf harici (genel) bağlantıyı belirtir.

Örnek: Python sembol tablosu

Python programlama dili, sembol tablolarının oluşturulması ve işlenmesi için kapsamlı destek içerir.[3] Sorgulanabilen özellikler, belirli bir sembolün bir serbest değişken veya a bağlı değişken, Bu olup olmadığını blok kapsamı veya küresel kapsam içeri aktarılıp aktarılmadığı ve ad alanı A ait.

Örnek: Dinamik sembol tabloları

Bazı programlama dilleri, sembol tablosunun çalışma zamanında değiştirilmesine izin verir, böylece semboller herhangi bir zamanda eklenebilir. Raket böyle bir dilin bir örneğidir[4].

İkisi de LISP ve Şema programlama dilleri rastgele, genel özelliklerin her sembolle ilişkilendirilmesine izin verir.[5]

Prolog programlama dili esasen bir sembol tablosu işleme dilidir; semboller denir atomlarve semboller arasındaki ilişkiler gerekçelendirilebilir. Benzer şekilde, OpenCog dinamik bir sembol tablosu sağlar. atom alanıiçin kullanılan Bilgi temsili.

Ayrıca bakınız

Referanslar

  1. ^ Nguyen, Binh (2004). Linux Sözlüğü. s. 1482. Alındı 14 Nisan 2018.
  2. ^ "nm". sourceware.org. Alındı 30 Mayıs 2020.
  3. ^ symtable - Python belgeleri
  4. ^ Semboller - Raket Belgeleri
  5. ^ Semboller - Guile Belgeleri