Abstraktní Wikipedie/Aktualizace/2022-04-28
◀ | Aktualizace Abstraktní Wikipedie | ▶ |
Po spuštění Wikifunkcí plánujeme podporovat implementace funkcí ve dvou programovacích jazycích, Pythonu a JavaScriptu. To však bohužel neznamená, že veškerý kód napsaný v jazyce Python nebo JavaScript bude snadno dostupný ke zkopírování a použití ve Wikifunkcích. Kód musí splňovat určité požadavky. V dnešním zpravodaji se budeme zabývat těmito požadavky a tím, co můžete udělat pro přípravu kódu, který chcete zpřístupnit prostřednictvím Wikifunkcí.
Za prvé, užití kódu musí být legální. Podle výsledku komunitní diskuse bude kód zveřejněn pod licencí Apache-2. Pokud jste kód napsali sami nebo k němu jinak vlastníte práva, můžete jej ve Wikifuncích zveřejnit. Pokud přebíráte kód z existujícího open source projektu, musíte se ujistit, že má kompatibilní licenci.
Za druhé, kód musí být "funkcionální". To znamená, že při zadání určitého vstupu musí kód vždy vracet stejný výstup. Zejména proto je řada tříd funkcí nedostupná:
- Výsledek musí být určen vstupem a nesmí obsahovat náhodnou složku. To znamená, že nemůžeme mít funkci, která simuluje házení kostkou, vrací nově vyražený GUID nebo podobné náhodné výsledky. Náhodný prvek by narušil naši strategii ukládání do cache, zejména schopnost uložit libovolné volání funkce a nahradit ho jejím výsledkem, pokud je k dispozici.
- Výsledek funkce nemůže implicitně záviset na denní době, aktuálním datu nebo poloze uživatele. To znamená, že nemůžeme mít funkci, která vrací aktuální den v týdnu. Pokud chceme na takovém kontextu záviset, musíme jej explicitně uvést jako parametr funkce. Funkce typu "jak vysoko je zde právě teď slunce?" by musela být přeformulována na "jak vysoko je slunce v daném místě a čase?" a jako parametry by měla brát místo a čas.
- Volání funkce nemůže mít záměrné vedlejší účinky. Nesmí existovat volání funkcí, od kterých se očekává, že způsobí určitou změnu ve světě, např. volání funkce, která dává robotovi pokyn ke spuštění určité rutiny nebo která zapne světlo. Ano, volání funkce bude mít vždy nějaký vliv na svět (může způsobit změnu cache, bude využívat výpočetní zdroje a přemění část elektřiny na teplo), ale ty jsou vedlejší a mohou se v budoucnu změnit. Někdo může napsat systém, který bude využívat výsledky Wikifunkcí k ovládání svých robotů nebo zařízení, ale skutečné ovládání bude implementováno v tomto systému, ne ve Wikifunkcích.
- Funkce nemůže mít skrytý stav, který lze měnit voláním funkce. To je důsledek předchozího bodu. Znamená to například, že nemůžeme mít funkci, která si uchovává počet, kolikrát byla volána, a tento počet vrací.
- To také znamená, že nelze volat funkci, která upravuje článek Wikipedie nebo položku Wikidat. Úprava funkce nebo implementace funkce může nakonec změnit obsah článku na Wikipedii (tedy jakmile umožníme volání funkcí Wikifunkcí z článků na Wikipedii), ale volání funkce na Wikifunkcích nezpůsobí změnu obsahu článku.
- Funkce nesmí volat do webu nebo do internetu. Při spuštění nebudou povoleny žádné požadavky HTTP ani podobné mechanismy. Veškeré zdroje nebo data, které chce funkce použít, musí být uvedeny jako parametry.
- Zpočátku nebudou mít funkce přístup k datům z projektů Wikimedia. Plánujeme rozšířit Wikifunkce v jednom z prvních milníků po spuštění, aby umožnily přístup k položkám a lexémům ve Wikidatech a později k metadatům o mediálních souborech na Commons.
- Funkce nemohou ukládat nebo načítat soubory do trvalého souborového systému ani číst z trvalé databáze nebo do ní zapisovat. Nesmějí přistupovat k žádné jiné síti nebo zařízení.
Některé z těchto případů použití lze řešit až po spuštění (např. umožnění náhodných výsledků nebo použití implicitních argumentů pro funkce jako "jaký je aktuální čas?"), ale tyto případy budou vyžadovat pečlivé plánování, diskusi a nakonec i změny systému.
Jedná se o dalším omezení, která Wikifunkce zpočátku budou mít:
- Python i JavaScript mají k dispozici rozsáhlý ekosystém knihoven třetích stran. Zpočátku bude možné přistupovat pouze ke standardní knihovně jazyka Python, respektive ke standardním vestavěným objektům jazyka JavaScript. Později plánujeme umožnit proces přidávání dalších knihoven a jejich zpřístupnění z implementace.
- Zpočátku nebude možné volat jinou funkci Wikifunkcí z implementace kódu (pouze z kompozic). Plánujeme to umožnit, i když zpočátku to může být omezeno na případy, kdy volaná funkce má také implementaci ve stejném programovacím jazyce.
- Zpočátku budou mít pouze některé typy vestavěnou serializační/deserializační logiku (tj. kód, který mapuje mezi reprezentací ZObject a objekty v paměti pro každý programovací jazyk). Těmito typy jsou Boolean, string, List, Map (v Pythonu se stane dictem, v JS Map) a Nothing (None v Pythonu, null v JS). Pro každý další typ bude nativní kód zpočátku pracovat přímo s příslušným nativním objektem JSON. Pracujeme na návrhu, který komunitě umožní přidat serializaci a deserializaci pro další typy.
- To také znamená, že neexistuje skutečná podpora pro "objekty" ve smyslu objektově orientovaných jazyků. Rozhraní s Wikifunkcemi bude volání funkce, nikoli volání metody objektu, které se může opírat o vnitřní stav. V objektech se také neskrývají žádné informace. Každá hodnota ve Wikifunkcích musí být zcela serializovatelná a deserializovatelná. Hodnoty jsou neměnné, což je také v rozporu s tím, jak se objekty běžně navrhují a používají v praxi v mnoha objektově orientovaných kontextech.
- Zpočátku nebudeme mít vestavěný mechanismus pro podporu volání ani hierarchii typů.
Již nyní plánujeme přidat další programovací jazyky, ale i pro ně budou platit podobná omezení. JavaScript i Python, stejně jako mnoho dalších jazyků, umožňují definovat funkce nejvyšší úrovně. Pro ostatní jazyky, jako je Java nebo Smalltalk, bychom museli definovat trochu jiný vzor, aby mohly komunikovat s funkčním rozhraním, které Wikifunkce poskytují. Kdykoli přidáme nějaký jazyk, bude tento proces zahrnovat návrhový krok, ve kterém budeme diskutovat o vhodných mapováních. Plánujeme také zdokumentovat, jak lze přidávat další programovací jazyky, aby se toto úsilí stalo předvídatelným.
Tento příspěvek neobsahuje žádné příklady ani návody, ale spíše popisuje požadavky na implementaci. V následujících týdnech budeme pokračovat jedním nebo více příspěvky, které se budou zabývat několika vzory a příklady toho, jak by kód z knihoven mohl být znovu použit v rámci Wikifunkcí.
Děkujeme uživateli Mahir256 za poskytnutí připomínek k dřívějším návrhům tohoto zpravodaje.