Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Pozdrav, Habr! Predstavljam vam prijevod posta Stivena Wolfsruma „Wolfram Function Repository: Pokretanje otvorene platforme za proširenje Wolfram jezika“.

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Pretpostavke uspješnosti Wolfram jezika

Danas smo na pragu velikih dostignuća zajedno s programskim jezikom Wolfram Language. Samo tri tjedna prije pokrenuli smo besplatni Wolfram motor za programere, kako bismo pomogli našim korisnicima da integriraju Wolfram Language u svoje velike softverske projekte. Danas pokrećemo Wolfram funkcionalni repozitorij, kako bismo osigurali koordiniranu platformu za funkcije stvorene za proširenje Wolfram jezika, kao i otvaramo funkcionalni repozitorij za svakoga tko može doprinijeti razvoju našeg softverskog proizvoda.

Wolfram funkcionalni repozitorij je ono što je postalo moguće zahvaljujući jedinstvenim specifičnostima Wolfram jezika ne samo kao programskog jezika, već i kao puno funkcionalnog računalnog jezika. U tradicionalnim programskim jezicima dodavanje značajnih novih funkcija obično uključuje stvaranje cijelih dodatnih biblioteka koje mogu raditi ili ne raditi zajedno. Međutim, u jeziku Wolfram Language toliko je već ugrađeno u sam jezik, da postoji mogućnost značajnog proširenja njegove funkcionalnosti jednostavno dodajući nove funkcije koje se odmah integriraju u cjelovitu strukturu jezika.

Na primjer, već sada u Wolfram funkcionalnom repozitoriju postoji 532 nove funkcije strukturirane u 26 tematskih kategorija:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Slično više od 6000 standardnih funkcija, ugrađenih u Wolfram jezik, svaka funkcija iz repozitorija ima stranicu dokumentacije s detaljnim opisima i primjerima rada:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Da biste prešli na stranicu, kopirajte navedeni objekt (funkcionalni BLOB), zalijepite ga u unos i zatim pokrenite funkciju – ona je već ugrađena u Wolfram jezik i podržava se prema zadanim postavkama, počevši od verzije 12.0:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Treba napomenuti da prilikom obrade LogoQRCode Nije vam potrebno, na primjer, postavljati „biblioteku za obradu slika“ — budući da je u jeziku Wolfram Language već implementiran konzistentan i pažljivo algoritmiziran način obrade slika, koji se mogu odmah obraditi raznim grafičkim funkcijama jezika:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Nadam se da uz podršku divne i talentirane zajednice, koja se širi i raste (na osnovi jezika Wolfram Language) posljednjih nekoliko desetljeća. Repozitorij funkcija Wolfram značajno će proširiti raspon (potencijalno značajnih, specijaliziranih u raznim područjima znanosti i tehnike) funkcija dostupnih u jeziku u bliskoj budućnosti. Tako će se omogućiti korištenje kako sadržaja jezika (njegovih ugrađenih funkcija), tako i principa razvoja, koji se realiziraju na osnovi jezika. (Ovde treba napomenuti da Wolfram Language već ima više od 30 godina povijesti razvoja i stabilnog rasta).
Unutar funkcija iz repozitorija mogu se nalaziti manji ili prilično obimni delovi koda napisanog na jeziku Wolfram Language. Na primjer, to mogu biti pozivi vanjskim API-jima i servisima ili vanjskim bibliotekama na drugim jezicima. Jedinstvena osobina ovog pristupa je ta da, kada prelazite na funkcionalnost na razini korisnika, neće biti mogućih nesuglasica zbog toga što je ovaj pristup izgrađen na osnovi usklađene strukture jezika Wolfram Language — i svaka funkcija će automatski raditi ispravno — baš onako kako treba.
Okruženje i programska struktura repozitorija funkcija Wolfram su podešeni tako da svatko može doprinijeti zajedničkoj stvari na najjednostavniji i najpogodniji način — u suštini, jednostavno popunjavanjem tekstualne datoteke bilježnice (s proširenjem nb) WL. Ugrađene automatske funkcije omogućuju provjeru novih funkcija dodanih u repozitorij s ciljem njihove garantirane integracije u jezik. Naša kompanija se oslanja na širok spektar korisnika koji mogu integrirati svoje funkcije u jezik, a ne na velike složenosti novih funkcija — i iako ovde postoji proces provjere, ne insistiramo na nečemu što nalikuje pomnom analizom konstrukcije ili strogim standardima potpune i pouzdane nove funkcije korisnika, za razliku od temeljitijih provjera funkcija ugrađenih u jezgro jezika koje primenjujemo.

Ovaj pristup uključuje brojne kompromise i detalje, ali naš cilj je optimizirati repozitorij funkcija Wolfram kako za korisničko iskustvo, tako i kako bi nove korisničke funkcije dale značajan doprinos razvoju jezika. Kako se razvijamo, ne sumnjam da ćemo morati izumiti nove metode obrade i provjere funkcija ugrađenih u repozitorij, a to je posebno važno za organiziranje velikog broja funkcija i pronalaženje onih koje korisnici trebaju. Ipak, ohrabrujuće je što je put koji smo izabrali dobar početak. Osobno sam dodao nekoliko funkcija u prvotnu bazu. Mnoge od njih temelje se na kodu koji sam osobno razvijao tijekom dugog razdoblja. I potrošio sam samo nekoliko minuta da ih prenesem u repozitorij. Sada kada su u repozitoriju, konačno mogu – odmah i u bilo kojem trenutku koristiti te funkcije po potrebi, ne brinući se o pronalaženju datoteka, preuzimanju paketa itd.

Povećanje učinkovitosti uz smanjenje troškova

Čak i prije pojave Interneta postojali su načini za razmjenu koda Wolfram Language (naš prvi veliki centralizirani projekt bio je MathSource, stvoren za Mathematica 1991. godine na CD-ROM-u itd.). Zasigurno, pristup temeljen na repozitoriju funkcija Wolfram je snažnije i pouzdano sredstvo za ostvarivanje gore navedenih zadataka.

Više od 30 godina naša tvrtka marljivo radi na održavanju integriteta strukture jezika Wolfram, što je izuzetno važno kako bi jezik Wolfram postao ne samo programski jezik, već i potpun jezični jezik za računanje. Tako je suština pristupa implementaciji repozitorija funkcija Wolfram korištenje jedinstvenog pristupa programiranju i razvoju novih funkcija koje se postupno dodaju i uklapaju u okvir jezika radi mogućnosti njegovog razvoja i zajedničke evolucije.

U strukturi implementacije svake funkcije odvijaju se različiti računalni procesi. Važno je napomenuti da funkcija mora imati jasan i dosljedan izgled te dobru čitljivost za korisnika. U ovom kontekstu, ugrađene funkcije jezika Wolfram Language predstavljene su s više od 6000 uzastopnih primjera ispravnog programiranja funkcija (to su naši video pregledi programiranja uživo, koji uključuju stotine sati procesa izrade standardnih programa). Ovaj pristup na kraju omogućava da repozitorij funkcija Wolfram bude sposoban za dobar rad, upravo zbog strukturnog karaktera jezika Wolfram Language s velikim brojem dodatnih i raznovrsnih biblioteka koje su već ugrađene u jezik. Na primjer, ako imate funkciju koja obrađuje slike, ili rijetke nizove, ili molekularne strukture, kao i geografske podatke ili nešto drugo — u jeziku već postoji usklađeno simboličko predstavljanje, te vaša funkcija odmah postaje kompatibilna s drugim funkcijama u jeziku.

Kreiranje repozitorija koji će doista dobro funkcionirati je zanimljiv zadatak meta-programiranja. Na primjer, višak ograničenja u programu neće omogućiti postizanje potrebne unifikacije i univerzalnosti rada algoritma. Također, nedostatak funkcionalnih ograničenja neće omogućiti implementaciju dovoljno točne sekvence izvođenja algoritma. Nekoliko prethodnih primjera implementacije kompromisnih pristupa, koje je realizirala naša kompanija, radilo je prilično stabilno — to su: Projekt Wolfram Demonstracije, pokrenut 2007. godine i sada radi interaktivno putem interneta, s više od 12000 korisničkih interaktivnih demonstracija. U bazi podataka Wolfram ima više od 600 gotovih baza podataka koje se mogu koristiti u jeziku Wolfram Language, a skladište neuronskih mreža Wolfram puni se novim neuronskim mrežama gotovo svake sedmice (sada ih ima već 118) i odmah se povezuje putem funkcije NetModel u jeziku Wolfram Language.

Sve gore navedene primjere karakterizira načelna osobina – objekti i funkcije prikupljeni u projektu imaju vrlo visoku razinu strukturiranja i raspodjele procesa. Neosporno, detaljnost strukture onoga što predstavlja demonstraciju ili neuronsku mrežu ili nešto drugo može se znatno razlikovati, no temeljna struktura za bilo koji trenutni repozitorij uvijek ostaje nepromijenjena. Kakvo je vaše mišljenje, cijenjeni korisniče, o stvaranju takvog repozitorija koji dodaje proširenja jeziku Wolfram? Wolfram Language je dizajniran na način da bude izuzetno fleksibilan, stoga ga se može proširivati i mijenjati na bilo koji način. Ova okolnost je izuzetno važna za mogućnost brze izrade raznih velikih softverskih projekata na jeziku Wolfram Language. Ovdje treba napomenuti da će s povećanjem fleksibilnosti jezika neizbježno rasti i troškovi projekata realiziranih na tom jeziku. To se događa zbog toga što što više korisnik koristi takav jezik, to više dobiva specifične funkcionalnosti, ali ne treba zaboraviti da taj pristup može imati i negativne strane u smislu nemogućnosti osiguravanja dosljedne koherentnosti programskih modula.

U klasičnim programskim jezicima postoji rasprostranjeni problem s knjižnicama – ako, na primjer, koristite jednu knjižnicu, kod radi ispravno, no, ako pokušate koristiti više knjižnica, nema jamstva da će ispravno surađivati jedni s drugima. Također, u klasičnim programskim jezicima – za razliku od punog jezika izračuna – nedostaju mogućnosti jamčiti kontrolu nad postojanjem usklađenih ugrađenih prikaza za bilo koju funkciju ili tip podataka, osim njihovih osnovnih struktura. No, suštinski, problem je još veći nego što se isprva čini: ako netko gradi velikodušnu vertikalu funkcionalnosti, tada bez ogromnih troškova za centralizirano programiranje projekta, koje smo uložili u jezik Wolfram, nije moguće postići usklađenost. Stoga je važno da svi programski moduli uvijek ispravno rade zajedno.

Dakle, ideja Wolfram funkcijskog repozitorija je izbjegavanje problema koji je prethodno istaknut — jednostavno dodavanjem proširenja jeziku u obliku relativno malih komadića programske koda putem posebnih funkcija, čija je razvoj u obliku usklađenih modula mnogo lakši zadatak. Pri tome postoje specifičnosti programiranja koje se ne mogu lako postići korištenjem pojedinačnih funkcija (a naša tvrtka planira u bliskoj budućnosti objaviti optimizirani programski algoritam za pomoć u implementaciji velikih programskih paketa). Međutim, na temelju već ugrađenih funkcija u Wolfram Language jeziku, postoji mnoštvo mogućnosti za programiranje koje su realizirane koristeći pojedinačne funkcije. Ovdje je ideja da se uz relativno malo programskih napora mogu stvoriti nizovi novih i vrlo korisnih funkcija koje će osigurati dovoljnu dosljednost projekta, dok će biti dobro usklađene jedna s drugom, a osim toga, moći će se lako i široko koristiti u jeziku ubuduće.

Ovaj pristup, bez sumnje, predstavlja kompromis. Uz implementaciju većeg paketa, možete zamisliti potpuno novi svijet funkcionalnosti koji će biti iznimno moćan i koristan. U slučaju da je potrebno dobiti nove funkcionalne mogućnosti koje će se uklopiti u sve ostalo, ali niste spremni uložiti golemi trud u razvoj projekta, nažalost, to može dovesti do smanjenja opsega vašeg projekta. Ideja Wolfram funkcijskog repozitorija je ponuditi funkcionalnost koja određuje dio projekta, a ovaj pristup će omogućiti dodavanje moćnog funkcionaliteta, dok istovremeno pojednostavljuje održavanje dobre dosljednosti programskog projekta.

Pomoć pri dodavanju korisničkih funkcija u funkcijski repozitorij

Stručnjaci naše tvrtke naporno su radili kako bi doprinos funkcijama Wolfram repozitorija bio dovoljno jednostavan za korisnike. Na radnoj površini (već u verzije 12.0), Možete jednostavno proći kroz kartice glavnog izbornika: Datoteka > Novi > RepositoryItem > Funkcija Repository Item i dobit ćete „Definicijski bilježnica“ (programski unutar radnog okruženja. Također možete koristiti funkciju ekvivalent — CreateNotebook[„FunctionResource“]):

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Postoje dvije osnovne radnje koje morate izvršiti: prvo, zapravo napisati kod vaše funkcije, a drugo, napisati dokumentaciju koja ilustrira kako bi vaša funkcija trebala raditi.
Kliknite gumb „Otvorite uzorak“ na vrhu da biste vidjeli primjer onoga što trebate učiniti:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

U suštini, pokušavate stvoriti nešto slično ugrađenoj funkciji u jeziku Wolfram Language. Osim toga, ona može raditi nešto mnogo specifičnije od ugrađene funkcije. Pri tome će očekivanja u vezi s njenom potpunosti i pouzdanošću biti znatno niža.
Trebate postaviti ime za vašu funkciju koje će odgovarati pravilima imenovanja funkcija Wolfram Language. Osim toga, trebat će vam razviti dokumentaciju za vašu funkciju, slično ugrađenim funkcijama jezika. O tome ću detaljnije govoriti kasnije. Sada samo obratite pažnju na to da u nizu gumba na vrhu datoteke bilježnice definicija postoji gumb „Preporuke za stil“, koji objašnjava što učiniti, i gumb „Alati“, koji pruža alat za formatiranje dokumentacije vaše funkcije.
Kada se uvjerite da je sve ispunjeno ispravno i da ste spremni, kliknite gumb „Provjeri“. Sasvim je normalno da još niste razumjeli sve pojedinosti. Stoga će funkcija „Provjeri“ automatski izvršavati mnoge provjere stila i dosljednosti. Često će odmah predložiti da potvrdite i prihvatite ispravke (Na primjer: „Ova linija treba završiti dvotočkom“, i predložit će da unesete dvotočku). Ponekad će vas tražiti da dodate ili promijenite nešto sami. Kontinuirano ćemo dodavati nove mogućnosti automatskoj funkcionalnosti gumba „Provjeri“, ali njegova glavna svrha je osigurati da sve što šaljete u repozitorij funkcija već što bolje odgovara brojnim preporukama za stil.

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Dakle, nakon pokretanja opcije 'Check', možete koristiti 'Preview' ('Pregled'). 'Preview' kreira pregled dokumentacijske stranice koju ste odredili za svoju funkciju. Također možete stvoriti pregled datoteke koja je stvorena na vašem računalu ili za datoteku koja se nalazi u oblaku. Ako iz nekog razloga niste zadovoljni onim što vidite u pregledu, jednostavno se vratite nazad i izvršite potrebne ispravke, a zatim ponovno pritisnite gumb Preview.
Sada ste spremni postaviti svoju funkciju u repozitorij. Gumb Deploy vam nudi četiri opcije radnje:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

U ovoj fazi važno je to da možete poslati svoju funkciju u Wolframov repozitorij funkcija kako bi bila dostupna bilo kojem korisniku. Također možete objaviti svoju funkciju za ograničeni broj korisnika. Na primjer, možete stvoriti funkciju koja je lokalno postavljena na vašem računalu, tako da bude dostupna kada koristite upravo to računalo. Ili je možete postaviti u svoj oblačni račun, kako bi vam bila dostupna kada ste povezani s oblakom. Također možete javno objaviti (implementirati) funkciju putem svog oblačnog računa. Međutim, ona neće biti u centralnom repozitoriju funkcija Wolfram, ali možete dati nekome URL koji im omogućuje pristup vašoj funkciji iz vašeg računa. (U budućnosti ćemo također podržavati centralne repozitorije na razini cijele naše tvrtke).

Dakle, pretpostavimo da želite zapravo predati svoju funkciju u bazu znanja funkcija Wolfram. Da biste to učinili, pritiskate gumb 'Pošalji' u repozitorij. Što se tada događa? Vaša prijava odmah ulazi u red za razmatranje i odobrenje našeg posebnog tima kustosa.

Dokumentom kako vaša prijava prolazi kroz proces odobrenja (koji obično traje nekoliko dana), dobit ćete obavijesti o statusu njenog razmatranja, kao i mogućih prijedloga za njeno daljnje korištenje. No čim vaša funkcija bude odobrena, odmah će biti objavljena u Wolframovom repozitoriju funkcija i postat će dostupna za bilo kakvu upotrebu. (I to će se prikazivati u novinskim sažecima novih funkcija itd.)

Što bi trebalo biti u repozitoriju?

Treba napomenuti da naša tvrtka ima vrlo visoke standarde pune, pouzdanosti i opće kvalitete; od više od 6000 funkcija koje smo već integrirali u Wolframov jezik u posljednjih više od 30 godina, sve odgovaraju gore navedenim zahtjevima. Cilj Wolframovog repozitorija funkcija je iskoristiti cijelu strukturu i funkcionalnosti koje već postoje u jeziku Wolfram Language kako bi se dodalo što više lakših funkcija (tj. funkcija s višom učinkovitošću).

Naravno, funkcije u Wolframovom repozitoriju funkcija moraju slijediti principe razvoja jezika Wolfram Language — kako bi mogle potpuno komunicirati s drugim funkcijama i očekivanjima korisnika o tome kako bi funkcije trebale pravilno funkcionirati. Međutim, to ne znači da funkcije moraju imati istu razinu potpune ili pouzdanosti.

U ugrađenim funkcijama jezika Wolfram, mi marljivo radimo na tome da učinimo programske funkcije što općenitijima. U tom smislu, nije ništa loše što dođe funkcija koja jednostavno obrađuje neki vrlo specifičan, ali koristan slučaj u Wolframov repozitorij funkcija. Na primjer, funkcija SendMailFromNotebook može primati datoteke u određenom formatu i slati poštu na određeni način. PolygonalDiagram stvara dijagram samo s određenim bojama i oznakama itd.

Još jedan aspekt vezan uz ugrađene funkcije jest to da naša tvrtka ulaže sve napore u obradu svih netipičnih slučajeva, pravilnu obradu netočnog unosa itd. U repozitoriju funkcija sasvim je normalno da postoji posebna funkcija koja obrađuje osnovne slučajeve rješavanja zadatka i zanemaruje sve ostale.

Očigledno je da je bolje imati funkcije koje rade više i to bolje, ali optimizacija za repozitorij funkcija — za razliku od ugrađenih funkcija jezika Wolfram — trebala bi imati više funkcija povezanih s većim brojem funkcija, umjesto da se produbljuje u procese implementacije svake pojedine funkcije.

Sada hajde da razmotrimo primjer testiranja funkcija u repozitoriju. Očekivanja dosljednosti za takve funkcije prirodno su mnogo niža nego za ugrađene funkcije jezika. To je još važnije u slučajevima kada funkcije ovise o vanjskim resursima, poput API-ja, gdje je važno stalno provoditi dosljedne testove, što se automatski odvija unutar algoritama provjere. U datoteci nb možete izričito navesti definicije (u odjeljku „Dodatne informacije”) i odrediti onoliko testova koliko smatrate potrebnim, bilo na temelju ulaznih i izlaznih nizova ili punih simboličnih objekata tipa VerificationTest, koliko god smatrate potrebnim. Osim toga, sustav neprekidno nastoji pretvoriti vaše primjere dokumentacije u proces provjere (ponekad to može biti prilično resursno intenzivno, na primjer, za funkciju čiji rezultat ovisi o slučajnim brojevima ili doba dana).

Kao rezultat toga, u repozitoriju funkcija postojat će niz kompleksnosti implementacije. Neki će biti samo jedna linija koda, dok drugi mogu uključivati tisuće ili desetke tisuća linija, vjerojatno uz korištenje mnogih pomoćnih funkcija. Kada je isplativo dodati funkciju za koju je potrebno vrlo malo koda? U načelu, ako funkcija ima dobro mnemonicko ime, koje bi korisnici rado razumjeli videći to u dijelu koda, može se dodati. U suprotnom, vjerojatno je bolje ponovno zapisivati kod za vašu aplikaciju svaki put kada ga trebate koristiti.

Glavna svrha repozitorija funkcija (kako njegovo ime sugerira) je uvođenje novih funkcija u funkcionalnost jezika. Ako želite dodati nove podatke ili nove entitete, koristite Wolfram Data repozitorij. No što učiniti ako želite uvesti nove vrste objekata za vaše izračune?

Zapravo postoje dva puta. Možda biste htjeli uvesti novu vrstu objekta koja će se koristiti u novim funkcijama u repozitoriju funkcija. U tom slučaju, uvijek možete jednostavno zapisati njegovo simboličko predstavljanje i koristiti ga prilikom unošenja ili izlaza funkcija u repozitoriju funkcija.

Ali što učiniti ako želite predstaviti objekt, a zatim definirati ga kroz postojeće funkcije u jeziku Wolfram Language, koje bi trebale raditi s njim? Za to je Wolfram Language uvijek imao jednostavan mehanizam koji se zove UpValues. Uz određena ograničenja (osobito za funkcije koje ne mogu ocijeniti svoje argumente), repozitorij funkcija omogućuje vam jednostavno predstaviti funkciju i definirati vrijednosti za nju. (Kako bi se povećala očekivanja dosljednosti pri stvaranju nove važne konstrukcije, koja je potpuno integrirana svuda u jeziku Wolfram Language, - to je obično vrlo važna procedura koju nije moguće postići samo povećanjem troškova projekta i to je ono što naša kompanija radi unutar projekata dugoročnog razvoja jezika; ovaj zadatak nije cilj koji se postavlja unutar razvoja repozitorija).

Dakle, što bi moglo biti u kodu funkcija u repozitoriju funkcija? Sve što je ugrađeno u jezik Wolfram Language, naravno (barem ako to ne predstavlja prijetnje za sigurnosti i funkcionalnosti same aplikacije, kao računarskog okruženja) kao i svaka funkcija iz repozitorija funkcija. Istodobno postoje i druge mogućnosti funkcioniranja: funkcija u repozitoriju funkcija može pozivati API, ili iz Wolfram Cloud, ili iz drugog izvora. Naravno, postoje određeni rizici povezani s tim. Zbog nedostatka garancija da se API neće promijeniti, a funkcija u skladištu funkcija pri tome prestaje raditi. Za identifikaciju takvih problema postoji napomena na stranici dokumentacije (u odjeljku «Zahtjevi») za bilo koju funkciju koja se oslanja ne samo na ugrađenu funkcionalnost Wolfram Language. (Naravno, kada su u pitanju stvarni podaci, mogu postojati problemi čak i s takvom funkcionalnošću — jer stvarni podaci o svijetu se neprekidno mijenjaju, a ponekad čak i mijenjaju svoja definicija i struktura.)

Treba li sav kod za repozitorij funkcija Wolfram biti napisan na jeziku Wolfram? Definitivno, kod unutar vanjskog API-ja ne bi trebao biti napisan na jeziku Wolfram, što zapravo ne čini kod jezika. U stvari, ako pronađete funkciju gotovo na bilo kojem vanjskom jeziku ili biblioteci, možete stvoriti omotač koji će omogućiti njezino korištenje u repozitoriju funkcija Wolfram. (Obično se za to koriste ugrađene funkcije ExternalEvaluate ili ExternalFunction u kodu jezika Wolfram.)

Pa koja je smisao raditi to? U osnovi, to omogućuje korištenje cijelog integriranog sustava Wolfram Language i cijelog njenog unificiranog skupa softverskih mogućnosti. U slučaju da dobivate osnovnu implementaciju iz vanjske biblioteke ili jezika, tada možete iskoristiti bogatu simboličku strukturu jezika Wolfram Language za stvaranje zgodne funkcije višeg nivoa koja omogućuje korisnicima dovoljno lako korištenje svake već implementirane funkcionalnosti. Barely, to bi trebalo biti izvedivo u idealnom svijetu gdje postoje svi sastavni elementi učitavanja biblioteka i slično, u ovom slučaju oni će se automatski rješavati pomoću Wolfram Language. (Treba napomenuti, da u praksi mogu postojati problemi s konfiguracijom vanjskih jezika u specifičnom računalu, a u oblaku mogu se pojaviti dodatni problemi s sigurnošću).

Zanimljivo, kada prvi put analizirate tipične vanjske biblioteke, često djeluju previše složeno da bi se mogle obuhvatiti samo nekoliko funkcija, no u mnogim slučajevima velika većina složenosti proizašla je iz izrade infrastrukture potrebne za biblioteku i svih funkcija za njezinu podršku. Međutim, kada koristite jezik Wolfram Language, infrastruktura je obično već ugrađena u pakete, stoga nije potrebno detaljno razrađivati sve te funkcije podrške, već je potrebno samo stvoriti funkcije za nekoliko „najvažnijih“ funkcija usmjerenih na aplikacije u biblioteci.

„Ekosustav“ baze znanja

Ako ste napisali funkcije koje stalno koristite, pošaljite ih u repozitorij funkcija Wolfram! Ako iz toga na kraju ne bude ništa više (razvoj jezika), tada će vam i dalje biti mnogo lakše koristiti funkcije za osobnu uporabu. Međutim, razumno je pretpostaviti da, ako stalno koristite funkcije, možda će ih i drugi korisnici smatrati korisnima.

Naravno, možete se naći u situaciji kada nemate mogućnost – ili ne želite – dijeliti svoje funkcije ili u slučaju pristupa privatnim informacijskim izvorima. Čak i u takvim slučajevima možete jednostavno implementirati funkcije u svom vlastitom računu u oblaku, navodeći prava pristupa njima. (Ako vaša organizacija ima privatni oblak Wolfram Enterprise, uskoro će moći postaviti vlastiti privatni repozitorij funkcija koji se može administrirati iz vaše organizacije i postavljati obavezni pregled prikaza ili ne za vanjske korisnike.)

Funkcije koje šaljete u repozitorij funkcija Wolfram ne moraju biti savršene; samo trebaju biti korisne. To je donekle slično odjeljku „Greške“ u klasičnoj dokumentaciji Unix-a – u „Odjeljku definicija“ postoji odjeljak „Zabilješke autora“ u kojem možete opisati ograničenja, probleme itd. za koje već znate o svojoj funkciji. Također, kada pošaljete svoju funkciju u repozitorij, možete dodati komentare uz slanje, koje će pročitati posebna ekipa kustosa.

Nakon objave funkcije, njezina stranica uvijek ima dvije poveznice na dnu: „Pošaljite poruku o ovoj funkciji» i «Raspravite u zajednici Wolfram». Ako dodajete oznaku (na primjer, da me obavijestite o pogreškama), možete označiti okvir u kojem stoji da želite da vaša poruka i kontakt informacije budu proslijeđene autoru funkcije.

Ponekad je potrebno samo koristiti funkcije iz Wolframovog repozitorija funkcija, poput ugrađenih funkcija, bez gledanja u njihov kod. Međutim, ako želite „zaviriti unutra“, na vrhu uvijek postoji gumb „Bilježnica“. Pritisnite ga i dobit ćete vlastitu kopiju izvorne bilježnice definicija koja je poslana u repozitorij funkcija. Ponekad je možete koristiti samo kao primjer za svoje potrebe. Također možete razviti svoju vlastitu modifikaciju te funkcije. Možda biste željeli pohraniti te funkcije koje ste pronašli iz repozitorija na svom računalu ili u svom oblaku, možda ćete ih htjeti poslati u bazu znanja funkcija, možda kao poboljšanu, dopunjenu verziju izvorne funkcije.

U budućnosti planiramo podržavati grane u Git stilu za repozitorije funkcija, ali trenutno pokušavamo to pojednostaviti, te imamo uvijek samo jednu općeprihvaćenu verziju svake funkcije ugrađene u jezik. Najčešće (osim ako se programeri ne odriču održavanja funkcija koje su razvili i ne odgovaraju na poruke korisnika), izvorni autor funkcije dobiva kontrolu nad ažuriranjima i šalje nove verzije, koje potom bivaju provjerene i, ako prođu proces provjere, objavljuju se u jeziku.

Razmotrimo pitanje kako funkcionira „verzionost“ razvijenih funkcija. U ovom trenutku, kada koristite funkciju iz repozitorija funkcija, njena definicija će se stalno čuvati na vašem računalu (ili u vašem oblaku ako koristite oblak). Ako se pojavi nova verzija funkcije, prilikom sljedećeg korištenja primit ćete obavijest o tome. I ako želite ažurirati funkciju na novu verziju, to možete učiniti pomoću naredbe ResourceUpdate. ("Funkcionalni BLOB objekt" zapravo pohranjuje više informacija o verzijama, a u budućnosti planiramo učiniti to dostupnijim našim korisnicima.)

Jedna od sjajnih značajki Wolfram funkcijskog repozitorija je to što bilo koji Wolfram Language program može koristiti funkcije iz njega. Kada se program pojavljuje u bilježnici, često je zgodno formatirati funkcije repozitorija kao lako čitljive "funkcionalne binarne objekte" (možda uz odgovarajući set verzija).

Uvijek možete pristupiti bilo kojoj funkciji repozitorija funkcija koristeći tekstualnu ResourceFunction […]. A to je vrlo zgodno ako pišete kod ili skripte izravno za Wolfram Engine, na primjer, uz pomoć IDE-a ili tekstualnog urednika koda (posebno valja napomenuti da je repozitorij funkcija potpuno kompatibilan s Besplatnim Wolfram Engineom za programere).

Kako to radi?

Unutar funkcija u Wolfram repozitoriju to je moguće korištenjem točno iste sustava resursa baze, kao i u svim našim postojećim repozitorijima (pohrana podataka, Neural Net Repository, kolekcija demonstracijskih projekata itd.), kao i svi drugi sustavni resursi Wolfram, ResourceFunction na kraju se temelji na funkciji ResourceObject.

Razmotrit ćemo ResourceFunction:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Unutar možete vidjeti neke informacije koristeći funkciju Information:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

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

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

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

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Imajte na umu da u ovom BLOB objektu funkcije postoji crna ikona Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika. To znači da BLOB funkcija se odnosi na funkciju resursa u memoriji, definiranu za trenutnu sesiju. Za funkciju resursa koja je trajno pohranjena na vašem računalu ili u oblačnom računu, postoji siva ikona Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika. A za službenu funkciju resursa u Wolfram funkcijskom repozitoriju postoji narančasta ikona Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika.

Dakle, što se događa kada koristite izbornik "Razvoj" u bilježnici definicije? Prvo, uzima sve definicije u bilježnici i iz njih stvara simbolički ResourceObject). (A ako koristite tekstualni IDE ili program, tada možete izričito stvoriti ResourceObject)

Lokalno postavljanje funkcije iz repozitorija na vašem računalu izvodi se pomoću naredbe LocalCache za resursni objekt kako biste ga sačuvali kao LocalObject u vašem datotečnom sustavu. Postavljanje u oblaku na vašem računu vrši se naredbom CloudDeploy za resursni objekt, dok se javno postavljanje u oblaku izvodi — CloudPublish. U svim slučajevima ResourceRegister također se koristi za registraciju imena funkcije resursa, tako da ResourceFunction[«name»] će raditi.

Ako pritisnete gumb Submit za Function Repository, što se ispod njega događa ResourceSubmit poziva se na resursnom objektu. (I ako koristite tekstualno sučelje, također možete pozvati ResourceSubmit izravno.)

Zadano, slanje se izvršava pod imenom povezanim s vašim Wolfram ID-om. No, ako šaljete zahtjev u ime grupe ili organizacije, možete postaviti zasebni identifikator izdavača i koristiti ga kao ime za interakciju s vašim prikazima.

Nakon što pošaljete bilo koju od vaših funkcija u bazu znanja funkcija, ona ulazi u red čekanja za pregled. Ako primite komentare kao odgovor, obično će biti u obliku tekstualne datoteke s dodanim dodatnim «ćelijama komentara». Uvijek možete provjeriti status svog zahtjeva odlaskom na portal sudionika sustava resursa. No, kada vaša funkcija bude odobrena, bit ćete obaviješteni (putem e-pošte) i vaša funkcija će biti objavljena u Wolframovom repozitoriju funkcija.

Neki detalji u radu

Na prvi pogled može se steći dojam da se jednostavno može uzeti bilješka s definicijama i doslovno je staviti u repozitorij funkcija, međutim, zapravo postoji dosta finih detalja — i za njihovo obrađivanje potrebno je izvesti prilično složeno meta-programiranje, simbolički obrađujući kako kod koji definira funkciju, tako i samu bilješku s definicijom. Većina toga događa se unutar, tj. „iza kulisa“, ali to može imati neke posljedice koje vrijedi razumjeti ako planirate doprinijeti bazi znanja funkcija.

Prva neposredna sitnica: Kada ispunjavate 'Blok za definicije', možete jednostavno referencirati svoju funkciju svuda, koristeći ime poput MyFunction, što izgleda kao obično ime funkcije u Wolfram jeziku, ali se za dokumentaciju repozitorija funkcija ovo zamjenjuje ResourceFunction[„MyFunction“] – to je ono što će korisnici zapravo koristiti kada rade s funkcijom.

Druga sitnica: kada kreirate funkciju resursa iz Bloka definicija, sve zavisnosti uključene u definiciju funkcije moraju biti fiksirane i eksplicitno uključene. Međutim, da bi se osiguralo da definicije ostanu modularne, sve treba staviti u jedinstveni namespaces. (Naravno, da funkcije koje sve to rade, nalaze se u repozitoriju funkcija.)

Obično nikada nećete vidjeti nikakve tragove rada koda koji se koristi za podešavanje ovog prostora imena. Ali ako iz bilo kojeg razloga pozovete nedovršeni simbol unutar svoje funkcije, vidjet ćete da je taj simbol u unutrašnjem kontekstu funkcije. Međutim, pri obradi Bloka definicija, barem simbol koji odgovara samoj funkciji, podešava se za najbolje prikazivanje kao funkcionalni BLOB, a ne sirovi simbol u unutrašnjem kontekstu.

Repozitorij funkcija je namijenjen definiranju novih funkcija. I te funkcije mogu imati opcije. Često će ove opcije (na primjer, Metoda ili ImageSize) imati mogućnost korištenja za ugrađene funkcije, kao i za one za koje već postoje ugrađeni simboli. Ali ponekad novoj funkciji mogu biti potrebne i nove opcije. Da bi se sačuvala modularnost, potrebno je da ove opcije budu simboli definirani u jedinstvenom unutrašnjem kontekstu (ili nešto poput cijelih funkcija resursa, tj. same po sebi). Radi jednostavnosti, repozitorij funkcija omogućava postavljanje novih opcija u definicijama u obliku stringova. I za praktičnost korisnika, ove definicije (pod uvjetom da su koristili OptionValue i OptionsPattern) takođe se obrađuju na način da se prilikom korištenja funkcija, parametri mogu postaviti ne samo kao stringovi, već i kao globalni simboli s istim imenima.

Većina funkcija jednostavno radi ono što trebaju raditi svaki put kada ih pozovete, ali neke funkcije trebaju biti inicijalizirane prije nego što mogu raditi u određenoj sesiji — i za rješavanje ovog problema postoji odjeljak "Inicijalizacija" u dijelu "Definicija".

Funkcije iz repozitorija mogu koristiti druge funkcije koje se već nalaze u repozitoriju kako bi postavile definicije za repozitorij funkcija, uključujući dvije (ili više) funkcije koje se međusobno referenciraju. Da bi se to postiglo, potrebno ih je razviti u svojoj radnoj sesiji, tako da ih možete zvati kao ResourceFunction[«name»], tada možete stvoriti potrebne kombinacije tih funkcija, primjere i dodati novu funkciju u repozitorij na temelju već prethodno postavljenih.

Perspektive razvoja. Što se mora dogoditi kada repozitorij postane stvarno velik?

Danas samo pokrećemo repozitorij funkcija Wolfram, ali s vremenom očekujemo da će njegova veličina i funkcionalnost naglo rasti, a s rastom će se pojaviti razne probleme koje, kako već pretpostavljamo, možemo očekivati.

Prvi problem odnosi se na imena funkcija i njihovu jedinstvenost. Repozitorij funkcija je projektiran tako da, poput ugrađenih funkcija u jeziku Wolfram Language, možete referencirati bilo koju funkciju jednostavno tako da navedete njezino ime. No, to neizbježno znači da imena funkcija moraju biti globalno jedinstvena kroz cijeli repozitorij, tako da, na primjer, u repozitoriju može postojati samo jedna ResourceFunction[«MyFavoriteFunction»].

Na prvi pogled to se može činiti velikim problemom, ali treba shvatiti da je to uglavnom isti problem kao i za stvari poput internetskih domena ili oznaka društvenih mreža. A stvar je u tome da sustav jednostavno treba imati registratora — i to je jedna od uloga koju će naša tvrtka obavljati za bazu znanja funkcija Wolfram. (Za privatne verzije repozitorija, njihovi registratori mogu biti administratori.) Naravno, internetska domena može biti registrirana, a da na njoj ne bude ništa, ali u repozitoriju funkcija ime funkcije može biti registrirano samo ako postoji stvarna definicija funkcije.

Kao dio naše uloge u upravljanju bazom znanja funkcija Wolfram, osiguravamo da naziv odabran za funkciju bude logičan s obzirom na definiciju funkcije, kao i da bude u skladu s pravilima imenovanja Wolfram Language. Imamo više od 30 godina iskustva u imenovanju ugrađenih funkcija na Wolfram Language, a naš tim kuratora će prenijeti to iskustvo i u repozitorij funkcija. Naravno, uvijek postoje iznimke. Na primjer, može se činiti poželjnim imati kratak naziv za neku funkciju, ali je bolje 'zaštititi se' dužim, specifičnijim nazivom, jer tada postoji manja vjerojatnost da će netko u budućnosti htjeti stvoriti sličan naziv funkcije.

(Ovdje treba napomenuti da jednostavno dodavanje bilo kojeg oznake sudionika za uklanjanje dvosmislenosti funkcija neće donijeti očekivani učinak. Jer, ako se ne insistira na tome da se oznaka uvijek dodijeli, trebati će odrediti oznaku prema zadanim postavkama za bilo koju određenu funkciju, kao i istaknuti oznake autora, što opet zahtijeva globalnu koordinaciju.)

Kako se količina baze znanja funkcija Wolfram povećava, jedan od problema koji će sigurno nastati je otkrivenost funkcija, za to sustav predviđa funkciju pretraživanja (a datoteke definicija mogu uključivati ključne riječi itd.). Za ugrađene funkcije u Wolfram Language, dokumentacija sadrži razne međusobne veze koje pomažu 'oglašavanju' funkcija. Funkcije u repozitoriju funkcija mogu se povezivati s ugrađenim funkcijama. A što je s obratnim smjerom? Za to planiramo eksperimentirati s različitim shemama kako bismo predstavili funkcije repozitorija na stranicama dokumentacije za ugrađene funkcije.

Za ugrađene funkcije u Wolfram Language postoji takozvani nivo otkrivenosti koji osigurava mreža 'informativnih stranica', koji pružaju organizirane popise funkcija povezane s određenim područjima. Uvijek je teško pravilno uravnotežiti stranice priručnika, a kako je jezik Wolfram rastao, stranice priručnika često su morale biti potpuno reorganizirane. Prilično je jednostavno staviti funkcije iz repozitorija u široke kategorije i čak dosljedno podijeliti te kategorije, ali puno je vrijednije imati ispravno organizirane stranice priručnika jezika. Još uvijek nije jasno kako najbolje stvoriti njih za cijelu bazu znanja funkcija. Na primjer, CreateResourceObjectGallery u repozitoriju funkcija svatko može postaviti web stranicu koja sadrži svoje 'izbore' iz repozitorija:

Wolfram Function Repository: otvoreni pristup platformi za proširenja Wolfram jezika

Repozitorij funkcija Wolfram postavljen je kao trajno skladište funkcija, gdje će svaka funkcija u njemu uvijek raditi. Naravno, mogu se pojaviti nove verzije funkcija i očekujemo da će neke funkcije s vremenom zasigurno zastarjeti. Funkcije će raditi ako se koriste u programima, ali njihove stranice dokumentacije će se povezivati s novim, naprednijim funkcijama.

Repozitorij funkcija Wolfram namijenjen je brzom dobivanju novih funkcija i istraživanju novih mogućnosti korištenja jezika Wolfram. S velikim optimizmom nadamo se da će dio onoga što je istraženo u repozitoriju funkcija na kraju imati smisla postati ugrađeni dijelovi glavnog jezika Wolfram Language. Tijekom proteklog desetljeća imali smo sličan skup funkcija koje su izvorno predstavljene u Wolfram | Alpha. I jedna od lekcija proizašlih iz ovog iskustva je ta da za postizanje standarda kvalitete i dosljednosti kojima se fokusiramo u svemu što je ugrađeno u jezik Wolfram, potrebno je mnogo rada, koji je često složeniji od početnih napora za uvođenje ideje. No, čak i tada, funkcija u bazi znanja funkcija može poslužiti kao vrlo korisna paradigma buduće funkcije koja bi na kraju mogla biti ugrađena u jezik Wolfram.

Najvažnija stvar ovdje jest da su funkcije u repozitoriju funkcija dostupne svakom korisniku odmah. Moguće je da ugrađena funkcija jezika može biti mnogo bolja i učinkovitija, ali repozitorij funkcija omogućuje korisnicima trenutni pristup svim novim funkcijama. I, što je posebno važno, ovaj koncept omogućuje svakome da dodaje svoje nove funkcije.

Ranije u povijesti jezika Wolfram ova ideja ne bi uspjela onako kako uspijeva sada, ali u ovoj fazi je u jezik već uloženo toliko truda, kao i duboko razumijevanje načela dizajna jezika, da se sada čini vrlo mogućim da veliko zajedništvo korisnika dodaje funkcije koje će podržavati dosljednost projekta kako bi ih učinilo korisnima za širu publiku.

U zajednici korisnika Wolfram Language postoji nevjerojan duh talenta. (Naravno, ova zajednica uključuje mnoge vodeće stručnjake u istraživanju i razvoju u različitim područjima.) Nadam se da će Wolfram repozitorij funkcija pružiti učinkovitu platformu za otkrivanje i širenje ovog duha talenta. Samo zajedno možemo stvoriti nešto što će značajno proširiti područje primjene računalne paradigme jezika Wolfram.

Tijekom više od 30 godina prošli smo dug put s jezikom Wolfram. Sada, zajedno, krenimo još dalje. Energično pozivam sve cijenjene korisnike jezika Wolfram širom svijeta da iskoriste funkcionalni repozitorij kao platformu, kao i novi softverski projekt kao što je Free Wolfram Engine za programere.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster