Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Ciao, Habr! Presento alla vostra attenzione una traduzione del post di Stephen Wolfram "Il repository di funzioni Wolfram: lancio di una piattaforma aperta per estendere il linguaggio Wolfram".

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Prerequisiti per la consistenza del linguaggio Wolfram

Oggi siamo sulla soglia di grandi conquiste insieme al linguaggio di programmazione Lingua Wolfram. Appena tre settimane fa abbiamo lanciato motore Wolfram gratuito per sviluppatoriper aiutare i nostri utenti a integrare il linguaggio Wolfram nei loro progetti software su larga scala. Oggi lanciamo Repository delle funzioni Wolfram, al fine di fornire una piattaforma coordinata per le funzioni create per estendere il linguaggio Wolfram, e apriamo anche un repository di funzioni per chiunque possa contribuire allo sviluppo del nostro prodotto software.

Il Wolfram Function Repository è qualcosa reso possibile dalla natura unica del linguaggio Wolfram non solo come linguaggio di programmazione, ma anche come linguaggio linguaggio informatico su vasta scala. Nei linguaggi di programmazione tradizionali, l'aggiunta di nuove funzionalità significative di solito implica la creazione di intere librerie aggiuntive che possono o meno funzionare se utilizzate insieme. Tuttavia, nella lingua Wolfram così tanto è già incorporato nella lingua stessa, che è possibile espandere significativamente le sue funzionalità semplicemente aggiungendo nuove funzioni che vengono immediatamente integrate nella struttura olistica dell'intero linguaggio.

Ad esempio, il repository delle funzioni Wolfram contiene già 532 nuove funzionalità strutturato in 26 categorie tematiche:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Allo stesso modo più di 6000 funzioni standard, costruito nel linguaggio Wolfram, ogni funzione del repository ha una pagina di documentazione con una descrizione dettagliata delle stesse ed esempi di lavoro:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Per accedere alla pagina, copia l'oggetto sopra (funzione BLOB), incollalo nella riga di input e quindi esegui la funzione: è già integrata nel linguaggio Wolfram e supportata per impostazione predefinita a partire da versione 12.0:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Va notato qui che durante l'elaborazione LogoQRCode Non è necessario, ad esempio, impostare una "libreria di elaborazione delle immagini" - poiché abbiamo già implementato un modo coerente e attentamente algoritmico nel linguaggio Wolfram elaborazione delle immagini, che può essere immediatamente elaborato da varie funzioni del linguaggio grafico:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Lo spero con il supporto comunità meravigliosa e talentuosa, che è cresciuto ed espanso (basato sulla lingua Wolfram) negli ultimi decenni. Il repository di funzioni Wolfram consentirà nel prossimo futuro di espandere significativamente la gamma di funzioni (possibilmente potenzialmente significative, specializzate in vari campi della scienza e della tecnologia) disponibili nel linguaggio. Pertanto, diventa possibile utilizzare sia il contenuto della lingua (le sue funzioni integrate) sia principi di sviluppo, che vengono implementati in base alla lingua. (Va notato qui che la lingua Wolfram ha già più di 30 anni di storia di sviluppo e crescita stabile).
Le funzioni del repository possono contenere pezzi di codice piccoli o grandi scritti nel linguaggio Wolfram. Ad esempio, queste potrebbero essere chiamate API e servizi esterni o librerie esterne in altre lingue. La caratteristica unica di questo approccio è che quando si approfondisce la funzionalità a livello utente, non ci saranno potenziali incoerenze perché l'approccio è costruito sulla struttura coerente del linguaggio Wolfram - e ogni funzione funzionerà automaticamente correttamente - esattamente come previsto. Dovrebbe.
La struttura della shell e della programmazione del Wolfram Feature Repository è progettata in modo tale che tutti possano contribuire alla causa comune nel modo più semplice e conveniente per loro - in effetti, solo compilando il file di testo del blocco note (con estensione nb) WL. Le funzioni automatiche integrate consentono di verificare le nuove funzioni aggiunte al repository per garantirne l'integrazione nel linguaggio. La nostra azienda scommette sull'ampia gamma di utenti che possono integrare le loro funzioni nel linguaggio, piuttosto che sulla grande complessità delle nuove funzioni - e sebbene esista un processo di revisione, non insistiamo su nulla di simile scrupolosa analisi progettuale o standard rigorosi per la completezza e l'affidabilità delle nuove funzionalità utente, in contrapposizione ai test più rigorosi delle funzionalità integrate nel linguaggio principale che utilizziamo.

Ci sono molti compromessi e dettagli in questo approccio, ma il nostro obiettivo è ottimizzare il repository di funzionalità Wolfram sia per l'esperienza dell'utente sia per garantire che le nuove funzionalità dell'utente contribuiscano in modo significativo allo sviluppo del linguaggio. Man mano che cresciamo, non ho dubbi che dovremo inventare nuovi metodi per elaborare e convalidare le funzioni integrate nel repository, non ultimo per organizzare un gran numero di funzioni e trovare quelle di cui gli utenti hanno bisogno. Tuttavia, è incoraggiante che il percorso che abbiamo scelto sia un buon inizio. Io personalmente aggiunte diverse funzionalità al database originale. Molti di essi sono basati su codice che ho sviluppato personalmente per diverso tempo. E mi ci sono voluti solo pochi minuti per inserirli nel repository. Ora che sono nel repository, posso finalmente - immediatamente e in qualsiasi momento - utilizzare queste funzioni secondo necessità, senza dovermi preoccupare di cercare file, scaricare pacchetti, ecc.

Aumentare l’efficienza riducendo i costi

Anche prima di Internet, esistevano modi per condividere il codice Wolfram Language (il nostro primo grande progetto centralizzato è stato MathSource, creato per Mathematica nel 1991 sulla base di CD-ROM, ecc.). Naturalmente, l'approccio proposto per l'implementazione basato sul repository di funzioni Wolfram è uno strumento più potente e affidabile per implementare le attività di cui sopra.

Per oltre 30 anni, la nostra azienda ha lavorato diligentemente per mantenere l'integrità della struttura del linguaggio Wolfram, e questo è fondamentale per garantire che il linguaggio Wolfram diventi non solo un linguaggio di programmazione, ma anche un linguaggio informatico completo. Pertanto, l'essenza dell'approccio all'implementazione del repository di funzioni Wolfram è utilizzare un approccio unificato alla programmazione e allo sviluppo di nuove funzioni che vengono aggiunte sequenzialmente e si adattano alla struttura del linguaggio in modo che possa svilupparsi e co-evolversi.

Vari processi computazionali si verificano nella struttura di implementazione di ciascuna funzione. Va notato qui che è necessario che la funzione abbia un aspetto chiaro e uniforme e una leggibilità visiva per l'utente. In questo contesto, le funzioni integrate del linguaggio Wolfram vengono presentate con più di 6000 esempi sequenziali di come programmare correttamente le funzioni (questi sono i nostri video di programmazione dal vivoche includono centinaia di ore di processo di creazione di programmi standard). Ciò che alla fine questo approccio rende il repository di funzionalità Wolfram in grado di funzionare bene è la natura strutturale del linguaggio Wolfram, con il suo gran numero di librerie aggiuntive e varie già integrate nel linguaggio. Ad esempio, se hai una funzione che elabora le immagini, o array sparsiO strutture molecolarie dati geografici o alcuni altri: la loro rappresentazione simbolica coerente esiste già nella lingua e, grazie a ciò, la tua funzione diventa immediatamente compatibile con altre funzioni nella lingua.

Creare un repository che funzioni davvero bene è un compito di meta-programmazione interessante. Ad esempio, un eccesso di restrizioni nel programma non consentirà di ottenere l'unificazione e l'universalità richieste dell'algoritmo. Proprio come con un numero insufficiente di restrizioni funzionali, non sarai in grado di implementare una sequenza sufficientemente corretta di esecuzione dell'algoritmo. Diversi esempi precedenti di implementazione di un compromesso di questi approcci, implementati dalla nostra azienda, hanno funzionato in modo abbastanza stabile: questi sono: Dimostrazioni del progetto Tungsteno, lanciato nel 2007 e ora funziona online con oltre 12000 demo interattive per l'utente. IN Banca dati Wolfram ci sono più di 600 database già pronti che possono essere utilizzati nel linguaggio Wolfram e Archiviazione della rete neurale Wolfram viene riempito con nuove reti neurali quasi ogni settimana (ce ne sono già 118) e vengono immediatamente collegate tramite la funzione NetModel nella lingua Wolfram.

Tutti gli esempi sopra riportati hanno una caratteristica fondamentale: gli oggetti e le funzioni raccolti nel progetto hanno un grado molto elevato di strutturazione e distribuzione dei processi. Naturalmente, i dettagli della struttura di ciò che è una demo, una rete neurale o qualcos'altro possono variare notevolmente, ma la struttura fondamentale di qualsiasi repository attuale rimane sempre la stessa. Allora qual è la tua opinione, caro utente, sulla creazione di un repository che aggiunga estensioni al linguaggio Wolfram? Il Wolfram Language è progettato per essere estremamente flessibile, quindi può essere esteso e modificato in qualsiasi modo. Questa circostanza è estremamente importante per la possibilità di creare rapidamente vari progetti software su larga scala nel linguaggio Wolfram. Va notato qui che con l'aumento della flessibilità della lingua, il costo dei progetti implementati in tale lingua aumenterà inevitabilmente. Ciò è dovuto al fatto che più l'utente utilizza tale linguaggio, più funzionalità dedicate riceve, ma non dobbiamo dimenticare che questo approccio può avere anche lati negativi in ​​termini di incapacità di garantire la coerenza coerente dei moduli del programma.

Esiste un problema comune con le librerie nei linguaggi di programmazione tradizionali: se utilizzi una libreria, ad esempio, il codice funzionerà correttamente, ma se provi a utilizzare più librerie, non vi è alcuna garanzia che interagiscano correttamente tra loro . Inoltre, nei linguaggi di programmazione tradizionali, a differenza di un linguaggio informatico completo, non c'è modo di garantire la presenza di rappresentazioni integrate coerenti per funzioni o tipi di dati diversi dalle loro strutture di base. Ma, in realtà, il problema è ancora più grande di quanto sembri a prima vista: se si sta costruendo un verticale di funzionalità su larga scala, senza gli enormi costi della programmazione di progetto centralizzata che mettiamo nel linguaggio Wolfram, è impossibile raggiungere la coerenza. È quindi importante che tutti i moduli software funzionino sempre insieme correttamente.

Quindi l'idea alla base del repository di funzionalità Wolfram è quella di evitare il problema sopra delineato semplicemente aggiungendo estensioni al linguaggio in porzioni di codice relativamente piccole tramite funzionalità individuali che sono più facili da sviluppare come moduli coerenti. Detto questo, ci sono caratteristiche di programmazione che non possono essere rese convenienti utilizzando singole funzioni (e la nostra azienda prevede di rilasciare nel prossimo futuro un algoritmo di programmazione ottimizzato per aiutare a implementare pacchetti software su larga scala). Tuttavia, sulla base delle funzioni già integrate nel Wolfram Language, esistono molte possibilità di programmazione che vengono implementate in base alle singole funzioni. L'idea qui è che con uno sforzo di programmazione relativamente piccolo è possibile creare una serie di funzioni nuove e molto utili che forniranno sufficiente coerenza al progetto, saranno ben coordinate tra loro e, in aggiunta a ciò, sarà in grado di essere facilmente e ampiamente utilizzato nella lingua in futuro.

Questo approccio è, ovviamente, un compromesso. Se venisse implementato un pacchetto più grande, si potrebbe immaginare un mondo completamente nuovo di funzionalità che sarebbe estremamente potente e utile. Se è necessario ottenere nuove funzionalità che si adattino a tutto il resto, ma non sei disposto a dedicare molti sforzi allo sviluppo del progetto, ciò, sfortunatamente, può portare a una riduzione della portata del tuo progetto. L'idea alla base del repository di funzionalità Wolfram è quella di fornire funzionalità a una parte determinante di un progetto; questo approccio aggiungerà funzionalità potenti rendendo più semplice mantenere una buona coerenza in un progetto di programmazione.

Aiuta ad aggiungere funzioni personalizzate al repository di funzioni

Il nostro team ha lavorato duramente per rendere più semplice per gli utenti contribuire alle funzionalità del repository Wolfram. Sul desktop (già in versione 12.0), puoi semplicemente scorrere le schede del menu principale in sequenza: File > Nuovo > Elemento repository > Elemento repository funzioni e otterrai "Taccuino delle definizioni" (programmaticamente all'interno del workbench. È anche possibile utilizzare la funzione analogica - Creataccuino["FunzioneRisorsa"]):

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Ci sono due passaggi principali che dovrai eseguire: in primo luogo, annotare effettivamente il codice per la tua funzione e, in secondo luogo, annotare la documentazione che illustra come dovrebbe funzionare la tua funzione.
Fai clic sul pulsante "Apri campione" in alto per vedere un esempio di ciò che devi fare:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

In sostanza, stai cercando di creare qualcosa di simile a una funzione incorporata nel linguaggio Wolfram. Solo che può fare qualcosa di molto più specifico di una funzione integrata. Allo stesso tempo, le aspettative riguardo alla sua completezza e affidabilità saranno molto più basse.
Devi dare alla tua funzione un nome che segua le linee guida per la denominazione delle funzioni di Wolfram Language. Inoltre, dovrai sviluppare la documentazione per la tua funzione, simile alle funzioni integrate del linguaggio. Ne parlerò più dettagliatamente più avanti. Per ora, nota solo che nella riga di pulsanti nella parte superiore del file del notebook delle definizioni è presente un pulsante "Linee guida di stile", che spiega cosa fare, e un pulsante Strumenti, che fornisce strumenti per formattare la documentazione della funzione.
Quando sei sicuro che tutto sia compilato correttamente e sei pronto, fai clic sul pulsante "Verifica". È del tutto normale che tu non abbia ancora capito tutti i dettagli. Quindi la funzione "Verifica" verrà eseguita automaticamente ed eseguirà molti controlli di stile e coerenza. Spesso ti chiederà immediatamente di confermare e accettare le correzioni (ad esempio: "Questa riga deve terminare con i due punti" e ti chiederà di inserire i due punti). A volte ti chiederà di aggiungere o modificare qualcosa tu stesso. Aggiungeremo costantemente nuove funzionalità alla funzionalità automatica del pulsante Controlla, ma fondamentalmente il suo scopo è garantire che tutto ciò che invii al repository di funzionalità segua già da vicino quante più linee guida di stile possibili

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Quindi, dopo aver eseguito "Verifica", puoi utilizzare "Anteprima". "Anteprima" crea un'anteprima della pagina di documentazione definita per la tua funzione. Puoi anche creare un'anteprima per un file creato sul tuo computer o per un file situato nell'archivio cloud. Se, per qualche motivo, non sei soddisfatto di ciò che vedi nell'anteprima, torna semplicemente indietro e apporta le correzioni necessarie, quindi fai nuovamente clic sul pulsante Anteprima.
Ora sei pronto per inserire la tua funzione nel repository. Il pulsante Distribuisci offre quattro opzioni:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

La cosa importante in questo passaggio è che puoi inviare la tua funzione al repository di funzioni Wolfram in modo che sia disponibile a chiunque. Allo stesso tempo, puoi anche inserire la tua funzione per un numero limitato di utenti. Ad esempio, puoi creare una funzione ospitata localmente sul tuo computer in modo che sia disponibile quando utilizzi quel particolare computer. Oppure puoi postarlo nel tuo conto cloud, in modo che sia disponibile per te quando sei connesso al cloud. Puoi anche ospitare (distribuire) pubblicamente la funzionalità tramite il tuo account cloud. Non sarà nel repository centrale delle funzionalità Wolfram, ma sarai in grado di fornire a qualcuno un URL che gli consentirà di ottenere la tua funzionalità dal tuo account. (In futuro supporteremo anche i repository centrali in tutta la nostra azienda.)

Supponiamo quindi che tu voglia effettivamente inviare la tua funzione alla knowledge base delle funzioni Wolfram. Per fare ciò, fai clic sul pulsante "Invia" al repository. Allora cosa sta succedendo in questo momento? La tua domanda viene immediatamente messa in coda per la revisione e l'approvazione da parte del nostro team dedicato di curatori.

Man mano che la tua richiesta avanza nel processo di approvazione (che in genere richiede diversi giorni), riceverai comunicazioni relative al suo stato ed eventualmente suggerimenti per un utilizzo futuro. Ma una volta approvata la tua funzionalità, verrà immediatamente pubblicata nel Wolfram Feature Repository e sarà disponibile per l'utilizzo da parte di chiunque. (E questo apparirà in sintesi di notizie di nuove funzionalità e così via)

Cosa dovrebbe esserci nel deposito?

Va notato che la nostra azienda ha standard molto elevati di completezza, affidabilità e qualità complessiva, delle oltre 6000 funzioni che abbiamo già integrato nel linguaggio Wolfram negli ultimi 30 anni soddisfano tutte i requisiti di cui sopra. L'obiettivo del Wolfram Function Repository è utilizzare tutta la struttura e le funzionalità già esistenti nel Wolfram Language per aggiungere quante più funzioni più leggere (ovvero funzioni con prestazioni più elevate) possibili.

Naturalmente, le funzioni nel repository di funzioni Wolfram devono essere conformi ai principi di progettazione del linguaggio Wolfram, in modo che possano interagire completamente con altre funzioni e con le aspettative degli utenti su come la funzione dovrebbe funzionare correttamente. Tuttavia, le funzioni non devono essere di uguale completezza o affidabilità.

Nelle funzioni integrate del linguaggio Wolfram, lavoriamo duramente per rendere le funzioni di programmazione il più generali possibile. Detto questo, quando nel repository di funzioni Wolfram non c'è niente di sbagliato nell'avere una funzione al suo interno che gestisce semplicemente qualche caso molto specifico ma utile. Ad esempio, la funzione Invia posta da notebook può ricevere file in un formato specifico e creare posta in un modo specifico. Diagramma Poligonale crea grafici con solo determinati colori ed etichette, ecc.

Un altro punto relativo alle funzioni integrate è che la nostra azienda fa ogni sforzo per gestire tutti i casi atipici, per gestire correttamente input errati e così via. In un repository di funzioni, è del tutto normale che ci sia una funzione speciale che gestisce i casi principali di risoluzione di un problema e ignora tutti gli altri.

Il punto ovvio è che è meglio avere funzioni che facciano di più e lo facciano meglio, ma l'ottimizzazione per un repository di funzioni - al contrario delle funzioni integrate del linguaggio Wolfram - dovrebbe avere più funzioni raggruppate con più funzioni piuttosto che approfondire i processi di implementazione di ciascuna specifica funzione.

Ora diamo un'occhiata a un esempio di test delle funzioni in un repository. Le aspettative di coerenza per tali funzioni sono naturalmente molto inferiori rispetto a quelle per le funzioni del linguaggio integrato. Ciò è particolarmente vero nei casi in cui le funzioni dipendono da risorse esterne come le API, è importante condurre costantemente test coerenti, cosa che avviene automaticamente all'interno degli algoritmi di verifica. Nel file nb è possibile specificare esplicitamente le definizioni (nella sezione Informazioni aggiuntive) e specificare tutti i test definiti dalle stringhe di input e output o dagli oggetti di carattere completo di tipo VerificaTest, per quanto ritieni opportuno. Inoltre, il sistema tenta costantemente di trasformare gli esempi di documentazione forniti in un processo di verifica (e talvolta questo può richiedere un notevole dispendio di risorse, ad esempio, per una funzione il cui risultato dipende da numeri casuali o dall'ora del giorno).

Di conseguenza, il repository delle funzioni presenterà una serie di complessità di implementazione. Alcuni saranno costituiti da una sola riga di codice, altri potrebbero includere migliaia o decine di migliaia di righe, probabilmente utilizzando molte funzioni di supporto. Quando vale la pena aggiungere una funzione che richiede pochissimo codice per essere definita? Fondamentalmente, se per una funzione c'è buon nome mnemonico, che gli utenti capirebbero facilmente se lo vedessero in un pezzo di codice, allora può già essere aggiunto. Altrimenti, probabilmente è meglio semplicemente aggiungere nuovamente il codice al programma ogni volta che è necessario utilizzarlo.

Lo scopo principale di un repository di funzioni (come suggerisce il nome) è introdurre nuove funzionalità nel linguaggio. Se vuoi aggiungere nuovi dati o nuove entità, utilizzo Archivio dati Wolfram. Ma cosa succede 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 nelle nuove funzioni nel repository delle funzioni. E in questo caso, puoi sempre semplicemente scrivere la sua rappresentazione simbolica e usarla quando si immettono o emettono funzioni in un repository di funzioni.

Ma cosa succede se vuoi rappresentare un oggetto e poi definire, attraverso le funzioni esistenti nel linguaggio Wolfram, che vuoi lavorare con esso? Il linguaggio Wolfram ha sempre avuto un meccanismo leggero per questo, chiamato UpValues. Con alcune restrizioni (soprattutto per le funzioni that non possono valutare le loro argomentazioni), un repository di funzioni consente di rappresentare semplicemente una funzione e definirne i valori. (Aumentare l'aspettativa di coerenza quando si crea un nuovo progetto principale completamente integrato in tutto il linguaggio Wolfram è generalmente una procedura molto importante che non può essere ottenuta semplicemente aumentando il costo del progetto ed è qualcosa che la nostra azienda fa come parte dei progetti per lo sviluppo a lungo termine del linguaggio, questo compito non è un obiettivo fissato come parte dello sviluppo del repository).

Quindi, cosa potrebbe esserci nel codice della funzione in un repository di funzioni? Tutto integrato nel linguaggio Wolfram, ovviamente (almeno se non rappresenta minaccioso per sicurezza e le prestazioni del programma stesso, come ambiente informatico) nonché qualsiasi funzione dal repository delle funzioni. Tuttavia, ci sono altre funzionalità: una funzione in un repository di funzioni può chiamare un'API, oppure in Nuvola di WolframO da un'altra fonte. Naturalmente, ci sono alcuni rischi associati a questo. A causa del fatto che non ci sono garanzie che l'API non cambierà e la funzione nell'archivio funzioni smetterà di funzionare. Per aiutare a identificare problemi come questo, è presente una nota nella pagina della documentazione (nella sezione Requisiti) per qualsiasi funzionalità che si basa su qualcosa di più della semplice funzionalità integrata di Wolfram Language. (Naturalmente, quando si tratta di dati reali, possono esserci problemi anche con questa funzionalità, perché i dati del mondo reale cambiano costantemente e talvolta cambiano anche le loro definizioni e struttura.)

Tutto il codice per il repository di funzionalità Wolfram dovrebbe essere scritto in Wolfram? Certamente il codice all'interno dell'API esterna non dovrebbe essere scritto nel linguaggio Wolfram, che non realizza nemmeno il codice della lingua. Infatti, se trovi una funzione in quasi tutti i linguaggi o librerie esterne, puoi creare un wrapper che ti permetta di usarla nel repository delle funzioni Wolfram. (Di solito dovresti usare le funzioni integrate per questo Valutazione Esterna o Funzione Esterna nel codice della lingua Wolfram.)

Allora qual è lo scopo di farlo? In sostanza, ciò consente di utilizzare l'intero sistema integrato Wolfram Language e il suo intero insieme unificato di funzionalità software. Se si ottiene l'implementazione di base da una libreria o da un linguaggio esterno, è possibile utilizzare la ricca struttura simbolica del linguaggio Wolfram per creare una comoda funzione di primo livello che consenta agli utenti di utilizzare facilmente qualsiasi funzionalità già implementata. Per lo meno, questo dovrebbe essere fattibile in un mondo ideale in cui esistono tutti gli elementi costitutivi del caricamento delle librerie, ecc., nel qual caso verrebbero gestiti automaticamente dal Wolfram Language. (Va notato che in pratica potrebbero esserci problemi con impostazione delle lingue esterne sistema informatico specifico e l’archiviazione nel cloud possono comportare ulteriori problemi di sicurezza).

A proposito, quando si guardano per la prima volta le tipiche librerie esterne, spesso sembrano troppo complesse per essere coperte in poche funzioni, ma in molti casi, gran parte della complessità deriva dalla creazione dell'infrastruttura necessaria affinché la libreria e tutte le funzioni possano funzionare. sostenerlo. Tuttavia, quando si utilizza il linguaggio Wolfram, l'infrastruttura è in genere già integrata nei pacchetti e quindi non è necessario esporre tutte queste funzioni di supporto in dettaglio, ma solo creare funzioni per le funzioni specifiche dell'applicazione "più in alto" nella libreria .

"Ecosistema" della base di conoscenza

Se hai scritto funzioni che usi regolarmente, inviale al Wolfram Function Repository! Se da questo non viene fuori qualcosa di più (sviluppo del linguaggio), anche in questo caso sarà molto più conveniente per te utilizzare le funzioni per uso personale. Tuttavia è logico supporre che se si utilizzano regolarmente le funzioni, forse anche altri utenti le troveranno utili.

Naturalmente potresti trovarti nella 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 potete semplicemente implementare le funzioni nel vostro account cloud, specificando i diritti accedervi. (Se la tua organizzazione ha Cloud privato Wolfram Enterprise, sarà presto in grado di ospitare il proprio repository di funzionalità privato, che può essere amministrato dall'interno dell'organizzazione e impostare se forzare o meno la visualizzazione delle visualizzazioni da parte di utenti di terze parti.)

Le funzioni inviate al repository di funzioni Wolfram non devono essere perfette; devono solo essere utili. È un po' come la sezione "Errori" nella classica documentazione Unix: nella "Sezione Definizioni" c'è una sezione "Note dell'autore" in cui puoi descrivere limitazioni, problemi, ecc. che già conosci riguardo alla tua funzione. Inoltre, quando invii la tua funzionalità al repository, puoi aggiungere note di invio che verranno lette da un team dedicato di curatori.

Una volta pubblicata una funzionalità, la sua pagina ha sempre due link in basso: "Invia un messaggio su questa funzionalità"E"Discuti nella comunità Wolfram" Se stai allegando una nota (ad esempio, informami dei bug), puoi selezionare la casella che dice che desideri che il tuo messaggio e le informazioni di contatto siano condivisi con l'autore della funzionalità.

A volte vuoi semplicemente utilizzare le funzioni dal repository di funzioni Wolfram, come le funzioni integrate, senza guardare il loro codice. Tuttavia, se vuoi dare un'occhiata all'interno, c'è sempre un pulsante Blocco note in alto. Fai clic su di esso e otterrai la tua copia del taccuino di definizione originale che è stato inviato al repository di funzionalità. A volte puoi semplicemente usarlo come esempio per le tue esigenze. Allo stesso tempo, puoi anche sviluppare la tua modifica di questa funzione. Potresti voler pubblicare queste funzioni che hai trovato dal repository sul tuo computer o nel tuo account di archiviazione cloud aphid, forse vuoi inviarle alla base di conoscenza delle funzioni, magari come una versione migliorata ed estesa della funzione originale.

In futuro, prevediamo di supportare il fork in stile Git per i repository di funzionalità, ma per ora stiamo cercando di mantenerlo semplice e abbiamo sempre solo una versione accettata di ciascuna funzionalità incorporata nel linguaggio. Nella maggior parte dei casi (a meno che gli sviluppatori non rinuncino a mantenere le funzionalità che hanno sviluppato e rispondano agli invii degli utenti), l'autore originale della funzionalità prende il controllo degli aggiornamenti e invia nuove versioni, che vengono poi riviste e, se superano il processo di revisione , pubblicato nella lingua.

Consideriamo la questione di come funziona il "versioning" delle funzioni sviluppate. In questo momento, quando utilizzi una funzione dal repository delle funzioni, la sua definizione verrà archiviata in modo permanente sul tuo computer (o nel tuo account cloud se stai utilizzando il cloud). Se è disponibile una nuova versione di una funzionalità, la prossima volta che la utilizzerai riceverai un messaggio di notifica. E se vuoi aggiornare la funzione a una nuova versione, puoi farlo usando il comando Aggiornamento risorse. (Il "blob di funzioni" memorizza effettivamente più informazioni sulle versioni e prevediamo di renderlo più accessibile ai nostri utenti in futuro.)

Una delle cose belle del Wolfram Function Repository è che qualsiasi programma Wolfram Language, ovunque, può utilizzare le sue funzioni. Se un programma appare in un blocco note, spesso è conveniente formattare le funzioni del repository come funzioni di "oggetto binario funzione" di facile lettura (magari con un set di versioni appropriato).

Puoi sempre accedere a qualsiasi funzione nel repository di funzioni utilizzando il testo FunzioneRisorsa[...]. E questo è molto comodo se scrivi codice o script direttamente per Wolfram Engine, ad esempio con utilizzando un IDE o un editor di codice di testo (Va notato in particolare che il repository delle funzioni è completamente compatibile con Motore Wolfram gratuito per sviluppatori).

Come funziona?

All'interno delle funzioni nel repository Wolfram questo è possibile utilizzando esattamente lo stesso sistemi di risorse basi, come in tutti gli altri nostri repository esistenti (archivio dati, Archivio della rete neurale, raccolta di progetti dimostrativi ecc.), come tutte le altre risorse del sistema Wolfram, Funzione risorsa in definitiva basato sulla funzione OggettoRisorsa.

Prendere in considerazione Funzione risorsa:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

All'interno è possibile visualizzare alcune informazioni utilizzando la funzione Informazioni:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Come funziona l'impostazione di una funzione risorsa? Il più semplice è un caso puramente locale. Ecco un esempio che prende una funzione (in questo caso solo una funzione pura) e la definisce come funzione di risorsa per una determinata sessione del programma:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Una volta effettuata la definizione, è possibile utilizzare la funzione risorsa:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Tieni presente che è presente un'icona nera in questo BLOB di funzioni Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram. Ciò significa che la funzione BLOB fa riferimento alla funzione della risorsa in memoria definita per la sessione corrente. Una funzionalità di risorsa archiviata in modo permanente sul tuo computer o account cloud è contrassegnata da un'icona grigia Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram. E c'è un'icona arancione per una funzionalità di risorsa ufficiale nel Wolfram Feature Repository Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram.

Quindi cosa succede quando usi il menu Espandi nel Notebook delle definizioni? Innanzitutto, prende tutte le definizioni nel blocco note e da esse crea un simbolico OggettoRisorsa). (E se stai utilizzando un IDE o un programma basato su testo, puoi anche creare esplicitamente OggettoRisorsa)

La distribuzione locale di una funzione da un repository sul computer viene eseguita utilizzando il comando LocalCache per un oggetto risorsa con cui salvarlo come LocalObject sul tuo file system. La distribuzione in un account cloud viene eseguita utilizzando il comando CloudDeploy per un oggetto risorsa e una distribuzione cloud pubblica lo è CloudPublish. In tutti i casi Registro delle risorse utilizzato anche per registrare il nome della funzione risorsa, quindi FunzioneRisorsa["nome"] funzionerà

Se fai clic sul pulsante Invia per un repository di funzioni, cosa succede sotto di esso Invia risorsa chiamato su un oggetto risorsa. (E se utilizzi un'interfaccia di immissione testo, puoi anche chiamare Invia risorsa direttamente.)

Per impostazione predefinita, gli invii vengono effettuati con il nome associato al tuo ID Wolfram. Ma se stai inviando una domanda per conto di un team o un'organizzazione di sviluppo, puoi farlo impostare un ID editore separato e usalo invece come nome per interagire con le tue visualizzazioni.

Dopo aver inviato una delle funzioni alla knowledge base delle funzioni, verrà messa in coda per la revisione. Se ricevi commenti in risposta, solitamente saranno sotto forma di un file di testo con l'aggiunta di "celle di commento" aggiuntive. Puoi sempre verificare lo stato della tua richiesta visitando portale dei membri del sistema di risorse. Ma una volta approvata la tua funzionalità, riceverai una notifica (via e-mail) e la tua funzionalità verrà pubblicata nel repository delle funzionalità Wolfram.

Alcune sottigliezze al lavoro

A prima vista potrebbe sembrare che tu possa semplicemente prendere un taccuino di definizioni e inserirlo parola per parola in un repository di funzioni, tuttavia, in realtà ci sono molte sottigliezze coinvolte - e gestirle richiede una meta-programmazione piuttosto complessa, gestendo l'elaborazione simbolica come codice che definisce la funzione e viene definito il Blocco note stesso. La maggior parte di ciò avviene internamente, dietro le quinte, ma può avere alcune implicazioni che vale la pena comprendere se si intende contribuire alla knowledge base delle funzionalità.

Prima sottigliezza immediata: quando compili il Quaderno delle definizioni, puoi semplicemente fare riferimento alla tua funzione ovunque usando un nome come La mia funzione, che sembra un nome normale per una funzione nel linguaggio Wolfram, ma per la documentazione del repository di funzioni viene sostituito FunzioneRisorsa["La mia funzione"] è ciò che gli utenti utilizzeranno effettivamente quando lavoreranno con la funzione.

La seconda sottigliezza: quando crei una funzione di risorsa dal Definition Notebook, tutte le dipendenze coinvolte nella definizione della funzione devono essere acquisite e incluse esplicitamente. Tuttavia, per garantire che le definizioni rimangano modulari, è necessario inserire tutto in un unico spazio dei nomi. (Ovviamente, funzioni che fanno tutto, sono nel repository delle funzioni.)

In genere non vedrai mai alcuna traccia del codice utilizzato per configurare questo spazio dei nomi. Ma se per qualche motivo chiami un simbolo sottoeseguito 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, lo è almeno il simbolo corrispondente alla funzione stessa regolabile per la migliore visualizzazione come BLOB funzionale piuttosto che come carattere grezzo nel contesto interno.

Il repository delle funzioni serve per definire nuove funzioni. E queste funzioni possono avere opzioni. Spesso questi parametri (ad esempio, metodo o Dimensione dell'immagine) potrà essere utilizzato per le funzioni integrate, nonché per quelle per le quali esistono già simboli integrati. Ma a volte una nuova funzionalità può richiedere nuove opzioni. Per mantenere la modularità, questi parametri devono essere simboli definiti in un contesto interno unico (o qualcosa come intere funzioni di risorsa, cioè loro stessi). Per semplicità, il repository di funzioni consente di definire nuove opzioni nelle definizioni di stringa. E per comodità dell'utente, queste definizioni (supponendo che siano usate ValoreOpzione и OpzioniModello) vengono inoltre elaborati in modo tale che quando si utilizzano le funzioni, i parametri possono essere specificati non solo come stringhe, ma anche come simboli globali con gli stessi nomi.

La maggior parte delle funzioni fanno semplicemente quello che dovrebbero fare ogni volta che vengono chiamate, ma alcune funzioni devono essere inizializzate prima di poter essere eseguite in una sessione particolare - e per risolvere questo problema, c'è una sezione "Inizializzazione" nella sezione Definizione.

Le funzioni di un repository possono utilizzare altre funzioni già presenti nel repository; per impostare le definizioni per un repository di funzioni che includono due (o più) funzioni che fanno riferimento a vicenda, è necessario distribuirle nella sessione del programma in modo da poter riferimento come su di essi FunzioneRisorsa["nome"], quindi puoi creare le combinazioni di queste funzioni che ti servono, esempi (non ho capito) e aggiungere una nuova funzione al repository in base a quelle già pubblicate in precedenza. (o già o precedentemente – entrambe le parole sono goffe)

Prospettive di sviluppo. Cosa dovrebbe succedere quando il repository diventa davvero grande?

Oggi stiamo lanciando solo il Wolfram Feature Repository, ma col tempo ci aspettiamo che le sue dimensioni e funzionalità possano aumentare notevolmente, e man mano che cresce nello sviluppo ci saranno vari problemi che già prevediamo potrebbero sorgere.

Il primo problema riguarda i nomi delle funzioni e la loro unicità. Il repository delle funzioni è progettato in modo tale che, come le funzioni integrate nel linguaggio Wolfram, puoi fare riferimento a qualsiasi funzione semplicemente specificandone il nome. Ma ciò significa inevitabilmente che i nomi delle funzioni devono essere globalmente univoci in tutto il repository, in modo che, ad esempio, possa essercene solo uno FunzioneRisorsa["La mia funzione preferita"].

All'inizio questo può sembrare un grosso problema, ma vale la pena rendersi conto che fondamentalmente è lo stesso problema che si riscontra per cose come i domini Internet o gli handle dei social media. E il fatto è che il sistema deve semplicemente avere un registrar - e questo è uno dei ruoli che la nostra azienda svolgerà per la knowledge base della funzione Wolfram. (Per le versioni private di un repository, i loro registrar possono essere amministratori.) Naturalmente, un dominio Internet può essere registrato senza contenere nulla, ma in un repository di funzioni, un nome di funzione può essere registrato solo se esiste una definizione effettiva di la funzione.

Parte del nostro ruolo nella gestione della base di conoscenza della funzione Wolfram è garantire che il nome scelto per una funzione sia logico data la definizione della funzione e che segua le convenzioni di denominazione del linguaggio Wolfram. Abbiamo oltre 30 anni di esperienza nella denominazione delle funzioni integrate nel linguaggio Wolfram e il nostro team di curatori porterà questa esperienza anche nel repository delle funzioni. Naturalmente ci sono sempre delle eccezioni. Ad esempio, può sembrare preferibile avere un nome breve per alcune funzioni, ma è meglio "difendersi" con un nome più lungo e specifico perché è meno probabile imbattersi in qualcuno che voglia dare un nome simile a una funzione in futuro. .

(Va notato qui che la semplice aggiunta di alcuni tag membro per chiarire le ambiguità delle funzioni non avrà l'effetto desiderato. Perché a meno che tu non insista nell'assegnare sempre un tag, dovrai definire un tag predefinito per ogni determinata funzione e anche allocare i tag dell'autore , che richiederebbe ancora una volta un coordinamento globale.)

Man mano che la base di conoscenza delle funzioni Wolfram cresce, uno dei problemi che probabilmente sorgerà è la rilevabilità delle funzioni, per le quali il sistema fornisce funzione di ricerca (e i file di definizione possono includere parole chiave, ecc.). Per le funzioni integrate nel linguaggio Wolfram, nella documentazione sono presenti tutti i tipi di riferimenti incrociati per aiutare a "pubblicizzare" le funzioni. Le funzioni in un repository di funzioni possono fare riferimento a funzioni integrate. Ma che dire del contrario? Per fare ciò, sperimenteremo diversi progetti per esporre le funzioni del repository nelle pagine di documentazione per le funzioni integrate.

Per le funzioni integrate nel linguaggio Wolfram esiste un cosiddetto livello di rilevamento fornito da rete di "pagine di aiuto", che forniscono elenchi organizzati di funzionalità relative ad aree specifiche. È sempre difficile bilanciare adeguatamente le pagine man e, man mano che il linguaggio Wolfram cresce, le pagine man spesso necessitano di essere completamente riorganizzate. È abbastanza semplice inserire le funzioni di un repository in ampie categorie e persino suddividere tali categorie in modo coerente, ma è molto più utile disporre di pagine di riferimento linguistiche adeguatamente organizzate. Non è ancora chiaro come crearli al meglio per l'intera base di conoscenza delle funzioni. Per esempio, CreaResourceObjectGallery nel repository delle funzionalità, chiunque può pubblicare una pagina web contenente le proprie "scelte" dal repository:

Wolfram Function Repository: piattaforma ad accesso aperto per le estensioni del linguaggio Wolfram

Il repository di funzioni Wolfram è configurato come repository di funzioni persistenti, dove qualsiasi funzione in esso contenuta funzionerà sempre. Naturalmente, potrebbero diventare disponibili nuove versioni delle funzionalità e prevediamo che alcune funzionalità diventeranno ovviamente obsolete nel tempo. Le funzioni funzioneranno se vengono utilizzate nei programmi, ma le loro pagine di documentazione si collegheranno a funzioni nuove e più avanzate.

Il Wolfram Feature Repository è progettato per aiutarti a scoprire rapidamente nuove funzionalità e apprendere nuovi modi di utilizzare il linguaggio Wolfram. Siamo molto ottimisti sul fatto che parte di ciò che è stato esplorato nel repository di funzionalità alla fine avrà senso per diventare parti integrate del nucleo di Wolfram Language. Negli ultimi dieci anni abbiamo avuto un set simile funzionalità originariamente introdotte in Wolfram | Alfa. E una delle lezioni apprese da questa esperienza è che raggiungere gli standard di qualità e coerenza su cui ci concentriamo in tutto ciò che è integrato nel linguaggio Wolfram richiede molto lavoro, che spesso è più difficile dello sforzo iniziale per l'implementazione dell'idea. Anche così, una funzione nella base di conoscenza delle funzioni può servire come prova di concetto molto utile per una funzione futura che potrebbe eventualmente essere incorporata nel linguaggio Wolfram.

La cosa più importante qui è che una funzione in un repository di funzioni sia qualcosa che può essere utilizzato da ogni utente in questo momento. È possibile che una funzionalità in lingua nativa possa essere molto migliore e più performante, ma un repository di funzionalità consentirebbe agli utenti di avere accesso immediato a tutte le nuove funzionalità. E, cosa più importante, questo concetto consente a tutti di aggiungere tutte le nuove funzionalità che desiderano.

All'inizio della storia del linguaggio Wolfram, questa idea non avrebbe funzionato così bene come ha fatto, ma in questa fase c'è così tanto sforzo profuso nel linguaggio, e una comprensione così profonda dei principi di progettazione del linguaggio, che ora sembra molto possibile per una vasta comunità di utenti aggiungere funzionalità che mantengano la coerenza del design per renderle utili a un'ampia gamma di utenti.

C'è un incredibile spirito di talento(?) nella comunità degli utenti di Wolfram Language. (Naturalmente, questa comunità include molti importanti esperti di ricerca e sviluppo in una varietà di campi.) Spero che il Wolfram Feature Repository fornisca una piattaforma efficace per sbloccare e diffondere questo spirito di talento. Solo insieme possiamo creare qualcosa che amplierà in modo significativo l’area a cui può essere applicato il paradigma del linguaggio informatico Wolfram.

In più di 30 anni abbiamo fatto molta strada con la lingua Wolfram. Ora insieme andiamo ancora oltre. Incoraggio vivamente tutti gli utenti rispettati del linguaggio Wolfram in tutto il mondo a utilizzare il repository funzionale come piattaforma per questo, così come il nuovo progetto software come Free Wolfram Engine for Developers.

Fonte: habr.com

Aggiungi un commento