Aklımı okuyordun.
Bir kaç yıl önce bir derleyici dersi aldığımda, bir AST alıp seri hale getirdiyseniz, normal infix notasyonu yerine önek notasyonu ile keşfetti ve tüm ifadeleri sınırlandırmak için parantez kullandığınızda Lisp elde ettiğinizi keşfettim. Lisans çalışmalarımda Scheme (Lisp lehçesi) hakkında bir şeyler öğrenmeme rağmen, bunun için hiçbir zaman takdir almadım. Bu kursun bir sonucu olarak Lisp ve lehçeleri için kesinlikle bir takdir kazandım.
Önerdiğiniz ile ilgili sorunlar:
Bir grafik ortamda AST oluşturmak zor / yavaş. Ne de olsa çoğumuz bir fareyi hareket ettirebileceğimizden daha hızlı yazabiliriz. Yine de, ortaya çıkan bir soru "program kodunu bir tabletle nasıl yazıyorsunuz?" Bir tablete yazmak, donanım klavyesine sahip bir klavyeye / dizüstü bilgisayara kıyasla daha yavaş / zahmetlidir. Bileşenleri bir paletteki büyük bir tuval üzerinde bir tuval üzerine sürükleyip bırakarak bir AST oluşturabilirseniz, tabletteki bir dokunmatik ekran cihaz programlaması gerçek bir şey olabilir.
Mevcut araçlarımızdan az / hiç biri bunu desteklememektedir. Giderek daha karmaşık IDE'ler ve gittikçe akıllı hale gelen editörler yaratma konusunda onlarca yıllık gelişimimiz var. Metni yeniden biçimlendirmek, metni karşılaştırmak, metin aramak için tüm bu araçlara sahibiz. Ağaçta normal ifade aramaya eşdeğer olabilecek araçlar nerededir? Ya da iki ağaç arasında bir fark? Bütün bunlar kolayca metinle yapılır. Fakat sadece kelimeleri karşılaştırabilirler. Değişken bir adı değiştirin, öyle ki kelimeler farklıdır, ancak anlamsal anlam aynıdır ve bu farklı araçlar sorunla karşılaşır. Metin yerine AST'ler üzerinde çalışmak üzere geliştirilen bu tür araçlar, anlamsal anlamın karşılaştırılmasında daha yakın olmanızı sağlar. Bu iyi bir şey olurdu.
Program kaynak kodunu bir AST'ye dönüştürmek nispeten iyi anlaşılırken (derleyiciler ve tercümanlarımız var, değil mi?), AST'yi program koduna dönüştürmek o kadar iyi anlaşılmamıştır. Büyük, bileşik bir sayı elde etmek için iki asal sayının çarpılması nispeten basittir ancak büyük, bileşik bir sayıyı asal sayılara geri döndürmek çok daha zordur; AST'leri ayrıştırma vs ayrıştırma ile buradayız. Dillerin arasındaki farklar bir sorun haline gelir. Belirli bir dilde bile, bir AST'yi ayrıştırmanın birçok yolu vardır. Örneğin, bir nesne koleksiyonunda yineleme ve bir tür sonuç elde etme. Bir dizi boyunca yineleme, bir for döngüsü kullanın? Bu kompakt ve hızlı olurdu, ancak sınırlamalar var. Bir çeşit yineleyici kullan, Koleksiyonda mı çalışıyorsunuz? Bu Koleksiyon değişken büyüklükte olabilir ve bu da (mümkün) hız pahasına esneklik katar. Harita indirgeme? Daha karmaşık, ancak örtük olarak paralelleştirilebilir. Ve bu sadece tercihlerinize bağlı olarak Java için.
Zamanla, geliştirme çabası harcanacak ve dokunmatik ekranları ve AST'leri kullanarak geliştireceğiz. Yazma bir gereklilikten daha az olacak. Nerede olduğumuza dair mantıklı bir ilerleme olarak görüyorum, bugün bilgisayarları nasıl kullandığımızı inceliyoruz.
Zaten ağaçlarla çalışıyoruz. Lisp yalnızca seri hale getirilmiş AST'ler. XML (ve HTML, uzantı olarak) yalnızca serileştirilmiş bir ağaçtır. Arama yapmak için zaten birkaç prototipimiz var: XPath ve CSS (sırasıyla XML ve HTML için). CSS tarzı seçiciler ve değiştiriciler oluşturmamızı sağlayan grafiksel araçlar oluşturulduğunda, # 2'nin bir kısmını çözmüş olacağız. Bu seçicilerin regex'leri destekleyecek şekilde genişletilebildiği durumlarda, daha yakın olacağız. İki XML veya HTML belgesini karşılaştırmak için hala iyi bir grafiksel fark aracı arıyorum. İnsanlar bu araçları geliştirdikçe, # 2 çözülebilir. İnsanlar zaten böyle şeyler üzerinde çalışıyor; Onlar henüz orada değiller.
Bu AST'leri programlama dili metnine koyabildiğimi görebilmemin tek yolu, hedef arayan bir şey olabilir. Var olan kodu değiştiriyorsam, hedef, değiştirilmiş kodumu başlangıç koduna mümkün olduğunca benzer yapan bir algoritma ile gerçekleştirilebilir (minimum metinsel fark). Sıfırdan kod yazıyorsam, hedef en küçük, en dar kod olabilir (muhtemelen bir döngü için). Veya olabildiğince verimli bir şekilde paralelleştirilen kod olabilir (muhtemelen bir harita / küçültme veya CSP içeren bir şey). Dolayısıyla, aynı AST, hedeflerin nasıl belirlendiğine bağlı olarak aynı dilde bile önemli ölçüde farklı kodlara neden olabilir. Böyle bir sistemin geliştirilmesi # 3'ü çözecektir. Hesaplamalı olarak karmaşık olacaktı, bu da muhtemelen bir çeşit müşteri-sunucu düzenlemesine ihtiyacımız olacağını,