Saya baru-baru ini menemukan kerangka kerja yang disebut ecto .
Dalam kerangka kerja ini, komponen dasar bernama "plasm" , yang merupakan ecto Directed Acyclic Graph. Dalam ecto, plasm dapat dioperasikan oleh ecto scheduler.
Saya bertanya-tanya apa keuntungan dari mekanisme ini, dan dalam situasi apa lagi kita dapat mengeksploitasi konsep DAG?
algorithms
data-structures
frameworks
graph
Po-Jen Lai
sumber
sumber
Jawaban:
Pertanyaan yang bagus
EDIT:
Sumber Daya yang Baik:
sumber
Jawabannya adalah tidak ada hubungannya dengan pemrograman. Ini ada hubungannya dengan pemecahan masalah.
Sama seperti linked-list adalah struktur data yang digunakan untuk kelas masalah tertentu, grafik berguna untuk mewakili hubungan tertentu. Daftar yang ditautkan, pohon, grafik, dan struktur abstrak lainnya hanya memiliki koneksi ke pemrograman karena Anda dapat mengimplementasikannya dalam kode. Mereka ada di tingkat abstraksi yang lebih tinggi. Ini bukan tentang pemrograman, ini tentang menerapkan struktur data dalam solusi masalah.
Jika Anda masih menginginkan hubungan dengan pemrograman, harap pertimbangkan hal-hal berikut:
sumber
Orang lain telah menerapkan DAG ke data, tapi saya pikir itu setidaknya berlaku (jika tidak lebih) ke kode. Mahbubur R Aaman menyebutkan ini, jadi sebenarnya ini lebih merupakan tambahan untuk jawabannya daripada jawaban lengkap sendiri.
Itu terjadi kepada saya daripada program komputer penting yang bebas dari loop tak terbatas (terima kasih @AndresF.) Adalah Grafik Acyclic Diarah (DAG). Berarti bahwa kemungkinan jalur eksekusi kode diarahkan (pertama ini, lalu itu), dan asiklik (tidak membentuk loop tak terbatas). Mereka adalah grafik karena jalur melalui kode signifikan jarang jarang sesederhana daftar atau pohon.
Saya bekerja di XSLT selama mungkin 4 tahun. Saya mengalami kesulitan untuk menjelaskan mengapa itu bukan bahasa pemrograman tujuan umum yang baik, tetapi DAG adalah alasannya. Secara khusus, XSLT adalah bahasa yang digerakkan oleh data. Anda mendefinisikan fungsi (ya, dalam arti pemrograman fungsional) tetapi Anda tidak perlu memanggil fungsi-fungsi ini dari kode Anda. Sebaliknya, XSLT mengatur kombinasi pemilihan, dan iterasi melalui, simpul-simpul dari dokumen input XML. Ini memungkinkan struktur data input menentukan fungsi mana yang dipanggil dan dalam urutan apa.
Ini sangat menarik dan sangat keren sampai program Anda menemukan kondisi data yang tidak Anda uji pada pukul 2:30 pagi dan Anda harus bangun dan memperbaikinya. Ketika Anda membiarkan data menentukan DAG, maka definisi DAG menjadi semua kondisi input yang mungkin - yang untuk aplikasi bisnis non-sepele tidak dapat dihitung; mereka tak terbayangkan.
Pada awalnya saya berpikir bahwa pemrograman fungsional mungkin bukan DAG karena urutan eksekusi terkadang tidak jelas, atau bahkan dipikirkan oleh programmer. Tetapi program fungsional mendefinisikan dependensi. Bahkan, sifat deklaratif pemrograman fungsional dapat dianggap sebagai mendefinisikan hanya dependensi (a ^ 2 = b ^ 2 + c ^ 2) tanpa menentukan urutan eksekusi (tidak masalah apakah 'b' atau 'c' dikuadratkan terlebih dahulu , asalkan keduanya dikuadratkan sebelum ditambahkan bersama).
Tetapi sementara pemrograman Fungsional mungkin secara sengaja tidak jelas tentang urutan operasi pada tingkat terperinci, sangat jelas tentang ketergantungan. Ini adalah fitur-fitur yang membuatnya bisa menerima konkurensi. Bagaimanapun, masih ada grafik jalur melalui kode, dan grafik itu masih diarahkan (dependensi harus dievaluasi sebelum tugas tergantung), jadi saya pikir DAG berlaku di sana juga.
Pertanyaan yang bagus - terima kasih telah memposting!
sumber
while (true) { print("hi"); }
? Mungkin Anda ingin mengecualikan program yang tidak berhenti?Saat ini DAG diremehkan dalam pemrograman. Secara historis banyak hal yang berkaitan dengan pengembangan dibuat dengan pohon dan hierarki karena memindahkan sesuatu di dalam kotak adalah nyaman bagi otak kita untuk membuat hal-hal rumit lebih mudah untuk dikelola. Tetapi jika Anda melihat acara dan bagaimana mereka bergantung pada acara dan negara lain maka Anda akan mendapatkan DAG karena apa pun dalam hidup kita dan dalam program ini dapat bergantung pada apa pun di masa lalu tetapi tidak di masa depan, sehingga Anda akan mendapatkan "asiklik" yang sempurna hubungan untuk diterapkan pada konsep DAG. Meskipun ini jarang digunakan secara eksplisit dalam pengembangan, mengingat hal ini akan membantu untuk memahami hal-hal yang lebih baik
sumber
DAG dapat digunakan untuk memodelkan kumpulan tugas secara berurutan dengan batasan bahwa tugas tertentu harus dilakukan sebelum yang lain. Ecto adalah kerangka kerja pemrosesan dan menggunakan DAG untuk memodelkan grafik pemrosesan sehingga grafik melakukan eksekusi sinkron. Plasm di Ecto adalah DAG dan Penjadwal beroperasi di atasnya.
sumber
Sebagai contoh dunia nyata, perangkat lunak kami mirip dengan IDE di mana pengguna akhir dapat menentukan serangkaian operasi yang harus dilakukan pada gambar (inspeksi visi mesin). Inspeksi ini dapat memiliki ketergantungan pada inspeksi lain atau mungkin tergantung pada inspeksi tersebut. Karena ini semua dapat dikonfigurasi oleh pengguna akhir, kami tidak dapat membuat optimasi untuk pemrosesan paralel pada waktu desain. Dengan mewakili inspeksi dan dependensi ini sebagai DAG, kami dapat mengoptimalkan paralelisme inspeksi keseluruhan untuk kinerja maksimum pada waktu berjalan.
sumber
Sebagai contoh lain, aturan manajemen memori dalam aplikasi Kakao dibuat sehingga semua referensi yang kuat membentuk grafik asiklik terarah, yang dilakukan untuk menjamin tidak adanya kebocoran.
sumber
Menambahkan jawaban lain karena belum melihat referensi untuk membangun sistem seperti
make
yang menggunakan DAG untuk mengetahui dependensi untuk membangun.Lebih detail di sini
sumber
make