Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Bonjour, Habr ! Je vous présente la traduction de l'article de Stephen Wolfram « Le Référentiel de Fonctions Wolfram : Lancement d'une Plateforme Ouverte pour Étendre le Langage Wolfram ».

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Les prémisses de la richesse du langage Wolfram

Aujourd'hui, nous sommes au seuil de grandes réalisations avec le langage de programmation Wolfram Language. Il y a à peine trois semaines, nous avons lancé un moteur Wolfram gratuit pour les développeurs, afin d'aider nos utilisateurs à intégrer le langage Wolfram Language dans leurs projets logiciels à grande échelle. Aujourd'hui, nous lançons le référentiel de fonctions Wolfram, pour fournir une plateforme coordonnée pour les fonctions conçues pour étendre le langage Wolfram, et nous ouvrons également le référentiel de fonctions à tous ceux qui peuvent contribuer au développement de notre produit logiciel.

Le référentiel de fonctions (Function Repository) Wolfram est rendu possible grâce aux spécificités uniques du Wolfram Language, non seulement en tant que langage de programmation, mais aussi en tant que langage de calcul complet. Dans les langages de programmation traditionnels, l'ajout de nouvelles fonctionnalités significatives implique généralement la création de bibliothèques supplémentaires entières, qui peuvent fonctionner ou non ensemble. Cependant, dans le Wolfram Language , tant de fonctionnalités sont déjà intégrées directement dans le langage, qu'il est possible d'élargir considérablement sa fonctionnalité simplement en ajoutant de nouvelles fonctions qui s'intègrent immédiatement dans la structure globale du langage.

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

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Tout comme plus de 6000 fonctions standard, intégrées dans le langage Wolfram, chaque fonction du référentiel a une page de documentation avec des descriptions détaillées et des exemples d'utilisation :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Pour accéder à la page, copiez l'objet ci-dessus (BLOB fonctionnel), collez-le dans la ligne d'entrée et lancez ensuite la fonction – elle est déjà intégrée dans le langage Wolfram et prise en charge par défaut, à partir de la version 12.0:

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Il convient de noter qu'en ce qui concerne le traitement LogoQRCode , vous n'avez pas besoin, par exemple, de configurer une « bibliothèque de traitement d'images » — car dans le langage Wolfram Language, nous avons déjà mis en place un moyen séquentiel et soigneusement algorithmique de traitement d'images, qui peuvent être rapidement traitées par diverses fonctions graphiques du langage :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

J'espère qu'avec le soutien de la merveilleuse et talentueuse communauté, qui croît et s'élargit (sur la base du langage Wolfram) depuis plusieurs décennies. Le dépôt de fonctions Wolfram permettra dans un avenir proche d'élargir considérablement la gamme de (potentiellement significatives, spécialisées dans divers domaines des sciences et techniques) fonctions disponibles dans le langage. Cela crée la possibilité d'utiliser à la fois le contenu du langage (ses fonctions intégrées) et les principes de développement, qui sont réalisés sur la base du langage. (Il convient de noter ici que le langage Wolfram a déjà plus de 30 ans d'histoire de développement et de croissance stable.).
À l'intérieur des fonctions du dépôt, il peut y avoir de petits ou de suffisamment grands extraits de code écrits en langage Wolfram. Par exemple, cela peut être des appels à des API et services externes ou des bibliothèques externes dans d'autres langages.. Une caractéristique unique de cette approche est que, lorsque vous accédez à la fonctionnalité au niveau de l'utilisateur, il n'y aura pas d'incohérences possibles car cette approche est basée sur une structure cohérente du langage Wolfram — et chaque fonction fonctionnera automatiquement correctement — exactement comme elle le doit.
L'interface et la structure logicielle du dépôt de fonctions Wolfram sont conçues de manière à ce que chacun puisse contribuer à l'effort commun de manière simple et pratique — en gros, en remplissant simplement un fichier texte de bloc-notes (avec l'extension nb) WL.. Les fonctions automatiques intégrées permettent de vérifier les nouvelles fonctions ajoutées au dépôt pour garantir leur intégration dans le langage. Notre entreprise vise un large éventail d'utilisateurs qui peuvent intégrer leurs fonctions dans le langage, et non la complexité des nouvelles fonctions — et bien que nous ayons un processus de vérification en place, nous ne faisons pas pression pour quelque chose comme une analyse minutieuse de la structure ou des normes rigoureuses de complétude et de fiabilité pour les nouvelles fonctions des utilisateurs, contrairement aux vérifications plus strictes des fonctions intégrées au noyau du langage que nous appliquons.

Dans cette approche, il existe de nombreux compromis et détails, mais notre objectif est d'optimiser le répertoire des fonctions Wolfram tant pour le confort des utilisateurs que pour que les nouvelles fonctions apportent une contribution significative à l'évolution du langage. À mesure que nous grandissons, je ne doute pas que nous devrons inventer de nouvelles méthodes de traitement et de validation des fonctions intégrées dans le répertoire, et ce n'est pas le moindre des aspects que d'organiser un grand nombre de fonctions et de rechercher celles dont les utilisateurs ont besoin. Cependant, il est encourageant de constater que le chemin que nous avons choisi est un bon début. J'ai personnellement ajouté plusieurs fonctions à la base initiale. Beaucoup d'entre elles sont basées sur du code que j'ai personnellement développé pendant un temps assez long. Il m'a fallu seulement quelques minutes pour les transférer dans le répertoire. Maintenant qu'elles sont dans le répertoire, je peux enfin – immédiatement et à tout moment – utiliser ces fonctions selon mes besoins, sans me soucier de la recherche de fichiers, du téléchargement de paquets, etc.

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

Bien avant l'émergence d'Internet, il existait des moyens d'échanger du code Wolfram Language (notre premier grand projet centralisé était MathSource, créé pour Mathematica en 1991 sur CD-ROM, etc.). Il est certain que l'approche proposée à travers le répertoire des fonctions Wolfram est un moyen plus puissant et fiable de réaliser les tâches susmentionnées.

Depuis plus de 30 ans, notre entreprise travaille dur pour maintenir l'intégrité de la structure du langage Wolfram, et cela est très important pour que le langage Wolfram devienne non seulement un langage de programmation, mais aussi un véritable langage de calcul. Ainsi, l'essence de l'approche de mise en œuvre du répertoire des fonctions Wolfram consiste à utiliser une approche unifiée pour la programmation et le développement de nouvelles fonctions qui sont ajoutées de manière cohérente et intégrées dans le cadre du langage pour permettre son évolution et sa coévolution.

Dans la structure d'implémentation de chaque fonction, divers processus de calcul se produisent. Il convient de noter qu'il est nécessaire que, pour l'utilisateur, la fonction ait un aspect clair et uniforme ainsi qu'une lisibilité évidente. Dans ce contexte, les fonctions intégrées du langage Wolfram Language sont présentées avec plus de 6000 exemples consécutifs de la manière correcte de programmer des fonctions (c'est notre vidéos en direct sur la programmation, qui incluent des centaines d'heures de création de programmes types). Cette approche permet finalement de rendre le dépôt de fonctions Wolfram capable de bien fonctionner, grâce à la nature structurée du langage Wolfram Language avec son grand nombre de bibliothèques supplémentaires et variées, qui sont déjà intégrées au langage. Par exemple, si vous avez une fonction traitant des images ou des tableaux clairsemés, ou structures moléculaires, ainsi que données géographiques ou d'autres — le langage possède déjà leur représentation symbolique cohérente, et grâce à cela, votre fonction devient immédiatement compatible avec d'autres fonctions du langage.

Créer un dépôt qui fonctionne réellement bien est un défi intéressant de méta-programmation. Par exemple, un excès de contraintes dans un programme pourrait empêcher l'unification et la polyvalence nécessaires au bon fonctionnement d'un algorithme. Tout comme un nombre insuffisant de contraintes fonctionnelles pourrait rendre difficile la mise en œuvre d'une séquence d'exécution suffisamment correcte de l'algorithme. Quelques exemples précédents de mise en œuvre de compromis dans ces approches, réalisés par notre entreprise, ont été assez stables — il s'agit de : Le projet Wolfram Demonstrations, lancé en 2007 et fonctionnant désormais en mode interactif sur Internet, contenant plus de 12000 démonstrations interactives utilisateur. Dans la base de données Wolfram , il existe plus de 600 bases de données prêtes à l'emploi qui peuvent être utilisées dans le langage Wolfram Language, et le dépôt de réseaux neuronaux Wolfram est alimenté par de nouveaux réseaux neuronaux presque chaque semaine (ils sont actuellement 118) et ils sont immédiatement intégrés via la fonction NetModel dans le langage Wolfram Language.

Tous les exemples mentionnés ci-dessus ont une caractéristique fondamentale : les objets et fonctions collectés dans le projet sont très hautement structurés et les processus sont répartis. Bien sûr, les détails de la structure, qu'il s'agisse d'une démonstration, d'un réseau de neurones ou autre, peuvent varier considérablement, mais la structure fondamentale de tout dépôt actuel reste toujours inchangée. Quelle est donc votre opinion, cher utilisateur, sur la création d'un tel dépôt ajoutant des extensions au langage Wolfram ? Le langage Wolfram Language est conçu pour être extrêmement flexible, permettant d'être étendu et modifié de nombreuses manières. Cette flexibilité est cruciale pour la création rapide de divers projets de grande envergure en langage Wolfram Language. Il est à noter qu'avec l'augmentation de la flexibilité du langage, le coût des projets réalisés avec celui-ci augmentera inévitablement. Cela est dû au fait que plus un utilisateur utilise ce langage, plus il bénéficie de fonctionnalités spécifiques, mais il ne faut pas oublier que cette approche peut également présenter des aspects négatifs en ce qui concerne l'impossibilité d'assurer la cohérence séquentielle des modules logiciels.

Dans les langages de programmation traditionnels, un problème courant avec les bibliothèques existe : par exemple, si vous utilisez une bibliothèque, le code fonctionne correctement, mais si vous essayez d'en utiliser plusieurs, il n'y a aucune garantie qu'elles interagiront correctement entre elles. En outre, dans les langages de programmation traditionnels – contrairement à un véritable langage de calcul – il n'existe pas de moyens de garantir des représentations intégrées cohérentes pour certaines fonctions ou types de données, à part leurs structures de base. Mais, en substance, le problème est encore plus important qu'il n'y paraît : si quelqu'un construit une verticalité fonctionnelle à grande échelle, sans des investissements énormes dans la programmation centralisée du projet, comme nous l'avons fait avec le langage Wolfram, il est impossible d'atteindre une cohérence. Il est donc essentiel que tous les modules logiciels fonctionnent toujours correctement ensemble.

Ainsi, l'idée du dépôt de fonctions Wolfram est d'éviter le problème mentionné précédemment en ajoutant simplement des extensions au langage sous la forme d'éléments de code relativement petits par le biais de fonctions distinctes, dont le développement en modules cohérents est une tâche plus simple. Cependant, il existe des spécificités de programmation qui ne peuvent pas être rendues confortables par le biais de fonctions distinctes (et notre entreprise prévoit de publier prochainement un algorithme logiciel optimisé pour aider à mettre en œuvre des paquets logiciels à grande échelle). Néanmoins, sur la base des fonctions déjà intégrées au langage Wolfram Language, il existe de nombreuses possibilités de programmation qui s'appuient sur des fonctions distinctes. L'idée ici est qu'avec relativement peu d'efforts de programmation, on puisse créer une série de nouvelles fonctions très utiles, qui assureront une cohérence suffisante du projet, tout en étant bien coordonnées entre elles et, en outre, elles pourront être facilement et largement utilisées dans le langage à l'avenir.

Cette approche est certainement un compromis. Si un paquet plus vaste est mis en œuvre, on peut imaginer un tout nouveau monde de fonctionnalités qui serait extrêmement puissant et utile. Si vous avez besoin d'éventuelles nouvelles fonctionnalités qui s'intègrent dans tout le reste, mais que vous n'êtes pas prêt à consacrer d'énormes efforts au développement du projet, cela peut malheureusement conduire à une réduction de l'échelle de votre projet. L'idée du dépôt de fonctions Wolfram est d'assurer les fonctionnalités définissant une partie du projet, cette approche permettra d'ajouter une puissance fonctionnelle tout en simplifiant le maintien d'une bonne cohérence du projet de programmation.

Assistance pour l'ajout de fonctions personnalisées au dépôt de fonctions

Les spécialistes de notre entreprise ont travaillé dur pour rendre leur contribution aux fonctions du dépôt Wolfram suffisamment facile pour les utilisateurs. Sur le bureau (déjà dans la version 12.0), Vous pouvez simplement naviguer successivement dans les onglets du menu principal : Fichier > Nouveau > Élément de Répertoire > Élément de Répertoire de Fonction et vous obtiendrez «Carnet de Définition» (programmé à l'intérieur de l'environnement de travail. Vous pouvez également utiliser la fonction analogue — CreateNotebook[«FunctionResource»]):

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Il existe deux actions principales que vous devrez effectuer : tout d'abord, coder effectivement votre fonction et, deuxièmement, rédiger la documentation qui illustre comment votre fonction doit fonctionner.
Cliquez sur le bouton «Ouvrir un exemple» en haut pour voir un exemple de ce que vous devez faire :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

En fait, vous essayez de créer quelque chose de similaire à une fonction intégrée dans le langage Wolfram. Sauf qu'elle peut faire quelque chose de beaucoup plus spécifique que la fonction intégrée. En même temps, les attentes concernant sa complétude et sa fiabilité seront beaucoup plus faibles.
Vous devez donner un nom à votre fonction qui respecte les principes de nommage des fonctions du langage Wolfram. En outre, vous devrez développer la documentation pour votre fonction, à l'instar des fonctions intégrées du langage. Je vous en parlerai plus en détail plus tard. Pour l'instant, faites juste attention à ce que dans la rangée de boutons en haut du fichier de carnet de définitions, il y a un bouton «Recommandations de Style», qui explique ce qu'il faut 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 prêt, cliquez sur le bouton «Vérifier». Il est tout à fait normal que vous ne soyez pas encore familiarisé avec tous les détails. Ainsi, la fonction «Vérifier» sera exécutée automatiquement et effectuera de nombreuses vérifications de style et de cohérence. Souvent, elle vous proposera immédiatement de confirmer et d'accepter des corrections (par exemple : «Cette ligne doit se terminer par un deux-points», et elle proposera d'ajouter le 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épertoire des fonctions respecte autant que possible un maximum de recommandations de style.

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Ainsi, après avoir lancé « Check », vous pouvez utiliser « Preview ». « Preview » 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 enregistré sur votre ordinateur ou pour un fichier se trouvant dans le stockage cloud. Si, pour une raison quelconque, vous n'êtes pas satisfait de ce que vous voyez dans l'aperçu, il vous suffit de revenir en arrière et d'apporter les corrections nécessaires, puis de cliquer à nouveau sur le bouton Preview.
Vous êtes maintenant prêt à déployer votre fonction dans le référentiel. Le bouton Deploy vous offre quatre options d'action :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

À cette étape, il est important de noter que vous pouvez soumettre votre fonction au référentiel de fonctions Wolfram, afin qu'elle soit accessible à tout utilisateur. Vous pouvez également déployer votre fonction pour un nombre limité d'utilisateurs. Par exemple, vous pouvez créer une fonction hébergée localement sur votre ordinateur, de manière à ce qu'elle soit accessible lorsque vous utilisez cet ordinateur spécifique. Ou vous pouvez la déployer dans votre compte cloud, afin qu'elle soit accessible lorsque vous êtes connecté au cloud. Vous pouvez également déployer votre fonction de manière publique via votre compte cloud. Elle ne sera pas dans le référentiel central des fonctions Wolfram, mais vous pourrez donner à quelqu'un l'URL qui lui permettra d'accéder à votre fonction depuis votre compte. (À l'avenir, nous prendrons également en charge des référentiels centraux à l'échelle de 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 » dans le référentiel. Que se passe-t-il alors à ce moment-là ? Votre demande est immédiatement mise en attente pour examen et approbation par notre équipe spéciale de curateurs.

Au fur et à mesure que votre demande passe par le processus d'approbation (qui prend généralement quelques jours), vous recevrez des informations sur l'état de son examen, ainsi que, éventuellement, des suggestions pour son utilisation future. Mais dès que votre fonctionnalité est approuvée, elle sera immédiatement publiée dans le dépôt des fonctions Wolfram et sera disponible pour toute utilisation. (Et cela sera affiché dans les bulletins d'information des nouvelles fonctionnalités etc.)

Que doit contenir le dépôt ?

Il convient de noter que notre entreprise a des normes très élevées en matière de complétude, de fiabilité et de qualité générale, parmi plus de 6000 fonctionnalités que nous avons intégrées dans le langage Wolfram au cours des 30 dernières années, toutes respectent ces exigences. L'objectif du dépôt des fonctions Wolfram est d'exploiter toute la structure et les fonctionnalités qui existent déjà dans le langage Wolfram Language, afin d'ajouter le plus possible de fonctionnalités beaucoup plus légères (c'est-à-dire des fonctions avec une performance supérieure).

Certainement, les fonctions dans le dépôt des fonctions Wolfram doivent respecter les principes de développement du langage Wolfram Language — afin qu'elles puissent interagir pleinement avec d'autres fonctions et avec les attentes des utilisateurs concernant le bon fonctionnement des fonctions. Cependant, cela ne veut pas dire que les fonctions doivent avoir la même complétude ou fiabilité.

Dans les fonctions intégrées du langage Wolfram, nous nous efforçons de rendre les fonctions logicielles aussi générales que possible. Cela dit, il n'y a rien de mal à ce qu'une fonction très spécifique, mais utile, soit ajoutée au dépôt des fonctions Wolfram. Par exemple, la fonction SendMailFromNotebook peut recevoir des fichiers dans un format spécifique et créer des courriels d'une certaine manière. PolygonalDiagram crée des diagrammes uniquement avec certaines couleurs et étiquetages, etc.

Un autre aspect lié aux fonctions intégrées est que notre entreprise s'efforce de traiter tous les cas atypiques, de gérer correctement les entrées incorrectes, etc. Dans le référentiel de fonctions, il est tout à fait normal qu'il existe une fonction spéciale qui traite les cas principaux de la tâche à résoudre et ignore tous les autres.

Il est évident qu'il est préférable d'avoir des fonctions qui font plus et le font mieux, mais l'optimisation pour le référentiel de fonctions - contrairement aux fonctions intégrées du langage Wolfram - doit comporter davantage de fonctions, enchaînées avec davantage de fonctionnalités, plutôt que de s'enfoncer dans les processus de mise en œuvre de chaque fonction spécifique.

Examinons maintenant un exemple de test des fonctions dans le référentiel. Les attentes concernant la cohérence de telles fonctions sont naturellement bien inférieures à celles des fonctions intégrées du langage. Cela est d'autant plus vrai lorsque les fonctions dépendent de ressources externes, comme les API, il est donc crucial de réaliser constamment des tests cohérents, ce qui se produit automatiquement au sein des algorithmes de vérification. Dans le fichier nb, vous pouvez explicitement définir les définitions (dans la section « Informations supplémentaires ») et définir autant de tests que vous jugez nécessaires, que ce soit par des chaînes d'entrée et de sortie ou des objets symboliques complets de type VerificationTest, autant que vous le jugerez nécessaire. De plus, le système tente constamment de transformer vos exemples de documentation en un processus de vérification (ce qui peut parfois être très 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 fin de compte, il y aura toute une série de complexités dans la mise en œuvre du référentiel de fonctions. Certaines seront simplement une ligne de code, d'autres peuvent comporter des milliers ou des dizaines de milliers de lignes, probablement en utilisant de nombreuses fonctions auxiliaires. Dans quels cas devrait-on ajouter une fonction qui nécessite très peu de code pour sa détermination ? En principe, si la fonction a un nom mnémotechnique approprié, que les utilisateurs comprendraient rapidement en voyant cela dans une partie du code, alors elle peut déjà être ajoutée. Sinon, il est probablement préférable de réécrire le code chaque fois que vous devez l'utiliser.

L'objectif principal du dépôt de fonctions (comme l'indique son nom) est d'introduire de nouvelles fonctions dans les fonctionnalités du langage. Si vous souhaitez ajouter de nouvelles données ou nouvelles entités, utilisez dépôt de données Wolfram. Mais que faire si vous souhaitez introduire de nouveaux types d'objets pour vos calculs ?

En réalité, il existe deux voies. Vous voudrez peut-être introduire un nouveau type d'objet qui sera utilisé dans de nouvelles fonctions dans le dépôt de fonctions. Dans ce cas, vous pouvez toujours simplement enregistrer sa représentation symbolique et l'utiliser lors de l'entrée ou de la sortie de fonctions dans le dépôt de fonctions.

Mais que faire si vous souhaitez représenter un objet, puis définir, via les fonctions existantes du langage Wolfram Language, celles qui devraient fonctionner avec lui ? Pour cela, le Wolfram Language a toujours eu un mécanisme simple appelé UpValues. Avec certaines limitations (surtout pour les fonctions qui ne peuvent pas évaluer leurs arguments), le dépôt de fonctions vous permet simplement de représenter une fonction et de définir des valeurs pour celle-ci. (Pour renforcer les attentes de cohérence lors de la création d'une nouvelle construction importante, complètement intégrée partout dans le langage Wolfram Language, - c'est généralement une procédure très importante qui ne peut être atteinte uniquement par une augmentation des coûts du projet et c'est ce que notre entreprise fait dans le cadre de projets de développement à long terme du langage, cette tâche n'est pas un objectif fixé dans le cadre de l'évolution du dépôt).

Alors, que peut contenir le code des fonctions dans le dépôt de fonctions ? Tout ce qui est intégré dans le langage Wolfram Language, bien sûr (du moins si ce n'est pas une menace pour la sécurité et pour le bon fonctionnement du programme lui-même, en tant qu'environnement de calcul), tout comme n'importe quelle fonction du dépôt de fonctions. À ce sujet, il existe également d'autres possibilités de fonctionnement : une fonction dans le dépôt de fonctions peut appeler une API, soit dans le Wolfram Cloud, ou bien d'une autre source.. Bien sûr, il existe certains risques associés à cela. En raison de l'absence de garanties que l'API ne changera pas, la fonction dans le dépôt de fonctions pourrait cesser de fonctionner. Pour identifier de tels problèmes, une remarque figure sur la page de documentation (dans la section « Exigences ») pour toute fonction qui repose non seulement sur la fonctionnalité intégrée du Wolfram Language. (En effet, lorsqu'il s'agit de données réelles, il peut y avoir des problèmes même avec cette fonctionnalité, car les données réelles sur le monde changent constamment, et parfois même leurs définitions et structures sont modifiées.)

Tout le code pour le dépôt de fonctions Wolfram doit-il être écrit en Wolfram Language ? Définitivement, le code dans une API externe ne doit pas être écrit en Wolfram Language, ce qui ne le qualifie même pas comme code Wolfram. En réalité, si vous trouvez une fonction dans presque n'importe quel langage externe ou bibliothèque, vous serez en mesure de créer une interface qui permettra de l'utiliser dans le dépôt de fonctions Wolfram. (Généralement, il convient d'utiliser des fonctions intégrées dans le code du Wolfram Language.) ExternalEvaluate ou ExternalFunction .

Quel est donc l'intérêt de faire cela ? En gros, cela permet d'utiliser l'ensemble du système intégré du Wolfram Language et son ensemble unifié de capacités logicielles. Dans le cas où vous obtenez une implémentation de base à partir d'une bibliothèque ou d'un langage externe, vous pouvez ensuite utiliser la puissante structure symbolique du Wolfram Language pour créer une fonction de haut niveau qui permet aux utilisateurs d'exploiter facilement toute fonctionnalité déjà implémentée. Du moins, cela devrait être réalisable dans un monde idéal où tous les composants des bibliothèques de chargement, etc., sont disponibles, et dans ce cas, ils seront automatiquement résolus avec le Wolfram Language. (Il convient de noter qu'en pratique, des problèmes peuvent survenir avec la configuration des langages externes dans un système informatique spécifique, et des problèmes supplémentaires de sécurité peuvent apparaître dans le stockage cloud).

En fait, lorsque vous analysez pour la première fois des bibliothèques externes standard, elles semblent souvent trop complexes pour être couvertes par quelques fonctions. Cependant, dans de nombreux cas, la majeure partie de cette complexité provient de l'infrastructure nécessaire à la bibliothèque et de toutes les fonctions qui la soutiennent. Cependant, en utilisant le langage Wolfram, l'infrastructure est généralement déjà intégrée dans les paquets, ce qui signifie qu'il n'est pas nécessaire de dévoiler en détail toutes ces fonctions de soutien, mais simplement de créer des fonctions pour quelques « fonctions supérieures » orientées vers l'application dans la bibliothèque.

L'« Écosystème » de la base de connaissances

Si vous avez écrit des fonctions que vous utilisez constamment, envoyez-les dans le dépôt de fonctions Wolfram ! Même si cela ne conduit pas à quelque chose de plus grand (évolution du langage), il vous sera beaucoup plus pratique d'utiliser ces fonctions pour un usage personnel. Il est logique de supposer que si vous utilisez ces fonctions en permanence, d'autres utilisateurs les trouveront également utiles.

Il est évident que vous pouvez vous retrouver dans une situation où vous ne pouvez pas — ou ne voulez 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 vos fonctions dans votre propre compte cloud, en précisant les droits d'accès. (Si votre organisation dispose d'un cloud privé Wolfram Enterprise, il pourra bientôt héberger son propre dépôt privé de fonctions, qui pourra être administré depuis votre organisation et définir si les vues doivent être visibles ou non pour les utilisateurs externes.)

Les fonctions que vous envoyez dans le dépôt de fonctions Wolfram n'ont pas besoin d'être parfaites ; elles doivent simplement être utiles. Cela ressemble un peu à la section « Erreurs » dans la documentation classique de Unix — dans la « section des définitions », il y a une section « Remarques 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 envoyez votre fonction dans le dépôt, vous pouvez ajouter des notes à l'envoi, qui seront lues par une équipe de commissaires.

Après la publication de la fonction, sa page a toujours deux liens en bas : «Envoyer un message sur cette fonctionnalité» et «Discuter dans la communauté Wolfram». Si vous joignez une note (par exemple pour signaler des erreurs), vous pouvez cocher une case pour indiquer que vous souhaitez que votre message et vos coordonnées soient transmis à l'auteur de la fonction.

Il arrive parfois que vous souhaitiez simplement utiliser des fonctions du référentiel de fonctions Wolfram, par exemple des fonctions intégrées, sans plonger dans leur code. Cependant, si vous souhaitez "regarder à l'intérieur", il y a toujours un bouton "Carnet" en haut. Cliquez dessus et vous obtiendrez votre propre copie du carnet d'origine qui a été envoyé au référentiel de fonctions. Parfois, vous pouvez simplement l'utiliser comme exemple pour vos besoins. Dans ce cas, vous pouvez également développer votre propre version modifiée de cette fonction. Peut-être que vous voudrez mettre ces fonctions que vous avez trouvées dans le référentiel sur votre ordinateur ou dans votre compte de stockage cloud, ou peut-être que vous voudrez les envoyer à la base de connaissances des fonctions, possiblement en tant que version améliorée ou enrichie de la fonction d'origine.

Dans le futur, nous prévoyons de supporter le branching à la manière de Git pour les référentiels de fonctions, mais pour le moment, nous essayons de simplifier cela et avons toujours une version standard de chaque fonction intégrée dans le langage. Le plus souvent (si les développeurs ne cessent pas de maintenir les fonctions qu'ils ont développées et répondent aux messages des utilisateurs), l'auteur d'origine de la fonction obtient le contrôle des mises à jour et envoie de nouvelles versions qui sont ensuite examinées et, si elles passent le processus de vérification, publiées dans le langage.

Considérons comment fonctionne la "versionabilité" des fonctions développées. En ce moment, lorsque vous utilisez une fonction du référentiel de fonctions, sa définition sera constamment stockée sur votre ordinateur (ou dans votre compte cloud si vous utilisez le cloud). Si une nouvelle version de la fonction apparaît, vous recevrez un message vous avertissant lors de sa prochaine utilisation. Et si vous souhaitez mettre à jour la fonction vers une nouvelle version, vous pouvez le faire avec la commande ResourceUpdate(L'objet BLOB fonctionnel contient en réalité plus d'informations sur les versions, et à l'avenir, nous prévoyons de le rendre plus accessible à nos utilisateurs.)

Une des fonctionnalités remarquables du dépôt de fonctions Wolfram est que n'importe quel programme Wolfram Language peut utiliser ses fonctions, peu importe où il se trouve. Lorsque le programme apparaît dans un notebook, il est souvent pratique de formater les fonctions du dépôt sous forme de «blobs fonctionnels» faciles à lire (éventuellement avec un ensemble de versions adéquates).

Vous pouvez toujours accéder à n'importe quelle fonction du dépôt de fonctions via le texte ResourceFunction […]. Ce qui est très pratique si vous écrivez du code ou des scripts directement pour Wolfram Engine, par exemple, avec l'aide d'un IDE ou d'un éditeur de code (il convient de préciser que le dépôt de fonctions est entièrement compatible avec Free Wolfram Engine pour les développeurs).

Comment cela fonctionne ?

À l'intérieur des fonctions du dépôt Wolfram, cela est possible en utilisant exactement le même système de ressources que dans tous nos autres dépôts existants (dépôts de données, Neural Net Repository, collection de projets de démonstration etc.), tout comme tous les autres ressources système Wolfram, ResourceFunction est finalement basé sur la fonction ResourceObject.

Examinons ResourceFunction:

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

À l'intérieur, vous pouvez voir certaines informations à l'aide de la fonction Information:

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Comment fonctionne la configuration de la fonction de ressource ? Le cas le plus simple est purement local. Voici un exemple qui prend une fonction (dans ce cas, une fonction simple) et la définit comme une fonction de ressource pour le session en cours dans le programme :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Après avoir effectué la définition, vous pouvez utiliser la fonction de ressource :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Notez que dans cet objet BLOB de fonction, il y a une icône noire Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram. Cela signifie que la fonction BLOB est liée à une fonction de ressource en mémoire, définie pour la session en cours. Pour une fonction de ressource qui est stockée de manière permanente sur votre ordinateur ou dans votre compte cloud, il y a une icône grise Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram. Et pour une fonction de ressource officielle dans le dépôt de fonctions Wolfram, il y a une icône orange Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram.

Alors, que se passe-t-il lorsque vous utilisez le menu 'Déploiement' dans le notebook de définition ? D'abord, il prend toutes les définitions dans le notebook et en crée un symbole ResourceObject). (Et si vous utilisez un IDE textuel ou un programme, vous pouvez également créer explicitement ResourceObject)

Le déploiement local de la fonction depuis le référentiel sur votre ordinateur se fait à l'aide de la commande CacheLocal pour l'objet ressource, afin de le conserver comme ObjetLocal dans votre système de fichiers. Le déploiement dans le compte cloud s'effectue à l'aide de la commande DéploiementCloud pour l'objet ressource, et le déploiement public dans le cloud — PublicationCloud. Dans tous les cas EnregistrementRessource est également utilisé pour enregistrer le nom de la fonction ressource, ainsi FonctionRessource[«nom»] fonctionnera.

Lorsque vous cliquez sur le bouton Soumettre pour le Référentiel de Fonction, ce qui se passe en dessous SoumissionRessource est appelé sur l'objet ressource. (Et si vous utilisez une interface de saisie textuelle, vous pouvez également appeler SoumissionRessource directement).

Par défaut, l'envoi se fait sous le nom associé à votre identifiant Wolfram ID. Mais si vous soumettez une demande au nom d'un groupe de développeurs ou d'une organisation, vous pouvez définir un identifiant éditeur distinct et l'utiliser à la place comme nom pour interagir avec vos visualisations.

Une fois que vous avez soumis l'une de vos fonctions dans la base de connaissances des fonctions, elle sera mise en file d'attente pour révision. Si vous recevez des commentaires en réponse, ils seront 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 demande en vous rendant sur le portail des participants au système de ressources. Mais une fois que votre fonction est approuvée, vous serez prévenu (par e-mail), et votre fonction sera publiée dans le référentiel de fonctions Wolfram.

Quelques subtilités dans le fonctionnement

À première vue, on pourrait penser qu'il suffit de prendre le carnet de définition et de le placer littéralement dans le référentiel de fonctions, cependant, en réalité, il y a beaucoup de subtilités — et pour les gérer, il faut effectuer un méta-programmation assez complexe, en traitant symboliquement à la fois le code définissant la fonction et le carnet de définition lui-même. La plupart de cela se passe en interne, c'est-à-dire « en coulisses », mais cela peut avoir certaines conséquences qu'il vaut la peine de comprendre si vous envisagez de contribuer à la base de connaissances des fonctions.

La première subtilité directe : Lorsque vous remplissez le « Bloc-notes de définitions », vous pouvez simplement faire référence à votre fonction partout, en utilisant un nom tel que MyFunction, qui ressemble à un nom de fonction ordinaire dans le langage Wolfram, mais pour la documentation du dépôt de fonctions, cela est remplacé par FonctionRessource[« MyFunction »] – c'est exactement ce que les utilisateurs utiliseront effectivement lors de l'utilisation de la fonction.

La deuxième subtilité : lorsque vous créez une fonction de ressource à partir du Bloc-notes de définitions, toutes les dépendances impliquées dans la définition de la fonction doivent être fixées et explicitement incluses. Cependant, pour garantir que les définitions restent modulaires, tout doit être placé dans un espace de nomsunique. (Évidemment, les fonctions qui font tout cela, se trouvent dans le dépôt de fonctions.)

D'habitude, 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 inachevé à l'intérieur de votre fonction, vous verrez que ce symbole se trouve dans le contexte interne de la fonction. Cependant, lors du traitement du Bloc-notes de définitions, au moins le symbole correspondant à la fonction elle-même, est configuré pour une meilleure représentation sous la forme d'un BLOB fonctionnel, et non d'un symbole brut dans le contexte interne.

Le dépôt de fonctions est destiné à définir de nouvelles fonctions. Et ces fonctions peuvent avoir des options. Souvent, ces paramètres (par exemple, Méthode ou ImageSize) peuvent être utilisés pour les fonctions intégrées, ainsi que pour celles pour lesquelles des symboles intégrés existent déjà. Mais parfois, une nouvelle fonction peut nécessiter de nouvelles options. Pour préserver la modularité, il est nécessaire que ces paramètres soient des symboles définis dans un contexte interne unique (ou quelque chose comme des fonctions de ressource entières, c'est-à-dire indépendamment). Pour simplifier, le dépôt de fonctions permet de définir de nouvelles options dans les définitions sous forme de chaînes. Et pour la commodité de l'utilisateur, ces définitions (à condition qu'elles utilisent OptionValue et OptionsPattern) sont également traitées de manière à ce qu'en utilisant les fonctions, les paramètres puissent être spécifiés non seulement sous forme de chaînes, mais aussi comme des symboles globaux ayant les mêmes noms.

La plupart des fonctions font simplement ce qu'elles doivent faire chaque fois qu'elles sont appelées, mais certaines fonctions nécessitent une initialisation avant de pouvoir fonctionner dans une certaine session — et pour résoudre ce problème, il existe une section « Initialisation » dans la partie « Définition ».

Les fonctions du dépôt peuvent utiliser d'autres fonctions déjà présentes dans le dépôt pour configurer des définitions pour le dépôt de fonctions, incluant deux (ou plusieurs) fonctions qui se réfèrent l'une à l'autre nécessitant d'être déployées dans votre session de travail avec le programme, afin que vous puissiez y référencer comme FonctionRessource[«nom»], puis vous pouvez créer les combinaisons de ces fonctions nécessaires (je n'ai pas compris) et ajouter une nouvelle fonction au dépôt basée sur celles déjà présentes précédemment. (ou déjà ou auparavant – les deux mots sont mal formulés)

Perspectives de développement. Que doit-il se passer lorsque le dépôt devient vraiment volumineux ?

Aujourd'hui, nous lançons simplement le dépôt de fonctions Wolfram, mais au fil du temps, nous prévoyons que son volume et sa fonctionnalité pourraient augmenter considérablement, et à mesure qu'il grandit, divers problèmes émergeront que nous pressentons déjà.

Le premier problème concerne les noms des fonctions et leur unicité. Le dépôt de fonctions est conçu de telle manière que, comme pour les fonctions intégrées du langage Wolfram, on peut référencer n'importe quelle fonction donnée simplement en indiquant son nom. Mais cela signifie inévitablement que les noms de fonctions doivent être globalement uniques dans tout le dépôt, donc, par exemple, il ne peut y avoir qu'un seul FonctionRessource[«MyFavoriteFunction»].

À première vue, cela peut sembler un gros problème, mais il est important de comprendre que c'est essentiellement le même problème que pour des choses telles que les noms de domaines Internet ou les identifiants de réseaux sociaux. Et le fait est que, dans le système, il est simplement nécessaire d'avoir un registraire — et c'est l'un des rôles que notre entreprise assumera pour la base de connaissances des fonctions Wolfram. (Pour les versions privées du dépôt, leurs registraires peuvent être des administrateurs.) Bien sûr, un nom de domaine Internet peut être enregistré sans avoir quoi que ce soit dessus, mais dans le dépôt de fonctions, un nom de fonction ne peut être enregistré que s'il existe une définition réelle de la fonction.

En tant que partie de notre rôle dans la gestion de la base de connaissances des fonctions Wolfram, nous veillons à ce que le nom choisi pour une fonction ait du sens par rapport à sa définition, et qu'il respecte les conventions de nommage du langage Wolfram. Nous avons plus de 30 ans d'expérience dans le nommage des fonctions intégrées dans le langage Wolfram, et notre équipe de curateurs appliquera également cette expérience au dépôt 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 une certaine fonction, mais il est préférable d'opter pour un nom plus long et plus spécifique, car cela réduit les risques que quelqu'un souhaite créer un nom de fonction similaire à l'avenir.

(Il convient de noter que l'ajout simple de n'importe quelle balise de participant pour éliminer l'ambiguïté des fonctions ne produira pas l'effet escompté. Car, si l'on ne s'assure pas que la balise est toujours assignée, il faudra définir une balise par défaut pour toute fonction donnée, ainsi que mettre en avant les balises des auteurs, ce qui nécessitera à nouveau une coordination globale.)

À mesure que la base de connaissances des fonctions Wolfram s'agrandit, l'une des préoccupations qui se posera sans aucun doute est la découvrabilité des fonctions. Pour cela, le système prévoit une fonction de recherche (et les fichiers de définition peuvent inclure des mots-clés, etc.). Pour les fonctions intégrées dans le langage Wolfram, la documentation contient toutes sortes de renvois croisés qui aident à « promouvoir » les fonctions. Les fonctions du dépôt de fonctions peuvent faire référence aux fonctions intégrées. Mais qu'en est-il dans l'autre sens ? Pour cela, nous prévoyons d'expérimenter différentes schémas pour présenter les fonctions du dépôt sur les pages de documentation des fonctions intégrées.

Pour les fonctions intégrées dans le langage Wolfram, il existe ce que l'on appelle un niveau de découvrabilité fourni par un réseau de « pages d'aide », qui fournissent des listes organisées de fonctionnalités relatives à des domaines spécifiques. Il est toujours difficile d'équilibrer correctement les pages de référence et, à mesure que le langage Wolfram évolue, les pages de référence doivent souvent être complètement réorganisées. Il est assez simple de placer des fonctions du dépôt dans de larges catégories et même de subdiviser ces catégories, mais il est beaucoup plus précieux d'avoir des pages de référence du langage correctement organisées. Il n'est pas encore clair comment créer au mieux ces pages pour toute la base de connaissances des fonctions. Par exemple, CreateResourceObjectGallery dans le dépôt de fonctions, tout le monde peut déposer une page Web contenant ses « sélections » du dépôt :

Dépôt de fonctions Wolfram : accès ouvert à une plateforme pour les extensions du langage Wolfram

Le dépôt de fonctions Wolfram est configuré comme un stockage permanent de fonctions, où chaque fonction présente y sera toujours opérationnelle. Il peut certainement y avoir de nouvelles versions de fonctions, et nous nous attendons à ce que certaines fonctions deviennent obsolètes au fil du temps. Les fonctions fonctionneront si elles sont utilisées dans des programmes, mais leurs pages de documentation feront référence à de nouvelles fonctionnalités plus avancées.

Le dépôt de fonctions Wolfram est destiné à un accès rapide aux nouvelles fonctions et à l'exploration de nouvelles possibilités d'utilisation du langage Wolfram. Avec une grande dose d'optimisme, nous espérons qu'une partie de ce qui a été exploré dans le dépôt de fonctions finira par être intégré en tant que parties fondamentales du langage principal Wolfram Language. Au cours de la dernière décennie, nous avons eu un ensemble similaire de fonctions qui ont été initialement présentées dans Wolfram | Alpha. Et l'une des leçons tirées de cette expérience est qu'il faut beaucoup de travail pour atteindre les normes de qualité et de cohérence sur lesquelles nous mettons l'accent dans tout ce qui est intégré au langage Wolfram, un travail qui est souvent plus complexe que les efforts initiaux de mise en œuvre de l'idée. Mais même dans ce cas, une fonction dans la base de connaissances peut servir de preuve de concept très utile pour une future fonction qui pourrait finalement être intégrée au langage Wolfram.

La chose la plus importante ici est que la fonction dans le dépôt de fonctions est accessible à tous les utilisateurs dès maintenant. Il est possible qu'une fonction intégrée au langage soit bien meilleure et plus performante, mais le dépôt de fonctions permet aux utilisateurs d'accéder immédiatement à toutes les nouvelles fonctionnalités. Et surtout, ce concept permet à chacun d'ajouter ses propres nouvelles fonctionnalités.

Autrefois, dans l'histoire du langage Wolfram, cette idée n'aurait pas aussi bien fonctionné qu'aujourd'hui, mais à ce stade, tant d'efforts ont été investis dans le langage, et une compréhension si profonde des principes de conception du langage permet maintenant de voir comme très possible qu'une grande communauté d'utilisateurs ajoute des fonctions qui soutiendront la cohérence du projet, rendant celles-ci utiles à un large éventail d'utilisateurs.

Dans la communauté des utilisateurs de Wolfram Language, il y a un esprit de talent incroyable. (Bien sûr, cette communauté comprend de nombreux experts de premier plan dans la recherche et le développement dans divers domaines.) J'espère que le dépôt de fonctions Wolfram fournira une plateforme efficace pour révéler et diffuser cet esprit de talent. Ce n'est qu'ensemble que nous pourrons créer quelque chose qui étendra considérablement le domaine d'application de la paradigme de calcul du langage Wolfram.

En plus de 30 ans, nous avons parcouru un long chemin avec le langage Wolfram. Maintenant, ensemble, allons encore plus loin. J'appelle tous les utilisateurs respectés du langage Wolfram dans le monde à utiliser ce dépôt de fonctions comme plateforme, ainsi que ce nouveau projet logiciel, tel que le Free Wolfram Engine pour les développeurs.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster