Saya telah menemukan beberapa alat pemrograman visual open source seperti Blockly dan teman-teman, dan proyek lain yang dihosting di Github, tetapi tidak dapat menemukan yang bekerja langsung dengan pohon sintaksis abstrak.
Mengapa demikian?
Saya bertanya karena begitu saya menemukan bahwa setiap kompiler di luar sana memiliki fase dalam proses kompilasi di mana ia mem-parsing kode sumber ke AST, jelas bagi saya bahwa beberapa alat pemrograman visual dapat mengambil keuntungan dari ini untuk memberikan cara-cara programmer untuk mengedit AST secara langsung dengan cara visual, dan juga untuk melakukan perjalanan pulang pergi dari sumber ke simpul-grafik dan kemudian kembali lagi ke sumber ketika diperlukan.
Misalnya seseorang dapat berpikir bahwa dari JavaScript AST Visualizer ke alat pemrograman visual JavaSript yang sebenarnya tidak ada terlalu banyak perbedaan.
Jadi, apa yang saya lewatkan?
Jawaban:
Banyak dari alat ini melakukan pekerjaan secara langsung dengan pohon abstrak sintaks (atau lebih tepatnya, satu-ke-satu visualisasi langsung dari itu). Itu termasuk Blockly, yang telah Anda lihat, dan bahasa berbasis blok lain dan editor seperti itu ( Scratch , Pencil Code / Droplet , Snap! , GP , Ubin Rahmat , dan sebagainya).
Sistem-sistem itu tidak menunjukkan representasi grafik vertex-and-edge tradisional, karena alasan yang dijelaskan di tempat lain (ruang, dan juga kesulitan interaksi), tetapi mereka secara langsung mewakili pohon. Satu simpul, atau blok, adalah anak dari yang lain jika langsung, secara fisik di dalam induk.
Saya membangun salah satu sistem ini ( Tiled Grace , kertas , kertas ). Saya dapat meyakinkan Anda, itu sangat banyak bekerja dengan AST secara langsung: apa yang Anda lihat di layar adalah representasi tepat dari pohon sintaks, sebagai elemen DOM bersarang (jadi, pohon!).
Ini adalah AST dari beberapa kode. Root adalah node metode panggilan "untuk ... lakukan". Simpul itu memiliki beberapa anak, dimulai dengan "_ .. _", yang dengan sendirinya memiliki dua anak, satu simpul "1" dan satu simpul "10". Apa yang muncul di layar adalah persis apa yang disediakan backend kompiler di tengah proses - itu pada dasarnya bagaimana sistem bekerja.
Jika Anda suka, Anda bisa menganggapnya sebagai tata letak pohon standar dengan ujung-ujungnya menunjuk keluar layar ke arah Anda (dan terhalang oleh blok di depannya), tetapi bersarang sama validnya dengan cara menunjukkan pohon sebagai simpul. diagram.
Ini juga akan "melakukan perjalanan pulang pergi dari sumber ke simpul-grafik dan kemudian kembali lagi ke sumber ketika dibutuhkan". Bahkan, Anda dapat melihat itu terjadi ketika Anda mengklik "Tampilan Kode" di bagian bawah. Jika Anda memodifikasi teks, itu akan diurai kembali dan pohon yang dihasilkan membuat Anda untuk mengedit lagi, dan jika Anda memodifikasi blok, hal yang sama terjadi pada sumbernya.
Pencil Code pada dasarnya melakukan hal yang sama dengan, pada titik ini, antarmuka yang lebih baik . Blok yang digunakannya adalah tampilan grafis dari CoffeeScript AST. Begitu juga sistem berbasis blok atau genteng lainnya, pada umumnya, meskipun beberapa dari mereka tidak membuat aspek bersarang cukup jelas dalam representasi visual, dan banyak yang tidak memiliki bahasa teks aktual di belakangnya sehingga " sintaksis pohon "bisa sedikit ilusif, tetapi prinsipnya ada di sana.
Jadi, apa yang Anda lewatkan adalah bahwa sistem ini benar - benar bekerja secara langsung dengan pohon sintaksis abstrak. Apa yang Anda lihat dan manipulasi adalah rendering pohon yang efisien-ruang, dalam banyak kasus secara harfiah AST yang dihasilkan oleh kompiler atau parser.
sumber
Setidaknya ada dua alasan:
Karena kode sumber adalah representasi yang jauh lebih ringkas. Meletakkan AST sebagai grafik akan membutuhkan lebih banyak real estat visual.
Programer hadiah memiliki konteks sebanyak mungkin - yaitu, memiliki kode sebanyak yang hadir sekaligus di layar pada saat yang sama. Konteks membantu mereka mengelola kompleksitas dengan lebih baik. (Itulah salah satu alasan mengapa banyak programmer menggunakan font kecil yang gila ini dan layar 30 "yang sangat besar.)
Jika kami mencoba untuk menampilkan AST sebagai grafik atau pohon, maka jumlah kode yang dapat Anda muat pada satu layar akan jauh lebih sedikit daripada ketika itu digambarkan sebagai kode sumber. Itu kerugian besar bagi produktivitas pengembang.
AST dimaksudkan untuk pemrograman kompiler, bukan untuk memudahkan pemahaman oleh programmer. Jika Anda mengambil representasi AST yang ada dan menampilkannya secara visual, mungkin akan lebih sulit bagi pengembang untuk memahaminya, karena AST tidak dirancang agar mudah dipelajari oleh pengembang.
Sebaliknya, kode sumber biasanya adalah dirancang untuk dapat dibaca / dimengerti oleh pengembang; yang biasanya merupakan kriteria desain kritis untuk kode sumber, tetapi tidak untuk AST. AST hanya perlu dipahami oleh penulis kompiler, bukan oleh pengembang sehari-hari.
Dan, dalam hal apa pun, bahasa AST akan menjadi bahasa kedua yang harus dipelajari pengembang, selain bahasa sumber. Bukan kemenangan.
Lihat juga /software//q/119463/34181 untuk beberapa alasan potensial tambahan.
sumber
AST tipikal oleh kompiler agak rumit dan bertele-tele. Representasi grafik yang diarahkan dengan cepat akan menjadi sangat sulit untuk diikuti. Tetapi ada dua area besar CS di mana AST digunakan.
sumber