Quali sono le strutture di dati dietro un foglio di calcolo?


35

Vorrei capire come viene risolto un foglio di calcolo (un gruppo di celle con nome o altrimenti identificate contenente valori o formule che fanno riferimento ad altre celle). Ho provato a guardare i progetti esistenti, ma c'erano così tante cose da fare sulla GUI, sulla serializzazione, sugli eventi, ecc. Che non riuscivo a trovare il foglio di calcolo.

Nella sua forma più semplice come funziona?


1
Se vuoi dare un'occhiata all'implementazione di un foglio di calcolo che ha una gui molto minimale (e quindi meno distrazione dalla carne del problema), dai un'occhiata a sc: linuxjournal.com/article/10699?page=0,0
itsbruce

Risposte:


21

Alla base, un foglio di calcolo è un linguaggio funzionale con tipizzazione dinamica e ogni funzione o valore può essere referenziato come una cella nella matrice.

Invece di cose come (defn some-name ...)la some-nameparte è collocata in una cella stessa.

Se vai a un ide di linguaggio funzionale con aggiornamento dinamico (come lighttable for clojure), vedrai molte delle stesse funzionalità di un foglio di calcolo. Associare un valore a un nome, scrivere una funzione che utilizza quel valore, modificare il valore e l'output della funzione cambia immediatamente. È come fare qualcosa come scrivere =A1 + B2nella posizione di C3in Excel.

Pertanto, ai programmatori funzionali spesso piace scrivere fogli di calcolo come programmi giocattolo ... e anche argomento di articoli di ricerca. (Sì, mi dispiace, sono tutti dietro un paywall di ACM.org)

  • Programmazione funzionale del foglio di calcolo

    La comunità di programmazione funzionale ha mostrato un certo interesse per i fogli di calcolo, ma sorprendentemente nessuno sembra aver preso in considerazione l'idea di creare un foglio di calcolo standard, come Excel, con un linguaggio di programmazione funzionale standard, come Haskell. In questo documento, mostriamo un modo in cui ciò può essere fatto. La nostra speranza è che così facendo potremmo ottenere programmatori di fogli di calcolo per provare la programmazione funzionale.

  • Forms / 3: un linguaggio visivo di primo ordine per esplorare i confini del paradigma del foglio di calcolo

    Sebbene i detrattori della programmazione funzionale a volte sostengano che la programmazione funzionale sia troppo difficile o controintuitiva per la maggior parte dei programmatori per capire e utilizzare, è possibile trovare prove contrarie osservando la popolarità dei fogli di calcolo. Il paradigma del foglio di calcolo, un sottoinsieme del primo ordine del paradigma della programmazione funzionale, ha trovato ampia accettazione sia da parte dei programmatori che degli utenti finali. Tuttavia, ci sono molte limitazioni con la maggior parte dei sistemi di fogli di calcolo. In questo documento, discutiamo delle caratteristiche del linguaggio che eliminano molte di queste limitazioni senza deviare dal modello di valutazione dichiarativo del primo ordine.

  • Implementazione di fogli di calcolo delle funzioni

    Una grande quantità di sviluppo degli utenti finali viene eseguita con fogli di calcolo. La metafora del foglio di calcolo è attraente perché è visiva e accoglie la sperimentazione interattiva, ma come osservato da Peyton Jones, Blackwell e Burnett, la metafora del foglio di calcolo non ammette nemmeno l'astrazione più elementare: quella di trasformare un'espressione in una funzione con nome. Quindi hanno proposto un modo per definire una funzione in termini di un foglio di lavoro con celle di input e output designate; lo chiameremo un foglio funzionale.


L'inizio di Spreadsheet su Wikipedia fornisce alcuni suggerimenti su come implementarne uno:

