Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Witaj, Habro! Zwracam uwagę na tłumaczenie wpisu Stephena Wolframa „Repozytorium funkcji Wolfram: uruchomienie otwartej platformy rozszerzającej język Wolfram”.

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Warunki wstępne spójności języka Wolfram

Dziś stoimy u progu wielkich osiągnięć razem z językiem programowania Język Wolfram. Zaledwie trzy tygodnie temu wystartowaliśmy darmowy silnik Wolfram dla programistówaby pomóc naszym użytkownikom zintegrować język Wolfram z ich dużymi projektami oprogramowania. Dziś startujemy Repozytorium funkcji Wolfram, aby zapewnić skoordynowaną platformę dla funkcji stworzonych w celu rozszerzenia języka Wolfram, a także otwieramy repozytorium funkcji dla każdego, kto może przyczynić się do rozwoju naszego oprogramowania.

Repozytorium funkcji Wolfram jest możliwe dzięki wyjątkowej naturze języka Wolfram nie tylko jako języka programowania, ale także jako język obliczeniowy na pełną skalę. W tradycyjnych językach programowania dodanie znaczącej nowej funkcjonalności zwykle wiąże się z utworzeniem całych dodatkowych bibliotek, które mogą, ale nie muszą, działać razem. Jednak w języku Wolfram tak wiele jest już wbudowane w sam język, że można znacznie rozszerzyć jego funkcjonalność, po prostu dodając nowe funkcje, które są natychmiast integrowane w całościową strukturę całego języka.

Na przykład repozytorium funkcji Wolfram już zawiera 532 nowe funkcje podzielone na 26 kategorii tematycznych:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Podobnie więcej niż 6000 standardowych funkcji, wbudowanej w język Wolfram, każda funkcja z repozytorium posiada stronę z dokumentacją z ich szczegółowym opisem i przykładami pracy:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Aby dostać się na stronę należy skopiować powyższy obiekt (funkcja BLOB), wkleić go do linii wejściowej i następnie uruchomić funkcję - jest ona już wbudowana w język Wolfram i domyślnie obsługiwana zaczynając od wersja 12.0:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Należy tutaj zauważyć, że podczas przetwarzania LogoQRCod Nie musisz na przykład konfigurować „biblioteki przetwarzania obrazów” - ponieważ w języku Wolfram zaimplementowaliśmy już spójny i starannie algorytmiczny sposób przetwarzanie obrazu, które mogą być natychmiast przetwarzane przez różne funkcje języka graficznego:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Mam nadzieję, że przy wsparciu wspaniała i utalentowana społeczność, który rozwijał się i rozwijał (w oparciu o język Wolfram) przez ostatnie kilka dekad. Repozytorium funkcji Wolfram pozwoli w najbliższej przyszłości znacznie rozszerzyć zakres (być może potencjalnie znaczących, wyspecjalizowanych w różnych dziedzinach nauki i technologii) funkcji dostępnych w języku. W ten sposób możliwe staje się wykorzystanie zarówno treści języka (jego wbudowanych funkcji), jak i zasady rozwoju, które są implementowane w oparciu o język. (Należy tutaj zauważyć, że język Wolfram ma już ponad 30-letnia historia rozwoju i stabilnego wzrostu).
Funkcje z repozytorium mogą zawierać małe lub duże fragmenty kodu napisane w języku Wolfram. Mogą to być na przykład połączenia zewnętrzne interfejsy API i usługi lub zewnętrzne biblioteki w innych językach. Unikalną cechą tego podejścia jest to, że gdy dojdziesz do funkcjonalności na poziomie użytkownika, nie będzie żadnych potencjalnych niespójności, ponieważ podejście jest zbudowane na spójnej strukturze języka Wolfram – a każda funkcja będzie automatycznie działać poprawnie – dokładnie tak, jak zamierzona. Powinna.
Powłoka i struktura programowa repozytorium funkcji Wolfram zostały zaprojektowane tak, aby każdy mógł przyczynić się do wspólnej sprawy w najprostszy i najwygodniejszy dla siebie sposób - w rzeczywistości po prostu wypełniając plik tekstowy notatnika (z rozszerzeniem nb) WL. Wbudowane funkcje automatyczne pozwalają sprawdzić nowe funkcje dodane do repozytorium pod kątem ich integracji z językiem. Nasza firma stawia na szeroką gamę użytkowników, którzy będą w stanie zintegrować swoje funkcje z językiem, a nie na ogromną złożoność nowych funkcji - i choć istnieje proces przeglądu, nie nalegamy na coś takiego żmudną analizę projektu lub rygorystyczne standardy dotyczące kompletności i niezawodności nowych funkcji użytkownika, w przeciwieństwie do bardziej rygorystycznego testowania funkcji wbudowanych w podstawowy język, którego używamy.

W tym podejściu istnieje wiele kompromisów i szczegółów, ale naszym celem jest optymalizacja repozytorium funkcji Wolfram zarówno pod kątem wygody użytkownika, jak i zapewnienia, że ​​nowe funkcje użytkownika znacząco przyczynią się do rozwoju języka. Nie mam wątpliwości, że w miarę rozwoju będziemy musieli wynaleźć nowe metody obsługi i sprawdzania poprawności funkcji wbudowanych w repozytorium, zwłaszcza w zakresie organizowania dużej liczby funkcji i znajdowania tych, których potrzebują użytkownicy. Pocieszające jest jednak to, że droga, którą wybraliśmy, to dobry początek. ja osobiście dodał kilka funkcji do oryginalnej bazy danych. Wiele z nich opiera się na kodzie, który osobiście opracowywałem od dłuższego czasu. Wypchnięcie ich do repozytorium zajęło mi tylko kilka minut. Teraz, gdy znajdują się w repozytorium, mogę wreszcie – od razu i w dowolnym momencie – skorzystać z tych funkcji według potrzeb, bez konieczności martwienia się o wyszukiwanie plików, pobieranie pakietów itp.

Zwiększenie wydajności przy jednoczesnej redukcji kosztów

