Apa struktur data di balik spreadsheet?

35

Saya ingin memahami bagaimana spreadsheet (sekelompok sel yang dinamai atau diidentifikasi mengandung nilai atau rumus yang merujuk sel lain) diselesaikan. Saya telah mencoba melihat proyek yang ada, tetapi ada banyak hal yang terjadi dengan GUI, serialisasi, peristiwa, dll. Saya tidak dapat menemukan spreadsheet.

Paling sederhana bagaimana cara kerjanya?

Hildred
sumber
1
Jika Anda ingin melihat implementasi spreadsheet yang memiliki gui yang sangat minim (dan dengan demikian mengurangi gangguan dari masalah), lihat sc: linuxjournal.com/article/10699?page=0,0
itsbruce

Jawaban:

21

Pada intinya, spreadsheet adalah bahasa fungsional dengan pengetikan dinamis dan setiap fungsi atau nilai dapat direferensikan sebagai sel dalam matriks.

Alih-alih hal-hal seperti (defn some-name ...)itu some-namebagian ditempatkan dalam sel itu sendiri.

Jika Anda pergi ke ide bahasa fungsional yang diperbarui secara dinamis (seperti lighttable untuk clojure), Anda akan melihat banyak fungsi yang sama dengan spreadsheet. Bind nilai ke nama, tulis fungsi yang menggunakan nilai itu, ubah nilainya dan output fungsi segera berubah. Ini sama dengan melakukan sesuatu seperti menulis =A1 + B2di lokasi C3di excel.

Dengan demikian, programmer fungsional sering suka menulis spreadsheet sebagai program mainan ... dan subjek makalah penelitian juga. (Ya, saya minta maaf, mereka semua berada di belakang paywall ACM.org)

  • Pemrograman fungsional spreadsheet

    Komunitas pemrograman fungsional telah menunjukkan minat pada spreadsheet, tetapi yang mengejutkan tampaknya tidak ada yang mempertimbangkan membuat spreadsheet standar, seperti Excel, bekerja dengan bahasa pemrograman fungsional standar, seperti Haskell. Dalam tulisan ini, kami menunjukkan satu cara bahwa ini bisa dilakukan. Harapan kami adalah bahwa dengan melakukan itu, kami dapat meminta pemrogram spreadsheet untuk mencoba pemrograman fungsional.

  • Bentuk / 3: Bahasa visual orde pertama untuk menjelajahi batas-batas paradigma spreadsheet

    Meskipun pencela pemrograman fungsional kadang-kadang mengklaim bahwa pemrograman fungsional terlalu sulit atau kontra-intuitif bagi kebanyakan programmer untuk dipahami dan digunakan, bukti sebaliknya dapat ditemukan dengan melihat popularitas spreadsheet. Paradigma spreadsheet, bagian pertama dari paradigma pemrograman fungsional, telah diterima secara luas di antara programmer dan pengguna akhir. Namun, ada banyak batasan dengan sebagian besar sistem spreadsheet. Dalam makalah ini, kami membahas fitur bahasa yang menghilangkan beberapa keterbatasan ini tanpa menyimpang dari model evaluasi deklaratif tingkat pertama.

  • Menerapkan spreadsheet fungsi

    Sejumlah besar pengembangan pengguna akhir dilakukan dengan spreadsheet. Metafora spreadsheet menarik karena visual dan mengakomodasi eksperimen interaktif, tetapi seperti yang diamati oleh Peyton Jones, Blackwell dan Burnett, metafora spreadsheet bahkan tidak mengakui abstraksi yang paling mendasar: mengubah ekspresi menjadi fungsi bernama. Oleh karena itu mereka mengusulkan cara untuk mendefinisikan fungsi dalam hal lembar kerja dengan sel input dan output yang ditunjuk; kita akan menyebutnya lembar fungsi.


Awal Spreadsheet di Wikipedia memberikan beberapa petunjuk bagaimana menerapkannya:

Spreadsheet adalah program aplikasi komputer interaktif untuk organisasi dan analisis data dalam bentuk tabel. Spreadsheet dikembangkan sebagai simulasi terkomputerisasi dari lembar kerja akuntansi kertas. Program ini beroperasi pada data yang direpresentasikan sebagai sel-sel array, diatur dalam baris dan kolom. Setiap sel array adalah elemen model-view-controller yang dapat berisi data numerik atau teks, atau hasil rumus yang secara otomatis menghitung dan menampilkan nilai berdasarkan konten sel lain.

Membangun ini dari Garis Besar paradigma Model-View-Controller seperti yang diungkapkan dalam perpustakaan Java . Penulis kemudian menyebutkan applet (sedikit tanggal, itu ditulis dalam '93 -'96) dan menyebutkan halaman webnya yang menuju ke http://csis.pace.edu/~bergin/Java/applets.htm (ya , applet) untuk kode spreadsheet yang sesuai http://csis.pace.edu/~bergin/Java/Spreadsheet.java

Saya akan tunjukkan bahwa keseluruhan spreadsheet, tidak sebesar di applet 570 baris ini termasuk dokumentasi.

Yang mengatakan, tergantung pada bahasanya, Anda mungkin bisa melakukan semuanya hanya dengan pointer fungsi dalam array yang jarang.


sumber
32

Secara konseptual, setiap sel adalah simpul dari grafik asiklik terarah , dan referensi ke sel lain membuat tepian dalam grafik itu. Saat Anda mengubah sel, pengurutan topologi dari semua node yang dapat dijangkau dari sel yang Anda ubah akan memberi Anda urutan yang Anda butuhkan untuk mengevaluasi sel. Setelah Anda menentukan urutan yang benar, itu hanya penguraian ekspresi standar.

Karl Bielefeldt
sumber
3
Ya, panggil saya seluk beluk tetapi tidak ada jaminan bahwa Anda tidak dapat membuat siklus dalam spreadsheet. Sebenarnya, saya baru saja menguji ini dengan Excel, mendapatkan peringatan tetapi dengan mengabaikannya saya bisa dengan mudah membuat referensi siklik.
Doc Brown
1
@DocBrown Untuk menghindari terjebak dalam loop dan membekukan program, mungkin terpotong di tautan terakhir, yang akan menyebabkannya.
Izkata
1
Poin bagus, @DocBrown. Anda masih harus mendeteksi siklus dan memperlakukannya seperti DAG untuk keperluan urutan perhitungan, bahkan jika Anda memutuskan untuk memperbolehkan rekursi. Anda hanya perlu memesannya beberapa kali.
Karl Bielefeldt
Struktur data apa yang dapat digunakan untuk mensimulasikan dependensi DAG semacam ini? Saya sedang memeriksa adjacency matrix tetapi dengan array * n kita tidak bisa menghubungkan atribut ke node dan edge. Misalnya, formula pada sel akan menjadi salah satu atribut
Andy Dufresne
6

Seperti yang telah disebutkan, spreadsheet mudah diimplementasikan sebagai DAG (grafik asiklik terarah) yang disimpan dalam hash atau kamus sederhana. Beberapa kode sederhana untuk dimainkan mungkin merupakan cara termudah untuk memahaminya:

Versi Python yang sangat sederhana: http://code.activestate.com/recipes/355045-spreadsheet/

Ini dijelaskan dan dijabarkan dalam posting blog ini: http://ralsina.me/weblog/posts/BB585.html

Ada juga versi JavaScript sederhana dengan GUI di sini: http://jsfiddle.net/ondras/hYfN3/

Tom
sumber
0

Saya telah mengkodekan paket python yang memungkinkan Anda untuk mengkonversi struktur sel fungsi file tujuan MS Excel menjadi Python. XL2py

Nilai sel diuraikan ke objek tipe dict () menambahkan nilainya. Sel dengan referensi ke sel lain dengan rumus terdiri dari node. Node merujuk pada sel yang nilainya ditentukan oleh rumusnya. Dari setiap rumus simpul, struktur dependensi didefinisikan untuk menentukan apakah referensi melingkar ada atau tidak. Pesanan perhitungan node didefinisikan dengan memperhitungkan struktur ketergantungan sel yang terlibat.

Pada struktur pohon I / O, Anda dapat menggunakan algoritma minimisasi apa pun yang diterapkan di Python sesuai keinginan Anda.

Saya sarankan Anda melihat di https://github.com/gusmaogabriels/XL2py

Salam, Gabriel

Gabriel S. Gusmão
sumber