Anda telah membaca pikiran saya.
Ketika saya mengambil kursus kompiler, beberapa tahun yang lalu, saya menemukan bahwa jika Anda mengambil AST dan membuat serial, dengan notasi awalan alih-alih notasi infiks biasa, dan menggunakan tanda kurung untuk membatasi seluruh pernyataan, Anda mendapatkan Lisp. Sementara saya belajar tentang Skema (dialek Lisp) dalam studi sarjana saya, saya tidak pernah benar-benar mendapatkan penghargaan untuk itu. Saya benar-benar mendapatkan apresiasi untuk Lisp dan dialeknya, sebagai hasil dari kursus itu.
Masalah dengan apa yang Anda usulkan:
sulit / lambat untuk menyusun AST dalam lingkungan grafis. Lagipula, kebanyakan dari kita bisa mengetik lebih cepat daripada menggerakkan mouse. Namun, pertanyaan yang muncul adalah "bagaimana Anda menulis kode program dengan tablet?" Mengetik pada tablet lambat / rumit, dibandingkan dengan keyboard / laptop dengan keyboard perangkat keras. Jika Anda dapat membuat AST dengan menyeret dan menjatuhkan komponen dari palet ke atas kanvas pada layar yang besar, pemrograman perangkat layar sentuh pada tablet dapat menjadi hal yang nyata.
sedikit / tidak ada alat kami yang ada mendukung ini. Kami memiliki puluhan tahun pengembangan untuk menciptakan IDE yang semakin kompleks dan editor yang semakin cerdas. Kami memiliki semua alat ini untuk memformat ulang teks, membandingkan teks, mencari teks. Di mana alat yang dapat melakukan hal yang setara dengan pencarian ekspresi reguler di pohon? Atau beda dua pohon? Semua hal ini mudah dilakukan dengan teks. Tapi mereka hanya bisa membandingkan kata-katanya. Ubah nama variabel, sehingga kata-katanya berbeda tetapi makna semantiknya sama, dan alat-alat yang berbeda itu mengalami masalah. Alat-alat seperti itu, dikembangkan untuk beroperasi pada AST dan bukan teks, akan memungkinkan Anda untuk lebih dekat dengan membandingkan makna semantik. Itu akan menjadi Hal yang Baik.
sementara mengubah kode sumber program menjadi AST relatif dipahami dengan baik (kami memiliki kompiler dan penerjemah, bukan?), mengubah AST menjadi kode program tidak begitu dipahami dengan baik. Mengalikan dua bilangan prima untuk mendapatkan bilangan komposit yang besar relatif mudah tetapi memfaktorkan bilangan komposit yang besar kembali ke bilangan prima jauh lebih sulit; di situlah kita dengan parsing vs AST dekompilasi. Di situlah perbedaan antar bahasa menjadi masalah. Bahkan dalam bahasa tertentu, ada beberapa cara untuk mendekompilasi AST. Iterasi melalui kumpulan objek dan mendapatkan semacam hasil, misalnya. Gunakan for for, iterasi melalui array? Itu akan kompak dan cepat, tetapi ada batasan. Gunakan semacam Iterator, beroperasi pada Koleksi? Koleksi itu bisa berukuran variabel, yang menambah fleksibilitas dengan mengorbankan kecepatan (mungkin). Peta / Kurangi? Lebih kompleks, tetapi secara implisit diparalelkan. Dan itu hanya untuk Java, tergantung pada preferensi Anda.
Pada waktunya, upaya pengembangan akan dikeluarkan dan kami akan mengembangkan menggunakan layar sentuh dan AST. Mengetik akan menjadi kurang dari keharusan. Saya melihat itu sebagai perkembangan logis dari tempat kita berada, melihat bagaimana kita menggunakan komputer, hari ini, itu akan menyelesaikan # 1.
Kami sudah bekerja dengan pohon. Lisp hanyalah AST serial. XML (dan HTML, dengan ekstensi) hanyalah pohon serial. Untuk melakukan pencarian, kami sudah memiliki beberapa prototipe: XPath dan CSS (masing-masing untuk XML dan HTML). Ketika alat grafis dibuat yang memungkinkan kami membuat pemilih dan pengubah gaya CSS, kami akan menyelesaikan bagian # 2. Ketika penyeleksi tersebut dapat diperluas untuk mendukung regex, kami akan lebih dekat. Masih mencari alat diff grafis yang bagus untuk membandingkan dua dokumen XML atau HTML. Ketika orang mengembangkan alat-alat itu, # 2 akan dapat dipecahkan. Orang-orang sudah mengerjakan hal-hal seperti itu; mereka belum ada di sana.
Satu-satunya cara saya dapat melihat untuk mendekompilasi ASTs ke bahasa pemrograman teks akan menjadi sesuatu yang mencari tujuan. Jika saya memodifikasi kode yang ada, tujuannya mungkin dapat dicapai dengan suatu algoritma yang membuat kode saya yang dimodifikasi sedekat mungkin dengan kode awal (minimal textual diff). Jika saya menulis kode dari awal, tujuannya mungkin kode terkecil, paling ketat (kemungkinan untuk perulangan). Atau mungkin kode yang diparalelkan seefisien mungkin (kemungkinan peta / pengurangan atau sesuatu yang melibatkan CSP). Jadi, AST yang sama dapat menghasilkan kode yang sangat berbeda, bahkan dalam bahasa yang sama, berdasarkan pada bagaimana tujuan ditetapkan. Mengembangkan sistem seperti itu akan menyelesaikan # 3. Ini akan menjadi kompleks secara komputasional, artinya kita mungkin perlu semacam pengaturan client-server,