Trosku mi to pripomelo jeden strip http://www.cs.trinity.edu/About/The_Courses/cs2322/zippy.gif
Pravda, kazdy jazyk ma jine pouziti, ale imho je dobre aspon trosku tusit, co ktery jazyk umi, napriklad kdyz se zacina nejaky novy projekt v oblasti, kde se cecko treba moc nehodi.
Elegantní? V čem? Že se z mála napsaných znaků vygeneruje ozrutný kód? Mně to tedy nijak elegantní nepřipadá. Programovací jazyky jsou tu od toho, aby člověku umožnily zapsat své záměry způsobem, který je mu blízký. Tomu člověku, ne stroji. Tedy způsobem čitelným, jasným, srozumitelným. Jazyky tu nejsou proto, aby byly „elegantní“ tím způsobem, jako křížovka. Jestliže člověk zapsaný program nečte, ale luští, tak je to možná leccos jiného, ale určitě ne dobrý programovací jazyk.
Jiste, to mate ze sve pozice pravdu, ale zalezi na uhlu pohledu. Jinak se na jazyk J diva nekdo, kdo cely zivot psal napriklad v algol-like jazycich (Cecko, C++, Java…, takze ho treba neprekvapi veci typu = vs ==, ternarni operator…, protoze mu je to, jak pisete, blizke) a nekdo, kdo se treba J naucil jako svuj prvni jazyk (a takovych lidi pry existuje dost, hlavne lidi okolo simulaci a ekonomickych aplikaci).
Ja jsem mel taky problem se po x-letech ceckareni naucit Forth, ale po chvilce ta postfixova syntaxe prejde do krve a clovek pise minimalne stejne efektivne jako v algolskych jazycich, a to stejne plati pro J. Lide co v J (dosadte si cokoli jine – C, Lisp, Prolog, Python) skutecne delaji, ho ctou po vetsich celcich, nelusti. Stejne jako ceckovy programator nelusti, co znamenaji znaky ‚w‘ ‚h‘ ‚i‘ ‚l‘ ‚e‘ ale chapou to vcelku jako zacatek/konec programove smycky.
Mám za sebou Forth, Smalltalk (napsal jsem svého času JIT compiler from scratch), kdysi Pascal, hodně x86 assembler, málo Javy, jakési proprietární jazyky, (Auto)Lisp, patnáct let C++ a dnes něco přes rok C#. Až na C# si teď myslím – all the same shit. Tedy ještě ST byl svého času fajn, ale dnes už je bohužel zcela out. A Java, nebýt tak hnusná.
Na jazyku mne zajímá jen produktivita, nic víc. K tomu ten krám přece je! Programátor nemá „umět programovací jazyk“ nebo se ho nedejbože „učit“. Má přemýšlet o světě a pak to, co vymyslel, zapsat, a ono to má fungovat. Tak se ta hra hraje. Jestli ho v tom jazyk podpoří nebo mu stojí v cestě, to je pro mne jediné měřítko kvality jazyka.
Dnes, kdy jsou zdroje zdarma, šla všechna kdysi používaná zdůvodnění, proč je ten jazyk tak zkripleně zašifrovaný, do háje. Rychlost a výkon už nikoho nezajímají, protože tu jsou. Jazyk má být naprosto transparentní, přirozený k zápisu i ke čtení, nic víc se od něj nechce. Stejně všechen vývoj stojí a padá s frameworky a vývojovým prostředím.
Měl jsem rád assembler a pervezně mne přitahovala „elegance“ Forthu. Hájil jsem C++, že je „mocné“. Kecy, samý kecy. Dnes dělám v C#. Zpočátku jsem tvrdil, že má produktivita proti C++ vzrostla desetkrát, ale po roce už vím, že jsou to taky žvásty. To se vůbec ani nedá změřit, protože věci, co v C# napíšu za tři dny, bych v C++ neudělal doslova vůbec. Navíc v C# to spustím a když to chodí, tak to prostě chodí, je hotovo, prakticky odladěno. Zázrak.
Dřív jsem hodně kódoval. Teď z 80% uvažuju, jak to postavím, pak to rychle napíšu a je to.
Když se rozhlédnu, má práce stojí na .NETu, což není jazyk, Visual Studiu, což není jazyk, Blendu, což také není jazyk. Ani WPF není jazyk (no, XAML snad), reflection není jazyk, ReSharper není jazyk. Jazyk je tu fakt jen proto, aby se mi nestavěl do cesty.
A to se tedy o tomhle „elegantním“ výtvoru říct nedá.
Mně se prostě nelíbí ten přístup, který se nesnaží posunout programovací jazyk blíž přirozenému uvažování člověka, ale právě naopak, z člověka udělat stroj, nebo ho alespoň přizpůsobit stroji. Enigmatické J výrazy zřejmě vzruší lidi z akademického prostředí, ale to je asi tak vše, co se od nich dá čekat.
Nojo, ale to pises pouze ze sveho pohledu vyvojare, ktery se nekdy davno vice ci mene snadno naucil syntaxi a semantiku algolskych jazyku a potom to povazuje za „prirozene uvazovani“. Opravdu to tak neni – znam dost lidi, kteri „uvazuji“ v s-vyrazech a lambda kalkulu, takze vesele kodi v Lispu kdyz maji neco udelat v C#/Jave, tak se tvari, jako by jim chybela jedna ruka.
Kdyz se laika (samozrejme inteligentniho) zeptas, co je „prirozenejsi“:
for (int i=0; i<10; i++)
nebo
i.10
Podle me je to pro nej stejne neprirozene, akorat ten druhy zapis mu vysvetlis mnohem rychleji, nez co znamena int i, co ++, kdy se provede i<10, kdy i++ atd.
Me treba taky J prijde elegantni a docela chapu, ze ho lidi pouzivaji napriklad pro rychle nakodeni nejakych simulaci apod., kde je zapotrebi moznost rychleho zasahu do kodu, predevsim je tam pekna ta interaktivita, ostatne jako u vetsiny dynamicky typovanych jazyku.
Suhlas. Az na to ze to co pises o C# by som ja tvrdil o Jave ale ako pises je to uplne jedno.
Stale nerozumiem ako sa niektori ludia dokazu vzrusovat koli par pismenkam. Ze v tom a tom jazyku je to 20 znakov menej. A ked to bolo tazke napisat nech je to tazke aj precitat.
Vysledok je to co sa pocita.
Tady se mozna jedna o male nepochopeni jadra sporu. Ono ani tak nejde o nejaka pismenka (jestli se nejaka konstrukce zapise pomoci 1 nebo 5 znaku, to je jen prachobycejna syntaxe, tedy bud pekny nebo mene pekny „povrch“, o to ani tak moc nejde), ale o pomerne odlisnou semantiku a celkovy pristup k tvorbe programu, ktery muze v NEKTERYCH pripadech vest k mnohem efektivnejsimu programovani.
Stejne jako predpokladam, ze si v praxi nevystacite pouze s Javou, ale pouzivate i dalsi jazyky (treba PL-SQL, regularni vyrazy, EL, nejake XML-like nastroje ktere jsou mnohdy Turingovsky kompletni, dynamicke jazyky vytvorene nad JVM atd.), tak se proste v nekterych pripadech vyplati pouzit zcela odlisny (ne-algolsky) jazyk, protoze „vysledek je to, co se pocita“ (a v pripade J je to vyhoda snadneho vytvareni a soubezneho testovani programu, jejich rychla zmena atd.)
Hehe, já věděl, že se na tohle lidi chytnou. Tak jistě, v normě while je, dá se do C programu i napsat (brrr), to ale nic nemění na faktu, že si ho tam prosadila pascalská lobby vedená předním šíleným programátorem Wirthem. V opravdovém céčku není nic než for, kdo napíše while, za trest tisíckrát ručně opíše „begin pascal end“.
Smycky while() {} a do{} while() byly do cecka pridany z jasneho duvodu, maji sve opodstatneni a popravde receno si neumim predstavit program, kde by nemely smysl (resp. kde by na vsech mistech bylo lepsi pouzit for, v niz se mnohdy michaji veci, co se sebou nemaji moc spolecneho – ted nemyslim klasicky „pocitany“ for).
Ono ostatne cecko vychazi z rady jazyku Algol->BCPL->B potom C, tam o Wirtha clovek dlouhou dobu nezavadil (jasne udelal si Algol-W, ale az pozdeji, kdyz vymyslel dost tezkopadny Pascal se kterym se muci decka na skolach a delaji se z nich tak trosku cvicene opice).
Takze za „while“ v cecku mohou tvurci Algolu (Backus, pozdeji treba Dijkstra nebo Hoare – IMHO mnohem lepsi vedatori nez Wirth :-) a samozrejme tvurci cecka, to uz nekdy v prvnich castech tohoto serilu tusim zaznelo.
BTW – a co je blízké člověku? Matematikovi nebo inženýrovi je bližší úplně jiný styl komunikace, než třeba tobě – stačí otevřít např. skripta matematické analýzy nebo algebry. Co je srozumitelné volovi, nemusí stačit bohovi – abych parafrázoval známé rčení, to nemyslím osobně. Nemyslím, že by se programovací jazyky měly přizpůsobovat mentální úrovni cvičené opice, když už se jí přiblížilo uživatelské rozhraní. Když mi něco připadá nesrozumitelné, nemusí to nutně znamenat, že to opravdu nesrozumitelné a komplikované je – mnohem větší šance je, že jsem jen příliš líný či blbý, abych to pobral. Myslím, že když ta zmiňovaná skripta porovnáš s programem třeba v APLu, okamžitě ti docvakne, že existují lidé, kterým takový zápis naopak bude připadat velmi přirozený a pohodlný.
A v tom se právě neshodneme. Můj názor je právě takový, že programování má být přístupné i těm, co je urážíš „cvičenou opicí“. Stejně jako UI.
Programování je inženýrská činnost, nic záhadného. Takové řemeslničení, nic na tom není. Bohužel většinu inženýrů někde v duši hlodá nepříjemný pocit, že jsou vlastně takoví ševci, a oni by tak rádi byli něčím lepším. A tak si vymýšlejí svou magickou terminologii, záhadná zaříkadla a před laiky se snaží vší moci vzbudit dojem, že jsou velcí mágové. A z toho pak vymýšlejí programovací jazyky co nejnesrozumitelnější.
Je to přece tak příjemné, mluvit o esoterické „lambda kalkulusu“, místo aby se jasně řeklo, že „jednou funkcí to všechno ojedu“, že?
Ale ano, připouštím, že akademikům je vlastní jiný způsob uvažování. jednou z jeho vlastností je třeva i to, že je nezajímá produktivita. Já dělám v soukromém sektoru a proto je produktivita u mne na prvním místě.
Však jsou jazyky, které jsou přístupné i těm cvičeným opicím. A pak jsou tu taky jazyky, které jsou pro ty náročnější. Nejsou vymyšleny schválně tak, aby je cvičené opičky nepochopily, jsou vymyšlené tak, aby umožnily těm bystřejším větší rozlet. Víš, lidé, a obzvláště ti chytří, se nesnaží jednoduché věci činit komplikovanými, ale ty komplikované co nejjednoduššími. K cvičeným opičkám se přistupuje trošku jinak – jednoduché věci se pro ně dělají ještě jednoduššími a o komplikovanějších se raději vůbec neuvažuje.
Ten druhý odstavec – to je klasický nářek zakomplexovaného nedoštudovance. Jestli tak nechceš vypadat, raději se tomu napříště vyhni. ;-)
> Je to přece tak příjemné, mluvit o esoterické „lambda kalkulusu“, místo aby se jasně řeklo, že „jednou funkcí to všechno ojedu“, že?
Můžeš tuto hlubokou myšlenku trochu více rozvést? Něco mi říká, že se o lambda kalkulu od tebe dozvím něco, co nám ve škole zapomněli vysvětlit. :-) Teda abych nebyl vůči tobě nespravedlivý – myslel jsem si přesně to samé, jako ty – asi prvních 10 minut první z mnoha přednášek, tomuto tématu věnovaných. Je to podobné, jako říct „proč mluvit o esoterickém diferenciálním počtu, když můžu jednoduše říct, že to prostě udělám strašně malinkatý a je to, že“…
Ona je produktivita a „produktivita“. S tím druhým jsem se měl možnost seznámit v jedné nejmenované významné české softwarové firmě. Ono je to podobné, jako srovnávat pracovníka závodní výdejny jídel, jehož jedinou činností je rozmrazit a ohřát polotovary a naservírovat je na talíř, s kuchařem v grand restaurantu. Oba dělají v gastronomii, ale to je asi to jediné, co mají společné. Zatímco ten druhý je mistr kuchař, ten první je jen – cvičená opička. ;-)
V podstatě s vámi souhlasím, ale:
1. Jazyky nejsou ani tak o náročnosti nebo inteligenci, ale o tom, kdo a na co je potřebuje. „Klasický“ programátor má jiné nároky a řeší jiné úlohy než profesor matematiky. Vy (možná neúmyslně) zavádíte pro jazyky jakousi stupnici, zatímco ve skutečnosti se jedná o škálu. Jinak řečeno, ve vašem podání je možno jazyky seřadit podle inteligence programátora. Žádné takové řazení zde ale není a jakýkoliv pokus o něj vyvolává právě takovéto hádky. I s OCaml pracují cvičené opice.
2. Lambda kalkulus má (asi i oprávněně) velmi špatnou pověst a funguje jako rudý hadr na býka. Ačkoliv nepochybuji o tom, že se jedná o výbornou věc, v programování využití nemá. Znám řadu lidí, co programovali roky v (Auto)Lispu, OCaml nebo Haskellu. Ale co to je Lambda kalkulus nevěděli a ke své práci to nepotřebovali. A když se podíváte na historii funkcionálních jazyků, poměrně brzo si všimnete, jak to s tím LK vlastně je. Zkráceně, pánové zjistili, že když budou programovat právě tímto způsobem (dle LK), pak budou mít ty programy řadu výhod. A tak byly navrženy jazyky, jejichž konstrukce kopírují LK a tudíž mají všechny ty „úžasné“ vlastnosti. A tak tu máme funkcionální jazyky, které fungují a dobře se v nich programuje určitý druh úloh. Stačí znát syntax jazyka, zažít si pár příkladů a pak můžete být produktivní. Znalost LK k tomu vůbec nepotřebujete.
ad 1. Já naprosto souhlasím a říkám to pořád, že na každou práci (nejen kolem počítačů) existují nástroje vhodnější a méně vhodné – tak proč nepoužívat ty k té které věci určené a lámat to přes koleno jinak. Ale právě kvůli tomu mi vadí, že někdo odsoudí jazyk, který ani nechápe, právě jen protože ho nechápe a neumí použít. Přece nebudu tvrdit, že širočina je sekera nanic jen kvůli tomu, že jsem nepochopil, k čemu byla vymyšlena a i když jsem to nakrásně pochopil, tak mám olšový ruce a stejně se mi s ní dělá nešikovně. Chyba není na straně té sekyry – to jen já jsem nemehlo a tudíž se dá říci, že byla vymyšlena pro někoho zručnějšího, než jsem já. A přesně totéž jsem měl na mysli u těch programovacích jazyků.
ad 2. Však já také netvrdím, že to člověk nezbytně musí vědět. Jen jsem tvrdil, že lambda kalkulus, jakožto matematická teorie, se nedá trivializovat tak, jak to ukázal předřečník. Programátor o tom nemusí vědět skoro nic a také se obvykle dozví akorát to, že „ta a ta konstrukce vychází z teorie lambda kalkulu a takto se používá“. Ale z toho přece neplyne, že (lambda (x y) (+ x y)) je lambda kalkulus. To je pouze anonymní funkce a nic víc, ale ta funkce obecně může mít různé parametry a lokální proměnné a jejich prostřednictvím různý efekt na své okolí a hovoříme o čemsi jako je lexikální uzávěr, rozsah platnosti a viditelnosti proměnných atp. A nakonec se do toho, co vypadalo na první pohled jednoduché a jasné jak facka, pak může člověk pěkně zašmodrchat – zvlášť když to spláchne ve stylu „lambda kalkulus? Pche, vždyť to je jen nějaká nepojmenovaná funkce…“ Ostatně třeba za relačními databázemi stojí taky ucelená matematická teorie a kdo z lidí, co se zabývají databázemi, ji opravdu ovládá? To nakonec není zapotřebí, ale z té teorie plynou nějaké závěry a ty je dobré znát, tedy pokud si člověk nechce přidělávat zbytečnou práci.
zadny expert v tom nejsem, narovinu, ale jaky vztah je mezi lambda kalkulem a lexikalnim uzaverem? dle meho to (uzaver) vubec nesouvisi, neni to soucasti te teorie (resp. neni to exkluzivni pro tuto teorii), je to vec implementace;
totez parametry, lokalni promenne, rozsah platnosti, viditelnost promennych ..
Máte poměrně majoritní názor. Lidé jako vy vidí programování jako proces tvorby nějaké věci, software, která je pak předána koncovému uživateli k používání. Takové programování je skutečně inženýrskou činností, na kterou jsou kladeny nároky jako snadná údržba, spolehlivost atd.
Jenže ono existuje i jiné programování. Pokud jste matematik a děláte nějakou matematickou analýzu, pak vám výpočetní technika může ulehčit práci. Místo počítání na papíru nebo na kalkulačce si můžete výpočet zadat do počítače. A to ve formě programu, kdy pak jen změnou několika parametrů můžete získat řadu výsledků, které potřebujete. Jedná se také o programování, ale nároky jsou diametrálně odlišné – správnost, přehlednost a snadná tvorba. Snad jste někdy absolvoval nějakou pokročilou matematiku a tudíž asi víte o vektorech, maticích, diferenciálním počtu, kombinatorice, statistice apod. Možná vám něco říká i fuzzy matematika nebo algebra. Matematici mají poměrně standardizovaný formát zápisu a jsou na něj velmi vysazení. Pokud místo skalárního součinu dvou vektorů napíšete rozepsaný součin členů, budou velmi naštvaní. A představte si to, tihle matematici, statistici, profesorové algebry a podobná verběž si navíc chtějí programy psát sami. A co víc, oni nechtějí programovat v C, ale chtějí něco, co by se podobalo „jazyku“, který běžně používají! A pak z nich padají jazyky typu ML nebo APL. Kdo se má v tom jejich 5 řádkovém paskvilu vyznat, správný programátor by to napsal hezky jako 3 třídy, ty jejich nesmyslné skalární součiny zprogramoval jako přetížený operátor a všichni by byli šťastní! Místo toho, aby si oni sami 3 minuty psali vlastní program v něčem, co je jejich oboru blízké, mohli to zadat mně, půl dne by mi vysvětlovali co vlastně chtějí, já bych jim to pak za půl dne zanalyzoval a za dalšího půl dne naprogramoval, no a dalšího půl dne by jsme to ladili aby to dělalo to co oni chtějí a ne to jak já jsem to pochopil – kurňa dyť jsem programátor, nemůžou po mně chtít, abych rozuměl té jejich matematické hatmatilce! Pod pojmem „uzávěr“ si představím leda tak práci na silnici a ta nemá s algebrou nic společného!
A kdyby nám do programování chtěli kecat jen matematici! Oni nám do toho chtějí kecat i lidé od simulací. Nebo stavaři – to je nevídaná verbež! A nejhorší jsou lidi od financí!
Pánové.. prosím, podívejte se někdy na jazyky jako je ML nebo APL. Vždyť to vypadá jako podivná programovatelná kalkulačka. Ale… vždyť ano, to MÁ být programovatelná kalkulačka. Když se podíváte na tyhle podivné jazyky, tak zjistíte, že za nimi často stojí profesoři matematiky, statistické úřady, finanční analytici apod. Tihle lidé se „nám“ nesnaží fušovat do „řemesla“ a programovat v tom jaderné ovladače nebo webový blog. Oni se jen snaží použít počítač jako chytrou kalkulačku, pomocí které si ulehčí práci při výpočtu. A stejně tak jako většina programátorů raději píše v C, C++, Javě, C# apod. místo v assembleru, stejně tak oni chtějí do programu psát „skalární součin dvou vektorů“ místo nějakého „for“, který navíc neumí vrátit hodnotu a tak věci ještě víc komplikuje nějakými dočasnými proměnnými.
Zkrátka, tyhle „jejich“ jazyky mají svůj účel, ta jejich „rozsypaná lomítka“ mají svou logiku a tihle lidé těm programům skutečně rozumí na první pohled. Naopak „opravdové“ programovací jazyky přinášejí obrovský balast (s Javou na kalkulačku) a pokud vám bude předložen program na redukci matice, budete bez komentářů jeho účel studovat možná i hodiny, natož pak nalézt v něm chybu, kdy jeden z mnoha cyklů jako maximum bere omylem druhý rozměr (to je příklad z praxe – pro matice M x N, kde M bylo menší rovno N to fungovalo, pro ostatní to kolabovalo – chybu jsme našli po pár minutách, ale hodinu trvalo, než jsme se shodli, zda je to skutečně ta chyba a zda tím naopak nerozbijeme něco jiného jen proto, aby nám prošly unit testy).
A nakonec, pokud vám někdo řekne, že píše v Haskellu webový prohlížeč, tak ho pošlete do … protože na tohle je skutečně lepší něco „imperativního“.
Nejdůležitější kapitola a hlavní důvod, proč používat J, tedy tacit programming, neobsahuje téměř žádné informace. Dokonce ani ten průměr není vysvětlen. (f g h) y je totiž moanadický fork, který J přepíše na (f y) g (h y), jinak by to přeci nedávalo smysl. Pak ještě existuje hook, který monadicky interpretuje (f g) y na y f (g y). Obojí má i dyadickou formu a bez tohoto by nebylo možné dělat vlaky sloves, které jsou základem tacit programming. Viz zde.