Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Hallo, Habr! Ik presenteer onder uw aandacht een vertaling van het bericht van Stephen Wolfram "De Wolfram Function Repository: lancering van een open platform voor het uitbreiden van de Wolfram-taal".

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Vereisten voor de consistentie van de Wolfram-taal

Vandaag staan ​​we op de drempel van grote prestaties samen met de programmeertaal Wolfram-taal. Nog maar drie weken geleden zijn we van start gegaan gratis Wolfram-engine voor ontwikkelaarsom onze gebruikers te helpen de Wolfram-taal te integreren in hun grootschalige softwareprojecten. Vandaag lanceren we Wolfram-functierepository, om een ​​gecoördineerd platform te bieden voor functies die zijn gemaakt om de Wolfram-taal uit te breiden, en we openen ook een repository met functies voor iedereen die kan bijdragen aan de ontwikkeling van ons softwareproduct.

De Wolfram Function Repository is mogelijk gemaakt door de unieke aard van de Wolfram-taal, niet alleen als programmeertaal, maar ook als een volledige computertaal. In traditionele programmeertalen betekent het toevoegen van belangrijke nieuwe functionaliteit meestal het creëren van hele extra bibliotheken die wel of niet werken als ze samen worden gebruikt. Echter, in de Wolfram-taal er is al zoveel in de taal zelf ingebouwd, dat het mogelijk is om de functionaliteit ervan aanzienlijk uit te breiden door eenvoudigweg nieuwe functies toe te voegen die onmiddellijk worden geïntegreerd in de holistische structuur van de hele taal.

De functierepository van Wolfram bevat bijvoorbeeld al 532 nieuwe functies gestructureerd in 26 thematische categorieën:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Ook meer dan 6000 standaardfuncties, ingebouwd in de Wolfram-taal, heeft elke functie uit de repository een documentatiepagina met een gedetailleerde beschrijving ervan en voorbeelden van werk:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Om naar de pagina te gaan, kopieert u het bovenstaande object (functie BLOB), plakt u het in de invoerregel en voert u vervolgens de functie uit - het is al ingebouwd in de Wolfram-taal en wordt standaard ondersteund, te beginnen met versie 12.0:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Hierbij moet worden opgemerkt dat bij de verwerking LogoQRCode U hoeft bijvoorbeeld geen "beeldverwerkingsbibliotheek" op te zetten - aangezien we al een consistente en zorgvuldige algoritmische manier hebben geïmplementeerd in de Wolfram-taal afbeelding verwerken, die onmiddellijk kan worden verwerkt door verschillende grafische taalfuncties:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Ik hoop dat met de steun prachtige en getalenteerde gemeenschap, dat de afgelopen decennia is gegroeid en uitgebreid (gebaseerd op de Wolfram-taal). De Wolfram-functierepository zal het in de nabije toekomst mogelijk maken om het bereik van (mogelijk potentieel belangrijke, gespecialiseerd in verschillende gebieden van wetenschap en technologie) functies die beschikbaar zijn in de taal aanzienlijk uit te breiden. Het wordt dus mogelijk om zowel de inhoud van de taal (de ingebouwde functies) als te gebruiken ontwikkelingsprincipes, die worden geïmplementeerd op basis van de taal. (Hier moet worden opgemerkt dat de Wolfram-taal al meer dan 30-jarige geschiedenis van ontwikkeling en stabiele groei).
Functies uit de repository kunnen kleine of grote stukjes code bevatten die zijn geschreven in de Wolfram-taal. Dit kunnen bijvoorbeeld oproepen zijn externe API's en services of externe bibliotheken in andere talen. Het unieke kenmerk van deze aanpak is dat wanneer je inzoomt op functionaliteit op gebruikersniveau, er geen potentiële inconsistenties zullen zijn, omdat de aanpak bovenop de consistente structuur van de Wolfram-taal is gebouwd - en elke functie automatisch correct zal werken - precies zoals bedoeld, dat zou ze moeten doen.
De shell- en programmeerstructuur van de Wolfram Feature Repository is zo ontworpen dat iedereen op de meest eenvoudige en handige manier kan bijdragen aan het gemeenschappelijke doel - in feite gewoon door het kladblok-tekstbestand (met nb-extensie) WL in te vullen. Dankzij de ingebouwde automatische functies kunt u nieuwe functies controleren die aan de repository zijn toegevoegd om hun integratie in de taal te garanderen. Ons bedrijf gokt op het brede scala aan gebruikers die hun functies in de taal kunnen integreren, in plaats van op de grote complexiteit van nieuwe functies - en hoewel er een beoordelingsproces is, dringen we niet aan op zoiets als nauwgezette ontwerpanalyse of strikte normen voor de volledigheid en betrouwbaarheid van nieuwe gebruikersfuncties, in tegenstelling tot het strengere testen van functies die zijn ingebouwd in de kerntaal die we gebruiken.

Er zijn veel afwegingen en details in deze aanpak, maar ons doel is om de Wolfram-functierepository te optimaliseren, zowel voor de gebruikerservaring als om ervoor te zorgen dat nieuwe gebruikersfuncties op betekenisvolle wijze bijdragen aan de ontwikkeling van de taal. Naarmate we groeien, twijfel ik er niet aan dat we nieuwe methoden zullen moeten uitvinden voor het verwerken en valideren van functies die in de repository zijn ingebouwd, niet in de laatste plaats voor het organiseren van grote aantallen functies en het vinden van de functies die gebruikers nodig hebben. Het is echter bemoedigend dat het pad dat we hebben gekozen een goed begin is. ik persoonlijk verschillende functies toegevoegd naar de oorspronkelijke database. Veel ervan zijn gebaseerd op code die ik al geruime tijd persoonlijk heb ontwikkeld. En het kostte me maar een paar minuten om ze naar de repository te pushen. Nu ze in de repository staan, kan ik deze functies eindelijk - onmiddellijk en op elk moment - gebruiken als dat nodig is, zonder dat ik me zorgen hoef te maken over het zoeken naar bestanden, het downloaden van pakketten, enz.

