Hej, Habr! Jag presenterar er översÀttningen av Stephen Wolframs inlÀgg .

FörutsÀttningar för Wolfram-sprÄkets kapabilitet
I dag stÄr vi pÄ tröskeln till stora prestationer tillsammans med programmeringssprÄket . För bara tre veckor sedan lanserade vi , för att hjÀlpa vÄra anvÀndare att integrera Wolfram Language i sina storskaliga programprojekt. I dag lanserar vi , för att erbjuda en samordnad plattform för funktioner skapade för att utvidga Wolfram-sprÄket, och vi öppnar Àven funktionsarkivet för alla som kan bidra till utvecklingen av vÄr programvara.
Wolfram-funktionsarkivet Àr nÄgot som har blivit möjligt tack vare den unika karaktÀren hos Wolfram Language, inte bara som ett programmeringssprÄk, utan ocksÄ som . I traditionella programmeringssprÄk innebÀr tillÀgg av betydande nya funktioner ofta skapandet av hela ytterligare bibliotek som kan fungera eller inte fungera tillsammans. Men i Wolfram Language , att det Àr möjligt att utöka dess funktionalitet avsevÀrt genom att helt enkelt lÀgga till nya funktioner som omedelbart integreras i sprÄkets helhet.
Till exempel, just nu finns det strukturerade i 26 tematiska kategorier:

Motsvarande mer Àn , inbyggda i Wolfram-sprÄket, har varje funktion i arkivet en dokumentationssida med detaljerad beskrivning och exempel pÄ anvÀndning:

För att gĂ„ till sidan, kopiera det ovanstĂ„ende objektet (funktions-BLOB), klistra in det i inmatningsfĂ€ltet och kör sedan funktionen â den Ă€r redan inbyggd i Wolfram-sprĂ„ket och stöds per default, med början frĂ„n :

HĂ€r bör det noteras att vid behandling av Behöver du till exempel inte konfigurera ett "bibliotek för bildbehandling" â eftersom vi redan har implementerat en sekventiell och noggrant algoritmiserad metod , som omedelbart kan behandlas av olika grafiska funktioner i sprĂ„ket:

Jag hoppas att med stödet frÄn , som har vuxit och expanderat (baserat pÄ Wolfram Language) under de senaste decennierna. Wolfram-funktionsförrÄdet kommer inom en överskÄdlig framtid att betydligt utvidga det utbud av (eventuellt betydande, specialiserade inom olika kunskapsomrÄden av vetenskap och teknik) funktioner som Àr tillgÀngliga i sprÄket. PÄ sÄ sÀtt erbjuds möjligheten att anvÀnda bÄde innehÄllet i sprÄket (dess inbyggda funktioner) och , som implementeras pÄ grundval av sprÄket. (Det Àr vÀrt att notera att Wolfram Language redan har en ).
Inuti funktionerna frĂ„n förrĂ„det kan det finnas smĂ„ eller ganska omfattande kodsnuttar skrivna i Wolfram Language. Till exempel kan detta vara anrop till . En unik egenskap hos detta tillvĂ€gagĂ„ngssĂ€tt Ă€r att nĂ€r du gĂ„r till funktionaliteten pĂ„ anvĂ€ndarnivĂ„, kommer det inte att finnas nĂ„gra möjliga diskrepanser eftersom detta tillvĂ€gagĂ„ngssĂ€tt bygger pĂ„ en sammanhĂ€ngande struktur av Wolfram Language â och varje funktion kommer automatiskt att fungera korrekt â precis sĂ„ som den ska.
GrĂ€nssnittet och programstrukturen för Wolfram-funktionsförrĂ„det Ă€r instĂ€llda sĂ„ att alla kan bidra till det gemensamma arbetet pĂ„ det enklaste och mest bekvĂ€ma sĂ€ttet för dem â i grunden genom att . Inbyggda automatiska funktioner möjliggör kontroll av nya funktioner som lĂ€ggs till i förrĂ„det för att sĂ€kerstĂ€lla deras garanti för integration i sprĂ„ket. VĂ„rt företag satsar pĂ„ en bred anvĂ€ndarbas som kan integrera sina funktioner i sprĂ„ket, snarare Ă€n stora komplexiteter med nya funktioner â och Ă€ven om det finns en granskning av processen, insisterar vi inte pĂ„ nĂ„got som liknar eller strikta standarder för fullstĂ€ndighet och tillförlitlighet för nya anvĂ€ndarfunktioner, till skillnad frĂ„n de mer rigorösa kontroller som tillĂ€mpas för funktioner som Ă€r inbyggda i sprĂ„kkĂ€rnan.
I detta tillvĂ€gagĂ„ngssĂ€tt finns det mĂ„nga kompromisser och detaljer, men vĂ„rt mĂ„l Ă€r att optimera Wolframs funktionsförrĂ„d bĂ„de för anvĂ€ndarens bekvĂ€mlighet och för att nya anvĂ€ndarfunktioner ska göra ett betydande bidrag till sprĂ„kets utveckling. I takt med att det vĂ€xer Ă€r jag övertygad om att vi kommer att behöva finna nya metoder för att hantera och kontrollera funktioner som integreras i förrĂ„det, och detta inte minst för att organisera det stora antalet funktioner och att hitta de som anvĂ€ndarna behöver. Det Ă€r dock hoppfullt att den vĂ€g vi valt Ă€r en bra början. Jag har personligen i den ursprungliga databasen. MĂ„nga av dem bygger pĂ„ kod som jag personligen har utvecklat under en ganska lĂ„ng tid. Och jag tog bara nĂ„gra minuter för att skicka dem till förrĂ„det. Nu nĂ€r de finns i förrĂ„det kan jag Ă€ntligen â omedelbart och nĂ€r som helst anvĂ€nda dessa funktioner efter behov, utan att oroa mig för att leta efter filer, ladda ner paket osv.
Ăka effektiviteten samtidigt som kostnaderna minskar
Redan innan Internet fanns det sÀtt att dela Wolfram Language-kod (vÄrt första stora centraliserade projekt var , som skapades för Mathematica 1991 pÄ CD-ROM med mera). Den föreslagna metodiken för att implementera Wolframs funktionsförrÄd Àr utan tvekan ett kraftfullare och mer pÄlitligt verktyg för att genomföra ovanstÄende uppgifter.
I över 30 Är har vÄrt företag arbetat hÄrt för att upprÀtthÄlla integriteten i Wolfram-sprÄkets struktur, och det Àr mycket viktigt för att Wolfram-sprÄket ska bli mer Àn bara ett programmeringssprÄk, utan ocksÄ en . SÄledes Àr kÀrnan i tillvÀgagÄngssÀttet för implementeringen av Wolframs funktionsförrÄd att anvÀnda en enhetlig metod för programmering och utveckling av nya funktioner som successivt lÀggs till och passar in i ramen för sprÄket för dess utveckling och gemensamma evolution.
I strukturen för implementeringen av varje funktion sker olika berĂ€kningsprocesser. HĂ€r bör det noteras att det Ă€r nödvĂ€ndigt att funktionen för anvĂ€ndaren har en tydlig och enhetlig utformning samt lĂ€sbarhet. I detta sammanhang presenteras de inbyggda funktionerna i Wolfram Language med mer Ă€n 6000 pĂ„ varandra följande exempel pĂ„ hur man korrekt programmerar funktioner (detta Ă€r vĂ„ra , som inkluderar ). Detta tillvĂ€gagĂ„ngssĂ€tt gör i slutĂ€ndan Wolfram-funktionernas repository kapabelt att fungera bra, just pĂ„ grund av den strukturella karaktĂ€ren hos Wolfram Language med dess stora mĂ€ngd ytterligare och varierade bibliotek som redan Ă€r inbyggda i sprĂ„ket. Till exempel, om du har en funktion som bearbetar bilder, eller , eller , samt eller nĂ„got annat â finns det redan en överenskommen symbolisk representation av dem i sprĂ„ket, vilket gör att din funktion omedelbart blir kompatibel med andra funktioner i sprĂ„ket.
Att skapa ett repository som verkligen fungerar bra Ă€r en intressant utmaning inom metaprogrammering. Till exempel kan en överskott av begrĂ€nsningar i programmet förhindra att den nödvĂ€ndiga enhetligheten och mĂ„ngsidigheten i algoritmens arbete uppnĂ„s. PĂ„ samma sĂ€tt, med ett otillrĂ€ckligt antal funktionella begrĂ€nsningar, kan du inte Ă„stadkomma en tillrĂ€ckligt korrekt sekvens av algoritmens utförande. NĂ„gra av de tidigare exemplen pĂ„ kompromisser av dessa tillvĂ€gagĂ„ngssĂ€tt, som genomförts av vĂ„rt företag, har fungerat ganska stabilt â det Ă€r: , som startades 2007 och nu fungerar interaktivt pĂ„ internet och innehĂ„ller mer Ă€n 12000 anvĂ€ndarinteraktiva demonstrationer. I finns det över 600 fĂ€rdiga databaser som kan anvĂ€ndas i Wolfram Language, och uppdateras med nya neurala nĂ€tverk nĂ€stan varje vecka (det finns redan 118) och de kopplas omedelbart genom funktionen i Wolfram Language.
Alla de ovan nĂ€mnda exemplen har en avgörande egenskap â de objekt och funktioner som samlas i projektet har en mycket hög grad av strukturering och processfördelning. SjĂ€lvklart kan detaljeringen av strukturen för vad som utgör en demonstration eller ett neuralt nĂ€tverk eller nĂ„got annat skilja sig mycket, men den grundlĂ€ggande strukturen för varje nuvarande repository förblir alltid oförĂ€ndrad. SĂ„ vad Ă€r din Ă„sikt, kĂ€ra anvĂ€ndare, om att skapa ett sĂ„dant repository som lĂ€gger till tillĂ€gg till Wolfram-sprĂ„ket? Wolfram Language Ă€r utformat för att vara extremt flexibelt, vilket gör att det kan utvidgas och förĂ€ndras pĂ„ mĂ„nga sĂ€tt. Denna omstĂ€ndighet Ă€r oerhört viktig för möjligheten att snabbt skapa olika storskaliga mjukvaruprojekt pĂ„ Wolfram Language. HĂ€r bör det noteras att ju mer flexibiliteten ökar, desto högre kostnader medför projekten som genomförs pĂ„ ett sĂ„dant sprĂ„k. Detta beror pĂ„ att ju mer en anvĂ€ndare anvĂ€nder ett sĂ„dant sprĂ„k, desto mer sĂ€rskild funktionalitet fĂ„r hen, men man fĂ„r inte glömma att detta tillvĂ€gagĂ„ngssĂ€tt ocksĂ„ kan ha negativa aspekter nĂ€r det gĂ€ller att sĂ€kerstĂ€lla konsekvent överensstĂ€mmelse mellan programmoduler.
I traditionella programmeringssprĂ„k finns det ett utbrett problem med bibliotek â om du till exempel anvĂ€nder ett bibliotek fungerar koden korrekt, men om du försöker anvĂ€nda flera bibliotek finns det ingen garanti för att de fungerar korrekt tillsammans. Dessutom saknar traditionella programmeringssprĂ„k â till skillnad frĂ„n ett komplett berĂ€kningssprĂ„k â möjligheterna att garantera nĂ€rvaron av överenskomna inbyggda representationer för nĂ„gra funktioner eller datatyper, förutom deras grundlĂ€ggande strukturer. Men i sjĂ€lva verket Ă€r problemet Ă€nnu större Ă€n det verkar vid första anblick: om nĂ„gon bygger en storskalig funktionalitetsvertikal Ă€r det omöjligt att nĂ„ sammanhĂ„llning utan enorma kostnader för centraliserad programmering av projektet, vilket vi har investerat i Wolfram-sprĂ„ket. DĂ€rför Ă€r det viktigt att alla programmoduler alltid fungerar tillsammans korrekt.
Idén med Wolfram-funktionsbiblioteket syftar till att lösa det ovan nÀmnda problemet genom att helt enkelt lÀgga till tillÀgg till sprÄket i form av relativt smÄ programmeringskomponenter. Utvecklingen av dessa komponenter som samordnade moduler Àr en enklare uppgift. Det finns dock programmeringsaspekter som inte lÀtt kan göras anvÀndarvÀnliga med endast separata funktioner (vÄr firma planerar inom en snar framtid att slÀppa en optimerad programalgoritm för att bistÄ i implementeringen av storskaliga programvarupaket). Men baserat pÄ de redan inbyggda funktionerna i Wolfram Language finns det mÄnga programmeringsmöjligheter som har realiserats som separata funktioner. HÀr handlar det om att skapa en mÀngd nya och mycket anvÀndbara funktioner med relativt smÄ programmeringsinsatser, som sÀkerstÀller tillrÀcklig enhetlighet i projektet. Dessa funktioner kommer att samverka vÀl med varandra och vara enkla att anvÀnda brett inom sprÄket framöver.
Denna metod Àr utan tvekan en kompromiss. Med implementeringen av ett storskaligare paket kan man förestÀlla sig en helt ny vÀrld av funktionalitet som blir oerhört kraftfull och anvÀndbar. Om det finns ett behov av att fÄ nya funktionalitet som passar in i allt annat men du inte Àr beredd att lÀgga ner enorma anstrÀngningar pÄ projektutveckling, kan detta tyvÀrr leda till att skalan av ditt projekt minskar. Idén med Wolfram-funktionsbiblioteket Àr att tillhandahÄlla den funktionalitet som definierar projektets kÀrna. Denna metod möjliggör att lÀgga till kraftfull funktionalitet samtidigt som man förenklar upprÀtthÄllandet av god enhetlighet i programmeringsprojektet.
HjÀlp med att lÀgga till anvÀndarspecifika funktioner i funktionsbiblioteket
VĂ„ra specialister har arbetat hĂ„rt för att göra sitt bidrag till Wolfram-funktionsbiblioteket sĂ„ enkelt som möjligt för anvĂ€ndare. PĂ„ skrivbordet (redan i ), Du kan helt enkelt följa flikarna i huvudmenyn: File > New > RepositoryItem > Function Repository Item sĂ„ fĂ„r du «» (programmerat inuti arbetsmiljön. Du kan ocksĂ„ anvĂ€nda funktionen analog â ):

Det finns tvÄ grundlÀggande ÄtgÀrder som du mÄste utföra: för det första, skriva koden för din funktion och för det andra, skriva dokumentationen som illustrerar hur din funktion ska fungera.
Klicka pĂ„ knappen «Ăppna exempel» högst upp för att se ett exempel pĂ„ vad du behöver göra:

I sjÀlva verket försöker du skapa nÄgot som liknar en inbyggd funktion i Wolfram Language. Med undantag för att den kan göra nÄgot mycket mer specifikt Àn den inbyggda funktionen. FörvÀntningarna pÄ dess fullstÀndighet och tillförlitlighet kommer att vara betydligt lÀgre.
Du behöver ge din funktion ett namn som följer namngivningsprinciperna för Wolfram Language. Dessutom behöver du utveckla dokumentation för din funktion, liknande de inbyggda funktionerna i sprÄket. Jag kommer att förklara mer om detta senare. Just nu, observera bara att det i raden med knappar högst upp i definitionsblocket finns en knapp , som förklarar vad som ska göras, och en knapp «Verktyg», som ger verktyg för att formatera dokumentationen för din funktion.
NÀr du har sÀkerstÀllt att allt Àr korrekt ifyllt och du Àr redo, klicka pÄ knappen «Check» («Kontrollera»). Det Àr helt normalt om du Ànnu inte har förstÄtt alla detaljer. DÀrför kommer funktionen «Check» att köras automatiskt och göra mÄnga kontroller av stil och konsekvens. Ofta kommer den omedelbart att be dig bekrÀfta och acceptera rÀttelser (till exempel: «Den hÀr raden bör avslutas med ett kolon», och den föreslÄr att du lÀgger till ett kolon). Ibland kommer den att be dig lÀgga till eller Àndra nÄgot sjÀlv. Vi kommer stÀndigt att lÀgga till nya funktioner för den automatiska funktionaliteten hos knappen «Check», men dess huvudsakliga mÄl Àr att sÀkerstÀlla att allt du skickar till funktionslagret redan uppfyller sÄ mÄnga stilrÄd som möjligt.

SÄ, efter att du har tryckt pÄ "Check" kan du anvÀnda "Preview". "Preview" skapar en förhandsvisning av dokumentationssidan som du har 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 vad du ser i förhandsvisningen, gÄ bara tillbaka och gör de nödvÀndiga Àndringarna, och tryck sedan pÄ knappen Preview igen.
Nu Àr du redo att publicera din funktion i repositoryt. Knappen Deploy ger dig fyra handlingsalternativ:

I det hÀr steget Àr det viktigt att notera att du kan skicka din funktion till Wolframs funktionsrepository sÄ att den blir tillgÀnglig för alla anvÀndare. Du kan ocksÄ publicera din funktion för ett begrÀnsat antal anvÀndare. Till exempel kan du skapa en funktion som publiceras lokalt pÄ din dator sÄ att den Àr tillgÀnglig nÀr du anvÀnder just denna dator. Eller sÄ kan du publicera den i ditt , sÄ att den Àr tillgÀnglig för dig nÀr du Àr ansluten till molnet. Du kan ocksÄ offentligt publicera (distribuera) funktionen via ditt molnkonto. Den kommer dock inte att finnas i Wolframs centrala funktionsrepository, men du kan ge nÄgon URL:en som gör att de kan hÀmta din funktion frÄn ditt konto. (I framtiden kommer vi ocksÄ att stödja centrala repositoryn pÄ företagsnivÄ.)
SÄ, antag att du verkligen vill överföra din funktion till Wolframs kunskapsbas för funktioner. För detta klickar du pÄ knappen "Skicka" till repositoryt. Vad hÀnder dÄ just nu? Din ansökan hamnar omedelbart i kö för granskning och godkÀnnande av vÄrt speciella team av kuratorer.
NÀr din ansökan gÄr igenom godkÀnnandeprocessen (vilket vanligtvis tar nÄgra dagar) kommer du att fÄ meddelanden om statusen för den samt eventuellt förslag pÄ hur den kan anvÀndas vidare. Men sÄ snart din funktion har godkÀnts kommer den omedelbart att publiceras i Wolfram-funkternas arkiv och bli tillgÀnglig för all anvÀndning. (Och detta kommer att visas i och sÄ vidare.)
Vad bör finnas i arkivet?
Det bör noteras att vÄrt företag har mycket höga standarder för fullstÀndighet, pÄlitlighet och allmÀn kvalitet; av de 6000+ funktioner som vi redan har integrerat i Wolfram-sprÄket under de senaste 30 Ären uppfyller alla dessa krav. Syftet med Wolfram-funkternas arkiv Àr att anvÀnda hela strukturen och funktionaliteten som redan finns i Wolfram-sprÄket för att lÀgga till sÄ mÄnga mer lÀttanvÀnda funktioner som möjligt (det vill sÀga funktioner med högre prestanda).
SjĂ€lvklart mĂ„ste funktioner i Wolfram-funkternas arkiv följa principerna för utveckling av Wolfram-sprĂ„ket â sĂ„ att de kan interagera fullt ut med andra funktioner och uppfylla anvĂ€ndarnas förvĂ€ntningar pĂ„ hur funktioner ska fungera korrekt. Dock behöver funktionerna inte ha samma fullstĂ€ndighet eller pĂ„litlighet.
I de inbyggda funktionerna i Wolfram-sprÄket arbetar vi hÄrt för att göra programvarufunktionerna sÄ generella som möjligt. Samtidigt Àr det inget fel i att en funktion som bara hanterar ett mycket specifikt, men anvÀndbart, fall kommer in i Wolfram-funkternas arkiv. Till exempel kan funktionen ta emot filer i ett visst format och skapa e-post pÄ ett specifikt sÀtt. skapar diagram endast med vissa fÀrger och etiketter och sÄ vidare.
En annan aspekt relaterad till inbyggda funktioner Àr att vÄrt företag gör allt för att hantera alla atypiska fall, för att korrekt bearbeta ogiltig indata och sÄ vidare. I funktionsbiblioteket Àr det helt normalt att det finns en speciell funktion som hanterar de huvudsakliga fallen av problemet och ignorerar alla andra.
Det Ă€r uppenbart att det Ă€r bĂ€ttre att ha funktioner som gör mer och gör det bĂ€ttre, men optimering för funktionsbiblioteket â till skillnad frĂ„n inbyggda funktioner i Wolfram-sprĂ„ket â bör ha fler funktioner som Ă€r kopplade till flera andra funktioner, snarare Ă€n att fördjupa sig i implementationsprocesserna för varje specifik funktion.
LĂ„t oss nu titta pĂ„ ett exempel pĂ„ testning av funktioner i biblioteket. FörvĂ€ntningarna pĂ„ konsistens för sĂ„dana funktioner Ă€r naturligtvis betydligt lĂ€gre Ă€n för inbyggda funktioner i sprĂ„ket. Detta Ă€r sĂ€rskilt relevant nĂ€r funktionerna Ă€r beroende av externa resurser, som API:er; det Ă€r viktigt att stĂ€ndigt genomföra konsekventa tester, vilket automatiskt sker inom testalgoritmerna. I filen nb kan du tydligt ange definitioner (i avsnittet âYtterligare informationâ) och ange sĂ„ mĂ„nga tester som du anser nödvĂ€ndiga, definierade antingen av indatavĂ€rden eller kompletta symboliska objekt av typen , hur mĂ„nga du Ă€n tycker Ă€r nödvĂ€ndiga. Dessutom försöker systemet stĂ€ndigt att omvandla de exempel du angivit i dokumentationen till testprocessen (ibland kan detta vara ganska resurskrĂ€vande, till exempel för en funktion vars resultat beror pĂ„ slumpmĂ€ssiga tal eller tidpunkten pĂ„ dagen).
Som ett resultat kommer det att finnas ett antal genomförandestörningar i funktionsbiblioteket. NÄgra kommer att vara endast en rad kod, medan andra kan inkludera tusentals eller tiotusentals rader, antagligen med anvÀndning av mÄnga hjÀlpfunktioner. I vilka fall bör en funktion lÀggas till, för vilken mycket lite kod krÀvs? I princip, om funktionen har , som anvÀndare gÀrna skulle förstÄ om de sÄg det i en del av koden, kan den lÀggas till. Annars Àr det troligen bÀttre att bara skriva in koden igen i ditt program varje gÄng du behöver anvÀnda den.
Huvudsyftet med funktionsbiblioteket (som namnet antyder) Àr att introducera nya funktioner i sprÄket. Om du vill lÀgga till nya data eller , anvÀnd . Men vad gör man om man vill införa nya typer av objekt för sina berÀkningar?
Det finns faktiskt tvÄ vÀgar. Du kanske vill införa en ny objekttyp som ska anvÀndas i nya funktioner i funktionsbiblioteket. I sÄ fall kan du alltid helt enkelt skriva dess symboliska representation och anvÀnda den vid inmatning eller utmatning av funktioner i funktionsbiblioteket.
Men vad gör man om man vill representera ett objekt och sedan definiera det, genom befintliga funktioner i Wolfram-sprÄket, som ska fungera tillsammans med det? För detta har Wolfram-sprÄket alltid haft en enkel mekanism som kallas . Med vissa begrÀnsningar (speciellt för funktioner som ), lÄter funktionsbiblioteket dig enkelt representera en funktion och definiera dess vÀrden. (För att öka förvÀntningen pÄ konsekvens vid skapande av nya viktiga konstruktioner, som Àr helt integrerade överallt i Wolfram-sprÄket - detta Àr vanligtvis en mycket viktig procedur som inte kan uppnÄs enbart genom att öka projektkostnaden, och detta Àr vad vÄrt företag gör inom ramarna för lÄngsiktiga sprÄkprojekt, dÀr uppgiften inte Àr ett mÄl i utvecklingen av biblioteket).
SĂ„ vad kan finnas i funktionskoden i funktionsbiblioteket? , förstĂ„s (Ă„tminstone om det inte pĂ„verkar för och programmets sjĂ€lva funktionalitet, som berĂ€kningsmiljö) samt alla funktioner frĂ„n funktionsbiblioteket. Dessutom finns det ocksĂ„ andra funktionsmöjligheter: en funktion i funktionsbiblioteket kan anropa API:er, antingen i , eller . SjĂ€lvklart finns det vissa risker förknippade med detta. PĂ„ grund av att det inte finns nĂ„gra garantier för att API:et inte kommer att Ă€ndras, och att funktionen i funktionslagret kommer att sluta fungera. För att identifiera sĂ„dana problem finns det en anmĂ€rkning pĂ„ dokumentationssidan (i avsnittet "Krav") för varje funktion som beror pĂ„ mer Ă€n bara den inbyggda funktionen i Wolfram Language. (Naturligtvis kan det finnas problem Ă€ven med sĂ„dan funktionalitet nĂ€r det handlar om verkliga data â eftersom verkliga data om vĂ€rlden stĂ€ndigt förĂ€ndras, och ibland Ă€ndras Ă€ven deras definitioner och struktur.)
MÄste all kod för Wolfram-funktionsförrÄdet vara skriven i Wolfram-sprÄket? Absolut, koden inom externa API:er behöver inte vara skriven i Wolfram-sprÄket, vilket i grunden inte gör koden till sprÄkets kod. I sjÀlva verket, om du hittar en funktion nÀstan pÄ vilket externt sprÄk eller bibliotek som helst, kan du skapa en wrapper som gör att man kan anvÀnda den i Wolfram-funktionsförrÄdet. (Vanligtvis bör man anvÀnda inbyggda funktioner eller i koden i Wolfram-sprÄket.)
SÄ vad Àr poÀngen med detta? I grunden möjliggör det att anvÀnda hela det integrerade Wolfram Language-systemet och dess enhetliga uppsÀttning mjukvarufunktioner. Om du fÄr en grundlÀggande implementation frÄn ett externt bibliotek eller sprÄk, kan du sedan anvÀnda det rika symboliska systemet i Wolfram Language för att skapa en anvÀndarvÀnlig toppfunktion som gör det ganska enkelt för anvÀndare att anvÀnda vilken redan implementerad funktionalitet som helst. à tminstone ska detta kunna genomföras i en idealisk vÀrld dÀr alla komponenter för att ladda bibliotek och sÄ vidare finns, och i detta fall kommer de automatiskt att lösas med hjÀlp av Wolfram Language. (Det bör noteras att det i praktiken kan förekomma problem med i ett specifikt datasystem, och i molnlagring kan det uppstÄ ytterligare sÀkerhetsproblem).
NÀr du första gÄngen analyserar typiska externa bibliotek kan de ofta verka för komplexa för att sammanfattas med bara nÄgra funktioner. Men i mÄnga fall beror den stora delen av komplexiteten pÄ den infrastruktur som krÀvs för biblioteket och alla funktioner för dess stöd. Men vid anvÀndning av Wolfram Language Àr infrastrukturen vanligtvis redan inbyggd i paketen, och dÀrför behöver man inte gÄ in pÄ alla dessa stödfunktioner i detalj, utan man behöver bara skapa funktioner för nÄgra "överskiktliga" funktioner som Àr applikationsorienterade för biblioteket.
Kunskapsbasens "ekosystem"
Om du har skrivit funktioner som du anvÀnder stÀndigt, skicka dem till Wolframs funktionsrepository! Om det inte kommer att resultera i nÄgot större (utvecklingen av sprÄket) sÄ kommer det fortfarande att vara mycket bekvÀmare att anvÀnda funktioner för personligt bruk. Men det Àr logiskt att anta att om du anvÀnder funktioner hela tiden, sÄ kan andra anvÀndare ocksÄ finna dem anvÀndbara.
Naturligtvis kan du hamna i en situation dĂ€r du inte har möjlighet â eller inte vill â dela dina funktioner, eller i fall av Ă„tkomst till privata informationsresurser. Ăven i sĂ„dana fall kan du helt enkelt distribuera funktioner i ditt eget molnkonto, . (Om din organisation har en Wolfram Enterprise privat moln, sĂ„ kommer det snart kunna hosta sitt eget privata funktionsrepository som kan administreras frĂ„n din organisation och installera tvingad visning av vyer eller inte för externa anvĂ€ndare.) Efter publiceringen av en funktion har dess sida alltid tvĂ„ lĂ€nkar lĂ€ngst ner: "
Funktionerna som du skickar till Wolfram-funktionens arkiv behöver inte vara perfekta; de mĂ„ste bara vara anvĂ€ndbara. Det Ă€r lite som avsnittet "Buggar" i klassisk Unix-dokumentation â i "Definitionsavsnittet" finns det en sektion "Författarens anteckningar" dĂ€r du kan beskriva begrĂ€nsningar, problem med mera som du redan kĂ€nner till angĂ„ende din funktion. Dessutom, nĂ€r du skickar din funktion till arkivet, kan du lĂ€gga till anteckningar om inskickningen som kommer att lĂ€sas av en speciell grupp av kuratorer.
Efter att funktionen har publicerats har dess sida alltid tvÄ lÀnkar lÀngst ned: "" och "». Om du bifogar en mÀrkning (till exempel att rapportera buggar), kan du sÀtta en kryssruta som sÀger att du vill att ditt meddelande och kontaktinformation ska skickas till funktionen författare.
Ibland finns det behov av att bara anvÀnda funktioner frÄn Wolfram-funktionsförrÄdet, till exempel inbyggda funktioner, utan att titta pÄ deras kod. Men om du vill "kika in", finns det alltid en "Anteckningsbok"-knapp högst upp. Klicka pÄ den sÄ fÄr du din egen kopia av den ursprungliga anteckningsboken med definitionen som skickades till funktionsförrÄdet. Ibland kan du helt enkelt anvÀnda den som ett exempel för dina behov. Du kan ocksÄ utveckla din egen modifiering av denna funktion. Kanske vill du lagra de funktioner du hittar frÄn förrÄdet pÄ din dator eller i ditt molnlagringskonto, eller sÄ kanske du vill skicka dem till funktionskunskapsbasen, kanske som en förbÀttrad, kompletterad version av den ursprungliga funktionen.
I framtiden planerar vi att stödja git-stil grenar för funktionsförrÄd, men just nu försöker vi göra det enklare, och vi har alltid bara en allmÀnt accepterad version av varje funktion inbyggd i sprÄket. Oftast (om inte utvecklarna avstÄr frÄn att underhÄlla sina utvecklade funktioner och svarar pÄ anvÀndarnas meddelanden) fÄr den ursprungliga författaren av funktionen kontroll över uppdateringar till den och skickar nya versioner som sedan kontrolleras och, om de gÄr igenom granskningsprocessen, publiceras i sprÄket.
LÄt oss titta pÄ frÄgan om hur "versionshantering" av utvecklade funktioner fungerar. Just nu, nÀr du anvÀnder en funktion frÄn funktionsförrÄdet, kommer dess definition alltid att lagras pÄ din dator (eller i ditt molnlagringskonto, om du anvÀnder molnet). Om en ny version av funktionen dyker upp, kommer du att fÄ ett meddelande som informerar dig om detta vid nÀsta anvÀndning. Och om du vill uppdatera funktionen till den nya versionen kan du göra det med kommandot ("Functional BLOB-object" lagrar faktiskt mer information om versioner, och vi planerar att göra detta mer tillgÀngligt för vÄra anvÀndare i framtiden.)
En av de fantastiska funktionerna i Wolfram-funktionens bibliotek Àr att vilket program som helst i Wolfram Language, var som helst, kan anvÀnda funktioner frÄn det. Om programmet finns i en anteckning kan det oftast vara anvÀndbart att formatera funktionerna i biblioteket som lÀttlÀsta "funktionella binÀra objekt" (eventuellt med ett lÀmpligt versionsset).
Du kan alltid komma Ät vilken funktion som helst i funktionsbiblioteket genom att anvÀnda textstrÀngen . Och detta Àr vÀldigt praktiskt om du skriver kod eller skript direkt för Wolfram Engine, till exempel med (Det Àr sÀrskilt vÀrt att nÀmna att funktionsbiblioteket Àr helt kompatibelt med ).
Hur fungerar det?
Inom funktionerna i Wolfram-biblioteket Àr detta möjligt att anvÀnda samma databas, som i (databas, , och sÄ vidare), liksom alla andra systemresurser frÄn Wolfram, bygger i slutÀndan pÄ funktionen .
LÄt oss titta pÄ :

Inuti kan du se viss information med hjÀlp av funktionen :

Hur fungerar instÀllningen av resursfunktionen? Den 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 den aktuella sessionsarbetet i programmet:

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

Observera att det i detta BLOB-objekt för funktionen finns en svart ikon.
Detta betyder att BLOB-funktionen avser en resursfunktion i minnet, definierad för den aktuella sessionen. För en resursfunktion som lagras permanent pÄ din dator eller i ditt molnkonto finns en grÄ ikon.
Och för en officiell resursfunktion i Wolfram-funktionsbiblioteket finns en orange ikon.
.
SÄ vad hÀnder nÀr du anvÀnder menyn "Distribution" i definitionsanteckningen? Först tar den alla definitioner i anteckningen och skapar symbolisk ). (Och om du anvÀnder en textbaserad IDE eller program kan du ocksÄ uttryckligen skapa )
Lokal distribution av funktionen frĂ„n arkivet till din dator sker med hjĂ€lp av kommandot för resursobjektet för att spara det som i ditt filsystem. Distribution i ett molnkonto görs med hjĂ€lp av kommandot för resursobjektet, medan offentlig distribution i molnet â . I alla fall anvĂ€nds ocksĂ„ för att registrera namnet pĂ„ resursfunktionen, sĂ„ att kommer att fungera.
Om du klickar pÄ knappen Skicka för Funktionsarkivet, sÄ hÀnder det som ligger under den anropas pÄ resursobjektet. (Och om du anvÀnder ett textbaserat inmatningsgrÀnssnitt kan du ocksÄ anropa direkt.)
Som standard skickas det under namnet kopplat till ditt Wolfram ID. Men om du skickar en ansökan Ä namn av en utvecklargrupp eller organisation, kan du och istÀllet anvÀnda det som namn för att interagera med dina vyer.
Efter att du har skickat nÄgon av dina funktioner till kunskapsbasen för funktioner kommer den att hamna i kö för granskning. Om du fÄr feedback som svar kommer den vanligtvis att vara i form av en textfil med tillagda extra «kommentarsrutor». Du kan alltid kontrollera status för din ansökan genom att gÄ till . Men sÄ snart din funktion har godkÀnts kommer du att meddelas (via e-post), och din funktion kommer att publiceras i Wolframs funktionsarkiv.
NÄgra detaljer angÄende arbetet
Vid första anblick kan det verka som att man bara kan ta definitionsanteckningen och bokstavligen sĂ€tta in den i funktionsarkivet, men det finns faktiskt mĂ„nga detaljer â och för att hantera dem krĂ€vs en ganska komplex meta-programmering, som symboliskt behandlar bĂ„de koden som definierar funktionen och sjĂ€lva definitionsanteckningen. Större delen av detta sker internt, det vill sĂ€ga «bakom kulisserna», men det kan ha vissa följder som det Ă€r bra att förstĂ„ om du planerar att bidra till kunskapsbasen för funktioner.
Den första direkta nyansen: NĂ€r du fyller i "Definition Blocks" kan du enkelt referera till din funktion överallt med ett namn som liknar MyFunction, vilket ser ut som ett vanligt funktionsnamn i Wolfram Language, men för dokumentationen av funktionsbiblioteket ersĂ€tts det med â det Ă€r exakt vad anvĂ€ndarna faktiskt kommer att anvĂ€nda nĂ€r de arbetar med funktionen.
Den andra nyansen: nÀr du skapar en resursfunktion frÄn Definition Blocks mÄste alla beroenden som ingÄr i funktionsdefinitionen vara faststÀllda och uttryckligen inkluderade. För att sÀkerstÀlla att definitionerna förblir modulÀra mÄste allt placeras i ett unikt . (Naturligtvis Àr , rost i funktionsbiblioteket.)
Vanligtvis ser du aldrig nÄgra spÄr av koden som anvÀnds för att konfigurera detta namnrum. Men om du av nÄgon anledning skulle kalla pÄ ett oavslutat symbol inom din funktion, kommer du att se att den symbolen befinner sig i funktionen inre kontext. Men nÀr du hanterar Definition Blocks, Ätminstone, symbolen som motsvarar sjÀlva funktionen, som en funktionell BLOB istÀllet för en rÄ symbol i den inre kontexten.
Funktionsbiblioteket Àr avsett för att definiera nya funktioner. Och dessa funktioner kan ha alternativ. Ofta kommer dessa parametrar (till exempel, eller ) att kunna anvÀndas för inbyggda funktioner samt för de som redan har inbyggda symboler. Men ibland kan en ny funktion behöva nya alternativ ocksÄ. För att bevara modularitet Àr det nödvÀndigt att dessa parametrar Àr symboler definierade i en unik inre kontext (eller nÄgot liknande hela resursfunktioner, det vill sÀga i sig sjÀlva). För enkelhetens skull lÄter funktionsbiblioteket definiera nya alternativ i definitioner som strÀngar. Och för anvÀndarens bekvÀmlighet, bearbetas dessa definitioner (förutsatt att de har anvÀnt och ) ocksÄ sÄ att nÀr man anvÀnder funktioner kan parametrarna anges inte bara som strÀngar utan Àven som globala symboler med samma namn.
De flesta funktioner gör helt enkelt det de ska göra varje gĂ„ng de anropas, men vissa funktioner behöver initieras innan de kan fungera i en specifik session â och för att lösa detta problem finns det en sektion om "Initiering" i avsnittet "Definition".
Funktioner frÄn biblioteket kan anvÀnda andra funktioner som redan finns i biblioteket för att stÀlla in definitioner för funktionsbiblioteket, inklusive tvÄ (eller fler) funktioner som hÀnvisar till varandra. Det Àr nödvÀndigt att utveckla dem i sin programanvÀndningssession sÄ att du kan referera till dem som , dÄ kan du skapa de kombinationer av dessa funktioner du behöver och lÀgga till en ny funktion i biblioteket baserat pÄ de som redan har publicerats.
Framtidsutsikter. Vad ska hÀnda nÀr biblioteket verkligen blir stort?
Idag lanserar vi bara Wolfram-funktionsbiblioteket, men med tiden förvÀntar vi oss att dess storlek och funktionalitet kan öka dramatiskt, och nÀr det vÀxer framkommer olika problem, som vi redan antar kan uppstÄ.
Det första problemet handlar om funktionsnamn och deras unikhet. Funktionsbiblioteket Àr utformat sÄ att, precis som med inbyggda funktioner i Wolfram-sprÄket, kan man referera till vilken given funktion som helst genom att helt enkelt ange dess namn. Men det innebÀr ofrÄnkomligen att funktionsnamnen mÄste vara globalt unika inom hela biblioteket, sÄ att det till exempel bara kan finnas en .
Vid första anblick kan detta verka som ett stort problem, men det Ă€r viktigt att förstĂ„ att det i huvudsak Ă€r samma problem som för saker som internetdomĂ€ner eller sociala medie-taggar. Och faktum Ă€r att systemet helt enkelt mĂ„ste ha en registrator â och det Ă€r en av de roller som vĂ„rt företag kommer att utföra för Wolframs funktionskunskapsdatabas. (För privata versioner av biblioteket kan deras registratorer vara administratörer.) SjĂ€lvklart kan en internetdomĂ€n registreras utan att ha nĂ„got pĂ„ den, men i funktionsbiblioteket kan funktionsnamnet endast registreras om det finns en faktisk funktionsdefinition.
En del av vÄr roll i förvaltningen av Wolframs funktionsdatabas Àr att sÀkerstÀlla att namnet som vÀljs för en funktion Àr logiskt med avseende pÄ funktionens definition och att det överensstÀmmer med namngivningskonventionerna för Wolfram Language. Vi har över 30 Ärs erfarenhet av att namnge inbyggda funktioner pÄ Wolfram Language, och vÄrt kuratorteam kommer att bevara denna erfarenhet i funktionsrepo. Det finns alltid undantag. Till exempel kan det verka mer fördelaktigt att ha ett kort namn för vissa funktioner, men det Àr ofta bÀttre att
(HÀr bör det noteras att enbart tillÀgg av nÄgon deltagares tagg för att eliminera tvetydighet i funktionerna inte kommer att ge förvÀntad effekt. Eftersom, om det inte insisteras pÄ att en tagg alltid tilldelas, mÄste en standardtagg definieras för varje angiven funktion samt författarens taggar, vilket Änyo krÀver global samordning.)
I takt med att Wolframs funktionsdatabas vÀxer, kommer en av de problem som sÀkert kommer att uppstÄ att vara upptÀckbarheten av funktioner, för detta finns det i systemet (och definitionsfiler kan inkludera nyckelord och sÄ vidare). För inbyggda funktioner i Wolfram Language finns det alla slags korsreferenser i dokumentationen som hjÀlper till att 'marknadsföra' funktioner. Funktioner i funktionsrepo kan hÀnvisa till inbyggda funktioner. Men hur Àr det Ät andra hÄllet? För detta avser vi att experimentera med olika arrangemang för att fÄ funktionerna i repo att presenteras pÄ dokumentationssidorna för inbyggda funktioner.
För inbyggda funktioner i Wolfram Language finns det sÄ kallad upptÀckbarhetsnivÄ som tillhandahÄlls av , som tillhandahÄller organiserade listor över funktioner relaterade till specifika omrÄden. Det Àr alltid svÄrt att korrekt balansera referenssidor, och i takt med att Wolfram-sprÄket vÀxer mÄste referenssidor ofta helt omorganiseras. Det Àr ganska enkelt att placera funktioner frÄn depot i breda kategorier och till och med konsekvent bryta ner dessa kategorier, men det Àr mycket mer vÀrdefullt att ha korrekt organiserade referenssidor för sprÄket. Det Àr fortfarande oklart hur man bÀst ska skapa dem för hela kunskapsbasen av funktioner. Till exempel, i funktionsdepotet kan vem som helst publicera en webbsida som innehÄller sina "val" frÄn depÄn:

Wolfram-funktionsdepot Àr instÀllt som en permanent lagring av funktioner dÀr vilken funktion som helst alltid kommer att fungera. SjÀlvklart kan nya versioner av funktioner dyka upp, och vi förvÀntar oss att vissa funktioner kommer att bli förÄldrade över tid. Funktionerna kommer att fungera om de anvÀnds i program, men deras dokumentationssidor kommer att hÀnvisa till nya, mer avancerade funktioner.
Wolfram-funktionsdepot Àr avsett för snabb Ätkomst till nya funktioner och att utforska nya möjligheter att anvÀnda Wolfram-sprÄket. Med en stor dos optimism hoppas vi att en del av det som har utforskats i funktionsdepÄn sÄ smÄningom kommer att ha mening att bli inbyggda delar av huvudsprÄket Wolfram Language. Under det senaste decenniet har vi haft en liknande uppsÀttning . Och en av de lÀrdomar som dragits frÄn denna erfarenhet Àr att det krÀvs mycket arbete för att uppnÄ de kvalitets- och konsekvensstandarder som vi lÀgger stor vikt vid i allt som Àr inbyggt i Wolfram-sprÄket, vilket ofta Àr mer komplicerat Àn de initiala anstrÀngningarna att implementera en idé. Men Àven i det hÀr fallet kan funktionen 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 funktionen i funktionsarkivet Àr tillgÀnglig för varje anvÀndare att anvÀnda direkt nu. Kanske kan det inbyggda sprÄket erbjuda mycket mer och vara mer effektivt, men funktionsarkivet ger anvÀndarna omedelbar tillgÄng till alla nya funktioner. Och vad som Àr sÀrskilt viktigt Àr att detta koncept tillÄter alla att lÀgga till sina egna nya funktioner.
Tidigare i Wolfram-sprÄkets historia skulle den hÀr idén inte ha fungerat lika bra som den gör nu, men i detta skede har sÄ mycket arbete lagts ner pÄ sprÄket, och en sÄ djup förstÄelse för sprÄkets designprinciper finns nu, att det nu verkar mycket möjligt för en stor gemenskap av anvÀndare att lÀgga till funktioner som stödjer projektets sammanhang och gör dem anvÀndbara för en bredare publik.
I Wolfram Language-gemenskapen finns det en otrolig anda av talang. (SjÀlvklart ingÄr mÄnga ledande experter inom forskning och utveckling frÄn olika omrÄden i denna gemenskap.) Jag hoppas att Wolfram-funktionsarkivet kommer att erbjuda en effektiv plattform för att upptÀcka och sprida denna talanganda. Endast tillsammans kan vi skapa nÄgot som vÀsentligt utökar det omrÄde som Wolframs berÀkningsparadigm kan tillÀmpas pÄ.
Under mer Àn 30 Är har vi kommit en lÄng vÀg med Wolfram-sprÄket. Nu, tillsammans, lÄt oss gÄ Ànnu lÀngre. Jag uppmanar alla respekterade anvÀndare av Wolfram-sprÄket vÀrlden över att anvÀnda det funktionella arkivet som plattform för detta, sÄvÀl som det nya mjukvaruprojektet Free Wolfram Engine för utvecklare.
KĂ€lla: habr.com
