Compiler plugin
- Kotlin kursu
- Uzman
- Ders 13/47
- 5 dk
Kotlin compiler plugin kavramını öğrenirsin.
Compiler plugin nedir?
Bir compiler plugin, Kotlin derleyicisinin içine kanca (hook) atan eklentidir; derleme sırasında kodu dönüştürebilir. KSP'den farklı olarak tüm AST'ye erişir.
Eklenti, derleme aşamasında sınıfları open yapabilir, sentetik kurucu ekleyebilir ya da IR'yi (Intermediate Representation) dönüştürebilir. Kotlin 2.x'te tüm resmi plugin'ler üzerinden çalışır: all-open, no-arg, compose ve kotlinx.serialization. Eklenti Gradle'da compilerPlugin bağımlılığı ile eklenir; çıktı değişmiş bytecode olur. Bu derste temel eklenti iskeletini kuracaksın.
Eklenti yaşam döngüsü
Bir compiler plugin, derleme yaşam döngüsünde belli aşamalara kanca atar: Frontend (parsing ve çözümleme), IR (ara sunum) ve Backend (code generation).
Örnek: all-open plugin'i frontend aşamasında belirli annotation'lara sahip sınıfları open yapar. compose plugin'i IR aşamasında @Composable fonksiyonları dönüştürür. Her aşamanın kendine özgü API'leri vardır; en yaygın olanı IR'dir. Bir eklenti yazmak için ComponentRegistrar arabirimi uygulanır ve ilgili aşamaya kanca atan bir extension kaydedilir.
Uygulama CompilerPlugin iskeleti yaz
CompilerPlugin sınıfı tanımla. fun load() metodu println("plugin loaded") çağrısı yapsın. main içinde CompilerPlugin().load() ile çağır.
Başlangıç kodu
// CompilerPlugin sınıfını ekle
fun main() {
// eklentiyi yükle
}Örnek çözüm
class CompilerPlugin {
fun load() {
println("plugin loaded")
}
}
fun main() {
CompilerPlugin().load()
}Beklenen çıktı
plugin loaded
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir compiler plugin neye erişebilir?
- Yalnızca annotation'lara
- Sadece çalışma zamanı verisine
- Tüm AST'ye Doğru cevap
- Yalnızca kaynak dosya adına
Açıklama: Compiler plugin tüm AST'ye erişir; KSP yalnızca sembolleri görür.
2 load metodunu tamamla
class CompilerPlugin {
fun ____() {
println("plugin loaded")
}
}
class CompilerPlugin {
fun load() {
println("plugin loaded")
}
}
Açıklama: load() metodu eklenti başlatma noktasıdır.
3 Eklenti parçalarını eşle
| Kavram | Anlamı |
|---|---|
ComponentRegistrar |
Eklenti kaydı |
extension |
Aşama kancası |
frontend |
Parsing ve çözümleme |
backend |
Code generation |