Verhoging van de efficiëntie terwijl de kosten worden verlaagd

Zelfs vóór het internet waren er manieren om Wolfram Language-code te delen (ons eerste grote gecentraliseerde project was Wiskundige bron, gemaakt voor Mathematica in 1991 op basis van cd-rom, enz.). Uiteraard is de voor implementatie voorgestelde aanpak op basis van de Wolfram-functierepository een krachtiger en betrouwbaarder hulpmiddel voor het implementeren van de bovengenoemde taken.

Al meer dan 30 jaar heeft ons bedrijf hard gewerkt om de integriteit van de Wolfram-taalstructuur te behouden, en dit is van cruciaal belang om ervoor te zorgen dat de Wolfram-taal niet alleen een programmeertaal wordt, maar ook een volwaardige computertaal. En dus is de essentie van de aanpak bij het implementeren van de Wolfram-functierepository het gebruik van een uniforme aanpak voor het programmeren en ontwikkelen van nieuwe functies die opeenvolgend worden toegevoegd en passen in het raamwerk van de taal, zodat deze zich kan ontwikkelen en mee-evolueren.

In de implementatiestructuur van elke functie vinden verschillende rekenprocessen plaats. Hierbij dient te worden opgemerkt dat het noodzakelijk is dat de functie een duidelijke en uniforme uitstraling en visuele leesbaarheid voor de gebruiker heeft. In deze context worden de ingebouwde functies van de Wolfram-taal gepresenteerd met meer dan 6000 opeenvolgende voorbeelden van hoe functies correct kunnen worden geprogrammeerd (dit zijn onze live programmeervideo'swaaronder honderden uren proces van het maken van standaardprogramma's). Wat deze aanpak er uiteindelijk voor zorgt dat de Wolfram feature repository goed presteert, is de structurele aard van de Wolfram Language, met zijn grote aantal aanvullende en gevarieerde bibliotheken die al in de taal zijn ingebouwd. Als u bijvoorbeeld een functie heeft die afbeeldingen verwerkt, of schaarse arraysOf moleculaire structurenEn geografische gegevens of enkele andere - hun consistente symbolische representatie bestaat al in de taal, en dankzij dit wordt jouw functie onmiddellijk compatibel met andere functies in de taal.

Het creëren van een repository die echt goed werkt, is een interessante metaprogrammeringstaak. Een teveel aan beperkingen in het programma zal het bijvoorbeeld niet mogelijk maken om de vereiste unificatie en universaliteit van het algoritme te verkrijgen. Net als bij een onvoldoende aantal functionele beperkingen, zult u niet in staat zijn een voldoende correcte volgorde van algoritme-uitvoering te implementeren. Verschillende eerdere voorbeelden van de implementatie van een compromis van deze benaderingen, geïmplementeerd door ons bedrijf, werkten redelijk stabiel - deze zijn: Project wolfraamdemonstraties, gelanceerd in 2007 en draait nu online met meer dan 12000 gebruikersinteractieve demo's. IN Wolfram-database er zijn meer dan 600 kant-en-klare databases die kunnen worden gebruikt in de Wolfram-taal, en Wolfram neurale netwerkopslag wordt bijna elke week aangevuld met nieuwe neurale netwerken (er zijn er nu al 118) en ze zijn onmiddellijk verbonden via de functie NetModel in de Wolfram-taal.

Alle bovenstaande voorbeelden hebben een fundamenteel kenmerk: de objecten en functies die in het project zijn verzameld, hebben een zeer hoge mate van structurering en distributie van processen. Natuurlijk kunnen de details van de structuur van wat een demo of een neuraal netwerk of iets anders is enorm variëren, maar de fundamentele structuur voor elke huidige repository blijft altijd hetzelfde. Dus wat is jouw mening, beste gebruiker, over het creëren van zo'n repository die uitbreidingen toevoegt aan de Wolfram-taal? De Wolfram-taal is ontworpen om extreem flexibel te zijn, zodat deze op elke manier kan worden uitgebreid en aangepast. Deze omstandigheid is uiterst belangrijk voor het vermogen om snel verschillende grootschalige softwareprojecten in de Wolfram-taal te creëren. Hierbij moet worden opgemerkt dat naarmate de flexibiliteit van de taal toeneemt, de kosten van projecten die in een dergelijke taal worden geïmplementeerd onvermijdelijk zullen stijgen. Dit komt door het feit dat hoe meer de gebruiker een dergelijke taal gebruikt, hoe meer specifieke functionaliteit hij krijgt, maar we mogen niet vergeten dat deze aanpak ook negatieve kanten kan hebben in termen van het onvermogen om consistente consistentie van programmamodules te garanderen.

Er is een veelvoorkomend probleem met bibliotheken in traditionele programmeertalen: als u bijvoorbeeld één bibliotheek gebruikt, werkt de code correct, maar als u meerdere bibliotheken probeert te gebruiken, is er geen garantie dat deze correct met elkaar zullen communiceren . Bovendien is er in traditionele programmeertalen - in tegenstelling tot een volwaardige computertaal - geen manier om de aanwezigheid van consistente ingebouwde representaties te garanderen voor andere functies of gegevenstypen dan hun basisstructuren. Maar in feite is het probleem nog groter dan het op het eerste gezicht lijkt: als je een grootschalige verticale functionaliteit bouwt, dan is het zonder de enorme kosten van gecentraliseerde projectprogrammering die we in de Wolfram-taal stoppen, onmogelijk om consistentie bereiken. Het is daarom belangrijk dat alle softwaremodules altijd correct samenwerken.

