Perlu Graphviz? Kenapa tidak bikin sendiri saja?
(spidermonkey.dev)- Untuk memvisualisasikan proses kompilasi JavaScript·WebAssembly di engine SpiderMonkey, alat internal dirombak total dan ditambahkan kemampuan menghasilkan grafik interaktif
- iongraph berbasis Graphviz yang lama memiliki tata letak yang tidak stabil dan struktur yang kurang intuitif, sehingga efisiensi debugging rendah; untuk menggantikannya, tim merancang sendiri algoritme tata letak baru
- Algoritme baru ini menyederhanakan metode Sugiyama untuk menampilkan struktur loop dengan jelas, serta mewujudkan tata letak yang stabil dan cepat dalam kurang dari 1000 baris kode JavaScript
- Grafik menggunakan edge lurus bergaya diagram rel kereta untuk meningkatkan keterbacaan, dan mencapai kecepatan rendering ribuan kali lebih cepat dibanding Graphviz
- Alat ini telah terintegrasi ke Firefox Profiler, dan ada rencana pengembangan fitur lanjutan seperti pencarian dan visualisasi register
Perombakan alat visualisasi SpiderMonkey
- Alat baru dibangun untuk memvisualisasikan graf internal yang dihasilkan oleh kompiler optimasi Ion di SpiderMonkey
- Pengguna dapat memasukkan kode JavaScript di halaman web dan menjelajahi proses optimasi fungsi dalam bentuk grafik secara real-time
- Grafik dapat diperiksa perubahan per tahap melalui drag, zoom, dan slider
- iongraph berbasis Graphviz sebelumnya menghasilkan output PDF, tetapi tidak selaras dengan struktur kode sumber dan ketidakstabilan outputnya sangat serius
- Perubahan kecil pada kode pun bisa mengubah posisi node secara drastis, sehingga sulit membandingkan antar-pass
- Struktur loop dan conditional terdistorsi secara visual, sehingga alur kontrol sulit dipahami
Batasan Graphviz dan pendekatan baru
- Algoritme Sugiyama di Graphviz cocok untuk optimasi graf umum, tetapi tidak mencerminkan karakteristik control-flow graph (CFG)
- Loop di JavaScript·WebAssembly hanya memiliki satu titik masuk dan memiliki alur kontrol reducible
- Tim SpiderMonkey memanfaatkan batasan ini untuk merancang algoritme khusus yang disederhanakan
- Penghapusan siklus: mengabaikan back edge loop
- Pelapisan (Leveling): menempatkan blok setelah loop lebih ke bawah agar mencerminkan alur kode
- Melewati minimisasi crossing: memprioritaskan stabilitas dengan mempertahankan urutan cabang true/false
- Mempertahankan struktur pohon loop: menampilkan loop bertingkat dengan jelas secara visual
- Hasilnya, tercapai tata letak yang ringkas, cepat, dan stabil, dengan implementasi awal sekitar 1000 baris JavaScript
Tahapan algoritme tata letak iongraph
- Tahap 1: Layering
- Mengurutkan blok per lapisan sambil mencerminkan hubungan internal dan eksternal loop
- Setelah loop berakhir, blok ditempatkan ke bawah sebesar tinggi keseluruhan loop
- Tahap 2: Pembuatan dummy node
- Menambahkan dummy node pada edge yang melintasi beberapa lapisan untuk mencegah benturan visual
- Edge yang menuju tujuan yang sama digabungkan untuk mengurangi noise visual
- Tahap 3: Perapian edge (Straighten)
- Menyelaraskan node parent dan child agar bentuk garis vertikal tetap terjaga, sambil menerapkan indentasi loop
- Dummy node juga ikut dalam proses perapian untuk mencegah tumpang tindih dan menjaga struktur
- Tahap 4: Pelacakan edge horizontal
- Edge horizontal diatur dalam unit track agar tidak saling tumpang tindih
- Dipisahkan ke atas dan bawah sesuai arah edge, dan edge yang bisa digabungkan disatukan
- Tahap 5: Penempatan vertikal (Verticalize)
- Memberikan koordinat Y pada tiap lapisan untuk tinggi yang seragam dan keterbacaan yang lebih baik
- Tahap 6: Rendering (Render)
- Menggunakan edge lurus bergaya diagram rel kereta
- Edge hanya berpotongan secara vertikal dan horizontal, sehingga arah dan strukturnya jelas
Efek dari algoritme yang sederhana
- Alih-alih optimasi yang rumit, penempatan berbasis aturan yang dapat diprediksi menghasilkan keterbacaan dan stabilitas
- Urutan node dipertahankan tetap, edge disederhanakan, sehingga konsistensi antar-pass terjaga
- Dengan menyingkirkan constraint solver, struktur yang lebih mudah dipahami manusia dapat diwujudkan
- Tata letak di dalam loop atau penempatan blok lanjutan ke bawah memungkinkan desain yang berpusat pada makna
- Peningkatan performa: graf fungsi zlib yang di Graphviz memerlukan 10 menit, kini dapat dirender dalam 20 milidetik
- Memberikan kecepatan ribuan kali lebih tinggi dan kemampuan eksplorasi yang lebih baik
Rencana ke depan
- iongraph telah selesai diintegrasikan ke Firefox Profiler, sehingga grafik dapat diperiksa saat analisis performa
- Saat ini hanya dapat digunakan di build shell SpiderMonkey, belum termasuk dalam build browser
- Usulan fitur ke depan
- Fitur navigasi lanjutan, pencarian, visualisasi alokasi register, dan lain-lain
- Belum ada roadmap yang jelas, dan kontribusi open source sangat disambut
- Untuk eksperimen lokal, setelah membuat
/tmp/ion.jsondengan pengaturanIONFLAGS=logs,
file tersebut dapat dimuat di rilis mandiri - Kode sumber tersedia di GitHub,
dan pengembang dapat dihubungi langsung melalui ruang obrolan Matrix
1 komentar
Komentar Hacker News
Jika ingin membandingkan secara akurat, yang dibandingkan bukan keseluruhan Graphviz melainkan dot(1)
Graphviz adalah framework visualisasi yang mencakup beberapa layout engine (dot, neato, fdp, sfdp, circo, twopi, dll.)
Akan sangat keren jika algoritma yang baru diusulkan ini bisa dikontribusikan ke Graphviz
Untuk dokumen terkait, lihat penjelasan bahasa Graphviz dan dokumentasi layout engine dot
Mungkin ini bekerja baik untuk control flow graph (CFG) dengan reducible control flow, tetapi sepertinya akan ada banyak pengecualian yang rumit
Selain itu iongraph berbasis JavaScript, jadi untuk mengintegrasikannya ke Graphviz perlu dikonversi ke C dengan alat seperti Claude
Kemampuan untuk melihat langsung implementasi asli dari suatu algoritma terasa seperti superpower sungguhan
Sebagai orang yang pernah membuat visualisasi kompleks dengan Graphviz, awalnya saya terkejut ada yang mengimplementasikannya ulang sendiri
Tetapi setelah melihat struktur algoritmanya, saya sadar ini mungkin lebih sederhana dari dugaan
Meski begitu, tetap sulit mengetahui kompleksitas tersembunyi sebelum implementasinya benar-benar selesai
Jika algoritma umum dikhususkan ke domain masalah tertentu, hasilnya bisa jauh lebih baik
Tetapi dalam kebanyakan kasus, demi kemudahan kita tetap memakai algoritma serbaguna apa adanya
Merancang sistem yang disesuaikan untuk aplikasi tertentu memberi peningkatan besar dalam kinerja, skalabilitas, dan toleransi kesalahan
Tetapi saat mengejar peningkatan 1000x, 1–2 tahun bisa lewat begitu saja
Sistem layout graf umum harus menangani jauh lebih banyak kasus, sehingga mau tak mau menjadi kompleks
Karena itu, menurut saya kompromi yang baik adalah menganalisis input, memakai algoritma cepat untuk kasus khusus, dan untuk sisanya memakai algoritma umum yang terjamin
Tulisannya bagus. Sebagai catatan, dot di Graphviz bukan implementasi murni dari algoritma Sugiyama
Implementasi nyatanya dijelaskan lebih detail dalam makalah di situsnya
Jika melihat gambar perbandingan dot dan iongraph pada graf besar, dot dioptimalkan untuk meminimalkan area, sedangkan iongraph tidak
Visualisasi graf besar memang terlihat keren, tetapi dalam praktiknya jarang benar-benar membantu
Visualisasi hanya efektif sampai beberapa puluh node; setelah itu jadi sulit dipahami karena kompleksitas edge
Pada akhirnya ini hanya bekerja baik untuk contoh sederhana, dan di lingkungan kompleks malah mengganggu
Sebagian besar masalah bisa diperkecil ke unit-unit kecil
Meski begitu, bahkan pada graf kecil Graphviz kurang enak dipandang, sementara iongraph jauh lebih mudah dibaca dari sisi garisnya
Dalam jangka panjang saya rasa diperlukan elemen interaktif seperti pencarian, sorot/sembunyikan
Yang membuat frustrasi adalah batasan bahwa diagram tidak bisa mengirim atau menerima tautan
Mermaid memang mendukung tautan teks, tetapi tautan pada diagram tetap terbatas
Diskusi terkait di StackOverflow juga layak dilihat
Diperlukan alat yang mempertimbangkan fitur semacam ini sebagai kemampuan kelas satu sejak tahap desain
Kekuatan sejati Graphviz adalah bahasa dot
Graf yang didefinisikan dengan dot punya kompatibilitas antartool yang sangat baik, dan sintaksnya sederhana serta mudah dibaca
Alternatif seperti Mermaid memang sudah muncul, tetapi dot tampaknya akan tetap lama bertahan sebagai format standar
Tulisannya benar-benar keren
Saya penasaran apakah teknik-teknik seperti ini juga dipakai di layout engine TALA milik D2
Lihat contoh TALA
Jika tertarik pada graph drawing, saya merekomendasikan kuliah Will Evans (tautan)
Dulu saya pernah berkontribusi memperbaiki bug pada Dot lexer milik Open Graph Drawing Framework (OGDF),
dan OGDF mengimplementasikan algoritma yang lebih cepat dan menghasilkan lebih sedikit persilangan dibanding Graphviz
Menurut pengalaman saya, hasil OGDF jauh lebih rapi
Untuk riwayat PR terkait, lihat tautan GitHub
Menarik. Saya penasaran bagaimana cara menjalankan contohnya
Hal bagus dari proyek ini adalah dukungannya untuk eksplorasi interaktif dengan asumsi lingkungan klien web
Karena layout-nya dikhususkan untuk control flow graph (CFG), ini memungkinkan visualisasi yang disesuaikan dengan domain
Graphviz juga punya fitur polyline dan kontrol urutan edge, tetapi dokumentasinya kurang
Akan bagus jika algoritma edge routing dari Brandes dan Kopf bisa diintegrasikan
Graphviz adalah proyek yang sudah berjalan hampir 40 tahun, dan saat ini dipelihara oleh beberapa relawan generasi kedua
Membuat tool selalu merupakan pasar yang sulit, dan para penggunanya cerdas tetapi biasanya berada di departemen dengan anggaran kecil
Disayangkan bahwa perkembangan tool diagram 2D deklaratif berjalan lambat
Siapa pun yang bekerja di bidang seperti ini selalu layak mendapat dukungan +1
Saya juga pernah memakai mermaid dan graphviz, tetapi akhirnya kembali ke FigJam — keterbacaan dan kualitas estetikanya tinggi
graphviz adalah biner yang sangat besar, sementara mermaid bergantung pada rendering SVG di browser, jadi terasa merepotkan
Yang dibutuhkan hanyalah alat untuk membuat diagram dengan mudah lewat teks
Pendekatan yang diajukan penulis menurut saya merupakan upaya yang baik untuk mengendalikan trade-off ini
Saya puas kecuali pada fakta bahwa loop tidak ditangani
Output SVG/HTML memudahkan penyesuaian gaya dan penyalinan
Jika ingin tool diagram berbasis teks, saya merekomendasikan TikZ
Lihat wiki TikZ
Hanya saja, ia tidak punya umpan balik visual instan seperti FigJam
Saya kurang suka terlalu banyak dependensi dan kurangnya konsistensi kode di mermaid
Sebagai gantinya ada nomnoml(tautan) yang kodenya rapi, serta graphre yang diport ke Typescript(tautan)
Untuk memakai mermaid bersama resvg-js, diperlukan refaktorisasi terkait pengukuran lebar teks SVG