Další kulaté výročí v IT: dvacet let existence Pythonu 2

27. 2. 2020
Doba čtení: 29 minut

Sdílet

Na sérii článků o kulatých výročích v oblasti IT, které jsme oslavili loni i začátkem letoška, dnes navážeme. Blíží se totiž dvacáté výročí vydání Pythonu 2 a relativně brzy oslavíme i třicáté narozeniny samotného jazyka Python.

Obsah

1. Dvacet let existence Pythonu 2

2. Předchůdce Pythonu – neúspěšný jazyk ABC

3. Odsazování v ABC a Pythonu

4. Další skriptovací jazyk?

5. Python 1

6. Python 2

7. Svět Pythonu aneb nejedná se pouze o CPython

8. Jython a IronPython

9. PyPy a RPython

10. Projekt Cython

11. Numba aneb další přístup k překladu Pythonu do nativního kódu

12. Programovací jazyk Python ve webovém prohlížeči

13. Rozšíření programovacího jazyka Python o další vlastnosti

14. GDScript

15. Příklady použití Pythonu

16. Pygame a Pyglet

17. Python a oblast CAD/CAM

18. Jazyk Python na vrcholu popularity

19. Budoucnost Pythonu

20. Komunita uživatelů jazyka Python

21. Odkazy na Internetu

1. Dvacet let existence Pythonu 2

„Interview Guido van Rossum: “I'd rather write code than papers.”“

Na úvod dnešního článku si zopakujme, že v loňském roce jsme si na stránkách Roota připomněli trojici kulatých a současně i významných výročí v oblasti programovacích jazyků. Po dvojici článků o třicátých narozeninách Turbo Pascalu 5.5 a šedesátém výročí vzniku programovacího jazyka COBOL jsme si připomněli i sedmdesát let, které uběhly od vzniku nástroje, který dnes nazýváme assembler. Díky tomu, že samotný obor mechanických, elektromechanických a později čistě elektronických počítačů existuje již osmdesát let, lze oprávněně očekávat, že další významná výročí oslavíme i letos. Ostatně již stačil vyjít článek o jednom z nejvýznamnějších programovacích jazyků vůbec. Jednalo se o ALGOL, přesněji řečeno o ALGOL-60. Ovšem zatímco samotný ALGOL je i přes velký vliv na další vývoj programovacích jazyků prakticky mrtvým projektem, zdaleka to neplatí pro dnešního jubilanta – programovací jazyk Python.

Obrázek 1: Vývoj programovacích jazyků, jejichž prapředkem je ALGOL-58.

Ve skutečnosti letos oslavuje kulatiny Python 2, nikoli samotný jazyk Python (i když toto je poměrně diskutabilní, protože v roce 1990 skutečně vznikla interní verze pro potřeby CWI). První zveřejněná varianta Pythonu nesla označení 0.9.0 a byla poslána do diskusní skupiny alt.sources v roce 1991.

Poznámka: kulatiny tedy slaví Python 2.0, který byl vydán v roce 2000 a slaví tedy 20 let.Z těchto číselných údajů – 2.0, 2000, 20 – je patrné, že Guido van Rossum je pokrokový a řídí se doporučeními Járy Cimrmana na zapamatovatelná data. Autor tohoto článku až tak pokrokový není, protože ho měl raději napsat a vydat už před týdnem.

2. Předchůdce Pythonu – neúspěšný jazyk ABC

„I remembered all my experience and some of my frustration with ABC. I decided to try to design a simple scripting language that possessed some of ABC's better properties, but without its problems. So I started typing. I created a simple virtual machine, a simple parser, and a simple runtime. I made my own version of the various ABC parts that I liked. I created a basic syntax, used indentation for statement grouping instead of curly braces or begin-end blocks, and developed a small number of powerful data types: a hash table (or dictionary, as we call it), a list, strings, and numbers.“

Pro většinu čtenářů asi nebude příliš velkým překvapením konstatování, že autorem programovacího jazyka Python je Guido van Rossum. Před popisem vývoje samotného Pythonu se však musíme nejprve zmínit o programovacím jazyce ABC, jehož vývoj začal již v polovině osmdesátých let minulého století v CWI. Pravě na vývoji tohoto jazyka pracoval mj. i Guido; tehdy na juniorské pozici a ve vývojovém týmu společně s Lambertem Meertensem, Leo Geurtsem a Stevenem Pembertonem. Cílem tohoto týmu bylo vytvořit programovací jazyk dobře použitelný i lidmi, kteří sice nejsou profesionálními programátory, ale aplikace potřebují vytvářet a nějakým způsobem udržovat (jednou z cílových skupin byli pochopitelně vědci).

Jen pro připomenutí dobových reálií – v polovině osmdesátých let minulého století došlo k obrovskému rozvoji v oblasti osmibitových domácích mikropočítačů i šestnáctibitových osobních mikropočítačů. A především domácím mikropočítačům kraloval jiný programovací jazyk určený pro širokou veřejnost a nikoli pro profesionály – BASIC. Jenže na rozdíl od (většinou) nestrukturovaného BASICu, který navíc nabízel jen základní datové typy (čísla, řetězce, jednorozměrná pole, matice) byl programovací jazyk ABC navržen odlišným, dnes bychom řekli, že mnohem modernějším způsobem (zdá se, že Meertens dokonce BASIC přímo nesnášel, jeho motto bylo „Stamp out Basic!“). Ostatně podívejme se na jednoduchý příklad programu, který získá všechna slova ze vstupního dokumentu. Můžeme zde vidět velkou podobnost s pozdějším Pythonem – odsazování je součástí syntaxe, používání dvojteček, programová smyčka typu for-each, použití operátoru not.in atd:

HOW TO RETURN words document:
   PUT {} IN collection
   FOR line IN document:
      FOR word IN split line:
         IF word not.in collection:
            INSERT word IN collection
   RETURN collection
Poznámka: HOW TO RETURN definuje novou funkci, tj. jedná se o obdobu dnešního def. Referenční příručka celého jazyka ABC je dostupná na stránce https://homepages.cwi.nl/~ste­ven/abc/qr.html.

Ovšem ukázalo se, že svět IT nebyl na tento programovací jazyk připraven (někdo by řekl, že se jednalo o špatné načasování vstupu na trh). Na mikropočítačích s relativně malými systémovými zdroji nebylo možné potenciálu ABC využít (navíc mu konkuroval BASIC, o kterém vycházely desítky, možná i stovky knížek a který byl díky uložení v ROM logicky prvním jazykem většiny začátečníků) a na druhé straně výkonnostního spektra, tedy na počítačích s UNIXem, se již používaly odlišné skriptovací jazyky, například Tcl (1988) a Perl (1987); na strojích IBM se naproti tomu používal jazyk Rexx (1979), ze kterého se na Amize vyvinul jazyk ARexx. Nicméně i přes relativní neúspěch jazyka ABC nebyly základní myšlenky ztraceny, protože je později Guido van Rossum použil právě při implementaci první verze Pythonu, který z jazyka ABC v mnoha ohledech vycházel.

Prvotní verze Pythonu (před oficiální verzí 1.0) jsou vypsány v následující tabulce:

Verze Datum vydání
0.9.0 20. února 1991
0.9.1 konec února 1991
0.9.2 podzim 1991
0.9.4 24. prosince 1991
0.9.5 2. ledna 1992
0.9.6 6. dubna 1992
0.9.8 9. ledna 1993
0.9.9 29. července 1993
Poznámka: pravděpodobně již nikdo tyto verze nepoužívá v produkčním prostředí, což ovšem neplatí pro Python 1.

3. Odsazování v ABC a Pythonu

Zkušenější programátoři, kteří se seznamují s programovacím jazykem Python, bývají překvapeni tím, že součástí syntaxe tohoto jazyka je i odsazení; navíc se na začátku bloků používá dvojtečka (naopak začátečníci, kteří jiný jazyk neznají, tento fakt většinou zcela přirozeně přijmou). Kde se vlastně tento neobvyklý zápis programů objevil? Ještě před samotným jazykem ABC bylo vytvořeno několik jeho předchůdců označovaných písmenem B a číslovkou (B0, B1, …). A již v B0 se objevilo povinné odsazování, které zde mělo význam sdružení operací do bloků. Ovšem samotné bloky tehdy byly uvozeny klíčovými slovy BEGIN a END. Plánovalo se, že díky použití klíčových slov bude odsazování prováděno automaticky ve specializovaném programátorském textovém editoru.

Poznámka: tato klíčová slova známe i z Pascalu nebo programovacího jazyka Lua. Ovšem v těchto jazycích není odsazování striktně vyžadováno, na rozdíl od jazyka B.

Obrázek 2: Nepovinné, ovšem pochopitelně doporučené odsazování v Pascalu, resp. zde konkrétně v Turbo Pascalu.

Ovšem poté si tvůrci jazyka B0 uvědomili, že vyžadovat odsazení a současně navíc i použití klíčových slov BEGIN a END je vlastně nadbytečné a proto v jazyce B1 (tedy ve druhé generaci jazyka B) již chybělo klíčové slovo BEGIN. Namísto END se používalo spojení END IF, END FOR atd. (to tedy znamená, že podmínky a smyčky automaticky vytvářely bloky, což je podle mého názoru dobrý způsob strukturování programů). A nakonec se v jazyce B2 programátoři „museli“ zcela obejít bez zápisu začátků a konců bloků pomocí klíčových slov – vše bylo vyřešeno pouhým odsazením.

Poznámka: odsazení pro specifikaci bloků se používalo i v jiných jazycích (Miranda atd.), ovšem jazyk B byl pravděpodobně prvním jazykem, kde k této implementaci došlo.

Dalším typickým prvkem jazyka B (a posléze ABC a Pythonu) je dvojtečka před začátkem bloku. Myšlenka použít dvojtečku vznikla v roce 1978, kdy Robert Dewar, Peter King, Jack Schwartz a náš starý známý Lambert Meertens navrhovali syntaxi jazyka B a porovnávali různě zápisy bubble sortu. Nakonec zavolali manželku Roberta Dewara a zeptali se jí, zda se jí navržená varianta líbí. Ta odpověděla, že má pocit, že se zápis „FOR i …“ vztahuje pouze k jednomu řádku a nikoli k celému bloku pod tímto řádkem. A právě na základě tohoto alfa testingu návrhu jazyka bylo rozhodnuto před začátkem bloku používat dvojtečku, což Pythonu vydrželo až do dneška.

Poznámka: to vlastně znamená, že dvojtečka před začátkem bloku (namísto závorek či klíčových slov) není v žádném případě novým a neobvyklým vynálezem; je s námi v IT již 42 let.

4. Další skriptovací jazyk?

Jak jsme se již zmínili v úvodní kapitole, vznikl programovací jazyk Python na samotném začátku devadesátých let minulého století. Z mnoha pohledů se jednalo o důležitý mezník v rozvoji IT, protože právě tehdy se začala stále více rozšiřovat myšlenka, že programovací jazyky určené pro vývoj plnohodnotných aplikací lze zhruba rozdělit do dvou kategorií – překládané systémové jazyky a jazyky skriptovací. Samozřejmě, že se skriptovací jazyky používaly i před tímto obdobím, ale většinou se jednalo o relativně primitivní formy předpisů pro dávkové úlohy (výjimkou je například již zmíněný jazyk Rexx, jehož vyjadřovací prostředky již byly na vysoké úrovni) a převažoval názor, že plnohodnotné aplikace musí být psány v překládaných jazycích, tedy typicky v jazycích ALGOLské větvě se statickým typováním (schválně nepíšu se silným typováním, to je sice související, ovšem odlišná vlastnost).

V průběhu devadesátých let se tedy zpočátku mírně opovrhované skriptovací jazyky staly mnohdy nedílnou součástí mnoha profesionálních aplikací. Celý vývoj a s ním související myšlenkový posun byl nakonec shrnut ve slavném článku Johna Ousterhouta „Scripting: Higher Level Programming for the 21st Century“, v němž se opakovala myšlenka na souběžné a koopertivní použití dvou jazyků – systémového a skriptovacího.

Poznámka: do skupiny klasických skriptovacích jazyků z této doby lze zařadit právě Python, dále Perl, Tcl, Rexx, shell (resp. jeho různé varianty) a taktéž poněkud později vytvořený jazyk Ruby. Ovšem ze širšího pohledu můžeme skupinu rozšířit například i o programovací jazyk Lua nebo o JavaScript.

5. Python 1

První stabilní (ve smyslu sémantiky) verze programovacího jazyka Python byla vydána v roce 1994 a verze 1.x byly postupně vydávány až do roku 2001, kdy vyšla poslední jedničková verze 1.6.1, která celou řadu Python 1 uzavřela. V Pythonu 1 pochopitelně nenalezneme všechny vlastnosti, které známe ze stále ještě rozšířeného Pythonu 2 nebo Pythonu 3. Například řetězce byly v Pythonu 1 čistě osmibitové (ASCII), zatímco už v Pythonu 2 bylo možné použít Unicode řetězce. Dále v Pythonu 1 nebyla podporována generátorová notace seznamu neboli list comprehension. Taktéž neexistovaly operátory spojené s přiřazením, tedy například +=, |= atd. Ty byly přidány až do Pythonu 2; inspirací byly pochopitelně céčkové jazyky. A konečně, v Pythonu 1 neměly řetězce žádné metody, například string.startswith atd. – i tato funkcionalita byla přidána až v Pythonu 2.

Obrázek 3: Python 1.5.2 na moderním hardware.

V následující tabulce jsou vypsány všechny oficiálně vydané verze Pythonu 1:

Verze Datum vydání
1.0.0 26. ledna 1994
1.0.2 15. února 1994
1.0.3 4. května 1994
1.0.4 14. července, 1994
1.1 11. října 1994
1.1.1 10. listopadu 1994
1.2 13. dubna 1995
1.3 13. října 1995
1.4 25. října 1996
1.5 3. ledna 1998
1.5.1 31. října 1998
1.5.2 13. dubna 1999
1.6 5. září 2000
1.6.1 25. února 2001
Poznámka: v době, kdy verze knihovny určené pro JavaScript vydaná před dvěma týdny je považována za zoufale zastaralou, se to může zdát zvláštní, ale stále se můžeme ve specifických případech setkat s použitím Pythonu verze 1. Konkrétně jsem viděl použití Pythonu 1.5.2 a 1.6.1. Ostatně konkrétně tyto verze jsou dostupné ve formě zdrojových kódů a jsou stále přeložitelné i na současných verzích Linuxu.

Obrázek 4: Interaktivní smyčka REPL Pythonu 1.5.2 již měla všechny základní vlastnosti interaktivních smyček používaných dodnes.

6. Python 2

„Python where we can, C++ where we must.“
 Google

Tento článek vznikl primárně kvůli Pythonu 2, jehož první vydání datujeme na 16. říjen 2000, takže Python 2 skutečně letos oslaví dvacetileté výročí (resp. přesněji řečeno ho neoslaví, protože mu ještě před tímto datem skončí oficiální podpora). Python 2 byl velmi úspěšným projektem, který do značné míry zajistil Pythonu místo na samotném vrcholu popularity programovacích jazyků. Ovšem již v roce 2008 vyšel Python 3.0 (založený na PEP 3000 alias Python 3000), který je s verzí 2 částečně nekompatibilní. A právě popularita a velké rozšíření Pythonu 2 a jeho balíčků na jedné straně a nekompatibilita Pythonu 3 na straně druhé zapříčinila více než desetileté schizma světa Pythonu, které je teprve postupně napravováno s tím, jak se stále více balíčků a aplikací portuje na Python 3.

Obrázek 5: Původní logo Pythonu.

Poznámka: na druhou stranu je nutné poznamenat, že se přechod na Python 3 v mnoha oblastech podařil a to v mnoha případech relativně snadno. Nenastala tedy taková patová situace, jako v případě Perlu 5 vs. Perl 6 (dnes Raku).

Obrázek 6: Nové logo Pythonu.

Opět si pochopitelně vypíšeme data vydání různých verzí Pythonu 2 (bez desetinných vydání):

Verze Datum vydání
2.0 16. října 2000
2.1 17. dubna 2001
2.2 21. prosince 2001
2.3 29. července 2003
2.4 30. listopadu 2004
2.5 16. září 2006
2.6 1. října 2008
2.7 3. července 2010

7. Svět Pythonu aneb nejedná se pouze o CPython

Původní interpretr programovacího jazyka Python se dnes nazývá CPython, protože mnohdy je nutné odlišit mezi mnoha implementacemi Pythonu. V současnosti totiž kromě klasického (a nutno říci, že pro některé účely i pomalého) CPythonu máme k dispozici i překladače, a to jak AOT (ahead of-time), tak i JIT (just-in-time). Navíc existují i další varianty Pythonu určené pro běh na virtuálních strojích Javy, popř. CLR. Svět Pythonu je tedy velmi rozsáhlý a pravděpodobně se (možná vedle Scheme a LISPu) jedná o jazyk s nejvíce různorodými implementacemi vůbec. S některými zajímavými implementacemi Pythonu se ve stručnosti seznámíme v navazujícím textu.

8. Jython a IronPython

Jython je jméno implementace programovacího jazyka Python určená pro běh ve virtuálním stroji jazyka Java (JVM – Java Virtual Machine). A nejenom to – aplikace psané v Jythonu mohou kooperovat s třídami a rozhraními vytvořenými v Javě, což je pro mnoho aplikací velmi výhodné, protože s rostoucí složitostí moderních aplikací je většinou zapotřebí mít k dispozici vhodný skriptovací jazyk sloužící jako „lepidlo“ (glue) mezi jednotlivými bloky, z nichž se aplikace skládá (viz již výše zmínený Ousterhoutův článek). Jython ovšem samozřejmě není dokonalý. Jednou z jeho nevýhod je fakt, že je stále postaven na dnes již obstarožním Pythonu 2, druhou nevýhodou pak ta skutečnost, že se jedná o dosti pomalý jazyk. Tato pomalost se negativně projeví zejména při výpočtech a někdy i při manipulaci s rozsáhlými datovými strukturami, ovšem u aplikací, v nichž převládají I/O operace se nemusí jednat o kritický nedostatek.

Obrázek 7: Logo programovacího jazyka Jython.

Alternativou k Jythonu jsou jazyky Groovy a Scala.

Další implementací Pythonu je IronPython. Zatímco Jython je určený pro JVM, IronPython využívá možností poskytovaných CLR (Common Language Infrastructure) a nad ní postavenou knihovnou DLR (Dynamic Language Runtime), která je přímo určená pro implementaci dynamických programovacích jazyků. IronPython může spolupracovat s kódem napsaným v dalších jazycích běžících nad CLR a tím pádem dobře zapadá do celého frameworku .NET i Mono. Výkonnost IronPythonu bývá srovnatelná s klasickým CPythonem – některé benchmarky dopadají hůře, jiné lépe (obecně však lze říci, že IronPython je rychlejší než Jython).

Obrázek 8: Logo programovacího jazyka IronPython.

9. PyPy a RPython

„RPython is half-Python, half-not-Python, and Python“

S projektem PyPy se již s velkou pravděpodobností setkalo mnoho programátorů používajících pro vývoj programovací jazyk Python. Jen ve stručnosti si řekněme, že se jedná o jednu z (dnes již velkého množství) implementací Pythonu, která je založena na interpretru (podobně jako klasický CPython) zkombinovaném s just-in-time překladačem (JITem). Samotný projekt PyPy je přitom z velké části napsán ve dvou jazycích – běžném Pythonu a navíc i v RPythonu, což je programovací jazyk, jehož základní vlastnosti si v této kapitole stručně představíme. RPython získal své jméno ze sousloví „Restricted Python“, přičemž všechna omezení, která RPython zavádí, jsou pečlivě vybrána z toho důvodu, aby se zjednodušila či vůbec umožnila analýza ®pythonovského kódu, který je překládán do nativního (objektového) kódu.

Obrázek 9: Logo projektu PyPy.

Tím se dostáváme k základní vlastnosti RPythonu – ten totiž není interpretován, ale skutečně překládán do objektového kódu a z výsledku se vytváří spustitelná aplikace. Celý proces zpracování je poměrně komplikovaný a zdlouhavý, ale ve stručnosti ho lze popsat několika body:

  1. Na vstupu se nachází zdrojové kódy naprogramované v RPythonu (.py)
  2. Nejprve je ze zdrojových kódů vytvořen bajtkód (.pyc)
  3. Z bajtkódu se vygeneruje CFG a ten se následně analyzuje
  4. Grafovou strukturou se prochází a mj. se provádí anotace proměnných (odvození typů, viditelnosti apod.)
  5. Následuje několik konverzí, které se mohou lišit podle toho, pro jakou platformu se generuje výsledek a jaké optimalizace jsou povoleny (inlining, rozbalení smyček atd.)
  6. Dále se do mezivýsledku vkládají i instrukce pro GC
  7. Z grafové struktury se vygeneruje zdrojový kód pro výslednou platformu (typicky pro překladače ANSI C, což je platforma, která nás zajímá dnes)
  8. Pro naši platformu: překladačem ANSI C se provede překlad do objektového kódu
  9. Nakonec se provede slinkování a vytvoření výsledného spustitelného souboru (nebo dynamické knihovny)

10. Projekt Cython

Jedním z nejznámějších a pravděpodobně i nejpoužívanějších projektů, které se zaměřují na překlad Pythonu, patří nástroj nazvaný Cython (pozor: neplést s podobně pojmenovaným CPythonem, což je ovšem označení klasického interpretru Pythonu, které se většinou používá ve chvíli, kdy je v nějakém kontextu zapotřebí rozlišit CPython od Jythonu a také Iron Pythonu). Dnes se zmímíme jen o základních vlastnostech Cythonu.

Obrázek 10: Logo Cythonu.

Tento překladač pracuje poněkud odlišným způsobem než RPython. Zatímco se totiž RPython snaží odvozovat datové typy proměnných, argumentů i návratových hodnot funkcí na základě analýzy grafu (CFG), používá Cython přímý překlad Pythonu do programovacího jazyka C. Ve chvíli, kdy Cython nezná datový typ funkce/proměnné/argumentu, použije PyObject *, tedy ukazatel na datovou strukturu reprezentující v Pythonu libovolnou hodnotu. V dalším kódu je samozřejmě nutné z tohoto objektu získat skutečnou hodnotu. I takto vlastně velmi primitivně provedený překlad dokáže programový kód zrychlit, což je ostatně patrné i na výsledku benchmarků. Cython jde ale ještě dále, protože rozšiřuje jazyk Python o další klíčová slova, především pak o slovo cdef. Toto klíčové slovo je možné použít pro přesnou specifikaci typu proměnné či argumentu, a to způsobem, který plně vychází z programovacího jazyka C. Tato typová informace samozřejmě umožňuje provedení dalších optimalizací ve výsledném kódu (opět lze vidět na výsledcích benchmarku).

Poznámka: zdrojové kódy, v nichž jsou použita rozšíření Cythonu, již nejsou plně kompatibilní s Pythonem a z tohoto důvodu se většinou ukládají do souborů s koncovkou .pyx, což je zkratka původně odvozená od projektu Pyrex, z něhož byl Cython vyvinut.

11. Numba aneb další přístup k překladu Pythonu do nativního kódu

Princip činnosti nástroje Numba se v několika ohledech odlišuje od RPythonu ale i od Cythonu. Numba totiž umožňuje překlad kódu za běhu aplikace, tj. v runtime. Jedná se tedy o JIT neboli o just-in-time překladač, který má tu výhodu, že dokáže odvodit datové typy proměnných a argumentů funkcí na základě skutečného chování aplikace. To samozřejmě neznamená, že by JIT již při prvním volání funkce přesně věděl, jak má funkci přeložit. Ve skutečnosti se dozví pouze informace o jediné konkrétní větvi, kterou může přeložit. V případě, že bude ta samá funkce později volána s odlišnými typy parametrů, popř. se její chování změní jiným způsobem (Python je velmi dynamický jazyk), provede se just-in-time překlad znovu, takže zde zaplatíme za vyšší výpočetní výkon poněkud většími paměťovými nároky a pomalejším během prvních volání funkce.

Z pohledu běžného vývojáře je největší předností tohoto způsobu překladu fakt, že není zapotřebí samotný zdrojový kód měnit (až na uvedení anotace před funkci). Nepříjemný je přesun času překladu do runtime, což sice nevadí u aplikací, které běží delší dobu, ovšem u jednorázových skriptů může být použití JITu spíše kontraproduktivní. To ostatně uvidíme i na demonstračním příkladu.

Samotný překlad je prováděn na několika úrovních, přičemž Numby na nižších úrovních využívá možností nabízených LLVM. Jedná se o relativně složitou problematiku, které se budeme věnovat v samostatném článku.

Poznámka: s JITy jsme se již na stránkách Roota setkali, především v souvislosti s LuaJITem a JVM. Další odkazy naleznete na konci článku.

Obrázek 11: Porovnání doby výpočtu Mandelbrotovy množiny RPythonem, Cythonem (bez i s type hinty) a variantou naprogramovanou přímo v ANSI C. Z tohoto grafu je dobře patrné, jak důležité je pro Cython mít k dispozici o typech proměnných, parametrů a návratových kódů funkcí (jinými slovy – provedené optimalizace v tomto případě nezískáme zadarmo).

12. Programovací jazyk Python ve webovém prohlížeči

Python se relativně často používá při tvorbě webových aplikací na back endu tj. pro tu část webové služby/aplikace, která je provozována na serveru a nějakým způsobem komunikuje s ostatními komponentami vytvářeného systému: front endem (typicky webový prohlížeč s interpretrem JavaScriptu), databází a dalšími (mikro)službami, například s využitím message brokerů, systémů pro monitoring a správu událostí atd. Tato oblast samozřejmě není pokryta pouze Pythonem, ale najdeme zde i další programovací jazyky a technologie, zejména Javu (a celý její middleware), JavaScript či TypeScript (node.js) a dnes taktéž programovací jazyk Go.

Zatímco pozice Pythonu v oblasti back endu je poměrně zřejmá, je situace na front endu mnohem složitější. Důvod je jednoduchý – v této oblasti z historických důvodů kraluje JavaScript, přičemž veškeré snahy a náhradu tohoto jazyka byly prozatím neúspěšné (pokusů bylo hned několik, připomeňme například browsery s TCL, VBScript či projekt Dart). Ovšem stále se můžeme setkat se snahami JavaScript nepoužívat přímo, popř. ho obejít jinými nástroji. Příkladem mohou být technologie umožňující tvorbu webových aplikací podobným způsobem, jakoby se jednalo o aplikace desktopové. Příkladem tohoto přístupu mohou být projekty Pyjamas (pro Python), Google Web Toolkit (GWT), Apache Cordova atd.

Je tedy vůbec možné a praktické použít Python přímo na webovém front endu a pokud to je možné, jakou za to zaplatíme cenu? Ve skutečnosti existuje hned několik projektů, které se více či méně úspěšným způsobem snaží o to, aby byl Python na front endu skutečně použitelný, a to i pro reálně provozované aplikace. Mezi tyto projekty patří například:

  1. Brython. Jedná se o transpřekladač z Pythonu do JavaScriptu, přičemž samotný překlad (resp. přesněji řečeno transpřeklad) probíhá na pozadí, což znamená, že přímo v kódu webové stránky je umístěn (či načítán) kód v Pythonu. Podobné řešení jsme již viděli, například u projektu Wisp (jazyk podobný Clojure) či lua.js (transpřeklad z jazyka Lua). Výhodou Brythonu je, že se jakékoli úpravy ihned projeví v aplikaci po znovunačtení stránky (F5).
  2. Transcrypt je taktéž transpřekladačem Pythonu (konkrétně Pythonu 3) do JavaScriptu. Samotný transpřeklad je napsaný velmi dobře – zhruba platí, že velikost vygenerovaného kódu v JavaScriptu odpovídá velikosti původního kódu napsaného v Pythonu (případné zvětšení je o jednotky procent). Musíme však počítat s tím, že je nutné načíst i jádro Transcriptu, jehož velikost je přibližně 20 kB (tedy čím větší je kód samotné aplikace, tím (poměrově) menší budou režijní náklady. Zajímavá a užitečná je i podpora type hintů (informací o datovém typu parametrů, proměnných atd.)
  3. Podobným způsobem pracuje i projekt nazvaný pyjaco, který naleznete na adrese https://github.com/chrivers/pyjaco.
  4. Skulpt je naproti tomu v mnoha ohledech podobný projektu Brython, protože taktéž umožňuje provádět transpřeklad na pozadí (programátor tedy pracuje pouze se zdrojovým kódem vytvořeným v Pythonu).
  5. Velmi zajímavým nástrojem, který názorně ukazuje, jak vlastně transpřeklad funguje (a že jeho výsledek může být čitelný), je nástroj s poněkud zvláštním jménem fiddlesalad, který naleznete na adrese http://fiddlesalad.com/python/. Tento nástroj umožňuje zápis zdrojového kódu v Pythonu, který je ihned (již v době zápisu) transpřekládán do JavaScriptu a současně i spouštěn.
Poznámka: povšimněte si, že všechny projekty zmíněné v předchozím textu jsou ve skutečnosti transpřekladači neboli transpilery. Jedná se o technologii zajišťující, aby se i ve webovém prohlížeči mohlo (nepřímo) pracovat s dalšími programovacími jazyky, nejenom se všudypřítomným a nativně podporovaným JavaScriptem. Další variantou je interpretace s využitím interpretru psaného v JavaScriptu, popř. použití WebAssembly (viz též navazující kapitoly).

13. Rozšíření programovacího jazyka Python o další vlastnosti

„Coconut's goal isn't to replace Python, but to extend it“

Existuje i několik projektů, které rozšiřují syntaxi a především sémantiku Pythonu. Příkladem může být projekt Coconut, který je navržen takovým způsobem, aby byl zpětně kompatibilní s Pythonem. To znamená, že skript napsaný v Pythonu je současně i skriptem napsaným v jazyku Coconut (což je zajímavé, protože do Coconutu byla přidána tři nová klíčová slova data, match a case, jejichž význam se však rozlišuje z kontextu). Coconut je tak možné považovat za sémantické i syntaktické rozšíření Pythonu, přičemž se autor tohoto jazyka zaměřil především na funkcionální rysy (funkce vyššího řádu, neměnitelné hodnoty, podpora pro tvorbu kolon a kompozic funkcí atd.) a taktéž do Coconutu přidal podporu pro pattern matching (inspiraci získal zde). Coconut může pracovat jako interpret s interaktivní smyčkou REPL či jako transpřekladač (transcompiler, transpiler) do jazyka Python, takže je možné použít celý pythonovský ekosystém. Přesnější informace o tom, se kterými verzemi Pythonu je Coconut kompatibilní, naleznete na adrese http://coconut.readthedoc­s.io/en/master/DOCS.html#com­patible-python-versions.

Vzhledem k tomu, že je programovací jazyk Coconut implementován jako transpřekladač a současně se jedná o jazyk tvořící nadmnožinu Pythonu, je v něm možné použít prakticky všechny knihovny pythonovského ekosystému, což platí zejména pro CPython a PyPy, i když větší problémy nelze předpokládat ani v případě použití Jythonu či IronPythonu. Navíc je pro všechny programátory znající Python vlastně velmi jednoduché přejít na Coconut – stále je totiž možné využít stávající syntaxi a sémantiku Pythonu a rozšíření přidaná Coconutem použít jen v těch místech, kde to má v daný okamžik význam. To je zásadní rozdíl od některých jiných (nejenom funkcionálních) jazyků, s nimiž se programátor může setkat a které mnohdy vyžadují, aby se začal učit jak nový programovací jazyk, tak i jeho ekosystém (který je navíc u nově vznikajících jazyků zpočátku malý, navíc může být spousta knihoven dostupných jen v alfa verzích).

Použití transpřekladače však přináší i některé nevýhody, které se projeví například ve chvíli, kdy v programu vznikne chyba či nezachycená výjimka. V takovém případě totiž získáme stack trace platný pro výsledný pythonovský program, nikoli pro uživatelem vytvořený kód. Totéž může nastat ve chvíli, kdy budeme chtít program ladit, například přes GDB (nebo jeho nadstavby). Jen částečné řešení přináší přidání korespondujících čísel řádků v generovaném kódu, které lze povolit přepínačem -l nebo –line-numbers. Ještě častěji se můžeme setkat s tím, že syntaktická chyba zůstane nezachycena transpřekladačem Coconutu a vypíše ji až interpret Pythonu. Chybové hlášení tedy bude obsahovat odkaz na generovaný kód, nikoli na původní zdrojový kód vytvořený programátorem. Opět si lze alespoň částečně pomoci čísly řádků vepsanými do vygenerovaného zdrojového kódu v Pythonu.

Příklad použití Coconutu:

def factorial(n):
    if n <= 1:
        return 1
    else:
        return range(1, n+1) |> reduce$(*)
 
# funkce volaná jako infixový operátor
def n `nad` k:
    return factorial(n)/(factorial(k)*factorial(n-k))
 
print()
 
for k in range(5):
    print(4 `nad` k)

Kolona:

range(11) |> reversed |> sum |> print

Zpracování sekvencí:

print(list(takewhile(lambda x: x < 10, (count(0, 2)))))
 
[0, 2, 4, 6, 8]

Dalším užitečným rozšířením je mypy, díky němuž lze do kódu přidat statické typové informace a testovat je. Nejedná se sice o implementaci plnohodnotného typového systému, který najde všechny potenciální chyby, ale pro mnoho aplikací se může jednat o důležité vylepšení.

14. GDScript

Existují i jazyky inspirované Pythonem, které se ovšem používají ve specializovaných oblastech. Příkladem může být programovací jazyk nazvaný GDScript, který se používá v herním engine Godot. Původně se sice používal programovací jazyk Lua, který je do herních enginů vkládán už po dvě desetiletí, ovšem podle názoru autorů Godotu je kooperace mezi objektově orientovaným herním enginem a jazykem odvozeným od Pythonu snazší, než tou bylo v případě Luy.

Ostatně můžeme se sami podívat, do jaké míry se GDScript liší od originálního Pythonu:

func some_function(param1, param2):
    var local_var = 5
 
    if param1 < local_var:
        print(param1)
    elif param2 > 5:
        print(param2)
    else:
        print("Fail!")
 
    for i in range(20):
        print(i)
 
    while param2 != 0:
        param2 -= 1
 
    var local_var2 = param1 + 3
    return local_var2

Dotaz, zda objekt obsahuje určitou metodu (v runtime):

func _on_object_hit(object):
    if object.has_method("smash"):
        object.smash()

15. Příklady použití Pythonu

V současnosti je Python jedním z nejrozšířenějších jazyků, a to i podle oblastí, v nichž se používá:

  • Vývoj webových aplikací (primárně back-end, ale již víme, že několik projektů dokáže využít Python i na front-endu).
  • Vývoj her (Pyglet, Pygame).
  • Oblast strojového učení a umělé inteligence (zde je Python skutečně velmi populární, viz například úspěch PyTorche či TensowFlow).
  • Vizualizace (Matplotlib atd.)
  • Zpracování dat, numerické výpočty, symbolické výpočty (NumPy, SciPy).
  • CAD (viz navazující kapitoly)
  • Stále častěji se s Pythonem setkáme i v embedded oblasti, i když (pochopitelně) nikoli v realtime aplikacích ani v mikrořadičích s nedostatečnými prostředky.
  • Testování (Behave, Robot Framework).

16. Pygame a Pyglet

Pygame je knihovna určená pro programovací jazyk Python, která interně volá funkce nativní knihovny SDL (Simple DirectMedia Layer) a několika dalších podpůrných knihoven. Myšlenka, na níž je projekt Pygame postaven, je v mnoha ohledech podobná myšlence taktéž popsaného systému LÖVE – implementace nízkoúrovňových operací nechť je vytvořena a optimalizována odborníky v nízkoúrovňových programovacích jazycích C a C++. Pokud budou tyto operace implementovány dostatečně rychle, je již možné zbytek hry či multimediální aplikace naprogramovat ve vysokoúrovňovém jazyku Python (v případě LÖVE pak jazyka Lua). A ukazuje se, že je tato myšlenka – a obecně systém rozdělení aplikace mezi dva programovací jazyky (kompilovaný a skriptovací) – poměrně úspěšná, neboť v Pygame již vzniklo mnoho kvalitních her.

Výše stručně představená knihovna Pygame je kvůli své relativně těsné vazbě na nativní knihovnu SDL určena především pro tvorbu dvoudimenzionálních (2D) her, tj. například různých strategií (realtime i tahových), plošinovek, RPG apod. Ve chvíli, kdy je zapotřebí vytvořit plnohodnotnou trojrozměrnou hru, je možné namísto Pygame použít buď projekt PyOpenGL (rozhraní pro OpenGL) či další knihovnu určenou pro použití s programovacím jazykem Python. Tato knihovna se jmenuje Pyglet a mezi její základní vlastnosti patří poměrně úzká vazba na knihovnu OpenGL a tedy i nepřímo na grafické akcelerátory. Kromě vazby na knihovnu OpenGL však v Pyglet mohou programátoři najít i další zajímavé a užitečné moduly, například pro práci s hudbou a se zvuky (ALSA, OpenAL, DirectSound), podporu pro různé formáty uložení hudby (zejména OGG/Vorbis), podporu pro načítání a zobrazování animací uložených v DivX, AVI, MPEG, H.263 atd.

17. Python a oblast CAD/CAM

Programovací jazyk Python se relativně intenzivně používá i v oblasti počítačové grafiky. Známé je například jeho použití pro tvorbu pluginů pro GIMP, ovšem Python nalezneme i v mnoha profesionálních (a mnohdy i dosti drahých) aplikacích. Za zmínku stojí především tecplot (vizualizace, analýzy atd.), dále slavný nástroj Rhinoceros (Rhino3D), neméně slavný program Maya a Python lze využít i pro skriptování v Blenderu (už jen toto téma by si vyžádalo několik samostatných článků).

18. Jazyk Python na vrcholu popularity

Již na začátku tohoto článku jsme si řekli, že Python je velmi populárním jazykem. Svědčí o tom vlastně většina známých statistik popularity a používání programovacích jazyků, například Tiobe index (momentálně třetí místo), PYPL PopularitY of Programming Language (momentálně první místo), výsledky hlasování na StackOverflow (druhý nejoblíbenější, na prvním místě nejžádanějšího jazyka – potřetí za sebou), ale i ocenění, které je každoročně udělováno společností Tiobe:

bitcoin_skoleni

Rok Vítěz
2019 C
2018 Python
2017 C
2016 Go
2015 Java
2014 JavaScript
2013 Transact-SQL
2012 Objective-C
2011 Objective-C
2010 Python
2009 Go
2008 C
2007 Python
2006 Ruby
2005 Java
2004 PHP
2003 C++
Poznámka: poučné je i video https://www.youtube.com/wat­ch?v=Og847HVwRSI.

19. Budoucnost Pythonu

Python se postupně rozšiřuje do dalších oblastí, vznikají jeho nové varianty (například RustPython, který by se mohl rychle prosadit kvůli bezpečnosti) a nástroje pro převod kódů do jiných jazyků (Grumpy, který si ještě popíšeme v samostatném článku). Současně se Python stal součástí kurzů na mnoha středních i vysokých školách, takže se zvyšuje počet lidí, kteří tento jazyk ovládají. Nyní zbývá jen maličkost – konečně (po deseti letech plánování a varování) překonat schizma Python 2/Python 3. S tím souvisí i pokračování vývoje Jythonu, který oproti ostatním jazykům pro JVM (zejména oproti Scale a Kotlinu) prozatím zaostává.

20. Komunita uživatelů jazyka Python

Zapomenout nesmíme ani na komunitu, která okolo programovacího jazyka Python vznikla. V tuzemsku se můžeme pochlubit velmi aktivní a také otevřenou (to je důležité, zejména pro nováčky) komunitou, která pořádá konference, pravidelná setkání v několika městech a taktéž organizuje kurzy programování. Podrobnější informace o pořádaných akcích, ale i studijní materiály popř. knihovničku lze najít na snadno zapamatovatelné adrese https://python.cz/.

21. Odkazy na Internetu

  1. A Brief Timeline of Python
    http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html
  2. The ABC Programming Language: a short introduction
    https://homepages.cwi.nl/~steven/abc/
  3. ABC (programming language)
    https://en.wikipedia.org/wi­ki/ABC_(programming_langu­age)
  4. Most Popular Programming Languages 1965 – 2019
    https://www.youtube.com/wat­ch?v=Og847HVwRSI
  5. Karin Dewar, Indentation and the Colon
    http://python-history.blogspot.com/2011/07/karin-dewar-indentation-and-colon.html
  6. History of the software
    https://docs.python.org/3/li­cense.html
  7. History of Python (Wikipedia)
    https://en.wikipedia.org/wi­ki/History_of_Python
  8. History of Python (Python Course)
    https://www.python-course.eu/python3_history_an­d_philosophy.php
  9. The Python Programming Language
    https://www.tiobe.com/tiobe-index/python/
  10. PYPL PopularitY of Programming Language
    https://pypl.github.io/PYPL.html
  11. Supported Systems for Python
    https://www.oldapps.com/Python.php
  12. Download Python for Other Platforms
    https://legacy.python.org/dow­nload/other/
  13. PythonD
    http://www.caddit.net/pythond/
  14. Old Python releases
    https://www.python.org/dow­nload/releases/
  15. Interactive: The Top Programming Languages 2016 (starší data, pěkný způsob filtrace atd.)
    https://spectrum.ieee.org/sta­tic/interactive-the-top-programming-languages-2016
  16. Generational list of programming languages
    https://en.wikipedia.org/wi­ki/Generational_list_of_pro­gramming_languages
  17. Most Popular Programming Languages on Stack Overflow Bar Chart Race
    https://www.youtube.com/wat­ch?v=cKzP61Gjf00
  18. Zdrojové kódy starých verzí Pythonu
    https://legacy.python.org/dow­nload/releases/src/
  19. Python 1.5.2
    https://www.python.org/dow­nload/releases/1.5/
  20. Python 1.6.1
    https://www.python.org/dow­nload/releases/1.6.1/
  21. Python from ActiveState
    https://www.activestate.com/pro­ducts/python/
  22. 10 Important Uses of Python
    https://www.educba.com/uses-of-python/
  23. Top 10 Python Applications in the Real World You Need to Know
    https://www.edureka.co/blog/python-applications/
  24. 8 World-Class Software Companies That Use Python
    https://realpython.com/world-class-companies-using-python/
  25. Grumpy is a Python to Go source code transcompiler and runtime
    https://github.com/google/grumpy
  26. OpenStack
    https://www.openstack.org/
  27. Ansible
    https://www.ansible.com/
  28. GDScript
    http://docs.godotengine.or­g/en/3.0/getting_started/scrip­ting/gdscript/gdscript_ba­sics.html
  29. GDScript: An introduction to dynamic languages
    http://docs.godotengine.or­g/en/3.0/getting_started/scrip­ting/gdscript/gdscript_ad­vanced.html#doc-gdscript-more-efficiently
  30. Scripting: Higher Level Programming for the 21st Century
    http://www.xahlee.info/com­p/scripting_the_21st_centu­ry.html
  31. tecplot – CFD Visualization & Analysis Tools
    https://www.tecplot.com/
  32. Rhinoceros (Rhino3D)
    https://www.rhino3d.com/
  33. Maya
    https://www.autodesk.com/pro­ducts/maya/overview
  34. Blender: Python Scripting
    https://www.lynda.com/Blender-tutorials/Python-Scripting-Blender/486043–2.html
  35. Interview Guido van Rossum: “I'd rather write code than papers.”
    https://www.cwi.nl/news/blog­s/interview-guido-van-rossum-201cid-rather-write-code-than-papers.201d
  36. IronPython
    https://ironpython.net/
  37. What’s New in Python 2.0
    https://docs.python.org/3/what­snew/2.0.html
  38. Python Implementations: Compilers
    https://wiki.python.org/mo­in/PythonImplementations#Com­pilers
  39. RPython Frontend and C Wrapper Generator
    http://www.codeforge.com/ar­ticle/383293
  40. PyPy’s Approach to Virtual Machine Construction
    https://bitbucket.org/pypy/ex­tradoc/raw/tip/talk/dls2006/py­py-vm-construction.pdf
  41. Numba
    http://numba.pydata.org/
  42. The Magic of RPython
    https://refi64.com/posts/the-magic-of-rpython.html
  43. RPython: Frequently Asked Questions
    http://rpython.readthedoc­s.io/en/latest/faq.html
  44. RPython’s documentation
    http://rpython.readthedoc­s.io/en/latest/index.html
  45. RPython (Wikipedia)
    https://en.wikipedia.org/wi­ki/PyPy#RPython
  46. Getting Started with RPython
    http://rpython.readthedoc­s.io/en/latest/getting-started.html
  47. RPython: překvapivě výkonný dialekt Pythonu, na němž je založen PyPy
    https://www.root.cz/clanky/rpython-prekvapive-vykonny-dialekt-pythonu-na-nemz-je-zalozen-pypy/
  48. RPython vs Cython aneb dvojí přístup k překladu Pythonu do nativního kódu
    https://www.root.cz/clanky/rpython-vs-cython-aneb-dvoji-pristup-k-prekladu-pythonu-do-nativniho-kodu/
  49. Praktické použití nástroje Cython při překladu Pythonu do nativního kódu
    https://www.root.cz/clanky/prakticke-pouziti-nastroje-cython-pri-prekladu-pythonu-do-nativniho-kodu-1/
  50. Projekt Numba aneb další přístup k překladu Pythonu do nativního kódu
    https://www.root.cz/clanky/projekt-numba-aneb-dalsi-pristup-k-prekladu-pythonu-do-nativniho-kodu/
  51. Coconut: Simple, elegant, Pythonic functional programming
    http://coconut-lang.org/
  52. coconut 1.1.0 (Python package index)
    https://pypi.python.org/py­pi/coconut/1.1.0
  53. Coconut Tutorial
    http://coconut.readthedoc­s.io/en/master/HELP.html
  54. Coconut FAQ
    http://coconut.readthedoc­s.io/en/master/FAQ.html
  55. Coconut Documentation
    http://coconut.readthedoc­s.io/en/master/DOCS.html
  56. Coconut na Redditu
    https://www.reddit.com/r/Pyt­hon/comments/4owzu7/coconut_fun­ctional_programming_in_pyt­hon/
  57. Repositář na GitHubu
    https://github.com/evhub/coconut

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.