Kod zekâsı
Control Center, bir ajana kodu okumanın ötesinde anlaması için dört yol sunar. Bu yollar gerçekten farklı soruları yanıtlar ve bir tane değil de dört tane olmasının nedeni, tek bir mekanizmanın hepsini yanıtlayamamasıdır.
| Mekanizma | Yanıtladığı soru | Maliyeti |
|---|---|---|
| Kod grafiği | Burada ne var ve ne ona bağlı | Bir dizin oluşturma geçişi; sorgulaması ucuz |
| Dil sunucusu | Bu gerçekten derleniyor mu ve bu tür nedir | Proje başına bir sunucu süreci |
| Yapısal arama | Bu ŞEKİL nerede geçiyor | Dosya başına bir ayrıştırma |
| Hata ayıklayıcı | Bu anda, bu çerçevede ne doğruydu | Durdurulmuş bir süreç |
Dil sunucusunun kapattığı boşluk
Bölüm başlığı “Dil sunucusunun kapattığı boşluk”Kod grafiği tree-sitter üzerine kurulur: semboller, çağrı kenarları, bir etki yarıçapı. Hızlıdır, ucuzdur ve türler hakkında hiçbir şey bilmez. Yeni yazdığınız çağrının derlenip derlenmediğini, o alanın nesnede var olup olmadığını ya da yeniden adlandırmanızın bir yeniden dışa aktarmayı atlayıp atlamadığını size söyleyemez.
Bir dil sunucusu olmadan bir ajan bunu test aşamasında öğrenir — ya da hiç öğrenmez. Akla yatkın bir şey yazar, yoluna devam eder ve hata üç tur sonra başka bir değişikliğe bağlı olarak ortaya çıkar.
Yani asıl kazanç lsp aracı değildir. Asıl kazanç, write, edit ve apply_patch araçlarının sarmalanmasıdır: her yazma işleminden sonra dosya dil sunucusundan geçirilir ve yeni ortaya çıkan tanılama iletileri araç sonucuna katılır. Ajan derlemeyi bozduğunu, bozduğu anda öğrenir; bunu sormayı düşünüp düşünmediğinden bağımsız olarak.
Yalnızca yeni tanılama iletileri
Bölüm başlığı “Yalnızca yeni tanılama iletileri”Ajanın kendisine zaten söylenenleri tekrarlamak, hiçbir şey söylememekten kötüdür: ajanın göz gezdirmeyi öğrendiği gürültüyle sonucu doldurur ve tek yeni hata da onunla birlikte gözden kaybolur. Çalıştırma başına bir defter, bildirilenleri izler; bu izleme önem derecesi, kod ve ileti üzerinden yapılır — konum üzerinden değil — böylece yalnızca dört satır aşağı kaymış bir tanılama ileti yeni olarak yeniden bildirilmez.
Tembel ve yokluğu konusunda dürüst
Bölüm başlığı “Tembel ve yokluğu konusunda dürüst”Açılışta hiçbir sunucu başlamaz. Bir sunucu, ona ihtiyaç duyan ilk istekle başlar — bu neredeyse her zaman, sahiplendiği bir dosyaya yapılan ilk düzenlemedir — ve boşta kalanlar temizlenir. Dart’a hiç dokunmayan bir ana makine hiçbir çözümleyici başlatmaz.
Algılama bir kesişimdir: hem checkout’ta bir kök belirtecinin bulunması hem de ikili dosyanın çözümlenebilmesi gerekir. Tek başına bir belirteç “bu proje Python” der ve sunucunun kurulu olup olmadığı hakkında hiçbir şey söylemez; tek başına çözümlenebilen bir ikili dosya, ana makinede bir araç zinciri olduğunu söyler ve bu checkout hakkında hiçbir şey söylemez. Ancak ikisi birlikte olduğunda bir sorgu başarılı olabilir; sunulan ve her zaman başarısız olan bir araç ise hiç bulunmayan bir araçtan daha kötüdür.
grep varken neden yapısal arama
Bölüm başlığı “grep varken neden yapısal arama”grep karakterleri eşleştirir. Bu, bir ad için doğru araçtır; bir şekil içinse yanlış.
Yapısal bir desen, dosyayla aynı gramerle ayrıştırılır; böylece dispose($X), çağrıyı nasıl boşluklandırılmış, sarmalanmış ya da satırlara bölünmüş olursa olsun bulur ve bir dize sabitinin ya da bir yorumun içindeki aynı karakterlerle hiçbir zaman eşleşmez.
Onu, fazladan adımları olan bir regex’ten daha fazlası yapan özellik şudur: bir desende tekrarlanan bir meta değişkenin aynı metni yakalaması gerekir:
if ($X != null) $X.dispose()test ettiği şeyi dispose eden bir koruma koşuluyla eşleşir, başka bir şeyi dispose edenle ise eşleşmez. Bu, metinsel olarak hiçbir şekilde ifade edemeyeceğiniz bir hata sınıfıdır.
Zaten bağlı olan tree-sitter üzerinde çalışır
Bölüm başlığı “Zaten bağlı olan tree-sitter üzerinde çalışır”İkinci bir motor yok. cc_natives, kod grafiği için tree-sitter’ı ve gramerlerini zaten yükler; yanında bir derlenmiş sorgu önbelleği ve bir dil tablosu vardır. Eşleştirici, zaten ayrıştırılmakta olan ağaçlar üzerinde saf Dart’tır. İkinci bir yapısal motor; ikinci bir ayrıştırıcı, her platformda derlenip hazırlanması gereken ikinci bir gramer kümesi ve “çağrı ifadesi nedir” sorusuna iki farklı yanıt anlamına gelirdi.
Bir parçanın yaşayacak bir yeri olmalı
Bölüm başlığı “Bir parçanın yaşayacak bir yeri olmalı”Bir gramer yalnızca bütün bir dosyanın ne olduğunu tanımlar. Dart’ın üst düzeyinde çıplak olarak ayrıştırıldığında dispose(x), tamamen geçerli bir işlev imzasıdır — dispose adında, x parametresi alan bir bildirim — ve bunu ele verecek hiçbir hata yoktur. Bu ayrıştırma üzerine kurulmuş bir eşleştirici bildirimleri arar, hiçbir çağrı bulamaz ve hiçbir zaman göründüğü gibi okunmayan bir desen için “eşleşme yok” bildirir.
Bu yüzden bir desen bir iskele merdiveninde denenir — deyim, ifade, sınıf üyesi, üst düzey — ve onu kabul eden ilk bağlam kazanır. Hiçbir bağlamın kabul etmediği bir parça, aranıp sessizce bulunamaz yerine ayrıştırılamaz olarak bildirilir.
Bir yeniden yazma neden yazmak yerine sahnelenir
Bölüm başlığı “Bir yeniden yazma neden yazmak yerine sahnelenir”Yapısal bir yeniden yazma, bir ajanın yapabileceği en geniş düzenlemedir: tek desen, kırk dosya ve sonucu satır satır kimse okumaz — ne model, ne de bunu isteyen kişi. Bunu yazıp “bitti” demek, değişikliğe ilk dürüst bakışın sonradan bir git diff olması demektir.
Bu yüzden ast_edit ne yapacağını bildirir — sayıyı, dosyaları, eşleşen yerleri — ve değişiklik ancak resolve onu işlediğinde yere iner. Ayrıca, diske herhangi bir şey yazılmadan önce bir insanın önünde bir diff ile bir Kabul Et/At seçeneğinin durmasını sağlayan da budur.
İşleme ya hep ya hiç mantığıyla yapılır ve her dosya, sahneleme anında yakalanan içerikle karşılaştırılır. Sahneleme ile işleme arasında ajan bu dosyalardan birini elle düzenlemiş, bir tanılama geçişi onu yeniden yazmış ya da bir biçimlendirici ona dokunmuş olabilir — yine de işlemek o emeği çöpe atardı ve diff kasıtlı görünürdü. Herhangi bir uyuşmazlık tüm değişikliği reddettirir, çünkü kısmen uygulanmış bir yapısal yeniden yazma, iki şeklin hiçbirinde derlenmeyen bir ağaç bırakır.
Hata ayıklayıcının, bir print deyiminin veremeyeceği yanıtlar
Bölüm başlığı “Hata ayıklayıcının, bir print deyiminin veremeyeceği yanıtlar”Print deyimi döngüsü şudur: bir print ekle, her şeyi baştan çalıştır, çıktıyı oku, print’i sil. Her soru için tam bir test çalıştırmasına mal olur ve yalnızca çalıştırmadan önce sormayı düşündüğünüz soruyu yanıtlar.
Durdurulmuş bir çerçeve, o ana ilişkin her soruyu bir anda yanıtlar — her yerel değişkeni, her çağıranı ve çerçevenin kendi kapsamında değerlendirilen bir ifadeyi. Takılıp kalmış bir süreç ya da on çalıştırmada bir yinelenen bir hata için bu, bir öğleden sonra ile bir dakika arasındaki farktır.
Bir muhafaza gibi ve aynı nedenle sınırlandırılmış
Bölüm başlığı “Bir muhafaza gibi ve aynı nedenle sınırlandırılmış”Bir hata ayıklama adaptörü, o sürecin elinde ne varsa — bir port, bir kilit, bir veritabanı bağlantısı — tutan bir durdurulmuş sürece sahiptir. Kimsenin sürmediği bir oturum, onu başlatan turdan daha uzun yaşayan bir sızıntıdır. Bu yüzden katı bir TTL vardır, konuşma başına tam olarak bir oturum vardır ve ikinci bir launch, ilkini sessizce değiştirmek yerine reddedilir: ilkini sonlandırmadan ikincisini başlatan bir ajan, neredeyse kesinlikle ilkinin izini kaybetmiştir.
Tek taşıma, iki protokol
Bölüm başlığı “Tek taşıma, iki protokol”Debug Adapter Protocol, Language Server Protocol’ün Content-Length çerçevelemesini paylaşır; onun üstündeki hiçbir şeyi paylaşmaz — farklı bağıntı anahtarları, farklı bir hata biçimi ve LSP’de karşılığı olmayan üçüncü bir ileti türü (olaylar). Çerçeveleme tek bir yerde yaşar; protokoller onun üzerinde ayrı ayrı durur.
Çerçevelemeyi iki kez yazmak; “bir ileti iki parçaya yayılıyor”, “bir parça üç ileti barındırıyor” ve “sunucu ilk çerçevesinden önce stdout’a bir banner yazdı” sorularına iki yanıt anlamına gelirdi ve düzeltmeyi bunlardan yalnızca biri alırdı.
İlgili
Bölüm başlığı “İlgili”- Kod grafiğiyle kod arama — sembol ve etki tarafı
- Başarısız bir testi ayıklama — hata ayıklayıcı, baştan sona
- Kodu yapısal olarak yeniden düzenleme —
ast_grepveast_edit - Yerleşik ajan araçları — her işlem ve argüman