Jeszcze przed pojawieniem się Internetu istniały sposoby udostępniania kodu języka Wolfram (naszym pierwszym dużym scentralizowanym projektem był Źródło matematyki, stworzony dla Mathematica w 1991 roku w oparciu o CD-ROM itp.). Oczywiście podejście zaproponowane do wdrożenia w oparciu o repozytorium funkcji Wolfram jest potężniejszym i niezawodnym narzędziem do realizacji powyższych zadań.

Od ponad 30 lat nasza firma pilnie pracuje nad utrzymaniem integralności struktury języka Wolfram, co ma kluczowe znaczenie dla zapewnienia, że ​​język Wolfram stanie się nie tylko językiem programowania, ale także językiem pełnoprawny język komputerowy. I tak, istotą podejścia do implementacji repozytorium funkcji Wolfram jest zastosowanie ujednoliconego podejścia do programowania i rozwijania nowych funkcji, które są sekwencyjnie dodawane i wpasowywane w ramy języka, aby mógł się on rozwijać i współewoluować.

W strukturze implementacyjnej każdej funkcji zachodzą różne procesy obliczeniowe. Należy w tym miejscu zaznaczyć, że konieczne jest, aby funkcja miała przejrzysty i jednolity wygląd oraz czytelność wizualną dla użytkownika. W tym kontekście wbudowane funkcje języka Wolfram zostały zaprezentowane z ponad 6000 kolejnych przykładów prawidłowego programowania funkcji (to są nasze filmy z programowania na żywoktóry zawiera setki godzin procesu tworzenia standardowych programów). Tym, co ostatecznie sprawia, że ​​repozytorium funkcji Wolfram może dobrze działać, jest strukturalna natura języka Wolfram z dużą liczbą dodatkowych i różnorodnych bibliotek, które są już wbudowane w język. Na przykład, jeśli masz funkcję przetwarzającą obrazy lub rzadkie tabliceLub struktury molekularnea także dane geograficzne lub jakieś inne - ich spójna reprezentacja symboliczna już istnieje w języku, dzięki czemu Twoja funkcja od razu staje się kompatybilna z innymi funkcjami w języku.

Stworzenie repozytorium, które faktycznie działa dobrze, jest interesującym zadaniem metaprogramowania. Przykładowo nadmiar ograniczeń w programie nie pozwoli na uzyskanie wymaganej unifikacji i uniwersalności algorytmu. Podobnie jak w przypadku niewystarczającej liczby ograniczeń funkcjonalnych, tak i tak nie uda się zaimplementować dostatecznie poprawnej sekwencji wykonania algorytmu. Kilka wcześniejszych przykładów wdrożenia kompromisu tych podejść, wdrożonych przez naszą firmę, sprawdziło się w miarę stabilnie - są to: Demonstracje projektu Tungsten, uruchomiona w 2007 roku i obecnie dostępna online, zawierająca ponad 12000 XNUMX interaktywnych wersji demonstracyjnych. W Baza danych Wolframa istnieje ponad 600 gotowych baz danych, z których można korzystać w języku Wolfram, oraz Pamięć sieci neuronowej Wolfram jest uzupełniany o nowe sieci neuronowe niemal co tydzień (jest ich już 118) i są one natychmiastowo łączone poprzez funkcję Model sieciowy w języku Wolfram.

Wszystkie powyższe przykłady mają zasadniczą cechę – zebrane w projekcie obiekty i funkcje charakteryzują się bardzo wysokim stopniem uporządkowania i rozkładu procesów. Oczywiście szczegóły struktury wersji demonstracyjnej, sieci neuronowej lub czegoś innego mogą się znacznie różnić, ale podstawowa struktura każdego bieżącego repozytorium zawsze pozostaje taka sama. Jaka jest więc Twoja opinia, drogi użytkowniku, na temat stworzenia takiego repozytorium, które dodaje rozszerzenia do języka Wolfram? Język Wolfram został zaprojektowany tak, aby był niezwykle elastyczny, dzięki czemu można go w dowolny sposób rozszerzać i modyfikować. Ta okoliczność jest niezwykle ważna dla możliwości szybkiego tworzenia różnych projektów oprogramowania na dużą skalę w języku Wolfram. Należy w tym miejscu zaznaczyć, że wraz ze wzrostem elastyczności języka, koszt projektów realizowanych w takim języku nieuchronnie będzie rósł. Wynika to z faktu, że im częściej użytkownik korzysta z takiego języka, tym bardziej dedykowaną funkcjonalność otrzymuje, jednak nie należy zapominać, że takie podejście może mieć również negatywne strony w postaci niemożności zapewnienia spójnej spójności modułów programu.

Z bibliotekami w tradycyjnych językach programowania jest częsty problem – jeśli użyjesz np. jednej biblioteki, kod będzie działał poprawnie, natomiast jeśli spróbujesz użyć wielu bibliotek, to nie ma gwarancji, że będą one poprawnie ze sobą współdziałać . Ponadto w tradycyjnych językach programowania – w przeciwieństwie do pełnoprawnego języka obliczeniowego – nie ma możliwości zagwarantowania obecności spójnych wbudowanych reprezentacji jakichkolwiek funkcji lub typów danych innych niż ich podstawowe struktury. Ale w rzeczywistości problem jest jeszcze większy, niż się wydaje na pierwszy rzut oka: jeśli buduje się pion funkcjonalności na dużą skalę, to bez ogromnych kosztów scentralizowanego programowania projektów, które wkładamy w język Wolfram, nie da się tego zrobić osiągnąć spójność. Dlatego ważne jest, aby wszystkie moduły oprogramowania zawsze poprawnie ze sobą współpracowały.

