Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Hej, Habr! Jeg præsenterer hermed oversættelsen af Stephen Wolframs indlæg «Wolfram Funktions Repository: Lancering af en Åben Platform til Udvidelse af Wolfram Sprog».

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Forudsætninger for Wolfram Sprogets styrke

I dag står vi på tærsklen til store bedrifter sammen med programmeringssproget Wolfram Sprog. For kun tre uger siden lancerede vi en gratis Wolfram-motor til udviklere, for at hjælpe vores brugere med at integrere Wolfram Sprog i deres omfattende softwareprojekter. I dag lancerer vi Wolfram funktion repository, for at tilbyde en koordineret platform for funktioner designet til at udvide Wolfram Sproget, samt åbner vi funktionen repository for alle, der kan bidrage til udviklingen af vores softwareprodukt.

Wolfram funktion repository er muligt takket være den unikke karakter af Wolfram Sprog, ikke kun som et programmeringssprog, men også som et fuldgyldigt beregningsmæssigt sprog. I traditionelle programmeringssprog kræver tilføjelsen af betydningsfulde nye funktioner normalt oprettelsen af helt nye biblioteker, som måske eller måske ikke fungerer godt sammen. Men i Wolfram Sprog er der allerede så meget indbygget i sproget, at der er mulighed for betydeligt at udvide dets funktionalitet ved blot at tilføje nye funktioner, der straks integreres i den overordnede struktur af hele sproget.

For eksempel indeholder Wolfram funktion repository allerede 532 nye funktioner kategoriseret i 26 emnekategorier:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Ligesom mere end 6000 standardfunktioner, indbygget i Wolfram Sprog, har hver funktion fra repository en dokumentationsside med detaljerede beskrivelser og eksempler:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

For at få adgang til siden skal du kopiere det ovenstående objekt (funktionel BLOB), indsætte det i inputfeltet og derefter køre funktionen – den er allerede indbygget i Wolfram Sprog og understøttes som standard fra version 12.0:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Her skal det bemærkes, at ved behandling af LogoQRCode Behøver du ikke at indstille "billede behandlingsbiblioteket" — da vi allerede i Wolfram Sprog har implementeret en sekventiel og grundigt algoritmiseret metode til billedbehandling, som straks kan behandles af forskellige grafiske funktioner i sproget:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Jeg håber, at med støtte fra et fantastisk og talentfuldt fællesskab, som er vokset og udvidet (baseret på Wolfram Language) i de sidste flere årtier. Wolfram-funktionernes repository vil i den nærmeste fremtid markant udvide rækkevidden af (muligvis potentielt betydelige, specialiserede inden for forskellige videnskabs- og teknikområder) funktioner, der er tilgængelige i sproget. Dermed opstår muligheden for at bruge både indholdet af sproget (dets indbyggede funktioner) samt udviklingsprincipper, som implementeres baseret på sproget. (Her skal det bemærkes, at Wolfram Language har mere end 30 års udviklingshistorie og stabil vækst.).
Inden for funktionerne fra repository kan der være små eller ret omfattende koder skrevet i Wolfram Language. For eksempel kan dette være opkald til eksterne API'er og tjenester eller eksterne biblioteker på andre sprog. En unik egenskab ved denne tilgang er, at når du går til funktionalitet på brugerniveau, vil der ikke være nogen potentielle uoverensstemmelser, da denne tilgang er bygget på en konsistent struktur af Wolfram Language — og hver funktion vil automatisk fungere korrekt — præcis som den skal.
Shellen og den programmæssige struktur af Wolfram-funktionernes repository er indstillet sådan, at enhver kan bidrage til det fælles mål på den nemmeste og mest bekvemme måde for dem — i det væsentlige blot ved at udfylde en tekstfil (med .nb) WL. Indbyggede automatiske funktioner tillader at kontrollere nye tilføjede funktioner i repositoryet for at sikre deres integrering i sproget. Vores virksomhed satser på en bred vifte af brugere, der kan integrere deres funktioner i sproget, snarere end på store kompleksiteter med nye funktioner — og selvom der er implementeret en kontrolproces her, insisterer vi ikke på noget som omhyggeligt analysearbejde eller strenge standarder for fuldstændighed og pålidelighed af nye brugerfunktioner, i modsætning til de mere grundige kontroller af funktioner, der er indbygget i sprogets kerne, som vi anvender.

I denne tilgang er der mange kompromiser og detaljer, men vores mål er at optimere Wolfram-funktionsbiblioteket både for brugervenlighed og for at sikre, at nye brugerfunktioner bidrager væsentligt til sprogets udvikling. Efterhånden som vi vokser, er jeg ikke i tvivl om, at vi bliver nødt til at opfinde nye metoder til at håndtere og verificere de funktioner, der integreres i funktioner i biblioteket, og dette ikke mindst for at organisere et stort antal funktioner og finde dem, der er nødvendige for brugerne. Det kan dog ikke undgås at være opmuntrende, at den vej, vi har valgt, er en god start. Jeg har personligt tilføjet flere funktioner til den oprindelige database. Mange af dem er baseret på kode, som jeg personligt har udviklet i lang tid. Og jeg brugte kun et par minutter på at sende dem til biblioteket. Nu hvor de er i biblioteket, kan jeg endelig – straks og når som helst – bruge disse funktioner efter behov uden at bekymre mig om at finde filer, downloade pakker osv.

Forbedring af effektivitet med omkostningsbesparelse

Selv før internettets tid eksisterede der måder at dele Wolfram Language-kode (vores første store centraliserede projekt var MathSource, oprettet til Mathematica i 1991 på CD-ROM-basis osv.). Uden tvivl er den foreslåede tilgang baseret på Wolfram-funktionsbiblioteket et mere kraftfuldt og pålideligt middel til at opnå de nævnte mål.

I over 30 år har vores virksomhed arbejdet hårdt på at opretholde integriteten af Wolfram-sprogets struktur, og det er meget vigtigt for, at Wolfram-sproget ikke blot bliver et programmeringssprog, men også et fuldgyldigt beregningsmæssigt sprog. Således er essensen af tilgangen til implementering af Wolfram-funktionsbiblioteket at anvende en ensartet tilgang til programmering og udvikling af nye funktioner, som konsekvent tilføjes og integreres i rammerne for sprogets udvikling og fælles evolution.

I implementeringstrukturen af hver funktion foregår der forskellige beregningsprocesser. Det er vigtigt at bemærke, at funktionen for brugeren skal have et klart og ensartet udseende samt være letlæselig. I denne sammenhæng præsenteres de indbyggede funktioner i Wolfram Language med mere end 6000 sekventielle eksempler på, hvordan man korrekt programmerer funktioner (det er vores live videoanmeldelser af programmering, som inkluderer hundrede timer af processen til at skabe standardprogrammer). Denne tilgang gør det i sidste ende muligt at skabe et funktionelt repository for Wolfram, der kan arbejde godt; det er netop den strukturelle karakter af Wolfram Language med dens mange ekstra og varierende biblioteker, der allerede er indbygget i sproget. For eksempel, hvis du har en funktion, der behandler billeder, eller sparce arrays, eller molekylære strukturer, samt geografiske data eller andre — sproget har allerede deres koordinerede symbolske repræsentation, hvilket gør, at din funktion straks bliver kompatibel med andre funktioner i sproget.

At skabe et repository, der virkelig fungerer godt, er en interessant opgave inden for metaprogrammering. For eksempel vil et overskud af begrænsninger i programmet ikke tillade at opnå den nødvendige ensartethed og universelle funktion. Lige som med for få funktionelle begrænsninger, vil du ikke være i stand til at implementere en tilstrækkelig korrekt sekvens af algoritmens udførelse. Flere tidligere eksempler på implementering af kompromis mellem disse tilgange, som vores virksomhed har gennemført, har fungeret ret stabilt — det er: Wolfram Demonstration Project, lanceret i 2007 og nu kører i interaktiv tilstand på internettet og indeholder mere end 12000 brugerinteraktive demonstrationer. I Wolfram-databasen findes der mere end 600 færdige databaser, der kan bruges i Wolfram Language, og Wolframs neurale netværkslager bliver opdateret med nye neurale netværk næsten hver uge (der er nu 118), og de bliver straks tilsluttet gennem funktionen NetModel i Wolfram Language.

Alle de ovenstående eksempler har en fundamental egenskab – de objekter og funktioner, der samles i projektet, er meget strukturerede med en klar procesfordeling. Det er klart, at detaljerne i strukturen, som viser en neural netværk eller noget andet, kan variere meget, men den grundlæggende struktur for ethvert eksisterende repository forbliver altid den samme. Hvad er din mening, kære bruger, om at oprette et sådant repository, der tilføjer udvidelser til Wolfram-sproget? Wolfram Language er designet til at være ekstremt fleksibelt, så det kan udvides og ændres på enhver måde. Dette er yderst vigtigt for muligheden for hurtigt at skabe forskellige storskala softwareprojekter i Wolfram Language. Det bør bemærkes, at med en stigning i sprogets fleksibilitet vil omkostningerne ved projekterne også uundgåeligt stige. Dette skyldes, at jo mere brugeren anvender et sådant sprog, desto mere specialiseret funktionalitet får han, men man skal ikke glemme, at denne tilgang også kan have negative sider i forhold til muligheden for at sikre en konsekvent overensstemmelse mellem de programmeringsmoduler.

I traditionelle programmeringssprog findes der et udbredt problem med biblioteker – hvis du for eksempel bruger et bibliotek, fungerer koden korrekt, men hvis du forsøger at bruge flere biblioteker, er der ingen garanti for, at de vil interagere korrekt med hinanden. Desuden i traditionelle programmeringssprog – i modsætning til et fuldgyldigt beregningssprog – mangler der muligheder for garantirende kontrol af tilstedeværelsen af konsekvente indbyggede repræsentationer for enhver funktion eller datatype, bortset fra deres basale strukturer. Men i virkeligheden er problemet endnu større end det ser ud til: hvis nogen opbygger en storskala vertikal funktionalitet, kan man ikke opnå konsistens uden enorme omkostninger til centraliseret programmering af projektet, som vi har investeret i Wolfram-sproget. Derfor er det vigtigt, at alle softwaremoduler altid fungerer korrekt sammen.

Således er ideen med Wolfram-funktionsbiblioteket at undgå det tidligere nævnte problem ved blot at tilføje udvidelser til sproget i form af relativt små stykker programkode gennem separate funktioner, hvis udvikling som sammenhængende moduler er en lettere opgave. Der findes dog programmeringsmuligheder, som ikke kan gøres praktiske ved hjælp af separate funktioner (og vores virksomhed planlægger inden for den nærmeste fremtid at udgive en optimeret softwarealgoritme til hjælp ved implementering af omfattende softwarepakker). Men baseret på de allerede indbyggede funktioner i Wolfram Language er der mange programmeringsmuligheder, der er implementeret ved hjælp af separate funktioner. Her handler det om at kunne skabe en række nye og meget nyttige funktioner med relativt små programmeringsbestræbelser, som kan sikre tilstrækkelig sammenhæng i projektet, samtidig med at de er godt integrerede med hinanden og også desuden kan anvendes bredt i sproget fremadrettet.

Denne tilgang er uden tvivl et kompromis. Ved implementeringen af et større pakke kan man forestille sig en helt ny verden af funktionalitet, som vil blive ekstremt kraftfuld og nyttig. Hvis der er behov for at få nye funktionaliteter, der vil passe ind i det øvrige, men du ikke er klar til at bruge enorme kræfter på projektudvikling, kan dette desværre føre til en reduktion i omfanget af dit projekt. Ideen med Wolfram-funktionsbiblioteket er at sikre funktionalitet, der er den definerende del af projektet; denne tilgang vil tilføje kraftig funktionalitet, mens den forenkler vedligeholdelsen af en god sammenhæng i programmeringsprojektet.

Hjælp til at tilføje brugerdefinerede funktioner til funktionsbiblioteket

Vores specialister har arbejdet hårdt for at gøre deres bidrag til Wolfram-funktionsbiblioteket så let som muligt for brugerne. På skrivebordet (allerede i version 12.0), Du kan bare gå gennem de vigtigste menupunkter sekventielt: File > New > RepositoryItem > Function Repository Item, og du vil få «Definition NoteBook» (programmatisk inden for arbejdsområdet. Du kan også bruge funktionen analog — CreateNotebook[«FunctionResource»]):

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Der er to hovedhandlinger, du skal udføre: for det første, skrive koden til din funktion, og for det andet, skrive dokumentationen, der illustrerer, hvordan din funktion skal fungere.
Klik på knappen «Åbn eksempel» øverst for at se et eksempel på, hvad du skal gøre:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

I virkeligheden prøver du at skabe noget, der ligner en indbygget funktion i Wolfram Language. Med den undtagelse, at den kan gøre noget, der er meget mere specifikt end den indbyggede funktion. I dette tilfælde vil forventningerne til dens fuldstændighed og pålidelighed være meget lavere.
Du skal give din funktion et navn, der overholder navngivningsprincipperne for Wolfram Language funktioner. Derudover skal du udvikle dokumentationen for din funktion, svarende til de indbyggede funktioner i sproget. Jeg vil gå mere i detaljer senere. Lige nu skal du bare bemærke, at der i rækken af knapper øverst i definitionsnote-bogen er en knap «Stilretningslinjer», der forklarer, hvad du skal gøre, og en knap «Værktøjer», der giver dig værktøjerne til at formatere dokumentationen for din funktion.
Når du er sikker på, at alt er udfyldt korrekt, og du er klar, skal du klikke på knappen «Check» («Tjek»). Det er helt normalt, at du ikke har styr på alle detaljerne endnu. Derfor vil funktionen «Check» automatisk blive udført og lave mange stil- og konsistenskontroller. Ofte vil den straks foreslå, at du bekræfter og accepterer rettelser (f.eks.: «Denne linje skal slutte med et kolon», og den vil foreslå at tilføje et kolon). Nogle gange vil den bede dig om at tilføje eller ændre noget selv. Vi vil løbende tilføje nye funktioner til den automatiske funktionalitet af knappen «Check», men dens hovedformål er at sikre, at alt, hvad du sender til funktionsrepositoriet, præcist overholder så mange stilretningslinjer som muligt.

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Så efter at have startet 'Check', kan du bruge 'Preview'. 'Preview' genererer en forhåndsvisning af den dokumentationsside, du har defineret for din funktion. Du kan også lave en forhåndsvisning for en fil, der er oprettet på din computer, eller en fil, der er gemt i skyen. Hvis du af en eller anden grund ikke er tilfreds med det, du ser i forhåndsvisningen, kan du bare gå tilbage og foretage de nødvendige ændringer, og derefter klikke på knappen Preview igen.
Nu er du klar til at uploade din funktion til dit repository. Deploy-knappen giver dig fire muligheder:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

På dette trin er det vigtigt at vide, at du kan sende din funktion til Wolfram-funktioner biblioteket, så den bliver tilgængelig for enhver bruger. Du kan også uploade din funktion for et begrænset antal brugere. For eksempel kan du oprette en funktion, der er hostet lokalt på din computer, så den er tilgængelig, når du bruger netop denne computer. Eller du kan uploade den til din cloud-konto, så den er tilgængelig for dig, når du er tilsluttet til skyen. Du kan også offentliggøre (deploye) funktionen gennem din cloud-konto. Det vil sige, at den ikke vil være i det centrale Wolfram-funktioner bibliotek, men du kan give nogen URL-adressen, som gør det muligt for dem at hente din funktion fra din konto. (I fremtiden vil vi også understøtte centrale biblioteker på tværs af hele vores virksomhed).

