Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Ciao, Habr! Presento alla vostra attenzione la traduzione del post di Steven Wolfram «The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language».

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Le premesse per la fattibilità del linguaggio Wolfram

Oggi siamo sulla soglia di grandi conquiste insieme al linguaggio di programmazione Wolfram Language. Solo tre settimane fa abbiamo lanciato un motore Wolfram gratuito per gli sviluppatori, per aiutare i nostri utenti a integrare il linguaggio Wolfram Language nei loro progetti software su larga scala. Proprio oggi lanciamo il repository di funzioni Wolfram, per fornire una piattaforma coordinata per funzioni create per estendere il linguaggio Wolfram, e inoltre apriamo un repository di funzioni per chiunque possa contribuire allo sviluppo del nostro prodotto software.

Il repository di funzioni (Function Repository) Wolfram è ciò che è diventato possibile grazie all'unicità del Wolfram Language non solo come linguaggio di programmazione, ma anche come linguaggio computazionale completo. Nei linguaggi di programmazione tradizionali, l'aggiunta di funzionalità significative richiede spesso la creazione di intere nuove librerie che possono funzionare o meno in modo integrato. Tuttavia, nel linguaggio Wolfram Language c'è già così tanto integrato nel linguaggio stesso, che esiste la possibilità di ampliare notevolmente la sua funzionalità semplicemente aggiungendo nuove funzioni, che si integrano immediatamente nella struttura complessiva del linguaggio.

Ad esempio, nel repository delle funzioni di Wolfram ci sono già 532 nuove funzioni strutturate in 26 categorie tematiche:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Analogamente a più di 6000 funzioni standard, integrate nel linguaggio Wolfram, ogni funzione del repository ha una pagina di documentazione con dettagli e esempi di funzionamento:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Per accedere alla pagina, copia l'oggetto sopra (BLOB funzionale), incollalo nella stringa di input e poi esegui la funzione: è già integrata nel linguaggio Wolfram e supportata di default, a partire da versione 12.0:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

È importante notare che durante l'elaborazione LogoQRCode Non è necessario, ad esempio, configurare una "libreria per l'elaborazione delle immagini" — poiché nel linguaggio Wolfram Language abbiamo già implementato un metodo sequenziale e rigorosamente algoritmico. elaborazione delle immagini, che possono essere elaborate immediatamente da varie funzioni grafiche del linguaggio:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Spero che, con il supporto di una comunità meravigliosa e talentuosa, che cresce e si espande (sulla base del linguaggio Wolfram Language) da diversi decenni. Il repository delle funzioni di Wolfram permetterà in un futuro prossimo di ampliare significativamente la gamma (potenzialmente notevole, specializzata in vari ambiti della scienza e della tecnologia) delle funzioni disponibili nel linguaggio. In questo modo, sarà possibile utilizzare sia il contenuto del linguaggio (le sue funzioni integrate), sia i principi di sviluppo, che sono realizzati sulla base del linguaggio. (Va notato che il Wolfram Language ha già oltre 30 anni di storia di sviluppo e crescita stabile.).
All'interno delle funzioni del repository possono trovarsi frammenti di codice, da piccoli a piuttosto consistenti, scritti in Wolfram Language. Ad esempio, possono esserci chiamate a API e servizi esterni o a librerie esterne scritte in altri linguaggi.Una particolarità unica di questo approccio è che, quando si accede alla funzionalità a livello utente, non ci saranno incompatibilità poiché questo metodo si basa su una struttura coerente del linguaggio Wolfram Language — e ogni funzione funzionerà automaticamente correttamente, proprio come dovrebbe.
La shell e la struttura software del repository delle funzioni Wolfram sono impostate in modo che chiunque possa contribuire al progetto nel modo più semplice e conveniente per lui — in sostanza, basta riempire un file di testo di un notebook (con estensione nb) WL.. Le funzioni automatiche integrate consentono di verificare l'integrazione garantita delle nuove funzionalità aggiunte al repository nel linguaggio. La nostra azienda punta a un vasto pubblico di utenti che possono integrare le proprie funzioni nel linguaggio, piuttosto che su complessità significative delle nuove funzionalità — e sebbene qui sia implementato un processo di verifica, non insistiamo su nulla di simile a un'analisi approfondita della struttura o a rigidi standard di completezza e affidabilità delle nuove funzioni degli utenti, a differenza delle verifiche più dettagliate delle funzioni integrate nel nucleo del linguaggio che noi applichiamo.

In questo approccio ci sono numerosi compromessi e dettagli, ma il nostro obiettivo è ottimizzare il repository delle funzioni Wolfram sia per la comodità degli utenti sia affinché le nuove funzioni degli utenti contribuiscano in modo significativo allo sviluppo del linguaggio. Con la crescita, non ho dubbio che dovremo inventare nuovi metodi per gestire e verificare le funzioni integrate nel repository, e questo non è l'ultimo motivo per cui organizzare un gran numero di funzioni e trovare quelle di cui hanno bisogno gli utenti. Tuttavia, non può che essere incoraggiante che la strada che abbiamo scelto sia un buon inizio. Io stesso ho aggiunto alcune funzioni alla base iniziale. Molte di esse si basano su codice che ho personalmente sviluppato per un periodo piuttosto lungo. E ho impiegato solo pochi minuti per trasferirle nel repository. Ora, dato che sono nel repository, posso finalmente utilizzare queste funzioni immediatamente e in qualsiasi momento, senza preoccuparmi di cercare file, caricare pacchetti e simili.

Migliorare l'efficienza riducendo i costi