Zatem ideą repozytorium funkcji Wolfram jest uniknięcie problemu opisanego powyżej poprzez proste dodanie rozszerzeń języka w stosunkowo małych fragmentach kodu za pośrednictwem indywidualnych funkcji, które łatwiej jest rozwijać jako spójne moduły. Biorąc to pod uwagę, istnieją funkcje programowania, których nie można zapewnić w sposób wygodny przy użyciu poszczególnych funkcji (a nasza firma planuje w najbliższej przyszłości wypuścić zoptymalizowany algorytm programowania, który pomoże we wdrażaniu pakietów oprogramowania na dużą skalę). Jednak w oparciu o funkcje już wbudowane w język Wolfram istnieje wiele możliwości programowania, które są realizowane w oparciu o indywidualne funkcje. Pomysł jest taki, że przy stosunkowo niewielkim wysiłku programistycznym można stworzyć szereg nowych i bardzo przydatnych funkcji, które zapewnią projektowi wystarczającą spójność, będą ze sobą dobrze skoordynowane, a ponadto będą będą mogły być w przyszłości łatwo i szeroko stosowane w tym języku.

Takie podejście jest oczywiście kompromisem. Gdyby zaimplementowano większy pakiet, można by sobie wyobrazić zupełnie nowy świat funkcjonalności, który byłby niezwykle potężny i użyteczny. Jeśli istnieje potrzeba uzyskania nowej funkcjonalności, która będzie pasować do wszystkiego innego, ale nie chcesz wkładać dużego wysiłku w rozwój projektu, może to niestety prowadzić do zmniejszenia zakresu Twojego projektu. Ideą repozytorium funkcji Wolfram jest zapewnienie funkcjonalności określonej części projektu; takie podejście doda potężną funkcjonalność, jednocześnie ułatwiając utrzymanie dobrej spójności w projekcie programistycznym.

Pomoc w dodawaniu funkcji niestandardowych do repozytorium funkcji

Nasz zespół ciężko pracował, aby ułatwić użytkownikom współtworzenie funkcji repozytorium Wolfram. Na pulpicie (już w wersja 12.0), możesz po prostu przechodzić kolejno przez zakładki menu głównego: Plik > Nowy > RepositoryItem > Element repozytorium funkcji, a otrzymasz „Definicja Notatnik" (programowo w środowisku warsztatowym. Możesz także użyć funkcji analogowej - UtwórzNotatnik[„Zasób funkcji”]):

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Istnieją dwa główne kroki, które musisz wykonać: po pierwsze, zapisz kod swojej funkcji, a po drugie, zapisz dokumentację ilustrującą, jak powinna działać Twoja funkcja.
Kliknij przycisk „Otwórz próbkę” u góry, aby zobaczyć przykład czynności, które należy wykonać:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Zasadniczo próbujesz stworzyć coś podobnego do wbudowanej funkcji w języku Wolfram. Tyle że może zrobić coś znacznie bardziej szczegółowego niż funkcja wbudowana. Jednocześnie oczekiwania co do jego kompletności i niezawodności będą znacznie niższe.
Musisz nadać swojej funkcji nazwę zgodną z wytycznymi dotyczącymi nazewnictwa funkcji języka Wolfram. Ponadto będziesz musiał opracować dokumentację swojej funkcji, podobną do wbudowanych funkcji języka. Opowiem o tym bardziej szczegółowo później. Na razie zwróć uwagę, że w rzędzie przycisków u góry pliku notatnika definicji znajduje się przycisk „Wytyczne dotyczące stylu”, który wyjaśnia, co należy zrobić, oraz przycisk Narzędzia, który udostępnia narzędzia do formatowania dokumentacji funkcji.
Kiedy już będziesz pewien, że wszystko zostało poprawnie wypełnione i jesteś gotowy, kliknij przycisk „Sprawdź”. To zupełnie normalne, że nie wymyśliłeś jeszcze wszystkich szczegółów. Zatem funkcja „Sprawdź” zostanie uruchomiona automatycznie i wykona wiele kontroli stylu i spójności. Często natychmiast wyświetli monit o potwierdzenie i zaakceptowanie poprawek (na przykład: „Ta linia musi kończyć się dwukropkiem” i poprosi o wprowadzenie dwukropka). Czasami poprosi Cię o samodzielne dodanie lub zmianę czegoś. Będziemy stale dodawać nowe funkcje do automatycznej funkcjonalności przycisku Sprawdź, ale zasadniczo jego celem jest upewnienie się, że wszystko, co przesyłasz do repozytorium funkcji, jest już ściśle zgodne z jak największą liczbą wytycznych dotyczących stylu

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Tak więc po uruchomieniu „Sprawdź” możesz użyć „Podglądu”. „Podgląd” tworzy podgląd strony dokumentacji zdefiniowanej dla Twojej funkcji. Możesz także utworzyć podgląd pliku utworzonego na komputerze lub pliku znajdującego się w chmurze. Jeśli z jakiegoś powodu nie jesteś zadowolony z tego, co widzisz na podglądzie, po prostu wróć i dokonaj niezbędnych poprawek, a następnie ponownie kliknij przycisk Podgląd.
Teraz możesz już wypchnąć swoją funkcję do repozytorium. Przycisk Wdróż udostępnia cztery opcje:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Ważną rzeczą na tym etapie jest to, że możesz przesłać swoją funkcję do repozytorium funkcji Wolfram, aby była dostępna dla każdego. Jednocześnie możesz także umieścić swoją funkcję dla ograniczonej liczby użytkowników. Można na przykład utworzyć funkcję hostowaną lokalnie na komputerze, aby była dostępna podczas korzystania z tego konkretnego komputera. Możesz też opublikować to w swoim konto w chmurze, aby był dostępny po podłączeniu do chmury. Możesz także publicznie hostować (wdrażać) tę funkcję za pośrednictwem swojego konta w chmurze. Nie będzie jej w centralnym repozytorium funkcji Wolfram, ale będziesz mógł podać komuś adres URL, który umożliwi mu pobranie Twojej funkcji z Twojego konta. (W przyszłości będziemy także obsługiwać repozytoria centralne w całej naszej firmie.)

Załóżmy, że chcesz faktycznie przesłać swoją funkcję do bazy wiedzy o funkcjach Wolfram. W tym celu klikasz przycisk „Prześlij” do repozytorium. Co więc dzieje się w tej chwili? Twoje zgłoszenie zostanie natychmiast umieszczone w kolejce do sprawdzenia i zatwierdzenia przez nasz oddany zespół kuratorów.

W miarę postępów procesu zatwierdzania Twojego wniosku (który zwykle trwa kilka dni) będziesz otrzymywać powiadomienia dotyczące jego statusu i ewentualne sugestie dotyczące przyszłego wykorzystania. Jednak gdy funkcja zostanie zatwierdzona, zostanie ona natychmiast opublikowana w repozytorium funkcji Wolfram i będzie dostępna dla każdego. (I to pojawi się w podsumowania wiadomości dotyczące nowych funkcji i tak dalej)

Co powinno znaleźć się w magazynie?

Należy zauważyć, że nasza firma ma bardzo wysokie standardy dotyczące kompletności, niezawodności i ogólnej jakości, a spośród ponad 6000 funkcji, które wbudowaliśmy już w język Wolfram w ciągu ostatnich 30 lat, wszystkie spełniają powyższe wymagania. Celem repozytorium funkcji Wolfram jest wykorzystanie całej struktury i funkcjonalności, która już istnieje w języku Wolfram, aby dodać jak najwięcej lżejszych funkcji (tj. funkcji o wyższej wydajności).

Oczywiście funkcje w repozytorium funkcji Wolfram muszą być zgodne z zasadami projektowania języka Wolfram - aby mogły w pełni współdziałać z innymi funkcjami i oczekiwaniami użytkowników co do prawidłowego działania funkcji. Jednakże funkcje nie muszą być jednakowo kompletne i niezawodne.

W przypadku wbudowanych funkcji języka Wolfram ciężko pracujemy, aby funkcje programowania były jak najbardziej ogólne. Biorąc to pod uwagę, gdy w repozytorium funkcji Wolfram nie ma nic złego w posiadaniu w nim funkcji, która po prostu obsługuje bardzo konkretny, ale użyteczny przypadek. Na przykład funkcja Wyślij pocztę z notatnika może odbierać pliki w jednym określonym formacie i tworzyć pocztę w jeden określony sposób. Schemat wielokątny tworzy wykresy z określonymi kolorami i etykietami itp.

Kolejną kwestią związaną z wbudowanymi funkcjami jest to, że nasza firma dokłada wszelkich starań, aby obsłużyć wszystkie nietypowe przypadki, poprawnie obsłużyć nieprawidłowe dane wejściowe i tak dalej. W repozytorium funkcji normalne jest, że istnieje specjalna funkcja, która zajmuje się głównymi przypadkami rozwiązania problemu i ignoruje wszystkie inne.

Oczywistym punktem jest to, że lepiej mieć funkcje, które robią więcej i robią to lepiej, ale optymalizacja pod kątem repozytorium funkcji – w przeciwieństwie do wbudowanych funkcji języka Wolfram – powinna mieć więcej funkcji w pakiecie z większą liczbą funkcji, zamiast zagłębiać się w procesy wdrażania każdej konkretnej funkcji.

Przyjrzyjmy się teraz przykładowi testowania funkcji w repozytorium. Oczekiwania dotyczące spójności dla takich funkcji są naturalnie znacznie niższe niż w przypadku wbudowanych funkcji językowych. Jest to szczególnie prawdziwe w przypadkach, gdy funkcje zależą od zasobów zewnętrznych, takich jak API, ważne jest, aby stale przeprowadzać spójne testy, co dzieje się automatycznie w ramach algorytmów weryfikacji. W pliku nb można jawnie określić definicje (w sekcji Informacje dodatkowe) i określić tyle testów, ile zdefiniowano w ciągach wejściowych i wyjściowych lub obiektach pełnoznakowych typu Test weryfikacyjny, o ile uznasz to za stosowne. Ponadto system stale próbuje przekształcić podane przez Ciebie przykłady dokumentacji w proces weryfikacji (czasami może to wymagać dużego zaangażowania zasobów, na przykład w przypadku funkcji, której wynik zależy od liczb losowych lub pory dnia).

W rezultacie repozytorium funkcji będzie miało wiele złożoności implementacyjnych. Niektóre będą składać się z pojedynczej linii kodu, inne mogą obejmować tysiące lub dziesiątki tysięcy linii, prawdopodobnie wykorzystujących wiele funkcji pomocniczych. Kiedy warto dodać funkcję wymagającą zdefiniowania bardzo małej ilości kodu? Zasadniczo, jeśli dla funkcji istnieje dobra nazwa mnemoniczna, który użytkownicy z łatwością zrozumieliby, gdyby zobaczyli go w fragmencie kodu, to można go już dodać. W przeciwnym razie prawdopodobnie lepiej będzie po prostu ponownie dołączyć kod do programu za każdym razem, gdy będziesz go potrzebował.

Głównym celem repozytorium funkcji (jak sama nazwa wskazuje) jest wprowadzenie nowych funkcji do języka. Jeśli chcesz dodać nowe dane lub nowe podmioty, używać Repozytorium danych Wolfram. A co jeśli chcesz wprowadzić do swoich obliczeń nowe typy obiektów?

Właściwie są dwa sposoby. Możesz chcieć wprowadzić nowy typ obiektu, który będzie używany w nowych funkcjach w repozytorium funkcji. W tym przypadku zawsze możesz po prostu zapisać jego symboliczną reprezentację i użyć jej podczas wprowadzania lub wyprowadzania funkcji w repozytorium funkcji.

Ale co, jeśli chcesz reprezentować obiekt, a następnie zdefiniować, za pomocą istniejących funkcji w języku Wolfram, że chcesz z nim pracować? Język Wolfram zawsze miał do tego lekki mechanizm, zwany Wartości w górę. Z pewnymi ograniczeniami (szczególnie w przypadku funkcji, które nie potrafi ocenić ich argumentów), repozytorium funkcji pozwala po prostu reprezentować funkcję i definiować dla niej wartości. (Podniesienie oczekiwań spójności podczas tworzenia nowego głównego projektu, który jest w pełni zintegrowany z całym językiem Wolfram, jest ogólnie bardzo ważną procedurą, której nie można osiągnąć poprzez zwykłe zwiększenie kosztów projektu i jest czymś, co nasza firma robi w ramach projektów dla długoterminowego rozwoju języka zadanie to nie jest celem stawianym w ramach rozwoju repozytorium).

Co zatem może znajdować się w kodzie funkcji w repozytorium funkcji? Wszystko wbudowane w język Wolfram, oczywiście (przynajmniej jeśli nie reprezentuje zagrożenia dla Bezpieczeństwo i wydajności samego programu, jako środowiska obliczeniowego), a także dowolną funkcję z repozytorium funkcji. Istnieją jednak inne funkcjonalności: funkcja w repozytorium funkcji może wywołać API lub in Chmura WolframaLub z innego źródła. Oczywiście wiążą się z tym pewne zagrożenia. Z uwagi na to, że nie ma gwarancji, że API się nie zmieni, a funkcja w magazynie funkcji przestanie działać. Aby pomóc w zidentyfikowaniu takich problemów, na stronie dokumentacji (w sekcji Wymagania) znajduje się uwaga dotycząca każdej funkcji, która opiera się na czymś więcej niż tylko wbudowanej funkcjonalności języka Wolfram. (Oczywiście, jeśli chodzi o dane rzeczywiste, nawet z tą funkcjonalnością mogą być problemy - ponieważ dane świata rzeczywistego ciągle się zmieniają, a czasem nawet zmieniają się ich definicje i struktura.)

Czy cały kod repozytorium funkcji Wolfram powinien być napisany w Wolfram? Z pewnością kod wewnątrz zewnętrznego API nie powinien być napisany w języku Wolfram, który nawet nie tworzy kodu języka. Tak naprawdę, jeśli znajdziesz funkcję w niemal dowolnym zewnętrznym języku lub bibliotece, możesz utworzyć opakowanie, które umożliwi jej użycie w repozytorium funkcji Wolfram. (Zwykle powinieneś używać do tego wbudowanych funkcji Zewnętrzna ocena lub Funkcja zewnętrzna w kodzie języka Wolfram.)

Jaki jest więc sens to robić? Zasadniczo pozwala to na wykorzystanie całego zintegrowanego systemu Wolfram Language i całego jego ujednoliconego zestawu możliwości oprogramowania. Jeśli uzyskasz podstawową implementację z zewnętrznej biblioteki lub języka, możesz następnie użyć bogatej struktury symbolicznej języka Wolfram, aby stworzyć wygodną funkcję najwyższego poziomu, która pozwoli użytkownikom łatwo korzystać z dowolnej już zaimplementowanej funkcjonalności. Przynajmniej powinno to być wykonalne w idealnym świecie, w którym istnieją wszystkie elementy składowe ładowania bibliotek itp., w którym to przypadku byłyby one obsługiwane automatycznie przez język Wolfram. (Należy zaznaczyć, że w praktyce mogą wystąpić problemy z konfigurowanie języków zewnętrznych określonego systemu komputerowego i przechowywanie w chmurze może powodować dodatkowe problemy związane z bezpieczeństwem).

Nawiasem mówiąc, kiedy po raz pierwszy spojrzysz na typowe biblioteki zewnętrzne, często wydają się one zbyt złożone, aby można je było objąć zaledwie kilkoma funkcjami, ale w wielu przypadkach duża część złożoności wynika z stworzenia infrastruktury potrzebnej bibliotece i wszystkich funkcji do jej obsługi. wspierać to. Jednak w przypadku korzystania z języka Wolfram infrastruktura jest zwykle już wbudowana w pakiety, więc nie ma potrzeby szczegółowego ujawniania wszystkich funkcji pomocniczych, a jedynie tworzenie funkcji dla „najwyższych” funkcji specyficznych dla aplikacji w bibliotece .

„Ekosystem” bazy wiedzy

Jeśli masz napisane funkcje, z których regularnie korzystasz, prześlij je do repozytorium funkcji Wolfram! Jeśli nie wyjdzie z tego coś więcej (rozwój języka), to nawet wtedy znacznie wygodniej będzie Ci korzystać z funkcji do użytku osobistego. Logiczne jest jednak założenie, że jeśli regularnie korzystasz z tych funkcji, być może inni użytkownicy również uznają je za przydatne.

Naturalnie możesz znaleźć się w sytuacji, w której nie możesz – lub nie chcesz – dzielić się swoimi funkcjami lub w przypadku uzyskania dostępu do prywatnych zasobów informacyjnych. Nawet w takich przypadkach możesz po prostu wdrożyć funkcje na własnym koncie w chmurze, określenie praw dostęp do nich. (Jeśli Twoja organizacja ma Chmura prywatna Wolfram Enterprise, wkrótce będzie mógł hostować własne, prywatne repozytorium funkcji, którym będzie można zarządzać z poziomu organizacji i decydować, czy wymuszać wyświetlanie widoków przez użytkowników zewnętrznych.)

Funkcje, które przesyłasz do repozytorium funkcji Wolfram, nie muszą być doskonałe; po prostu muszą być przydatne. Przypomina to trochę sekcję „Błędy” w klasycznej dokumentacji Uniksa – w „Sekcji Definicje” znajduje się sekcja „Notatki autora”, w której możesz opisać ograniczenia, problemy itp., które już znasz na temat swojej funkcji. Dodatkowo, przesyłając obiekt do repozytorium, możesz dodać notatki dotyczące przesłania, które zostaną przeczytane przez dedykowany zespół kuratorów.

Po opublikowaniu obiektu na jego stronie zawsze znajdują się dwa linki u dołu: „Wyślij wiadomość na temat tej funkcji"A"Porozmawiaj w społeczności Wolfram" Jeśli dołączasz notatkę (np. informującą o błędach), możesz zaznaczyć pole informujące, że chcesz, aby Twoja wiadomość i dane kontaktowe zostały udostępnione autorowi funkcji.

Czasami chcesz po prostu użyć funkcji z repozytorium funkcji Wolfram, takich jak funkcje wbudowane, bez sprawdzania ich kodu. Jeśli jednak chcesz zajrzeć do środka, na górze zawsze znajduje się przycisk Notatnik. Kliknij na to, a otrzymasz własną kopię oryginalnego notatnika definicji, który został przesłany do repozytorium funkcji. Czasami możesz po prostu użyć go jako przykładu dla swoich potrzeb. Jednocześnie możesz opracować własną modyfikację tej funkcji. Możesz opublikować te funkcje, które znalazłeś w repozytorium na swoim komputerze lub na koncie przechowywania w chmurze mszyc, być może chcesz przesłać je do bazy wiedzy o funkcjach, być może jako ulepszoną, rozszerzoną wersję oryginalnej funkcji.

W przyszłości planujemy obsługiwać rozwidlanie repozytoriów funkcji w stylu Gita, ale na razie staramy się, aby było to proste i zawsze mamy wbudowaną w język tylko jedną akceptowaną wersję każdej funkcji. Najczęściej (chyba że programiści zrezygnują z utrzymywania opracowanych przez siebie funkcji i odpowiedzą na zgłoszenia użytkowników), pierwotny autor danej funkcji przejmuje kontrolę nad jej aktualizacjami i przesyła nowe wersje, które są następnie sprawdzane i, jeśli przejdą proces recenzji , opublikowane w języku.

Zastanówmy się, jak działa „wersjonowanie” opracowanych funkcji. W tej chwili, gdy korzystasz z funkcji z repozytorium funkcji, jej definicja będzie trwale przechowywana na Twoim komputerze (lub na Twoim koncie w chmurze, jeśli korzystasz z chmury). Jeśli dostępna jest nowa wersja funkcji, przy następnym jej użyciu otrzymasz wiadomość z powiadomieniem. A jeśli chcesz zaktualizować funkcję do nowej wersji, możesz to zrobić za pomocą polecenia Aktualizacja zasobów. („Blob funkcyjny” faktycznie przechowuje więcej informacji o wersji i planujemy udostępnić je naszym użytkownikom w przyszłości.)

Jedną z pięknych rzeczy w repozytorium funkcji Wolfram jest to, że każdy program w języku Wolfram, w dowolnym miejscu, może korzystać z jego funkcji. Jeśli program pojawia się w notatniku, często wygodnie jest sformatować funkcje repozytorium jako łatwe do odczytania funkcje „obiektu binarnego funkcji” (być może po ustawieniu odpowiedniej wersji).

Zawsze możesz uzyskać dostęp do dowolnej funkcji w repozytorium funkcji za pomocą tekstu Funkcja zasobu [...]. Jest to bardzo wygodne, jeśli na przykład piszesz kod lub skrypty bezpośrednio dla silnika Wolfram Engine za pomocą IDE lub edytora kodu tekstowego (należy szczególnie zaznaczyć, że repozytorium funkcji jest w pełni kompatybilne z Darmowy silnik Wolfram dla programistów).

Jak to działa?

Wewnątrz funkcji w repozytorium Wolfram jest to możliwe przy użyciu dokładnie tego samego systemy zasobów podstawy, jak w wszystkie nasze inne istniejące repozytoria (magazyn danych, Repozytorium sieci neuronowej, zbiór projektów demonstracyjnych itp.), podobnie jak wszystkie inne zasoby systemowe Wolfram, Funkcja zasobu ostatecznie w oparciu o funkcję Obiekt Zasobu.

Rozważać Funkcja zasobu:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Wewnątrz możesz zobaczyć pewne informacje za pomocą funkcji Informacja:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Jak działa konfigurowanie funkcji zasobu? Najprostszy przypadek to przypadek czysto lokalny. Oto przykład, który pobiera funkcję (w tym przypadku czystą funkcję) i definiuje ją jako funkcję zasobu dla danej sesji programu:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Po dokonaniu definicji możesz użyć funkcji zasobu:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Należy zauważyć, że w tym obiekcie blob funkcyjny znajduje się czarna ikona Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram. Oznacza to, że funkcja BLOB odnosi się do funkcji zasobów pamięci zdefiniowanej dla bieżącej sesji. Funkcja zasobu, która jest trwale przechowywana na Twoim komputerze lub koncie w chmurze, ma szarą ikonę Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram. W repozytorium funkcji Wolfram znajduje się pomarańczowa ikona oznaczająca oficjalną funkcję zasobu Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram.

Co więc się stanie, gdy użyjesz menu Rozwiń w Notatniku definicji? Najpierw pobiera wszystkie definicje z notatnika i tworzy z nich symbolikę Obiekt Zasobu). (A jeśli używasz tekstowego IDE lub programu, możesz także jawnie utworzyć Obiekt Zasobu)

Lokalne wdrożenie funkcji z repozytorium na komputerze odbywa się za pomocą polecenia Lokalna pamięć podręczna dla obiektu zasobu, aby go zapisać jako Obiekt lokalny w twoim systemie plików. Wdrożenie na koncie w chmurze odbywa się za pomocą polecenia CloudDeploy dla obiektu zasobu, a wdrożenie chmury publicznej to CloudPublish. We wszystkich przypadkach Rejestr zasobów używany również do rejestrowania nazwy funkcji zasobu, tzw Funkcja zasobu ["nazwa"] będzie działać.

Jeśli klikniesz przycisk Prześlij dla repozytorium funkcji, co się stanie pod nim Prześlij zasób wywołany obiekt zasobu. (A jeśli używasz interfejsu wprowadzania tekstu, możesz także zadzwonić Prześlij zasób bezpośrednio.)

Domyślnie zgłoszenia są dokonywane pod nazwą powiązaną z Twoim Wolfram ID. Jeśli jednak składasz wniosek w imieniu zespołu programistów lub organizacji, możesz to zrobić ustaw oddzielny identyfikator wydawcy i zamiast tego użyj go jako nazwy, aby wchodzić w interakcję ze swoimi widokami.

Po przesłaniu dowolnej funkcji do bazy wiedzy o funkcjach zostanie ona umieszczona w kolejce do sprawdzenia. Jeśli w odpowiedzi otrzymasz komentarze, zazwyczaj będą one miały formę pliku tekstowego z dodanymi dodatkowymi „komórkami komentarzy”. Zawsze możesz sprawdzić status swojego wniosku odwiedzając stronę portal członków systemu zasobów. Jednak gdy Twoja funkcja zostanie zatwierdzona, zostaniesz o tym powiadomiony (e-mailem), a Twoja funkcja zostanie opublikowana w repozytorium funkcji Wolfram.

Niektóre subtelności w pracy

Na pierwszy rzut oka może się wydawać, że możesz po prostu wziąć notatnik definicji i umieścić go dosłownie w repozytorium funkcji, jednak w rzeczywistości wiąże się to z wieloma subtelnościami - a obsługa ich wymaga wykonania dość złożonego metaprogramowania, obsługi przetwarzania symbolicznego jako kod definiujący funkcję i zdefiniowany jest sam Notatnik. Większość tego dzieje się wewnętrznie, za kulisami, ale może mieć pewne konsekwencje, które warto zrozumieć, jeśli zamierzasz wnosić wkład w bazę wiedzy o funkcjach.

Pierwsza natychmiastowa subtelność: Kiedy wypełniasz Notatnik definicji, możesz po prostu wszędzie odnosić się do swojej funkcji, używając nazwy takiej jak Moja funkcja, która wygląda jak zwykła nazwa funkcji w języku Wolfram, ale w dokumentacji repozytorium funkcji została ona zastąpiona Funkcja zasobu [„Moja funkcja”] jest tym, czego użytkownicy będą faktycznie używać podczas pracy z funkcją.

Druga subtelność: kiedy tworzysz funkcję zasobu z Notatnika definicji, wszystkie zależności związane z definicją funkcji muszą zostać przechwycone i jawnie uwzględnione. Aby jednak definicje pozostały modułowe, należy umieścić wszystko w unikalnym formacie przestrzeń nazw. (Oczywiście, funkcje, które robią to wszystko, znajdują się w repozytorium funkcji.)

Zwykle nigdy nie zobaczysz żadnych śladów kodu użytego do skonfigurowania tej przestrzeni nazw. Ale jeśli z jakiegoś powodu wywołasz w swojej funkcji niedostatecznie wykonany symbol, zobaczysz, że ten symbol znajduje się w wewnętrznym kontekście funkcji. Jednakże podczas przetwarzania Notatnika definicji przynajmniej symbol odpowiadający samej funkcji jest regulowany dla najlepszego wyświetlania jako funkcjonalny BLOB, a nie surowy znak w kontekście wewnętrznym.

Repozytorium funkcji służy do definiowania nowych funkcji. Funkcje te mogą mieć opcje. Często te parametry (np. Metoda wykonania lub Rozmiar obrazu) będzie można używać do funkcji wbudowanych, a także do tych, dla których istnieją już wbudowane symbole. Czasami jednak nowa funkcja może wymagać nowych opcji. Aby zachować modułowość, parametry te muszą być symbolami zdefiniowanymi w unikalnym kontekście wewnętrznym (lub czymś w rodzaju całych funkcji zasobu, czyli samych siebie). Dla uproszczenia repozytorium funkcji umożliwia definiowanie nowych opcji w definicjach ciągów. Dla wygody użytkownika te definicje (zakładając, że były używane Wartość opcji и OpcjeWzór) są również przetwarzane w taki sposób, że podczas korzystania z funkcji parametry można podawać nie tylko jako ciągi znaków, ale także jako symbole globalne o tych samych nazwach.

Większość funkcji po prostu robi to, co powinna za każdym razem, gdy są wywoływane, ale niektóre funkcje muszą zostać zainicjowane, zanim będą mogły zostać uruchomione w określonej sesji - aby rozwiązać ten problem, w sekcji Definicja znajduje się sekcja „Inicjalizacja”.

Funkcje z repozytorium mogą korzystać z innych funkcji, które już znajdują się w repozytorium; aby skonfigurować definicje repozytorium funkcji zawierające dwie (lub więcej) funkcje odwołujące się do siebie, musisz je wdrożyć w sesji programu, abyś mógł odniesienia jak na nich Funkcja zasobu ["nazwa"], to możesz stworzyć kombinacje tych funkcji, których potrzebujesz, przykłady (nie zrozumiałem) i dodać nową funkcję do repozytorium w oparciu o te już opublikowane wcześniej. (lub już lub wcześniej – oba słowa są niezdarne)

Perspektywy rozwoju. Co powinno się stać, gdy repozytorium stanie się naprawdę duże?

Dzisiaj właśnie uruchamiamy repozytorium funkcji Wolfram, ale z biegiem czasu spodziewamy się, że jego rozmiar i funkcjonalność mogą dramatycznie wzrosnąć, a wraz z rozwojem będą pojawiać się różne problemy, które już przewidywaliśmy.

Pierwszy problem dotyczy nazw funkcji i ich unikalności. Repozytorium funkcji zostało zaprojektowane w taki sposób, że podobnie jak funkcje wbudowane w języku Wolfram, można odwoływać się do dowolnej funkcji, po prostu podając jej nazwę. Ale to nieuchronnie oznacza, że ​​nazwy funkcji muszą być globalnie unikalne w całym repozytorium, tak aby na przykład mogła istnieć tylko jedna Funkcja zasobu [„Funkcja Moje Ulubione”].

Na początku może się to wydawać dużym problemem, ale warto zdać sobie sprawę, że jest to w zasadzie ten sam problem, co w przypadku domen internetowych czy uchwytów w mediach społecznościowych. A faktem jest, że system po prostu musi mieć rejestratora – i to jest jedna z ról, jaką nasza firma będzie pełnić dla bazy wiedzy funkcji Wolfram. (W przypadku prywatnych wersji repozytorium ich rejestratorami mogą być administratorzy.) Oczywiście domenę internetową można zarejestrować nie mając na niej niczego, ale w repozytorium funkcji nazwę funkcji można zarejestrować tylko wtedy, gdy istnieje rzeczywista definicja funkcja.

Częścią naszej roli w zarządzaniu bazą wiedzy o funkcjach Wolfram jest zapewnienie, że nazwa wybrana dla funkcji jest logiczna, biorąc pod uwagę definicję funkcji i jest zgodna z konwencjami nazewnictwa języka Wolfram. Mamy ponad 30-letnie doświadczenie w nazewnictwie wbudowanych funkcji w języku Wolfram, a nasz zespół kuratorów wniesie to doświadczenie również do repozytorium funkcji. Oczywiście zawsze są wyjątki. Na przykład może się wydawać, że lepsza jest krótka nazwa jakiejś funkcji, ale lepiej jest „bronić się” dłuższą, bardziej szczegółową nazwą, ponieważ jest mniejsze prawdopodobieństwo, że w przyszłości natkniesz się na kogoś, kto będzie chciał utworzyć podobną nazwę funkcji .

(Należy tutaj zauważyć, że samo dodanie jakiegoś znacznika członkowskiego w celu ujednoznacznienia funkcji nie przyniesie zamierzonego efektu. Ponieważ jeśli nie będziesz nalegał na ciągłe przypisywanie znacznika, będziesz musiał zdefiniować domyślny znacznik dla dowolnej funkcji, a także przydzielić znaczniki autora , co ponownie wymagałoby globalnej koordynacji.)

W miarę powiększania się bazy wiedzy o funkcjach Wolframa, jednym z problemów, który prawdopodobnie się pojawi, będzie wykrywalność funkcji, dla których system zapewnia funkcja wyszukiwania (a pliki definicji mogą zawierać słowa kluczowe itp.). W przypadku funkcji wbudowanych w języku Wolfram w dokumentacji znajdują się różnego rodzaju odniesienia, które pomagają „reklamować” funkcje. Funkcje w repozytorium funkcji mogą odwoływać się do funkcji wbudowanych. Ale co w drugą stronę? Aby to zrobić, będziemy eksperymentować z różnymi projektami, aby udostępnić funkcje repozytorium na stronach dokumentacji wbudowanych funkcji.

Dla funkcji wbudowanych w języku Wolfram dostępna jest tzw. warstwa detekcyjna dostarczana przez sieć „stron pomocy”, które udostępniają zorganizowane listy funkcji związanych z określonymi obszarami. Zawsze trudno jest właściwie zrównoważyć strony podręcznika, a wraz z rozwojem języka Wolfram strony podręcznika często wymagają całkowitej reorganizacji. Całkiem łatwo jest podzielić funkcje z repozytorium na szerokie kategorie, a nawet spójnie podzielić te kategorie, ale o wiele cenniejsze jest posiadanie odpowiednio zorganizowanych stron z odniesieniami do języków. Nie jest jeszcze jasne, jak najlepiej je utworzyć dla całej bazy wiedzy o funkcjach. Na przykład, Utwórz galerię obiektów zasobów w repozytorium funkcji każdy może opublikować stronę internetową zawierającą wybrane przez siebie elementy z repozytorium:

Repozytorium funkcji Wolfram: platforma otwartego dostępu dla rozszerzeń językowych Wolfram

Repozytorium funkcji Wolfram jest skonfigurowane jako trwałe repozytorium funkcji, w którym każda zawarta w nim funkcja zawsze będzie działać. Oczywiście mogą pojawić się nowe wersje funkcji i spodziewamy się, że niektóre funkcje z czasem staną się przestarzałe. Funkcje będą działać, jeśli zostaną użyte w programach, ale ich strony dokumentacji będą zawierały łącza do nowych, bardziej zaawansowanych funkcji.

Repozytorium funkcji Wolfram zostało zaprojektowane, aby pomóc Ci szybko odkrywać nowe funkcje i uczyć się nowych sposobów korzystania z języka Wolfram. Jesteśmy bardzo optymistyczni, że część tego, co zostało zbadane w repozytorium funkcji, w końcu nabierze sensu i stanie się wbudowanymi częściami rdzenia języka Wolfram. W ciągu ostatniej dekady mieliśmy podobny zestaw funkcje, które zostały pierwotnie wprowadzone w Wolfram | Alfa. Jedną z lekcji wyciągniętych z tego doświadczenia jest to, że osiągnięcie standardów jakości i spójności, na których się skupiamy we wszystkim wbudowanym w język Wolfram, wymaga dużo pracy, która często jest trudniejsza niż początkowy wysiłek związany z wdrożeniem pomysłu. Mimo to funkcja w bazie wiedzy o funkcjach może służyć jako bardzo przydatny dowód koncepcji przyszłej funkcji, która może ostatecznie zostać wbudowana w język Wolfram.

Najważniejszą rzeczą jest to, że funkcja w repozytorium funkcji jest czymś, z czego może teraz korzystać każdy użytkownik. Możliwe, że funkcja w języku natywnym mogłaby być znacznie lepsza i wydajniejsza, ale repozytorium funkcji umożliwiłoby użytkownikom natychmiastowy dostęp do wszystkich nowych funkcji. A co najważniejsze, koncepcja ta pozwala każdemu dodawać dowolne nowe funkcje.

Wcześniej w historii języka Wolfram pomysł ten nie sprawdziłby się tak dobrze, ale na tym etapie w język włożono tak wiele wysiłku i tak głębokie zrozumienie zasad projektowania języka, że ​​obecnie wydaje się to bardzo możliwość dodania przez dużą społeczność użytkowników funkcji, które pozwolą zachować spójność projektu i uczynić je użytecznymi dla szerokiego grona użytkowników.

W społeczności użytkowników Wolfram Language panuje niesamowity duch talentu(?). (Oczywiście do tej społeczności należy wielu czołowych specjalistów w dziedzinie badań i rozwoju w różnych dziedzinach.) Mam nadzieję, że repozytorium funkcji Wolfram zapewni skuteczną platformę do odblokowywania i rozpowszechniania ducha talentów. Tylko razem możemy stworzyć coś, co znacząco poszerzy obszar, w którym można zastosować paradygmat obliczeniowy języka Wolfram.

W ciągu ponad 30 lat przebyliśmy długą drogę z językiem Wolfram. Teraz razem pójdziemy jeszcze dalej. Gorąco zachęcam wszystkich szanowanych użytkowników języka Wolfram na całym świecie do korzystania z repozytorium funkcjonalnego jako platformy do tego, a także z nowego projektu oprogramowania, takiego jak Free Wolfram Engine for Developers.

Źródło: www.habr.com

Dodaj komentarz