Bagikan melalui


Bekerja dengan semantik

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

  • jenis
  • bidang
  • metode
  • variabel lokal

Meskipun masing-masing memiliki keunikan yang berbeda, menentukan mana yang benar-benar dirujuk oleh sebuah pengidentifikasi seringkali membutuhkan pemahaman yang mendalam tentang aturan bahasa.

Ada elemen program yang diwakili dalam kode sumber, dan program juga dapat merujuk ke pustaka yang dikompilasi sebelumnya, dikemas dalam file perakitan. Meskipun tidak ada kode sumber, dan oleh karena itu tidak ada node sintaks atau pohon, yang tersedia untuk perakitan, program masih dapat merujuk ke elemen di dalamnya.

Untuk tugas tersebut, Anda memerlukan Model semantik.

Selain model sintaksis kode sumber, model semantik merangkum aturan bahasa, memberi Anda cara mudah untuk mencocokkan pengidentifikasi dengan benar menggunakan elemen program benar yang direferensikan.

Kompilasi

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

Karena semua informasi ini ada di satu tempat, elemen-elemen yang terkandung dalam kode sumber dapat dijelaskan lebih detail. 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 perakitan.

Mirip dengan pohon sintaks, kompilasi tidak dapat diubah. Setelah membuat kompilasi, kompilasi tidak dapat diubah oleh Anda atau orang lain yang mungkin Anda ajak berbagi. Namun, Anda dapat membuat kompilasi baru dari kompilasi yang sudah ada, dengan menentukan perubahan saat melakukannya. Misalnya, Anda dapat membuat kompilasi yang sama dalam segala hal 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 perakitan sebagai metadata. Setiap namespace, jenis, metode, properti, bidang, peristiwa, parameter, atau variabel lokal diwakili oleh simbol.

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

Simbol juga berisi informasi tambahan yang ditentukan oleh pengompilasi dari sumber atau metadata, seperti simbol referensi lainnya. Setiap jenis simbol diwakili oleh antarmuka terpisah yang diturunkan dari ISymbol, masing-masing dengan metode dan propertinya sendiri yang merinci informasi yang telah dikumpulkan oleh pengompilasi. Banyak dari properti ini secara langsung merujuk pada simbol lain. Misalnya, properti IMethodSymbol.ReturnType memberi tahu Anda simbol jenis aktual yang dikembalikan oleh metode.

Simbol menyajikan representasi umum dari 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 IMethodSymbol dengan properti yang sama.

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

Model semantik

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

  • Simbol yang direferensikan di lokasi tertentu di sumber.
  • Jenis yang dihasilkan dari ekspresi apa pun.
  • Semua diagnostik, yang merupakan kesalahan dan peringatan.
  • Bagaimana variabel mengalir masuk dan keluar dari wilayah sumber.
  • Jawaban atas pertanyaan yang lebih spekulatif.