Alat pemrograman visual, mengapa mereka tidak bekerja dengan AST secara langsung?

25

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?

rraallvv
sumber
10
AST sangat verbose, dan tidak terlalu nyaman untuk pemrograman. Mereka dirancang untuk kompiler, bukan programmer.
Yuval Filmus
1
Apa yang Anda maksud dengan "bekerja langsung dengan pohon sintaksis abstrak"? Bisa dibilang semua alat berbasis blok seperti Blockly sedang mengedit AST: mereka mewakili tepi dengan bersarang (atau menumpuk, jika Anda lebih suka melihatnya seperti itu), dan pengguna dapat mengedit pohon dengan (katakan) seret dan lepas.
Michael Homer
Ini adalah pertanyaan bagus yang banyak dari kita yang suka dengan kompiler. Saya pikir jawaban singkatnya adalah jika Anda bisa melakukan ini dan membuatnya ramah pengguna, orang akan menggunakannya. Satu-satunya masalah adalah, itu "jika" besar.
Mehrdad
2
Apakah Anda sudah melihat Lisp ? "[Itu] tidak terlalu banyak sehingga Lisp memiliki sintaks aneh karena Lisp tidak memiliki sintaksis. Anda menulis program di pohon parse yang dihasilkan dalam kompiler ketika bahasa lain diurai. Tapi pohon parse ini sepenuhnya dapat diakses oleh program Anda. Anda dapat menulis program yang memanipulasi mereka. "
Wildcard

Jawaban:

28

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!).

Cuplikan layar kode Tiled Grace bersarang

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.

Michael Homer
sumber
6

Setidaknya ada dua alasan:

  1. 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.

  2. 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.

DW
sumber
2
"Sebaliknya, kode sumber dirancang agar dapat dibaca / dimengerti oleh pengembang" - counterexample: most esolangs, Perl, Lisp
John Dvorak
1
"Karena kode sumber adalah representasi yang jauh lebih ringkas."; "bahasa AST akan menjadi bahasa kedua yang harus dipelajari pengembang, selain bahasa sumber" - ini adalah argumen yang menentang semua PL visual tetapi tidak membantu menjelaskan perbedaan yang dikhawatirkan OP.
Raphael
"(Itulah salah satu alasan mengapa banyak programmer menggunakan font kecil yang gila ini dan 30" layar "besar)" - jika Anda membutuhkan layar pantat besar untuk melihat konteks yang cukup, mungkin Anda melakukan pengkodean spaghetti?;)
Raphael
1
@Raphael Mungkin, tapi lebih sedikit upaya untuk membuang uang daripada refactoring!
Kroltan
3
@JanDvorak, ... LISP adalah contoh tandingan karena AST adalah bahasa - yang memberikan kekuatan ekspresif; menulis kode LISP yang mengkompilasi ulang kode LISP Anda yang lain semudah menulis kode yang memodifikasi struktur data LISP standar ... yang persis dengan apa kode LISP ditulis . Ada alasan mengapa ini berlangsung lebih dari setengah abad - desain keluarga ini sangat ekspresif. Go harus memiliki ekstensi async-nya yang tertanam jauh ke dalam bahasa dan runtime; untuk Clojure, itu hanya perpustakaan. Lihat juga: Mengalahkan Rata-Rata .
Charles Duffy
3

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.

  1. Bahasa cacat sebenarnya ditulis sebagai AST. Kode sumber program ditulis sebagai daftar dan langsung digunakan oleh kompiler dan / atau juru bahasa (tergantung pada varian yang digunakan).
  2. Bahasa pemodelan, misalnya UML, dan banyak bahasa spesifik domain visual menggunakan notasi grafis yang efektif abstrak sintaksis grafik (ASG) pada tingkat abstraksi yang lebih tinggi daripada AST bahasa tujuan umum yang khas.
CyberFonic
sumber