Un foglio di calcolo è un programma applicativo interattivo per computer per l'organizzazione e l'analisi dei dati in forma tabellare. Fogli di calcolo sviluppati come simulazioni computerizzate di fogli di lavoro di contabilità cartacea. Il programma opera su dati rappresentati come celle di un array, organizzati in righe e colonne. Ogni cella dell'array è un elemento di controllo vista modello che può contenere dati numerici o di testo o i risultati di formule che calcolano e visualizzano automaticamente un valore in base al contenuto di altre celle.

Partendo da questo dal paradigma Schema di Model-View-Controller espresso nelle librerie Java . L'autore continua a menzionare applet (un po 'datato, è stato scritto nel '93 -'96) e menziona la sua pagina web che va su http://csis.pace.edu/~bergin/Java/applets.htm (sì , applet) per il codice del foglio di calcolo corrispondente http://csis.pace.edu/~bergin/Java/Spreadsheet.java

Sottolineerò che l'intero foglio di calcolo non è così grande in questa applet 570 righe inclusa la documentazione.

Detto questo, a seconda della lingua, probabilmente potresti fare tutto con solo i puntatori a funzione in una matrice sparsa.


32

Concettualmente, ogni cella è un nodo di un grafico aciclico diretto e i riferimenti ad altre celle creano bordi in quel grafico. Quando cambi una cella, un ordinamento topologico di tutti i nodi raggiungibili dalla cella che hai modificato ti darà l'ordine di cui hai bisogno per valutare le celle. Una volta determinato l'ordine corretto, è solo l'analisi delle espressioni standard.


3
Bene, chiamami nitty ma non c'è garanzia che non puoi creare alcun ciclo in un foglio di calcolo. In effetti, ho appena provato questo con Excel, ottenendo un avviso ma ignorandolo potrei facilmente creare un riferimento ciclico.
Doc Brown,

1
@DocBrown Per evitare di rimanere impigliato nel ciclo e congelare il programma, probabilmente viene tagliato all'ultimo collegamento, quello che lo causerebbe.
Izkata,

1
Buon punto, @DocBrown. Devi ancora rilevare il ciclo e trattarlo come un DAG ai fini dell'ordine di calcolo, anche se decidi di consentire la ricorsione. Basta passare attraverso quell'ordine più volte.
Karl Bielefeldt,

Quali strutture di dati potrebbero essere utilizzate per simulare questo tipo di dipendenze DAG? Stavo verificando la matrice di adiacenza ma con un array * n non potevamo associare attributi a nodi e bordi. Ad esempio, la formula sulla cella sarebbe uno degli attributi
Andy Dufresne,

6

Come già accennato, un foglio di calcolo può essere facilmente implementato come DAG (grafico aciclico diretto) memorizzato in un semplice hash o dizionario. Qualche semplice codice con cui giocare è probabilmente il modo più semplice per capirlo:

Una versione Python molto semplice: http://code.activestate.com/recipes/355045-spreadsheet/

Questo è stato spiegato ed elaborato in questo post del blog: http://ralsina.me/weblog/posts/BB585.html

C'è anche una semplice versione JavaScript con una GUI qui: http://jsfiddle.net/ondras/hYfN3/


0

Ho codificato un pacchetto Python che consente di convertire la struttura delle celle della funzione obiettivo del file MS Excel in Python. XL2py

I valori di cella vengono analizzati in un oggetto di tipo dict () che aggiunge i loro valori. Le celle con riferimenti ad altre celle per formule comprendono nodi. I nodi si riferiscono a una cella il cui valore è definito dalla sua formula. Da ogni formula di nodo, viene definita una struttura di dipendenza in modo da definire se esistono riferimenti circolari o meno. Gli ordini di calcolo dei nodi vengono definiti tenendo conto delle strutture di dipendenza delle celle coinvolte.

A partire dalla struttura ad albero I / O, è possibile utilizzare qualsiasi algoritmo di minimizzazione in Python come desiderato.

Suggerirei di dare un'occhiata a https://github.com/gusmaogabriels/XL2py

Cordiali saluti, Gabriel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.