Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Hej, Habr! Jag presenterar för er uppmÀrksamhet en översÀttning av Stephen Wolframs inlÀgg "The Wolfram Function Repository: Lansering av en öppen plattform för att utöka Wolfram-sprÄket".

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

FörutsÀttningar för konsistensen i Wolfram-sprÄket

Idag stÄr vi pÄ tröskeln till stora prestationer tillsammans med programmeringssprÄket Wolfram sprÄk. För bara tre veckor sedan lanserade vi gratis Wolfram-motor för utvecklareför att hjÀlpa vÄra anvÀndare att integrera Wolfram-sprÄket i sina storskaliga programvaruprojekt. Idag lanserar vi Wolfram funktionsförrÄd, för att tillhandahÄlla en samordnad plattform för funktioner som skapats för att utöka Wolfram-sprÄket, och vi öppnar Àven ett arkiv med funktioner för alla som kan bidra till utvecklingen av vÄr mjukvaruprodukt.

Wolfram Function Repository Àr nÄgot som möjliggörs av Wolfram-sprÄkets unika natur, inte bara som ett programmeringssprÄk, utan ocksÄ som ett fullskaligt datorsprÄk. I traditionella programmeringssprÄk innebÀr att lÀgga till betydande ny funktionalitet vanligtvis att skapa hela ytterligare bibliotek som kanske eller kanske inte fungerar nÀr de anvÀnds tillsammans. Men pÄ Wolfram-sprÄket sÄ mycket Àr redan inbyggt i sjÀlva sprÄket, att det Àr möjligt att avsevÀrt utöka dess funktionalitet genom att helt enkelt lÀgga till nya funktioner som omedelbart integreras i hela sprÄkets holistiska struktur.

Till exempel innehÄller Wolfram-funktionsförrÄdet redan 532 nya funktioner strukturerad i 26 tematiska kategorier:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

LikasÄ mer Àn 6000 standardfunktioner, inbyggd i Wolfram-sprÄket, har varje funktion frÄn arkivet en dokumentationssida med en detaljerad beskrivning av dem och exempel pÄ arbete:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

För att komma till sidan, kopiera objektet ovan (funktionen BLOB), klistra in det i inmatningsraden och kör sedan funktionen - den Àr redan inbyggd i Wolfram-sprÄket och stöds som standard frÄn och med version 12.0:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Det bör hÀr noteras att vid bearbetning LogoQRCod Du behöver till exempel inte sÀtta upp ett "bildbehandlingsbibliotek" - eftersom vi redan har implementerat ett konsekvent och noggrant algoritmiskt sÀtt i Wolfram-sprÄket bildbehandling, som omedelbart kan bearbetas av olika grafiska sprÄkfunktioner:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Jag hoppas det med stödet underbar och begÄvad gemenskap, som har vÀxt och expanderat (baserat pÄ Wolfram-sprÄket) under de senaste decennierna. Wolfram-funktionsförrÄdet kommer att göra det möjligt för en överskÄdlig framtid att avsevÀrt utöka utbudet av (möjligen potentiellt betydande, specialiserade pÄ olika vetenskaps- och teknikomrÄden) tillgÀngliga funktioner pÄ sprÄket. DÀrmed blir det möjligt att anvÀnda bÄde innehÄllet i sprÄket (dess inbyggda funktioner) och utvecklingsprinciper, som implementeras utifrÄn sprÄket. (Det bör noteras hÀr att Wolfram-sprÄket redan har mer Àn 30-Ärig historia av utveckling och stabil tillvÀxt).
Funktioner frÄn förvaret kan innehÄlla smÄ eller stora bitar av kod skrivna pÄ Wolfram-sprÄket. Det kan till exempel vara samtal externa API:er och tjÀnster eller externa bibliotek pÄ andra sprÄk. Det unika med detta tillvÀgagÄngssÀtt Àr att nÀr du borrar ner till funktionalitet pÄ anvÀndarnivÄ kommer det inte att finnas nÄgra potentiella inkonsekvenser eftersom tillvÀgagÄngssÀttet Àr byggt ovanpÄ den konsekventa strukturen i Wolfram-sprÄket - och varje funktion kommer automatiskt att fungera korrekt - precis som tÀnkt. hon borde.
Skalet och programmeringsstrukturen för Wolfram Feature Repository Àr utformad sÄ att alla kan bidra till den gemensamma saken pÄ det enklaste och bekvÀmaste sÀttet för dem - faktiskt bara genom att fylla i anteckningsblockstextfilen (med tillÀgg nb) WL. Inbyggda automatiska funktioner lÄter dig kontrollera nya funktioner som lagts till i förvaret för att sÀkerstÀlla att de integreras i sprÄket. VÄrt företag satsar pÄ det breda utbudet av anvÀndare som kan integrera sina funktioner i sprÄket, snarare Àn pÄ den stora komplexiteten i nya funktioner - och Àven om det finns en granskningsprocess, insisterar vi inte pÄ nÄgot liknande noggrann designanalys eller strikta standarder för fullstÀndigheten och tillförlitligheten av nya anvÀndarfunktioner, i motsats till de mer rigorösa testerna av funktioner inbyggda i det grundlÀggande sprÄket som vi anvÀnder.

Det finns mÄnga avvÀgningar och detaljer i detta tillvÀgagÄngssÀtt, men vÄrt mÄl Àr att optimera Wolfram-funktionsförrÄdet bÄde för anvÀndarupplevelsen och för att sÀkerstÀlla att nya anvÀndarfunktioner bidrar meningsfullt till utvecklingen av sprÄket. NÀr vi vÀxer tvivlar jag inte pÄ att vi kommer att behöva uppfinna nya metoder för att bearbeta och validera funktioner inbyggda i arkivet, inte minst för att organisera ett stort antal funktioner och hitta de som anvÀndarna behöver. Det Àr dock uppmuntrande att den vÀg vi har valt Àr en bra början. jag personligen lagt till flera funktioner till den ursprungliga databasen. MÄnga av dem Àr baserade pÄ kod som jag personligen har utvecklat under ganska lÄng tid. Och det tog mig bara nÄgra minuter att skicka dem till förvaret. Nu nÀr de finns i förvaret kan jag Àntligen - omedelbart och nÀr som helst - anvÀnda dessa funktioner efter behov, utan att behöva oroa mig för att söka efter filer, ladda ner paket osv.

Öka effektiviteten samtidigt som kostnaderna sĂ€nks

Redan innan Internet fanns det sÀtt att dela Wolfram Language-kod (vÄrt första stora centraliserade projekt var MathSource, skapad för Mathematica 1991 baserat pÄ CD-ROM, etc.). Naturligtvis Àr det tillvÀgagÄngssÀtt som föreslÄs för implementering baserat pÄ Wolfram-funktionsförrÄdet ett kraftfullare och pÄlitligare verktyg för att implementera ovanstÄende uppgifter.

I över 30 Är har vÄrt företag arbetat hÄrt för att upprÀtthÄlla integriteten hos Wolfram-sprÄkstrukturen, och detta Àr avgörande för att sÀkerstÀlla att Wolfram-sprÄket inte bara blir ett programmeringssprÄk, utan ocksÄ ett fullfjÀdrat datorsprÄk. Och dÀrför Àr kÀrnan i tillvÀgagÄngssÀttet för att implementera Wolfram-funktionsförrÄdet att anvÀnda ett enhetligt tillvÀgagÄngssÀtt för att programmera och utveckla nya funktioner som lÀggs till sekventiellt och passar in i sprÄkets ramverk sÄ att det kan utvecklas och samutvecklas.

Olika berÀkningsprocesser förekommer i implementeringsstrukturen för varje funktion. Det bör hÀr noteras att det Àr nödvÀndigt att funktionen har ett tydligt och enhetligt utseende och visuell lÀsbarhet för anvÀndaren. I detta sammanhang presenteras de inbyggda funktionerna i Wolfram Language med mer Àn 6000 XNUMX sekventiella exempel pÄ hur man korrekt programmerar funktioner (dessa Àr vÄra liveprogrammeringsvideorvilket innefattar hundratals timmars process för att skapa standardprogram). Vad detta tillvÀgagÄngssÀtt i slutÀndan gör att Wolfram-funktionsförrÄdet kan fungera bra Àr Wolfram-sprÄkets strukturella karaktÀr, med dess stora antal ytterligare och varierande bibliotek som redan Àr inbyggda i sprÄket. Om du till exempel har en funktion som bearbetar bilder, eller glesa arrayer, eller molekylÀra strukturerOch geografiska data eller nÄgra andra - deras konsekventa symboliska representation finns redan i sprÄket, och tack vare detta blir din funktion direkt kompatibel med andra funktioner i sprÄket.

Att skapa ett arkiv som faktiskt fungerar bra Àr en intressant metaprogrammeringsuppgift. Till exempel kommer ett överskott av begrÀnsningar i programmet inte att tillÄta erhÄllande av den nödvÀndiga föreningen och universaliteten av algoritmen. Precis som med ett otillrÀckligt antal funktionella begrÀnsningar kommer du inte att kunna implementera en tillrÀckligt korrekt sekvens av algoritmexekvering. Flera tidigare exempel pÄ att implementera en kompromiss av dessa tillvÀgagÄngssÀtt, implementerade av vÄrt företag, fungerade ganska stabilt - dessa Àr: Projekt Tungsten Demonstrationer, lanserades 2007 och körs nu online online med över 12000 XNUMX anvÀndarinteraktiva demos. I Wolfram databas det finns mer Àn 600 fÀrdiga databaser som kan anvÀndas i Wolfram-sprÄket, och Wolfram neural nÀtverkslagring fylls pÄ med nya neurala nÀtverk nÀstan varje vecka (det finns redan 118 av dem nu) och de kopplas omedelbart via funktionen NetModel pÄ Wolfram-sprÄket.

Alla ovanstÄende exempel har en grundlÀggande egenskap - de objekt och funktioner som samlas in i projektet har en mycket hög grad av strukturering och distribution av processer. Naturligtvis kan detaljerna i strukturen för vad som Àr en demo eller ett neuralt nÀtverk eller nÄgot annat variera mycket, men den grundlÀggande strukturen för alla nuvarande förvar förblir alltid densamma. SÄ vad Àr din Äsikt, kÀra anvÀndare, om att skapa ett sÄdant arkiv som lÀgger till tillÀgg till Wolfram-sprÄket? Wolfram-sprÄket Àr designat för att vara extremt flexibelt, sÄ det kan utökas och modifieras pÄ vilket sÀtt som helst. Denna omstÀndighet Àr extremt viktig för möjligheten att snabbt skapa olika storskaliga programvaruprojekt i Wolfram-sprÄket. Det bör noteras hÀr att nÀr sprÄkets flexibilitet ökar kommer kostnaderna för projekt som genomförs pÄ ett sÄdant sprÄk oundvikligen att öka. Detta beror pÄ det faktum att ju mer anvÀndaren anvÀnder ett sÄdant sprÄk, desto mer dedikerad funktionalitet fÄr han, men vi bör inte glömma att detta tillvÀgagÄngssÀtt ocksÄ kan ha negativa sidor nÀr det gÀller oförmÄgan att sÀkerstÀlla konsekvent konsistens av programmoduler.

Det finns ett vanligt problem med bibliotek i traditionella programmeringssprÄk - om du till exempel anvÀnder ett bibliotek kommer koden att fungera korrekt, men om du försöker anvÀnda flera bibliotek finns det ingen garanti för att de kommer att interagera korrekt med varandra . Dessutom, i traditionella programmeringssprÄk - till skillnad frÄn ett fullfjÀdrat datorsprÄk - finns det inget sÀtt att garantera nÀrvaron av konsekventa inbyggda representationer för andra funktioner eller datatyper Àn deras grundlÀggande strukturer. Men i sjÀlva verket Àr problemet Ànnu större Àn det verkar vid första anblicken: om man bygger en storskalig vertikal funktionalitet Àr det omöjligt att utan de enorma kostnaderna för centraliserad projektprogrammering som vi lÀgger in i Wolfram-sprÄket uppnÄ konsekvens. Det Àr dÀrför viktigt att alla mjukvarumoduler alltid fungerar korrekt tillsammans.

SÄ tanken bakom Wolfram-funktionsförrÄdet Àr att undvika problemet som beskrivs ovan genom att helt enkelt lÀgga till tillÀgg till sprÄket i relativt smÄ bitar av kod via individuella funktioner som Àr lÀttare att utveckla som sammanhÀngande moduler. Med detta sagt finns det programmeringsfunktioner som inte kan göras bekvÀma med individuella funktioner (och vÄrt företag planerar att slÀppa en optimerad programmeringsalgoritm inom en snar framtid för att hjÀlpa till att implementera storskaliga programvarupaket). Men baserat pÄ de funktioner som redan Àr inbyggda i Wolfram-sprÄket finns det mÄnga programmeringsmöjligheter som implementeras utifrÄn individuella funktioner. Tanken hÀr Àr att det med relativt lite programmeringsanstrÀngning Àr möjligt att skapa ett antal nya och mycket anvÀndbara funktioner som ger tillrÀcklig koherens till designen, de kommer att vara vÀl koordinerade med varandra, och dessutom, utöver detta, kommer att kunna anvÀndas enkelt och brett i sprÄket i framtiden.

Detta tillvÀgagÄngssÀtt Àr naturligtvis en kompromiss. Om ett större paket implementerades skulle en helt ny vÀrld av funktionalitet kunna förestÀllas som skulle vara extremt kraftfull och anvÀndbar. Om det finns ett behov av att skaffa ny funktionalitet som passar in i allt annat, men du inte Àr villig att lÀgga ner mycket kraft pÄ att utveckla projektet, kan detta tyvÀrr leda till att ditt projekts omfattning minskar. Tanken bakom Wolfram-funktionsförrÄdet Àr att tillhandahÄlla funktionalitet till en definierande del av ett projekt; detta tillvÀgagÄngssÀtt kommer att lÀgga till kraftfull funktionalitet samtidigt som det gör det lÀttare att upprÀtthÄlla god konsistens i ett programmeringsprojekt.

HjÀlp att lÀgga till anpassade funktioner till funktionsförrÄdet

VÄrt team har arbetat hÄrt för att göra det enkelt för anvÀndare att bidra till Wolfram-repository-funktionerna. PÄ skrivbordet (redan in version 12.0), Du kan helt enkelt gÄ igenom huvudmenyflikarna sekventiellt: Arkiv > Ny > RepositoryItem > Function Repository Item och du fÄr "Definition anteckningsbok" (programmÀssigt inuti arbetsbÀnken. Du kan ocksÄ anvÀnda den analoga funktionen - Skapa anteckningsbok["FunctionResource"]):

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Det finns tvÄ huvudsteg du mÄste utföra: för det första, skriv faktiskt ner koden för din funktion och, för det andra, skriv ner dokumentation som illustrerar hur din funktion ska fungera.
Klicka pĂ„ knappen "Öppna prov" högst upp för att se ett exempel pĂ„ vad du behöver göra:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

I huvudsak försöker du skapa nÄgot som liknar en inbyggd funktion i Wolfram-sprÄket. Förutom att den kan göra nÄgot mycket mer specifikt Àn en inbyggd funktion. Samtidigt kommer förvÀntningarna pÄ dess fullstÀndighet och tillförlitlighet att vara mycket lÀgre.
Du mĂ„ste ge din funktion ett namn som följer Wolfram Languages ​​riktlinjer för namngivning av funktioner. Dessutom kommer du att behöva utveckla dokumentation för din funktion, liknande sprĂ„kets inbyggda funktioner. Jag ska prata om detta mer i detalj senare. För nu, lĂ€gg bara mĂ€rke till att i raden med knappar högst upp i definitions-anteckningsboken finns en knapp "Stylriktlinjer", som förklarar vad du ska göra, och en Verktyg-knapp, som tillhandahĂ„ller verktyg för att formatera din funktions dokumentation.
NÀr du Àr sÀker pÄ att allt Àr korrekt ifyllt och du Àr redo, klicka pÄ knappen "Kontrollera". Det Àr helt normalt att du inte har listat ut alla detaljer Àn. SÄ "Kontrollera"-funktionen kommer automatiskt att köras och göra mÄnga stil- och konsistenskontroller. Ofta kommer den omedelbart att uppmana dig att bekrÀfta och acceptera korrigeringarna (till exempel: "Denna rad mÄste sluta med ett kolon", och det kommer att uppmana dig att ange ett kolon). Ibland kommer hon att be dig lÀgga till eller Àndra nÄgot sjÀlv. Vi kommer stÀndigt att lÀgga till nya funktioner till den automatiska funktionen för knappen Kontrollera, men i grund och botten Àr dess syfte att sÀkerstÀlla att allt du skickar till funktionsförrÄdet noga följer sÄ mÄnga stilriktlinjer som möjligt

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

SÄ, efter att ha kört "Check", kan du anvÀnda "Förhandsgranska". "Förhandsgranska" skapar en förhandsgranskning av dokumentationssidan du definierat för din funktion. Du kan ocksÄ skapa en förhandsvisning för en fil som skapats pÄ din dator eller för en fil som finns i molnlagring. Om du av nÄgon anledning inte Àr nöjd med det du ser i förhandsgranskningen, gÄ helt enkelt tillbaka och gör nödvÀndiga korrigeringar och klicka sedan pÄ knappen Förhandsgranska igen.
Nu Àr du redo att skjuta in din funktion i förvaret. Knappen Distribuera ger dig fyra alternativ:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Det viktiga i det hÀr steget Àr att du kan skicka in din funktion till Wolfram-funktionsförrÄdet sÄ att den Àr tillgÀnglig för alla. Samtidigt kan du Àven placera din funktion för ett begrÀnsat antal anvÀndare. Du kan till exempel skapa en funktion som finns lokalt pÄ din dator sÄ att den Àr tillgÀnglig nÀr du anvÀnder just den datorn. Eller sÄ kan du lÀgga upp det i din molnkonto, sÄ att den Àr tillgÀnglig för dig nÀr du Àr ansluten till molnet. Du kan ocksÄ vara vÀrd för (distribuera) funktionen offentligt via ditt molnkonto. Det kommer inte att finnas i Wolframs centrala funktionslager, men du kommer att kunna ge nÄgon en URL som gör att de kan hÀmta din funktion frÄn ditt konto. (I framtiden kommer vi ocksÄ att stödja centrala arkiv i hela vÄrt företag.)

SÄ lÄt oss sÀga att du faktiskt vill skicka din funktion till Wolfram-funktionens kunskapsbas. För att göra detta klickar du pÄ knappen "Skicka" till förvaret. SÄ vad hÀnder dÄ för tillfÀllet? Din ansökan stÀlls omedelbart i kö för granskning och godkÀnnande av vÄrt engagerade team av kuratorer.

NÀr din ansökan fortskrider genom godkÀnnandeprocessen (som vanligtvis tar flera dagar), kommer du att fÄ meddelanden om dess status och eventuellt förslag för framtida anvÀndning. Men nÀr din funktion Àr godkÀnd kommer den omedelbart att publiceras till Wolfram Feature Repository och kommer att vara tillgÀnglig för alla att anvÀnda. (Och detta kommer att dyka upp i nyhetssammandrag av nya funktioner och sÄ vidare)

Vad ska finnas i förrÄdet?

Det bör noteras att vÄrt företag har mycket höga standarder för fullstÀndighet, tillförlitlighet och övergripande kvalitet, och av de 6000+ funktioner som vi redan har byggt in i Wolfram-sprÄket under de senaste 30+ Ären, uppfyller alla ovanstÄende krav. MÄlet med Wolfram Function Repository Àr att anvÀnda all struktur och funktionalitet som redan finns i Wolfram Language för att lÀgga till sÄ mÄnga lÀttare funktioner (det vill sÀga funktioner med högre prestanda) som möjligt.

Naturligtvis mĂ„ste funktioner i Wolfram-funktionsförrĂ„det överensstĂ€mma med designprinciperna för Wolfram Language – sĂ„ att de fullt ut kan interagera med andra funktioner och anvĂ€ndarnas förvĂ€ntningar pĂ„ hur funktionen ska fungera korrekt. Funktionerna behöver dock inte vara lika fullstĂ€ndiga eller tillförlitliga.

I Wolfram-sprÄkets inbyggda funktioner arbetar vi hÄrt för att göra programmeringsfunktioner sÄ generella som möjligt. Som sagt, nÀr i Wolfram-funktionsförrÄdet Àr det inget fel med att ha en funktion i den som helt enkelt hanterar ett mycket specifikt men anvÀndbart fall. Till exempel funktionen SendMailFromAnteckningsbok kan ta emot filer i ett specifikt format och skapa e-post pÄ ett specifikt sÀtt. PolygonalDiagram skapar diagram med endast vissa fÀrger och mÀrkning osv.

En annan poÀng relaterad till de inbyggda funktionerna Àr att vÄrt företag anstrÀnger sig för att hantera alla atypiska fall, att korrekt hantera felaktiga inmatningar osv. I ett funktionsförrÄd Àr det helt normalt att det finns en speciell funktion som hanterar huvudfallen av att lösa ett problem och ignorerar alla andra.

Den uppenbara poÀngen Àr att det Àr bÀttre att ha funktioner som gör mer och gör det bÀttre, men optimering för ett funktionsförrÄd - i motsats till de inbyggda funktionerna i Wolfram-sprÄket - borde ha fler funktioner buntade med fler funktioner snarare Àn att fördjupa sig i implementeringsprocesserna för varje specifik funktion.

LÄt oss nu titta pÄ ett exempel pÄ att testa funktioner i ett arkiv. KonsistensförvÀntningarna pÄ sÄdana funktioner Àr naturligtvis mycket lÀgre Àn för inbyggda sprÄkfunktioner. Detta gÀller sÀrskilt i de fall dÀr funktioner Àr beroende av externa resurser som API:er, det Àr viktigt att stÀndigt genomföra konsekventa tester, vilket automatiskt sker inom verifieringsalgoritmerna. I nb-filen kan du uttryckligen ange definitioner (i avsnittet Ytterligare information) och ange sÄ mÄnga tester som definieras av antingen in- och utdatastrÀngar eller helkaraktÀrsobjekt av typen Verifieringstest, sÄ mycket du finner lÀmpligt. Dessutom försöker systemet stÀndigt förvandla de dokumentationsexempel du tillhandahÄller till en verifieringsprocess (och ibland kan detta vara ganska resurskrÀvande, till exempel för en funktion vars resultat beror pÄ slumpmÀssiga siffror eller tid pÄ dygnet).

Som ett resultat kommer funktionsförrÄdet att ha ett antal implementeringskomplexiteter. Vissa kommer bara att vara en enda rad kod, andra kan involvera tusentals eller tiotusentals rader, troligen med mÄnga hjÀlpfunktioner. NÀr Àr det vÀrt att lÀgga till en funktion som krÀver vÀldigt lite kod för att definiera? I grund och botten, om det finns en funktion bra mnemoniska namn, som anvÀndare lÀtt skulle förstÄ om de sÄg det i en kodbit, sÄ kan den redan lÀggas till. Annars Àr det förmodligen bÀttre att bara lÀgga till koden i ditt program igen varje gÄng du behöver anvÀnda den.

Huvudsyftet med ett funktionsförrÄd (som namnet antyder) Àr att introducera nya funktioner i sprÄket. Om du vill lÀgga till ny data eller nya enheter, anvÀnda sig av Wolfram Data repository. Men vad hÀnder om du vill introducera nya typer av objekt för dina berÀkningar?

Det finns faktiskt tvÄ sÀtt. Du kanske vill introducera en ny objekttyp som kommer att anvÀndas i nya funktioner i funktionsförrÄdet. Och i det hÀr fallet kan du alltid bara skriva ner dess symboliska representation och anvÀnda den nÀr du matar in eller matar ut funktioner i ett funktionsförrÄd.

Men vad hÀnder om du vill representera ett objekt och sedan definiera, genom befintliga funktioner i Wolfram-sprÄket, att du vill arbeta med det? Wolfram-sprÄket har alltid haft en lÀttviktsmekanism för detta, kallad UppvÀrden. Med vissa begrÀnsningar (sÀrskilt för funktioner som kan inte utvÀrdera deras argument), lÄter ett funktionsförrÄd dig helt enkelt representera en funktion och definiera vÀrden för den. (Att höja förvÀntningarna pÄ konsekvens nÀr man skapar en ny större design som Àr helt integrerad i Wolfram-sprÄket Àr i allmÀnhet en mycket viktig procedur som inte kan uppnÄs genom att bara öka kostnaderna för projektet och Àr nÄgot som vÄrt företag gör som en del av projekt för en lÄngsiktig utveckling av sprÄket Àr denna uppgift inte ett mÄl som sÀtts som en del av utvecklingen av förvaret).

SÄ, vad kan finnas i funktionskoden i ett funktionsförrÄd? Allt inbyggt i Wolfram-sprÄket, naturligtvis (Ätminstone om det inte representerar hot för SÀkerhet och prestandan för sjÀlva programmet, som en datormiljö) sÄvÀl som alla funktioner frÄn funktionsförrÄdet. Det finns dock andra funktioner: en funktion i ett funktionsförrÄd kan anropa ett API, eller in Wolfram CloudEller frÄn en annan kÀlla. Naturligtvis finns det vissa risker med detta. PÄ grund av det faktum att det inte finns nÄgra garantier för att API:et inte kommer att förÀndras, och funktionen i funktionslagret slutar fungera. För att hjÀlpa till att identifiera sÄdana hÀr problem finns det en anteckning pÄ dokumentationssidan (i avsnittet Krav) för alla funktioner som Àr beroende av mer Àn bara inbyggd Wolfram Language-funktionalitet. (Naturligtvis, nÀr det kommer till verklig data, kan det finnas problem Àven med denna funktionalitet - eftersom verkliga data förÀndras stÀndigt, och ibland förÀndras till och med dess definitioner och struktur.)

Bör all kod för Wolfram-funktionsförrÄdet skrivas i Wolfram? Visst, koden inuti det externa API:et bör inte skrivas pÄ Wolfram-sprÄket, vilket inte ens gör sprÄkkoden. Faktum Àr att om du hittar en funktion i nÀstan vilket externt sprÄk eller bibliotek som helst, kan du skapa ett omslag som lÄter dig anvÀnda det i Wolfram-funktionsförrÄdet. (Vanligtvis bör du anvÀnda de inbyggda funktionerna för detta Extern utvÀrdera eller Extern Funktion i Wolfram sprÄkkod.)

SĂ„ vad Ă€r poĂ€ngen med att göra det hĂ€r? I huvudsak lĂ„ter detta dig anvĂ€nda hela det integrerade Wolfram Language-systemet och hela dess enhetliga uppsĂ€ttning mjukvarufunktioner. Om du skaffar basimplementeringen frĂ„n ett externt bibliotek eller sprĂ„k, kan du sedan anvĂ€nda Wolfram-sprĂ„kets rika symboliska struktur för att skapa en bekvĂ€m toppnivĂ„funktion som gör att anvĂ€ndare enkelt kan anvĂ€nda alla funktioner som redan implementerats. Åtminstone borde detta vara möjligt i en idealisk vĂ€rld dĂ€r alla byggstenar för laddningsbibliotek etc. finns, i vilket fall de skulle hanteras automatiskt av Wolfram-sprĂ„ket. (Det bör noteras att det i praktiken kan finnas problem med stĂ€lla in externa sprĂ„k specifika datorsystem och molnlagring kan innebĂ€ra ytterligare sĂ€kerhetsproblem).

Förresten, nÀr man först tittar pÄ typiska externa bibliotek verkar de ofta vara för komplexa för att tÀckas av bara nÄgra fÄ funktioner, men i mÄnga fall kommer mycket av komplexiteten frÄn att skapa den infrastruktur som behövs för biblioteket och alla funktioner för att stödja det. Men nÀr Wolfram-sprÄket anvÀnds Àr infrastrukturen vanligtvis redan inbyggd i paketen, sÄ det finns inget behov av att exponera alla dessa stödfunktioner i detalj, utan bara skapa funktioner för de "översta" applikationsspecifika funktionerna i biblioteket .

"Ekosystem" av kunskapsbasen

Om du har skrivit funktioner som du anvÀnder regelbundet, skicka in dem till Wolfram Function Repository! Om nÄgot mer inte kommer ut ur detta (sprÄkutveckling), sÄ kommer det Àven dÄ att vara mycket bekvÀmare för dig att anvÀnda funktionerna för personligt bruk. Det Àr dock logiskt att anta att om du anvÀnder funktionerna regelbundet kanske andra anvÀndare ocksÄ kommer att ha nytta av dem.

Naturligtvis kan du hamna i en situation dĂ€r du inte kan - eller inte vill - dela dina funktioner eller i hĂ€ndelse av att du fĂ„r tillgĂ„ng till privata informationsresurser. Även i sĂ„dana fall kan du helt enkelt distribuera funktionerna i ditt eget molnkonto, ange rĂ€ttigheter tillgĂ„ng till dem. (Om din organisation har Wolfram Enterprise privata moln, dĂ„ kommer det snart att kunna vara vĂ€rd för sitt eget privata funktionsförrĂ„d, som kan administreras inifrĂ„n din organisation och stĂ€lla in om vyer ska tvingas ses av tredje partsanvĂ€ndare eller inte.)

Funktionerna du skickar till Wolfram-funktionsförrÄdet behöver inte vara perfekta; de mÄste bara vara anvÀndbara. Detta Àr lite som avsnittet "Fel" i klassisk Unix-dokumentation - i "Definitionssektionen" finns en "Author's Notes"-sektion dÀr du kan beskriva begrÀnsningar, problem etc. som du redan kÀnner till om din funktion. Dessutom, nÀr du skickar in din funktion till förvaret, kan du lÀgga till inlÀmningsanteckningar som kommer att lÀsas av ett dedikerat team av curatorer.

NÀr en funktion har publicerats har dess sida alltid tvÄ lÀnkar lÀngst ner: "Skicka ett meddelande om denna funktion"Och"Diskutera i Wolfram-gemenskapen" Om du bifogar en anteckning (t.ex. berÀtta om buggar), kan du markera rutan som sÀger att du vill att ditt meddelande och kontaktinformation ska delas med författaren.

Ibland vill du bara anvÀnda funktioner frÄn Wolfram-funktionsförrÄdet, till exempel inbyggda funktioner, utan att titta pÄ deras kod. Men om du vill ta en titt inuti finns det alltid en Anteckningsblock-knapp högst upp. Klicka pÄ den sÄ fÄr du en egen kopia av den ursprungliga definitionsanteckningsboken som skickades till funktionsförrÄdet. Ibland kan du bara anvÀnda det som ett exempel för dina behov. Samtidigt kan du ocksÄ utveckla din egen modifiering av denna funktion. Du kanske vill lÀgga upp dessa funktioner du hittade frÄn förvaret pÄ din dator eller i ditt aphid cloud storage-konto, kanske vill du skicka in dem till funktionskunskapsbasen, kanske som en förbÀttrad, utökad version av den ursprungliga funktionen.

I framtiden planerar vi att stödja Git-stil forking för funktionsförrÄd, men för nÀrvarande försöker vi hÄlla det enkelt, och vi har alltid bara en accepterad version av varje funktion inbyggd i sprÄket. Oftare Àn inte (sÄvida inte utvecklare ger upp underhÄllet av funktionerna de utvecklat och svarar pÄ anvÀndarbidrag) tar den ursprungliga författaren av funktionen kontroll över uppdateringar av den och skickar in nya versioner, som sedan granskas och, om de klarar granskningen , publicerad pÄ sprÄket.

LÄt oss övervÀga frÄgan om hur "versionering" av utvecklade funktioner fungerar. Just nu, nÀr du anvÀnder en funktion frÄn funktionsförrÄdet, kommer dess definition att lagras permanent pÄ din dator (eller i ditt molnkonto om du anvÀnder molnet). Om en ny version av en funktion Àr tillgÀnglig kommer du att fÄ ett meddelande om detta nÀsta gÄng du anvÀnder den. Och om du vill uppdatera funktionen till en ny version kan du göra det med kommandot Resursuppdatering. (Funktionsblobben lagrar faktiskt mer versionsinformation, och vi planerar att göra detta mer tillgÀngligt för vÄra anvÀndare i framtiden.)

En av de vackra sakerna med Wolfram Function Repository Àr att vilket Wolfram Language-program som helst kan anvÀnda funktioner frÄn det. Om ett program dyker upp i ett anteckningsblock Àr det ofta bekvÀmt att formatera repository-funktionerna som lÀttlÀsta "function binary object"-funktioner (kanske med en lÀmplig versionsuppsÀttning).

Du kan alltid komma Ät vilken funktion som helst i funktionsförrÄdet med hjÀlp av text ResourceFunction[.]. Och detta Àr vÀldigt bekvÀmt om du skriver kod eller skript direkt för Wolfram Engine, till exempel med med hjÀlp av en IDE- eller textkodredigerare (det bör sÀrskilt noteras att funktionsförrÄdet Àr fullt kompatibelt med Gratis Wolfram Engine för utvecklare).

Hur fungerar det?

Inuti funktionerna i Wolfram-förvaret Àr detta möjligt med exakt samma resurssystem baser, som i alla vÄra andra befintliga förrÄd (datalagring, Neuralt nÀtförrÄd, samling av demoprojekt etc.), liksom alla andra Wolfram-systemresurser, Resursfunktion ytterst baserat pÄ funktion ResourceObject.

TĂ€nk Resursfunktion:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Inuti kan du se en del information med hjÀlp av funktionen Information:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Hur fungerar det att sÀtta upp en resursfunktion? Det enklaste Àr ett rent lokalt fall. HÀr Àr ett exempel som tar en funktion (i det hÀr fallet bara en ren funktion) och definierar den som en resursfunktion för en given programsession:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

NÀr du har gjort definitionen kan du anvÀnda resursfunktionen:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Observera att det finns en svart ikon i denna funktionsblobb Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg. Det betyder att BLOB-funktionen refererar till resursfunktionen i minnet som definierats för den aktuella sessionen. En resursfunktion som Àr permanent lagrad pÄ din dator eller ditt molnkonto har en grÄ ikon Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg. Och det finns en orange ikon för en officiell resursfunktion i Wolfram Feature Repository Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg.

SÄ vad hÀnder nÀr du anvÀnder Expandera-menyn i Definition Notebook? Först tar det alla definitioner i anteckningsblocket och frÄn dem skapar en symbolisk ResourceObject). (Och om du anvÀnder en textbaserad IDE eller ett program kan du ocksÄ uttryckligen skapa ResourceObject)

Lokal distribution av en funktion frÄn ett arkiv pÄ din dator utförs med kommandot LocalCache för ett resursobjekt att spara det som LocalObject pÄ ditt filsystem. Distribution till ett molnkonto görs med kommandot CloudDeploy för ett resursobjekt, och en offentlig molninstallation Àr CloudPublish. I samtliga fall Resursregistrering anvÀnds ocksÄ för att registrera resursfunktionens namn, sÄ ResourceFunction["namn"] kommer att funka.

Om du klickar pÄ knappen Skicka för ett funktionsarkiv, vad hÀnder under det ResourceSubmit anropade ett resursobjekt. (Och om du anvÀnder ett textinmatningsgrÀnssnitt kan du ocksÄ ringa ResourceSubmit direkt.)

Som standard görs inlÀmningar under det namn som Àr kopplat till ditt Wolfram-ID. Men om du skickar in en ansökan pÄ uppdrag av ett utvecklingsteam eller en organisation kan du ange separat utgivar-ID och anvÀnd det istÀllet som namn för att interagera med dina Äsikter.

Efter att du har skickat in nÄgon av dina funktioner till funktionskunskapsbasen stÀlls den i kö för granskning. Om du fÄr kommentarer som svar kommer de vanligtvis att vara i form av en textfil med ytterligare "kommentarceller" tillagda. Du kan alltid kontrollera status för din ansökan genom att besöka resurssystem medlemsportal. Men nÀr din funktion har godkÀnts kommer du att meddelas (via e-post) och din funktion kommer att lÀggas upp i Wolfram-funktionsförrÄdet.

Lite finesser pÄ jobbet

Vid första anblicken kan det verka som att du bara kan ta en definitionsanteckningsbok och lÀgga den ordagrant i ett funktionsförrÄd, men det finns faktiskt en hel del finesser inblandade - och att hantera dem krÀver en ganska komplex metaprogrammering, hantering av symbolisk bearbetning som koden som definierar funktionen och sjÀlva Anteckningsblocket definieras. Det mesta av detta sker internt, bakom kulisserna, men det kan ha vissa implikationer som Àr vÀrda att förstÄ om du ska bidra till kunskapsbasen om funktioner.

Första omedelbara subtilitet: NÀr du fyller i Definition Notebook kan du helt enkelt referera till din funktion överallt med ett namn som MyFunction, som ser ut som ett vanligt namn för en funktion i Wolfram-sprÄket, men för funktionsförvarsdokumentation ersÀtts detta ResourceFunction["MyFunction"] Àr vad anvÀndarna faktiskt kommer att anvÀnda nÀr de arbetar med funktionen.

Den andra subtiliteten: nÀr du skapar en resursfunktion frÄn Definition Notebook mÄste alla beroenden som Àr involverade i funktionsdefinitionen fÄngas och uttryckligen inkluderas. Men för att sÀkerstÀlla att definitionerna förblir modulÀra mÄste du lÀgga allt i en unik namnutrymme. (SjÀlvklart, funktioner som gör allt, finns i funktionsförrÄdet.)

Vanligtvis kommer du aldrig att se nÄgra spÄr av koden som anvÀnds för att konfigurera detta namnomrÄde. Men om du av nÄgon anledning anropar en underexekverad symbol i din funktion, kommer du att se att denna symbol finns i funktionens interna sammanhang. Men nÀr du bearbetar Definition Notepad, Àr Ätminstone symbolen som motsvarar sjÀlva funktionen justerbar för bÀsta visning som en funktionell BLOB snarare Àn en rÄ karaktÀr i det interna sammanhanget.

FunktionsförrÄdet Àr till för att definiera nya funktioner. Och dessa funktioner kan ha alternativ. Ofta Àr dessa parametrar (t.ex. Metod eller Bildstorlek) kommer att kunna anvÀndas för inbyggda funktioner, sÄvÀl som för de för vilka inbyggda symboler redan finns. Men ibland kan en ny funktion krÀva nya alternativ. För att bibehÄlla modularitet mÄste dessa parametrar vara symboler definierade i ett unikt internt sammanhang (eller nÄgot som hela resursfunktioner, det vill sÀga sig sjÀlva). För enkelhetens skull lÄter funktionsförrÄdet dig definiera nya alternativ i strÀngdefinitioner. Och för anvÀndarens bekvÀmlighet, dessa definitioner (förutsatt att de anvÀnds OptionValue О Alternativmönster) bearbetas ocksÄ sÄ att nÀr du anvÀnder funktioner kan parametrar specificeras inte bara som strÀngar utan ocksÄ som globala symboler med samma namn.

De flesta funktioner gör helt enkelt vad de ska göra varje gÄng de anropas, men vissa funktioner mÄste initieras innan de kan köras i en viss session - och för att lösa detta problem finns det en "Initialisering"-sektion i Definitionssektionen.

Funktioner frĂ„n ett arkiv kan anvĂ€nda andra funktioner som redan finns i arkivet; för att stĂ€lla in definitioner för ett funktionsarkiv som inkluderar tvĂ„ (eller flera) funktioner som refererar till varandra mĂ„ste du distribuera dem i din programsession sĂ„ att du kan referens som pĂ„ dem ResourceFunction["namn"], dĂ„ kan du skapa de kombinationer av dessa funktioner du behöver, exempel (jag förstod inte) och lĂ€gga till en ny funktion till förvaret baserat pĂ„ de som redan postats tidigare. (eller redan eller tidigare – bĂ„da orden Ă€r klumpiga)

Utvecklingsutsikter. Vad ska hÀnda nÀr förvaret blir riktigt stort?

Idag lanserar vi just Wolfram Feature Repository, men med tiden förvÀntar vi oss att dess storlek och funktionalitet kan öka dramatiskt, och nÀr det vÀxer i utveckling kommer det att finnas olika problem som vi redan anar kan uppstÄ.

Det första problemet gÀller funktionsnamn och deras unika karaktÀr. FunktionsförrÄdet Àr utformat pÄ ett sÄdant sÀtt att du, precis som de inbyggda funktionerna i Wolfram-sprÄket, kan referera till vilken funktion som helst genom att helt enkelt ange dess namn. Men detta betyder oundvikligen att funktionsnamn mÄste vara globalt unika över hela arkivet, sÄ att det till exempel bara kan finnas en ResourceFunction["MyFavoriteFunction"].

Detta kan tyckas vara ett stort problem till en början, men det Àr vÀrt att inse att det i princip Àr samma problem som för saker som internetdomÀner eller handtag i sociala medier. Och faktum Àr att systemet helt enkelt behöver ha en registrar - och detta Àr en av de roller som vÄrt företag kommer att utföra för Wolfram-funktionens kunskapsbas. (För privata versioner av ett arkiv kan deras registrarer vara administratörer.) Naturligtvis kan en internetdomÀn registreras utan att ha nÄgot pÄ sig, men i ett funktionsarkiv kan ett funktionsnamn bara registreras om det finns en faktisk definition av funktionen.

En del av vĂ„r roll i att hantera Wolfram-funktionens kunskapsbas Ă€r att sĂ€kerstĂ€lla att namnet som vĂ€ljs för en funktion Ă€r logiskt med tanke pĂ„ funktionens definition och att det följer Wolfram Languages ​​namnkonventioner. Vi har över 30 Ă„rs erfarenhet av att namnge inbyggda funktioner i Wolfram-sprĂ„ket, och vĂ„rt team av kuratorer kommer ocksĂ„ att ta med den erfarenheten till funktionsförrĂ„det. SjĂ€lvklart finns det alltid undantag. Det kan till exempel tyckas vara att föredra att ha ett kort namn för nĂ„gon funktion, men det Ă€r bĂ€ttre att "försvara" med ett lĂ€ngre, mer specifikt namn eftersom det Ă€r mindre troligt att du stöter pĂ„ nĂ„gon som vill göra ett liknande funktionsnamn i framtiden .

(Det bör noteras hÀr att att helt enkelt lÀgga till en medlemstagg för att disambiguera funktioner inte kommer att ha den avsedda effekten. För sÄvida du inte insisterar pÄ att alltid tilldela en tagg, mÄste du definiera en standardtagg för en given funktion, och Àven tilldela författartaggar , vilket Äterigen skulle krÀva global samordning.)

NÀr kunskapsbasen för Wolfram-funktioner vÀxer, Àr ett av problemen som sannolikt kommer att uppstÄ upptÀckbarheten av funktioner, som systemet tillhandahÄller sökfunktion (och definitionsfiler kan innehÄlla nyckelord etc.). För inbyggda funktioner i Wolfram-sprÄket finns alla möjliga korsreferenser i dokumentationen för att hjÀlpa till att "annonsera" funktionerna. Funktioner i ett funktionsförrÄd kan referera till inbyggda funktioner. Men hur Àr det tvÀrtom? För att göra detta kommer vi att experimentera med olika designs för att exponera förvarsfunktioner pÄ dokumentationssidor för inbyggda funktioner.

För inbyggda funktioner i Wolfram-sprÄket finns ett sÄ kallat detektionslager som tillhandahÄlls av nÀtverk av "hjÀlpsidor", som tillhandahÄller organiserade listor över funktioner relaterade till specifika omrÄden. Det Àr alltid svÄrt att balansera man-sidor ordentligt, och i takt med att Wolfram-sprÄket vÀxer mÄste man-sidor ofta omorganiseras helt. Det Àr ganska lÀtt att placera funktioner frÄn ett arkiv i breda kategorier, och till och med att dela upp dessa kategorier konsekvent, men det Àr mycket mer vÀrdefullt att ha korrekt organiserade sprÄkreferenssidor. Det Àr Ànnu inte klart hur man bÀst skapar dem för hela funktionen kunskapsbas. Till exempel, CreateResourceObjectGallery i funktionsförrÄdet kan vem som helst lÀgga upp en webbsida som innehÄller deras "val" frÄn förvaret:

Wolfram Function Repository: Open access-plattform för Wolfram-sprÄktillÀgg

Wolfram-funktionsförrÄdet Àr konfigurerat som ett bestÀndigt funktionsförrÄd, dÀr alla funktioner i det alltid kommer att fungera. Naturligtvis kan nya versioner av funktioner bli tillgÀngliga, och vi förvÀntar oss att vissa funktioner sÄklart kommer att bli förÄldrade med tiden. Funktionerna fungerar om de anvÀnds i program, men deras dokumentationssidor kommer att lÀnka till nya mer avancerade funktioner.

Wolfram Feature Repository Àr utformat för att hjÀlpa dig att snabbt upptÀcka nya funktioner och lÀra dig nya sÀtt att anvÀnda Wolfram-sprÄket. Vi Àr mycket optimistiska att en del av det som har utforskats i funktionsförrÄdet sÄ smÄningom kommer att vara vettigt att bli inbyggda delar av kÀrnan i Wolfram-sprÄket. Under det senaste decenniet har vi haft en liknande uppsÀttning funktioner som ursprungligen introducerades i Wolfram | Alfa. Och en av lÀrdomarna frÄn den hÀr erfarenheten Àr att uppnÄ de standarder för kvalitet och konsistens som vi fokuserar pÄ i allt som Àr inbyggt i Wolfram-sprÄket krÀver mycket arbete, vilket ofta Àr svÄrare Àn den första anstrÀngningen att implementera idén. Trots det kan en funktion i funktionskunskapsbasen fungera som ett mycket anvÀndbart bevis pÄ konceptet för en framtida funktion som sÄ smÄningom kan byggas in i Wolfram-sprÄket.

Det viktigaste hÀr Àr att en funktion i ett funktionsförrÄd Àr nÄgot som Àr tillgÀngligt för alla anvÀndare att anvÀnda just nu. Det Àr möjligt att en modersmÄlsfunktion kan vara mycket bÀttre och mer presterande, men ett funktionsförrÄd skulle tillÄta anvÀndare att fÄ tillgÄng till alla nya funktioner direkt. Och, viktigast av allt, detta koncept lÄter alla lÀgga till vilka nya funktioner de vill ha.

Tidigare i Wolfram-sprÄkets historia skulle denna idé inte ha fungerat sÄ bra som den har gjort, men i det hÀr skedet lÀggs sÄ mycket kraft pÄ sprÄket, och en sÄ djup förstÄelse av sprÄkdesignprinciper, att det nu verkar vÀldigt möjligt för en stor grupp anvÀndare att lÀgga till funktioner som bibehÄller designkonsistens för att göra dem anvÀndbara för ett brett spektrum av anvÀndare.

Det finns en otrolig anda av talang(?) i Wolfram Language-anvÀndargemenskapen. (Naturligtvis inkluderar denna grupp mÄnga ledande FoU-personer inom en mÀngd olika omrÄden.) Jag hoppas att Wolfram Feature Repository kommer att tillhandahÄlla en effektiv plattform för att lÄsa upp och sprida denna anda av talang. Endast tillsammans kan vi skapa nÄgot som avsevÀrt kommer att utöka omrÄdet som Wolframs sprÄkberÀkningsparadigm kan tillÀmpas pÄ.

PÄ mer Àn 30 Är har vi kommit lÄngt med Wolfram-sprÄket. Nu tillsammans, lÄt oss gÄ Ànnu lÀngre. Jag uppmuntrar starkt alla respekterade anvÀndare av Wolfram-sprÄket runt om i vÀrlden att anvÀnda det funktionella arkivet som en plattform för detta, sÄvÀl som det nya mjukvaruprojektet som Free Wolfram Engine for Developers.

KĂ€lla: will.com

LĂ€gg en kommentar