Het idee achter de Wolfram feature repository is dus om het hierboven geschetste probleem te vermijden door eenvoudigweg uitbreidingen aan de taal toe te voegen in relatief kleine stukjes code via individuele features die gemakkelijker te ontwikkelen zijn als samenhangende modules. Dat gezegd hebbende, zijn er programmeerfuncties die niet handig kunnen worden gemaakt met behulp van individuele functies (en ons bedrijf is van plan in de nabije toekomst een geoptimaliseerd programmeeralgoritme uit te brengen om grootschalige softwarepakketten te helpen implementeren). Op basis van de functies die al in de Wolfram-taal zijn ingebouwd, zijn er echter veel programmeermogelijkheden die worden geïmplementeerd op basis van individuele functies. Het idee hier is dat het met relatief weinig programmeerinspanning mogelijk is om een ​​aantal nieuwe en zeer nuttige functies te creëren die voldoende samenhang in het ontwerp zullen bieden, goed op elkaar zullen worden afgestemd en bovendien zullen in de toekomst gemakkelijk en op grote schaal in de taal kunnen worden gebruikt.

Deze aanpak is uiteraard een compromis. Als er een groter pakket zou worden geïmplementeerd, zou er een hele nieuwe wereld van functionaliteit kunnen worden bedacht die buitengewoon krachtig en nuttig zou zijn. Als er behoefte is aan nieuwe functionaliteit die bij al het andere past, maar u niet bereid bent veel moeite te besteden aan de ontwikkeling van het project, kan dit helaas leiden tot een verkleining van de reikwijdte van uw project. Het idee achter de Wolfram feature repository is om functionaliteit te bieden aan een bepalend deel van een project; deze aanpak zal krachtige functionaliteit toevoegen en het tegelijkertijd gemakkelijker maken om een ​​goede consistentie in een programmeerproject te behouden.

Hulp bij het toevoegen van aangepaste functies aan de functierepository

Ons team heeft hard gewerkt om het voor gebruikers gemakkelijk te maken om bij te dragen aan de functies van de Wolfram-repository. Op het bureaublad (al aanwezig versie 12.0), U kunt eenvoudig achtereenvolgens door de tabbladen van het hoofdmenu gaan: Bestand > Nieuw > RepositoryItem > Functie Repository Item en u krijgt "Definitie notitieboekje" (programmatisch in de werkbank. U kunt ook de analoge functie gebruiken - Maak een notitieboekje["Functiebron"]):

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Er zijn twee hoofdstappen die u moet uitvoeren: ten eerste noteert u de code voor uw functie en ten tweede schrijft u documentatie op die illustreert hoe uw functie zou moeten werken.
Klik bovenaan op de knop 'Voorbeeld openen' om een ​​voorbeeld te zien van wat u moet doen:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

In wezen probeer je iets te creëren dat lijkt op een ingebouwde functie in de Wolfram-taal. Behalve dat het iets veel specifiekers kan doen dan een ingebouwde functie. Tegelijkertijd zullen de verwachtingen ten aanzien van de volledigheid en betrouwbaarheid veel lager zijn.
U moet uw functie een naam geven die voldoet aan de richtlijnen voor functienaamgeving van Wolfram Language. Bovendien moet u documentatie voor uw functie ontwikkelen, vergelijkbaar met de ingebouwde functies van de taal. Ik zal hier later meer in detail over praten. Merk voorlopig op dat er in de rij met knoppen bovenaan het definitienotitieboekjebestand een knop staat "Stijlrichtlijnen", waarin wordt uitgelegd wat u moet doen, en een knop Extra, die hulpmiddelen biedt voor het opmaken van de documentatie van uw functie.
Wanneer u zeker weet dat alles goed is ingevuld en u klaar bent, klikt u op de knop “Controleren”. Het is volkomen normaal dat u nog niet alle details kent. De functie "Check" wordt dus automatisch uitgevoerd en voert veel stijl- en consistentiecontroles uit. Vaak wordt u onmiddellijk gevraagd de correcties te bevestigen en te accepteren (bijvoorbeeld: "Deze regel moet eindigen met een dubbele punt", en wordt u gevraagd een dubbele punt in te voeren). Soms zal ze je vragen om zelf iets toe te voegen of te wijzigen. We zullen voortdurend nieuwe functies toevoegen aan de automatische functionaliteit van de knop Controleren, maar in feite is het doel ervoor te zorgen dat alles wat u indient in de functierepository al zoveel mogelijk stijlrichtlijnen volgt.

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Dus nadat u "Check" hebt uitgevoerd, kunt u "Preview" gebruiken. Met "Preview" wordt een voorbeeld gemaakt van de documentatiepagina die u voor uw functie hebt gedefinieerd. U kunt ook een voorbeeld maken van een bestand dat op uw computer is gemaakt of van een bestand dat zich in de cloudopslag bevindt. Als u om wat voor reden dan ook niet tevreden bent met wat u in het voorbeeld ziet, ga dan gewoon terug en breng de nodige correcties aan, en klik vervolgens opnieuw op de knop Voorbeeld.
Nu bent u klaar om uw functie naar de repository te pushen. De knop Implementeren biedt u vier opties:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Het belangrijkste bij deze stap is dat u uw functie kunt indienen bij de Wolfram-functierepository, zodat deze voor iedereen beschikbaar is. Tegelijkertijd kunt u uw functie ook voor een beperkt aantal gebruikers plaatsen. U kunt bijvoorbeeld een functie maken die lokaal op uw computer wordt gehost, zodat deze beschikbaar is wanneer u die specifieke computer gebruikt. Of u kunt het in uw cloud-account, zodat deze voor u beschikbaar is wanneer u verbonden bent met de cloud. U kunt de functie ook openbaar hosten (implementeren) via uw cloudaccount. Het staat niet in de centrale Wolfram-functierepository, maar u kunt iemand een URL geven waarmee hij of zij uw functie uit uw account kan halen. (In de toekomst zullen we ook centrale opslagplaatsen in ons hele bedrijf ondersteunen.)

Stel dat u uw functie daadwerkelijk wilt indienen bij de kennisbank van Wolfram-functies. Om dit te doen, klikt u op de knop "Verzenden" naar de repository. Dus wat gebeurt er op dit moment dan? Uw aanvraag wordt onmiddellijk in de wachtrij geplaatst voor beoordeling en goedkeuring door ons toegewijde team van curatoren.

Naarmate uw aanvraag het goedkeuringsproces doorloopt (wat doorgaans enkele dagen duurt), ontvangt u mededelingen over de status ervan en mogelijk suggesties voor toekomstig gebruik. Maar zodra uw functie is goedgekeurd, wordt deze onmiddellijk gepubliceerd in de Wolfram Feature Repository en kan deze door iedereen worden gebruikt. (En dit zal verschijnen in nieuwsoverzichten van nieuwe functies enzovoort)

Wat moet er in de opslag zitten?

Opgemerkt moet worden dat ons bedrijf zeer hoge eisen stelt aan volledigheid, betrouwbaarheid en algehele kwaliteit, en dat van de meer dan 6000 functies die we de afgelopen 30+ jaar al in de Wolfram-taal hebben ingebouwd, allemaal aan de bovenstaande vereisten voldoen. Het doel van de Wolfram Function Repository is om alle structuur en functionaliteit die al bestaat in de Wolfram-taal te gebruiken om zoveel mogelijk lichtere functies (dat wil zeggen functies met hogere prestaties) toe te voegen.

Uiteraard moeten functies in de Wolfram-functierepository voldoen aan de ontwerpprincipes van de Wolfram-taal - zodat ze volledig kunnen communiceren met andere functies en de verwachtingen van gebruikers over hoe de functie goed zou moeten werken. De functies hoeven echter niet even volledig of betrouwbaar te zijn.

Bij de ingebouwde functies van de Wolfram-taal werken we er hard aan om programmeerfuncties zo algemeen mogelijk te maken. Dat gezegd hebbende, als er in de Wolfram-functierepository niets mis is met het hebben van een functie daarin die eenvoudigweg een heel specifiek maar nuttig geval afhandelt. De functie bijvoorbeeld Stuur een e-mail vanuit Notebook kan bestanden in één specifiek formaat ontvangen en op één specifieke manier e-mail maken. Veelhoekig diagram maakt diagrammen met alleen bepaalde kleuren en labels, enz.

Een ander punt met betrekking tot de ingebouwde functies is dat ons bedrijf er alles aan doet om alle atypische gevallen af ​​te handelen, onjuiste invoer correct af te handelen, enzovoort. In een functierepository is het volkomen normaal dat er een speciale functie is die de belangrijkste gevallen van het oplossen van een probleem afhandelt en alle andere negeert.

Het voor de hand liggende punt is dat het beter is om functies te hebben die meer en beter doen, maar optimalisatie voor een functierepository (in tegenstelling tot de ingebouwde functies van de Wolfram-taal) zou meer functies moeten hebben, gebundeld met meer functies, in plaats van zich te verdiepen in de implementatieprocessen van elke specifieke functie.

Laten we nu eens kijken naar een voorbeeld van het testen van functies in een repository. De consistentieverwachtingen voor dergelijke functies zijn uiteraard veel lager dan voor ingebouwde taalfuncties. Dit geldt vooral in gevallen waarin functies afhankelijk zijn van externe bronnen zoals API's. Het is belangrijk om voortdurend consistente tests uit te voeren, wat automatisch gebeurt binnen de verificatiealgoritmen. In het nb-bestand kunt u expliciet definities opgeven (in de sectie Aanvullende informatie) en zoveel tests opgeven als gedefinieerd door invoer- en uitvoerreeksen of objecten met volledige karakters van het type VerificatieTest, zoveel als u wilt. Bovendien probeert het systeem voortdurend de door u verstrekte documentatievoorbeelden om te zetten in een verificatieproces (en soms kan dit behoorlijk arbeidsintensief zijn, bijvoorbeeld voor een functie waarvan het resultaat afhangt van willekeurige getallen of het tijdstip van de dag).

Als gevolg hiervan zal de functierepository een aantal implementatiecomplexiteiten kennen. Sommige zullen slechts één regel code bevatten, andere kunnen uit duizenden of tienduizenden regels bestaan, waarbij waarschijnlijk gebruik wordt gemaakt van vele helperfuncties. Wanneer is het de moeite waard om een ​​functie toe te voegen waarvoor heel weinig code nodig is om te definiëren? Kortom, als er een functie is goede geheugensteun naam, wat gebruikers gemakkelijk zouden begrijpen als ze het in een stukje code zouden zien, dan kan het al worden toegevoegd. Anders is het waarschijnlijk beter om de code elke keer dat u het nodig heeft, gewoon opnieuw aan uw programma toe te voegen.

Het belangrijkste doel van een functierepository (zoals de naam al doet vermoeden) is het introduceren van nieuwe functies in de taal. Als u nieuwe gegevens wilt toevoegen of nieuwe entiteiten, gebruik Wolfram-gegevensopslagplaats. Maar wat als u nieuwe typen objecten wilt introduceren voor uw berekeningen?

Er zijn eigenlijk twee manieren. Mogelijk wilt u een nieuw objecttype introduceren dat zal worden gebruikt in nieuwe functies in de functierepository. En in dit geval kunt u altijd gewoon de symbolische representatie ervan opschrijven en deze gebruiken bij het invoeren of uitvoeren van functies in een functierepository.

Maar wat als u een object wilt vertegenwoordigen en vervolgens, via bestaande functies in de Wolfram-taal, wilt definiëren dat u ermee wilt werken? De Wolfram-taal heeft hiervoor altijd een lichtgewicht mechanisme gehad, genaamd Waarden omhoog. Met enkele beperkingen (vooral voor functies die kunnen hun argumenten niet beoordelen), kunt u met een functierepository eenvoudig een functie weergeven en er waarden voor definiëren. (Het verhogen van de verwachting van consistentie bij het creëren van een nieuw groot ontwerp dat volledig geïntegreerd is in de Wolfram-taal is over het algemeen een zeer belangrijke procedure die niet kan worden bereikt door simpelweg de kosten van het project te verhogen en is iets dat ons bedrijf doet als onderdeel van projecten voor de langetermijnontwikkeling van de taal is deze taak geen doel dat wordt gesteld als onderdeel van de ontwikkeling van de repository).

Dus, wat kan er in de functiecode in een functierepository staan? Alles ingebouwd in de Wolfram-taal, natuurlijk (tenminste als het niet vertegenwoordigt gevaren voor veiligheid en de prestaties van het programma zelf, als computeromgeving), evenals elke functie uit de functierepository. Er zijn echter nog meer functionaliteiten: een functie in een functierepository kan een API aanroepen, of in Wolfram-wolkOf uit een andere bron. Uiteraard zijn hier enkele risico's aan verbonden. Vanwege het feit dat er geen garanties zijn dat de API niet zal veranderen en dat de functie in de functiewinkel niet meer zal werken. Om dit soort problemen te helpen identificeren, staat er een opmerking op de documentatiepagina (in het gedeelte Vereisten) voor elke functie die afhankelijk is van meer dan alleen de ingebouwde Wolfram Language-functionaliteit. (Als het om echte gegevens gaat, kunnen er natuurlijk zelfs problemen zijn met deze functionaliteit - omdat gegevens uit de echte wereld voortdurend veranderen en soms zelfs de definities en structuur ervan veranderen.)

Moet alle code voor de Wolfram-functierepository in Wolfram worden geschreven? Zeker, de code in de externe API mag niet in de Wolfram-taal worden geschreven, die niet eens de taalcode maakt. Als u een functie in vrijwel elke externe taal of bibliotheek vindt, kunt u een wrapper maken waarmee u deze in de Wolfram-functierepository kunt gebruiken. (Meestal moet u hiervoor de ingebouwde functies gebruiken ExternEvalueer of ExterneFunctie in Wolfram-taalcode.)

Dus wat heeft het voor zin om dit te doen? In wezen stelt dit u in staat het volledige geïntegreerde Wolfram Language-systeem en de volledige uniforme set softwaremogelijkheden te gebruiken. Als u de basisimplementatie van een externe bibliotheek of taal verkrijgt, kunt u vervolgens de rijke symbolische structuur van de Wolfram-taal gebruiken om een ​​handige functie op het hoogste niveau te creëren waarmee gebruikers eenvoudig alle reeds geïmplementeerde functionaliteit kunnen gebruiken. Dit zou op zijn minst haalbaar moeten zijn in een ideale wereld waarin alle bouwstenen voor het laden van bibliotheken enz. bestaan, in welk geval ze automatisch door de Wolfram-taal zouden worden afgehandeld. (Opgemerkt moet worden dat er in de praktijk problemen kunnen optreden externe talen instellen specifiek computersysteem en cloudopslag kunnen extra beveiligingsproblemen opleveren).

Trouwens, als je voor het eerst naar typische externe bibliotheken kijkt, lijken ze vaak te complex om in slechts een paar functies te worden behandeld, maar in veel gevallen komt een groot deel van de complexiteit voort uit het creëren van de infrastructuur die nodig is voor de bibliotheek en alle functies om deze te kunnen beheren. steun het. Wanneer echter de Wolfram-taal wordt gebruikt, is de infrastructuur doorgaans al in de pakketten ingebouwd, en het is dus niet nodig om al deze ondersteunende functies in detail bloot te leggen, maar alleen functies te creëren voor de "topste" applicatiespecifieke functies in de bibliotheek. .

"Ecosysteem" van de kennisbank

Als u functies heeft geschreven die u regelmatig gebruikt, dient u deze in bij de Wolfram Function Repository! Als hier niet meer uit komt (taalontwikkeling), dan is het zelfs dan veel handiger voor u om de functies voor persoonlijk gebruik te gebruiken. Het is echter logisch om aan te nemen dat als je de functies regelmatig gebruikt, andere gebruikers ze misschien ook nuttig zullen vinden.

Uiteraard kan het voorkomen dat u in een situatie terechtkomt waarin u uw functies niet kunt of wilt delen of waarin u toegang krijgt tot privé-informatiebronnen. Zelfs in dergelijke gevallen kunt u de functies eenvoudig in uw eigen cloudaccount implementeren, het specificeren van rechten toegang tot hen. (Als uw organisatie dat heeft Wolfram Enterprise-privécloud, dan kan het binnenkort een eigen opslagplaats voor privéfuncties hosten, die vanuit uw organisatie kan worden beheerd en kan worden ingesteld of weergaven al dan niet moeten worden bekeken door externe gebruikers.)

De functies die u indient bij de Wolfram-functierepository hoeven niet perfect te zijn; ze moeten gewoon nuttig zijn. Dit lijkt een beetje op de sectie "Fouten" in klassieke Unix-documentatie - in de sectie "Definities" is er een sectie "Aantekeningen van de auteur" waar u beperkingen, problemen, enz. kunt beschrijven die u al kent over uw functie. Bovendien kunt u, wanneer u uw object naar de repository verzendt, indieningsnotities toevoegen die door een toegewijd team van curatoren worden gelezen.

Zodra een artikel is gepubliceerd, heeft de pagina onderaan altijd twee links: "Stuur een bericht over deze functie"En"Bespreek het in de Wolfram-gemeenschap" Als u een opmerking bijvoegt (bijvoorbeeld: vertel mij over bugs), kunt u het vakje aanvinken waarin staat dat u wilt dat uw bericht en contactgegevens worden gedeeld met de auteur van het artikel.

Soms wil je gewoon functies uit de Wolfram-functierepository gebruiken, zoals ingebouwde functies, zonder naar hun code te kijken. Als je echter even binnen wilt kijken, staat er bovenaan altijd een Kladblok-knop. Klik erop en u krijgt uw eigen kopie van het originele definitienotitieboekje dat naar de functierepository is verzonden. Soms kunt u het gewoon als voorbeeld gebruiken voor uw behoeften. Tegelijkertijd kunt u ook uw eigen aanpassing van deze functie ontwikkelen. Misschien wilt u deze functies die u uit de repository heeft gevonden op uw computer of in uw bladluis-cloudopslagaccount plaatsen, misschien wilt u ze indienen bij de functiekennisbank, misschien als een verbeterde, uitgebreide versie van de originele functie.

In de toekomst zijn we van plan om forking in Git-stijl te ondersteunen voor feature repository's, maar voor nu proberen we het simpel te houden, en we hebben altijd maar één geaccepteerde versie van elke feature ingebouwd in de taal. Vaker wel dan niet (tenzij ontwikkelaars stoppen met het onderhouden van de functies die ze hebben ontwikkeld en reageren op inzendingen van gebruikers), neemt de oorspronkelijke auteur van de functie de controle over de updates ervan en dient hij nieuwe versies in, die vervolgens worden beoordeeld en, als ze het beoordelingsproces doorstaan, , gepubliceerd in de taal.

Laten we eens kijken naar de vraag hoe "versiebeheer" van ontwikkelde functies werkt. Wanneer u op dit moment een functie uit de functierepository gebruikt, wordt de definitie ervan permanent opgeslagen op uw computer (of in uw cloudaccount als u de cloud gebruikt). Als er een nieuwe versie van een functie beschikbaar is, ontvangt u de volgende keer dat u deze gebruikt een bericht waarin u hiervan op de hoogte wordt gesteld. En als u de functie naar een nieuwe versie wilt bijwerken, kunt u dit doen met de opdracht Bronupdate. (De "functieblob" slaat feitelijk meer versiegegevens op, en we zijn van plan dit in de toekomst toegankelijker te maken voor onze gebruikers.)

Een van de mooie dingen van de Wolfram Function Repository is dat elk Wolfram Language-programma, waar dan ook, functies ervan kan gebruiken. Als een programma in een notitieblok verschijnt, is het vaak handig om de repositoryfuncties te formatteren als gemakkelijk leesbare "functie binair object"-functies (misschien met een geschikte versieset).

U kunt altijd via tekst toegang krijgen tot elke functie in de functierepository HulpbronFunctie[...]. En dit is erg handig als u bijvoorbeeld code of scripts rechtstreeks voor de Wolfram Engine schrijft met behulp van een IDE- of tekstcode-editor (Er moet vooral worden opgemerkt dat de functierepository volledig compatibel is met Gratis Wolfram-engine voor ontwikkelaars).

Hoe werkt het?

Binnen de functies in de Wolfram-repository is dit mogelijk met precies hetzelfde hulpbronnensystemen basen, zoals in al onze andere bestaande opslagplaatsen (gegevensopslag, Neural Net-opslagplaats, verzameling demoprojecten enz.), net als alle andere Wolfram-systeembronnen, Bronfunctie uiteindelijk gebaseerd op functie BronObject.

Overwegen Bronfunctie:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Binnenin kun je wat informatie zien met behulp van de functie Informatie:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Hoe werkt het instellen van een resourcefunctie? De eenvoudigste is een puur lokaal geval. Hier is een voorbeeld waarin een functie (in dit geval slechts een pure functie) wordt gebruikt en deze wordt gedefinieerd als een bronfunctie voor een bepaalde programmasessie:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Nadat u de definitie heeft gemaakt, kunt u de resourcefunctie gebruiken:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

Houd er rekening mee dat er een zwart pictogram in deze functie-blob staat Wolfram Function Repository: Open access platform voor Wolfram-taalextensies. Dit betekent dat de BLOB-functie verwijst naar de bronfunctie in het geheugen die voor de huidige sessie is gedefinieerd. Een bronfunctie die permanent op uw computer of cloudaccount is opgeslagen, heeft een grijs pictogram Wolfram Function Repository: Open access platform voor Wolfram-taalextensies. En er is een oranje pictogram voor een officiële bronfunctie in de Wolfram Feature Repository Wolfram Function Repository: Open access platform voor Wolfram-taalextensies.

Dus wat gebeurt er als u het menu Uitvouwen in het Definition Notebook gebruikt? Ten eerste neemt het alle definities in het notitieblok en creëert daaruit een symboliek BronObject). (En als u een op tekst gebaseerde IDE of programma gebruikt, kunt u ook expliciet een BronObject)

Lokale implementatie van een functie vanuit een repository op uw computer wordt uitgevoerd met behulp van de opdracht Lokale cache voor een resource-object om het op te slaan als LokaalObject op uw bestandssysteem. Implementatie naar een cloudaccount gebeurt met behulp van de opdracht CloudDeploy voor een resourceobject, en een publieke cloudimplementatie is dat wel CloudPublish. In alle gevallen BronRegistreren wordt ook gebruikt om de naam van de resourcefunctie te registreren, dus HulpbronFunctie["naam"] zal werken.

Als u op de knop Verzenden klikt voor een functierepository, wat gebeurt er daaronder? BronVerzenden een resourceobject aangeroepen. (En als u een tekstinvoerinterface gebruikt, kunt u ook bellen BronVerzenden direct.)

Standaard worden inzendingen gedaan onder de naam die is gekoppeld aan uw Wolfram-ID. Maar als u namens een ontwikkelteam of organisatie een aanvraag indient, kan dat wel stel een afzonderlijke uitgever-ID in en gebruik het in plaats daarvan als de naam om met uw opvattingen te communiceren.

Nadat u een van uw functies hebt ingediend bij de functiekennisbank, wordt deze in de wachtrij geplaatst voor beoordeling. Als u als reactie hierop commentaar ontvangt, heeft dit doorgaans de vorm van een tekstbestand waaraan extra “commentaarcellen” zijn toegevoegd. U kunt de status van uw aanvraag altijd controleren door naar te gaan ledenportaal van het bronsysteem. Maar zodra uw functie is goedgekeurd, ontvangt u een melding (via e-mail) en wordt uw functie in de Wolfram-functierepository geplaatst.

Enkele subtiliteiten op het werk

Op het eerste gezicht lijkt het misschien alsof je gewoon een definitienotitieboekje kunt nemen en het woordelijk in een functierepository kunt plaatsen, maar er komen eigenlijk heel wat subtiliteiten bij kijken - en het hanteren ervan vereist behoorlijk complexe metaprogrammering en het omgaan met symbolische verwerking als de code die de functie definieert, en het Kladblok zelf is gedefinieerd. Het meeste hiervan gebeurt intern, achter de schermen, maar het kan enkele implicaties hebben die de moeite waard zijn om te begrijpen als je gaat bijdragen aan de kennisbank van functies.

Eerste onmiddellijke subtiliteit: wanneer u het Definition Notebook invult, kunt u eenvoudig overal naar uw functie verwijzen met een naam als Mijn Functie, wat lijkt op een gewone naam voor een functie in de Wolfram-taal, maar voor documentatie over functierepository's is dit vervangen HulpbronFunctie["MijnFunctie"] is wat gebruikers daadwerkelijk zullen gebruiken als ze met de functie werken.

De tweede subtiliteit: wanneer u een resourcefunctie maakt vanuit het Definition Notebook, moeten alle afhankelijkheden die betrokken zijn bij de functiedefinitie worden vastgelegd en expliciet worden opgenomen. Om er echter voor te zorgen dat de definities modulair blijven, moet je alles in een uniek bestand stoppen naamruimte. (Natuurlijk, functies die het allemaal doen, bevinden zich in de functierepository.)

Normaal gesproken zult u nooit enig spoor zien van de code die wordt gebruikt om deze naamruimte te configureren. Maar als u om de een of andere reden een te weinig uitgevoerd symbool binnen uw functie aanroept, zult u zien dat dit symbool zich in de interne context van de functie bevindt. Bij het verwerken van het Definitiekladblok is echter in ieder geval het symbool dat overeenkomt met de functie zelf verstelbaar voor de beste weergave als een functionele BLOB in plaats van een rauw karakter in de interne context.

De functierepository is bedoeld voor het definiëren van nieuwe functies. En deze functies kunnen opties hebben. Vaak zijn deze parameters (bijvoorbeeld Methode of Afbeeldingsgrootte) kan worden gebruikt voor ingebouwde functies, maar ook voor functies waarvoor al ingebouwde symbolen bestaan. Maar soms vereist een nieuwe functie mogelijk nieuwe opties. Om de modulariteit te behouden, moeten deze parameters symbolen zijn die zijn gedefinieerd in een unieke interne context (of zoiets als volledige resourcefuncties zelf). Voor de eenvoud kunt u in de functierepository nieuwe opties in tekenreeksdefinities definiëren. En voor het gemak van de gebruiker zijn deze definities (ervan uitgaande dat ze gebruikt worden Optie waarde и OptiesPatroon) worden ook verwerkt zodat bij het gebruik van functies parameters niet alleen als tekenreeksen kunnen worden opgegeven, maar ook als globale symbolen met dezelfde namen.

De meeste functies doen gewoon wat ze moeten doen elke keer dat ze worden aangeroepen, maar sommige functies moeten worden geïnitialiseerd voordat ze in een bepaalde sessie kunnen worden uitgevoerd - en om dit probleem op te lossen is er een sectie "Initialisatie" in de sectie Definitie.

Functies uit een repository kunnen andere functies gebruiken die zich al in de repository bevinden; om definities in te stellen voor een functierepository die twee (of meer) functies bevat die naar elkaar verwijzen, moet u deze in uw programmasessie implementeren, zodat u verwijzing zoals op hen HulpbronFunctie["naam"], dan kun je de combinaties van deze functies maken die je nodig hebt, voorbeelden (ik begreep het niet) en een nieuwe functie aan de repository toevoegen op basis van de functies die al eerder zijn gepost. (of al of eerder – beide woorden zijn onhandig)

Ontwikkelingsperspectieven. Wat moet er gebeuren als de repository echt groot wordt?

Vandaag lanceren we net de Wolfram Feature Repository, maar in de loop van de tijd verwachten we dat de omvang en functionaliteit ervan dramatisch zullen toenemen, en naarmate de ontwikkeling ervan groeit, zullen er verschillende problemen optreden waarvan we al verwachten dat ze zich kunnen voordoen.

Het eerste probleem betreft functienamen en hun uniciteit. De functierepository is zo ontworpen dat u, net als de ingebouwde functies in de Wolfram-taal, naar elke bepaalde functie kunt verwijzen door simpelweg de naam ervan op te geven. Maar dit betekent onvermijdelijk dat functienamen globaal uniek moeten zijn in de hele repository, zodat er bijvoorbeeld maar één kan zijn HulpbronFunctie["Mijn Favoriete Functie"].

Dit lijkt in eerste instantie misschien een groot probleem, maar het is de moeite waard om te beseffen dat het in principe hetzelfde probleem is als voor zaken als internetdomeinen of social media-handvatten. En het feit is dat het systeem eenvoudigweg een registrar nodig heeft - en dit is een van de rollen die ons bedrijf zal vervullen voor de kennisbank van de Wolfram-functie. (Voor privéversies van een repository kunnen hun registrars beheerders zijn.) Natuurlijk kan een internetdomein worden geregistreerd zonder dat er iets op staat, maar in een functierepository kan een functienaam alleen worden geregistreerd als er een daadwerkelijke definitie is van de functie.

Een deel van onze rol bij het beheren van de kennisbank van Wolfram-functies is ervoor te zorgen dat de naam die voor een functie wordt gekozen logisch is gezien de definitie van de functie en dat deze de naamgevingsconventies van Wolfram Language volgt. We hebben meer dan 30 jaar ervaring met het benoemen van ingebouwde functies in de Wolfram-taal, en ons team van curatoren zal die ervaring ook naar de functierepository brengen. Natuurlijk zijn er altijd uitzonderingen. Het lijkt bijvoorbeeld de voorkeur te hebben om voor een bepaalde functie een korte naam te hebben, maar het is beter om te ‘verdedigen’ met een langere, specifiekere naam, omdat de kans kleiner is dat je iemand tegenkomt die in de toekomst een vergelijkbare functienaam wil maken. .

(Hier moet worden opgemerkt dat het simpelweg toevoegen van een lidtag om functies ondubbelzinnig te maken niet het beoogde effect zal hebben. Tenzij u erop staat altijd een tag toe te wijzen, moet u voor elke gegeven functie een standaardtag definiëren en ook auteurtags toewijzen. , waarvoor opnieuw mondiale coördinatie nodig zou zijn.)

Naarmate de kennisbasis van Wolfram-functies groeit, is een van de problemen die zich waarschijnlijk zullen voordoen de vindbaarheid van functies, waarvoor het systeem zorgt zoekfunctie (en definitiebestanden kunnen trefwoorden enz. bevatten). Voor ingebouwde functies in de Wolfram-taal zijn er allerlei kruisverwijzingen in de documentatie om de functies te helpen 'adverteren'. Functies in een functierepository kunnen verwijzen naar ingebouwde functies. Maar hoe zit het andersom? Om dit te doen gaan we experimenteren met verschillende ontwerpen om repositoryfuncties bloot te leggen op documentatiepagina's voor ingebouwde functies.

Voor ingebouwde functies in de Wolfram-taal is er een zogenaamde detectielaag voorzien netwerk van "helppagina's", die georganiseerde lijsten bieden met functies die betrekking hebben op specifieke gebieden. Het is altijd moeilijk om manpagina's goed in balans te brengen, en naarmate de Wolfram-taal groeit, moeten manpagina's vaak volledig gereorganiseerd worden. Het is vrij eenvoudig om functies uit een repository in brede categorieën onder te brengen, en zelfs om die categorieën consistent op te splitsen, maar het is veel waardevoller om goed georganiseerde taalreferentiepagina's te hebben. Het is nog niet duidelijk hoe deze het beste kunnen worden aangemaakt voor de gehele functiekennisbank. Bijvoorbeeld, CreateResourceObjectGallery in de feature repository kan iedereen een webpagina plaatsen met zijn "keuzes" uit de repository:

Wolfram Function Repository: Open access platform voor Wolfram-taalextensies

De Wolfram-functierepository is geconfigureerd als een persistente functierepository, waarbij elke functie daarin altijd zal werken. Uiteraard kunnen er nieuwe versies van functies beschikbaar komen, en we verwachten dat sommige functies na verloop van tijd verouderd zullen raken. De functies zullen werken als ze in programma's worden gebruikt, maar hun documentatiepagina's zullen linken naar nieuwe, meer geavanceerde functies.

De Wolfram Feature Repository is ontworpen om u te helpen snel nieuwe functies te ontdekken en nieuwe manieren te leren om de Wolfram-taal te gebruiken. We zijn erg optimistisch dat een deel van wat in de feature repository is onderzocht uiteindelijk zinvol zal zijn om ingebouwde delen van de Wolfram-kerntaal te worden. De afgelopen tien jaar hebben we een soortgelijke set gehad functies die oorspronkelijk in Wolfram | Alfa. En een van de lessen die we uit deze ervaring hebben geleerd, is dat het bereiken van de kwaliteits- en consistentienormen waarop we ons richten bij alles wat in de Wolfram-taal is ingebouwd, veel werk vereist, wat vaak moeilijker is dan de initiële inspanning om het idee te implementeren. Toch kan een functie in de functiekennisbank dienen als een zeer nuttig proof-of-concept voor een toekomstige functie die uiteindelijk in de Wolfram-taal kan worden ingebouwd.

Het belangrijkste hier is dat een functie in een functierepository iets is dat op dit moment door elke gebruiker kan worden gebruikt. Het is mogelijk dat een functie in de moedertaal veel beter en performanter zou kunnen zijn, maar een functierepository zou gebruikers in staat stellen meteen toegang te hebben tot alle nieuwe functies. En het allerbelangrijkste: dankzij dit concept kan iedereen alle nieuwe functies toevoegen die hij of zij wil.

Eerder in de geschiedenis van de Wolfram-taal zou dit idee niet zo goed hebben gewerkt als nu, maar in dit stadium wordt er zoveel moeite in de taal gestoken en is er zo'n diep begrip van de taalontwerpprincipes dat het nu heel erg lijkt Het is voor een grote gemeenschap van gebruikers mogelijk om functies toe te voegen die de ontwerpconsistentie behouden en ze bruikbaar maken voor een breed scala aan gebruikers.

Er is een ongelooflijke geest van talent (?) in de gebruikersgemeenschap van Wolfram Language. (Natuurlijk omvat deze gemeenschap veel vooraanstaande R&D-mensen op verschillende gebieden.) Ik hoop dat de Wolfram Feature Repository een effectief platform zal bieden voor het ontsluiten en verspreiden van deze geest van talent. Alleen samen kunnen we iets creëren dat het gebied waarop het Wolfram-taalcomputerparadigma kan worden toegepast aanzienlijk zal uitbreiden.

In meer dan 30 jaar hebben we een lange weg afgelegd met de Wolfram-taal. Laten we nu samen nog verder gaan. Ik moedig alle gerespecteerde gebruikers van de Wolfram-taal over de hele wereld sterk aan om de functionele repository als platform hiervoor te gebruiken, evenals het nieuwe softwareproject zoals de Free Wolfram Engine for Developers.

Bron: www.habr.com

Voeg een reactie