Witaj, Habr! Przedstawiam Wam tłumaczenie wpisu Stevena Wolframa .

Podstawy zdolności języka Wolfram
Dziś stoimy u progu wielkich osiągnięć z językiem programowania . Zaledwie trzy tygodnie temu uruchomiliśmy , aby pomóc naszym użytkownikom w integracji języka Wolfram Language w ich rozbudowane projekty programowe. Dziś uruchamiamy , 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 produktu programowego.
Repozytorium funkcji (Function Repository) Wolfram to to, co stało się możliwe dzięki unikalnej specyfice Wolfram Language nie tylko jako języka programowania, ale także . W tradycyjnych językach programowania dodanie znaczących nowych funkcji zazwyczaj wiąże się z tworzeniem całych dodatkowych bibliotek, które mogą działać lub nie w sposób współdzielony. Jednak w języku Wolfram Language , że istnieje możliwość znacznego rozszerzenia jego funkcjonalności, po prostu dodając nowe funkcje, które natychmiast integrują się w całościowy strukturę całego języka.
Na przykład, już teraz w repozytorium funkcji Wolfram znajduje się podzielone na 26 tematycznych kategorii:

Podobnie jak ponad , wbudowanych w język Wolfram, każda funkcja z repozytorium ma stronę dokumentacji z ich szczegółowym opisem i przykładami działania:

Aby przejść do strony, skopiuj podany powyżej obiekt ( funkcjonalny BLOB), wklej go do pola tekstowego, a następnie uruchom funkcję – jest ona już wbudowana w język Wolfram i wspierana domyślnie, począwszy od :

Warto zauważyć, że podczas przetwarzania Nie musisz na przykład konfigurować „biblioteki do przetwarzania obrazów” – ponieważ w języku Wolfram Language już wprowadziliśmy sekwencyjny i starannie algorytmizowany sposób , które mogą być natychmiast przetwarzane przez różne funkcje graficzne języka:

Mam nadzieję, że przy wsparciu , która rozwija się i powiększa (na bazie języka Wolfram Language) od kilku dziesięcioleci. Repozytorium funkcji Wolfram znacznie poszerzy w niedalekiej przyszłości zakres (potencjalnie znaczących, specjalizowanych w różnych dziedzinach nauki i techniki) funkcji dostępnych w tym języku. W ten sposób można korzystać zarówno z zawartości języka (jego wbudowanych funkcji), jak i , które są realizowane na bazie języka. (Należy zauważyć, że Wolfram Language ma już ponad ).
W funkcjach z repozytorium mogą znajdować się niewielkie lub stosunkowo obszerne fragmenty kodu napisanego w języku Wolfram Language. Na przykład mogą to być wywołania . Unikalną cechą tego podejścia jest to, że przechodząc do funkcjonalności na poziomie użytkownika, nie będą występować żadne niezgodności, ponieważ podejście to opiera się na spójnej strukturze języka Wolfram Language — a każda funkcja będzie automatycznie działać poprawnie — tak, jak powinna.
Interfejs i struktura oprogramowania repozytorium funkcji są dostosowane tak, aby każdy mógł wnieść swój wkład w tę wspólną sprawę w możliwie najprostszy i najwygodniejszy sposób — zasadniczo po prostu . Wbudowane funkcje automatyczne pozwalają na weryfikację nowych funkcji dodawanych do repozytorium w celu ich gwarantowanej integracji w język. Nasza firma stawia na szeroką grupę użytkowników, którzy mogą integrować swoje funkcje w języku, a nie na dużych komplikacjach związanych z nowymi funkcjami — i choć proces weryfikacji jest tutaj realizowany, nie nalegamy na coś w rodzaju lub rygorystycznych standardów kompletności i niezawodności nowych funkcji użytkowników, w przeciwieństwie do dokładniejszych kontroli funkcji wbudowanych w rdzeń języka, które stosujemy.
W tej koncepcji istnieje wiele kompromisów i szczegółów, ale naszym celem jest optymalizacja repozytorium funkcji Wolfram zarówno pod kątem wygody użytkowników, jak i zapewnienia, że nowe funkcje użytkowników wniosą wymierny wkład w rozwój języka. W miarę rozwoju nie wątpię, że będziemy musieli wymyślać nowe metody przetwarzania i weryfikacji funkcji wbudowanych w repozytorium, nie tylko w celu organizacji dużej liczby funkcji, ale także ich wyszukiwania przez użytkowników. Nie może jednak nie cieszyć, że obrana przez nas droga to dobry początek. Osobiście do początkowej bazy. Wiele z nich opiera się na kodzie, który osobiście rozwijałem przez dość długi czas. I spędziłem zaledwie kilka minut na ich przesłaniu do repozytorium. Teraz, gdy już się w nim znajdują, mogę w końcu – natychmiastowo i w dowolnym momencie – korzystać z tych funkcji w razie potrzeby, nie martwiąc się o szukanie plików, pobieranie pakietów itp.
Zwiększenie efektywności przy obniżeniu kosztów
Jeszcze przed pojawieniem się Internetu istniały sposoby wymiany kodu Wolfram Language (naszym pierwszym dużym scentralizowanym projektem był , stworzony dla Mathematica w 1991 roku na bazie CD-ROM itd.). Z pewnością, proponowane podejście oparte na repozytorium funkcji Wolfram jest znacznie bardziej potężnym i niezawodnym narzędziem do realizacji wymienionych zadań.
Od ponad 30 lat nasza firma ciężko pracuje nad utrzymywaniem integralności struktury języka Wolfram, co jest niezwykle istotne, aby język Wolfram stał się nie tylko językiem programowania, ale i . Tak więc istotą podejścia do realizacji repozytorium funkcji Wolfram jest zastosowanie jednolitego podejścia do programowania oraz opracowywania nowych funkcji, które są systematycznie dodawane i wpisywane w ramy języka, aby umożliwić jego rozwój i wspólną ewolucję.
W strukturze realizacji każdej funkcji zachodzą różne procesy obliczeniowe. Należy zauważyć, że zapewnienie, aby funkcja miała dla użytkownika wyraźny i jednolity wygląd oraz czytelność, jest niezbędne. W tym kontekście wbudowane funkcje języka Wolfram Language są przedstawione w ponad 6000 sekwencyjnych przykładów, jak poprawnie programować funkcje (to nasze , które obejmują ). Takie podejście ostatecznie pozwala na stworzenie repozytorium funkcji Wolfram, które działa dobrze; to strukturalny charakter języka Wolfram Language z jego 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 , lub , a także lub inne — w języku już istnieje ich spójne symboliczne przedstawienie, co sprawia, że Twoja funkcja natychmiast staje się kompatybilna z innymi funkcjami w języku.
Stworzenie repozytorium, które naprawdę dobrze działa, jest interesującym wyzwaniem meta-programowania. Na przykład nadmiar ograniczeń w programie nie pozwoli uzyskać wymaganej unifikacji i wszechstronności działania algorytmu. Tak samo, jak przy zbyt małej liczbie ograniczeń funkcjonalnych nie będziesz w stanie wdrożyć wystarczająco poprawnej sekwencji wykonania algorytmu. Kilka wcześniejszych przykładów realizacji kompromisowych podejść, wdrożonych przez naszą firmę, działało wystarczająco stabilnie — są to: , uruchomiony w 2007 roku, a teraz działający w trybie interaktywnym w sieci Internet, zawierający ponad 12000 użytkowników interaktywnych demonstracji. W znajduje się ponad 600 gotowych baz danych, które można wykorzystać w języku Wolfram Language, a jest uzupełniany nowymi sieciami neuronowymi praktycznie co tydzień (obecnie jest ich już 118) i są one natychmiast podłączane przez funkcję w języku Wolfram Language.
Wszystkie powyższe przykłady mają zasadniczą cechę — obiekty i funkcje zbierane w projekcie mają bardzo wysoki stopień strukturyzacji i podziału procesów. Niewątpliwie, szczegółowość struktury tego, co stanowi demonstrację lub sieć neuronową, czy coś innego, może się znacznie różnić, ale fundamentalna struktura dla dowolnego aktualnego repozytorium zawsze pozostaje niezmieniona. Jakie jest twoje zdanie, szanowny użytkowniku, na temat stworzenia takiego repozytorium, które dodaje rozszerzenia do języka Wolfram? Język Wolfram Language został zaprojektowany w taki sposób, aby był niezwykle elastyczny, dlatego można go rozszerzać i modyfikować w dowolny sposób. To okoliczność ma kluczowe znaczenie dla możliwości szybkiego tworzenia różnorodnych dużych projektów programistycznych w języku Wolfram Language. Należy zauważyć, że wraz ze wzrostem elastyczności języka nieuchronnie również wzrośnie koszt projektów realizowanych w tym języku. Dzieje się tak dlatego, że im więcej użytkownik korzysta z danego języka, tym więcej uzyskuje dedykowanej funkcjonalności, ale nie należy zapominać, że takie podejście może mieć także negatywne strony w kwestii braku zapewnienia spójnej koherentności modułów programowych.
W tradycyjnych językach programowania istnieje powszechny problem z bibliotekami — jeśli używasz jednej biblioteki, kod działa poprawnie, ale gdy próbujesz użyć kilku bibliotek, 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 obliczeń – brakuje możliwości gwarantowanej kontroli nad dostępnością spójnych wbudowanych reprezentacji dla jakichkolwiek funkcji lub typów danych, poza ich podstawowymi strukturami. W rzeczywistości problem jest jeszcze większy, niż się wydaje na pierwszy rzut oka: jeśli ktoś buduje dużą pionową funkcjonalność, to bez ogromnych wydatków na scentralizowane programowanie projektu, które zainwestowaliśmy w język Wolfram, nie można osiągnąć spójności. Dlatego ważne jest, aby wszystkie moduły programowe zawsze poprawnie współpracowały.
Ideą repozytorium funkcji Wolfram jest uniknięcie problemu opisanego powyżej, polegając na dodawaniu rozszerzeń do języka w postaci stosunkowo niewielkich fragmentów kodu poprzez pojedyncze funkcje, których opracowywanie jako spójnych modułów jest prostszym zadaniem. Istnieją jednak aspekty programowania, które nie mogą być zrealizowane w wygodny sposób przy pomocy pojedynczych funkcji (a nasza firma wkrótce planuje wprowadzenie zoptymalizowanego algorytmu programowego, który pomoże w implementacji dużych pakietów programowych). Niemniej jednak, na bazie już wbudowanych funkcji w języku Wolfram Language, istnieje wiele możliwości programowania, które są realizowane na podstawie pojedynczych funkcji. Chodzi o to, aby przy stosunkowo niewielkim wysiłku programistycznym stworzyć szereg nowych i bardzo użytecznych funkcji, które zapewnią wystarczającą spójność projektu, a jednocześnie będą dobrze współpracować ze sobą oraz, co więcej, będą mogły być łatwo i szeroko wykorzystywane w języku w przyszłości.
Niewątpliwie podejście to jest kompromisem. Przy realizacji bardziej rozbudowanego pakietu można sobie wyobrazić zupełnie nowy świat funkcjonalności, który będzie niezwykle potężny i użyteczny. Jeśli istnieje potrzeba uzyskania nowych możliwości funkcjonalnych, które będą wpisywać się w całość, ale nie jesteś gotów poświęcić ogromnych wysiłków na rozwój projektu, niestety może to prowadzić do ograniczenia skali Twojego projektu. Ideą repozytorium funkcji Wolfram jest zapewnienie funkcjonalności określającej część projektu, co pozwoli dodać potężne możliwości, jednocześnie upraszczając utrzymanie dobrej spójności w programowaniu projektu.
Pomoc w dodawaniu funkcji użytkownika do repozytorium funkcji
Specjaliści naszej firmy włożyli wiele wysiłku w to, aby ich wkład w funkcje repozytorium Wolfram był na tyle łatwy dla użytkowników. Na pulpicie (już w ), Możesz po prostu przechodzić kolejno przez zakładki głównego menu: File > New > RepositoryItem > Function Repository Item i otrzymasz «» (programowo wewnątrz środowiska roboczego. Możesz także użyć funkcji analogowej — ):

Istnieją dwa podstawowe działania, które musisz wykonać: po pierwsze, faktycznie napisać kod swojej funkcji, a po drugie, napisać dokumentację ilustrującą, jak powinna działać twoja funkcja.
Kliknij przycisk „Otwórz przykładowy” na górze, aby zobaczyć przykład tego, co musisz zrobić:

Faktycznie starasz się stworzyć coś podobnego do wbudowanej funkcji w języku Wolfram Language. Z wyjątkiem tego, że może ona robić coś znacznie bardziej specyficznego niż wbudowana funkcja. W związku z tym oczekiwania związane z jej pełnością i niezawodnością będą znacznie niższe.
Musisz nadać nazwę swojej funkcji, która będzie zgodna z zasadami nazewnictwa funkcji w Wolfram Language. Ponadto będziesz musiał opracować dokumentację dla swojej funkcji, podobnie jak w przypadku wbudowanych funkcji języka. Szczegółowo omówię to później. Na razie zwróć uwagę, że w rzędzie przycisków na górze pliku notatnika definicji znajduje się przycisk , który wyjaśnia, co robić, oraz przycisk „Narzędzia”, który oferuje zestaw narzędzi do formatowania dokumentacji twojej funkcji.
Kiedy upewnisz się, że wszystko jest wypełnione poprawnie i jesteś gotowy, kliknij przycisk „Check” („Sprawdź”). To zupełnie normalne, że nie zrozumiałeś jeszcze wszystkich szczegółów. Dlatego funkcja „Check” automatycznie wykona wiele sprawdzeń stylu i spójności. Często natychmiast zaproponuje potwierdzenie i zaakceptowanie poprawek (Na przykład: „Ten wiersz musi kończyć się dwukropkiem”, i zasugeruje wprowadzenie dwukropka). Czasami poprosi cię o dodanie lub zmianę czegoś samodzielnie. Będziemy nieustannie dodawać nowe możliwości do automatycznej funkcjonalności przycisku „Check”, ale w głównej mierze jego celem jest zapewnienie, że wszystko, co wysyłasz do repozytorium funkcji, już odpowiada jak największej liczbie zaleceń dotyczących stylu.

Po uruchomieniu opcji „Sprawdź” możesz skorzystać z opcji „Podgląd”. „Podgląd” tworzy podgląd strony dokumentacji, którą określiłeś dla swojej funkcji. Możesz także utworzyć podgląd pliku, który został stworzony na Twoim komputerze lub pliku, który znajduje się w chmurze. Jeśli z jakiegoś powodu nie jesteś zadowolony z tego, co zobaczysz w podglądzie, po prostu wróć i wprowadź niezbędne poprawki, a następnie ponownie kliknij przycisk Podgląd.
Teraz jesteś gotów, aby umieścić swoją funkcję w repozytorium. Przycisk Rozmieść oferuje Ci cztery opcje działania:

Na tym etapie istotne jest, że możesz wysłać swoją funkcję do repozytorium funkcji Wolfram, aby była dostępna dla każdego użytkownika. Możesz także umieścić swoją funkcję, aby była dostępna dla ograniczonej liczby użytkowników. Na przykład możesz stworzyć funkcję, która będzie umieszczona lokalnie na Twoim komputerze, aby była dostępna, gdy używasz tego konkretnego komputera. Lub możesz umieścić ją w swoim , aby była dostępna dla Ciebie, gdy jesteś podłączony do chmury. Możesz również publicznie umieścić (wdrożyć) funkcję za pośrednictwem swojego konta w chmurze. Nie będzie ona jednak dostępna w centralnym repozytorium funkcji Wolfram, ale będziesz mógł podać komuś URL, który pozwoli mu uzyskać Twoją funkcję z Twojego konta. (W przyszłości również będziemy wspierać centralne repozytoria na poziomie całej naszej firmy).
Załóżmy więc, że chcesz faktycznie przekazać swoją funkcję do bazy wiedzy funkcji Wolfram. W tym celu naciskasz przycisk „Wyślij” w repozytorium. Co się wtedy dzieje? Twoje zgłoszenie natychmiast trafia do kolejki do rozpatrzenia i zatwierdzenia przez nasz specjalny zespół kuratorów.
Gdy Twoje zgłoszenie przechodzi przez proces akceptacji (który zazwyczaj trwa kilka dni), otrzymasz informacje o statusie jego rozpatrzenia, a także być może propozycje dotyczące dalszego jego wykorzystania. Jednakże, gdy tylko Twoja funkcja zostanie zatwierdzona, zostanie natychmiast opublikowana w repozytorium funkcji Wolfram i będzie dostępna do dowolnego użytku. (I będzie to wyświetlane w itd.)
Co powinno znajdować się w repozytorium?
Należy zauważyć, że w naszej firmie obowiązują bardzo wysokie standardy pod względem kompletności, niezawodności i ogólnej jakości. Spośród ponad 6000 funkcji, które wbudowaliśmy 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 możliwości funkcjonalnych, które już istnieją w języku Wolfram Language, aby dodać jak najwięcej znacznie lżejszych funkcji (to znaczy funkcji o wyższej wydajności).
Z pewnością funkcje w repozytorium funkcji Wolfram muszą spełniać zasady rozwoju języka Wolfram Language — aby mogły w pełni współdziałać z innymi funkcjami i oczekiwaniami użytkowników co do tego, jak funkcje powinny poprawnie działać. Niemniej jednak, funkcje nie muszą mieć tej samej pełności ani niezawodności.
W wbudowanych funkcjach języka Wolfram ciężko pracujemy, aby uczynić funkcje programowe jak najbardziej ogólnymi. W przypadku repozytorium funkcji Wolfram nie ma nic złego w tym, że trafi tam funkcja, która po prostu obsługuje jakiś bardzo konkretny, ale przydatny przypadek. Na przykład funkcja może przyjmować pliki w określonym formacie i tworzyć wiadomości e-mail w określony sposób. tworzy diagramy tylko w określonych kolorach i z etykietowaniem itp.
Kolejnym aspektem związanym z funkcjami wbudowanymi jest to, że nasza firma dokłada wszelkich starań, aby obsługiwać wszystkie nietypowe przypadki, prawidłowo przetwarzać niepoprawne dane wejściowe itp. W repozytorium funkcji całkowicie normalną sytuacją jest istnienie specjalnej funkcji, która obsługuje główne przypadki rozwiązania problemu i ignoruje wszystkie pozostałe.
Jasnym jest, że lepiej mieć funkcje, które robią więcej i robią to lepiej, ale optymalizacja repozytorium funkcji — w przeciwieństwie do wbudowanych funkcji języka Wolfram — powinna koncentrować się na bardziej złożonych funkcjach powiązanych z większą liczbą funkcji, zamiast zagłębiać się w procesy realizacji każdej konkretnej funkcji.
Teraz przyjrzyjmy się przykładowi testowania funkcji w repozytorium. Oczekiwania dotyczące spójności takich funkcji są naturalnie znacznie niższe niż w przypadku wbudowanych funkcji języka. Jest to tym bardziej istotne w sytuacjach, gdy funkcje zależą od zewnętrznych zasobów, takich jak API, dlatego istotne jest ciągłe przeprowadzanie systematycznych testów, co automatycznie odbywa się wewnątrz algorytmów weryfikacji. W pliku nb możesz wyraźnie określić definicje (w sekcji „Dodatkowe informacje”) i ustawić dowolną liczbę testów, które są zdefiniowane albo przez ciągi wejściowe i wyjściowe, albo przez pełne obiekty symboliczne typu , tyle, ile uważasz za konieczne. Ponadto system nieustannie stara się przekształcić dostarczone przez Ciebie przykłady dokumentacji w proces weryfikacji (czasami może to być dość zasobożerne, na przykład w przypadku funkcji, której wynik zależy od liczb losowych lub pory dnia).
W rezultacie w repozytorium funkcji powstaje szereg trudności w implementacji. Niektóre będą jedynie jedną linią kodu, inne mogą zawierać tysiące lub dziesiątki tysięcy linii, prawdopodobnie z użyciem wielu funkcji pomocniczych. Kiedy warto dodać funkcję, dla której określenie wymaga bardzo mało kodu? Zasadniczo, jeśli dla funkcji istnieje , które użytkownicy chętnie zrozumieliby, widząc to w części kodu, można już dodać. W przeciwnym razie lepiej będzie po prostu ponownie dopisać kod do Twojego programu za każdym razem, kiedy musisz go użyć.
Głównym celem repozytorium funkcji (jak sama nazwa wskazuje) jest wprowadzenie nowych funkcji do języka. Jeśli chcesz dodać nowe dane lub , użyj . Ale co zrobić, jeśli chcesz wprowadzić nowe rodzaje obiektów do swoich obliczeń?
Tak naprawdę są dwa sposoby. Możesz wprowadzić nowy typ obiektu, który będzie używany w nowych funkcjach w repozytorium funkcji. W takim przypadku zawsze możesz po prostu zapisać jego symboliczne przedstawienie i używać go podczas wprowadzania lub wyprowadzania funkcji w repozytorium funkcji.
A co, jeśli chcesz zaprezentować obiekt, a następnie zdefiniować go za pomocą istniejących funkcji w języku Wolfram Language, które powinny współpracować z nim? Wolfram Language zawsze miał łatwy mechanizm do tego, który nazywa się . Z pewnymi ograniczeniami (szczególnie dla funkcji, które ), repozytorium funkcji pozwala Ci po prostu zaprezentować funkcję i zdefiniować dla niej wartości. (Aby zwiększyć oczekiwanie na spójność przy tworzeniu nowej istotnej konstrukcji, całkowicie zintegrowanej w całym języku Wolfram Language, to zazwyczaj bardzo ważna procedura, której nie można osiągnąć tylko dzięki zwiększeniu kosztów projektu, a to właśnie nasza firma robi w ramach projektów długoterminowego rozwoju języka, ta задача nie jest celem, który stawiamy wewnątrz rozwoju repozytorium).
Więc co może być w kodzie funkcji w repozytorium funkcji? , oczywiście (przynajmniej jeśli nie wpływa to na do i niezawodność samego programu, jako środowiska obliczeniowego) podobnie jak każda funkcja z repozytorium funkcji. Istnieją również inne możliwości funkcjonowania: funkcja w repozytorium funkcji może wywoływać API, zarówno w , albo . Oczywiście, istnieją pewne ryzyka związane z tym. Z powodu braku gwarancji, że API się nie zmieni, a funkcja w magazynie funkcji przestanie działać. Aby wykryć podobne problemy, na stronie dokumentacji (w sekcji „Wymagania”) znajduje się uwaga dla każdej funkcji, która opiera się nie tylko na wbudowanej funkcjonalności Wolfram Language. (Oczywiście, jeśli mowa o danych rzeczywistych, mogą wystąpić problemy nawet z taką funkcjonalnością — ponieważ rzeczywiste dane dotyczące świata stale się zmieniają, a czasami nawet zmieniają swoje definicje i strukturę.)
Czy cały kod dla repozytoriów funkcji Wolfram musi być napisany w języku Wolfram? Zdecydowanie, kod w wewnętrznym API nie musi być napisany w języku Wolfram, co tak naprawdę nie czyni go kodem tego języka. W rzeczywistości, jeśli znajdziesz funkcję praktycznie w każdym zewnętrznym języku lub bibliotece, możesz stworzyć powłokę, która pozwoli na jej użycie w repozytorium funkcji Wolfram. (Zazwyczaj do tego należy używać wbudowanych funkcji lub w kodzie języka Wolfram.)
Jaki więc jest sens robienia tego? W zasadzie pozwala to na korzystanie z całego zintegrowanego systemu Wolfram Language oraz z całego jego zjednoczonego zestawu możliwości programowych. Jeżeli otrzymujesz podstawową implementację z zewnętrznej biblioteki lub języka, możesz następnie wykorzystać bogatą symboliczną strukturę języka Wolfram Language do stworzenia wygodnej, wyższej funkcji, która pozwala użytkownikom dość łatwo korzystać z dowolnej już zaimplementowanej funkcjonalności. Przynajmniej powinno to być wykonalne w idealnym świecie, w którym istnieją wszystkie składniki ładowania bibliotek itd., w tym przypadku będą one automatycznie rozwiązywane za pomocą Wolfram Language. (Warto zauważyć, że w praktyce mogą wystąpić problemy z w konkretnej komputerowej systemie, a w magazynie chmurowym mogą wystąpić dodatkowe problemy z bezpieczeństwem).
Tak, gdy po raz pierwszy analizujesz typowe zewnętrzne biblioteki, często wydają się zbyt skomplikowane, aby można je było objąć tylko kilkoma funkcjami, ale w wielu przypadkach większość złożoności wynika z budowy infrastruktury niezbędnej dla biblioteki oraz wszystkich funkcji wspierających. Jednak w przypadku używania języka Wolfram Language infrastruktura jest zazwyczaj już wbudowana w pakiety, więc nie trzeba szczegółowo ujawniać wszystkich tych funkcji wsparcia, a trzeba tylko stworzyć funkcje dla kilku "najwyższych" funkcji, skoncentrowanych na aplikacji w bibliotece.
Ekosystem bazy wiedzy
Jeśli napisałeś funkcje, z których korzystasz często, wyślij je do repozytorium funkcji Wolfram! Jeśli z tego nie powstanie nic większego (rozwój języka), to i tak będzie Ci znacznie wygodniej korzystać z funkcji do osobistego użytku. Jednak logiczne jest przypuszczenie, że jeśli stale korzystasz z funkcji, to inni użytkownicy również mogą je uznać za użyteczne.
Oczywiście możesz znaleźć się w sytuacji, kiedy nie masz możliwości — 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 w swoim własnym koncie w chmurze, dostępu do nich. (Jeśli w Twojej organizacji znajduje się , wkrótce będzie mogła utworzyć własne prywatne repozytorium funkcji, które można zarządzać z Twojej organizacji i ustalać wymuszone przeglądy widoków lub nie dla użytkowników zewnętrznych.)
Funkcje, które wysyłasz do repozytorium funkcji Wolfram, nie muszą być idealne; muszą być tylko użyteczne. To trochę jak sekcja „Błędy” w klasycznej dokumentacji Unix - w „Sekcji definicji” znajduje się sekcja „Uwagi autora”, w której możesz opisać ograniczenia, problemy itp., które już znasz w swojej funkcji. Dodatkowo, gdy wysyłasz swoją funkcję do repozytorium, możesz dodać uwagi do wysyłki, które zostaną przeczytane przez specjalny zespół kuratorów.
Po publikacji funkcji jej strona zawsze ma dwa linki na dole: „” i „». Jeśli dołączasz adnotację (na przykład zgłoszenie błędów), możesz zaznaczyć pole, w którym zaznaczasz, że chcesz, aby Twoja wiadomość i dane kontaktowe zostały przekazane autorowi funkcji.
Czasami trzeba po prostu korzystać z funkcji z repozytoriów funkcji Wolfram, takich jak wbudowane funkcje, nie zaglądając w ich kod. Jeśli jednak chcesz „zajrzeć do wewnątrz”, na górze zawsze znajduje się przycisk „Notatnik”. Naciśnij go, a otrzymasz własną kopię oryginalnego notatnika definicji, który został wysłany do repozytoriów funkcji. Czasami możesz po prostu używać go jako przykład dla swoich potrzeb. Możesz również opracować własną modyfikację tej funkcji. Może chcesz umieścić znalezione funkcje z repozytoriów na swoim komputerze lub w swoim koncie w chmurze, być może chcesz je wysłać do bazy wiedzy funkcji, być może jako ulepszoną, rozszerzoną wersję oryginalnej funkcji.
W przyszłości planujemy wspierać rozwidlenia w stylu Git dla repozytoriów funkcji, ale obecnie staramy się to uprościć, więc zawsze mamy tylko jedną ogólnie przyjętą wersję każdej funkcji wbudowanej w język. Najczęściej (jeśli deweloperzy nie rezygnują z utrzymywania stworzonych przez siebie funkcji i odpowiadają na zgłoszenia użytkowników), pierwotny autor funkcji ma kontrolę nad aktualizacjami i przesyła nowe wersje, które są następnie sprawdzane i, jeśli przechodzą proces weryfikacji, publikowane w języku.
Rozważmy, jak działa „wersjonowanie” stworzonych funkcji. W tej chwili, gdy używasz funkcji z repozytoriów funkcji, jej definicja będzie stale przechowywana na twoim komputerze (lub w twoim koncie w chmurze, jeśli używasz chmury). Jeśli pojawi się nowa wersja funkcji, przy następnym jej użyciu otrzymasz powiadomienie. A jeśli chcesz zaktualizować funkcję do nowej wersji, możesz to zrobić za pomocą polecenia („Funkcyjny obiekt BLOB” w rzeczywistości przechowuje więcej informacji o wersjach, a w przyszłości planujemy uczynić to bardziej dostępnym dla naszych użytkowników.)
Jedną z wspaniałych cech repozytorium funkcji Wolfram jest to, że każda program Wolfram Language w dowolnym miejscu może wykorzystywać funkcje z niego. Jeśli program pojawia się w notatniku, często wygodnie jest sformatować funkcje repozytorium jako łatwe do odczytania „funkcyjne obiekty binarne” (możliwe, z odpowiednim zestawem wersji).
Zawsze możesz odwołać się do dowolnej funkcji repozytorium funkcji, używając tekstowego . I jest to bardzo wygodne, gdy piszesz kod lub skrypty bezpośrednio dla Wolfram Engine, na przykład z (należy szczególnie podkreślić, że repozytorium funkcji jest całkowicie zgodne z ).
Jak to działa?
Wewnątrz funkcji w repozytorium Wolfram możliwe jest to za pomocą dokładnie takiego samego bazy, jak i we (magazyn danych, , itd.), jak i wszystkie inne zasoby systemowe Wolfram, ostatecznie oparty na funkcji .
Rozważmy :

Wewnątrz możesz zobaczyć pewne informacje, korzystając z funkcji :

Jak działa ustawienie funkcji zasobów? Najprostszy to czysto lokalny przypadek. Oto przykład, który bierze funkcję (w tym przypadku po prostu czystą funkcję) i definiuje ją jako funkcję zasobów dla danego sesji programu:

Po zdefiniowaniu możesz używać funkcji zasobów:

Zauważ, że w tym obiekcie BLOB funkcji znajduje się czarna ikona
. Oznacza to, że funkcja BLOB odnosi się do funkcji zasobów w pamięci, zdefiniowanej dla bieżącej sesji. Dla funkcji zasobów, która jest trwale przechowywana na Twoim komputerze lub w chmurze, jest szara ikona
. A dla oficjalnej funkcji zasobów w repozytorium funkcji Wolfram jest pomarańczowa ikona
.
A więc, co się dzieje, kiedy używasz menu „Wdrażanie” w notatniku definicji? Po pierwsze, pobiera wszystkie definicje w notatniku i z nich tworzy symboliczne ). (Jeśli używasz tekstowego IDE lub programu, możesz również jawnie utworzyć )
Lokalne wdrożenie funkcji z repozytorium na Twoim komputerze wykonuje się za pomocą polecenia dla obiektu zasobu, aby zachować go jako w Twoim systemie plików. Wdrożenie w chmurze wykonuje się za pomocą polecenia dla obiektu zasobu, a publiczne wdrożenie w chmurze — . We wszystkich przypadkach jest również używane do rejestracji nazwy funkcji zasobu, więc będzie działać.
Jeśli naciśniesz przycisk Zatwierdź dla Repozytorium Funkcji, to, co się pod nim dzieje jest wywoływane na obiekcie zasobu. (A jeśli używasz tekstowego interfejsu wejściowego, możesz również wywołać bezpośrednio.)
Domyślnie wysyłanie odbywa się pod nazwą powiązaną z Twoim identyfikatorem Wolfram ID. Ale jeśli wysyłasz zgłoszenie w imieniu grupy deweloperów lub organizacji, możesz i zamiast tego użyć go jako nazwy do interakcji z Twoimi widokami.
Po tym, jak wysłałeś jakąkolwiek z Twoich funkcji do bazy wiedzy funkcji, trafi ona do kolejki do sprawdzenia. Jeśli otrzymasz komentarze w odpowiedzi, zazwyczaj będą one w formie pliku tekstowego z dodatkowymi „komórkami komentarzy”. Zawsze możesz sprawdzić status swojego wniosku, wchodząc na . Ale kiedy Twoja funkcja zostanie zatwierdzona, zostaniesz powiadomiony (e-mailem), a Twoja funkcja zostanie umieszczona w repozytorium funkcji Wolfram.
Niektóre niuanse w działaniu
Na pierwszy rzut oka może się wydawać, że wystarczy wziąć notatnik definicyjny i dosłownie umieścić go w repozytorium funkcji, jednak w rzeczywistości istnieje wiele niuansów — a ich przetworzenie wymaga wykonania dość skomplikowanego meta-programowania, symbolicznie przetwarzając zarówno kod definiujący funkcję, jak i sam Notatnik definicyjny. Większość z tego dzieje się wewnętrznie, tzn. „za kulisami”, ale może to mieć pewne konsekwencje, które warto zrozumieć, jeśli zamierzasz wnieść swój wkład do bazy wiedzy funkcji.
Pierwsza bezpośrednia subtelność: Gdy wypełniasz „Notatnik definicji”, możesz po prostu odnosić się do swojej funkcji wszędzie, używając nazwy takiej jak MyFunction, która wygląda jak zwykła nazwa funkcji w języku Wolfram Language, ale w dokumentacji repozytoriów funkcji jest zastępowana – to właśnie to, co użytkownicy będą rzeczywiście używać przy pracy z tą funkcją.
Druga subtelność: kiedy tworzysz funkcję zasobową z Notatnika definicji, wszystkie zależności zaangażowane w definicję funkcji muszą być stałe i wyraźnie uwzględnione. Jednak aby zapewnić, że definicje pozostaną modularne, trzeba je umieścić w unikalnej . (Oczywiste jest, że , znajdują się w repozytorium funkcji.)
Zwykle nigdy nie zobaczysz żadnych śladów działania kodu używanego do konfiguracji tej przestrzeni nazw. Ale jeśli z jakiegoś powodu wywołasz niespełniony symbol wewnątrz swojej funkcji, to zobaczysz, że ten symbol znajduje się w wewnętrznym kontekście funkcji. Jednak podczas przetwarzania Notatnika definicji przynajmniej symbol odpowiadający samej funkcji, jako funkcjonalny BLOB, a nie surowy symbol w wewnętrznym kontekście.
Repozytorium funkcji ma na celu definiowanie nowych funkcji. I te funkcje mogą mieć opcje. Często te parametry (np. lub ) będą miały możliwość wykorzystania do funkcji wbudowanych, a także do tych, dla których już istnieją wbudowane symbole. Ale czasami nowej funkcji mogą być potrzebne nowe opcje. Aby zachować modularność, należy, aby te parametry były symbolami zdefiniowanymi w unikalnym wewnętrznym kontekście (lub czymś w rodzaju całych funkcji zasobowych, tj. samych w sobie). Dla wygody repozytorium funkcji pozwala definiować nowe opcje w definicjach w postaci ciągów. A dla wygody użytkownika te definicje (pod warunkiem, że używano i ) są również przetwarzane w taki sposób, że podczas używania funkcji parametry mogą być definiowane nie tylko jako ciągi, ale także jako symbole globalne o tych samych nazwach.
Większość funkcji po prostu wykonuje to, co powinna, za każdym razem, gdy są wywoływane, ale niektóre funkcje muszą być zainicjowane, zanim będą mogły działać w danej sesji — aby to rozwiązać, 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 dla repozytorium funkcji, obejmujące dwie (lub więcej) funkcje, które odnoszą się do siebie nawzajem — należy je rozwinąć w trakcie pracy z programem, aby mogły być stosowane. , a następnie możesz stworzyć potrzebne kombinacje tych funkcji przykłady i dodać do repozytorium nową funkcję na podstawie już wcześniej umieszczonych.
Perspektywy rozwoju. Co powinno się stać, kiedy repozytorium stanie się naprawdę duże?
Dziś dopiero uruchamiamy repozytorium funkcji Wolfram, ale z biegiem czasu oczekujemy, że jego objętość i funkcjonalność mogą gwałtownie wzrosnąć, a w miarę jego rozwoju pojawią się różne problemy, które, jak już przewidujemy, mogą się pojawić.
Pierwszy problem dotyczy nazw funkcji i ich unikalności. Repozytorium funkcji jest zaprojektowane w taki sposób, że tak jak dla wbudowanych funkcji w języku Wolfram Language, można odwołać się do dowolnej danej funkcji, po prostu podając jej nazwę. Jednak nieuchronnie oznacza to, że nazwy funkcji muszą być globalnie unikalne w całym repozytorium, tak że na przykład w repozytorium może być tylko jedna .
Na pierwszy rzut oka może to wydawać się dużym problemem, ale warto zrozumieć, że jest to głównie ten sam problem, co w przypadku takich rzeczy jak domeny internetowe czy identyfikatory w mediach społecznościowych. A to, że w systemie po prostu musi być rejestrator — i to jedna z ról, które nasza firma będzie pełnić dla bazy wiedzy funkcji Wolfram. (Dla prywatnych wersji repozytorium ich rejestratorami mogą być administratorzy.) Oczywiście, domeny internetowe mogą być rejestrowane bez posiadania czegokolwiek na nich, ale w repozytorium funkcji, nazwa funkcji może być zarejestrowana tylko w przypadku posiadania faktycznej definicji funkcji.
Częścią naszej roli w zarządzaniu bazą wiedzy funkcji Wolfram jest zapewnienie, że nazwa wybrana dla funkcji jest logiczna w kontekście definicji funkcji oraz że odpowiada konwencjom nazewnictwa Wolfram Language. Mamy już ponad 30-letnie doświadczenie w nazywaniu funkcji wbudowanych w języku Wolfram Language, a nasz zespół kuratorski przekaże to doświadczenie również do repozytorium funkcji. Oczywiście, zawsze istnieją wyjątki. Na przykład, może wydawać się bardziej preferowane posiadanie krótkiej nazwy dla niektórej funkcji, ale lepiej „chronić się” dłuższą, bardziej konkretną nazwą, ponieważ zmniejsza to prawdopodobieństwo, że ktoś zechce stworzyć podobną nazwę funkcji w przyszłości.
(Należy zauważyć, że proste dodanie jakiejkolwiek etykiety uczestnika w celu usunięcia niejednoznaczności funkcji nie przyniesie oczekiwanego efektu. Ponieważ, jeśli nie będzie się wymagać zawsze przypisania etykiety, trzeba będzie określić domyślną etykietę dla każdej danej funkcji, a także wyróżniać etykiety autora, co ponownie wymagałoby globalnej koordynacji.)
W miarę wzrostu objętości bazy wiedzy funkcji Wolfram jednym z problemów, które na pewno się pojawią, jest wykrywalność funkcji, do tego w systemie przewidziana jest (a pliki definujące mogą zawierać słowa kluczowe itp.). Dla wbudowanych funkcji w języku Wolfram Language w dokumentacji istnieją różne rodzaje odnośników, które pomagają „reklamować” funkcje. Funkcje w repozytorium funkcji mogą odnosić się do wbudowanych funkcji. A co z odwrotem? W tym celu zamierzamy eksperymentować z różnymi schematami, aby przedstawić funkcje repozytorium na stronach dokumentacji dla wbudowanych funkcji.
Dla wbudowanych funkcji w języku Wolfram Language istnieje tak zwany poziom wykrywalności, zapewniany przez , które dostarczają uporządkowane listy funkcji związanych z konkretnymi obszarami. Zawsze jest trudno odpowiednio zrównoważyć strony poradnika, a w miarę rozwoju języka Wolfram strony poradnika często muszą być całkowicie reorganizowane. Całkiem łatwo jest umieścić funkcje z repozytorium w szerokich kategoriach i nawet systematycznie dzielić te kategorie, ale daleko cenniejsze jest posiadanie dobrze zorganizowanych stron poradnika języka. Nie jest jeszcze jasne, jak najlepiej stworzyć je dla całej bazy wiedzy funkcji. Na przykład, w repozytorium funkcji każdy może umieścić stronę internetową zawierającą swoje „wybory” z repozytorium:

Repozytorium funkcji Wolfram jest ustawione jako trwałe przechowywanie funkcji, gdzie każda funkcja w nim zawsze będzie działać. Oczywiście mogą pojawić się nowe wersje funkcji i oczekujemy, że niektóre funkcje z czasem w końcu przestaną być aktualne. Funkcje będą działać, jeśli są wykorzystywane w programach, ale ich strony dokumentacji będą odnosić się do nowych, bardziej zaawansowanych funkcji.
Repozytorium funkcji Wolfram ma na celu szybkie pozyskiwanie nowych funkcji i odkrywanie nowych możliwości wykorzystania języka Wolfram. Z dużą dozą optymizmu mamy nadzieję, że część tego, co zostało zbadane w repozytorium funkcji, ostatecznie stanie się sensowną częścią podstawowego języka Wolfram Language. W ciągu ostatniej dekady mieliśmy podobny zestaw . A jedną z lekcji, jakie wyciągnęliśmy z tych doświadczeń, jest to, że osiągnięcie standardów jakości i spójności, na których kładziemy nacisk we wszystkim, co jest wbudowane w język Wolfram, wymaga wielu prac, które najczęściej są bardziej skomplikowane niż początkowe wysiłki związane z wprowadzeniem pomysłu. Ale nawet w takim przypadku funkcja w bazie wiedzy funkcji może być bardzo użytecznym dowodem koncepcji przyszłej funkcji, która ostatecznie może być wbudowana w język Wolfram.
Najważniejsze jest to, że funkcja w repozytorium funkcji jest dostępna dla każdego użytkownika do natychmiastowego wykorzystania. Możliwe, że wbudowana funkcja języka może być znacznie lepsza i wydajniejsza, ale repozytorium funkcji umożliwia użytkownikom natychmiastowy dostęp do wszystkich nowych funkcji. Co więcej, ta koncepcja pozwala każdemu na dodawanie własnych nowych funkcji.
Kiedyś w historii języka Wolfram ta idea nie zyskałaby takiego powodzenia jak obecnie, ale na tym etapie w język włożono tyle wysiłku oraz posiada tak głębokie zrozumienie zasad projektowania, że teraz wydaje się bardzo możliwe, by duża społeczność użytkowników dodawała funkcje, które będą wspierać spójność projektu, aby były użyteczne dla szerokiego kręgu użytkowników.
W społeczności użytkowników Wolfram Language panuje niesamowity duch talentu. (Oczywiście, w tę społeczność wchodzą wielu czołowych specjalistów w dziedzinie badań i rozwoju w różnych obszarach.) Mam nadzieję, że repozytorium funkcji Wolfram stanie się efektywną platformą do ujawniania i rozpowszechniania tego ducha talentu. Tylko wspólnie możemy stworzyć coś, co znacznie rozszerzy zakres, w jakim można zastosować obliczeniową koncepcję języka Wolfram.
Przez ponad 30 lat przeszliśmy długą drogę w rozwoju języka Wolfram. Teraz wspólnie idźmy jeszcze dalej. Gorąco zachęcam wszystkich szanowanych użytkowników języka Wolfram na całym świecie do korzystania z tego repozytorium funkcji jako platformy oraz takiego nowego projektu programistycznego, jak Free Wolfram Engine dla programistów.
Źródło: habr.com
