Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Zdravo, Habr! Predstavljam vašoj pažnji prijevod posta Stephena Wolframa "Spremište Wolfram funkcija: Pokretanje otvorene platforme za proširenje Wolfram jezika".

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Preduvjeti za konzistentnost Wolfram jezika

Danas stojimo na pragu velikih dostignuća zajedno sa programskim jezikom Wolfram Language. Prije samo tri sedmice smo lansirali besplatni Wolfram engine za programerekako bismo pomogli našim korisnicima da integriraju Wolfram Language u svoje velike softverske projekte. Danas pokrećemo Spremište Wolfram funkcija, kako bismo pružili koordiniranu platformu za funkcije kreirane za proširenje jezika Wolfram, a otvaramo i spremište funkcija za sve koji mogu doprinijeti razvoju našeg softverskog proizvoda.

Wolfram Function Repository je nešto što je omogućeno jedinstvenom prirodom Wolfram jezika ne samo kao programskog jezika, već i kao potpuni računarski jezik. U tradicionalnim programskim jezicima, dodavanje značajnih novih funkcionalnosti obično uključuje stvaranje čitavih dodatnih biblioteka koje mogu, ali ne moraju raditi kada se koriste zajedno. Međutim, na jeziku Wolfram toliko je toga već ugrađeno u sam jezik, da je moguće značajno proširiti njegovu funkcionalnost jednostavnim dodavanjem novih funkcija koje se odmah integriraju u holističku strukturu cijelog jezika.

Na primjer, spremište Wolfram funkcija već sadrži 532 nove funkcije strukturirano u 26 tematskih kategorija:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Isto tako više od 6000 standardnih funkcija, ugrađene u Wolfram jezik, svaka funkcija iz spremišta ima stranicu dokumentacije sa detaljnim opisom i primjerima rada:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Da biste došli do stranice, kopirajte gornji objekt (funkcija BLOB), zalijepite ga u liniju za unos i zatim pokrenite funkciju - već je ugrađena u Wolfram jezik i podržana je po defaultu počevši od verzija 12.0:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Ovdje treba napomenuti da prilikom obrade LogoQRCode Ne morate, na primjer, postaviti “biblioteku za obradu slika” – pošto smo već implementirali dosljedan i pažljivo algoritamski način u Wolfram Language obrada slike, koji se može odmah obraditi raznim funkcijama grafičkog jezika:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Nadam se da uz podršku divna i talentovana zajednica, koji je rastao i širio se (zasnovan na Wolfram Language) u posljednjih nekoliko decenija. Repozitorijum funkcija Wolfram će u doglednoj budućnosti omogućiti značajno proširenje opsega (moguće potencijalno značajnih, specijalizovanih u različitim oblastima nauke i tehnologije) funkcija dostupnih na jeziku. Tako postaje moguće koristiti i sadržaj jezika (njegove ugrađene funkcije) i razvojni principi, koji se implementiraju na osnovu jezika. (Ovdje treba napomenuti da Wolfram Language već ima više od 30-godišnja istorija razvoja i stabilnog rasta).
Funkcije iz spremišta mogu sadržavati male ili velike dijelove koda napisane na Wolfram jeziku. Na primjer, to mogu biti pozivi eksterni API-ji i usluge ili eksterne biblioteke na drugim jezicima. Jedinstvena karakteristika ovog pristupa je da kada se detaljnije spustite do funkcionalnosti na nivou korisnika, neće biti potencijalnih nedosljednosti jer je pristup izgrađen na vrhu konzistentne strukture Wolfram jezika - i svaka funkcija će automatski raditi ispravno - točno kako nameravala.
Shell i programska struktura Wolfram Feature Repository je dizajnirana tako da svako može doprinijeti zajedničkom cilju na najjednostavniji i najprikladniji način za sebe - zapravo, samo popunjavanjem tekstualnog fajla beležnice (sa ekstenzijom nb) WL. Ugrađene automatske funkcije vam omogućavaju da provjerite nove funkcije dodane u spremište kako biste osigurali njihovu integraciju u jezik. Naša kompanija se kladi na širok spektar korisnika koji svoje funkcije mogu integrirati u jezik, a ne na veliku složenost novih funkcija - i iako postoji proces pregleda, ne insistiramo ni na čemu poput mukotrpna analiza dizajna ili stroge standarde za potpunost i pouzdanost novih korisničkih funkcija, za razliku od rigoroznijeg testiranja funkcija ugrađenih u osnovni jezik koji koristimo.

Postoji mnogo kompromisa i detalja u ovom pristupu, ali naš cilj je da optimiziramo spremište Wolfram funkcija i za korisničko iskustvo i da osiguramo da nove korisničke karakteristike značajno doprinose razvoju jezika. Kako rastemo, ne sumnjam da ćemo morati izmisliti nove metode za obradu i validaciju funkcija ugrađenih u spremište, ne samo za organiziranje velikog broja funkcija i pronalaženje onih koje su korisnicima potrebne. Međutim, ohrabruje činjenica da je put koji smo odabrali dobar početak. Ja lično dodao nekoliko funkcija na originalnu bazu podataka. Mnogi od njih su bazirani na kodu koji sam lično razvijao već duže vrijeme. I trebalo mi je samo nekoliko minuta da ih gurnem u spremište. Sada kada su u spremištu, mogu konačno - odmah i u bilo koje vrijeme - koristiti ove funkcije po potrebi, bez brige o traženju datoteka, preuzimanju paketa itd.

Povećanje efikasnosti uz smanjenje troškova

Čak i prije Interneta, postojali su načini za dijeljenje Wolfram Language koda (naš prvi veliki centralizirani projekt je bio MathSource, kreiran za Mathematica 1991. na osnovu CD-ROM-a, itd.). Naravno, pristup predložen za implementaciju baziran na spremištu Wolfram funkcija je moćniji i pouzdaniji alat za implementaciju gore navedenih zadataka.

Više od 30 godina, naša kompanija je marljivo radila na održavanju integriteta jezičke strukture Wolfram, a to je ključno za osiguranje da Wolfram jezik postane ne samo programski jezik, već i punopravni računarski jezik. Dakle, suština pristupa implementaciji repozitorija Wolfram funkcija je korištenje jedinstvenog pristupa programiranju i razvoju novih funkcija koje se sekvencijalno dodaju i uklapaju u okvir jezika kako bi se mogao razvijati i ko-evoluirati.

U implementacionoj strukturi svake funkcije javljaju se različiti računski procesi. Ovdje treba napomenuti da je neophodno da funkcija ima jasan i ujednačen izgled i vizualnu čitljivost za korisnika. U tom kontekstu, ugrađene funkcije Wolfram Languagea predstavljene su s više od 6000 uzastopnih primjera kako pravilno programirati funkcije (ovo su naše video programi uživokoji uključuju stotine sati procesa kreiranja standardnih programa). Ono što ovaj pristup na kraju čini repozitorijumom karakteristika Wolfram sposobnim za dobre performanse je strukturna priroda Wolfram jezika, sa velikim brojem dodatnih i raznovrsnih biblioteka koje su već ugrađene u jezik. Na primjer, ako imate funkciju koja obrađuje slike, ili rijetki nizoviili molekularne struktureI geografski podaci ili neke druge - njihova dosljedna simbolička reprezentacija već postoji u jeziku i zahvaljujući tome vaša funkcija odmah postaje kompatibilna s drugim funkcijama u jeziku.

Stvaranje spremišta koje stvarno dobro radi je zanimljiv zadatak metaprogramiranja. Na primjer, višak ograničenja u programu neće omogućiti postizanje potrebne unifikacije i univerzalnosti algoritma. Kao i kod nedovoljnog broja funkcionalnih ograničenja, nećete moći implementirati dovoljno ispravan slijed izvođenja algoritma. Nekoliko prethodnih primjera implementacije kompromisa ovih pristupa, koje je implementirala naša kompanija, radilo je prilično stabilno - a to su: Projekt Tungsten Demonstrations, pokrenut 2007. godine i sada radi na mreži s više od 12000 interaktivnih demonstracija. IN Wolfram baza podataka postoji više od 600 gotovih baza podataka koje se mogu koristiti u Wolfram Languageu, i Wolfram neuronska mreža za skladištenje se skoro svake nedelje dopunjava novim neuronskim mrežama (sada ih je već 118) i odmah se povezuju preko funkcije NetModel na jeziku Wolfram.

Svi gore navedeni primjeri imaju fundamentalnu osobinu - objekti i funkcije prikupljeni u projektu imaju vrlo visok stepen strukturiranja i distribucije procesa. Naravno, detalji strukture onoga što je demo ili neuronska mreža ili nešto drugo mogu uvelike varirati, ali osnovna struktura za bilo koje trenutno spremište uvijek ostaje ista. Dakle, kakvo je vaše mišljenje, dragi korisniče, o stvaranju takvog spremišta koje dodaje ekstenzije Wolfram jeziku? Wolfram Language je dizajniran da bude izuzetno fleksibilan, tako da se može proširiti i modificirati na bilo koji način. Ova okolnost je izuzetno važna za mogućnost brzog kreiranja raznih velikih softverskih projekata na jeziku Wolfram. Ovdje treba napomenuti da kako se fleksibilnost jezika povećava, troškovi projekata koji se implementiraju na takvom jeziku neizbježno će rasti. To je zbog činjenice da što više korisnik koristi takav jezik, dobija više namjenske funkcionalnosti, ali ne treba zaboraviti da ovaj pristup može imati i negativne strane u smislu nemogućnosti osiguravanja konzistentnosti programskih modula.

Postoji uobičajeni problem s bibliotekama u tradicionalnim programskim jezicima - ako koristite jednu biblioteku, na primjer, kod će raditi ispravno, ali ako pokušate koristiti više biblioteka, nema garancije da će one međusobno pravilno komunicirati. . Također, u tradicionalnim programskim jezicima - za razliku od punopravnog računarskog jezika - ne postoji način da se jamči prisutnost dosljednih ugrađenih reprezentacija za bilo koje funkcije ili tipove podataka osim njihovih osnovnih struktura. Ali, zapravo, problem je čak i veći nego što se čini na prvi pogled: ako se gradi vertikala funkcionalnosti velikih razmjera, onda je bez ogromnih troškova centraliziranog programiranja projekata koje stavljamo u Wolfram jezik nemoguće postići konzistentnost. Stoga je važno da svi softverski moduli uvijek ispravno rade zajedno.

Dakle, ideja iza spremišta Wolfram funkcija je da se izbjegne gore navedeni problem jednostavnim dodavanjem proširenja jeziku u relativno male dijelove koda preko pojedinačnih karakteristika koje je lakše razviti kao koherentne module. Imajući to u vidu, postoje programske karakteristike koje se ne mogu učiniti zgodnim korišćenjem pojedinačnih funkcija (a naša kompanija planira da objavi optimizovani algoritam za programiranje u bliskoj budućnosti kako bi pomogla u implementaciji velikih softverskih paketa). Međutim, na osnovu funkcija koje su već ugrađene u Wolfram Language, postoje mnoge mogućnosti programiranja koje se implementiraju na osnovu pojedinačnih funkcija. Ideja je da je uz relativno malo programskog napora moguće kreirati niz novih i vrlo korisnih funkcija koje će osigurati dovoljnu koherentnost dizajna, biti će međusobno dobro usklađene, a osim toga, moći će se lako i široko koristiti u jeziku u budućnosti.

Ovaj pristup je, naravno, kompromis. Kada bi se implementirao veći paket, mogao bi se zamisliti čitav novi svijet funkcionalnosti koji bi bio izuzetno moćan i koristan. Ako postoji potreba za nabavkom nove funkcionalnosti koja će se uklopiti u sve ostalo, ali niste voljni uložiti puno truda u razvoj projekta, to, nažalost, može dovesti do smanjenja obima vašeg projekta. Ideja iza repozitorija Wolfram funkcija je da se obezbedi funkcionalnost za definitivni deo projekta, ovaj pristup će dodati moćnu funkcionalnost dok će olakšati održavanje dobre konzistentnosti u projektu programiranja.

Pomozite u dodavanju prilagođenih funkcija u spremište funkcija

Naš tim je naporno radio kako bi korisnicima olakšao doprinos funkcijama Wolfram repozitorija. Na radnoj površini (već u verzija 12.0), Možete jednostavno proći kroz kartice glavnog menija uzastopno: File > New > RepositoryItem > Function Repository Item i dobićete "Definicija Notebook" (programski unutar radnog stola. Možete koristiti i analognu funkciju - Kreiraj bilježnicu["FunctionResource"]):

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Postoje dva glavna koraka koja ćete morati izvršiti: prvo, zapravo zapišite kod za svoju funkciju i, drugo, zapišite dokumentaciju koja ilustruje kako bi vaša funkcija trebala raditi.
Kliknite na dugme "Otvori uzorak" na vrhu da vidite primjer onoga što trebate učiniti:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

U suštini, pokušavate stvoriti nešto slično ugrađenoj funkciji u Wolfram Language. Osim što može učiniti nešto mnogo specifičnije od ugrađene funkcije. Istovremeno, očekivanja u pogledu njegove kompletnosti i pouzdanosti bit će znatno manja.
Morate svojoj funkciji dati ime koje slijedi smjernice za imenovanje funkcija u Wolfram Languageu. Osim toga, morat ćete razviti dokumentaciju za svoju funkciju, slično ugrađenim funkcijama jezika. Kasnije ću o tome detaljnije. Za sada, samo primijetite da se u redu dugmadi na vrhu datoteke bilježnice definicije nalazi dugme "Stilske smjernice", koji objašnjava šta treba učiniti, i dugme Alati, koje pruža alate za formatiranje dokumentacije vaše funkcije.
Kada ste sigurni da je sve ispravno popunjeno i da ste spremni, kliknite na dugme „Proveri“. Potpuno je normalno da još niste shvatili sve detalje. Dakle, funkcija "Provjeri" će se automatski pokrenuti i obaviti mnogo provjera stila i konzistentnosti. Često će od vas odmah zatražiti da potvrdite i prihvatite ispravke (na primjer: „Ovaj red se mora završavati dvotočkom“, a od vas će se tražiti da unesete dvotočku). Ponekad će od vas tražiti da sami nešto dodate ili promijenite. Stalno ćemo dodavati nove značajke automatskoj funkcionalnosti gumba Provjeri, ali u osnovi njegova je svrha osigurati da sve što pošaljete u spremište značajki već pobliže slijedi što je više moguće stilskih smjernica

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Dakle, nakon što pokrenete "Check", možete koristiti "Preview". "Pregled" kreira pregled stranice dokumentacije koju ste definirali za svoju funkciju. Također možete kreirati pregled za datoteku kreiranu na vašem računaru ili za datoteku koja se nalazi u pohrani u oblaku. Ako iz nekog razloga niste zadovoljni onim što vidite u pregledu, jednostavno se vratite i izvršite potrebne ispravke, a zatim ponovo kliknite na dugme Pregled.
Sada ste spremni da gurnete svoju funkciju u spremište. Dugme Deploy vam daje četiri opcije:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Važna stvar u ovom koraku je da svoju funkciju možete poslati u spremište Wolfram funkcija tako da bude dostupna svima. Istovremeno, svoju funkciju možete postaviti i za ograničen broj korisnika. Na primjer, možete kreirati funkciju koja se nalazi lokalno na vašem računalu tako da je dostupna kada koristite taj određeni računar. Ili ga možete objaviti u svom račun u oblaku, tako da vam bude dostupan kada ste povezani na oblak. Također možete javno hostirati (razmjestiti) funkciju putem svog računa u oblaku. Neće biti u centralnom spremištu Wolfram funkcija, ali ćete moći nekome dati URL koji će mu omogućiti da preuzme vašu funkciju sa vašeg naloga. (U budućnosti ćemo također podržavati centralna spremišta u cijeloj našoj kompaniji.)

Dakle, recimo da želite da svoju funkciju zapravo pošaljete u bazu znanja o funkciji Wolfram. Da biste to učinili, kliknite na dugme “Pošalji” u spremište. Pa šta se onda dešava u ovom trenutku? Vaša prijava je odmah u redu za pregled i odobrenje od strane našeg posvećenog tima kustosa.

Kako vaša aplikacija bude napredovala kroz proces odobravanja (koji obično traje nekoliko dana), primit ćete komunikacije u vezi sa njenim statusom i moguće prijedloge za buduću upotrebu. Ali kada vaša funkcija bude odobrena, odmah će biti objavljena u Wolfram Feature Repository i bit će dostupna svima za korištenje. (I ovo će se pojaviti u sažetak vijesti o novim funkcijama i tako dalje)

Šta bi trebalo biti u skladištu?

Treba napomenuti da naša kompanija ima vrlo visoke standarde za kompletnost, pouzdanost i ukupni kvalitet, a od 6000+ funkcija koje smo već ugradili u Wolfram jezik u proteklih 30+ godina, sve ispunjavaju gore navedene zahtjeve. Cilj Wolfram Function Repository-a je da koristi svu strukturu i funkcionalnost koja već postoji u Wolfram Language-u kako bi se dodalo što više lakših funkcija (tj. funkcija viših performansi).

Naravno, funkcije u skladištu Wolfram funkcija moraju biti u skladu sa principima dizajna Wolfram jezika - tako da mogu u potpunosti komunicirati s drugim funkcijama i očekivanjima korisnika o tome kako funkcija treba ispravno raditi. Međutim, funkcije ne moraju biti jednake kompletnosti ili pouzdanosti.

U ugrađenim funkcijama jezika Wolfram, naporno radimo na tome da funkcije programiranja budu što je moguće općenitije. S obzirom na to, kada ste u spremištu Wolfram funkcija, nema ništa loše u tome da u njemu imate funkciju koja jednostavno obrađuje neke vrlo specifične, ali korisne slučajeve. Na primjer, funkcija SendMailFromNotebook može primati datoteke u jednom određenom formatu i kreirati poštu na jedan specifičan način. Poligonalni dijagram kreira grafikone samo sa određenim bojama i oznakama, itd.

Još jedna stvar vezana za ugrađene funkcije je da se naša kompanija trudi da obradi sve netipične slučajeve, da pravilno rukuje netačnim unosom itd. U spremištu funkcija, sasvim je normalno da postoji posebna funkcija koja obrađuje glavne slučajeve rješavanja problema i zanemaruje sve ostale.

Očigledna stvar je da je bolje imati funkcije koje rade više i to rade bolje, ali optimizacija za spremište funkcija - za razliku od ugrađenih funkcija jezika Wolfram - trebala bi imati više funkcija u paketu s više funkcija umjesto da se udubljuje u procese implementacije svake specifične funkcije.

Pogledajmo sada primjer testiranja funkcija u spremištu. Očekivanja konzistentnosti za takve funkcije su prirodno mnogo niža nego za funkcije ugrađenog jezika. Ovo je posebno istinito u slučajevima kada funkcije zavise od vanjskih resursa kao što su API-ji, važno je stalno provoditi konzistentne testove, što se automatski dešava unutar algoritama za verifikaciju. U nb datoteci možete eksplicitno specificirati definicije (u odjeljku Dodatne informacije) i specificirati onoliko testova koliko je definirano bilo ulaznim i izlaznim nizovima ili objektima punog karaktera tipa VerificationTest, koliko vam odgovara. Pored toga, sistem stalno pokušava da pretvori primjere dokumentacije koje date u proces verifikacije (a ponekad to može biti prilično intenzivno resursima, na primjer, za funkciju čiji rezultat ovisi o slučajnim brojevima ili dobu dana).

Kao rezultat toga, spremište funkcija će imati brojne složenosti implementacije. Neki će biti samo jedan red koda, drugi mogu uključivati ​​hiljade ili desetine hiljada linija, vjerovatno koristeći mnoge pomoćne funkcije. Kada se isplati dodati funkciju koja zahtijeva vrlo malo koda za definiranje? U osnovi, ako za funkciju postoji dobro mnemonicko ime, koji bi korisnici lako razumjeli kada bi ga vidjeli u dijelu koda, tada se već može dodati. U suprotnom, vjerovatno je bolje jednostavno ponovo dodati kod u svoj program svaki put kada ga trebate koristiti.

Glavna svrha spremišta funkcija (kao što mu ime govori) je uvođenje novih karakteristika u jezik. Ako želite dodati nove podatke ili novi entiteti, koristiti Wolfram Data repozitorijum. Ali šta ako želite da uvedete nove tipove objekata za svoje proračune?

Zapravo postoje dva načina. Možda ćete htjeti uvesti novi tip objekta koji će se koristiti u novim funkcijama u spremištu funkcija. I u ovom slučaju, uvijek možete jednostavno zapisati njegov simbolički prikaz i koristiti ga prilikom unosa ili izlaza funkcija u spremištu funkcija.

Ali šta ako želite da predstavite objekat, a zatim definišete, kroz postojeće funkcije u jeziku Wolfram, da želite da radite sa njim? Wolfram Language je oduvijek imao lagani mehanizam za ovo, tzv UpValues. Uz neka ograničenja (posebno za funkcije koje ne mogu procijeniti njihove argumente), spremište funkcija vam omogućava da jednostavno predstavite funkciju i definirate vrijednosti za nju. (Podizanje očekivanja konzistentnosti prilikom kreiranja novog glavnog dizajna koji je u potpunosti integriran u Wolfram Language je općenito vrlo važna procedura koja se ne može postići jednostavnim povećanjem cijene projekta i nešto je što naša kompanija radi kao dio projekata za dugoročni razvoj jezika ovaj zadatak nije cilj koji se postavlja u sklopu razvoja spremišta).

Dakle, šta bi moglo biti u kodu funkcije u spremištu funkcija? Sve ugrađeno u Wolfram Language, naravno (barem ako ne predstavlja prijetnje do sigurnost i performanse samog programa, kao računarskog okruženja) kao i bilo koje funkcije iz skladišta funkcija. Međutim, postoje i druge funkcionalnosti: funkcija u spremištu funkcija može pozvati API ili in Wolfram Cloud, ili iz drugog izvora. Naravno, s tim su povezani određeni rizici. Zbog činjenice da ne postoje garancije da se API neće promijeniti, a funkcija u skladištu funkcija će prestati raditi. Da biste pomogli u identifikaciji ovakvih problema, postoji napomena na stranici dokumentacije (u odjeljku Zahtjevi) za svaku funkciju koja se oslanja na više od ugrađene funkcionalnosti jezika Wolfram. (Naravno, kada su u pitanju stvarni podaci, može doći do problema čak i s ovom funkcionalnošću – jer se podaci iz stvarnog svijeta stalno mijenjaju, a ponekad se čak i njihove definicije i struktura mijenjaju.)

Treba li sav kod za spremište karakteristika Wolfram biti napisan u Wolframu? Svakako, kod unutar vanjskog API-ja ne bi trebao biti napisan na Wolfram jeziku, koji čak ne čini kod jezika. U stvari, ako pronađete funkciju u gotovo bilo kojem vanjskom jeziku ili biblioteci, možete kreirati omotač koji vam omogućava da je koristite u spremištu Wolfram funkcija. (Obično biste trebali koristiti ugrađene funkcije za ovo ExternalEvaluate ili ExternalFunction u kodu jezika Wolfram.)

Pa koja je svrha ovoga raditi? U suštini, ovo vam omogućava da koristite ceo integrisani Wolfram Language sistem i čitav njegov ujedinjeni skup softverskih mogućnosti. Ako dobijete osnovnu implementaciju iz vanjske biblioteke ili jezika, tada možete koristiti bogatu simboličku strukturu jezika Wolfram za kreiranje zgodne funkcije najvišeg nivoa koja omogućava korisnicima da lako koriste bilo koju funkcionalnost koja je već implementirana. U najmanju ruku, ovo bi trebalo biti izvodljivo u idealnom svijetu u kojem postoje svi gradivni blokovi biblioteka za učitavanje itd., u kom slučaju bi njima automatski rukovao Wolfram Language. (Treba napomenuti da u praksi može doći do problema sa postavljanje vanjskih jezika specifični računarski sistem i skladištenje u oblaku mogu predstavljati dodatne bezbednosne probleme).

Usput, kada prvi put pogledate tipične eksterne biblioteke, one često izgledaju previše složene da bi bile pokrivene u samo nekoliko funkcija, ali u mnogim slučajevima, veliki dio složenosti dolazi od stvaranja infrastrukture potrebne za biblioteku i svih funkcija za podrži ga. Međutim, kada se koristi Wolfram Language, infrastruktura je obično već ugrađena u pakete, tako da nema potrebe detaljno izlagati sve ove funkcije podrške, već samo kreirati funkcije za „najviše“ funkcije specifične za aplikaciju u biblioteci .

"Ekosistem" baze znanja

Ako ste napisali funkcije koje redovno koristite, pošaljite ih u Wolfram Function Repository! Ako iz ovoga ne proizlazi nešto više (razvoj jezika), onda će vam i tada biti mnogo zgodnije koristiti funkcije za ličnu upotrebu. Međutim, logično je pretpostaviti da ako redovno koristite funkcije, možda će i drugim korisnicima biti korisne.

Naravno, možete se naći u situaciji u kojoj ne možete – ili ne želite – dijeliti svoje funkcije ili u slučaju da dobijete pristup privatnim izvorima informacija. Čak i u takvim slučajevima, možete jednostavno implementirati funkcije na svoj račun u oblaku, specificiranje prava pristup njima. (Ako vaša organizacija ima Wolfram Enterprise privatni oblak, tada će uskoro moći ugostiti vlastito privatno spremište funkcija, kojim se može upravljati iz vaše organizacije i podesiti hoće li ili ne prisiliti preglede da ih pregledaju korisnici trećih strana.)

Funkcije koje šaljete u spremište Wolfram funkcija ne moraju biti savršene; samo moraju biti korisni. Ovo je pomalo poput odjeljka "Greške" u klasičnoj Unix dokumentaciji - u "Odjeljku definicija" postoji odjeljak "Napomene autora" gdje možete opisati ograničenja, probleme itd. koje već znate o svojoj funkciji. Osim toga, kada svoju funkciju pošaljete u spremište, možete dodati bilješke o podnošenju koje će pročitati posvećeni tim kustosa.

Kada se funkcija objavi, njena stranica uvijek ima dvije veze na dnu: "Pošaljite poruku o ovoj funkciji"I"Diskutujte u Wolfram zajednici" Ako prilažete bilješku (npr. recite mi o greškama), možete označiti okvir koji kaže da želite da se vaša poruka i kontakt informacije dijele s autorom funkcije.

Ponekad samo želite da koristite funkcije iz skladišta Wolfram funkcija, kao što su ugrađene funkcije, bez gledanja u njihov kod. Međutim, ako želite da bacite pogled unutra, uvijek postoji dugme Notepad na vrhu. Kliknite na nju i dobićete sopstvenu kopiju originalne bilježnice definicija koja je dostavljena u spremište karakteristika. Ponekad ga možete koristiti samo kao primjer za svoje potrebe. Istovremeno, možete razviti i vlastitu modifikaciju ove funkcije. Možda želite da objavite ove funkcije koje ste pronašli iz spremišta na vašem računaru ili na svom nalogu za skladištenje u oblaku aphid, možda želite da ih pošaljete u bazu znanja o funkcijama, možda kao poboljšanu, proširenu verziju originalne funkcije.

U budućnosti planiramo da podržimo račvanje u Git stilu za spremišta funkcija, ali za sada pokušavamo da bude jednostavno i uvek imamo samo jednu prihvaćenu verziju svake funkcije ugrađene u jezik. Češće nego ne (osim ako programeri odustanu od održavanja funkcija koje su razvili i odgovore na korisničke podneske), originalni autor funkcije preuzima kontrolu nad ažuriranjima i šalje nove verzije, koje se zatim pregledavaju i, ako prođu proces pregleda , objavljeno na jeziku.

Razmotrimo pitanje kako funkcionira “verzioniranje” razvijenih funkcija. Upravo sada, kada koristite funkciju iz skladišta funkcija, njena definicija će biti trajno pohranjena na vašem računalu (ili na vašem računu u oblaku ako koristite oblak). Ako je dostupna nova verzija neke funkcije, sljedeći put kada je budete koristili, dobit ćete poruku koja vas obavještava o tome. A ako želite da ažurirate funkciju na novu verziju, možete to učiniti pomoću naredbe ResourceUpdate. ("Funkcija blob" zapravo pohranjuje više informacija o verzijama i planiramo to učiniti dostupnijim našim korisnicima u budućnosti.)

Jedna od lijepih stvari u vezi s Wolfram Function Repository je da bilo koji Wolfram Language program, bilo gdje, može koristiti funkcije iz njega. Ako se program pojavi u notesu, često je zgodno formatirati funkcije spremišta kao lako čitljive funkcije "binarnog objekta funkcije" (možda sa odgovarajućim skupom verzija).

Uvijek možete pristupiti bilo kojoj funkciji u spremištu funkcija koristeći tekst ResourceFunction[...]. I ovo je vrlo zgodno ako pišete kod ili skripte direktno za Wolfram Engine, na primjer, sa koristeći IDE ili uređivač tekstualnog koda (Posebno treba napomenuti da je spremište funkcija u potpunosti kompatibilno sa Besplatan Wolfram Engine za programere).

Как это работает?

Unutar funkcija u Wolfram repozitorijumu ovo je moguće koristeći potpuno isto sistemi resursa baze, kao u sva naša druga postojeća spremišta (skladište podataka, Neural Net Repository, zbirka demo projekata itd.), kao i svi drugi resursi sistema Wolfram, ResourceFunction na kraju zasnovan na funkciji ResourceObject.

Razmislite ResourceFunction:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Unutra možete vidjeti neke informacije koristeći funkciju informacije:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Kako funkcionira postavljanje funkcije resursa? Najjednostavniji je čisto lokalni slučaj. Evo primjera koji uzima funkciju (u ovom slučaju samo čistu funkciju) i definira je kao funkciju resursa za datu programsku sesiju:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Nakon što ste napravili definiciju, možete koristiti funkciju resursa:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Imajte na umu da se u ovoj funkcijskoj mrlji nalazi crna ikona Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram. To znači da se BLOB funkcija odnosi na funkciju resursa u memoriji definiranu za trenutnu sesiju. Funkcija resursa koja je trajno pohranjena na vašem računalu ili računu u oblaku ima sivu ikonu Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram. A tu je i narandžasta ikona za zvaničnu funkciju resursa u Wolfram Feature Repository Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram.

Dakle, šta se dešava kada koristite meni Proširi u beležnici sa definicijama? Prvo, uzima sve definicije u notesu i od njih stvara simboličku ResourceObject). (A ako koristite tekstualni IDE ili program, onda možete i eksplicitno kreirati ResourceObject)

Lokalna implementacija funkcije iz spremišta na vašem računaru se izvodi pomoću naredbe LocalCache za objekt resursa da ga sačuvate kao LocalObject na vašem sistemu datoteka. Postavljanje na račun u oblaku se vrši pomoću naredbe CloudDeploy za objekt resursa, a implementacija javnog oblaka je CloudPublish. U svim slučajevima ResourceRegister također se koristi za registraciju imena funkcije resursa, tako ResourceFunction["ime"] će raditi.

Ako kliknete na dugme Pošalji za Repozitorijum funkcija, šta se dešava ispod njega ResourceSubmit pozvani na objektu resursa. (A ako koristite interfejs za unos teksta, možete i pozvati ResourceSubmit direktno.)

Podrazumevano, podnošenje se vrši pod imenom koje je povezano sa vašim Wolfram ID-om. Ali ako podnosite aplikaciju u ime razvojnog tima ili organizacije, možete postavite poseban ID izdavača i umjesto toga ga koristite kao ime za interakciju sa svojim stavovima.

Nakon što dostavite bilo koju od svojih funkcija u bazu znanja funkcija, ona će biti stavljena na čekanje za pregled. Ako dobijete komentare kao odgovor, oni će obično biti u obliku tekstualne datoteke s dodanim dodatnim „ćelijama za komentare“. Uvijek možete provjeriti status vaše prijave posjetom portal za članove sistema resursa. Ali kada vaša funkcija bude odobrena, bit ćete obaviješteni (putem e-pošte) i vaša funkcija će biti objavljena u spremištu Wolfram funkcija.

Neke suptilnosti na poslu

Na prvi pogled može izgledati kao da možete samo uzeti bilježnicu s definicijama i doslovno je staviti u spremište funkcija, međutim, zapravo je uključeno dosta suptilnosti - a rukovanje njima zahtijeva prilično složeno metaprogramiranje, rukovanje simboličkom obradom kao kod koji definira funkciju, a definiran je i sam Notepad. Većina ovoga se dešava interno, iza scene, ali može imati neke implikacije koje vredi razumeti ako želite da doprinesete bazi znanja o funkcijama.

Prva neposredna suptilnost: kada ispunite bilježnicu definicija, možete jednostavno upućivati ​​na svoju funkciju svuda koristeći naziv kao što je MyFunction, koji izgleda kao regularno ime za funkciju u jeziku Wolfram, ali za dokumentaciju spremišta funkcija ovo je zamijenjeno ResourceFunction["Moja funkcija"] je ono što će korisnici zapravo koristiti kada rade s funkcijom.

Druga stvar je da kada kreirate funkciju resursa iz bilježnice definicija, sve ovisnosti uključene u definiciju funkcije moraju biti uhvaćene i eksplicitno uključene. Međutim, da biste osigurali da definicije ostanu modularne, morate sve staviti u jedinstveno imenskog prostora. (Naravno, funkcije koje sve to rade, nalaze se u spremištu funkcija.)

Obično nikada nećete vidjeti nikakav trag koda koji se koristi za konfiguriranje ovog imenskog prostora. Ali ako iz nekog razloga pozovete nedovoljno izvršeni simbol unutar svoje funkcije, tada ćete vidjeti da je ovaj simbol u internom kontekstu funkcije. Međutim, kada se obrađuje Notepad za definiciju, barem je simbol koji odgovara samoj funkciji podesiv za najbolji prikaz kao funkcionalni BLOB, a ne sirovi lik u internom kontekstu.

Repozitorijum funkcija je za definisanje novih funkcija. I ove funkcije mogu imati opcije. Često ovi parametri (npr. način ili Veličina slike) će se moći koristiti za ugrađene funkcije, kao i za one za koje već postoje ugrađeni simboli. Ali ponekad nova funkcija može zahtijevati nove opcije. Da bi se održala modularnost, ovi parametri moraju biti simboli definirani u jedinstvenom internom kontekstu (ili nešto poput čitavih funkcija resursa, to jest, sami). Radi jednostavnosti, spremište funkcija vam omogućava da definirate nove opcije u definicijama stringova. A radi praktičnosti korisnika, ove definicije (pod pretpostavkom da su koristile OptionValue и OptionsPattern) se također obrađuju tako da se prilikom korištenja funkcija parametri mogu specificirati ne samo kao stringovi, već i kao globalni simboli s istim imenima.

Većina funkcija jednostavno radi ono što bi trebalo da rade svaki put kada su pozvane, ali neke funkcije moraju biti inicijalizirane prije nego što se mogu pokrenuti u određenoj sesiji - a da bi se riješio ovaj problem, postoji odjeljak "Inicijalizacija" u odjeljku Definicija.

Funkcije iz spremišta mogu koristiti druge funkcije koje su već u spremištu kako bi postavile definicije za spremište funkcija koje uključuju dvije (ili više) funkcija koje upućuju jedna na drugu, morate ih implementirati u sesiji programa kako biste mogli; reference kao na njima ResourceFunction["ime"], tada možete kreirati kombinacije ovih funkcija koje su vam potrebne, primjere (nisam razumio) i dodati novu funkciju u spremište na osnovu onih koje su već objavljene ranije. (ili već ili ranije – obje riječi su nespretne)

Perspektive razvoja. Šta bi se trebalo dogoditi kada spremište postane stvarno veliko?

Danas upravo pokrećemo Wolfram Feature Repository, ali s vremenom očekujemo da će se njegova veličina i funkcionalnost dramatično povećati, a kako raste u razvoju, pojavit će se različiti problemi za koje već predviđamo da će se pojaviti.

Prvi problem se tiče imena funkcija i njihove jedinstvenosti. Repozitorijum funkcija je dizajniran na takav način da, poput ugrađenih funkcija u Wolfram Language, možete referencirati bilo koju datu funkciju jednostavnim navođenjem njenog imena. Ali to neizbježno znači da imena funkcija moraju biti globalno jedinstvena u cijelom spremištu, tako da, na primjer, može postojati samo jedan ResourceFunction["Moja omiljena funkcija"].

Ovo može izgledati kao veliki problem u početku, ali vrijedi shvatiti da je to u osnovi isti problem kao i za stvari poput internet domena ili društvenih medija. A činjenica je da sistem jednostavno treba da ima registratora - a to je jedna od uloga koju će naša kompanija obavljati za bazu znanja Wolfram funkcije. (Za privatne verzije spremišta, njihovi registratori mogu biti administratori.) Naravno, internet domena se može registrovati bez ičega na njoj, ali u spremištu funkcija ime funkcije može biti registrovano samo ako postoji stvarna definicija funkcija.

Dio naše uloge u upravljanju bazom znanja Wolfram funkcije je osigurati da je ime odabrano za funkciju logično s obzirom na definiciju funkcije i da slijedi konvencije o imenovanju Wolfram jezika. Imamo preko 30 godina iskustva u imenovanju ugrađenih funkcija na Wolfram jeziku, a naš tim kustosa će to iskustvo prenijeti iu repozitorijum funkcija. Naravno, uvijek postoje izuzeci. Na primjer, može se činiti poželjnijim imati kratko ime za neku funkciju, ali bolje je "braniti" dužim, konkretnijim imenom jer je manja vjerovatnoća da ćete naići na nekoga ko želi napraviti slično ime funkcije u budućnosti .

(Ovdje treba napomenuti da jednostavno dodavanje neke oznake člana radi razjašnjavanja funkcija neće imati željeni učinak. Jer osim ako ne insistirate da je oznaka uvijek dodijeljena, morat ćete definirati zadanu oznaku za bilo koju datu funkciju, a također i dodijeliti autora oznake, što bi opet zahtijevalo globalnu koordinaciju.)

Kako baza znanja o Wolframovim funkcijama raste, jedan od problema koji će se vjerovatno pojaviti je mogućnost otkrivanja funkcija, za koje sistem obezbjeđuje funkcija pretraživanja (a datoteke definicija mogu uključivati ​​ključne riječi, itd.). Za ugrađene funkcije u jeziku Wolfram, postoje razne vrste unakrsnih referenci u dokumentaciji koje pomažu u „reklamiranju“ funkcija. Funkcije u spremištu funkcija mogu referencirati ugrađene funkcije. Ali šta je sa obrnutom? Da bismo to uradili, eksperimentisaćemo sa različitim dizajnom da bismo prikazali funkcije spremišta na stranicama dokumentacije za ugrađene funkcije.

Za ugrađene funkcije u jeziku Wolfram postoji takozvani sloj detekcije koji obezbeđuje mreža "stranica pomoći", koji pružaju organizovane liste karakteristika koje se odnose na određena područja. Uvijek je teško pravilno izbalansirati man stranice, a kako Wolfram jezik raste, man stranice često moraju biti potpuno reorganizirane. Prilično je lako staviti funkcije iz spremišta u široke kategorije, pa čak i konzistentno rastaviti te kategorije, ali je mnogo vrednije imati pravilno organizovane jezičke referentne stranice. Još nije jasno kako ih najbolje kreirati za cijelu bazu znanja funkcije. Na primjer, CreateResourceObjectGallery u repozitorijumu karakteristika, svako može postaviti web stranicu koja sadrži svoje "odabire" iz spremišta:

Wolfram Function Repository: Otvorena pristupna platforma za proširenja jezika Wolfram

Repozitorijum Wolfram funkcija je konfigurisan kao trajni repozitorijum funkcija, gde će bilo koja funkcija u njemu uvek raditi. Naravno, nove verzije funkcija mogu postati dostupne, a očekujemo da će neke funkcije vremenom postati zastarjele. Funkcije će raditi ako se koriste u programima, ali njihove stranice dokumentacije će se povezivati ​​s novim, naprednijim funkcijama.

Wolfram Feature Repository je dizajniran da vam pomogne da brzo otkrijete nove funkcije i naučite nove načine korištenja Wolfram jezika. Sa velikim optimizmom će nešto od onoga što je istraženo u repozitorijumu funkcija na kraju imati smisla da postanu ugrađeni delovi jezgra Wolfram jezika. Tokom protekle decenije imali smo sličan set karakteristike koje su prvobitno uvedene u Wolfram | Alpha. A jedna od lekcija naučenih iz ovog iskustva je da postizanje standarda kvaliteta i konzistentnosti na koje se fokusiramo u svemu ugrađenom u Wolfram jezik zahtijeva puno rada, što je često teže od početnog napora za implementaciju ideje. Čak i tako, funkcija u bazi znanja funkcija može poslužiti kao vrlo koristan dokaz koncepta za buduću funkciju koja bi se eventualno mogla ugraditi u Wolfram jezik.

Najvažnija stvar ovdje je da je funkcija u spremištu funkcija nešto što je dostupno svakom korisniku za korištenje upravo sada. Moguće je da bi funkcija maternjeg jezika mogla biti mnogo bolja i učinkovitija, ali spremište funkcija bi omogućilo korisnicima da imaju pristup svim novim funkcijama odmah. I, što je najvažnije, ovaj koncept omogućava svima da dodaju bilo koje nove funkcije koje žele.

Ranije u istoriji Wolfram jezika, ova ideja ne bi funkcionisala tako dobro kao što je do sada, ali u ovoj fazi je toliko truda uloženo u jezik i tako duboko razumevanje principa jezičkog dizajna, da se sada čini prilično moguće da velika zajednica korisnika doda funkcije koje će održavati konzistentnost dizajna kako bi bile korisne za širok spektar korisnika.

Postoji nevjerovatan duh talenta(?) u korisničkoj zajednici Wolfram Language. (Naravno, ova zajednica uključuje mnoge vodeće ljude u istraživanju i razvoju u različitim oblastima.) Nadam se da će Wolfram Feature Repository pružiti efikasnu platformu za otključavanje i širenje ovog duha talenta. Samo zajedno možemo stvoriti nešto što će značajno proširiti područje na koje se može primijeniti računarska paradigma jezika Wolfram.

Za više od 30 godina, prešli smo dug put sa Wolfram jezikom. Sada zajedno, idemo još dalje. Snažno ohrabrujem sve uvažene korisnike Wolfram jezika širom svijeta da koriste funkcionalno spremište kao platformu za ovo, kao i novi softverski projekat kao što je Free Wolfram Engine for Developers.

izvor: www.habr.com

Dodajte komentar