Anche prima dell'avvento di Internet, esistevano modi per scambiare codice Wolfram Language (il nostro primo grande progetto centralizzato è stato MathSource, creato per Mathematica nel 1991 su CD-ROM e altro). Certamente, l'approccio proposto basato sul repository delle funzioni Wolfram è uno strumento più potente e affidabile per affrontare le attività sopra menzionate.

Da oltre 30 anni, la nostra azienda lavora instancabilmente per mantenere l'integrità della struttura del linguaggio Wolfram, e questo è fondamentale affinché il linguaggio Wolfram non diventi semplicemente un linguaggio di programmazione, ma un vero linguaggio computazionale. Così, l'essenza dell'approccio all'implementazione del repository delle funzioni Wolfram è l'utilizzo di un'unica metodologia per la programmazione e lo sviluppo di nuove funzioni, che vengono aggiunte in modo coerente e integrate nel linguaggio per consentire la sua evoluzione e crescita collaborativa.

Nella strutturazione dell'implementazione di ciascuna funzione avvengono vari processi computazionali. È importante sottolineare che, per l'utente, la funzione deve avere un aspetto chiaro e uniforme, oltre a una leggibilità evidente. In questo contesto, le funzioni integrate del linguaggio Wolfram Language sono presentate attraverso oltre 6000 esempi sequenziali su come programmare correttamente le funzioni (questi sono i nostri video recensioni sulla programmazione in diretta, che comprendono centinaia di ore di creazione di programmi standard). Questo approccio consente infine di rendere il repository delle funzioni Wolfram performante, grazie alla natura strutturale del linguaggio Wolfram Language, che offre un'ampia varietà di librerie aggiuntive già integrate nel linguaggio. Ad esempio, se hai una funzione che elabora immagini, o matrici sparse, o strutture molecolari, così come dati geografici o altri elementi — nel linguaggio esiste già una rappresentazione simbolica coerente, e questo rende subito la tua funzione compatibile con altre funzioni del linguaggio.

Creare un repository che funzioni davvero bene è un'interessante sfida di meta-programmazione. Ad esempio, un eccesso di vincoli nel programma non consentirà di ottenere la necessaria unificazione e versatilità nell'operare dell'algoritmo. Allo stesso modo, con un numero insufficiente di vincoli funzionali non sarà possibile implementare una sequenza di esecuzione sufficientemente corretta dell'algoritmo. Alcuni dei precedenti esempi di compromesso tra questi approcci, realizzati dalla nostra azienda, hanno funzionato in modo abbastanza stabile: Progetto Wolfram Dimostrazioni, lanciato nel 2007 e ora operativo in modalità interattiva su Internet, contenente oltre 12000 dimostrazioni interattive per gli utenti. Nella base di dati Wolfram ci sono più di 600 database pronti all'uso, che possono essere utilizzati nel linguaggio Wolfram Language, e il deposito delle reti neurali Wolfram viene aggiornato con nuove reti neurali praticamente ogni settimana (attualmente ce ne sono già 118) e vengono subito collegate tramite la funzione NetModel nel linguaggio Wolfram Language.

Tutti gli esempi sopra elencati hanno una caratteristica fondamentale: gli oggetti e le funzioni che vengono raccolti nel progetto presentano un alto grado di strutturazione e distribuzione dei processi. È indubbio che la dettagliata struttura di ciò che rappresenta una dimostrazione, una rete neurale o altro, possa variare notevolmente, ma la struttura fondamentale per qualsiasi repository attuale rimane invariata. Qual è, dunque, la vostra opinione, caro utente, riguardo alla creazione di un repository che aggiunge estensioni al linguaggio Wolfram? Il linguaggio Wolfram è progettato per essere estremamente flessibile, quindi può essere espanso e modificato in qualsiasi modo. Questa circostanza è di fondamentale importanza per la possibilità di sviluppare rapidamente diversi progetti software su larga scala utilizzando il linguaggio Wolfram. È opportuno notare che con l'aumentare della flessibilità del linguaggio, inevitabilmente cresce anche il costo dei progetti realizzati con esso. Questo accade perché più un utente utilizza tale linguaggio, maggiore è la funzionalità riservata che riceve; tuttavia, non bisogna dimenticare che questo approccio può avere anche aspetti negativi riguardo all'impossibilità di garantire la coerenza dei moduli software.

Nei linguaggi di programmazione tradizionali esiste un problema diffuso con le librerie: se, ad esempio, utilizzi una sola libreria, il codice funziona correttamente, ma se provi a utilizzare più librerie, non c'è alcuna garanzia che interagiranno correttamente tra loro. Inoltre, nei linguaggi di programmazione tradizionali — a differenza di un linguaggio di calcolo completo — non ci sono possibilità di controllare garantitamente la presenza di rappresentazioni incorporate coerenti per qualsiasi funzione o tipo di dato, al di là delle loro strutture di base. Ma, in effetti, il problema è ancora più grande di quanto appaia a prima vista: se qualcuno sta costruendo una verticalità di funzionalità su larga scala, senza un enorme investimento nella programmazione centralizzata del progetto, come abbiamo fatto con il linguaggio Wolfram, è impossibile raggiungere coerenza. Pertanto, è fondamentale che tutti i moduli software funzionino sempre correttamente insieme.

In questo modo, l'idea del repository delle funzioni di Wolfram è di evitare il problema precedentemente menzionato, semplicemente aggiungendo estensioni al linguaggio sotto forma di elementi di codice relativamente piccoli tramite singole funzioni, la cui progettazione come moduli coerenti risulta essere un compito più semplice. Tuttavia, ci sono peculiarità della programmazione che non possono essere maneggiate comodamente tramite singole funzioni (e la nostra azienda intende lanciare a breve un algoritmo software ottimizzato per assistere nell'implementazione di pacchetti software su larga scala). Tuttavia, basandosi sulle funzioni già integrate nel linguaggio Wolfram Language, ci sono molte possibilità di programmazione rese possibili tramite singole funzioni. L'idea è che, con uno sforzo di programmazione relativamente contenuto, sia possibile creare una serie di nuove e molto utili funzioni, che garantiscano una sufficiente coerenza del progetto, mantenendo al contempo una buona sinergia tra di loro, e che siano facilmente e ampiamente utilizzabili nel linguaggio in futuro.

Questo approccio è sicuramente un compromesso. Se si realizza un pacchetto più ampio, si può immaginare un mondo completamente nuovo di funzionalità che sarà estremamente potente e utile. Se c'è la necessità di ottenere nuove funzionalità che si integrino con tutto il resto, ma non si è pronti a dedicare enormi sforzi allo sviluppo del progetto, purtroppo questo potrebbe ridurre le dimensioni del progetto stesso. L'idea del repository di funzioni di Wolfram è quella di fornire funzionalità che definiscano una parte fondamentale del progetto; questo approccio permetterà di aggiungere funzionalità potenti, semplificando al contempo il mantenimento di una buona coerenza nel progetto di programmazione.

Assistenza nell'aggiunta di funzioni personalizzate al repository delle funzioni

I nostri esperti hanno lavorato duramente per rendere il contributo alle funzioni del repository di Wolfram abbastanza semplice per gli utenti. Sul desktop (già in versione 12.0), è possibile semplicemente seguire le schede del menu principale: File > Nuovo > RepositoryItem > Funzione Repository Item e si otterrà ‘Definizione Notebook» (programmaticamente all'interno dell'ambiente di lavoro. Puoi anche utilizzare la funzione analoga — CreaNotebook[«FunctionResource»]):

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Ci sono due azioni principali che dovrai compiere: innanzitutto, scrivere effettivamente il codice della tua funzione e, in secondo luogo, redigere la documentazione che illustra come dovrebbe funzionare la tua funzione.
Fai clic sul pulsante «Apri esempio» in cima per vedere un esempio di ciò che devi fare:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

In effetti, stai cercando di creare qualcosa di simile a una funzione incorporata nel linguaggio Wolfram Language. A differenza del fatto che può fare qualcosa di molto più specifico rispetto a una funzione incorporata. Anche le aspettative riguardo alla sua completezza e affidabilità saranno molto più basse.
Devi dare un nome alla tua funzione che sia conforme ai principi di denominazione delle funzioni del Wolfram Language. Inoltre, avrai bisogno di sviluppare la documentazione per la tua funzione, simile a quella delle funzioni incorporate nel linguaggio. Ne parlerò più dettagliatamente più avanti. Adesso, presta solo attenzione al fatto che nella fila di pulsanti nella parte superiore del file del blocco definizioni c'è un pulsante «Raccomandazioni di stile», in cui viene spiegato cosa fare, e il pulsante "Strumenti" che fornisce gli strumenti per formattare la documentazione della tua funzione.
Quando sei sicuro che tutto sia compilato correttamente e sei pronto, premi il pulsante "Controlla". È del tutto normale non aver ancora compreso tutti i dettagli. Pertanto, la funzione "Controlla" verrà eseguita automaticamente e farà molte verifiche di stile e coerenza. Spesso ti chiederà immediatamente di confermare e accettare correzioni (ad esempio: "Questa riga dovrebbe finire con due punti", e ti suggerirà di inserire i due punti). A volte ti chiederà di aggiungere o modificare qualcosa da solo. Continueremo ad aggiungere nuove funzionalità alla funzionalità automatica del pulsante "Controlla", ma il suo obiettivo principale è garantire che tutto ciò che invii nel repository delle funzioni corrisponda già al maggior numero possibile di raccomandazioni di stile.

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Dopo aver avviato "Check", puoi usare "Preview". "Preview" crea un'anteprima della pagina della documentazione che hai definito per la tua funzione. Puoi anche creare un'anteprima per un file salvato sul tuo computer o su un servizio di cloud storage. Se per qualche motivo non ti soddisfa ciò che vedi nell'anteprima, puoi semplicemente tornare indietro e apportare le modifiche necessarie, quindi cliccare di nuovo sul pulsante Preview.
Ora sei pronto a pubblicare la tua funzione nel repository. Il pulsante Deploy ti offre quattro opzioni di azione:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

In questo passaggio, è importante notare che puoi inviare la tua funzione nel repository delle funzioni di Wolfram, affinché sia accessibile a qualsiasi utente. Inoltre, puoi anche limitare l'accesso alla tua funzione a un numero specifico di utenti. Ad esempio, puoi creare una funzione che sia ospitata localmente sul tuo computer, in modo che sia disponibile solo quando utilizzi quel computer specifico. Oppure puoi pubblicarla nel tuo account cloud, in modo che sia accessibile quando si è connessi al cloud. Puoi anche pubblicare (distribuire) pubblicamente la funzione tramite il tuo account cloud. Tuttavia, non sarà presente nel repository centrale delle funzioni di Wolfram, ma potrai fornire a qualcuno un URL che consenta di accedere alla tua funzione dal tuo account. (In futuro supporteremo anche repository centrali su scala aziendale).

Quindi, supponiamo che tu voglia effettivamente inviare la tua funzione al knowledge base delle funzioni di Wolfram. Per fare ciò, premi il pulsante "Invia" nel repository. Cosa succede in quel momento? La tua richiesta viene immediatamente inserita in coda per la revisione e l'approvazione da parte del nostro team speciale di curatori.

Mentre la tua richiesta attraversa il processo di approvazione (che di solito richiede alcuni giorni), riceverai comunicazioni sullo stato della sua revisione, oltre a possibili suggerimenti per l'utilizzo futuro. Ma non appena la tua funzione verrà approvata, sarà immediatamente pubblicata nel repository delle funzioni di Wolfram e diventerà disponibile per l'uso generale. (E questo verrà visualizzato in digest di notizie sulle nuove funzioni ecc.)

Cosa deve esserci nel repository?

Va notato che nella nostra azienda abbiamo standard molto elevati di completezza, affidabilità e qualità generale; delle oltre 6000 funzioni che abbiamo già integrato nel linguaggio Wolfram negli ultimi 30 anni, tutte soddisfano i requisiti sopra menzionati. L'obiettivo del repository delle funzioni di Wolfram è quello di utilizzare tutta la struttura e le funzionalità già esistenti nel linguaggio Wolfram Language, per aggiungere il maggior numero possibile di funzioni molto più leggere (cioè funzioni con prestazioni superiori).

Senza dubbio, le funzioni nel repository delle funzioni di Wolfram devono aderire ai principi di sviluppo del linguaggio Wolfram Language, affinché possano interagire pienamente con altre funzioni e soddisfare le aspettative degli utenti su come le funzioni debbano comportarsi correttamente. Tuttavia, le funzioni non devono necessariamente avere la stessa completezza o affidabilità.

Nelle funzioni incorporate del linguaggio Wolfram, ci impegniamo a rendere le funzioni programmatiche il più generiche possibile. Detto ciò, non c'è nulla di sbagliato se nel repository delle funzioni di Wolfram appare una funzione che affronta un caso molto specifico ma utile. Ad esempio, la funzione SendMailFromNotebook può ricevere file in un determinato formato e creare email in un modo specifico. PolygonalDiagram crea diagrammi solo con colori e marcature specifiche, ecc.

Un altro aspetto relativo alle funzioni integrate è che la nostra azienda si impegna a gestire tutti i casi atipici, per elaborare correttamente gli input non validi e così via. In un repository di funzioni, è del tutto normale che esista una funzione specializzata che gestisce i casi principali della soluzione e ignora tutti gli altri.

È evidente che è meglio avere funzioni che fanno di più e lo fanno meglio, ma l’ottimizzazione per un repository di funzioni — a differenza delle funzioni integrate del linguaggio Wolfram — dovrebbe avere più funzioni collegate a un maggior numero di funzioni, piuttosto che approfondire i processi di implementazione di ciascuna funzione specifica.

Ora vediamo un esempio di test delle funzioni in un repository. Le aspettative di coerenza per tali funzioni sono naturalmente molto più basse rispetto a quelle per le funzioni integrate del linguaggio. Questo è particolarmente valido nei casi in cui le funzioni dipendono da risorse esterne, come le API; è importante condurre test coerenti in modo continuativo, cosa che avviene automaticamente all'interno degli algoritmi di verifica. Nel file nb puoi specificare chiaramente le definizioni (nella sezione 'Informazioni aggiuntive') e impostare quanti più test desideri, definiti sia da righe di input e output, sia da oggetti simbolici completi VerificationTest, secondo ciò che ritieni opportuno. Inoltre, il sistema cerca costantemente di trasformare gli esempi di documentazione forniti in un processo di verifica (a volte questo può risultare piuttosto oneroso in termini di risorse, ad esempio per una funzione il cui risultato dipende da numeri casuali o dall'ora del giorno).

Alla fine, nel repository delle funzioni si presenteranno una serie di complessità nella loro implementazione. Alcune richiederanno solo una riga di codice, mentre altre potrebbero includere migliaia o decine di migliaia di righe, probabilmente utilizzando molte funzioni ausiliarie. In quali casi ha senso aggiungere una funzione che può essere definita con pochissimo codice? Fondamentalmente, se per la funzione esiste un buon nome mnemonico, che gli utenti comprenderebbero facilmente vedendolo nel codice, allora può già essere aggiunta. Altrimenti, è probabile che sia meglio semplicemente riscrivere il codice ogni volta che è necessario utilizzarlo nel tuo programma.

L'obiettivo principale del repository delle funzioni (come suggerisce il nome) è introdurre nuove funzioni nel linguaggio. Se desideri aggiungere nuovi dati o nuove entità, utilizza il repository Wolfram Data. Ma cosa fare se vuoi introdurre nuovi tipi di oggetti per i tuoi calcoli?

In realtà ci sono due modi. Potresti voler introdurre un nuovo tipo di oggetto che verrà utilizzato in nuove funzioni nel repository delle funzioni. In tal caso, puoi semplicemente registrare la sua rappresentazione simbolica e usarla per l'ingresso o l'uscita delle funzioni nel repository delle funzioni.

Ma cosa fare se desideri rappresentare un oggetto e poi definirlo attraverso le funzioni esistenti nel linguaggio Wolfram che devono lavorare insieme ad esso? A questo proposito, il linguaggio Wolfram ha sempre avuto un meccanismo semplice chiamato UpValues. Con alcune limitazioni (soprattutto per le funzioni che non possono valutare i loro argomenti), il repository delle funzioni consente di presentare facilmente una funzione e di definire i valori per essa. (Per aumentare le aspettative di coerenza nella creazione di una nuova costruzione importante, completamente integrata in tutto il linguaggio Wolfram Language, questa è solitamente una procedura molto importante che non può essere raggiunta solo aumentando i costi del progetto e ciò che la nostra azienda fa nell'ambito di progetti a lungo termine per lo sviluppo del linguaggio, tale obiettivo non è quello che si persegue nello sviluppo del repository).

Quindi, cosa può contenere il codice delle funzioni nel repository delle funzioni? Tutto ciò che è integrato nel linguaggio Wolfram Language, ovviamente (a meno che non presenti minacce per per la sicurezza e la funzionalità del programma stesso, come ambiente di calcolo) così come ogni funzione del repository delle funzioni. Inoltre, ci sono altre possibilità di funzionamento: una funzione nel repository delle funzioni può chiamare API, oppure in Wolfram Cloud, oppure da un'altra fonte. Certo, ci sono alcuni rischi associati a questo. Poiché non ci sono garanzie che l'API non cambi e che la funzione nel repository delle funzioni smetta di funzionare. Per identificare tali problemi, è presente una nota nella pagina della documentazione (nella sezione “Requisiti”) per qualsiasi funzione che si basa non solo sulle funzionalità integrate del Wolfram Language. (Naturalmente, quando si tratta di dati reali, possono esserci problemi anche con tali funzionalità, poiché i dati reali sul mondo cambiano costantemente e a volte anche definizioni e strutture vengono modificate.)

Tutto il codice per il repository delle funzioni Wolfram deve essere scritto nel linguaggio Wolfram? Certamente, il codice all'interno di un'API esterna non deve essere scritto nel linguaggio Wolfram, che di fatto non rappresenta nemmeno il codice del linguaggio. Infatti, se trovi una funzione in quasi qualsiasi linguaggio o libreria esterna, puoi creare un'interfaccia che ne consenta l'utilizzo nel repository delle funzioni Wolfram. (Di solito, per questo si dovrebbero utilizzare le funzioni integrate) ExternalEvaluate o ExternalFunction nel codice del linguaggio Wolfram.)

Qual è quindi il senso di fare questo? In effetti, questo consente di utilizzare l'intero sistema integrato Wolfram Language e il suo set di funzioni software unificato. Se si ottiene un'implementazione di base da una libreria esterna o da un linguaggio, allora si può utilizzare la ricca struttura simbolica del linguaggio Wolfram Language per creare una comoda funzione di alto livello che consente agli utenti di utilizzare facilmente qualsiasi funzionalità già implementata. Almeno, questo dovrebbe essere realizzabile in un mondo ideale, dove esistono tutti gli elementi necessari per il caricamento delle librerie e così via; in questo caso, verranno risolti automaticamente tramite Wolfram Language. (Si noti che in pratica potrebbero sorgere problemi con la configurazione di linguaggi esterni su sistemi informatici specifici e potrebbero sorgere ulteriori problemi di sicurezza nello storage cloud).

Quando analizzate per la prima volta le librerie esterne standard, possono sembrare troppo complesse da gestire con sole poche funzioni. Tuttavia, spesso gran parte della complessità deriva dalla creazione dell'infrastruttura necessaria per la libreria e dalle varie funzioni di supporto. Con il linguaggio Wolfram, l'infrastruttura è generalmente già inclusa nei pacchetti, quindi non è necessario svelare in dettaglio tutte queste funzioni di supporto. È sufficiente creare funzioni per alcune delle principali funzioni orientate all'applicazione nella libreria.

«Ecosistema» della base di conoscenza

Se hai scritto funzioni che usi frequentemente, inviale al repository delle funzioni di Wolfram! Anche se da questo non dovesse risultare un prodotto più grande (uno sviluppo del linguaggio), sarà comunque molto più comodo utilizzare le funzioni per uso personale. Tuttavia, è ragionevole supporre che se tu utilizzi costantemente queste funzioni, anche altri utenti potrebbero trovarle utili.

È naturale che ti possa capitare di trovarti in una situazione in cui non puoi — o non vuoi — condividere le tue funzioni o, nel caso di accesso a risorse informative private. Anche in questi casi, puoi semplicemente implementare le funzioni nel tuo account cloud personale, specificando i diritti di accesso a esse. (Se nella tua organizzazione esiste un cloud privato Wolfram Enterprise, presto potrà ospitare un proprio repository privato di funzioni, che può essere amministrato dalla tua organizzazione e impostare se visualizzare o meno le visualizzazioni per gli utenti esterni.)

Le funzioni che invii al repository delle funzioni Wolfram non devono essere perfette; devono semplicemente essere utili. È un po' come la sezione "Errori" nella classica documentazione Unix: nella "Sezione delle definizioni" c'è una parte chiamata "Note dell'autore" in cui puoi descrivere le limitazioni, i problemi, ecc. che già conosci della tua funzione. Inoltre, quando invii la tua funzione al repository, puoi aggiungere note all'invio, che saranno lette da un'apposita squadra di curatori.

Dopo la pubblicazione della funzione, la sua pagina avrà sempre due link in fondo: "Segnala un problema con questa funzione» e «Discuti nella comunità Wolfram". Se alleghi un'etichetta (ad esempio, segnalami eventuali errori), puoi attivare una casella che indica che desideri che il tuo messaggio e le informazioni di contatto siano trasmessi all'autore della funzione.

A volte è necessario utilizzare semplicemente le funzioni del repository delle funzioni di Wolfram, come le funzioni incorporate, senza esaminare il loro codice. Tuttavia, se desideri "guardare dentro", nella parte superiore c'è sempre un pulsante "Quaderno". Premi su di esso e avrai una copia personale del quaderno originale della definizione che è stata inviata al repository delle funzioni. A volte puoi semplicemente usarlo come esempio per le tue esigenze. Inoltre, puoi sviluppare la tua personale modifica di questa funzione. Potresti voler collocare queste funzioni che hai trovato dal repository sul tuo computer o nel tuo account nel tuo spazio di archiviazione cloud, oppure potresti volerle inviare nel database delle funzioni, magari come versione migliorata e arricchita della funzione originale.

In futuro prevediamo di supportare il branching in stile Git per i repository delle funzionalità, ma attualmente stiamo cercando di semplificare il processo, mantenendo sempre una sola versione ufficiale di ciascuna funzione integrata nel linguaggio. Nella maggior parte dei casi (se gli sviluppatori non si disimpegnano dal mantenere le funzionalità sviluppate e rispondere ai feedback degli utenti), l'autore originale della funzione ottiene il controllo sugli aggiornamenti e invia nuove versioni che vengono quindi esaminate e, se superano il processo di revisione, pubblicate nel linguaggio.

Consideriamo il tema di come funziona la «versioning» delle funzionalità sviluppate. Proprio ora, quando utilizzi una funzione dal repository delle funzionalità, la sua definizione sarà costantemente memorizzata sul tuo computer (o nel tuo account cloud, se utilizzi il cloud). Se viene rilasciata una nuova versione della funzione, alla prossima invocazione riceverai un messaggio che ti avvisa di ciò. E se desideri aggiornare la funzione all'ultima versione, puoi farlo utilizzando il comando ResourceUpdate. (Il «BLOB funzionale» in realtà memorizza più informazioni sulle versioni e in futuro prevediamo di renderlo più accessibile ai nostri utenti.)

Una delle eccezionali caratteristiche del repository di funzioni di Wolfram è che qualsiasi programma in Wolfram Language può utilizzare le funzioni da esso. Quando un programma appare in un notebook, è spesso utile formattare le funzioni del repository come «oggetti binari funzionali» facilmente leggibili (possibilmente con un set di versioni corrispondente).

Puoi sempre accedere a qualsiasi funzione del repository di funzioni utilizzando il testo ResourceFunction []. Ed è molto comodo se stai scrivendo codice o script direttamente per il Wolfram Engine, ad esempio con l'IDE o l'editor di codice (è importante notare che il repository di funzioni è completamente compatibile con Free Wolfram Engine per sviluppatori).

Come funziona?

All'interno delle funzioni nel repository di Wolfram, questo è possibile utilizzando lo stesso sistema di risorse database, come in tutti gli altri nostri repository esistenti (archivio dati, Neural Net Repository, collezione di progetti dimostrativi e così via), come tutte le altre risorse di sistema di Wolfram, FunzioneRisorsa in ultima analisi si basa sulla funzione OggettoRisorsa.

Consideriamo FunzioneRisorsa:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

All'interno puoi vedere alcune informazioni utilizzando la funzione Informazioni:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Come funziona la configurazione della funzione risorsa? Il caso più semplice è quello puramente locale. Ecco un esempio che prende una funzione (in questo caso, semplicemente una funzione pura) e la definisce come funzione risorsa per la sessione corrente del programma:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Dopo aver effettuato la definizione, puoi utilizzare la funzione risorsa:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Nota che in questo oggetto BLOB della funzione c'è l'icona nera Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram. Questo significa che la funzione BLOB si riferisce a una funzione risorsa in memoria, definita per la sessione corrente. Per la funzione risorsa che è permanentemente memorizzata sul tuo computer o nel tuo account cloud, c'è un'icona grigia Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram. E per la funzione risorsa ufficiale nel repository delle funzioni di Wolfram c'è un'icona arancione Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram.

Quindi, cosa succede quando usi il menu 'Distribuzione' nel notebook di definizione? Prima di tutto, prende tutte le definizioni nel notebook e da esse crea un simbolo OggettoRisorsa). (Se stai utilizzando un IDE testuale o un programma, puoi anche creare esplicitamente OggettoRisorsa)

Il deployment locale della funzione dal repository sul tuo computer viene eseguito con il comando LocalCache per l'oggetto risorsa, per salvarlo come LocalObject nel tuo file system. Il deployment nell'account cloud viene eseguito con il comando CloudDeploy per l'oggetto risorsa, mentre il deployment pubblico nel cloud è CloudPublish. In tutti i casi, ResourceRegister viene utilizzato anche per registrare il nome della funzione della risorsa, in modo che ResourceFunction[«name»] funzioni.

Se premi il pulsante Submit per il Function Repository, quello che succede sotto di esso ResourceSubmit viene chiamato sull'oggetto risorsa. (E se utilizzi un'interfaccia testuale, puoi anche chiamare ResourceSubmit direttamente.)

Per impostazione predefinita, l'invio viene effettuato con il nome associato al tuo identificativo Wolfram ID. Ma se invii una richiesta a nome di un gruppo di sviluppatori o di un'organizzazione, puoi impostare un identificativo editore separato e usarlo come nome per interagire con le tue visualizzazioni.

Dopo aver inviato una delle tue funzioni nel database delle funzioni, entrerà in coda per la revisione. Se ricevi commenti in risposta, di solito verranno in un file di testo con delle «celle di commento» aggiuntive. Puoi sempre controllare lo stato della tua richiesta accedendo al portale dei partecipanti al sistema delle risorse. Ma una volta che la tua funzione è approvata, riceverai una notifica (via email) e la tua funzione sarà pubblicata nel repository delle funzioni di Wolfram.

Alcuni dettagli sul funzionamento

A prima vista, potrebbe sembrare che sia sufficiente prendere il notebook di definizione e copiarlo letteralmente nel repository delle funzioni, tuttavia, in realtà ci sono molte sfumature — e per affrontarle è necessario eseguire una programmazione meta piuttosto complessa, elaborando simbolicamente sia il codice che definisce la funzione sia il Notebook di definizione stesso. Gran parte di questo avviene internamente, quindi «dietro le quinte», ma ciò può avere alcune implicazioni che è utile comprendere se intendi contribuire al database delle funzioni.

La prima sottigliezza diretta: Quando compilate il "Quaderno delle definizioni", potete semplicemente fare riferimento alla vostra funzione ovunque, utilizzando un nome simile a MyFunction, che appare come un nome qualsiasi per una funzione nel linguaggio Wolfram Language, ma per la documentazione del repository delle funzioni, questo viene sostituito da ResourceFunction["MyFunction"] – è esattamente quello che gli utenti utilizzeranno effettivamente quando lavorano con la funzione.

La seconda sottigliezza: quando create una funzione di risorsa dal Quaderno delle definizioni, tutte le dipendenze coinvolte nella definizione della funzione devono essere fissate ed esplicitamente incluse. Tuttavia, per garantire che le definizioni rimangano modulari, è necessario collocare tutto in uno spazio dei nomi. (Ovviamente, che le funzioni che fanno tutto questo, si trovano nel repository delle funzioni.)

Di solito, non vedrai mai alcuna traccia del codice utilizzato per configurare questo namespace. Ma se per qualche motivo chiami un simbolo non riuscito all'interno della tua funzione, vedrai che questo simbolo si trova nel contesto interno della funzione. Tuttavia, durante l'elaborazione del Blocco Note delle definizioni, almeno il simbolo corrispondente alla funzione stessa deve essere presente. è configurato per la migliore visualizzazione come un BLOB funzionale e non come un simbolo grezzo nel contesto interno.

Il repository delle funzioni è progettato per definire nuove funzioni. E queste funzioni possono avere opzioni. Spesso, questi parametri (ad esempio, Metodo o DimensioneImmagine) saranno utilizzabili per le funzioni incorporate, così come per quelle per le quali esistono già simboli predefiniti. Tuttavia, a volte una nuova funzione potrebbe richiedere nuove opzioni. Per mantenere la modularità, è necessario che queste opzioni siano simboli definiti in un contesto interno unico (o qualcosa di simile a intere funzioni di risorsa, cioè che siano etichettate autonomamente). Per semplificare, il repository delle funzioni consente di definire nuove opzioni nelle definizioni come stringhe. E per convenienza dell'utente, queste definizioni (a condizione che siano state utilizzate OptionValue e OptionsPattern) vengono anche elaborate in modo tale che quando si utilizzano le funzioni, i parametri possono essere definiti non solo come stringhe, ma anche come simboli globali con gli stessi nomi.

La maggior parte delle funzioni fa semplicemente ciò che deve fare ogni volta che vengono chiamate, ma alcune funzioni necessitano di inizializzazione prima di poter operare in una sessione specifica — e per affrontare questo problema, nella sezione 'Definizione' c'è una sezione 'Inizializzazione'.

Le funzioni nel repository possono utilizzare altre funzioni già presenti nel repository. Per impostare le definizioni per un repository di funzioni, è necessario espandere due (o più) funzioni che si riferiscono l'una all'altra nella propria sessione di lavoro con il programma, in modo da poterle richiamare come ResourceFunction[«name»], quindi puoi creare le combinazioni di funzioni di cui hai bisogno e aggiungere una nuova funzione nel repository basata su quelle già esistenti.

Prospettive di sviluppo. Cosa deve accadere quando il repository diventa davvero grande?

Oggi stiamo solo avviando il repository delle funzioni Wolfram, ma nel tempo ci aspettiamo che il suo volume e la sua funzionalità possano crescere drasticamente e, man mano che cresce, emergeranno varie problematiche che prevediamo possano sorgere.

Il primo problema riguarda i nomi delle funzioni e la loro unicità. Il repository delle funzioni è progettato in modo tale che, come per le funzioni integrate nel linguaggio Wolfram Language, si possa fare riferimento a qualsiasi funzione semplicemente indicando il suo nome. Ma questo implica inevitabilmente che i nomi delle funzioni debbano essere globalmente unici all'interno del repository, quindi, ad esempio, nel repository può esserci solo una ResourceFunction[«MyFavoriteFunction»].

A prima vista, questo potrebbe sembrare un grande problema, ma bisogna capire che è fondamentalmente lo stesso problema che si verifica per cose come i domini internet o i segnaposto sui social media. E il fatto è che nel sistema è semplicemente necessario avere un registratore — e questo è uno dei ruoli che la nostra azienda svolgerà per la base di conoscenza delle funzioni Wolfram. (Per le versioni private del repository, i registratori potrebbero essere gli amministratori.) Certamente, un dominio internet può essere registrato senza avere nulla su di esso, ma nel repository delle funzioni un nome di funzione può essere registrato solo in presenza di una definizione di funzione effettiva.

Parte del nostro ruolo nella gestione della knowledge base delle funzioni di Wolfram è garantire che il nome scelto per una funzione sia logico in base alla definizione della funzione, e che aderisca agli standard di denominazione del Wolfram Language. Abbiamo oltre 30 anni di esperienza nella denominazione delle funzioni incorporate nel Wolfram Language, e il nostro team di curatori porterà questa esperienza nel repository delle funzioni. Ci sono sempre eccezioni, naturalmente. Ad esempio, potrebbe sembrare preferibile avere un nome corto per una data funzione, ma è meglio "difendersi" con un nome più lungo e specifico, poiché questo riduce le possibilità che qualcuno voglia creare un nome di funzione simile in futuro.

(È importante notare che l'aggiunta semplice di un tag per il partecipante per eliminare l'ambiguità delle funzioni non porterà all'effetto desiderato. Infatti, se non si insiste affinché venga sempre assegnato un tag, sarà necessario definire un tag di default per ogni funzione specifica e anche evidenziare i tag dell'autore, il che richiederà nuovamente una coordinazione globale.)

Con l'aumento del volume della base di conoscenza delle funzioni di Wolfram, uno dei problemi che sicuramente si presenterà è la reperibilità delle funzioni. A tal fine, il sistema prevede una funzione di ricerca (e i file di definizione possono includere parole chiave, ecc.). Per le funzioni integrate nel linguaggio Wolfram Language, la documentazione include vari riferimenti incrociati che aiutano a "pubblicizzare" le funzioni. Le funzioni nel repository delle funzioni possono fare riferimento a funzioni integrate. Ma come funziona il contrario? A questo scopo, intendiamo sperimentare diverse strategie per presentare le funzioni del repository sulle pagine di documentazione delle funzioni integrate.

Per le funzioni integrate nel linguaggio Wolfram Language, esiste un cosiddetto livello di reperibilità garantito da una rete di "pagine di aiuto", che forniscono elenchi organizzati di funzioni relative a specifici ambiti. È sempre difficile bilanciare adeguatamente le pagine della guida e, con la crescita del linguaggio Wolfram, le pagine della guida devono spesso essere completamente riorganizzate. È abbastanza semplice collocare le funzioni del repository in ampie categorie e persino suddividerle in categorie più specifiche, ma è molto più prezioso avere pagine della guida del linguaggio ben organizzate. Non è ancora chiaro quale sia il modo migliore per crearle per l'intero database delle funzioni. Ad esempio, CreateResourceObjectGallery nel repository delle funzioni, chiunque può pubblicare una pagina web contenente le proprie “scelte” dal repository:

Wolfram Function Repository: accesso aperto a una piattaforma per estensioni del linguaggio Wolfram

Il repository delle funzioni Wolfram è configurato come uno storage permanente per le funzioni, dove ogni funzione sarà sempre operativa. Sono sicuro che possano emergere nuove versioni delle funzioni e ci aspettiamo che alcune funzioni inevitabilmente diventino obsolete col tempo. Le funzioni funzioneranno se utilizzate nei programmi, ma le pagine della loro documentazione rimanderanno a nuove e più avanzate funzioni.

Il repository delle funzioni Wolfram è progettato per ottenere rapidamente nuove funzioni e per esplorare nuove possibilità di utilizzo del linguaggio Wolfram. Con un'ottima dose di ottimismo, speriamo che parte di ciò che è stato esplorato nel repository delle funzioni possa, alla fine, avere senso diventare parti integrate del linguaggio principale Wolfram Language. Negli ultimi dieci anni abbiamo avuto un set simile di funzioni che sono state inizialmente presentate in Wolfram | Alpha. E una delle lezioni apprese da questa esperienza è che, per raggiungere gli standard di qualità e coerenza su cui ci concentriamo in tutto ciò che è integrato nel linguaggio Wolfram, è necessaria molta più lavoro, che è spesso più complesso rispetto ai primi sforzi per implementare l'idea. Anche in questo caso, una funzione nel database delle funzioni può servire come una prova molto utile del concetto di una futura funzione che potrebbe infine essere integrata nel linguaggio Wolfram.

La cosa più importante è che la funzione nel repository delle funzioni è disponibile per ogni utente da utilizzare immediatamente. È possibile che una funzione integrata del linguaggio possa essere molto migliore e più performante, ma il repository delle funzioni consentirà agli utenti di accedere subito a tutte le nuove funzionalità. E, cosa particolarmente importante, questo concetto permette a chiunque di aggiungere le proprie nuove funzioni.

In passato, l'idea non avrebbe funzionato così bene come ora, ma a questo punto il linguaggio ha già incorporato così tanti sforzi e una comprensione così profonda dei principi di design del linguaggio, che ora appare realistico che una grande comunità di utenti possa aggiungere funzioni che manterranno la coerenza del progetto, rendendole utili per un ampio pubblico.

Nella comunità degli utenti di Wolfram Language c'è uno straordinario spirito di talento. (Naturalmente, questa comunità include molti dei principali esperti nella ricerca e nello sviluppo in diversi campi.) Spero che il repository delle funzioni di Wolfram fornisca una piattaforma efficace per rivelare e diffondere questo spirito di talento. Solo insieme possiamo creare qualcosa che espanda significativamente il campo in cui può essere applicata la paradigma computazionale del linguaggio Wolfram.

Negli oltre 30 anni abbiamo fatto molta strada con il linguaggio Wolfram. Ora, insieme, andiamo oltre. Invito tutti gli utenti stimati del linguaggio Wolfram in tutto il mondo a utilizzare questo repository di funzioni come piattaforma, oltre a un nuovo progetto software come Free Wolfram Engine per sviluppatori.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster