Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Bonjour Habr! Je présente à votre attention une traduction du post de Stephen Wolfram "Le référentiel de fonctions Wolfram : lancement d'une plate-forme ouverte pour étendre le langage Wolfram".

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Conditions préalables à la cohérence du langage Wolfram

Aujourd'hui, nous sommes sur le point de réaliser de grandes réalisations avec le langage de programmation Langue Wolfram. Il y a à peine trois semaines, nous avons lancé moteur Wolfram gratuit pour les développeurspour aider nos utilisateurs à intégrer Wolfram Language dans leurs projets logiciels à grande échelle. Aujourd'hui, nous lançons Dépôt de fonctions Wolfram, afin de fournir une plate-forme coordonnée pour les fonctions créées pour étendre le langage Wolfram, et nous ouvrons également un référentiel de fonctions pour toute personne pouvant contribuer au développement de notre produit logiciel.

Le référentiel de fonctions Wolfram est quelque chose rendu possible par la nature unique de Wolfram Language, non seulement en tant que langage de programmation, mais également en tant que langage de programmation. langage informatique à grande échelle. Dans les langages de programmation traditionnels, l'ajout de nouvelles fonctionnalités importantes implique généralement la création de bibliothèques supplémentaires entières qui peuvent ou non fonctionner lorsqu'elles sont utilisées ensemble. Cependant, dans Wolfram Language tant de choses sont déjà intégrées dans la langue elle-même, qu'il est possible d'étendre considérablement ses fonctionnalités en ajoutant simplement de nouvelles fonctions immédiatement intégrées dans la structure holistique de l'ensemble du langage.

Par exemple, le référentiel de fonctions Wolfram contient déjà 532 nouvelles fonctionnalités structuré en 26 catégories thématiques :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

De même, plus de 6000 fonctions standards, intégré au langage Wolfram, chaque fonction du référentiel dispose d'une page de documentation avec une description détaillée de celles-ci et des exemples de travaux :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Pour accéder à la page, copiez l'objet ci-dessus (fonction BLOB), collez-le dans la ligne de saisie, puis exécutez la fonction - il est déjà intégré au langage Wolfram et pris en charge par défaut en commençant par version 12.0:

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Il convient de noter ici que lors du traitement LogoQRCode Vous n'avez pas besoin, par exemple, de mettre en place une « bibliothèque de traitement d'images » - puisque nous avons déjà implémenté une méthode cohérente et soigneusement algorithmique dans Wolfram Language. traitement d'image, qui peut être immédiatement traité par différentes fonctions du langage graphique :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

J'espère qu'avec le soutien communauté merveilleuse et talentueuse, qui s'est développé et s'est développé (basé sur Wolfram Language) au cours des dernières décennies. Le référentiel de fonctions Wolfram permettra, dans un avenir prévisible, d'élargir considérablement la gamme de fonctions (éventuellement potentiellement importantes, spécialisées dans divers domaines scientifiques et technologiques) disponibles dans le langage. Ainsi, il devient possible d'utiliser à la fois le contenu du langage (ses fonctions intégrées) et principes de développement, qui sont implémentés en fonction du langage. (Il convient de noter ici que Wolfram Language a déjà plus de 30 ans d'histoire de développement et de croissance stable).
Les fonctions du référentiel peuvent contenir des morceaux de code petits ou grands écrits en Wolfram Language. Par exemple, il peut s'agir d'appels API et services externes ou bibliothèques externes dans d'autres langages. La caractéristique unique de cette approche est que lorsque vous explorez les fonctionnalités au niveau de l'utilisateur, il n'y aura aucune incohérence potentielle car l'approche est construite sur la structure cohérente de Wolfram Language - et chaque fonction fonctionnera automatiquement correctement - exactement comme C'est ce qu'elle avait prévu.
Le shell et la structure de programmation du Wolfram Feature Repository sont conçus pour que chacun puisse contribuer à la cause commune de la manière la plus simple et la plus pratique pour lui - en fait, simplement en remplissant le fichier texte du bloc note (avec extension nb) WL. Les fonctions automatiques intégrées vous permettent de vérifier les nouvelles fonctions ajoutées au référentiel pour garantir leur intégration dans le langage. Notre entreprise parie sur le large éventail d'utilisateurs capables d'intégrer leurs fonctions dans le langage, plutôt que sur la grande complexité des nouvelles fonctions - et bien qu'il y ait un processus de révision, nous n'insistons pas sur quelque chose comme analyse de conception minutieuse ou des normes strictes pour l'exhaustivité et la fiabilité des nouvelles fonctionnalités utilisateur, par opposition aux tests plus rigoureux des fonctionnalités intégrées au langage de base que nous utilisons.

Cette approche comporte de nombreux compromis et détails, mais notre objectif est d'optimiser le référentiel de fonctionnalités Wolfram à la fois pour l'expérience utilisateur et de garantir que les nouvelles fonctionnalités utilisateur contribuent de manière significative au développement du langage. À mesure que nous grandissons, je suis convaincu que nous devrons inventer de nouvelles méthodes de traitement et de validation des fonctions intégrées au référentiel, notamment pour organiser un grand nombre de fonctions et trouver celles dont les utilisateurs ont besoin. Il est toutefois encourageant de constater que la voie que nous avons choisie constitue un bon début. Personnellement, je ajouté plusieurs fonctionnalités à la base de données d'origine. Beaucoup d’entre eux sont basés sur du code que j’ai personnellement développé depuis un certain temps. Et cela ne m'a pris que quelques minutes pour les pousser vers le référentiel. Maintenant qu'elles sont dans le référentiel, je peux enfin - immédiatement et à tout moment - utiliser ces fonctions selon mes besoins, sans avoir à me soucier de la recherche de fichiers, du téléchargement de packages, etc.

Augmenter l’efficacité tout en réduisant les coûts

Même avant Internet, il existait des moyens de partager le code Wolfram Language (notre premier grand projet centralisé était MathSource, créé pour Mathematica en 1991 sur base de CD-ROM, etc.). Bien entendu, l'approche proposée pour la mise en œuvre basée sur le référentiel de fonctions Wolfram est un outil plus puissant et plus fiable pour mettre en œuvre les tâches ci-dessus.

Depuis plus de 30 ans, notre société a travaillé avec diligence pour maintenir l'intégrité de la structure du langage Wolfram, ce qui est essentiel pour garantir que le langage Wolfram devienne non seulement un langage de programmation, mais également un langage de programmation. langage informatique à part entière. Ainsi, l'essence de l'approche de mise en œuvre du référentiel de fonctions Wolfram est d'utiliser une approche unifiée pour programmer et développer de nouvelles fonctions qui sont ajoutées séquentiellement et s'intègrent dans le cadre du langage afin qu'il puisse se développer et co-évoluer.

Divers processus de calcul se produisent dans la structure de mise en œuvre de chaque fonction. Il convient de noter ici qu'il est nécessaire que la fonction présente une apparence claire et uniforme et une lisibilité visuelle pour l'utilisateur. Dans ce contexte, les fonctions intégrées de Wolfram Language sont présentées avec plus de 6000 XNUMX exemples séquentiels sur la façon de programmer correctement les fonctions (ce sont nos vidéos de programmation en directqui comprennent des centaines d'heures de processus de création de programmes standards). Ce que cette approche rend finalement le référentiel de fonctionnalités Wolfram capable de bien fonctionner, c'est la nature structurelle de Wolfram Language, avec son grand nombre de bibliothèques supplémentaires et variées déjà intégrées au langage. Par exemple, si vous disposez d'une fonction qui traite les images, ou tableaux clairsemésOu structures moléculaireset données géographiques ou quelques autres - leur représentation symbolique cohérente existe déjà dans le langage, et grâce à cela, votre fonction devient immédiatement compatible avec d'autres fonctions du langage.

Créer un référentiel qui fonctionne réellement bien est une tâche de méta-programmation intéressante. Par exemple, un excès de restrictions dans le programme ne permettra pas d'obtenir l'unification et l'universalité requises de l'algorithme. Tout comme avec un nombre insuffisant de restrictions fonctionnelles, vous ne pourrez pas implémenter une séquence d'exécution d'algorithme suffisamment correcte. Plusieurs exemples précédents de mise en œuvre d'un compromis de ces approches, mis en œuvre par notre entreprise, ont fonctionné de manière assez stable - ce sont : Démonstrations du projet Tungstène, lancé en 2007 et fonctionne désormais en ligne avec plus de 12000 XNUMX démos interactives pour les utilisateurs. DANS Base de données Wolfram il existe plus de 600 bases de données prêtes à l'emploi qui peuvent être utilisées dans Wolfram Language, et Stockage sur réseau neuronal Wolfram est réapprovisionné avec de nouveaux réseaux de neurones presque chaque semaine (il y en a déjà 118 maintenant) et ils sont immédiatement connectés via la fonction Modèle Net dans la langue Wolfram.

Tous les exemples ci-dessus ont une caractéristique fondamentale : les objets et fonctions collectés dans le projet ont un très haut degré de structuration et de répartition des processus. Bien sûr, les détails de la structure de ce qu'est une démo, un réseau de neurones ou autre chose peuvent varier considérablement, mais la structure fondamentale de tout référentiel actuel reste toujours la même. Alors, quelle est votre opinion, cher utilisateur, sur la création d'un tel référentiel qui ajoute des extensions au langage Wolfram ? Wolfram Language est conçu pour être extrêmement flexible, il peut donc être étendu et modifié de quelque manière que ce soit. Cette circonstance est extrêmement importante pour la possibilité de créer rapidement divers projets logiciels à grande échelle dans Wolfram Language. Il convient de noter ici qu'à mesure que la flexibilité de la langue augmente, le coût des projets mis en œuvre dans une telle langue augmentera inévitablement. Cela est dû au fait que plus l'utilisateur utilise un tel langage, plus il bénéficie de fonctionnalités dédiées, mais il ne faut pas oublier que cette approche peut également avoir des côtés négatifs en termes d'incapacité à assurer une cohérence cohérente des modules du programme.

Il existe un problème courant avec les bibliothèques dans les langages de programmation traditionnels : si vous utilisez une bibliothèque, par exemple, le code fonctionnera correctement, mais si vous essayez d'utiliser plusieurs bibliothèques, rien ne garantit qu'elles interagiront correctement les unes avec les autres. . De plus, dans les langages de programmation traditionnels - contrairement à un langage informatique à part entière - il n'existe aucun moyen de garantir la présence de représentations intégrées cohérentes pour les fonctions ou types de données autres que leurs structures de base. Mais, en fait, le problème est encore plus important qu'il n'y paraît à première vue : si l'on construit une verticale de fonctionnalités à grande échelle, alors sans les coûts énormes de programmation de projet centralisée que nous mettons dans le langage Wolfram, il est impossible de parvenir à une cohérence. Il est donc important que tous les modules logiciels fonctionnent toujours correctement ensemble.

L'idée derrière le référentiel de fonctionnalités Wolfram est donc d'éviter le problème décrit ci-dessus en ajoutant simplement des extensions au langage dans des morceaux de code relativement petits via des fonctionnalités individuelles plus faciles à développer en tant que modules cohérents. Cela étant dit, certaines fonctionnalités de programmation ne peuvent pas être rendues pratiques à l'aide de fonctions individuelles (et notre société prévoit de publier prochainement un algorithme de programmation optimisé pour faciliter la mise en œuvre de progiciels à grande échelle). Cependant, sur la base des fonctions déjà intégrées à Wolfram Language, il existe de nombreuses possibilités de programmation implémentées en fonction de fonctions individuelles. L'idée ici est qu'avec relativement peu d'effort de programmation, il est possible de créer un certain nombre de fonctions nouvelles et très utiles qui apporteront suffisamment de cohérence à la conception, elles seront bien coordonnées les unes avec les autres et, en plus, elles pourra être facilement et largement utilisé dans la langue à l'avenir.

Cette approche est bien entendu un compromis. Si un package plus vaste était implémenté, un tout nouveau monde de fonctionnalités pourrait être imaginé, extrêmement puissant et utile. S'il est nécessaire d'acquérir de nouvelles fonctionnalités qui s'intégreront à tout le reste, mais que vous n'êtes pas prêt à consacrer beaucoup d'efforts au développement du projet, cela peut malheureusement conduire à une réduction de la portée de votre projet. L'idée derrière le référentiel de fonctionnalités Wolfram est de fournir des fonctionnalités à une partie déterminante d'un projet ; cette approche ajoutera des fonctionnalités puissantes tout en facilitant le maintien d'une bonne cohérence dans un projet de programmation.

Aide à l'ajout de fonctions personnalisées au référentiel de fonctions

Notre équipe a travaillé dur pour permettre aux utilisateurs de contribuer facilement aux fonctionnalités du référentiel Wolfram. Sur le bureau (déjà dans version 12.0), Vous pouvez simplement parcourir les onglets du menu principal de manière séquentielle : Fichier > Nouveau > RepositoryItem > Function Repository Item et vous obtiendrez "Carnet de définition" (par programmation à l'intérieur de l'établi. Vous pouvez également utiliser la fonction analogique - Créer un carnet["RessourceFonction"]):

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Vous devrez effectuer deux étapes principales : premièrement, écrire le code de votre fonction et, deuxièmement, rédiger la documentation illustrant le fonctionnement de votre fonction.
Cliquez sur le bouton « Ouvrir l'échantillon » en haut pour voir un exemple de ce que vous devez faire :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Essentiellement, vous essayez de créer quelque chose de similaire à une fonction intégrée dans Wolfram Language. Sauf qu’il peut faire quelque chose de bien plus spécifique qu’une fonction intégrée. Dans le même temps, les attentes concernant son exhaustivité et sa fiabilité seront bien moindres.
Vous devez donner à votre fonction un nom qui suit les directives de dénomination des fonctions de Wolfram Language. De plus, vous devrez développer une documentation pour votre fonction, similaire aux fonctions intégrées du langage. J'en parlerai plus en détail plus tard. Pour l'instant, notez simplement que dans la rangée de boutons en haut du fichier du carnet de définitions, il y a un bouton "Directives de style", qui explique quoi faire, et un bouton Outils, qui fournit des outils pour formater la documentation de votre fonction.
Lorsque vous êtes sûr que tout est correctement rempli et que vous êtes prêt, cliquez sur le bouton « Vérifier ». Il est tout à fait normal que vous n'ayez pas encore compris tous les détails. Ainsi, la fonction "Vérifier" s'exécutera automatiquement et effectuera de nombreux contrôles de style et de cohérence. Souvent, il vous demandera immédiatement de confirmer et d'accepter les corrections (par exemple : « Cette ligne doit se terminer par deux points » et il vous demandera de saisir deux points). Parfois, elle vous demandera d’ajouter ou de modifier quelque chose vous-même. Nous ajouterons constamment de nouvelles fonctionnalités à la fonctionnalité automatique du bouton Vérifier, mais son objectif principal est de garantir que tout ce que vous soumettez au référentiel de fonctionnalités suit déjà de près autant de directives de style que possible.

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Ainsi, après avoir exécuté "Check", vous pouvez utiliser "Aperçu". "Aperçu" crée un aperçu de la page de documentation que vous avez définie pour votre fonction. Vous pouvez également créer un aperçu pour un fichier créé sur votre ordinateur ou pour un fichier situé dans le stockage cloud. Si, pour une raison quelconque, vous n'êtes pas satisfait de ce que vous voyez dans l'aperçu, revenez simplement en arrière et apportez les corrections nécessaires, puis cliquez à nouveau sur le bouton Aperçu.
Vous êtes maintenant prêt à transférer votre fonction dans le référentiel. Le bouton Déployer vous propose quatre options :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

L'important à cette étape est que vous puissiez soumettre votre fonction au référentiel de fonctions Wolfram afin qu'elle soit accessible à tous. Dans le même temps, vous pouvez également proposer votre fonction à un nombre limité d’utilisateurs. Par exemple, vous pouvez créer une fonction hébergée localement sur votre ordinateur afin qu'elle soit disponible lorsque vous utilisez cet ordinateur particulier. Ou vous pouvez le publier dans votre compte cloud, afin qu'il soit disponible lorsque vous êtes connecté au cloud. Vous pouvez également héberger (déployer) publiquement la fonctionnalité via votre compte cloud. Elle ne figurera pas dans le référentiel central des fonctionnalités de Wolfram, mais vous pourrez donner à quelqu'un une URL qui lui permettra d'obtenir votre fonctionnalité depuis votre compte. (À l'avenir, nous prendrons également en charge les référentiels centraux dans toute notre entreprise.)

Supposons donc que vous souhaitiez réellement soumettre votre fonction à la base de connaissances des fonctions Wolfram. Pour ce faire, vous cliquez sur le bouton « Soumettre » au référentiel. Alors que se passe-t-il en ce moment ? Votre candidature est immédiatement mise en file d'attente pour examen et approbation par notre équipe dédiée de conservateurs.

Au fur et à mesure que votre candidature progresse dans le processus d'approbation (qui prend généralement plusieurs jours), vous recevrez des communications concernant son statut et éventuellement des suggestions pour une utilisation future. Mais une fois votre fonctionnalité approuvée, elle sera immédiatement publiée dans le Wolfram Feature Repository et sera disponible pour tout le monde. (Et cela apparaîtra dans résumés d'actualités des nouvelles fonctionnalités et ainsi de suite)

Que doit contenir le stockage ?

Il convient de noter que notre société a des normes très élevées en matière d'exhaustivité, de fiabilité et de qualité globale, et que parmi les plus de 6000 30 fonctions que nous avons déjà intégrées dans le langage Wolfram au cours des XNUMX dernières années, toutes répondent aux exigences ci-dessus. L'objectif du Wolfram Function Repository est d'utiliser toute la structure et les fonctionnalités qui existent déjà dans Wolfram Language afin d'ajouter autant de fonctions beaucoup plus légères (c'est-à-dire des fonctions plus performantes) que possible.

Bien entendu, les fonctions du référentiel de fonctions Wolfram doivent être conformes aux principes de conception de Wolfram Language - afin qu'elles puissent interagir pleinement avec d'autres fonctions et avec les attentes des utilisateurs quant à la manière dont la fonction doit fonctionner correctement. Cependant, les fonctions ne doivent pas nécessairement être aussi complètes ou fiables.

Dans les fonctions intégrées du langage Wolfram, nous travaillons dur pour rendre les fonctions de programmation aussi générales que possible. Cela étant dit, dans le référentiel de fonctions Wolfram, il n'y a rien de mal à avoir une fonction qui gère simplement un cas très spécifique mais utile. Par exemple, la fonction EnvoyerMailFromNotebook peut recevoir des fichiers dans un format spécifique et créer du courrier d'une manière spécifique. Diagramme Polygonal crée des graphiques avec uniquement certaines couleurs et certains étiquetages, etc.

Un autre point lié aux fonctions intégrées est que notre société s'efforce de traiter tous les cas atypiques, de gérer correctement les saisies incorrectes, etc. Dans un référentiel de fonctions, il est tout à fait normal qu'il y ait une fonction spéciale qui gère les principaux cas de résolution d'un problème et ignore tous les autres.

Le point évident est qu'il est préférable d'avoir des fonctions qui font plus et mieux, mais l'optimisation d'un référentiel de fonctions - par opposition aux fonctions intégrées du langage Wolfram - devrait avoir plus de fonctions regroupées avec plus de fonctions plutôt que de se plonger dans les processus de mise en œuvre de chaque fonction spécifique.

Regardons maintenant un exemple de tests de fonctions dans un référentiel. Les attentes en matière de cohérence pour de telles fonctions sont naturellement bien inférieures à celles pour les fonctions de langage intégrées. Cela est particulièrement vrai dans les cas où les fonctions dépendent de ressources externes telles que les API. Il est important d'effectuer en permanence des tests cohérents, ce qui se produit automatiquement au sein des algorithmes de vérification. Dans le fichier nb, vous pouvez spécifier explicitement des définitions (dans la section Informations supplémentaires) et spécifier autant de tests définis soit par des chaînes d'entrée et de sortie, soit par des objets de caractères complets de type Test de vérification, autant que bon vous semble. De plus, le système essaie constamment de transformer les exemples de documentation que vous fournissez en un processus de vérification (et cela peut parfois être assez gourmand en ressources, par exemple pour une fonction dont le résultat dépend de nombres aléatoires ou de l'heure de la journée).

En conséquence, le référentiel de fonctions présentera un certain nombre de complexités de mise en œuvre. Certains ne consisteront qu'en une seule ligne de code, d'autres peuvent impliquer des milliers ou des dizaines de milliers de lignes, utilisant probablement de nombreuses fonctions d'assistance. Quand vaut-il la peine d’ajouter une fonction qui nécessite très peu de code à définir ? En gros, si pour une fonction il y a bon nom mnémotechnique, que les utilisateurs comprendraient facilement s'ils le voyaient dans un morceau de code, il peut alors déjà être ajouté. Sinon, il est probablement préférable de simplement ré-ajouter le code à votre programme chaque fois que vous en avez besoin.

L'objectif principal d'un référentiel de fonctions (comme son nom l'indique) est d'introduire de nouvelles fonctionnalités dans le langage. Si vous souhaitez ajouter de nouvelles données ou nouvelles entités, utilisation Dépôt de données Wolfram. Mais que se passe-t-il si vous souhaitez introduire de nouveaux types d’objets pour vos calculs ?

Il existe en fait deux manières. Vous souhaiterez peut-être introduire un nouveau type d'objet qui sera utilisé dans les nouvelles fonctions du référentiel de fonctions. Et dans ce cas, vous pouvez toujours simplement écrire sa représentation symbolique et l'utiliser lors de la saisie ou de la sortie de fonctions dans un référentiel de fonctions.

Mais que se passe-t-il si vous souhaitez représenter un objet puis définir, via des fonctions existantes dans Wolfram Language, que vous souhaitez travailler avec lui ? Wolfram Language a toujours eu un mécanisme léger pour cela, appelé Valeurs élevées. Avec quelques restrictions (notamment pour les fonctions qui ne peut pas évaluer leurs arguments), un référentiel de fonctions permet de représenter simplement une fonction et de définir des valeurs pour celle-ci. (Augmenter les attentes en matière de cohérence lors de la création d'une nouvelle conception majeure entièrement intégrée dans Wolfram Language est généralement une procédure très importante qui ne peut pas être réalisée en augmentant simplement le coût du projet et est quelque chose que notre société fait dans le cadre de projets. pour le développement à long terme du langage, cette tâche n'est pas un objectif qui se fixe dans le cadre du développement du référentiel).

Alors, que peut contenir le code de fonction dans un référentiel de fonctions ? Tout est intégré à Wolfram Language, bien sûr (du moins si cela ne représente pas les menaces pour Sécurité et les performances du programme lui-même, en tant qu'environnement informatique) ainsi que toute fonction du référentiel de fonctions. Il existe cependant d'autres fonctionnalités : une fonction dans un référentiel de fonctions peut appeler une API, ou dans Nuage WolframOu d'une autre source. Bien entendu, cela comporte certains risques. En raison du fait qu'il n'y a aucune garantie que l'API ne changera pas et que la fonction du magasin de fonctions cessera de fonctionner. Pour aider à identifier des problèmes comme celui-ci, il y a une note sur la page de documentation (dans la section Exigences) pour toute fonctionnalité qui repose sur plus que la simple fonctionnalité intégrée de Wolfram Language. (Bien sûr, lorsqu'il s'agit de données réelles, même avec cette fonctionnalité, des problèmes peuvent survenir - car les données du monde réel changent constamment, et parfois même leurs définitions et leur structure changent.)

Tout le code du référentiel de fonctionnalités Wolfram doit-il être écrit en Wolfram ? Certes, le code à l'intérieur de l'API externe ne doit pas être écrit dans le langage Wolfram, qui ne crée même pas le code du langage. En fait, si vous trouvez une fonction dans presque n'importe quel langage ou bibliothèque externe, vous pouvez créer un wrapper qui vous permet de l'utiliser dans le référentiel de fonctions Wolfram. (Habituellement, vous devez utiliser les fonctions intégrées pour cela ExterneÉvaluer ou Fonction Externe dans le code de langue Wolfram.)

Alors, quel est l'intérêt de faire ça ? Essentiellement, cela vous permet d'utiliser l'intégralité du système Wolfram Language intégré et l'ensemble de son ensemble unifié de fonctionnalités logicielles. Si vous obtenez l'implémentation de base à partir d'une bibliothèque ou d'un langage externe, vous pouvez ensuite utiliser la riche structure symbolique de Wolfram Language pour créer une fonction de niveau supérieur pratique qui permet aux utilisateurs d'utiliser facilement n'importe quelle fonctionnalité déjà implémentée. À tout le moins, cela devrait être réalisable dans un monde idéal où tous les éléments de base du chargement des bibliothèques, etc. existent, auquel cas ils seraient gérés automatiquement par Wolfram Language. (Il convient de noter qu'en pratique, il peut y avoir des problèmes avec mise en place de langues externes système informatique spécifique et le stockage dans le cloud peuvent poser des problèmes de sécurité supplémentaires).

À propos, lorsque vous examinez pour la première fois les bibliothèques externes typiques, elles semblent souvent trop complexes pour être couvertes par quelques fonctions seulement, mais dans de nombreux cas, une grande partie de la complexité vient de la création de l'infrastructure nécessaire à la bibliothèque et à toutes les fonctions. soutenez-le. Cependant, lors de l'utilisation de Wolfram Language, l'infrastructure est généralement déjà intégrée aux packages, et il n'est donc pas nécessaire d'exposer toutes ces fonctions de support en détail, mais uniquement de créer des fonctions pour les fonctions spécifiques à l'application « les plus élevées » dans la bibliothèque. .

"Ecosystème" de la base de connaissances

Si vous avez écrit des fonctions que vous utilisez régulièrement, soumettez-les au Wolfram Function Repository ! Si quelque chose de plus n'en ressort pas (développement du langage), il vous sera même alors beaucoup plus pratique d'utiliser les fonctions pour un usage personnel. Cependant, il est logique de supposer que si vous utilisez les fonctions régulièrement, d'autres utilisateurs les trouveront peut-être également utiles.

Bien entendu, vous pouvez vous retrouver dans une situation dans laquelle vous ne pouvez pas - ou ne souhaitez pas - partager vos fonctions ou en cas d'accès à des ressources d'information privées. Même dans de tels cas, vous pouvez simplement déployer les fonctions dans votre propre compte cloud, spécifier les droits accès à eux. (Si votre organisation a Cloud privé Wolfram Enterprise, il sera alors bientôt en mesure d'héberger son propre référentiel de fonctionnalités privé, qui peut être administré depuis l'intérieur de votre organisation et définir s'il faut ou non forcer l'affichage des vues par des utilisateurs tiers.)

Les fonctions que vous soumettez au référentiel de fonctions Wolfram n'ont pas besoin d'être parfaites ; ils doivent juste être utiles. C'est un peu comme la section "Erreurs" de la documentation Unix classique - dans la "Section Définitions", il y a une section "Notes de l'auteur" où vous pouvez décrire les limitations, les problèmes, etc. que vous connaissez déjà sur votre fonction. De plus, lorsque vous soumettez votre fonctionnalité au référentiel, vous pouvez ajouter des notes de soumission qui seront lues par une équipe dédiée de conservateurs.

Une fois qu'une fonctionnalité est publiée, sa page comporte toujours deux liens en bas : "Envoyer un message sur cette fonctionnalité"Et"Discutez dans la communauté Wolfram" Si vous joignez une note (par exemple, parlez-moi des bugs), vous pouvez cocher la case indiquant que vous souhaitez que votre message et vos informations de contact soient partagées avec l'auteur de la fonctionnalité.

Parfois, vous souhaitez simplement utiliser les fonctions du référentiel de fonctions Wolfram, telles que les fonctions intégrées, sans regarder leur code. Cependant, si vous souhaitez jeter un œil à l’intérieur, il y a toujours un bouton Bloc-notes en haut. Cliquez dessus et vous obtiendrez votre propre copie du cahier de définition original qui a été soumis au référentiel de fonctionnalités. Parfois, vous pouvez simplement l'utiliser comme exemple pour vos besoins. En même temps, vous pouvez également développer votre propre modification de cette fonction. Vous souhaiterez peut-être publier ces fonctions que vous avez trouvées dans le référentiel sur votre ordinateur ou dans votre compte de stockage cloud sur les pucerons, peut-être souhaiterez-vous les soumettre à la base de connaissances des fonctions, peut-être en tant que version améliorée et étendue de la fonction d'origine.

À l'avenir, nous prévoyons de prendre en charge le forking de style Git pour les référentiels de fonctionnalités, mais pour l'instant, nous essayons de rester simples et nous n'avons toujours qu'une seule version acceptée de chaque fonctionnalité intégrée au langage. Le plus souvent (à moins que les développeurs ne renoncent à maintenir les fonctionnalités qu'ils ont développées et répondent aux soumissions des utilisateurs), l'auteur original de la fonctionnalité prend le contrôle des mises à jour et soumet de nouvelles versions, qui sont ensuite révisées et, si elles réussissent le processus de révision. , publié dans la langue.

Considérons la question de savoir comment fonctionne le « versioning » des fonctions développées. Actuellement, lorsque vous utilisez une fonction du référentiel de fonctions, sa définition sera stockée en permanence sur votre ordinateur (ou dans votre compte cloud si vous utilisez le cloud). Si une nouvelle version d'une fonctionnalité est disponible, la prochaine fois que vous l'utiliserez, vous recevrez un message vous en informant. Et si vous souhaitez mettre à jour la fonction vers une nouvelle version, vous pouvez le faire en utilisant la commande Mise à jour des ressources. (Le « blob de fonctions » stocke en fait davantage d'informations de version, et nous prévoyons de les rendre plus accessibles à nos utilisateurs à l'avenir.)

L'un des avantages du Wolfram Function Repository est que n'importe quel programme Wolfram Language, où qu'il soit, peut en utiliser les fonctions. Si un programme apparaît dans un bloc-notes, il est souvent pratique de formater les fonctions du référentiel sous forme de fonctions « objet binaire de fonction » faciles à lire (peut-être avec un jeu de versions approprié).

Vous pouvez toujours accéder à n'importe quelle fonction du référentiel de fonctions en utilisant du texte RessourceFonction[...]. Et c'est très pratique si vous écrivez du code ou des scripts directement pour Wolfram Engine, par exemple avec en utilisant un IDE ou un éditeur de code texte (Il faut surtout noter que le référentiel de fonctions est entièrement compatible avec Moteur Wolfram gratuit pour les développeurs).

Comment ça marche?

Dans les fonctions du référentiel Wolfram, cela est possible en utilisant exactement la même chose systèmes de ressources bases, comme dans tous nos autres référentiels existants (magasin de données, Référentiel de réseau neuronal, collection de projets de démonstration etc.), comme toutes les autres ressources du système Wolfram, RessourceFonction finalement basé sur la fonction ObjetRessource.

Considérer RessourceFonction:

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

À l'intérieur, vous pouvez voir certaines informations en utilisant la fonction Informations:

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Comment fonctionne la mise en place d’une fonction ressource ? Le plus simple est un cas purement local. Voici un exemple qui prend une fonction (dans ce cas, juste une fonction pure) et la définit comme une fonction de ressource pour une session de programme donnée :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Une fois la définition faite, vous pouvez utiliser la fonction ressource :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Notez qu'il y a une icône noire dans ce blob de fonction Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram. Cela signifie que la fonction BLOB fait référence à la fonction de ressource en mémoire définie pour la session en cours. Une fonctionnalité de ressource stockée en permanence sur votre ordinateur ou votre compte cloud comporte une icône grise. Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram. Et il y a une icône orange pour une fonctionnalité de ressource officielle dans le référentiel de fonctionnalités Wolfram. Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram.

Alors, que se passe-t-il lorsque vous utilisez le menu Développer dans le cahier de définition ? Premièrement, il prend toutes les définitions du bloc-notes et crée à partir d'elles un fichier symbolique. ObjetRessource). (Et si vous utilisez un IDE ou un programme basé sur du texte, vous pouvez également créer explicitement ObjetRessource)

Le déploiement local d'une fonction depuis un référentiel sur votre ordinateur s'effectue à l'aide de la commande Cache local pour un objet ressource pour l'enregistrer sous Objet Local sur votre système de fichiers. Le déploiement sur un compte cloud se fait à l'aide de la commande CloudDeploy pour un objet ressource, et un déploiement de cloud public est CloudPublish. Dans tous les cas Registre des ressources également utilisé pour enregistrer le nom de la fonction de ressource, donc RessourceFonction["nom"] va travailler.

Si vous cliquez sur le bouton Soumettre pour un référentiel de fonctions, que se passe-t-il en dessous ? RessourceSoumettre appelé sur un objet ressource. (Et si vous utilisez une interface de saisie de texte, vous pouvez également appeler RessourceSoumettre directement.)

Par défaut, les soumissions sont effectuées sous le nom associé à votre identifiant Wolfram. Mais si vous soumettez une candidature au nom d'une équipe ou d'une organisation de développement, vous pouvez définir un identifiant d'éditeur distinct et utilisez-le plutôt comme nom pour interagir avec vos vues.

Une fois que vous avez soumis l'une de vos fonctions à la base de connaissances des fonctions, elle sera mise en file d'attente pour examen. Si vous recevez des commentaires en réponse, ils se présenteront généralement sous la forme d'un fichier texte avec des « cellules de commentaires » supplémentaires ajoutées. Vous pouvez toujours vérifier le statut de votre candidature en visitant portail des membres du système de ressources. Mais une fois votre fonctionnalité approuvée, vous serez averti (par e-mail) et votre fonctionnalité sera publiée dans le référentiel de fonctionnalités Wolfram.

Quelques subtilités au travail

À première vue, il peut sembler que vous pouvez simplement prendre un cahier de définitions et le mettre textuellement dans un référentiel de fonctions. Cependant, de nombreuses subtilités sont en réalité impliquées - et leur gestion nécessite une méta-programmation assez complexe, ainsi qu'un traitement symbolique. comme le code qui définit la fonction, et le Bloc-notes lui-même est défini. La plupart de cela se produit en interne, dans les coulisses, mais cela peut avoir certaines implications qui méritent d'être comprises si vous souhaitez contribuer à la base de connaissances sur les fonctionnalités.

Première subtilité immédiate : Lorsque vous remplissez le Carnet de Définition, vous pouvez simplement faire référence à votre fonction partout en utilisant un nom comme MaFonction, qui ressemble à un nom normal pour une fonction dans Wolfram Language, mais pour la documentation du référentiel de fonctions, il est remplacé RessourceFonction["MaFonction"] est ce que les utilisateurs utiliseront réellement lorsqu’ils travailleront avec la fonction.

Deuxième subtilité : lorsque vous créez une fonction ressource à partir du Definition Notebook, toutes les dépendances impliquées dans la définition de la fonction doivent être capturées et explicitement incluses. Cependant, pour garantir que les définitions restent modulaires, vous devez tout mettre dans un format unique. espace de noms. (Bien sûr, des fonctions qui font tout, se trouvent dans le référentiel de fonctions.)

En règle générale, vous ne verrez jamais aucune trace du code utilisé pour configurer cet espace de noms. Mais si pour une raison quelconque vous appelez un symbole sous-exécuté à l'intérieur de votre fonction, alors vous verrez que ce symbole se trouve dans le contexte interne de la fonction. Cependant, lors du traitement du Bloc-notes de définition, au moins le symbole correspondant à la fonction elle-même est réglable pour un meilleur affichage comme un BLOB fonctionnel plutôt que comme un caractère brut dans le contexte interne.

Le référentiel de fonctions sert à définir de nouvelles fonctions. Et ces fonctions peuvent avoir des options. Souvent, ces paramètres (par exemple, Method ou Taille de l'image) pourra être utilisé pour les fonctions intégrées, ainsi que pour celles pour lesquelles des symboles intégrés existent déjà. Mais parfois, une nouvelle fonctionnalité peut nécessiter de nouvelles options. Afin de maintenir la modularité, ces paramètres doivent être des symboles définis dans un contexte interne unique (ou quelque chose comme des fonctions de ressources entières, c'est-à-dire elles-mêmes). Pour plus de simplicité, le référentiel de fonctions vous permet de définir de nouvelles options dans les définitions de chaînes. Et pour la commodité de l'utilisateur, ces définitions (en supposant qu'elles utilisent Valeur d'option и OptionsMotif) sont également traités de manière à ce que lors de l'utilisation de fonctions, les paramètres puissent être spécifiés non seulement sous forme de chaînes, mais également sous forme de symboles globaux portant les mêmes noms.

La plupart des fonctions font simplement ce qu'elles sont censées faire à chaque fois qu'elles sont appelées, mais certaines fonctions doivent être initialisées avant de pouvoir s'exécuter dans une session particulière - et pour résoudre ce problème, il existe une section "Initialisation" dans la section Définition.

Les fonctions d'un référentiel peuvent utiliser d'autres fonctions déjà présentes dans le référentiel ; afin de configurer des définitions pour un référentiel de fonctions qui incluent deux (ou plus) fonctions qui se référencent mutuellement, vous devez les déployer dans votre session de programme afin de pouvoir référence comme sur eux RessourceFonction["nom"], vous pouvez alors créer les combinaisons de ces fonctions dont vous avez besoin, des exemples (je n'ai pas compris) et ajouter une nouvelle fonction au référentiel basée sur celles déjà publiées précédemment. (ou déjà ou précédemment – ​​les deux mots sont maladroits)

Perspectives de développement. Que devrait-il se passer lorsque le référentiel devient vraiment volumineux ?

Aujourd'hui, nous lançons tout juste le Wolfram Feature Repository, mais avec le temps, nous nous attendons à ce que sa taille et ses fonctionnalités augmentent considérablement, et à mesure que son développement progresse, divers problèmes que nous prévoyons déjà pourraient survenir.

Le premier problème concerne les noms de fonctions et leur unicité. Le référentiel de fonctions est conçu de telle manière que, comme les fonctions intégrées dans Wolfram Language, vous pouvez référencer n'importe quelle fonction donnée simplement en spécifiant son nom. Mais cela signifie inévitablement que les noms de fonctions doivent être globalement uniques dans le référentiel, de sorte que, par exemple, il ne peut y en avoir qu'un seul. RessourceFonction["MaFonctionFavorite"].

Cela peut sembler un gros problème au début, mais il convient de réaliser qu'il s'agit fondamentalement du même problème que pour des choses comme les domaines Internet ou les identifiants de réseaux sociaux. Et le fait est que le système a simplement besoin d'un registraire - et c'est l'un des rôles que notre société jouera pour la base de connaissances des fonctions Wolfram. (Pour les versions privées d'un référentiel, leurs registraires peuvent être des administrateurs.) Bien entendu, un domaine Internet peut être enregistré sans rien contenir, mais dans un référentiel de fonctions, un nom de fonction ne peut être enregistré que s'il existe une véritable définition de la fonction.

Une partie de notre rôle dans la gestion de la base de connaissances des fonctions Wolfram consiste à garantir que le nom choisi pour une fonction est logique compte tenu de la définition de la fonction et qu'il respecte les conventions de dénomination de Wolfram Language. Nous avons plus de 30 ans d'expérience dans la dénomination de fonctions intégrées dans Wolfram Language, et notre équipe de conservateurs apportera également cette expérience au référentiel de fonctions. Bien sûr, il y a toujours des exceptions. Par exemple, il peut sembler préférable d'avoir un nom court pour certaines fonctions, mais il est préférable de « défendre » avec un nom plus long et plus précis, car vous risquez moins de rencontrer quelqu'un qui voudrait donner un nom de fonction similaire à l'avenir. .

(Il convient de noter ici que le simple fait d'ajouter une balise membre pour lever l'ambiguïté des fonctions n'aura pas l'effet escompté. Parce qu'à moins que vous n'insistiez pour toujours attribuer une balise, vous devrez définir une balise par défaut pour une fonction donnée, et également attribuer des balises d'auteur. , ce qui nécessiterait encore une fois une coordination mondiale.)

À mesure que la base de connaissances des fonctions Wolfram s'agrandit, l'un des problèmes qui se posera probablement est la possibilité de découvrir les fonctions pour lesquelles le système fournit fonction de recherche (et les fichiers de définition peuvent inclure des mots-clés, etc.). Pour les fonctions intégrées dans Wolfram Language, il existe toutes sortes de références croisées dans la documentation pour aider à « annoncer » les fonctions. Les fonctions d'un référentiel de fonctions peuvent faire référence à des fonctions intégrées. Mais qu’en est-il de l’inverse ? Pour ce faire, nous allons expérimenter différentes conceptions pour exposer les fonctions du référentiel dans les pages de documentation des fonctions intégrées.

Pour les fonctions intégrées dans Wolfram Language, il existe une couche de détection fournie par réseau de "pages d'aide", qui fournissent des listes organisées de fonctionnalités liées à des domaines spécifiques. Il est toujours difficile d'équilibrer correctement les pages de manuel, et à mesure que le langage Wolfram se développe, les pages de manuel doivent souvent être complètement réorganisées. Il est assez facile de regrouper les fonctions d'un référentiel en grandes catégories, et même de diviser ces catégories de manière cohérente, mais il est bien plus précieux d'avoir des pages de référence linguistiques correctement organisées. La meilleure façon de les créer pour l’ensemble de la base de connaissances fonctionnelles n’est pas encore claire. Par exemple, CreateResourceObjectGallery dans le référentiel de fonctionnalités, n'importe qui peut publier une page Web contenant ses « choix » à partir du référentiel :

Wolfram Function Repository : plateforme d'accès ouvert aux extensions du langage Wolfram

Le référentiel de fonctions Wolfram est configuré comme un référentiel de fonctions persistant, dans lequel toutes les fonctions qu'il contient fonctionneront toujours. Bien entendu, de nouvelles versions de fonctionnalités peuvent être disponibles, et nous nous attendons bien sûr à ce que certaines fonctionnalités deviennent obsolètes avec le temps. Les fonctions fonctionneront si elles sont utilisées dans des programmes, mais leurs pages de documentation seront liées à de nouvelles fonctions plus avancées.

Le référentiel de fonctionnalités Wolfram est conçu pour vous aider à découvrir rapidement de nouvelles fonctionnalités et à apprendre de nouvelles façons d'utiliser le langage Wolfram. Nous sommes très optimistes sur le fait qu'une partie de ce qui a été exploré dans le référentiel de fonctionnalités aura finalement du sens et deviendra une partie intégrée du noyau de Wolfram Language. Au cours de la dernière décennie, nous avons eu un ensemble similaire fonctionnalités initialement introduites dans Wolfram | Alpha. Et l’une des leçons tirées de cette expérience est qu’atteindre les normes de qualité et de cohérence sur lesquelles nous nous concentrons dans tout ce qui est intégré au langage Wolfram nécessite beaucoup de travail, qui est souvent plus difficile que l’effort initial de mise en œuvre de l’idée. Néanmoins, une fonction de la base de connaissances des fonctions peut servir de preuve de concept très utile pour une future fonction qui pourrait éventuellement être intégrée au langage Wolfram.

La chose la plus importante ici est qu'une fonction dans un référentiel de fonctions est quelque chose qui est disponible pour chaque utilisateur dès maintenant. Il est possible qu'une fonctionnalité en langage natif soit bien meilleure et plus performante, mais un référentiel de fonctionnalités permettrait aux utilisateurs d'avoir immédiatement accès à toutes les nouvelles fonctionnalités. Et surtout, ce concept permet à chacun d’ajouter les nouvelles fonctionnalités qu’il souhaite.

Plus tôt dans l'histoire du langage Wolfram, cette idée n'aurait pas fonctionné aussi bien qu'elle l'a fait, mais à ce stade, il y a tellement d'efforts investis dans le langage, et une compréhension si profonde des principes de conception du langage, qu'il semble maintenant très Il est possible pour une large communauté d'utilisateurs d'ajouter des fonctionnalités qui maintiendront la cohérence de la conception afin de les rendre utiles à un large éventail d'utilisateurs.

Il existe un incroyable esprit de talent (?) dans la communauté des utilisateurs de Wolfram Language. (Bien sûr, cette communauté comprend de nombreuses personnes de premier plan en R&D dans divers domaines.) J'espère que le Wolfram Feature Repository fournira une plate-forme efficace pour libérer et diffuser cet esprit de talent. Ce n'est qu'ensemble que nous pourrons créer quelque chose qui élargira considérablement le domaine dans lequel le paradigme informatique du langage Wolfram peut être appliqué.

En plus de 30 ans, nous avons parcouru un long chemin avec le langage Wolfram. Désormais, ensemble, allons encore plus loin. J'encourage fortement tous les utilisateurs respectés du langage Wolfram dans le monde à utiliser le référentiel fonctionnel comme plate-forme pour cela, ainsi que le nouveau projet logiciel tel que Free Wolfram Engine for Developers.

Source: habr.com

Ajouter un commentaire