Bagikan melalui


Bekerja dengan semantik

Pohon sintaks mewakili struktur leksikal dan sintaktik kode sumber. Meskipun informasi ini saja cukup untuk menjelaskan semua deklarasi dan logika dalam sumbernya, informasi tidak cukup untuk mengidentifikasi apa yang sedang direferensikan. Nama dapat mewakili:

  • sebuah jenis
  • bidang
  • metode
  • variabel lokal

Meskipun masing-masing berbeda secara unik, menentukan mana yang sebenarnya dirujuk oleh pengidentifikasi sering membutuhkan pemahaman mendalam tentang aturan bahasa.

Ada elemen program yang diwakili dalam kode sumber, dan program juga dapat merujuk ke pustaka yang dikompilasi sebelumnya, yang dikemas dalam file rakitan. Meskipun tidak ada kode sumber dan karenanya tidak ada simpul sintaks atau pohon yang tersedia untuk assembly, program masih dapat merujuk ke elemen di dalamnya.

Untuk tugas-tugas tersebut, Anda memerlukan model Semantik.

Selain model sintaksis kode sumber, model semantik merangkum aturan bahasa, memberi Anda cara mudah untuk mengidentifikasi pencocokan dengan benar dengan elemen program yang tepat yang diacu.

Kompilasi

Kompilasi adalah representasi dari semua yang diperlukan untuk mengkompilasi program C# atau Visual Basic, yang mencakup semua referensi perakitan, opsi pengkompilasi, dan file sumber.

Karena semua informasi ini berada di satu tempat, elemen yang terkandung dalam kode sumber dapat dijelaskan secara lebih rinci. Kompilasi mewakili setiap jenis, anggota, atau variabel yang dideklarasikan sebagai simbol. Kompilasi berisi berbagai metode yang membantu Anda menemukan dan menghubungkan simbol yang telah dideklarasikan dalam kode sumber atau diimpor sebagai metadata dari rakitan.

Mirip dengan pohon sintaksis, kompilasi tidak dapat diubah. Setelah Anda membuat kompilasi, kompilasi tersebut tidak dapat diubah oleh Anda maupun orang lain yang mungkin akan Anda ajak berbagi. Namun, Anda dapat membuat kompilasi baru dari kompilasi yang ada, menentukan perubahan saat Anda melakukannya. Misalnya, Anda dapat membuat kompilasi yang sama dengan kompilasi yang ada, kecuali mungkin menyertakan file sumber tambahan atau referensi perakitan.

Simbol

Simbol mewakili elemen berbeda yang dideklarasikan oleh kode sumber atau diimpor dari rakitan sebagai metadata. Setiap namespace, jenis, metode, properti, bidang, peristiwa, parameter, atau variabel lokal diwakili oleh simbol.

Berbagai metode dan properti pada Compilation jenis membantu Anda menemukan simbol. Misalnya, Anda dapat menemukan simbol untuk tipe yang dideklarasikan berdasarkan nama metadata yang umum. Anda juga dapat mengakses seluruh tabel simbol sebagai pohon simbol dengan akar pada namespace global.

Simbol juga berisi informasi tambahan yang ditentukan pengkompilasi dari sumber atau metadata, seperti simbol lain yang dirujuk. Setiap jenis simbol diwakili oleh antarmuka terpisah yang berasal dari ISymbol, masing-masing dengan metode dan propertinya sendiri yang merinci informasi yang telah dikumpulkan pengkompilasi. Banyak dari properti ini secara langsung mereferensikan simbol lain. Misalnya, properti IMethodSymbol.ReturnType memberi tahu Anda simbol tipe sebenarnya yang dihasilkan oleh metode.

Simbol menyajikan representasi umum namespace, jenis, dan anggota, antara kode sumber dan metadata. Misalnya, metode yang dideklarasikan dalam kode sumber dan metode yang diimpor dari metadata keduanya diwakili oleh dengan properti yang IMethodSymbol sama.

Simbol mirip dalam konsep dengan sistem jenis CLR seperti yang diwakili oleh System.Reflection API, tetapi lebih kaya karena mereka memodelkan lebih dari sekadar jenis. Namespace, variabel lokal, dan label semuanya adalah simbol. Selain itu, simbol adalah representasi konsep bahasa, bukan konsep CLR. Ada banyak tumpang tindih, tetapi ada banyak perbedaan yang bermakna juga. Misalnya, metode iterator di C# atau Visual Basic adalah simbol tunggal. Namun, ketika metode iterator diterjemahkan ke metadata CLR, hasilnya adalah sebuah tipe dan beberapa metode berbeda.

Model semantik

Model semantik mewakili semua informasi semantik untuk satu file sumber. Anda dapat menggunakannya untuk menemukan hal berikut:

  • Simbol yang dirujuk pada lokasi tertentu di sumber.
  • Tipe hasil dari setiap ekspresi.
  • Semua diagnostik, yang mencakup kesalahan dan peringatan.
  • Bagaimana variabel mengalir masuk dan keluar dari wilayah sumber.
  • Jawaban atas pertanyaan yang lebih spekulatif.