Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Ola, Habr! Presento á súa atención unha tradución da publicación de Stephen Wolfram "O repositorio de funcións Wolfram: lanzamento dunha plataforma aberta para estender a linguaxe Wolfram".

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Requisitos previos para a coherencia da linguaxe Wolfram

Hoxe estamos no limiar de grandes logros xunto coa linguaxe de programación Wolfram Language. Hai só tres semanas que lanzamos motor Wolfram gratuíto para desenvolvedorespara axudar aos nosos usuarios a integrar Wolfram Language nos seus proxectos de software a gran escala. Hoxe lanzamos Repositorio de funcións Wolfram, co fin de proporcionar unha plataforma coordinada para funcións creadas para estender a linguaxe Wolfram, e tamén abrimos un repositorio de funcións para quen poida contribuír ao desenvolvemento do noso produto de software.

O Wolfram Function Repository é algo posible pola natureza única da Wolfram Language non só como linguaxe de programación, senón tamén como unha linguaxe de computación a gran escala. Nas linguaxes de programación tradicionais, engadir novas funcionalidades significativas normalmente implica crear bibliotecas adicionais enteiras que poden funcionar ou non cando se usan en conxunto. Porén, no Wolfram Language tanto xa está construído na propia lingua, que é posible ampliar significativamente a súa funcionalidade simplemente engadindo novas funcións que se integran inmediatamente na estrutura holística de toda a linguaxe.

Por exemplo, o repositorio de funcións Wolfram xa contén 532 novas funcións estruturado en 26 categorías temáticas:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Así mesmo máis que 6000 funcións estándar, integrada na linguaxe Wolfram, cada función do repositorio ten unha páxina de documentación cunha descrición detallada delas e exemplos de traballo:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Para acceder á páxina, copie o obxecto anterior (función BLOB), pégueo na liña de entrada e, a continuación, execute a función: xa está integrada na linguaxe Wolfram e é compatible por defecto comezando por versión 12.0:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Cómpre sinalar aquí que ao procesar LogoQRCode Non precisa, por exemplo, configurar unha "biblioteca de procesamento de imaxes", xa que xa implementamos unha forma algorítmica coherente e coidadosamente no Wolfram Language procesamento de imaxes, que pode ser procesado inmediatamente por varias funcións da linguaxe gráfica:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Espero que co apoio marabillosa e talentosa comunidade, que foi crecendo e expandíndose (baseado na lingua Wolfram) durante as últimas décadas. O repositorio de funcións de Wolfram permitirá, nun futuro previsible, ampliar significativamente a gama de funcións (posiblemente significativas, especializadas en varios campos da ciencia e tecnoloxía) dispoñibles na lingua. Así, faise posible utilizar tanto o contido da linguaxe (as súas funcións integradas) como principios de desenvolvemento, que se implementan en función da lingua. (Hai que ter en conta aquí que Wolfram Language xa ​​ten máis de 30 anos de historia de desenvolvemento e crecemento estable).
As funcións do repositorio poden conter pequenos ou grandes fragmentos de código escritos na linguaxe Wolfram. Por exemplo, estas poden ser chamadas API e servizos externos ou bibliotecas externas noutros idiomas. A característica única deste enfoque é que cando se afonda ata a funcionalidade a nivel de usuario, non haberá posibles inconsistencias porque o enfoque está construído sobre a estrutura consistente da linguaxe Wolfram - e cada función funcionará automaticamente correctamente - exactamente como ela debería.
O shell e a estrutura de programación do repositorio de funcións de Wolfram están deseñados para que todos poidan contribuír á causa común do xeito máis sinxelo e cómodo para eles; de feito, só enchendo o ficheiro de texto do bloc de notas (con extensión nb) WL. As funcións automáticas integradas permítenche comprobar as novas funcións engadidas ao repositorio para garantir a súa integración no idioma. A nosa empresa aposta pola ampla gama de usuarios que poden integrar as súas funcións no idioma, máis que pola gran complexidade das novas funcións -e aínda que hai un proceso de revisión, non insistimos en nada como análise minuciosa do deseño ou estándares estritos para a integridade e fiabilidade das novas funcións do usuario, en oposición ás probas máis rigorosas das funcións integradas na linguaxe principal que empregamos.

Neste enfoque hai moitas compensacións e detalles, pero o noso obxectivo é optimizar o repositorio de funcións de Wolfram tanto para a experiencia do usuario como para garantir que as novas funcións dos usuarios contribúan significativamente ao desenvolvemento da linguaxe. A medida que imos medrando, non teño dúbida de que teremos que inventar novos métodos para procesar e validar funcións integradas no repositorio, non menos importante para organizar un gran número de funcións e atopar as que precisan os usuarios. Porén, é alentador que o camiño que escollemos sexa un bo comezo. Eu persoalmente engadiu varias funcións á base de datos orixinal. Moitos deles están baseados en código que desenvolvín persoalmente hai bastante tempo. E só tardei uns minutos en envialos ao repositorio. Agora que están no repositorio, por fin podo -de forma inmediata e en calquera momento- utilizar estas funcións segundo sexa necesario, sen ter que preocuparme de buscar ficheiros, descargar paquetes, etc.

Aumentar a eficiencia reducindo os custos

Mesmo antes de Internet, había formas de compartir código Wolfram Language (o noso primeiro gran proxecto centralizado foi MathSource, creado para Mathematica en 1991 baseado en CD-ROM, etc.). Por suposto, o enfoque proposto para a implementación baseado no repositorio de funcións Wolfram é unha ferramenta máis poderosa e fiable para implementar as tarefas anteriores.

Durante máis de 30 anos, a nosa empresa traballou con dilixencia para manter a integridade da estrutura da linguaxe Wolfram, e isto é fundamental para garantir que a linguaxe Wolfram non se converta só nunha linguaxe de programación, senón tamén nunha linguaxe de programación. linguaxe de computación completa. E así, a esencia do enfoque para implementar o repositorio de funcións de Wolfram é utilizar un enfoque unificado para programar e desenvolver novas funcións que se engaden secuencialmente e encaixan no marco da linguaxe para que poida desenvolverse e coevolucionar.

Na estrutura de implementación de cada función ocorren diversos procesos computacionais. Cabe sinalar aquí que é necesario que a función teña un aspecto claro e uniforme e unha lexibilidade visual para o usuario. Neste contexto, as funcións integradas do Wolfram Language preséntanse con máis de 6000 exemplos secuenciais de como programar correctamente as funcións (estes son os nosos vídeos de programación en directoque inclúen centos de horas de proceso de creación de programas estándar). O que este enfoque fai que o repositorio de funcións de Wolfram sexa capaz de funcionar ben é a natureza estrutural da linguaxe Wolfram, coa súa gran cantidade de bibliotecas adicionais e variadas que xa están integradas na linguaxe. Por exemplo, se tes unha función que procesa imaxes, ou matrices dispersasOu estruturas molecularesE datos xeográficos ou algúns outros - a súa representación simbólica consistente xa existe na linguaxe, e grazas a iso, a súa función faise inmediatamente compatible con outras funcións na linguaxe.

Crear un repositorio que funcione ben é unha tarefa de metaprogramación interesante. Por exemplo, un exceso de restricións no programa non permitirá obter a necesaria unificación e universalidade do algoritmo. Do mesmo xeito que cun número insuficiente de restricións funcionais, non poderá implementar unha secuencia suficientemente correcta de execución do algoritmo. Varios exemplos anteriores de implementación dun compromiso destes enfoques, implementados pola nosa empresa, funcionaron de forma bastante estable: estes son: Demostracións do proxecto Tungsteno, lanzado en 2007 e agora funciona en liña con máis de 12000 demostracións interactivas co usuario. EN Base de datos Wolfram hai máis de 600 bases de datos preparadas que se poden usar no Wolfram Language, e Almacenamento de rede neuronal Wolfram enchégase con novas redes neuronais case todas as semanas (xa hai 118 delas agora) e conéctanse inmediatamente a través da función NetModel na lingua Wolfram.

Todos os exemplos anteriores teñen unha característica fundamental: os obxectos e funcións recollidos no proxecto teñen un moi alto grao de estruturación e distribución de procesos. Por suposto, o detalle da estrutura do que é unha demostración ou unha rede neuronal ou outra cousa pode variar moito, pero a estrutura fundamental para calquera repositorio actual sempre segue sendo a mesma. Entón, cal é a túa opinión, querido usuario, sobre a creación dun repositorio que engada extensións á linguaxe Wolfram? A linguaxe Wolfram está deseñada para ser extremadamente flexible, polo que se pode ampliar e modificar de calquera forma. Esta circunstancia é moi importante para a capacidade de crear rapidamente varios proxectos de software a gran escala no Wolfram Language. Cómpre sinalar aquí que a medida que aumenta a flexibilidade da lingua, o custo dos proxectos implementados en tal lingua inevitablemente aumentará. Isto débese ao feito de que canto máis usa o usuario tal linguaxe, máis funcionalidade dedicada recibe, pero non debemos esquecer que este enfoque tamén pode ter aspectos negativos en canto á incapacidade de garantir a coherencia coherente dos módulos do programa.

Hai un problema común coas bibliotecas en linguaxes de programación tradicionais: se usas unha biblioteca, por exemplo, o código funcionará correctamente, pero se intentas usar varias bibliotecas, non hai garantía de que interactúen correctamente entre si. . Ademais, nas linguaxes de programación tradicionais, a diferenza dunha linguaxe de computación completa, non hai forma de garantir a presenza de representacións integradas consistentes para calquera función ou tipo de datos que non sexan as súas estruturas básicas. Pero, de feito, o problema é aínda máis grande do que parece a primeira vista: se un está construíndo unha vertical de funcionalidade a gran escala, sen os enormes custos da programación centralizada de proxectos que poñemos na linguaxe Wolfram, é imposible conseguir coherencia. Polo tanto, é importante que todos os módulos de software funcionen sempre xuntos correctamente.

Polo tanto, a idea detrás do repositorio de funcións de Wolfram é evitar o problema descrito anteriormente simplemente engadindo extensións á linguaxe en fragmentos de código relativamente pequenos mediante funcións individuais que sexan máis fáciles de desenvolver como módulos coherentes. Dito isto, hai funcións de programación que non se poden facer convenientes usando funcións individuais (e a nosa empresa planea lanzar un algoritmo de programación optimizado nun futuro próximo para axudar a implementar paquetes de software a gran escala). Non obstante, baseándose nas funcións xa integradas na linguaxe Wolfram, hai moitas posibilidades de programación que se implementan en función de funcións individuais. A idea aquí é que con relativamente pouco esforzo de programación é posible crear unha serie de funcións novas e moi útiles que proporcionarán coherencia suficiente ao deseño, estarán ben coordinadas entre si e ademais, ademais diso, será capaz de usar facilmente e amplamente na lingua no futuro.

Este enfoque é, por suposto, un compromiso. Se se implementase un paquete máis grande, podería imaxinarse un novo mundo de funcionalidades que sería extremadamente poderoso e útil. Se hai necesidade de obter unha nova funcionalidade que encaixará con todo o demais, pero non estás disposto a gastar moito esforzo no desenvolvemento do proxecto, isto, por desgraza, pode levar a unha redución do alcance do teu proxecto. A idea detrás do repositorio de funcións de Wolfram é proporcionar funcionalidade a unha parte definitoria dun proxecto; este enfoque engadirá unha funcionalidade potente ao tempo que facilitará manter unha boa coherencia nun proxecto de programación.

Axuda a engadir funcións personalizadas ao repositorio de funcións

O noso equipo traballou duro para facilitar aos usuarios a contribución ás funcións do repositorio de Wolfram. No escritorio (xa en versión 12.0), pode simplemente ir polas pestanas do menú principal secuencialmente: Ficheiro > Novo > RepositoryItem > Elemento do repositorio de funcións e obterá "Caderno de definicións" (programaticamente dentro do banco de traballo. Tamén pode usar a función analóxica - Crear un caderno["Recurso de funcións"]):

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Hai dous pasos principais que terás que realizar: primeiro, escribir o código da túa función e, segundo, anotar a documentación que ilustra como debería funcionar a túa función.
Fai clic no botón "Abrir mostra" na parte superior para ver un exemplo do que debes facer:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Esencialmente, estás tentando crear algo semellante a unha función integrada no Wolfram Language. Excepto que pode facer algo moito máis específico que unha función integrada. Ao mesmo tempo, as expectativas sobre a súa integridade e fiabilidade serán moito menores.
Debes darlle á túa función un nome que siga as directrices de nomeamento de funcións de Wolfram Language. Ademais, terá que desenvolver documentación para a súa función, similar ás funcións integradas da linguaxe. Disto falarei con máis detalle máis adiante. Polo momento, só tes en conta que na fila de botóns na parte superior do ficheiro do caderno de definición hai un botón "Pautas de estilo", que explica que facer, e un botón Ferramentas, que proporciona ferramentas para formatar a documentación da función.
Cando estea seguro de que todo se encheu correctamente e estea listo, prema no botón "Comprobar". É completamente normal que aínda non descubras todos os detalles. Así que a función "Comprobar" executarase automaticamente e fará moitas comprobacións de estilo e coherencia. Moitas veces, pediralle inmediatamente que confirme e acepte as correccións (por exemplo: "Esta liña debe rematar con dous puntos" e pediralle que introduza dous puntos). Ás veces, ela pedirache que engadas ou cambies algo ti mesmo. Engadiremos constantemente novas funcións á funcionalidade automática do botón Comprobar, pero basicamente a súa finalidade é garantir que todo o que envíes ao repositorio de funcións siga de preto tantas pautas de estilo como sexa posible.

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Entón, despois de executar "Comprobar", pode usar "Vista previa". "Vista previa" crea unha vista previa da páxina de documentación que definiches para a túa función. Tamén pode crear unha vista previa dun ficheiro creado no seu ordenador ou dun ficheiro situado no almacenamento na nube. Se por algún motivo non estás satisfeito co que ves na vista previa, simplemente volve atrás e fai as correccións necesarias e fai clic de novo no botón Vista previa.
Agora estás preparado para enviar a túa función ao repositorio. O botón Implementar ofrécelle catro opcións:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

O importante neste paso é que pode enviar a súa función ao repositorio de funcións de Wolfram para que estea dispoñible para calquera. Ao mesmo tempo, tamén pode colocar a súa función para un número limitado de usuarios. Por exemplo, pode crear unha función que estea aloxada localmente no seu ordenador para que estea dispoñible cando use ese ordenador en particular. Ou podes publicalo no teu conta na nube, para que estea dispoñible cando estea conectado á nube. Tamén pode aloxar (implementar) publicamente a función a través da súa conta na nube. Non estará no repositorio central de funcións de Wolfram, pero poderás darlle a alguén un URL que lle permita obter a túa función da túa conta. (No futuro, tamén admitiremos repositorios centrais en toda a nosa empresa).

Entón, digamos que realmente quere enviar a súa función á base de coñecemento de funcións de Wolfram. Para iso, fai clic no botón "Enviar" ao repositorio. Entón, que está a suceder neste momento? A túa solicitude ponse inmediatamente en cola para a súa revisión e aprobación polo noso equipo de comisarios.

A medida que a túa solicitude avanza no proceso de aprobación (que normalmente leva varios días), recibirás comunicacións sobre o seu estado e posiblemente suxestións para o seu uso futuro. Pero unha vez que se aprobe a túa función, publicarase inmediatamente no repositorio de funcións de Wolfram e estará dispoñible para que o use. (E isto aparecerá en resumos de novas de novas funcións etc.)

Que debería haber no almacenamento?

Nótese que a nosa empresa ten estándares moi altos de integridade, fiabilidade e calidade xeral, e das máis de 6000 funcións que xa incorporamos na linguaxe Wolfram nos últimos 30 anos, todas cumpren os requisitos anteriores. O obxectivo do Repositorio de funcións de Wolfram é utilizar toda a estrutura e funcionalidade que xa existe na linguaxe Wolfram para engadir tantas funcións máis lixeiras (é dicir, funcións de maior rendemento) como sexa posible.

Por suposto, as funcións do repositorio de funcións de Wolfram deben axustarse aos principios de deseño da linguaxe Wolfram, para que poidan interactuar plenamente con outras funcións e as expectativas dos usuarios sobre como debería funcionar correctamente a función. Non obstante, as funcións non teñen por que ser da mesma integridade ou fiabilidade.

Nas funcións integradas da linguaxe Wolfram, traballamos duro para que as funcións de programación sexan o máis xerais posible. Dito isto, cando no repositorio de funcións de Wolfram non hai nada de malo en ter unha función que simplemente xestione algún caso moi específico pero útil. Por exemplo, a función SendMailFromNotebook pode recibir ficheiros nun formato específico e crear correos dun xeito específico. Diagrama poligonal crea gráficos con só determinadas cores e etiquetas, etc.

Outro punto relacionado coas funcións integradas é que a nosa empresa fai todo o posible para xestionar todos os casos atípicos, para xestionar correctamente a entrada incorrecta, etc. Nun repositorio de funcións, é completamente normal que haxa unha función especial que xestione os casos principais de resolución dun problema e ignore todos os demais.

O punto obvio é que é mellor ter funcións que fagan máis e o fagan mellor, pero a optimización para un repositorio de funcións -en oposición ás funcións integradas da linguaxe Wolfram- debería ter máis funcións agrupadas con máis funcións en lugar de afondar en os procesos de implementación de cada función específica.

Agora vexamos un exemplo de funcións de proba nun repositorio. As expectativas de coherencia para tales funcións son, naturalmente, moito máis baixas que para as funcións de linguaxe integradas. Isto é especialmente certo nos casos en que as funcións dependen de recursos externos como as API, é importante realizar constantemente probas consistentes, o que ocorre automaticamente dentro dos algoritmos de verificación. No ficheiro nb, pode especificar de forma explícita definicións (na sección Información adicional) e especificar tantas probas como se definan mediante cadeas de entrada e saída ou obxectos de carácter completo de tipo Proba de verificación, tanto como creas oportuno. Ademais, o sistema está constantemente tentando converter os exemplos de documentación que proporciona nun proceso de verificación (e ás veces isto pode consumir bastante recursos, por exemplo, para unha función cuxo resultado depende de números aleatorios ou da hora do día).

Como resultado, o repositorio de funcións terá unha serie de complexidades de implementación. Algúns serán só unha liña de código, outros poden implicar miles ou decenas de miles de liñas, probablemente usando moitas funcións auxiliares. Cando paga a pena engadir unha función que require moi pouco código para definir? Basicamente, se para unha función hai bo nome mnemónico, que os usuarios entenderían facilmente se o viran nun anaco de código, entón xa se pode engadir. En caso contrario, probablemente sexa mellor volver engadir o código ao programa cada vez que necesites usalo.

O propósito principal dun repositorio de funcións (como o seu nome indica) é introducir novas funcións na linguaxe. Se queres engadir novos datos ou novas entidades, use Repositorio de datos de Wolfram. Pero e se queres introducir novos tipos de obxectos para os teus cálculos?

En realidade hai dúas formas. Quizais queira introducir un novo tipo de obxecto que se utilizará en novas funcións do repositorio de funcións. E neste caso, sempre podes simplemente anotar a súa representación simbólica e usala ao introducir ou sair funcións nun repositorio de funcións.

Pero e se queres representar un obxecto e logo definir, a través das funcións existentes na linguaxe Wolfram, que queres traballar con el? O Wolfram Language sempre tivo un mecanismo lixeiro para iso, chamado Valores ascendentes. Con algunhas restricións (especialmente para funcións que non poden valorar os seus argumentos), un repositorio de funcións permítelle simplemente representar unha función e definir valores para ela. (Aumentar a expectativa de coherencia ao crear un novo deseño importante que estea totalmente integrado en Wolfram Language é xeralmente un procedemento moi importante que non se pode conseguir simplemente aumentando o custo do proxecto e é algo que a nosa empresa fai como parte dos proxectos. para o desenvolvemento a longo prazo da lingua, esta tarefa non é un obxectivo que se establece como parte do desenvolvemento do repositorio).

Entón, que pode haber no código de función nun repositorio de funcións? Todo integrado no Wolfram Language, por suposto (polo menos se non representa ameazas para seguridade e o rendemento do propio programa, como contorno informático) así como calquera función do repositorio de funcións. Non obstante, hai outras funcionalidades: unha función nun repositorio de funcións pode chamar a unha API ou en Wolfram CloudOu doutra fonte. Por suposto, hai algúns riscos asociados con isto. Debido ao feito de que non hai garantías de que a API non cambie e a función da tenda de funcións deixará de funcionar. Para axudar a identificar problemas como este, hai unha nota na páxina de documentación (na sección Requisitos) para calquera función que dependa de algo máis que a funcionalidade integrada de Wolfram Language. (Por suposto, cando se trata de datos reais, pode haber problemas mesmo con esta funcionalidade, porque os datos do mundo real cambian constantemente e, ás veces, incluso as súas definicións e estrutura cambian).

Todo o código para o repositorio de funcións de Wolfram debería estar escrito en Wolfram? Certamente, o código dentro da API externa non debería estar escrito na linguaxe Wolfram, que nin sequera fai o código da linguaxe. De feito, se atopas unha función en case calquera linguaxe ou biblioteca externa, podes crear un envoltorio que che permita usala no repositorio de funcións de Wolfram. (Normalmente deberías usar as funcións integradas para iso Avaliación externa ou Función externa en código de idioma Wolfram.)

Entón, cal é o punto de facer isto? Esencialmente, isto permítelle utilizar todo o sistema integrado Wolfram Language e todo o seu conxunto unificado de capacidades de software. Se obtén a implementación base dunha biblioteca ou linguaxe externa, entón pode usar a rica estrutura simbólica do Wolfram Language para crear unha función de nivel superior conveniente que permita aos usuarios utilizar facilmente calquera funcionalidade xa implementada. Polo menos, isto debería ser factible nun mundo ideal onde existan todos os bloques de construción de bibliotecas de carga, etc., en cuxo caso serían xestionados automaticamente polo Wolfram Language. (Hai que ter en conta que na práctica pode haber problemas con configurando idiomas externos sistema informático específico e o almacenamento na nube poden supoñer problemas de seguridade adicionais).

Por certo, cando miras por primeira vez as bibliotecas externas típicas, moitas veces parecen demasiado complexas para cubrirse con só unhas poucas funcións, pero en moitos casos, gran parte da complexidade vén de crear a infraestrutura necesaria para a biblioteca e todas as funcións para apoialo. Non obstante, cando se usa Wolfram Language, a infraestrutura normalmente xa está integrada nos paquetes, polo que non hai necesidade de expor todas estas funcións de soporte en detalle, senón de crear funcións para as funcións específicas da aplicación "máis arriba" da biblioteca. .

"Ecosistema" da base de coñecemento

Se escribiu funcións que usa habitualmente, envíeas ao repositorio de funcións de Wolfram. Se isto non sae algo máis (desenvolvemento da linguaxe), aínda así será moito máis cómodo que use as funcións para uso persoal. Non obstante, é lóxico asumir que se usa as funcións con regularidade, quizais outros usuarios tamén as atopen útiles.

Naturalmente, pode atoparse nunha situación na que non pode -ou non quere- compartir as súas funcións ou no caso de acceder a recursos de información privada. Incluso nestes casos, pode simplemente implementar as funcións na súa propia conta na nube, especificando dereitos acceso a eles. (Se a súa organización ten Wolfram Enterprise nube privada, en breve poderá aloxar o seu propio repositorio de funcións privado, que se pode administrar desde a súa organización e establecer se quere obrigar ou non a ver as vistas a usuarios de terceiros.)

As funcións que envías ao repositorio de funcións de Wolfram non teñen por que ser perfectas; só teñen que ser útiles. Isto é un pouco como a sección "Erros" na documentación clásica de Unix - na "Sección Definicións" hai unha sección "Notas do autor" onde podes describir limitacións, problemas, etc. que xa coñeces sobre a túa función. Ademais, cando envíes a túa función ao repositorio, podes engadir notas de envío que serán lidas por un equipo dedicado de comisarios.

Unha vez que se publica unha función, a súa páxina sempre ten dúas ligazóns na parte inferior: "Envía unha mensaxe sobre esta función"E"Debate na comunidade Wolfram" Se estás adxuntando unha nota (por exemplo, cóntame sobre erros), podes marcar a caixa que indica que queres que a túa mensaxe e información de contacto se compartan co autor da función.

Ás veces só quere usar funcións do repositorio de funcións de Wolfram, como funcións integradas, sen mirar o seu código. Non obstante, se queres botar unha ollada ao interior, sempre hai un botón do Bloc de notas na parte superior. Fai clic nel e obterás a túa propia copia do caderno de definicións orixinal que se enviou ao repositorio de funcións. Ás veces só podes usalo como exemplo para as túas necesidades. Ao mesmo tempo, tamén pode desenvolver a súa propia modificación desta función. Quizais queira publicar estas funcións que atopou no repositorio no seu ordenador ou na súa conta de almacenamento na nube de pulgóns, quizais queira envialas á base de coñecemento de funcións, quizais como unha versión mellorada e ampliada da función orixinal.

No futuro, pensamos admitir a bifurcación ao estilo de Git para os repositorios de funcións, pero polo de agora estamos tentando que sexa sinxelo e sempre temos só unha versión aceptada de cada función integrada no idioma. Na maioría das veces (a non ser que os desenvolvedores renuncien a manter as funcións que desenvolveron e respondan aos envíos dos usuarios), o autor orixinal da función toma o control das actualizacións da mesma e envía novas versións, que despois son revisadas e, se pasan o proceso de revisión. , publicado na lingua.

Consideremos a cuestión de como funciona o "versionado" das funcións desenvolvidas. Agora mesmo, cando utilizas unha función do repositorio de funcións, a súa definición almacenarase permanentemente no teu ordenador (ou na túa conta na nube se estás a usar a nube). Se está dispoñible unha nova versión dunha función, a próxima vez que a utilice, recibirá unha mensaxe notificándoo. E se queres actualizar a función a unha nova versión, podes facelo usando o comando Actualización de recursos. (O "blob de funcións" almacena en realidade máis información de versións e pensamos facelo máis accesible para os nosos usuarios no futuro.)

Unha das cousas bonitas do Repositorio de funcións de Wolfram é que calquera programa de linguaxe Wolfram, en calquera lugar, pode usar funcións del. Se un programa aparece nun bloc de notas, adoita ser conveniente formatar as funcións do repositorio como funcións de "obxecto binario de funcións" fáciles de ler (quizais cun conxunto de versións axeitado).

Sempre podes acceder a calquera función do repositorio de funcións mediante texto Función de recursos[...]. E isto é moi conveniente se escribes código ou scripts directamente para o Wolfram Engine, por exemplo, con usando un IDE ou un editor de código de texto (Debe destacarse especialmente que o repositorio de funcións é totalmente compatible con Wolfram Engine gratuíto para programadores).

Como funciona isto?

Dentro das funcións do repositorio Wolfram isto é posible usando exactamente o mesmo sistemas de recursos bases, como en todos os outros repositorios existentes (almacen de datos, Repositorio de redes neuronais, colección de proxectos de demostración etc.), como todos os outros recursos do sistema Wolfram, Función de recursos en última instancia, baseado na función ResourceObject.

Considerar Función de recursos:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

No seu interior podes ver algunha información usando a función información:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Como funciona a configuración dunha función de recurso? O máis sinxelo é un caso puramente local. Aquí tes un exemplo que toma unha función (neste caso só unha función pura) e a define como unha función de recurso para unha determinada sesión do programa:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Unha vez feita a definición, pode usar a función de recursos:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

Teña en conta que hai unha icona negra nesta función Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram. Isto significa que a función BLOB fai referencia á función de recursos en memoria definida para a sesión actual. Unha función de recurso que se almacena permanentemente no teu ordenador ou conta na nube ten unha icona gris Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram. E hai unha icona laranxa para unha función de recurso oficial no Repositorio de funcións de Wolfram Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram.

Entón, que ocorre cando usas o menú Expandir no caderno de definicións? En primeiro lugar, toma todas as definicións do bloc de notas e a partir delas crea un simbólico ResourceObject). (E se estás a usar un IDE ou programa baseado en texto, tamén podes crear de forma explícita ResourceObject)

A implantación local dunha función desde un repositorio do seu ordenador realízase mediante o comando LocalCache para que un obxecto de recurso o garde como LocalObject no seu sistema de ficheiros. A implantación nunha conta na nube realízase mediante o comando CloudDeploy para un obxecto de recurso, e un despregue de nube pública é CloudPublish. En todos os casos Rexistro de recursos tamén se usa para rexistrar o nome da función do recurso, polo tanto Función de recursos["nome"] funcionará.

Se fai clic no botón Enviar para un repositorio de funcións, o que ocorre debaixo del Enviar recurso chamado a un obxecto de recurso. (E se está a usar unha interface de entrada de texto, tamén pode chamar Enviar recurso directamente).

Por defecto, os envíos realízanse co nome asociado ao teu ID de Wolfram. Pero se estás a enviar unha solicitude en nome dun equipo ou organización de desenvolvemento, podes facelo establecer un ID de editor separado e úsao como nome para interactuar coas túas opinións.

Despois de enviar algunha das súas funcións á base de coñecemento de funcións, quedará en cola para a súa revisión. Se recibes comentarios como resposta, normalmente terán a forma dun ficheiro de texto con "celas de comentarios" adicionais engadidas. Sempre podes consultar o estado da túa solicitude visitando portal de membros do sistema de recursos. Pero unha vez que a túa función sexa aprobada, recibirás unha notificación (por correo electrónico) e a túa función publicarase no repositorio de funcións de Wolfram.

Algunhas sutilezas no traballo

A primeira vista pode parecer que só podes coller un caderno de definicións e poñelo textualmente nun repositorio de funcións, non obstante, en realidade hai moitas sutilezas implicadas, e manexalas require facer unha metaprogramación bastante complexa, manexar o procesamento simbólico. como o código que define a función e o propio Bloc de notas está definido. A maior parte disto ocorre internamente, entre bastidores, pero pode ter algunhas implicacións que paga a pena comprender se vas contribuír á base de coñecemento de funcións.

Primeira sutileza inmediata: cando enche o caderno de definicións, pode simplemente facer referencia á súa función en todas partes usando un nome como A miña función, que parece un nome normal para unha función no Wolfram Language, pero para a documentación do repositorio de funcións substitúese Función de recursos["A miña función"] é o que realmente usarán os usuarios cando traballen coa función.

A segunda sutileza: cando crea unha función de recurso desde o caderno de definicións, todas as dependencias implicadas na definición da función deben ser capturadas e incluídas explícitamente. Non obstante, para garantir que as definicións sigan sendo modulares, cómpre poñer todo nun único espazo de nomes. (Por suposto, funcións que o fan todo, están no repositorio de funcións.)

Normalmente nunca verá ningún rastro do código usado para configurar este espazo de nomes. Pero se por algún motivo chamas a un símbolo pouco executado dentro da túa función, verás que este símbolo está no contexto interno da función. Non obstante, ao procesar o Bloc de notas de definición, polo menos o símbolo correspondente á propia función é axustable para a mellor visualización como un BLOB funcional en lugar de un personaxe en bruto no contexto interno.

O repositorio de funcións serve para definir novas funcións. E estas funcións poden ter opcións. Moitas veces estes parámetros (por exemplo, Método ou Tamaño da imaxe) poderá utilizarse para funcións integradas, así como para aquelas para as que xa existan símbolos incorporados. Pero ás veces unha función nova pode requirir novas opcións. Para manter a modularidade, estes parámetros deben ser símbolos definidos nun contexto interno único (ou algo así como funcións de recursos completos, é dicir, eles mesmos). Para simplificar, o repositorio de funcións permítelle definir novas opcións nas definicións de cadeas. E para comodidade do usuario, estas definicións (supoñendo que usasen OptionValue и OpciónsPatrón) tamén se procesan para que, ao usar funcións, os parámetros poidan especificarse non só como cadeas, senón tamén como símbolos globais co mesmo nome.

A maioría das funcións simplemente fan o que se supón que deben facer cada vez que son chamadas, pero algunhas funcións deben ser inicializadas antes de que poidan executarse nunha sesión concreta, e para resolver este problema, hai unha sección "Inicialización" na sección Definición.

As funcións dun repositorio poden usar outras funcións que xa están no repositorio; para configurar definicións para un repositorio de funcións que inclúan dúas (ou máis) funcións que se refiren entre si, debes implementalas na sesión do programa para que poidas referencia como sobre eles Función de recursos["nome"], entón podes crear as combinacións destas funcións que necesites, exemplos (non entendín) e engadir unha nova función ao repositorio baseada nas xa publicadas anteriormente. (ou xa ou anteriormente: ambas palabras son torpes)

Perspectivas de desenvolvemento. Que debería pasar cando o repositorio se fai realmente grande?

Hoxe acabamos de lanzar o Repositorio de funcións de Wolfram, pero co paso do tempo esperamos que o seu tamaño e funcionalidade poidan aumentar drasticamente, e a medida que vaia crendo no seu desenvolvemento haberá varios problemas que xa anticipamos que poden xurdir.

O primeiro problema refírese aos nomes das funcións e á súa singularidade. O repositorio de funcións está deseñado de tal xeito que, como as funcións integradas no Wolfram Language, podes facer referencia a calquera función determinada simplemente especificando o seu nome. Pero isto significa inevitablemente que os nomes das funcións deben ser globalmente únicos en todo o repositorio, polo que, por exemplo, só pode haber un Función de recursos["A miña función favorita"].

Isto pode parecer un gran problema ao principio, pero paga a pena entender que é basicamente o mesmo problema que para cousas como dominios de Internet ou manexos de redes sociais. E o feito é que o sistema simplemente necesita ter un rexistrador, e este é un dos roles que a nosa empresa desempeñará para a base de coñecemento da función Wolfram. (Para versións privadas dun repositorio, os seus rexistradores poden ser administradores.) Por suposto, un dominio de Internet pódese rexistrar sen ter nada nel, pero nun repositorio de funcións só se pode rexistrar un nome de función se hai unha definición real de a función.

Parte do noso papel na xestión da base de coñecemento da función Wolfram é asegurarnos de que o nome elixido para unha función é lóxico dada a definición da función e que segue as convencións de nomenclatura de Wolfram Language. Temos máis de 30 anos de experiencia nombrando funcións integradas no Wolfram Language, e o noso equipo de comisarios tamén achegará esa experiencia ao repositorio de funcións. Por suposto, sempre hai excepcións. Por exemplo, pode parecer preferible ter un nome curto para algunha función, pero é mellor "defender" cun nome máis longo e específico porque é menos probable que se atope con alguén que queira crear un nome de función similar no futuro. .

(Hai que ter en conta que simplemente engadir algunha etiqueta de membro para desambiguar funcións non terá o efecto desexado. Porque a non ser que insistas en asignar sempre unha etiqueta, terás que definir unha etiqueta predeterminada para calquera función determinada e tamén asignar etiquetas de autor. , que de novo requiriría unha coordinación global.)

A medida que crece a base de coñecemento das funcións de Wolfram, un dos problemas que probablemente xurda é a descuberta das funcións, para a que o sistema proporciona función de busca (e os ficheiros de definición poden incluír palabras clave, etc.). Para as funcións integradas no Wolfram Language, hai todo tipo de referencias cruzadas na documentación para axudar a "publicar" as funcións. As funcións dun repositorio de funcións poden facer referencia a funcións integradas. Pero e ao revés? Para iso, imos experimentar con diferentes deseños para expoñer as funcións do repositorio nas páxinas de documentación das funcións integradas.

Para as funcións integradas no Wolfram Language hai unha chamada capa de detección proporcionada por rede de "páxinas de axuda", que proporcionan listas organizadas de funcións relacionadas con áreas específicas. Sempre é difícil equilibrar correctamente as páxinas de manual e, a medida que a linguaxe Wolfram crece, moitas veces as páxinas de manual deben reorganizarse completamente. É bastante doado poñer as funcións dun repositorio en categorías amplas, e mesmo desglosar esas categorías de forma consistente, pero é moito máis valioso ter páxinas de referencia lingüísticas ben organizadas. Aínda non está claro a mellor forma de crealos para toda a base de coñecemento de funcións. Por exemplo, Crear unha galería de obxectos de recursos no repositorio de funcións, calquera pode publicar unha páxina web que conteña as súas "escollidas" do repositorio:

Repositorio de funcións de Wolfram: plataforma de acceso aberto para extensións de linguaxe Wolfram

O repositorio de funcións de Wolfram está configurado como un repositorio de funcións persistentes, onde calquera función nel sempre funcionará. Por suposto, poden estar dispoñibles novas versións de funcións e esperamos que algunhas funcións queden obsoletas co paso do tempo. As funcións funcionarán se se usan en programas, pero as súas páxinas de documentación enlazarán a funcións novas e máis avanzadas.

O repositorio de funcións de Wolfram está deseñado para axudarche a descubrir rapidamente novas funcións e aprender novas formas de usar a linguaxe Wolfram. Estamos moi optimistas de que parte do que se explorou no repositorio de funcións acabará por ter sentido para converterse en partes integradas do núcleo de Wolfram Language. Durante a última década tivemos un conxunto similar características que foron introducidas orixinalmente en Wolfram | Alfa. E unha das leccións aprendidas desta experiencia é que acadar os estándares de calidade e coherencia nos que nos centramos en todo o que se integra na linguaxe Wolfram require moito traballo, que moitas veces é máis difícil que o esforzo inicial para implementar a idea. Aínda así, unha función na base de coñecemento de funcións pode servir como unha proba de concepto moi útil para unha función futura que eventualmente se integrará na linguaxe Wolfram.

O máis importante aquí é que unha función nun repositorio de funcións é algo que todos os usuarios poden usar agora mesmo. É posible que unha función na lingua nativa sexa moito mellor e máis rendible, pero un repositorio de funcións permitiría aos usuarios ter acceso a todas as novas funcións de inmediato. E, o máis importante, este concepto permite a todos engadir as novas funcións que queiran.

Antes na historia da linguaxe Wolfram, esta idea non tería funcionado tan ben como o ten, pero nesta fase hai tanto esforzo posto na linguaxe, e unha comprensión tan profunda dos principios de deseño da linguaxe, que agora parece moi posible para unha gran comunidade de usuarios engadir funcións que manterán a coherencia do deseño para facelos útiles para unha ampla gama de usuarios.

Hai un incrible espírito de talento(?) na comunidade de usuarios de Wolfram Language. (Por suposto, esta comunidade inclúe moitas persoas líderes en I+D nunha variedade de campos.) Espero que o Repositorio de funcións de Wolfram proporcione unha plataforma eficaz para desbloquear e difundir este espírito de talento. Só xuntos podemos crear algo que amplíe significativamente a área á que se pode aplicar o paradigma de computación en linguaxe Wolfram.

En máis de 30 anos, percorremos un longo camiño coa linguaxe Wolfram. Agora xuntos, imos aínda máis alá. Animo encarecidamente a todos os usuarios respectados da linguaxe Wolfram en todo o mundo a que utilicen o repositorio funcional como plataforma para iso, así como o novo proxecto de software como o Free Wolfram Engine for Developers.

Fonte: www.habr.com

Engadir un comentario