Hallo, Habr! Ik presenteer u de vertaling van Steven Wolfram's post .

De voorwaarden voor de waarde van de Wolfram-taal
Vandaag staan we aan de vooravond van grote prestaties met de programmeertaal . Slechts drie weken geleden hebben we gelanceerd om onze gebruikers te helpen de Wolfram-taal te integreren in hun grootschalige softwareprojecten. Vandaag lanceren we , om een gecoördineerd platform te bieden voor functies die zijn ontworpen om de Wolfram-taal uit te breiden, en we openen ook de functierepository voor iedereen die kan bijdragen aan de ontwikkeling van ons softwareproduct.
De Wolfram-functierepository is iets dat mogelijk is gemaakt door de unieke specificiteit van de Wolfram-taal, niet alleen als programmeertaal, maar ook als . In traditionele programmeertalen omvat het toevoegen van significante nieuwe functies meestal het creëren van geheel nieuwe bibliotheken die al dan niet goed samenwerken. Maar in de Wolfram-taal , dat het mogelijk is om de functionaliteit aanzienlijk uit te breiden door eenvoudig nieuwe functies toe te voegen die onmiddellijk integreren in de algehele structuur van de taal.
Bijvoorbeeld, op dit moment bevat de Wolfram-functierepository gegroepeerd in 26 thematische categorieën:

Evenzo zijn er meer dan in de Wolfram-taal ingebouwd, en elke functie van de repository heeft een documentatiepagina met gedetailleerde beschrijvingen en voorbeelden van hun gebruik:

Om naar de pagina te gaan, kopieert u het hierboven genoemde object (functionele BLOB), plakt u het in de invoerregel en start u de functie – die is al ingebouwd in de Wolfram-taal en wordt standaard ondersteund, beginnend vanaf :

Hier moet worden opgemerkt dat bij de verwerking U hoeft bijvoorbeeld geen 'afbeeldingsverwerkingsbibliotheek' in te stellen - aangezien in de Wolfram-taal al een geordend en zorgvuldig gealgorithmiseerd proces is geïmplementeerd voor , die onmiddellijk kunnen worden verwerkt met verschillende grafische functies van de taal:

Ik hoop dat met de ondersteuning van , dat groeit en uitbreidt (gebaseerd op de Wolfram-taal) gedurende de afgelopen decennia. De repository van functies van Wolfram zal in de nabije toekomst het bereik van (mogelijk potentieel significante, gespecialiseerd in verschillende gebieden van wetenschap en techniek) functies die beschikbaar zijn in de taal aanzienlijk vergroten. Zo ontstaat de mogelijkheid om zowel de inhoud van de taal (zijn ingebouwde functies) als , die worden geïmplementeerd op basis van de taal. (Hier moet worden opgemerkt dat de Wolfram-taal al meer dan ).
Binnen de functies van de repository kunnen kleine of behoorlijk omvangrijke stukjes code zitten, geschreven in de Wolfram-taal. Bijvoorbeeld, dit kunnen oproepen zijn . Een unieke eigenschap van deze benadering is dat wanneer je overstapt naar functionaliteit op gebruikersniveau, er geen mogelijke inconsistenties zullen zijn omdat deze benadering is gebaseerd op een coherente structuur van de Wolfram-taal — en elke functie automatisch correct zal werken — precies zoals het bedoeld is.
De interface en programmastructuur van de repository van functies zijn zo ingesteld dat iedereen maximaal eenvoudig en comfortabel kan bijdragen aan het gemeenschappelijke doel — in feite gewoon . Ingebouwde automatische functies maken het mogelijk om nieuwe functies die aan de repository worden toegevoegd te controleren voor hun gegarandeerde integratie in de taal. Ons bedrijf richt zich op een breed scala aan gebruikers die hun functies in de taal kunnen integreren, en niet op grote complexiteit van nieuwe functies — en hoewel hier een proces van controle is geïmplementeerd, dringen we niet aan op iets als of strikte normen voor volledigheid en betrouwbaarheid van nieuwe functies van gebruikers, in tegenstelling tot de meer rigoureuze controles van functies die in de kern van de taal zijn ingebouwd, die wij toepassen.
In deze benadering zijn er veel compromissen en details, maar ons doel is om de Wolfram-functierepository zowel voor gebruikersgemak te optimaliseren als ervoor te zorgen dat nieuwe gebruikersfuncties een merkbare bijdrage leveren aan de ontwikkeling van de taal. Naarmate we groeien, ben ik ervan overtuigd dat we nieuwe manieren zullen moeten uitvinden om ingebedde functies in de repository te verwerken en te verifiëren, niet in de laatste plaats om een grote hoeveelheid functies te organiseren en de functies te vinden die gebruikers nodig hebben. Toch kan het ons bemoedigen dat de weg die we hebben gekozen een goed begin is. Ik heb persoonlijk aan de oorspronkelijke database. Vele daarvan zijn gebaseerd op code die ik persoonlijk gedurende een behoorlijk lange tijd heb ontwikkeld. En ik heb slechts een paar minuten besteed om ze naar de repository te verzenden. Nu ze in de repository staan, kan ik eindelijk - onmiddellijk en op elk moment - deze functies gebruiken wanneer dat nodig is, zonder me zorgen te maken over het zoeken naar bestanden, het downloaden van pakketten, enzovoort.
Efficiëntie verhogen bij het verlagen van kosten
Zelfs vóór het ontstaan van het internet waren er manieren om Wolfram Language-code uit te wisselen (ons eerste grote gecentraliseerde project was , opgericht voor Mathematica in 1991 op basis van CD-ROM, enzovoort). Ongetwijfeld is de voorgestelde benadering op basis van de Wolfram-functierepository een krachtiger en betrouwbaarder middel voor het realiseren van de bovengenoemde taken.
Meer dan 30 jaar heeft ons bedrijf hard gewerkt om de integriteit van de structuur van de Wolfram-taal te behouden, en dit is van groot belang om ervoor te zorgen dat de Wolfram-taal niet alleen een programmeertaal is, maar ook . En dus is de essentie van de benadering voor de implementatie van de Wolfram-functierepository het gebruik van een uniforme benadering voor programmeren en het ontwikkelen van nieuwe functies die consequent worden toegevoegd en geïntegreerd in de taal, zodat deze kan evolueren en gezamenlijk verder ontwikkelen.
In de structuur van de implementatie van elke functie vinden verschillende rekenprocessen plaats. Het is belangrijk op te merken dat de functie voor de gebruiker een duidelijke en consistente uitstraling en leesbaarheid moet hebben. In deze context worden ingebouwde functies van de Wolfram Language gepresenteerd met meer dan 6000 opeenvolgende voorbeelden van hoe functies correct te programmeren (dit zijn onze , die omvatten ). Deze benadering stelt uiteindelijk in staat om de Wolfram-functieset goed te laten functioneren, dankzij de gestructureerde aard van de Wolfram Language met zijn grote aantal extra en diverse bibliotheken die al in de taal zijn ingebouwd. Bijvoorbeeld, als u een functie heeft die afbeeldingen verwerkt, of , of , evenals of iets anders — de taal heeft al een consistente symbolische representatie ervan, en hierdoor wordt uw functie meteen compatibel met andere functies in de taal.
Het creëren van een repository die echt goed functioneert is een interessante meta-programmeringsuitdaging. Bijvoorbeeld, een overvloed aan beperkingen in het programma zal niet in staat zijn om de vereiste uniciteit en universaliteit van de algoritmeworkflow te verkrijgen. Evenzo, met een tekort aan functionele beperkingen, kunt u geen voldoende correcte volgorde van de algoritme-uitvoering implementeren. Enkele eerdere voorbeelden van de compromisimplementaties van deze benaderingen, uitgevoerd door ons bedrijf, hebben redelijk stabiel gewerkt: , gestart in 2007 en nu interactief werkend op het internet met meer dan 12000 gebruikersinteractieve demonstraties. In de zijn er meer dan 600 kant-en-klare databases beschikbaar voor gebruik in de Wolfram Language, en wordt bijna elke week aangevuld met nieuwe neurale netwerken (nu zijn er er al 118) en ze worden direct aangesloten via de functie in de Wolfram Language.
Alle bovengenoemde voorbeelden hebben een fundamenteel kenmerk – de objecten en functies die in het project worden verzameld, hebben een zeer hoog niveau van structurering en procesverdeling. Uiteraard kunnen de details van de structuur die betrekking heeft op de demonstratie of het neuraal netwerk of iets anders sterk verschillen, maar de fundamentele structuur voor elke huidige repository blijft altijd onveranderd. Wat is uw mening, gewaardeerde gebruiker, over het creëren van een dergelijk repository dat uitbreidingen toevoegt aan de Wolfram-taal? De Wolfram-taal is zo ontworpen dat hij uiterst flexibel is, zodat hij op elke mogelijke manier kan worden uitgebreid en aangepast. Dit is van cruciaal belang voor de mogelijkheid om snel verschillende grootschalige softwareprojecten in de Wolfram-taal te creëren. Het moet worden opgemerkt dat naarmate de flexibiliteit van de taal toeneemt, ook de kosten van projecten die in die taal worden gerealiseerd, onvermijdelijk zullen stijgen. Dit komt omdat hoe meer een gebruiker deze taal toepast, hoe meer specifieke functionaliteit hij krijgt, maar men moet niet vergeten dat deze benadering ook nadelige kanten kan hebben met betrekking tot het waarborgen van consistente samenhang van softwaremodulen.
In traditionele programmeertalen bestaat er een veel voorkomend probleem met bibliotheken – als u bijvoorbeeld één bibliotheek gebruikt, werkt de code correct, maar als u meerdere bibliotheken probeert te gebruiken, is er geen garantie dat ze correct met elkaar zullen interageren. Ook in traditionele programmeertalen – in tegenstelling tot een volledige rekenkundige taal – ontbreken de mogelijkheden om gegarandeerd de aanwezigheid van consistente ingebouwde representaties voor bepaalde functies of datatypen, behalve hun basisstructuren, te controleren. Maar in wezen is het probleem nog groter dan het op het eerste gezicht lijkt: als iemand een grootschalige verticale functionaliteit bouwt, is het zonder enorme uitgaven voor gecentraliseerde programmatuur, die we in de Wolfram-taal hebben gestoken, onmogelijk om consistentie te bereiken. Daarom is het belangrijk dat alle softwaremodulen altijd correct samenwerken.
Het idee van de Wolfram-functierepository is om het eerder genoemde probleem te vermijden door eenvoudig uitbreidingen aan de taal toe te voegen in de vorm van relatief kleine stukjes programmatuur via afzonderlijke functies. Het ontwikkelen van deze functies als coherente modules is een veel eenvoudigere taak. Toch zijn er programmeerkenmerken die niet eenvoudig kunnen worden vereenvoudigd met afzonderlijke functies (en ons bedrijf is van plan binnenkort een geoptimaliseerd algoritme uit te brengen om te helpen bij de implementatie van grootschalige softwarepakketten). Echter, op basis van de al ingebouwde functies van de Wolfram Language zijn er talloze programmeermogelijkheden beschikbaar die zijn gerealiseerd met afzonderlijke functies. Het idee is dat met relatief weinig programmeerinspanningen een reeks nieuwe en nuttige functies kan worden gecreëerd die voldoende consistentie in het project waarborgen, terwijl deze goed met elkaar zijn afgestemd en bovendien gemakkelijk en breed in de taal kunnen worden gebruikt.
Deze benadering is zonder meer een compromis. Bij de implementatie van een groter pakket kan men zich een geheel nieuwe wereld van functionaliteit voorstellen die buitengewoon krachtig en nuttig zal zijn. Als er behoefte is aan nieuwe functionaliteiten die in het geheel passen, maar u bent niet bereid om enorme inspanningen te steken in de ontwikkeling van het project, kan dit helaas leiden tot een vermindering van de schaal van uw project. Het idee van de Wolfram-functierepository is om de functie te bieden die een bepalend deel van het project vormt; deze benadering maakt het mogelijk om krachtige functionaliteiten toe te voegen, terwijl het tegelijkertijd het onderhoud van een goede consistentie in programmering vereenvoudigt.
Hulp bij het toevoegen van gebruikersfuncties aan de functie-repository
Onze specialisten hebben hard gewerkt om de bijdrage van gebruikers aan de Wolfram-functierepository zo eenvoudig mogelijk te maken. Op het bureaublad (al op ), U kunt eenvoudig door de tabs van het hoofdmenu navigeren: Bestand > Nieuw > RepositoryItem > Functie Repository Item en u krijgt «» (programmatisch binnen de werkomgeving. U kunt ook de functie analoog gebruiken — ):

Er zijn twee belangrijkste acties die u moet uitvoeren: ten eerste, daadwerkelijk de code van uw functie schrijven en, ten tweede, documentatie schrijven die illustreert hoe uw functie zou moeten werken.
Klik op de knop «Open Voorbeeld» bovenaan om een voorbeeld te zien van wat u moet doen:

U probeert feitelijk iets te creëren dat lijkt op een ingebouwde functie in de Wolfram-taal. Behalve dat het iets veel specifieker kan doen dan een ingebouwde functie. De verwachtingen met betrekking tot de volledigheid en betrouwbaarheid zullen aanzienlijk lager zijn.
U moet een naam geven aan uw functie die voldoet aan de naamgevingsprincipes van de Wolfram-taal. Daarnaast heeft u documentatie voor uw functie nodig, vergelijkbaar met de ingebouwde functies van de taal. Daarover zal ik later meer vertellen. Let nu gewoon op dat er in de rij knoppen bovenaan het document van het definitieblok een knop is , waarin wordt uitgelegd wat te doen, en een knop «Tools» die een toolbox biedt voor het formatteren van de documentatie van uw functie.
Wanneer u er zeker van bent dat alles correct is ingevuld en u klaar bent, klik dan op de knop «Check» («Controleren»). Het is volkomen normaal dat u nog niet alle details begrijpt. Daarom zal de functie «Check» automatisch worden uitgevoerd en veel controles van stijl en consistentie uitvoeren. Vaak zal het u direct vragen om wijzigingen te bevestigen en te accepteren (bijvoorbeeld: «Deze regel moet eindigen met een dubbele punt», en het zal voorstellen om een dubbele punt in te voeren). Soms vraagt het u om iets zelf toe te voegen of te wijzigen. We zullen voortdurend nieuwe mogelijkheden toevoegen aan de automatische functionaliteit van de knop «Check», maar het belangrijkste doel ervan is om te waarborgen dat alles wat u in de functie-repository indient, al zo goed mogelijk voldoet aan de stijlrichtlijnen.

Dus, na het klikken op 'Controleren' kunt u 'Voorbeeld' gebruiken. 'Voorbeeld' genereert een voorvertoning van de documentatiepagina die u voor uw functie heeft opgegeven. U kunt ook een voorvertoning maken voor een bestand dat op uw computer is opgeslagen of voor een bestand dat zich in cloudopslag bevindt. Als u om welke reden dan ook niet tevreden bent met wat u in de voorvertoning ziet, gaat u gewoon terug en voert u de nodige aanpassingen door, en klikt dan opnieuw op de knop Voorbeeld.
Nu bent u klaar om uw functie in de repository te plaatsen. De knop Implementeren biedt u vier acties:

In deze fase is het belangrijk om te beseffen dat u uw functie naar de Wolfram-functierepository kunt verzenden, zodat deze toegankelijk is voor elke gebruiker. U kunt echter ook uw functie inzetten voor een beperkt aantal gebruikers. Bijvoorbeeld, u kunt een functie maken die lokaal op uw computer is ingezet, zodat deze beschikbaar is wanneer u deze specifieke computer gebruikt. Of u kunt deze inzetten in uw , zodat deze toegankelijk is voor u wanneer u verbonden bent met de cloud. U kunt uw functie ook openbaar inzetten via uw cloudaccount. Deze zal dan niet in de centrale Wolfram-functierepository staan, maar u kunt iemand een URL geven waarmee ze uw functie uit uw account kunnen ophalen. (In de toekomst zullen we ook centrale repositories op bedrijfsniveau ondersteunen).
Dus, stel dat u uw functie daadwerkelijk naar de Wolfram-functiekennisbank wilt verzenden. Om dit te doen, drukt u op de knop 'Indienen' in de repository. Wat gebeurt er dan op dat moment? Uw aanvraag komt onmiddellijk in de wachtrij voor beoordeling en goedkeuring door ons speciale team van curatoren.
Naarmate uw aanvraag door het goedkeuringsproces gaat (wat meestal enkele dagen duurt), ontvangt u updates over de status van de beoordeling, evenals mogelijk suggesties voor verder gebruik. Maar zodra uw functie is goedgekeurd, wordt deze onmiddellijk gepubliceerd in de Wolfram-functierepository en beschikbaar voor elk gebruik. (En dit zal worden weergegeven in enz.)
Wat moet er in de repository staan?
Het is belangrijk op te merken dat ons bedrijf zeer hoge normen heeft voor volledigheid, betrouwbaarheid en algehele kwaliteit; meer dan 6000 functies die we in de afgelopen 30 jaar in de Wolfram-taal hebben geïntegreerd, voldoen allemaal aan de bovenstaande vereisten. Het doel van de Wolfram-functierepository is om de gehele structuur en functionaliteit die al in de Wolfram Language bestaat, te gebruiken om zoveel mogelijk lichtere functies toe te voegen (d.w.z. functies met een hogere prestatie).
Zonder twijfel moeten de functies in de Wolfram-functierepository voldoen aan de ontwikkelingsprincipes van de Wolfram Language, zodat ze volledig kunnen interageren met andere functies en tegemoetkomen aan de verwachtingen van gebruikers over hoe functies correct moeten werken. Echter, functies hoeven niet dezelfde volledigheid of betrouwbaarheid te hebben.
Bij de ingebouwde functies van de Wolfram-taal werken we er hard aan om softwarefuncties zo algemeen mogelijk te maken. Daarbij is er in de Wolfram-functierepository niets mis mee als er een functie wordt opgenomen die gewoon een zeer specifieke, maar nuttige situatie verwerkt. Bijvoorbeeld, de functie kan bestanden in één specifiek formaat ontvangen en e-mail op een specifieke manier creëren. maakt diagrammen met alleen specifieke kleuren en labeling, enz.
Een ander punt met betrekking tot ingebouwde functies is dat ons bedrijf zich inspant om alle atypische gevallen te verwerken, om onjuiste invoer correct te behandelen, enzovoort. In de functiesrepository is het heel normaal dat er een speciale functie bestaat die de belangrijkste gevallen van het probleem behandelt en alle andere negeert.
Het is duidelijk dat het beter is om functies te hebben die meer doen en dat ook beter doen, maar de optimalisatie voor de functiesrepository - in tegenstelling tot de ingebouwde functies van de Wolfram-taal - moet meer functies bevatten, gekoppeld aan meer functies, dan dat men zich verdiept in de implementatieprocessen van elke specifieke functie.
Laten we nu een voorbeeld bekijken van het testen van functies in de repository. De verwachtingen voor consistentie bij dergelijke functies zijn natuurlijk veel lager dan voor de ingebouwde functies van de taal. Dit is des te relevanter wanneer functies afhankelijk zijn van externe middelen, zoals API's, en het is belangrijk om voortdurend consistente tests uit te voeren, wat automatisch gebeurt binnen de validatie-algoritmen. In het nb-bestand kunt u expliciet definities opgeven (in het gedeelte 'Aanvullende informatie') en het aantal tests dat u nodig acht, bepalen, gedefinieerd door ofwel invoer- en uitvoerstrings, ofwel volledige symbolische objecten van het type , dat u nodig acht. Bovendien probeert het systeem constant de voorbeelden in de documentatie die u hebt opgegeven om te zetten in een validatieproces (soms kan dit behoorlijk resource-intensief zijn, bijvoorbeeld voor een functie waarvan het resultaat afhankelijk is van willekeurige getallen of het tijdstip van de dag).
Uiteindelijk zal er in de functiesrepository een reeks implementatie-uitdagingen zijn. Sommige zullen gewoon één regel code zijn, andere kunnen duizenden of tienduizenden regels omvatten, waarschijnlijk met het gebruik van tal van hulpfuncties. In welke gevallen is het de moeite waard om een functie toe te voegen, waarvoor heel weinig code nodig is? In principe, als er een , dat gebruikers dit zonder problemen zouden begrijpen als ze het in een codefragment zouden zien, kan het al worden toegevoegd. Anders is het waarschijnlijk beter om de code elke keer opnieuw aan uw programma toe te voegen wanneer u deze nodig heeft.
Het primaire doel van de functie-repository (zoals de naam al aangeeft) is om nieuwe functies in de taalfunctionaliteit te introduceren. Als u nieuwe gegevens wilt toevoegen of , gebruik dan . Maar wat als u nieuwe objecttypen wilt invoeren voor uw berekeningen?
Er zijn in feite twee manieren. Misschien wilt u een nieuw objecttype invoeren dat zal worden gebruikt in nieuwe functies in de functie-repository. In dat geval kunt u eenvoudig zijn symbolische representatie vastleggen en deze gebruiken bij het invoeren of uitgeven van functies in de functie-repository.
Maar wat als u een object wilt vertegenwoordigen en vervolgens wilt definiëren, via bestaande functies in de Wolfram Language, die moeten samenwerken met het? Hiervoor heeft de Wolfram Language altijd een eenvoudig mechanisme gehad dat ' ' wordt genoemd. Met enkele beperkingen (vooral voor functies die ), stelt de functie-repository u in staat om eenvoudig een functie te vertegenwoordigen en waarden voor deze te definiëren. (Om de consistentie te verbeteren bij het creëren van een nieuwe belangrijke constructie, volledig geïntegreerd in de Wolfram Language, is dit meestal een zeer belangrijk proces dat niet kan worden bereikt alleen door de kosten van het project te verhogen, en dit is wat ons bedrijf doet binnen de projecten voor de lange termijn ontwikkeling van de taal; deze taak is geen doel dat wordt gesteld binnen de ontwikkeling van de repository).
Dus, wat kan er in de code van functies in de functie-repository staan? , natuurlijk (tenzij het een voor Wolfram Cloud , ofwel . Natuurlijk zijn er enkele risico's verbonden aan dit. Omdat er geen garanties zijn dat de API niet zal veranderen en de functionaliteit in de functieopslag tegelijkertijd niet meer werkt. Er is een opmerking op de documentatiepagina (in het gedeelte 'Vereisten') voor elke functie die niet alleen afhankelijk is van de ingebouwde functionaliteit van Wolfram Language om dergelijke problemen te identificeren. (Natuurlijk kunnen er zelfs met zulk een functionaliteit problemen zijn als het gaat om echte gegevens — omdat echte gegevens over de wereld constant veranderen en soms zelfs hun definities en structuur wijzigen.)
Moet alle code voor de Wolfram-functierepository in Wolfram-taal zijn geschreven? Absoluut, de code binnen de externe API hoeft niet in de Wolfram-taal te zijn geschreven, wat het eigenlijk ook niet tot code van de taal maakt. In feite, als je een functie vindt in zowat elke externe taal of bibliotheek, kun je een wrapper maken die het mogelijk maakt deze te gebruiken in de Wolfram-functierepository. (Meestal gebruik je hiervoor ingebouwde functies of in de Wolfram-taal.)
Dus wat is het punt hiervan? In wezen stelt het je in staat om het volledige geïntegreerde systeem van Wolfram Language en de hele set van softwarefunctionaliteiten te gebruiken. Als je een basisimplementatie krijgt uit een externe bibliotheek of taal, dan kun je de rijke symbolische structuur van de Wolfram Language gebruiken om een handige bovenliggende functie te creëren die gebruikers eenvoudig maakt om elke al gerealiseerde functionaliteit te gebruiken. Ten minste, dit zou moeten kunnen worden gerealiseerd in een ideale wereld, waar alle elementen voor het laden van bibliotheken enzovoort aanwezig zijn, in dit geval zullen ze automatisch worden opgelost met behulp van de Wolfram Language. (Het moet worden opgemerkt dat er in de praktijk problemen kunnen optreden met in een specifieke computersysteem, en in de cloudopslag kunnen er extra beveiligingsproblemen optreden).
Bijvoorbeeld, wanneer je voor de eerste keer typische externe bibliotheken analyseert, lijken ze vaak te ingewikkeld om slechts met een paar functies te bevatten. Maar in veel gevallen ontstaat een groot deel van de complexiteit door de infrastructuur die nodig is voor de bibliotheek en alle ondersteunende functies. Echter, met de Wolfram Language is de infrastructuur meestal al ingebouwd in de pakketten, waardoor je niet alle ondersteunende functies gedetailleerd hoeft te onthullen; in plaats daarvan hoef je alleen maar functies voor een paar 'topfuncties' te creëren die gericht zijn op toepassingen binnen de bibliotheek.
Het 'ecosysteem' van de kennisdatabase
Als je functies hebt geschreven die je regelmatig gebruikt, stuur ze dan naar de Wolfram-functierepository! Zelfs als hier uiteindelijk niets groots uit voortkomt (de ontwikkeling van de taal), zal het veel handiger zijn om functies voor persoonlijk gebruik te hebben. Het is logisch te veronderstellen dat, als je functies regelmatig gebruikt, andere gebruikers ze ook nuttig zullen vinden.
Natuurlijk kan het zijn dat je in een situatie terechtkomt waarin je niet in staat bent — of niet wilt — om je functies te delen, of wanneer je toegang nodig hebt tot private informatiebronnen. Zelfs in dergelijke gevallen kun je eenvoudigweg de functies in je eigen cloudaccount implementeren, toegang tot hen op te geven. (Als jouw organisatie een , dan zal deze binnenkort zijn eigen privéfunctierepository kunnen hosten, die vanuit jouw organisatie beheerd kan worden en waarmee je kunt bepalen of derden deze kunnen bekijken of niet.)
De functies die je naar de Wolfram-functierepository stuurt, hoeven niet perfect te zijn; ze moeten gewoon nuttig zijn. Dit lijkt een beetje op de 'Fouten'-sectie in de klassieke Unix-documentatie — binnen de 'Definities'-sectie is er een 'Auteurnotities'-sectie waarin je beperkingen, problemen, enz. kunt beschrijven waarvan je al op de hoogte bent met betrekking tot je functie. Bovendien, wanneer je je functie naar de repository stuurt, kun je opmerkingen bij je inzending voegen die door een speciaal team van curatoren worden gelezen.
Na publicatie heeft de pagina van de functie altijd twee links onderaan: '» en «». Als u een aantekening bijvoegt (bijvoorbeeld om me op fouten te wijzen), kunt u een vakje aanvinken waarin staat dat u wilt dat uw bericht en contactinformatie aan de auteur van de functie worden doorgegeven.
Soms is het nodig om eenvoudigweg functies uit de Wolfram-functierepository te gebruiken, zoals ingebouwde functies, zonder in hun code te kijken. Maar als je ‘onder de motorkap’ wilt kijken, is er altijd een knop ‘Notitieboek’ bovenaan. Klik daarop en je krijgt je eigen kopie van het originele notitieboek met de definitie die naar de functierepository is gestuurd. Soms kun je het gewoon gebruiken als voorbeeld voor jouw behoeften. Hierbij kun je ook een eigen aanpassing van deze functie ontwikkelen. Misschien wil je deze functies die je in de repository hebt gevonden op je computer of in je account in jouw cloudopslag plaatsen, of misschien wil je ze indienen in de kennisbank van functies, wellicht als een verbeterde, uitgebreide versie van de oorspronkelijke functie.
In de toekomst zijn we van plan om Git-achtige branching te ondersteunen voor functierepositories, maar op dit moment proberen we het eenvoudiger te maken, en hebben we altijd slechts één algemeen aanvaarde versie van elke functie die in de taal is ingebouwd. Meestal (tenzij ontwikkelaars zich terugtrekken uit het onderhouden van de door hen ontwikkelde functies en niet reageren op gebruikersberichten) krijgt de oorspronkelijke auteur van de functie controle over de updates en stuurt nieuwe versies die vervolgens worden gecontroleerd en, als ze het beoordelingsproces doorstaan, in de taal worden gepubliceerd.
Laten we de vraag bekijken hoe ‘versiebeheer’ van ontwikkelde functies werkt. Op dit moment, wanneer je een functie uit de functierepository gebruikt, wordt de definitie constant op jouw computer opgeslagen (of in jouw cloudaccount als je de cloud gebruikt). Als er een nieuwe versie van de functie beschikbaar is, krijg je bij de volgende keer dat je de functie gebruikt een bericht dat je hiervan op de hoogte stelt. En als je de functie naar een nieuwe versie wilt upgraden, kun je dat doen met het commando ("Een functioneel BLOB-object" bevat in feite meer informatie over versies, en in de toekomst zijn we van plan dit toegankelijker te maken voor onze gebruikers.)
Een van de mooie kenmerken van de Wolfram functie-repository is dat iedere Wolfram Language-programma overal functies uit kan gebruiken. Als een programma in een notebook voorkomt, is het vaak handig om de functies uit de repository in de vorm van leesbare 'functionele binaire objecten' te formatteren (misschien met de bijbehorende set versies).
Je kunt altijd verwijzen naar een functie in de functie-repository met behulp van tekst . En dit is zeer handig als je code of scripts schrijft direct voor de Wolfram Engine, bijvoorbeeld met (het moet vooral worden opgemerkt dat de functie-repository volledig compatibel is met ).
How does it work?
Binnen de functies in de Wolfram-repository is het mogelijk met behulp van precies hetzelfde dat we in al onze andere bestaande repositories gebruiken Neural Net Repository , ResourceFunction ResourceObject .
Binnen kun je wat informatie zien met behulp van de functie :

Information :

Nadat je de definitie hebt gemaakt, kun je de resourcefunctie gebruiken:

Let op dat in dit BLOB-object van de functie er een zwart icoon is

. Dit betekent dat de BLOB-functie betrekking heeft op de in het geheugen gedefinieerde resourcefunctie voor de huidige sessie. Voor een resourcefunctie die permanent op je computer of in je cloudaccount is opgeslagen, is er een grijs icoon
. En voor de officiële resourcefunctie in de Wolfram functie-repository is er een oranje icoon
Dus wat gebeurt er als je het menu 'Deploy' gebruikt in het definitienotebook? Ten eerste neemt het alle definities in het notebook en creëert er een symbolisch van
.
Dus, wat gebeurt er wanneer je het 'Uitrollen'-menu in het definitiebestand gebruikt? Ten eerste pakt het alle definities in het bestand en creëert daaruit een symbool. ). (En als u een tekst IDE of programma gebruikt, kunt u ook expliciet creëren )
Lokale implementatie van de functie vanuit de repository op uw computer wordt uitgevoerd met behulp van het commando voor het hulpbronnobject om het op te slaan als in uw bestandssysteem. Implementatie in een cloudaccount wordt uitgevoerd met behulp van het commando voor het hulpbronnobject, en openbare implementatie in de cloud — . In alle gevallen wordt ook gebruikt om de functie naam van het hulpbronysteem te registreren, zodat zullen werken.
Wanneer u op de knop Verzenden voor de Function Repository drukt, gebeurt er onder deze actie wordt aangeroepen op het hulpbronnobject. (En als u een tekstinvoerinterface gebruikt, kunt u ook direct aanroepen.)
Standaard wordt de verzending uitgevoerd onder de naam die aan uw Wolfram ID is gekoppeld. Maar als u een aanvraag indient namens een ontwikkelaarsgroep of organisatie, kunt u en deze in plaats daarvan gebruiken als naam voor interactie met uw weergaven.
Nadat u een van uw functies naar de functie-kennisdatabase heeft verzonden, komt deze in de wachtlijst voor beoordeling. Als u feedback ontvangt, is deze meestal in de vorm van een tekstbestand met toegevoegde 'commentaarkolommen'. U kunt altijd de status van uw aanvraag controleren door naar de . Maar zodra uw functie is goedgekeurd, ontvangt u een melding (per e-mail) en zal uw functie worden gepubliceerd in de Wolfram functie repository.
Enkele nuances in het werk
Op het eerste gezicht lijkt het misschien eenvoudig om gewoon een definitie-notitieblok letterlijk in de functie repository te plaatsen, maar in werkelijkheid zijn er nogal wat nuances — en om deze te verwerken, is een vrij gecompliceerde meta-programmering vereist, waarbij wordt omgegaan met zowel de code die de functie definieert als het definitie-notitieblok zelf. Het grootste deel hiervan gebeurt intern, dus 'achter de schermen', maar het kan enkele gevolgen hebben die het waard zijn te begrijpen als u van plan bent bij te dragen aan de functie-kennisdatabase.
De eerste directe nuance: wanneer u het "Definitieblok" invult, kunt u overal naar uw functie verwijzen met een naam zoals MyFunction, die eruitziet als een gewone functienaam in de Wolfram-taal, maar voor de documentatie van de functie-repository wordt deze vervangen door – dat is precies wat gebruikers daadwerkelijk zullen gebruiken bij het werken met de functie.
De tweede nuance: wanneer u een resource-functie maakt vanuit het definitieblok, moeten alle afhankelijkheden die betrokken zijn bij de functiedefinitie worden vastgelegd en expliciet worden opgenomen. Om ervoor te zorgen dat de definities modulair blijven, moet alles worden geplaatst in een unieke . (Natuurlijk, de , bevinden zich in de functie-repository.)
Gewoonlijk ziet u nooit enig spoor van de code die wordt gebruikt om deze namespace in te stellen. Maar als u om de een of andere reden een niet-afgeronde symbool binnen uw functie aanroept, zult u zien dat dit symbool zich binnen de interne context van de functie bevindt. Echter, bij het verwerken van het definitieblok, wordt tenminste het symbool dat overeenkomt met de functie zelf, in de vorm van een functionele BLOB, en niet als een ruwe symbool in de interne context.
De functie-repository is bedoeld voor het definiëren van nieuwe functies. En deze functies kunnen opties hebben. Vaak kunnen deze parameters (zoals of ) worden gebruikt voor ingebouwde functies, evenals voor die waarvoor al ingebouwde symbolen bestaan. Maar soms kan een nieuwe functie ook nieuwe opties vereisen. Om de modulariteit te behouden, moeten deze parameters symbolen zijn die zijn gedefinieerd in een unieke interne context (of iets wat lijkt op hele resource-functies, dat wil zeggen op zichzelf staand). Voor de eenvoud staat de functie-repository toe dat nieuwe opties in definities worden aangegeven als tekenreeksen. En voor het gemak van de gebruiker worden deze definities (op voorwaarde dat ze gebruik maakten van en ) ook zo verwerkt dat bij het gebruik van functies de 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 hebben initialisatie nodig voordat ze kunnen werken in een bepaalde sessie — en om dit probleem op te lossen, is er in het gedeelte 'Definitie' een sectie 'Initialisatie'.
Functies uit de repository kunnen andere functies gebruiken die al in de repository aanwezig zijn, om definities voor de functie-repository in te stellen. Als er twee (of meer) functies zijn die naar elkaar verwijzen, moeten ze in uw werkperiode met het programma worden uitgerold zodat u naar hen kunt verwijzen als , dan kunt u de gewenste combinaties van deze functies creëren en een nieuwe functie aan de repository toevoegen op basis van al eerder geplaatste functies.
Ontwikkelingsvooruitzichten. Wat moet er gebeuren wanneer de repository echt groot wordt?
Vandaag lanceren we de Wolfram functie-repository, maar na verloop van tijd verwachten we dat het volume en de functionaliteit ervan aanzienlijk kan toenemen, en naarmate deze toeneemt, zullen er verschillende problemen ontstaan die we al kunnen voorzien.
Het eerste probleem betreft de namen van de functies en hun uniciteit. De functie-repository is zo ontworpen dat, net als voor ingebouwde functies in de Wolfram Language, op elke gegeven functie kan worden verwezen door gewoon de naam op te geven. Maar dit betekent onvermijdelijk dat functienamen wereldwijd uniek moeten zijn binnen de repository, zodat er bijvoorbeeld maar één kan zijn .
Op het eerste gezicht kan dit een groot probleem lijken, maar men moet begrijpen dat dit in feite hetzelfde probleem is als dat van internetdomeinen of social media-handle's. En het feit is dat er een registrar in het systeem moet zijn — en dit is een van de rollen die ons bedrijf zal vervullen voor de Wolfram functie-database. (Voor privéversies van de repository kunnen hun registrars beheerders zijn.) Natuurlijk kan een internetdomein worden geregistreerd zonder iets erop, maar in de functie-repository kan de naam van een functie alleen worden geregistreerd als er een feitelijke definitie van de functie is.
Een deel van onze rol in het beheer van de kennisbasis van Wolfram-functies is ervoor te zorgen dat de naam die voor een functie is gekozen logisch is in het licht van de definitie van de functie, en dat deze voldoet aan de naamgevingsconventies van de Wolfram-taal. We hebben al meer dan 30 jaar ervaring in het benoemen van ingebouwde functies in de Wolfram-taal, en ons curatorteam zal deze ervaring ook in de functiesrepository brengen. Er zijn uiteraard altijd uitzonderingen. Het kan bijvoorbeeld wenselijk lijken om een korte naam voor een bepaalde functie te hebben, maar het is beter om
(Het is belangrijk op te merken dat het simpelweg toevoegen van een deelnemerstag om ambiguïteit in functies te verwijderen niet het gewenste effect zal hebben. Want als we niet eisen dat er altijd een tag wordt toegewezen, moet er een standaardtag voor elke gegeven functie worden gedefinieerd, evenals het toewijzen van auteurs tags, wat opnieuw wereldwijde coördinatie vereist.)
Naarmate de kennisbasis van Wolfram-functies groeit, is één van de problemen die zeker zal optreden de ontdekbaarheid van functies. Hiervoor is in het systeem (en definitie-bestanden kunnen sleutelwoorden enz. bevatten). Voor ingebouwde functies in de Wolfram-taal zijn er in de documentatie allerlei kruisverwijzingen die helpen met het 'adverteren' van functies. Functies in de functiesrepository kunnen verwijzen naar ingebouwde functies. Maar hoe zit het andersom? Hiervoor zijn we van plan om te experimenteren met verschillende schema's om functies van de repository op de documentatiepagina's voor ingebouwde functies weer te geven.
Voor ingebouwde functies in de Wolfram-taal bestaat er een zogenaamde ontdekbaarheidslaag, die wordt gegarandeerd door , die gestructureerde lijsten van functies bieden die verband houden met specifieke gebieden. Het is altijd moeilijk om de inhoud van de hulppagina’s goed in balans te houden, en naarmate de Wolfram-taal groeit, moeten de hulppagina’s vaak volledig worden herschikt. Het is relatief eenvoudig om functies uit de repository in brede categorieën te plaatsen en zelfs deze categorieën verder op te splitsen, maar het is veel waardevoller om goed georganiseerde hulppagina’s van de taal te hebben. Het is nog onduidelijk hoe ze het beste voor de hele kennisbasis van functies kunnen worden gecreëerd. Bijvoorbeeld, in de functies repository kan iedereen een webpagina plaatsen met zijn 'keuzes' uit de repository:

De Wolfram functies repository is ingesteld als een permanente opslagplaats van functies, waar elke functie altijd zal functioneren. Er kunnen zeker nieuwe versies van functies komen, en we verwachten dat sommige functies in de loop van de tijd verouderd raken. Functies zullen werken als ze in programma's worden gebruikt, maar hun documentatiepagina's zullen verwijzen naar nieuwere, geavanceerdere functies.
De Wolfram functies repository is bedoeld voor snelle toegang tot nieuwe functies en het verkennen van nieuwe mogelijkheden voor het gebruik van de Wolfram-taal. Met een groot deel van optimisme hopen we dat een deel van wat in de functies repository is onderzocht uiteindelijk logisch zal worden om ingebouwde delen van de hoofdtalen van de Wolfram Language te worden. In het afgelopen decennium hebben we een vergelijkbare set . En een van de lessen die zijn getrokken uit deze ervaring is dat het veel werk vereist, dat vaak ingewikkelder is dan de eerste inspanningen om het idee te implementeren, om de kwaliteits- en consistentienormen te bereiken die we benadrukken in alles wat in de Wolfram-taal is ingebouwd. Maar zelfs dan kan een functie in de kennisbasis van functies dienen als een zeer nuttig bewijs van conceptie voor een toekomstige functie die uiteindelijk in de Wolfram-taal kan worden ingebouwd.
Het belangrijkste is dat de functie in de functie-repository nu direct toegankelijk is voor elke gebruiker. Hoewel de ingebouwde functie van de taal veel beter en efficiënter kan zijn, stelt de functie-repository gebruikers in staat om meteen toegang te krijgen tot alle nieuwe functies. En vooral belangrijk is dat dit concept iedereen in staat stelt om zijn eigen nieuwe functies toe te voegen.
Vroeger zou deze idee in de geschiedenis van de Wolfram-taal niet zo goed hebben gewerkt als nu, maar op dit moment is er al zoveel inspanning in de taal gestoken en zo'n diep begrip van de ontwerpeprincipes ingebouwd, dat het nu heel goed mogelijk lijkt dat een grote gemeenschap van gebruikers functies toevoegt die de consistentie van het project behouden, zodat ze nuttig zijn voor een breed publiek.
In de gemeenschap van gebruikers van de Wolfram-taal is er een ongelooflijke geest van talent. (Natuurlijk omvat deze gemeenschap veel toonaangevende specialisten op het gebied van onderzoek en ontwikkeling in verschillende disciplines.) Ik hoop dat de Wolfram Function Repository een effectief platform biedt voor het ontsluiten en verspreiden van deze geest van talent. Alleen samen kunnen we iets creëren dat het bereik significant uitbreidt waarvoor de computationale paradigma van de Wolfram-taal kan worden toegepast.
In meer dan 30 jaar hebben we een lange weg afgelegd met de Wolfram-taal. Laten we nu samen nog verder gaan. Ik verzoek alle gewaardeerde gebruikers van de Wolfram-taal wereldwijd om gebruik te maken van deze functie-repository als platform en van nieuwe softwareprojecten zoals de Free Wolfram Engine voor ontwikkelaars.
Bron: habr.com