Så lad os sige, at du ønsker at overføre din funktion til Wolfram-funktioner vidensdatabasen. For at gøre dette klikker du på 'Send'-knappen i biblioteket. Hvad sker der så i øjeblikket? Din ansøgning kommer med det samme i kø til evaluering og godkendelse af vores specialiserede team af kuratorer.

Mens din ansøgning gennemgår godkendelsesprocessen (som normalt tager nogle dage), vil du modtage meddelelser om status for dens behandling samt muligvis forslag til dens videre brug. Men så snart din funktion er godkendt, vil den straks blive offentliggjort i Wolfram-funktionslageret og være tilgængelig for enhver brug. (Og det vil blive vist i nyhedsoversigt over nye funktioner osv.)

Hvad skal være i lageret?

Det skal bemærkes, at vores virksomhed har meget høje standarder for fuldstændighed, pålidelighed og generel kvalitet; af de over 6000 funktioner, som vi allerede har integreret i Wolfram-sproget gennem de sidste mere end 30 år, opfylder alle de nævnte krav. Målet med Wolfram-funktionslageret er at anvende hele strukturen og funktionaliteten, der allerede findes i Wolfram Language, for at tilføje så mange lettere funktioner som muligt (dvs. funktioner med højere ydeevne).

Selvfølgelig skal funktionerne i Wolfram-funktionslageret overholde principperne for udviklingen af Wolfram Language, så de kan interagere fuldt ud med andre funktioner og brugernes forventninger til, hvordan funktioner korrekt skal fungere. Dog skal funktionerne ikke have nøjagtig samme fuldstændighed eller pålidelighed.

I de indbyggede funktioner af Wolfram-sproget arbejder vi ihærdigt for at gøre softwarefunktioner så generelle som muligt. Dog er der ikke noget galt i, at der er en funktion i Wolfram-funktionslageret, som blot behandler en meget specifik, men nyttig sag. For eksempel kan funktionen SendMailFromNotebook modtage filer i et bestemt format og sende mail på en bestemt måde. PolygonalDiagram opretter diagrammer kun med bestemte farver og mærkning osv.

Et andet aspekt ved indbyggede funktioner er, at vores virksomhed gør en stor indsats for at håndtere alle atypiske tilfælde, for korrekt behandling af ugyldig input osv. I funktionsrepositoryet er det helt normalt, at der findes en specialfunktion, der håndterer de primære tilfælde af opgaveløsningen og ignorerer alle andre.

Det er åbenlyst, at det er bedre at have funktioner, der gør mere, og gør det bedre, men optimeringen for funktionsrepositoryet – i modsætning til Wolfram-sprogets indbyggede funktioner – skal have flere funktioner, der er forbundet med mange flere funktioner, fremfor at dykke ned i implementeringsprocesserne for hver specifik funktion.

Lad os nu se et eksempel på test af funktioner i repositoryet. Forventningerne til konsistens for sådanne funktioner er naturligt meget lavere end for sprogets indbyggede funktioner. Dette er især relevant i tilfælde, hvor funktioner afhænger af eksterne ressourcer, såsom API'er; det er vigtigt konstant at køre konsekvente tests, hvilket automatisk sker inden for testsystemerne. I nb-filen kan du eksplicit angive definitioner (i sektionen "Yderligere oplysninger") og angive så mange tests, som du finder nødvendigt, defineret enten ved input- og output-strenge eller ved komplette symbolske objekter af typen VerificationTest, som du finder passende. Desuden forsøger systemet konstant at omdanne de eksempler fra dokumentationen, du har givet, til en testproces (hvilket nogle gange kan være ret ressourcekrævende, for eksempel for en funktion, hvis resultat afhænger af tilfældige tal eller tid på dagen).

Som et resultat vil der være en række implementeringsudfordringer i funktionsrepositoryet. Nogle vil blot være en enkelt linje kode, mens andre kan inkludere tusinder eller titusinder af linjer, sandsynligvis med brug af mange hjælpefunktioner. Hvornår skal man tilføje en funktion, hvis definition kræver meget lidt kode? I princippet, hvis der findes et godt mnemonisk navn til funktionen., som brugerne nemt ville forstå, når de så det i koden, kan det allerede tilføjes. Ellers er det sandsynligvis bedre bare at skrive koden til dit program igen hver gang, du har brug for at bruge det.

Hovedformålet med funktionsbiblioteket (som navnet antyder) er at introducere nye funktioner i sprogets funktionalitet. Hvis du ønsker at tilføje nye data eller nye enheder, skal du bruge Wolfram Data-repositoriet. Men hvad gør man, hvis man ønsker at introducere nye typer objekter til sine beregninger?

Der er faktisk to veje. Måske vil du introducere en ny type objekt, som vil blive brugt i nye funktioner i funktionsbiblioteket. I så fald kan du altid blot skrive dets symbolske repræsentation og bruge det, når du indfører eller udskriver funktioner i funktionsbiblioteket.

Men hvad gør man, hvis man ønsker at præsentere et objekt og derefter definere det gennem eksisterende funktioner i Wolfram Language, der skal arbejde sammen med det? Til dette har Wolfram Language altid haft en let mekanisme, som kaldes UpValues. Med nogle begrænsninger (især for funktioner, der ikke kan evaluere deres argumenter), giver funktionsbiblioteket dig mulighed for simpelthen at præsentere en funktion og definere værdier for den. (For at øge forventningen om konsistens, når man skaber en ny vigtig konstruktion, der er fuldt integreret i hele Wolfram Language, — det er generelt en meget vigtig procedure, der ikke kan opnås kun ved at øge projektomkostningerne, og det er, hvad vores virksomhed gør inden for langvarige udviklingsprojekter af sproget, denne opgave er ikke et mål, der stilles i udviklingen af repositoriet).

Så hvad kan der være i funktionsbibliotekets kode? Alt, hvad der er indbygget i Wolfram Language, selvfølgelig (i det mindste hvis det ikke udgør trussel for sikkerhed og funktionaliteten af selve programmet, som et beregningsmiljø), ligesom enhver funktion fra funktionsbiblioteket. Derudover er der også andre funktionalitetsmuligheder: en funktion i funktionsbiblioteket kan kalde et API, enten fra Wolfram Cloud, eller eller fra en anden kilde.. Selvfølgelig er der visse risici forbundet med dette. Da der ikke er nogen garantier for, at API'en ikke ændres, kan funktionaliteten i funktionslageret holde op med at fungere. For at opdage sådanne problemer findes der en bemærkning på dokumentationssiden (i afsnittet 'Krav') for enhver funktion, der ikke kun stoler på den indbyggede funktionalitet i Wolfram Language. (Selvfølgelig kan der opstå problemer med sådan funktionalitet, når det gælder virkelige data — fordi virkelige data om verden konstant ændrer sig, og nogle gange endda ændrer deres definitioner og struktur.)

Skal al kode til Wolfram-funktionslageret skrives i Wolfram-sprog? Bestemt, koden inden for et eksternt API behøver ikke at være skrevet i Wolfram-sprog, hvilket faktisk ikke engang gør koden til et sprog. Faktisk, hvis du finder en funktion på næsten ethvert eksternt sprog eller bibliotek, kan du lave en wrapper, der giver dig mulighed for at bruge den i Wolfram-funktionslageret. (Normalt bør man bruge indbyggede funktioner til dette) ExternalEvaluate eller ExternalFunction i Wolfram-sprog.)

Hvorfor skulle man så gøre det? Kort sagt, det giver mulighed for at bruge hele den integrerede system af Wolfram Language og dens ensartede sæt af programmeringsmuligheder. Hvis du får en grundlæggende implementering fra et eksternt bibliotek eller sprog, kan du derefter bruge den rige symbolske struktur i Wolfram Language til at skabe en brugervenlig overordnet funktion, der gør det let for brugerne at anvende enhver allerede implementeret funktionalitet. I det mindste burde det være en mulighed for implementering i en ideel verden, hvor alle elementer til indlæsning af biblioteker osv. eksisterer, i dette tilfælde vil de automatisk blive løst ved hjælp af Wolfram Language. (Det skal bemærkes, at der i praksis kan opstå problemer med opsætningen af eksterne sprog i et specifikt computersystem, og der kan opstå yderligere sikkerhedsproblemer med cloud-lagring).

Når du første gang analyserer standard eksterne biblioteker, virker de ofte alt for komplekse til at kunne dække med blot nogle få funktioner, men i mange tilfælde opstår en stor del af kompleksiteten fra opbygningen af den infrastruktur, der er nødvendig for biblioteket, og alle funktioner til at understøtte det. Men ved brug af Wolfram Language er infrastrukturen som regel allerede indbygget i pakkerne, så det er ikke nødvendigt at afsløre alle disse understøttende funktioner i detaljer; det er blot nødvendigt at skabe funktioner til nogle af de "øverste" applikationsorienterede funktioner i biblioteket.

"Økosystemet" af vidensbasen

Hvis du har skrevet funktioner, som du bruger regelmæssigt, så send dem til Wolfram-funktionernes repository! Selvom det ikke resulterer i noget større (udviklingen af sproget), vil det stadig være meget mere praktisk for dig at bruge funktioner til personlig brug. Det er dog rimeligt at antage, at hvis du bruger funktioner ofte, vil andre brugere også finde dem nyttige.

Naturligvis kan du ende i en situation, hvor du ikke har mulighed for - eller ikke ønsker - at dele dine funktioner eller i tilfælde af adgang til private informationsressourcer. Selv i sådanne tilfælde kan du blot deploye funktioner på din egen cloud-konto, ved at angive rettigheder til adgang. (Hvis din organisation har et privat Wolfram Enterprise cloud,så vil det snart kunne hoste sit eget private repository for funktioner, som kan administreres fra din organisation, og skelne mellem fremvisninger til interne og eksterne brugere.)

Funktionerne, du sender til repositoryet for Wolfram-funktioner, behøver ikke at være perfekte; de skal blot være nyttige. Dette minder lidt om sektionen "Fejl" i klassisk Unix-dokumentation - i "Definition-sektionen" findes der en "Forfatternotater" sektion, hvor du kan beskrive begrænsninger, problemer osv., som du allerede kender til om din funktion. Derudover kan du, når du sender din funktion til repositoryet, tilføje notater til indsendelsen, som vil blive læst af et særligt team af kuratorer.

Når funktionen er offentliggjort, har dens side altid to links nederst: "Send a message about this feature" og "Discuss in the Wolfram communityIf you attach a note (for example, to report errors), you can check the box that says you want your message and contact information to be forwarded to the function's author.

Sometimes there is a need to simply use functions from the Wolfram function repository, such as built-in functions, without delving into their code. However, if you want to 'peek inside', there is always a 'Notebook' button at the top. Click on it, and you will receive your own copy of the original definition notebook that was sent to the function repository. Sometimes you can use it just as an example for your needs. At the same time, you can also develop your own modification of this function. You may want to store these functions you found from the repository on your computer or in your account in your cloud storage, or maybe you want to submit them to the function knowledge base, perhaps, as an improved, extended version of the original function.

In the future, we plan to support branching in Git style for function repositories, but right now we are trying to simplify it, and we always only have one commonly accepted version of each function built into the language. Most often (if developers do not refuse to maintain their functions and respond to user messages), the original author of the function gains control over updates to it and submits new versions, which are then reviewed and, if they pass the verification process, published in the language.

Let's consider how 'versioning' of developed functions works. Right now, when you use a function from the function repository, its definition will be constantly stored on your computer (or in your cloud account if you are using the cloud). If a new version of the function is released, then upon your next use of it, you will receive a message informing you about it. And if you want to update the function to the new version, you can do so with the command ResourceUpdate("En funktionel BLOB-objekt" gemmer i virkeligheden mere information om versioner, og vi planlægger at gøre dette mere tilgængeligt for vores brugere i fremtiden.)

En af de fantastiske funktioner i Wolfram-funktionsbiblioteket er, at ethvert Wolfram Language-program hvor som helst kan bruge funktioner herfra. Hvis programmet vises i en notesbog, kan det ofte være nyttigt at formatere funktionerne fra bibliotekerne som letlæselige "funktionelle binære objekter" (muligvis med et passende sæt versioner).

Du kan altid kalde enhver funktion fra funktionsbiblioteket ved at bruge teksten ResourceFunction […]. Dette er meget praktisk, hvis du skriver kode eller scripts direkte til Wolfram Engine, for eksempel ved hjælp af en IDE eller teksteditor (det bør bemærkes, at funktionsbiblioteket er fuldt kompatibelt med Free Wolfram Engine til udviklere).

Hvordan fungerer det?

Inden for funktionerne i Wolfram-biblioteket er det muligt at bruge præcis den samme ressourcebaserede system som i alle vores andre eksisterende biblioteker (databaser, Neural Net Repository, samling af demonstrationsprojekter osv.), ligesom alle andre systemressourcer fra Wolfram, ResourceFunction er fundamentalt baseret på funktionen ResourceObject.

Lad os overveje ResourceFunction:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Inden i kan du se nogle oplysninger ved at bruge funktionen Information:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Hvordan fungerer opsætningen af ressourcfunktionen? Den enkleste - er et rent lokalt tilfælde. Her er et eksempel, der tager en funktion (i dette tilfælde blot en ren funktion) og definerer den som en ressourcfunktion for den givne session i programmet:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Når du har lavet definitionen, kan du bruge ressourcfunktionen:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Bemærk, at der i dette BLOB-objekt for funktionen er et sort ikon Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog. Det betyder, at BLOB-funktionen refererer til en ressourcfunktion i hukommelsen, der er defineret for den nuværende session. For en ressourcfunktion, der konstant er gemt på din computer eller i din cloud-konto, er der et gråt ikon Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog. Og for en officiel ressourcfunktion i Wolfram-funktionsbiblioteket er der et orange ikon Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog.

Så hvad sker der, når du bruger menuen "Udrulning" i definitionsnotebogen? For det første tager den alle definitionerne i notebogen og opretter symbolsk ResourceObject). (Og bruger du en tekst IDE eller program, kan du også eksplicit oprette ResourceObject)

Lokalt deployment af funktionen fra repository til din computer udføres ved hjælp af kommandoen LocalCache for ressourcens objekt, så det gemmes som LocalObject i dit filsystem. Deployment til en cloud-konto udføres ved hjælp af kommandoen CloudDeploy for ressourcens objekt, mens offentlig deployment i skyen — CloudPublish. I alle tilfælde ResourceRegister bruges også til at registrere navnet på ressourcens funktion, så ResourceFunction[«name»] vil fungere.

Når du klikker på Submit knappen for Function Repository, hvad der sker under den ResourceSubmit kaldes for ressourcens objekt. (Og hvis du bruger et tekst-input interface, kan du også kalde ResourceSubmit direkte.)

Som standard udføres indsendelsen under navnet, der er knyttet til din Wolfram ID. Men hvis du sender en anmodning på vegne af en gruppe udviklere eller organisation, kan du sætte et separat udgiver-ID og i stedet bruge det som navn til interaktion med dine visninger.

Når du har sendt en af dine funktioner til funktionsdatabasen, vil den komme i kø til godkendelse. Hvis du modtager feedback i svar, vil det normalt være i form af en tekstfil med tilføjede ekstra «kommentar-celler». Du kan altid tjekke status for din anmodning ved at gå til deltagerportalen for ressource-systemet. Men så snart din funktion er godkendt, vil du blive informeret (via e-mail), og din funktion vil blive placeret i Wolfram funktionsrepository.

Nogle detaljer ved arbejdet

Ved første øjekast kan det se ud til, at man bare kan tage en definitionsnotat og direkte indsætte det i funktionsrepositoryet, men der er faktisk ret mange detaljer — og til at håndtere dem kræves ret kompleks meta-programmering, som symbolsk behandler både koden, der definerer funktionen, og selve definitionsnotatet. Meget af dette sker internt, altså «bag kulisserne», men det kan have nogle konsekvenser, som det er værd at forstå, hvis du planlægger at bidrage til funktionsdatabasen.

Den første umiddelbare nuance: Når du udfylder "Definitionsnotebook", kan du blot henvise til din funktion overalt ved at bruge et navn som MyFunction, som ser ud som et almindeligt funktionsnavn i Wolfram Language, men for dokumentationen af funktionsbiblioteket bliver det erstattet ResourceFunction["MyFunction"] – det er præcis hvad brugerne reelt vil bruge, når de arbejder med funktionen.

Den anden nuance: når du opretter en ressourcefunktion fra definitionsnotebooket, skal alle afhængigheder involveret i funktionsdefinitionen være fastlagt og eksplicit inkluderet. Men for at sikre, at definitionerne forbliver modulære, skal alt placeres i et unikt navnerum. (Selvfølgelig er funktioner, der gør alt dette, placeret i funktionsbiblioteket.)

Normalt vil du aldrig se nogen spor af koden, der bruges til at konfigurere dette navnerum. Men hvis du af en eller anden grund kalder et ufuldstændigt symbol inden for din funktion, vil du se, at dette symbol er i den interne kontekst af funktionen. Men når man behandler definitionsnotebooket, så er symbolet, der svarer til selve funktionen, konfigureret til bedst mulige visning som en funktionel BLOB, og ikke et råt symbol i den interne kontekst.

Funktionsbiblioteket er beregnet til at definere nye funktioner. Og disse funktioner kan have muligheder. Ofte vil disse parametre (for eksempel, Metode eller ImageSize) have mulighed for at blive brugt til indbyggede funktioner, samt for dem, hvor der allerede findes indbyggede symboler. Men nogle gange kan en ny funktion også kræve nye muligheder. For at bevare modulariteten er det nødvendigt, at disse parametre er symboler defineret i et unikt internt kontekst (eller noget a la hele ressourcefunktioner, altså i sig selv). For enkelhed tillader funktionsbiblioteket at angive nye muligheder i definitioner som strenge. Og for brugeren er disse definitioner (forudsat at de har brugt OptionValue og OptionsPattern) også behandlet, således at når funktionerne bruges, kan parametrene angives ikke kun som strenge, men også som globale symboler med de samme navne.

De fleste funktioner udfører blot det, de skal hver gang, de kaldes, men nogle funktioner kræver initialisering, før de kan fungere i en bestemt session — og for at løse dette problem er der et afsnit 'Initialisering' i sektionen 'Definition'.

Funktioner fra lageret kan anvende andre funktioner, der allerede findes i lageret, til at konfigurere definitioner for funktionslageret, inklusive to (eller flere) funktioner, der refererer til hinanden, som skal udfoldes i din session med programmet, så du kan referere til dem som ResourceFunction[«name»], så kan du skabe de ønskede kombinationer af disse funktioner, eksempler (forstod ikke) og tilføje en ny funktion til lageret baseret på dem, der allerede er placeret tidligere. (eller allerede eller tidligere – begge ord lyder mærkeligt)

Udsigter for udvikling. Hvad skal der ske, når lageret bliver virkelig stort?

I dag starter vi kun funktionslageret Wolfram, men over tid forventer vi, at dets volumen og funktionalitet kan stige markant, og som det vokser, vil der opstå forskellige problemer, som vi allerede formoder kan opstå.

Det første problem vedrører funktionsnavne og deres unikke karakter. Funktionslageret er designet således, at man, ligesom med de indbyggede funktioner i Wolfram Language, kan referere til enhver given funktion blot ved at angive dens navn. Men dette indebærer uundgåeligt, at funktionsnavne skal være globalt unikke i hele lageret, så for eksempel kan der kun være en ResourceFunction["MyFavoriteFunction"].

Ved første øjekast kan dette synes at være et stort problem, men det er vigtigt at forstå, at det i høj grad er det samme problem som for ting som internetdomæner eller sociale mediemarker. Og det handler om, at systemet simpelthen skal have en registrator — og det er en af de roller, vores virksomhed vil udfylde for Wolfram funktionsvidensbase. (For private versioner af lageret kan deres registratorer være administratorer.) Selvfølgelig kan et internetdomæne registreres uden noget indhold, men i funktionslageret kan et funktionsnavn kun registreres, hvis der er en faktisk definition af funktionen.

En del af vores rolle i administrationen af Wolfram-funktionernes vidensbase er at sikre, at navnet valgt til en funktion giver mening i forhold til funktionens definition, samt at det overholder Wolfram Language's navngivningskonventioner. Vi har over 30 års erfaring med navngivning af indbyggede funktioner på Wolfram Language, og vores kuratorteam vil overføre denne erfaring til funktionsbiblioteket. Der er naturligvis altid undtagelser. For eksempel kan det synes mere passende at have et kort navn for en funktion, men det er bedre at "beskytte" sig med et længere, mere specifikt navn, da det mindsker chancerne for, at nogen senere ønsker at lave et lignende funktionsnavn.

(Det skal bemærkes, at simpelthen at tilføje en hvilken som helst deltager-tag for at fjerne tvetydighed af funktioner ikke vil have den ønskede effekt. For hvis man ikke insisterer på, at der altid tildeles et tag, vil det være nødvendigt at definere et standardtag for enhver given funktion samt fremhæve forfatter-tags, hvilket igen kræver global koordinering.)

Som omfanget af Wolfram-funktionernes vidensbase vokser, er et af de problemer, der helt sikkert vil opstå — det er opdageligheden af funktioner, til dette formål er der i systemet indført en søgefunktion (og definitionsfiler kan inkludere nøgleord osv.). For indbyggede funktioner i Wolfram Language er der alle former for krydshenvisninger i dokumentationen, som hjælper med at "reklamere" for funktioner. Funktioner i funktionsbiblioteket kan referere til indbyggede funktioner. Hvad med den anden vej? For dette planlægger vi at eksperimentere med forskellige skemaer for at præsentere funktioner fra biblioteket på dokumentationssiderne for de indbyggede funktioner.

For indbyggede funktioner i Wolfram Language er der et såkaldt opdagelsesniveau, der sikres af netværket af "hjælpesider", som giver organiserede lister over funktioner relateret til specifikke områder. Det er altid svært at balancere håndterbart i opslagssiderne, og efterhånden som Wolfram-sproget vokser, skal opslagssiderne ofte omorganiseres fuldstændigt. Det er relativt nemt at placere funktioner fra depotet i brede kategorier og endda sekventielt nedbryde disse kategorier, men det er meget mere værdifuldt at have korrekt organiserede opslagssider for sproget. Det er endnu uklart, hvordan man bedst kan skabe dem for hele funktionsdatabasen. For eksempel, CreateResourceObjectGallery kan enhver i funktionsdepoterne placere en webside, der indeholder deres 'udvalg' fra depotet:

Wolfram Function Repository: åben adgang til platformen for udvidelser af Wolfram sprog

Wolfram-funktionsdepotet er indstillet som et permanent lager af funktioner, hvor enhver funktion i det altid vil fungere. Der kan absolut opstå nye versioner af funktioner, og vi forventer, at nogle funktioner med tiden vil blive forældede. Funktioner vil fungere, hvis de bruges i programmer, men deres dokumentationssider vil henvise til nye, mere avancerede funktioner.

Wolfram-funktionsdepotet er designet til hurtigt at få adgang til nye funktioner og udforske nye anvendelsesmuligheder for Wolfram-sproget. Med stor optimisme håber vi, at noget af det, der er undersøgt i funktionsdepotet, i sidste ende vil give mening at blive en indbygget del af det primære Wolfram Language. I det sidste årti har vi haft et lignende sæt funktioner, der oprindeligt blev præsenteret i Wolfram | Alpha. Og en af de lektioner, der er lært fra denne erfaring, er, at for at opnå de standarder for kvalitet og konsistens, som vi fokuserer på i alt, hvad der er indbygget i Wolfram-sproget, kræves der meget arbejde, hvilket ofte er mere komplekst end de oprindelige bestræbelser på at implementere ideen. Men selv da kan en funktion i funktionsdatabasen tjene som et meget nyttigt bevis på konceptet for en fremtidig funktion, der til sidst kan blive indbygget i Wolfram-sproget.

Det vigtigste her er, at funktionen i funktionsbiblioteket er tilgængelig for alle brugere til brug lige nu. Måske kan et indbygget sprog finde være meget bedre og mere effektivt, men funktionsbiblioteket giver brugerne øjeblikkelig adgang til alle nye funktioner. Og hvad der er særligt vigtigt, er, at dette koncept giver alle mulighed for at tilføje deres egne nye funktioner.

Tidligere i historien om Wolfram-sproget ville denne idé ikke have fungeret så godt som nu, men på nuværende tidspunkt er der blevet investeret så mange kræfter i sproget, samt en så dyb forståelse af sprogdesignprincipper, at det nu ses som meget muligt, at et stort fællesskab af brugere kan tilføje funktioner, der vil opretholde konsistensen af projektet for at gøre dem nyttige for en bred gruppe af brugere.

Der er en utrolig ånd af talent i Wolfram Language-brugerfællesskabet. (Selvfølgelig er dette fællesskab inkluderet af mange førende eksperter inden for forskning og udvikling på tværs af forskellige områder.) Jeg håber, at Wolfram Funktionsbibliotek vil give en effektiv platform til at afsløre og sprede denne ånd af talent. Kun sammen kan vi skabe noget, der signifikant udvider det område, hvor den beregningsmæssige paradigme for Wolfram-sproget kan anvendes.

I over 30 år har vi gjort store fremskridt med Wolfram-sproget. Lad os sammen gå endnu længere. Jeg opfordrer alle respektable brugere af Wolfram-sproget over hele verden til at bruge funktionsbiblioteket som platform samt et nyt softwareprojekt som Free Wolfram Engine for udviklere.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster