Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Bună, Habr! Vă prezint atenției o traducere a postării lui Stephen Wolfram „Depozitul de funcții Wolfram: lansarea unei platforme deschise pentru extinderea limbajului Wolfram”.

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Condiții preliminare pentru consistența limbajului Wolfram

Astăzi suntem în pragul unor mari realizări împreună cu limbajul de programare Limbajul Wolfram. Cu doar trei săptămâni în urmă ne-am lansat motor Wolfram gratuit pentru dezvoltatoripentru a ajuta utilizatorii noștri să integreze Wolfram Language în proiectele lor de software la scară largă. Astăzi lansăm Depozitul de funcții Wolfram, pentru a oferi o platformă coordonată pentru funcțiile create pentru a extinde limbajul Wolfram și, de asemenea, deschidem un depozit de funcții pentru oricine poate contribui la dezvoltarea produsului nostru software.

Depozitul de funcții Wolfram este ceva posibil prin natura unică a limbajului Wolfram nu numai ca limbaj de programare, ci și ca limbaj de calcul la scară largă. În limbajele de programare tradiționale, adăugarea de noi funcționalități semnificative implică de obicei crearea de biblioteci suplimentare întregi care pot sau nu funcționa atunci când sunt utilizate împreună. Cu toate acestea, în limbajul Wolfram atât de multe sunt deja construite în limbajul în sine, că este posibil să-și extindă semnificativ funcționalitatea prin simpla adăugare de noi funcții care sunt imediat integrate în structura holistică a întregului limbaj.

De exemplu, depozitul de funcții Wolfram conține deja 532 de funcții noi structurat în 26 de categorii tematice:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

La fel mai mult decât 6000 de funcții standard, construit în limbajul Wolfram, fiecare funcție din depozit are o pagină de documentație cu o descriere detaliată a acestora și exemple de lucru:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Pentru a ajunge la pagină, copiați obiectul de mai sus (funcția BLOB), inserați-l în linia de intrare și apoi rulați funcția - este deja încorporată în limbajul Wolfram și este acceptată implicit, începând cu versiunea 12.0:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Trebuie remarcat aici că la procesare LogoQRCode Nu trebuie, de exemplu, să configurați o „bibliotecă de procesare a imaginilor” - deoarece am implementat deja un mod consistent și atent algoritmic în limbajul Wolfram. procesarea imaginii, care poate fi procesat imediat de diverse funcții ale limbajului grafic:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Sper ca cu sprijinul comunitate minunată și talentată, care a crescut și sa extins (pe baza limbajului Wolfram) în ultimele decenii. Depozitul de funcții Wolfram va permite, în viitorul previzibil, extinderea semnificativă a gamei de funcții (posibil potențial semnificative, specializate în diferite domenii ale științei și tehnologiei) disponibile în limbă. Astfel, devine posibil să se utilizeze atât conținutul limbajului (funcțiile sale încorporate), cât și principii de dezvoltare, care sunt implementate pe baza limbii. (Trebuie remarcat aici că limba Wolfram are deja mai mult de 30 de ani de istorie de dezvoltare și creștere stabilă).
Funcțiile din depozit pot conține bucăți mici sau mari de cod scrise în limbajul Wolfram. De exemplu, acestea ar putea fi apeluri API-uri și servicii externe sau biblioteci externe în alte limbi. Caracteristica unică a acestei abordări este că, atunci când detaliați până la funcționalitatea la nivel de utilizator, nu vor exista potențiale inconsecvențe, deoarece abordarea este construită pe structura consecventă a limbajului Wolfram - și fiecare funcție va funcționa automat corect - exact așa cum intenționat.ea ar trebui.
Structura de shell și de programare a depozitului de caracteristici Wolfram este concepută astfel încât toată lumea să poată contribui la cauza comună în cel mai simplu și convenabil mod pentru ei - de fapt, doar prin completarea fișierului text Notepad (cu extensia nb) WL. Funcțiile automate încorporate vă permit să verificați noile funcții adăugate în depozit pentru a asigura integrarea lor în limbă. Compania noastră mizează pe gama largă de utilizatori care își pot integra funcțiile în limbă, mai degrabă decât pe marea complexitate a noilor funcții - și, deși există un proces de revizuire, nu insistăm pe ceva de genul analiză minuțioasă a designului sau standarde stricte pentru completitudinea și fiabilitatea noilor caracteristici ale utilizatorului, spre deosebire de testarea mai riguroasă a caracteristicilor încorporate în limbajul de bază pe care îl folosim.

Există multe compromisuri și detalii în această abordare, dar scopul nostru este să optimizăm depozitul de caracteristici Wolfram atât pentru experiența utilizatorului, cât și pentru a ne asigura că noile funcții ale utilizatorului contribuie semnificativ la dezvoltarea limbajului. Pe măsură ce creștem, nu am nicio îndoială că va trebui să inventăm noi metode de procesare și validare a funcțiilor integrate în depozit, nu în ultimul rând pentru organizarea unui număr mare de funcții și găsirea celor de care utilizatorii au nevoie. Cu toate acestea, este încurajator faptul că drumul pe care l-am ales este un început bun. eu personal a adăugat mai multe caracteristici la baza de date originală. Multe dintre ele se bazează pe cod pe care l-am dezvoltat personal de ceva timp. Și mi-a luat doar câteva minute să le împing în depozit. Acum că sunt în depozit, pot în sfârșit - imediat și în orice moment - să folosesc aceste funcții după cum este necesar, fără a fi nevoit să-mi fac griji cu privire la căutarea fișierelor, descărcarea pachetelor etc.

Creșterea eficienței, reducând în același timp costurile

Chiar înainte de internet, existau modalități de a partaja codul Wolfram Language (primul nostru proiect major centralizat a fost MathSource, creat pentru Mathematica în 1991 pe CD-ROM etc.). Desigur, abordarea propusă pentru implementare bazată pe depozitul de funcții Wolfram este un instrument mai puternic și mai fiabil pentru implementarea sarcinilor de mai sus.

De peste 30 de ani, compania noastră a lucrat cu sârguință pentru a menține integritatea structurii limbajului Wolfram, iar acest lucru este esențial pentru a ne asigura că limbajul Wolfram devine nu doar un limbaj de programare, ci și un limbaj de calcul cu drepturi depline. Și astfel, esența abordării pentru implementarea depozitului de funcții Wolfram este utilizarea unei abordări unificate pentru programarea și dezvoltarea de noi funcții care sunt adăugate secvenţial și se potrivesc în cadrul limbajului, astfel încât acesta să se poată dezvolta și co-evolua.

În structura de implementare a fiecărei funcții apar diferite procese de calcul. Trebuie remarcat aici că este necesar ca funcția să aibă un aspect clar și uniform și o lizibilitate vizuală pentru utilizator. În acest context, funcțiile încorporate ale limbajului Wolfram sunt prezentate cu mai mult de 6000 de exemple secvențiale despre cum să programați corect funcțiile (acestea sunt videoclipuri de programare livecare include sute de ore de proces de creare a programelor standard). Ceea ce această abordare face ca depozitul de caracteristici Wolfram să fie capabil să funcționeze bine este natura structurală a limbajului Wolfram, cu numărul mare de biblioteci suplimentare și variate care sunt deja încorporate în limbaj. De exemplu, dacă aveți o funcție care procesează imagini sau tablouri rareSau structuri moleculareși date geografice sau altele - reprezentarea lor simbolică consecventă există deja în limbă și, datorită acestui lucru, funcția ta devine imediat compatibilă cu alte funcții din limbă.

Crearea unui depozit care funcționează de fapt bine este o sarcină interesantă de meta-programare. De exemplu, un exces de restricții în program nu va permite obținerea unificării și universalității necesare a algoritmului. La fel ca în cazul unui număr insuficient de restricții funcționale, nu veți putea implementa o secvență suficient de corectă de execuție a algoritmului. Câteva exemple anterioare de implementare a unui compromis al acestor abordări, implementate de compania noastră, au funcționat destul de stabil - acestea sunt: Proiectul Demonstrații Tungsten, lansat în 2007 și rulează acum online online, cu peste 12000 de demonstrații interactive pentru utilizatori. ÎN Baza de date Wolfram există mai mult de 600 de baze de date gata făcute care pot fi utilizate în limbajul Wolfram și Stocare de rețea neuronală Wolfram este completat cu noi rețele neuronale aproape în fiecare săptămână (există deja 118 dintre ele acum) și sunt conectate imediat prin intermediul funcției NetModel în limba Wolfram.

Toate exemplele de mai sus au o caracteristică fundamentală - obiectele și funcțiile colectate în proiect au un grad foarte ridicat de structurare și distribuție a proceselor. Desigur, detaliile structurii a ceea ce este un demo sau o rețea neuronală sau altceva poate varia foarte mult, dar structura fundamentală pentru orice depozit actual rămâne întotdeauna aceeași. Deci, ce părere aveți, dragă utilizator, despre crearea unui astfel de depozit care adaugă extensii la limbajul Wolfram? Wolfram Language este conceput pentru a fi extrem de flexibil, astfel încât poate fi extins și modificat în orice mod. Această împrejurare este extrem de importantă pentru capacitatea de a crea rapid diverse proiecte software la scară largă în limbajul Wolfram. Trebuie remarcat aici că, pe măsură ce flexibilitatea limbii crește, costul proiectelor implementate într-o astfel de limbă va crește inevitabil. Acest lucru se datorează faptului că, cu cât utilizatorul folosește mai mult un astfel de limbaj, cu atât primește mai multă funcționalitate dedicată, dar nu trebuie să uităm că această abordare poate avea și laturi negative în ceea ce privește incapacitatea de a asigura consistența consistentă a modulelor programului.

Există o problemă comună cu bibliotecile în limbaje tradiționale de programare - dacă utilizați o singură bibliotecă, de exemplu, codul va funcționa corect, dar dacă încercați să utilizați mai multe biblioteci, nu există nicio garanție că acestea vor interacționa corect între ele . De asemenea, în limbajele tradiționale de programare - spre deosebire de un limbaj de calcul cu drepturi depline - nu există nicio modalitate de a garanta prezența reprezentărilor încorporate consistente pentru orice funcții sau tipuri de date, altele decât structurile lor de bază. Dar, de fapt, problema este chiar mai mare decât pare la prima vedere: dacă cineva construiește o verticală de funcționalitate la scară largă, atunci fără costurile uriașe ale programării centralizate a proiectelor pe care le punem în limbajul Wolfram, este imposibil să atinge consistența. Prin urmare, este important ca toate modulele software să funcționeze întotdeauna împreună corect.

Așadar, ideea din spatele depozitului de caracteristici Wolfram este de a evita problema descrisă mai sus prin simpla adăugare de extensii la limbaj în bucăți relativ mici de cod prin funcții individuale care sunt mai ușor de dezvoltat ca module coerente. Acestea fiind spuse, există caracteristici de programare care nu pot fi făcute convenabile folosind funcții individuale (și compania noastră intenționează să lanseze un algoritm de programare optimizat în viitorul apropiat pentru a ajuta la implementarea pachetelor software la scară largă). Cu toate acestea, pe baza funcțiilor deja încorporate în limbajul Wolfram, există multe posibilități de programare care sunt implementate pe baza funcțiilor individuale. Ideea aici este că, cu un efort relativ mic de programare, este posibil să se creeze o serie de funcții noi și foarte utile, care vor oferi suficientă coerență designului, vor fi bine coordonate între ele și, de asemenea, în plus, ele. va putea să fie ușor și utilizat pe scară largă în limbă în viitor.

Această abordare este, desigur, un compromis. Dacă ar fi implementat un pachet mai mare, s-ar putea imagina o lume cu totul nouă de funcționalități, care ar fi extrem de puternică și utilă. Dacă este nevoie să obțineți o nouă funcționalitate care să se potrivească cu orice altceva, dar nu sunteți dispus să depuneți mult efort pentru dezvoltarea proiectului, acest lucru, din păcate, poate duce la o reducere a sferei de aplicare a proiectului dumneavoastră. Ideea din spatele depozitului de caracteristici Wolfram este de a oferi funcționalitate unei părți definitorii a unui proiect; această abordare va adăuga funcționalitate puternică, în timp ce va facilita menținerea unei coerențe bune într-un proiect de programare.

Ajută la adăugarea de funcții personalizate în depozitul de funcții

Echipa noastră a muncit din greu pentru a facilita contribuția utilizatorilor la caracteristicile depozitului Wolfram. Pe desktop (deja în versiunea 12.0), puteți pur și simplu să parcurgeți filele meniului principal secvențial: Fișier > Nou > RepositoryItem > Funcție Repository Item și veți obține „Caiet de definiții" (programatic în interiorul bancului de lucru. Puteți utiliza și funcția analogică - Creați blocnotes["FunctionResource"]):

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Există doi pași principali pe care va trebui să îi efectuați: în primul rând, notați codul pentru funcția dvs. și, în al doilea rând, notați documentația care ilustrează cum ar trebui să funcționeze funcția dvs.
Faceți clic pe butonul „Open Sample” din partea de sus pentru a vedea un exemplu de ceea ce trebuie să faceți:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

În esență, încercați să creați ceva similar cu o funcție încorporată în limbajul Wolfram. Cu excepția faptului că poate face ceva mult mai specific decât o funcție încorporată. În același timp, așteptările cu privire la completitudinea și fiabilitatea acestuia vor fi mult mai mici.
Trebuie să dați funcției dvs. un nume care urmează regulile de denumire a funcțiilor Wolfram Language. În plus, va trebui să dezvoltați documentație pentru funcția dvs., similară cu funcțiile încorporate ale limbajului. Voi vorbi despre asta mai detaliat mai târziu. Deocamdată, observați doar că în rândul de butoane din partea de sus a fișierului caietul de definiții există un buton „Orientări de stil”, care explică ce trebuie să faceți și un buton Instrumente, care oferă instrumente pentru formatarea documentației funcției dvs.
Când sunteți sigur că totul este completat corect și sunteți gata, faceți clic pe butonul „Verifică”. Este absolut normal să nu ți-ai dat seama încă de toate detaliile. Deci, funcția „Verificare” va rula automat și va face o mulțime de verificări de stil și coerență. Adesea, vă va solicita imediat să confirmați și să acceptați corecțiile (de exemplu: „Această linie trebuie să se încheie cu două puncte” și vă va solicita să introduceți două puncte). Uneori, ea vă va cere să adăugați sau să schimbați ceva. Vom adăuga în mod constant noi funcții la funcționalitatea automată a butonului Verificare, dar, practic, scopul său este să ne asigurăm că tot ceea ce trimiteți la depozitul de caracteristici urmează deja cât mai multe linii directoare de stil posibil.

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Deci, după ce rulați „Verificare”, puteți utiliza „Previzualizare”. „Previzualizare” creează o previzualizare a paginii de documentație pe care ați definit-o pentru funcția dvs. De asemenea, puteți crea o previzualizare pentru un fișier creat pe computer sau pentru un fișier aflat în stocarea în cloud. Dacă, dintr-un motiv oarecare, nu sunteți mulțumit de ceea ce vedeți în previzualizare, pur și simplu mergeți înapoi și faceți corecțiile necesare, apoi faceți clic din nou pe butonul Previzualizare.
Acum sunteți gata să vă împingeți funcția în depozit. Butonul Implementare vă oferă patru opțiuni:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Lucrul important la acest pas este că vă puteți trimite funcția în depozitul de funcții Wolfram, astfel încât să fie disponibilă oricui. În același timp, puteți plasa funcția pentru un număr limitat de utilizatori. De exemplu, puteți crea o funcție care este găzduită local pe computerul dvs., astfel încât să fie disponibilă atunci când utilizați acel computer. Sau îl puteți posta în dvs cont cloud, astfel încât să vă fie disponibil atunci când sunteți conectat la cloud. De asemenea, puteți găzdui (implementa) public caracteristica prin contul dvs. cloud. Nu va fi în depozitul central de caracteristici Wolfram, dar veți putea da cuiva o adresă URL care îi va permite să vă obțină funcția din contul dvs. (În viitor, vom sprijini și depozitele centrale din întreaga companie.)

Deci, să presupunem că doriți să vă trimiteți funcția la baza de cunoștințe pentru funcția Wolfram. Pentru a face acest lucru, faceți clic pe butonul „Trimite” către depozit. Deci, ce se întâmplă în acest moment? Aplicația dvs. este imediat pusă în așteptare pentru examinare și aprobare de către echipa noastră dedicată de curatori.

Pe măsură ce cererea dumneavoastră avansează prin procesul de aprobare (care durează de obicei câteva zile), veți primi comunicări cu privire la starea acesteia și, eventual, sugestii pentru utilizare ulterioară. Dar odată ce caracteristica dvs. este aprobată, aceasta va fi publicată imediat în Depozitul de caracteristici Wolfram și va fi disponibilă pentru utilizare de către oricine. (Și asta va apărea în știri rezumate ale noilor funcții și așa mai departe)

Ce ar trebui să fie în depozit?

Trebuie remarcat faptul că compania noastră are standarde foarte înalte pentru completitudine, fiabilitate și calitate generală, iar dintre cele peste 6000 de funcții pe care le-am integrat deja în limbajul Wolfram în ultimii 30 de ani, toate îndeplinesc cerințele de mai sus. Scopul Wolfram Function Repository este de a folosi toată structura și funcționalitatea care există deja în Wolfram Language pentru a adăuga cât mai multe funcții mai ușoare (adică funcții de performanță mai înaltă) posibil.

Desigur, funcțiile din depozitul de funcții Wolfram trebuie să se conformeze principiilor de proiectare ale Wolfram Language - astfel încât să poată interacționa pe deplin cu alte funcții și cu așteptările utilizatorilor cu privire la modul în care funcția ar trebui să funcționeze corect. Cu toate acestea, funcțiile nu trebuie să fie la fel de complete sau de fiabilitate.

În funcțiile încorporate ale limbajului Wolfram, muncim din greu pentru a face funcțiile de programare cât mai generale posibil. Acestea fiind spuse, atunci când în depozitul de funcții Wolfram, nu este nimic greșit în a avea o funcție în el care pur și simplu se ocupă de un caz foarte specific, dar util. De exemplu, funcția SendMailFromNotebook poate primi fișiere într-un anumit format și poate crea e-mail într-un anumit mod. Diagrama poligonală creează diagrame cu doar anumite culori și etichete etc.

Un alt punct legat de funcțiile încorporate este că compania noastră depune toate eforturile pentru a gestiona toate cazurile atipice, pentru a gestiona corect introducerea incorectă și așa mai departe. Într-un depozit de funcții, este complet normal să existe o funcție specială care se ocupă de principalele cazuri de rezolvare a unei probleme și ignoră toate celelalte.

Ideea evidentă este că este mai bine să aveți funcții care fac mai mult și mai bine, dar optimizarea pentru un depozit de funcții - spre deosebire de funcțiile încorporate ale limbajului Wolfram - ar trebui să aibă mai multe funcții împreună cu mai multe funcții, mai degrabă decât să se aprofundeze în procesele de implementare a fiecărei funcții specifice.

Acum să ne uităm la un exemplu de testare a funcțiilor într-un depozit. Așteptările de consistență pentru astfel de funcții sunt în mod natural mult mai mici decât pentru funcțiile de limbaj încorporate. Acest lucru este valabil mai ales în cazurile în care funcțiile depind de resurse externe, cum ar fi API-urile, este important să se efectueze constant teste consistente, ceea ce se întâmplă automat în cadrul algoritmilor de verificare. În fișierul nb, puteți specifica în mod explicit definiții (în secțiunea Informații suplimentare) și puteți specifica atâtea teste cât sunt definite fie de șirurile de intrare și de ieșire, fie de obiecte de tip caracter complet. Test de verificare, cât crezi de cuviință. În plus, sistemul încearcă în mod constant să transforme exemplele de documentație pe care le furnizați într-un proces de verificare (și uneori acest lucru poate consuma destul de mult resurse, de exemplu, pentru o funcție al cărei rezultat depinde de numere aleatorii sau de ora din zi).

Ca rezultat, depozitul de funcții va avea o serie de complexități de implementare. Unele vor fi doar o singură linie de cod, altele pot implica mii sau zeci de mii de linii, probabil folosind multe funcții de ajutor. Când merită să adăugați o funcție care necesită foarte puțin cod pentru definire? Practic, dacă pentru o funcție există nume mnemonic bun, pe care utilizatorii l-ar înțelege cu ușurință dacă l-ar vedea într-o bucată de cod, atunci poate fi deja adăugat. În caz contrar, probabil că este mai bine să adăugați din nou codul la program de fiecare dată când trebuie să îl utilizați.

Scopul principal al unui depozit de funcții (după cum sugerează și numele) este de a introduce noi caracteristici în limbaj. Dacă doriți să adăugați date noi sau noi entitati, utilizare Depozitul de date Wolfram. Dar dacă vrei să introduci noi tipuri de obiecte pentru calculele tale?

Există de fapt două moduri. Poate doriți să introduceți un nou tip de obiect care va fi folosit în funcții noi din depozitul de funcții. Și în acest caz, puteți întotdeauna să scrieți reprezentarea sa simbolică și să o utilizați atunci când introduceți sau scoateți funcții într-un depozit de funcții.

Dar dacă doriți să reprezentați un obiect și apoi să definiți, prin funcțiile existente în limbajul Wolfram, că doriți să lucrați cu el? Wolfram Language a avut întotdeauna un mecanism ușor pentru asta, numit Valori în sus. Cu unele restricții (în special pentru funcții care nu pot evalua argumentele lor), un depozit de funcții vă permite să reprezentați pur și simplu o funcție și să definiți valori pentru aceasta. (A crește așteptările de consecvență atunci când se creează un nou design major care este complet integrat în limbajul Wolfram este, în general, o procedură foarte importantă care nu poate fi realizată prin simpla creștere a costului proiectului și este ceva pe care compania noastră o face ca parte a proiectelor. pentru dezvoltarea pe termen lung a limbajului, această sarcină nu este un obiectiv care este stabilit ca parte a dezvoltării depozitului).

Deci, ce ar putea fi în codul funcției dintr-un depozit de funcții? Totul încorporat în limbajul Wolfram, desigur (cel puțin dacă nu reprezintă amenințări pentru Securitate și performanța programului în sine, ca mediu de calcul), precum și orice funcție din depozitul de funcții. Cu toate acestea, există și alte funcționalități: o funcție dintr-un depozit de funcții poate apela un API sau în Wolfram CloudSau din altă sursă. Desigur, există unele riscuri asociate cu acest lucru. Datorită faptului că nu există garanții că API-ul nu se va schimba, iar funcția din magazinul de funcții nu va mai funcționa. Pentru a ajuta la identificarea unor astfel de probleme, există o notă pe pagina de documentație (în secțiunea Cerințe) pentru orice caracteristică care se bazează pe mai mult decât pe funcționalitatea Wolfram Language încorporată. (Desigur, când vine vorba de date reale, pot apărea probleme chiar și cu această funcționalitate - deoarece datele din lumea reală se schimbă în mod constant și, uneori, chiar și definițiile și structura lor se schimbă.)

Ar trebui să fie scris tot codul pentru depozitul de caracteristici Wolfram în Wolfram? Cu siguranță, codul din interiorul API-ului extern nu ar trebui să fie scris în limbajul Wolfram, care nici măcar nu face codul de limbă. De fapt, dacă găsiți o funcție în aproape orice limbă externă sau bibliotecă, puteți crea un wrapper care vă permite să o utilizați în depozitul de funcții Wolfram. (De obicei, ar trebui să utilizați funcțiile încorporate pentru aceasta Evaluare externă sau ExternalFunction în codul limbii Wolfram.)

Deci, ce rost are să faci asta? În esență, acest lucru vă permite să utilizați întregul sistem integrat Wolfram Language și întregul său set unificat de capabilități software. Dacă obțineți implementarea de bază dintr-o bibliotecă sau un limbaj extern, puteți utiliza apoi structura simbolică bogată a limbajului Wolfram pentru a crea o funcție convenabilă de nivel superior care permite utilizatorilor să utilizeze cu ușurință orice funcționalitate deja implementată. Cel puțin, acest lucru ar trebui să fie fezabil într-o lume ideală în care există toate blocurile de bază ale bibliotecilor de încărcare etc., caz în care acestea ar fi gestionate automat de Wolfram Language. (Trebuie remarcat faptul că în practică pot exista probleme cu configurarea limbilor externe un anumit sistem computerizat și stocarea în cloud pot pune probleme de securitate suplimentare).

Apropo, atunci când te uiți pentru prima dată la bibliotecile externe tipice, acestea par adesea prea complexe pentru a fi acoperite doar în câteva funcții, dar în multe cazuri, o mare parte din complexitate provine din crearea infrastructurii necesare bibliotecii și a tuturor funcțiilor pentru susține-l. Cu toate acestea, atunci când utilizați limbajul Wolfram, infrastructura este de obicei deja încorporată în pachete și, prin urmare, nu este nevoie să expuneți toate aceste funcții de asistență în detaliu, ci doar să creați funcții pentru cele mai „de sus” funcții specifice aplicației din bibliotecă. .

„Ecosistemul” bazei de cunoștințe

Dacă ați scris funcții pe care le utilizați în mod regulat, trimiteți-le în Depozitul de funcții Wolfram! Dacă nu iese ceva mai mult din asta (dezvoltarea limbii), atunci chiar și atunci îți va fi mult mai convenabil să folosești funcțiile pentru uz personal. Cu toate acestea, este logic să presupunem că dacă utilizați funcțiile în mod regulat, poate că și alți utilizatori le vor găsi utile.

Desigur, s-ar putea să vă aflați într-o situație în care nu puteți - sau nu doriți - să vă împărtășiți funcțiile sau în cazul în care obțineți acces la resurse de informații private. Chiar și în astfel de cazuri, puteți implementa pur și simplu funcțiile în propriul cont cloud, specificarea drepturilor acces la ele. (Dacă organizația dvs. are Cloud privat Wolfram Enterprise, atunci va putea în curând să găzduiască propriul său depozit privat de caracteristici, care poate fi administrat din cadrul organizației dvs. și poate stabili dacă să forțeze sau nu vizualizările să fie vizualizate de către utilizatori terți.)

Funcțiile pe care le trimiteți la depozitul de funcții Wolfram nu trebuie să fie perfecte; trebuie doar să fie utile. Aceasta este un pic ca secțiunea „Erori” din documentația clasică Unix - în „Secțiunea Definiții” există o secțiune „Notele autorului” unde puteți descrie limitări, probleme etc. pe care le cunoașteți deja despre funcția dvs. În plus, atunci când trimiteți caracteristica dvs. în depozit, puteți adăuga note de trimitere care vor fi citite de o echipă dedicată de curatori.

Odată ce o caracteristică este publicată, pagina sa are întotdeauna două link-uri în partea de jos: "Trimiteți un mesaj despre această funcție"Și"Discută în comunitatea Wolfram" Dacă atașați o notă (de exemplu, spuneți-mi despre erori), puteți bifa caseta care spune că doriți ca mesajul și informațiile dvs. de contact să fie partajate cu autorul caracteristicii.

Uneori doriți doar să utilizați funcții din depozitul de funcții Wolfram, cum ar fi funcțiile încorporate, fără să vă uitați la codul lor. Cu toate acestea, dacă doriți să aruncați o privire în interior, există întotdeauna un buton Notepad în partea de sus. Faceți clic pe el și veți obține propria copie a caietului de definiții original care a fost trimis în depozitul de caracteristici. Uneori îl poți folosi doar ca exemplu pentru nevoile tale. În același timp, puteți dezvolta și propria dvs. modificare a acestei funcții. Poate doriți să postați aceste funcții pe care le-ați găsit din depozit pe computer sau în contul dvs. de stocare în cloud afide, poate doriți să le trimiteți în baza de cunoștințe a funcției, poate ca o versiune îmbunătățită și extinsă a funcției originale.

În viitor, intenționăm să acceptăm forking în stil Git pentru depozitele de caracteristici, dar deocamdată încercăm să menținem totul simplu și avem întotdeauna o singură versiune acceptată a fiecărei caracteristici încorporată în limbaj. De cele mai multe ori (cu excepția cazului în care dezvoltatorii renunță la menținerea funcțiilor pe care le-au dezvoltat și răspund la trimiterile utilizatorilor), autorul original al caracteristicii preia controlul asupra actualizărilor acesteia și trimite versiuni noi, care sunt apoi revizuite și, dacă trec procesul de revizuire , publicat în limba.

Să luăm în considerare întrebarea cum funcționează „versiunea” funcțiilor dezvoltate. În acest moment, atunci când utilizați o funcție din depozitul de funcții, definiția acesteia va fi stocată permanent pe computerul dvs. (sau în contul dvs. cloud dacă utilizați cloud). Dacă este disponibilă o nouă versiune a unei funcții, data viitoare când o utilizați, veți primi un mesaj care vă anunță acest lucru. Și dacă doriți să actualizați funcția la o versiune nouă, o puteți face folosind comanda ResourceUpdate. („Blobul de funcție” stochează de fapt mai multe informații de versiune și intenționăm să le facem mai accesibile utilizatorilor noștri în viitor.)

Unul dintre lucrurile frumoase despre Wolfram Function Repository este că orice program Wolfram Language, oriunde poate folosi funcții din acesta. Dacă un program apare într-un bloc de note, este adesea convenabil să formatați funcțiile de depozit ca funcții ușor de citit „obiect binar funcțional” (poate cu un set de versiuni adecvat).

Puteți accesa oricând orice funcție din depozitul de funcții folosind text ResourceFunction[...]. Și acest lucru este foarte convenabil dacă scrieți cod sau scripturi direct pentru Wolfram Engine, de exemplu, cu folosind un IDE sau un editor de cod text (Trebuie remarcat în special faptul că depozitul de funcții este pe deplin compatibil cu Motor Wolfram gratuit pentru dezvoltatori).

Cum funcționează?

În interiorul funcțiilor din depozitul Wolfram, acest lucru este posibil folosind exact același lucru sisteme de resurse baze, ca în toate celelalte depozite existente (magazin de date, Depozitul de rețea neuronală, colecție de proiecte demo etc.), ca toate celelalte resurse de sistem Wolfram, ResourceFunction în cele din urmă bazate pe funcție ResourceObject.

Lua în considerare ResourceFunction:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

În interior puteți vedea câteva informații folosind funcția Informații:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Cum funcționează configurarea unei funcții de resursă? Cel mai simplu este un caz pur local. Iată un exemplu care preia o funcție (în acest caz doar o funcție pură) și o definește ca o funcție de resursă pentru o anumită sesiune de program:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Odată ce ați făcut definiția, puteți utiliza funcția de resurse:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Rețineți că există o pictogramă neagră în acest blob de funcție Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram. Aceasta înseamnă că funcția BLOB se referă la funcția de resurse în memorie definită pentru sesiunea curentă. O funcție de resursă care este stocată permanent pe computer sau în contul dvs. în cloud are o pictogramă gri Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram. Și există o pictogramă portocalie pentru o funcție oficială de resursă în Depozitul de caracteristici Wolfram Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram.

Deci, ce se întâmplă când utilizați meniul Expand din Definition Notebook? În primul rând, ia toate definițiile din blocnotes și din ele creează un simbol ResourceObject). (Și dacă utilizați un IDE sau un program bazat pe text, atunci puteți, de asemenea, să creați în mod explicit ResourceObject)

Implementarea locală a unei funcții dintr-un depozit de pe computerul dvs. se realizează folosind comanda LocalCache pentru ca un obiect resursă să-l salveze ca LocalObject pe sistemul dvs. de fișiere. Implementarea într-un cont cloud se face folosind comanda CloudDeploy pentru un obiect resursă și o implementare în cloud public este CloudPublish. În toate cazurile ResourceRegister folosit și pentru a înregistra numele funcției de resurse, deci ResourceFunction["Nume"] va functiona.

Dacă faceți clic pe butonul Trimitere pentru un depozit de funcții, ce se întâmplă sub acesta ResourceSubmit apelat la un obiect resursă. (Și dacă utilizați o interfață de introducere a textului, puteți, de asemenea, să apelați ResourceSubmit direct.)

În mod implicit, trimiterile sunt făcute sub numele asociat ID-ului dumneavoastră Wolfram. Dar dacă depuneți o cerere în numele unei echipe de dezvoltare sau al unei organizații, puteți setați un ID de editor separat și folosiți-l ca nume pentru a interacționa cu opiniile dvs.

După ce ați trimis oricare dintre funcțiile dvs. la baza de cunoștințe ale funcției, aceasta va fi pusă în coadă pentru examinare. Dacă primiți comentarii ca răspuns, acestea vor fi de obicei sub forma unui fișier text cu „celule de comentarii” suplimentare adăugate. Puteți verifica oricând starea cererii dvs. vizitând portalul membrilor sistemului de resurse. Dar odată ce caracteristica dvs. este aprobată, veți fi notificat (prin e-mail) și caracteristica dvs. va fi postată în depozitul de funcții Wolfram.

Câteva subtilități la locul de muncă

La prima vedere, poate părea că poți doar să iei un caiet de definiții și să-l pui textual într-un depozit de funcții, cu toate acestea, există de fapt o mulțime de subtilități implicate - și gestionarea lor necesită realizarea unor meta-programare destul de complexe, gestionarea procesării simbolice ca codul care definește funcția, iar Notepad-ul în sine este definit. Cele mai multe dintre acestea se întâmplă în interior, în culise, dar poate avea unele implicații care merită înțelese dacă veți contribui la baza de cunoștințe a caracteristicilor.

Prima subtilitate imediată: când completați caietul de definiții, puteți pur și simplu să vă referiți la funcția dvs. peste tot folosind un nume precum Funcția mea, care arată ca un nume obișnuit pentru o funcție în limbajul Wolfram, dar pentru documentația depozitului de funcții aceasta este înlocuită ResourceFunction[„Funcția mea”] este ceea ce utilizatorii vor folosi de fapt atunci când lucrează cu funcția.

A doua subtilitate: atunci când creați o funcție de resursă din Definition Notebook, toate dependențele implicate în definirea funcției trebuie să fie capturate și incluse în mod explicit. Cu toate acestea, pentru a vă asigura că definițiile rămân modulare, trebuie să puneți totul într-un mod unic spatiu de nume. (Desigur, funcții care fac totul, sunt în depozitul de funcții.)

De obicei, nu veți vedea niciodată nicio urmă a codului folosit pentru a configura acest spațiu de nume. Dar dacă din anumite motive apelați un simbol sub-executat în interiorul funcției dvs., atunci veți vedea că acest simbol se află în contextul intern al funcției. Cu toate acestea, atunci când se prelucrează Blocul de note cu definiții, cel puțin simbolul corespunzător funcției în sine este reglabil pentru cea mai bună afișare ca un BLOB funcțional mai degrabă decât un personaj brut în contextul intern.

Depozitul de funcții este pentru definirea de noi funcții. Și aceste funcții pot avea opțiuni. Adesea, acești parametri (de exemplu, Metodă sau Marimea imaginii) vor putea fi utilizate pentru funcții încorporate, precum și pentru cele pentru care există deja simboluri încorporate. Dar uneori, o funcție nouă poate necesita opțiuni noi. Pentru a menține modularitatea, acești parametri trebuie să fie simboluri definite într-un context intern unic (sau ceva de genul funcțiilor întregi de resurse, adică ei înșiși). Pentru simplitate, depozitul de funcții vă permite să definiți noi opțiuni în definițiile șirurilor. Și pentru comoditatea utilizatorului, aceste definiții (presupunând că au folosit OptionValue и OpțiuniPattern) sunt, de asemenea, procesate astfel încât atunci când se utilizează funcții, parametrii pot fi specificați nu numai ca șiruri de caractere, ci și ca simboluri globale cu aceleași nume.

Majoritatea funcțiilor pur și simplu fac ceea ce ar trebui să facă de fiecare dată când sunt apelate, dar unele funcții trebuie inițializate înainte de a putea rula într-o anumită sesiune - și pentru a rezolva această problemă, există o secțiune „Inițializare” în secțiunea Definiție.

Funcțiile dintr-un depozit pot folosi alte funcții care sunt deja în depozit; pentru a seta definiții pentru un depozit de funcții care include două (sau mai multe) funcții care se referă una la alta, trebuie să le implementați în sesiunea de program, astfel încât să puteți referință ca pe ele ResourceFunction["Nume"], apoi puteți crea combinațiile acestor funcții de care aveți nevoie, exemple (nu am înțeles) și puteți adăuga o nouă funcție în depozit pe baza celor deja postate mai devreme. (sau deja sau anterior - ambele cuvinte sunt stângace)

Perspective de dezvoltare. Ce ar trebui să se întâmple când depozitul devine cu adevărat mare?

Astăzi tocmai lansăm Depozitul de caracteristici Wolfram, dar în timp ne așteptăm ca dimensiunea și funcționalitatea acestuia să crească dramatic și, pe măsură ce crește în dezvoltare, vor apărea diverse probleme pe care deja anticipăm că pot apărea.

Prima problemă se referă la numele funcțiilor și unicitatea acestora. Depozitul de funcții este proiectat în așa fel încât, ca și funcțiile încorporate în limbajul Wolfram, puteți face referire la orice funcție dată pur și simplu specificând numele acesteia. Dar acest lucru înseamnă inevitabil că numele funcțiilor trebuie să fie unice la nivel global în depozit, astfel încât, de exemplu, să poată exista doar unul ResourceFunction[„Funcția mea preferată”].

Aceasta poate părea o problemă mare la început, dar merită să realizați că este practic aceeași problemă ca și pentru lucruri precum domeniile de internet sau mânerele rețelelor sociale. Și adevărul este că sistemul trebuie pur și simplu să aibă un registrator - și acesta este unul dintre rolurile pe care compania noastră le va îndeplini pentru baza de cunoștințe a funcției Wolfram. (Pentru versiunile private ale unui depozit, registratorii lor pot fi administratori.) Desigur, un domeniu de Internet poate fi înregistrat fără a avea nimic pe el, dar într-un depozit de funcții, un nume de funcție poate fi înregistrat numai dacă există o definiție reală a functia.

O parte a rolului nostru în gestionarea bazei de cunoștințe a funcției Wolfram este să ne asigurăm că numele ales pentru o funcție este logic, având în vedere definiția funcției și că respectă convențiile de denumire Wolfram Language. Avem peste 30 de ani de experiență în denumirea funcțiilor încorporate în limbajul Wolfram, iar echipa noastră de curatori va aduce această experiență și în depozitul de funcții. Desigur, există întotdeauna excepții. De exemplu, poate părea de preferat să aveți un nume scurt pentru o anumită funcție, dar este mai bine să „apărați” cu un nume mai lung și mai specific, deoarece este mai puțin probabil să întâlniți cineva care dorește să creeze un nume de funcție similar în viitor .

(Trebuie remarcat aici că simpla adăugare a unor etichete de membru pentru a dezambigua funcțiile nu va avea efectul dorit. Deoarece dacă nu insistați să atribuiți întotdeauna o etichetă, va trebui să definiți o etichetă implicită pentru orice funcție dată și, de asemenea, să alocați etichete de autor. , care din nou ar necesita o coordonare globală.)

Pe măsură ce baza de cunoștințe a funcțiilor Wolfram crește, una dintre problemele care va apărea probabil este descoperirea funcțiilor, pentru care sistemul oferă funcția de căutare (și fișierele de definiții pot include cuvinte cheie etc.). Pentru funcțiile încorporate în limbajul Wolfram, există tot felul de referințe încrucișate în documentație pentru a ajuta la „reclama” funcțiile. Funcțiile dintr-un depozit de funcții pot face referire la funcții încorporate. Dar ce zici invers? Pentru a face acest lucru, vom experimenta diferite modele pentru a expune funcțiile de depozit în paginile de documentație pentru funcțiile încorporate.

Pentru funcțiile încorporate în limbajul Wolfram există un așa-numit strat de detectare oferit de rețea de „pagini de ajutor”, care oferă liste organizate de caracteristici legate de anumite zone. Este întotdeauna dificil să echilibrezi corect paginile de manual și, pe măsură ce limbajul Wolfram crește, paginile de manual trebuie adesea să fie complet reorganizate. Este destul de ușor să puneți funcții dintr-un depozit în categorii largi și chiar să descompuneți aceste categorii în mod consecvent, dar este mult mai valoros să aveți pagini de referință lingvistice organizate corespunzător. Nu este încă clar cum să le creăm cel mai bine pentru întreaga bază de cunoștințe a funcției. De exemplu, CreateResourceObjectGallery în depozitul de caracteristici, oricine poate posta o pagină web care conține „alegerile” sale din depozit:

Wolfram Function Repository: Platformă de acces deschis pentru extensiile de limbaj Wolfram

Depozitul de funcții Wolfram este configurat ca un depozit de funcții persistente, unde orice funcție din el va funcționa întotdeauna. Desigur, pot deveni disponibile versiuni noi de funcții și ne așteptăm ca unele caracteristici să devină depășite în timp. Funcțiile vor funcționa dacă sunt utilizate în programe, dar paginile lor de documentație vor face legătura cu funcții noi, mai avansate.

Depozitul de caracteristici Wolfram este conceput pentru a vă ajuta să descoperiți rapid noi funcții și să învățați noi moduri de a utiliza limbajul Wolfram. Suntem foarte optimiști că o parte din ceea ce a fost explorat în depozitul de caracteristici va avea sens în cele din urmă să devină părți încorporate ale limbajului Wolfram de bază. În ultimul deceniu am avut un set similar caracteristici care au fost introduse inițial în Wolfram | Alfa. Și una dintre lecțiile învățate din această experiență este că atingerea standardelor de calitate și consecvență pe care ne concentrăm în tot ceea ce este construit în limbajul Wolfram necesită multă muncă, care este adesea mai dificilă decât efortul inițial de implementare a ideii. Chiar și așa, o funcție din baza de cunoștințe a funcției poate servi ca o dovadă de concept foarte utilă pentru o funcție viitoare care poate fi în cele din urmă construită în limbajul Wolfram.

Cel mai important lucru aici este că o funcție dintr-un depozit de funcții este ceva disponibil pentru fiecare utilizator pentru a o utiliza chiar acum. Este posibil ca o caracteristică a limbii native să fie mult mai bună și mai performantă, dar un depozit de caracteristici ar permite utilizatorilor să aibă acces imediat la toate funcțiile noi. Și, cel mai important, acest concept permite tuturor să adauge orice caracteristici noi doresc.

Mai devreme în istoria limbajului Wolfram, această idee nu ar fi funcționat la fel de bine cum a funcționat, dar în acest stadiu există atât de mult efort depus în limbaj și o înțelegere atât de profundă a principiilor de proiectare a limbajului, încât acum pare foarte este posibil ca o comunitate mare de utilizatori să adauge funcții care vor menține coerența designului pentru a le face utile unei game largi de utilizatori.

Există un spirit incredibil de talent(?) în comunitatea de utilizatori Wolfram Language. (Desigur, această comunitate include mulți oameni de top în cercetare și dezvoltare într-o varietate de domenii.) Sper că Wolfram Feature Repository va oferi o platformă eficientă pentru deblocarea și diseminarea acestui spirit de talent. Numai împreună putem crea ceva care să extindă semnificativ aria în care poate fi aplicată paradigma de calcul al limbajului Wolfram.

În mai bine de 30 de ani, am parcurs un drum lung cu limba Wolfram. Acum împreună, să mergem și mai departe. Încurajez cu tărie toți utilizatorii respectați ai limbajului Wolfram din întreaga lume să folosească depozitul funcțional ca platformă pentru aceasta, precum și noul proiect software, cum ar fi Free Wolfram Engine for Developers.

Sursa: www.habr.com

Adauga un comentariu