Nesnáším programování v jazyce C. Kdysi jsem v C cosi napsal (jednoduchou hudební knihovnu pro AdLib), ale předtím a potom jsem poznal několik desítek jiných programovacích jazyků a málokterý se mi hnusil tak, jako C. Kromě toho se mi hnusí také Java, takže bych se asi „v reálném programátorském světě“ programováním moc neuživil.
Naštěstí nemusím s nikým spolupracovat „v reálném programátorském světě“ a když něco programuji, mohu si to naprogramovat v čem já sám uznám za vhodné.
Problém je v tom, že při většině programování potřebujete knihovny. Některé programovací jazyky (např. Perl, Python, Ruby) jsou natolik rozšířené, že k nim existují „bindingy“ (jak se to řekne česky?) pro mnoho knihoven. Tudíž jsem si mohl například naprogramovat v Ruby aplikaci, používající plné GUI (GTK2), aniž bych musel napsat jediný řádek v C. Ale tyto „nenativní verze“ knihoven (pokud existují) jsou často špatně dokumentované a mají zpoždění za svými nativními verzemi.
A k čemu tím vším směřuji? K jazyku Lua, který byl vymyšlen pro lidi, kteří potřebují používat C knihovny a nemají rádi C.
U většiny programovacích jazyků to funguje tak, že se knihovny nějakým mechanismem linkují k existujícímu jádru jazyka. Lua to má víceméně obráceně: Je tak malá a jednoduchá, že se celá snadno přilinkuje k existujícím C nebo C++ knihovnám. Musíte pouze napsat a zkompilovat nějaké své rutiny, zajišťující komunikaci mezi Luou a C (což je slušně zdokumentováno, protože je to základní pointa jazyka, a zvládnu to tudíž i já).
Lua je velmi krátká (celý její zdrojový kód je i s příklady a dokumentací ve 200KB archivu), protože toho vlastně moc neumí. Kromě standardních typů jako „číslo“, „řetězec“, „nil“ má vpodstatě jen jednu speciální datovou strukturu: Tabulku (ekvivalent toho, čemu se třeba v Ruby říká Hash), tedy pole indexované čímkoliv.
Vtip je v tom, že Lua umožňuje pomocí „metatabulek“ expandovat sama sebe velmi vychytaným způsobem, takže si pomocí pár řádků můžete například nadefinovat objekty a dědičnost (které Lua „sama od sebe“ nemá). Nebo vlastní datové struktury. A všechny ty C knihovny pak můžete z Luy volat tak, jak to vám vyhovuje. To vše díky tabulkám a díky faktu, že kus kódu nebo funkce je v Lue objekt jako každý jiný a dá se s ním dělat to, co s jakýmkoliv jiným objektem (v tomto směru se Lua dost inspiroval funkcionálními jazyky).
Lua je interpretovaný jazyk s automatickou kompilací do bytekódu a ve výsledku je velmi, velmi rychlý (podstatně rychlejší než Ruby nebo Python). Výsledkem tedy je aplikace, která je rychlá (to, co musí být rychlé, je v ní napsáno v C) a při jejímž odlaďování si nemusíte dělat starosti s garbage collection, nulovými pointery, nepovoleným zápisem do paměti atd…
A je také triviální použít Luu k tomu, aby bylo možno jednoduše skriptovat a odlaďovat nějakou vaši už existující aplikaci. Například ve videohrách je běžné, že multimediální rutiny jsou naprogramovány v C, zatímco logiku hry řídí Lua.
Koneckonců, podívejte se, kde všude se Lua používá.
teda franto, fak sem velmi mile prekvapen. malokdo v .cz vubec vi co je lua a k cemu se pouziva, natoz aby si o tom neco precet. jsem rad ze se nasel nekdo kdo konecne chape ze v jednoduchosti je sila, ackoliv jsi krome metametod nezduraznil nektere dalsi vychytavky ktere mi zhusta chybeji v mainstreamovejsich jazycicch, zejmena weak tables, coroutines (lua je jediny jazyk kdo ma coroutines nezavisle na OS!), closury ("cizi" lokalni promenne), vlastni dynamicky definovatelne globalni prostredi pro kazdou fci, ci snad to ze boolovsky vyraz vraci hodnotu posledni vyhodnocene promenne, a je toho mnohem vic ... lua nabizi cloveku obrovskou volnost, v praxi to pak vypada ze si clovek z techto vychytavek udela nejaky model do kteryho jenom nahrne vstupni data a ono to funguje ... to je neco naprosto absurdniho v jazycich jako java, .net, python kde je clovek nucen pouzivat cizi pevne definovane modely (zejma pri OOP) ktere se ne vzdy hodi pro danou ulohu. mozna nekdo namitne ze takova volnost zpusobuje necitelny kod, protoze neexistuje standard podle ktereho programovat - ale nastesti to nikdy neni takove drama, protoze lua jako takova ma sice dosti "omezenou" syntax, na druhou stranu se da na kod podivat a ihned pochopit co vlastne dela. doufam ze se pusti vic lidi do luy (to je ale slovo :). jo jinak, za zminku taky stoji wxlua (wxwindows lua binding) v cemz se daj extremne prasit krasne nativni gui.
jinak abych furt jenom nechvalil, jako kazdy jazyk, i lua ma sve stinne stranky - nejbolestnejsi je asi chybejici 'continue' (pokracovat v cyklu) takze se musi continue-like podminky v cyklech vyrabet klikatyma cestama .., dalsi je treba absolutne nesmyslny luacky "regex", ktery ma sice trivialni implementaci v c (diky tomu se cela lua i s knihovna vejde do cca 4000 radku), na druhou stranu pouzitelnost oproti opravdovym regulernim vyrazum je takrka nulova. samozrejme oboji se da snadno napravit, na continue existuje patch do compileru bytecodu a autori se vyjadrili ze mozna pribude v dalsim release, "prave" regexpy jsou dostupne jako externi knihovna...
>> Nesnáším programování v jazyce C.
A co moderni C++ (s templaty a podobne)? Tohle mi prijde skoro stejne elegantni, jako kdyby se to delalo v interpretovanym jazyku (nicmene je to porad C++):
#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void print(double d) { cout << d << endl; }
int main()
{
double d;
vector<double> p;
cout << "Zadavej cisla, pro ukonceni zadej retezec." << endl;
while (cin >> d) p.push_back(d);
sort(p.begin(), p.end());
cout << "Tady to mas serazene (" << p.size() << " polozek):" << endl;
for_each(p.begin(), p.end(), print);
}
[1] Jazyk .NET? Neznám! Jinak asi Lua (a asi skoro všechny jazyky) bude silně pokulhávat ve flexibilitě oproti Common Lispu. Zajímalo by mě ale, v čem je Lua flexibilnější oproti třeba Pythonu (hlavně s nějakým užitečným příkladem) s jeho __getattr__, __call__, metatřídami apod. Když jsem viděl já, odchovaný Pascalem, C, C++ apod. Python, přišly mi ty možnosti neuvěřitelné. Dnes vím, že je možné jít ještě dál (ať už sledováním vývoje Pythonu nebo pokukováním k "sousedům"), ale divil bych se, kdyby zrovna Lua byl případ jazyka s lepšími vyjadřovacími schopnostmi.
Jinak mám pocit, že konkrétně Ruby má svoje vlastní thready a jazyků, které řeší tento problém vlastními prostředky, je víc (koneckonců i do JRE Sun naimplementoval tzv. green threads). Otázka je, zda je to dobrá cesta či nikoliv - v typické oblasti pro nasazení Lua asi ano, ale v normálních programech? V Pythonu se dá něco podobného naimplementovat třeba pomocí generátorů - viděl jsem to myslím někde jako recept v Python Cookbook: pro zájemce o zajímavá řešení nejenom v Pythonu uvádím odkaz: http://aspn.activestate.com/ASPN/Cookbook/
O Lua jsem už něco četl, ale nějak teď nedisponuju časem si to taky vyzkoušet, příliš žiju v tom reálném světě.
Odjakživa mám ovšem dojem, že to vypadá jako přepsaný Perl (když tak něco vypadá, skoro se dá říct, že to tak je) se skoro všemi jeho vychytávkami - všechny komentáře tady mě v tom jenom utvrzují. Najde se někdo, kdo dostatečně zná obě prostředí?
lua me prijde moc komplikovana o proti schemu a umi de facto uplne to same. guile (implementace schemu) je na rozsirovani aplikaci jak delany (protoze je na to delany)
btw. vest spory - na tema toto v jednom jazyku delat jde a toto zase ne, je zcestne - protoze vetsina jazyku je turingovsky uplna ;-]
2 Petr - až bude luu používat relevantní komunita.... nu, záleží na tom, čo si predstavujetě pod pojmom relevantná, Kefalín. Velká spousta her a tedy herních společností Luu používá, kvůli snadné implementaci a tomu, že je zdarma .D Moje první setkání s tímhle křesťanským programovacím jazykem mně sice značně vyděsilo, ale teď po pár dnech hrabání se Luou jsem jí docela nadšený... a nadále mně děsí, protože je to sice krásně "free" jazyk, ale právě díky tomu se tam dá nasekat neopatrným překlepem tolik chyb :D
Zoul: "Většina ze zmíněných vychytávek v „mainstreamovějších“ jazycích chybí z dobrých důvodů. "
Jestli se rigidita, omezování myšlení programátora a úpornost implementace celkem přímočarých programovacích technik počítají mezi "dobré důvody", pak nepochybně ano. :-)
Vše je řečeno na www.fuxoft.cz
Přečteno 93 220×
Přečteno 84 985×
Přečteno 42 553×
Přečteno 41 297×
Přečteno 37 870×