Nejpoužívanější programovací jazyk pro programování linuxových aplikací je pravděpodobně pořád C, v závěsu za ním bude asi C++. C je jazyk, který byl navržen pro psaní operačního systému někdy v roce 1972. A 35 let poté se ještě stále používá pro tvorbu uživatelských aplikací. Sice už díky Bohu méně, ale stejně ještě pořád. Přiznám se, že tento jazyk, jakožto i jeho objetově orientovaného bratra se dvěma plusy nemám moc rád. Hlavní důvod mojí zášti je nutnost explicitní alokace a dealokace paměti. Nejde jenom o tu práci a o to, že by se měl kvalifikovaný člověk neměl podle mě pokud možno zabývat takovými malichernostmi jako jsou problémy procesoru s pamětí, ale hlavně jde o to, že z toho pramení nepříjemné chyby – zažil jsem „machry“, kteří ohrnovali nos nad jazyky vyšší úrovně, ale jejich kód byl plný memory leaků.
Pokud se tedy těmto jazykům (Pascal řadím do stejné rodiny fuj fuj pointer-oriented jazyků) chceme vyhnout, máme dvě možnosti – použít interpreter postavený nad nějakým virtuálním strojem nebo použít kompilovaný jazyk, který pointerům neholduje. JRE považuju za poměrně velkého molocha, projektu Mono nevěřím z licenčních důvodů a jazyky jako Python, Ruby atd. jsou možná prima, ale někdy se ukazuje, že rychlostí ne zcela vyhovují. A obecně přinášejí virtuální stroje dodatečné závislosti a až občas příliš odstiňují aplikaci od nativního prostředí. Lákají mě kompilátory do nativního kódu.
Existuje možnost zkompilovat do nativního kódu Javu, existují však i (podle mého názoru) zajímavější jazyky, které lze zkompilovat do „strojáku“. Jedná se hlavně o funkcionální jazyky, které mají i spoustu dalších výhod – snadnější statická analýza kódu, propracovaná teorie, snadná paralelizace funkcionálního kódu, bohaté výrazové prostředky atd. Asi nejznámějším funkcionálním jazykem je Lisp a jedna z hlavních větví se jmenuje Common Lisp. Velmi dobrých výsledků dosahují překladače CMUCL a zejména SBCL, který je ale o něco hůře přenositelný. Do nativního kódu lze přeložit i Haskell – ten patří mezi čistě funkcionální jazyky nebo Erlang, který se specializuje na konkurenční a distributivní zpracování dat.
Mě ale v poslední době zaujal OCaml, který má výhodu například v poměrně čitelné syntaxi, standardním objektovém rozšíření, standardních nástrojích pro tvorbu překladačů (ocamllex a ocamlyacc), makrojazyku (camlp4), debuggeru a profileru a generátoru dokumentace (pravděpodobně inspirovaném Javou). Právě v OCaml zpracovávám projektík, který analyzuje závislosti mezi balíčky v linuxových distribucích. Je to pro mě nový svět a docela mě to baví, snad o tom brzy napíšu víc.
Závěrem bych chtěl napsat, že bych byl rád, kdyby z Linuxu nějaký lepší jazyk výrazně vytlačil C. Nemusí to být žádný ze jmenovaných, ale moc dalších možností momentálně nevidím. A co Vy?
[3] S Adou nemám žádné zkušenosti, ale některé věci s ní má OCaml podobné, např. striktní kontrolu typů. To je vůbec dost podstatný rys tohoto jazyka a pro lidi zvyklé na dynamické jazyky může být občas dost frustrující. V OCaml bez explicitní konverze člověk ani nesečte int s floatem. ;-)
Svet je dnes plny "znalcu", kteri zpochybnuji stare dobre veci.
Je jim to houby platne. Tak jako kvuli jejich pranim nezmizi treba obycejny papir, bude se spousta veci delat i nadale v C. A spousta zbytecneho mista se popise exhibicemi o tom, jak "ja jsem ten progresivni expert, ktery vi co je pro druhe dobre"...
Je to spis zabavne nez aby to cloveka rozcilovalo :-)
[3] V ade to taky nelze secist, ale to beru jako plus. Nicmene ada umi mnohem vic. Typovani je dotazeno tak, ze lze specifikovat rozsah jednotlivych promennych (napr. integer od 1 do 10). To pak velmi vyrazne pomaha proti chybam jisteho charakteru (v C docela beznym). Velmi dobre se pracuje s vyctovymi typy (ktere ve spouste jazyku chybi nebo jsou odflakle ala cislo). Objekty a generika jsou samozrejmost, podpora viceulohoveho zpracovani primo v syntaxi jazyka je pozoruhodna. A hodne se mi libi, ac je to jazyk vyssi urovne, moznost interfacovani s ostatnimi jazyky a hardwarem, kde je mozno nenasilne ale spolehlive specifikovat napr. bitove reprezentace nebo adresy objektu, metody alokovani, zpusob importu a exportu v binarnich souborech.
Obecne je ada vnimana jako jazyk, v kterem lze psat velmi spolehlive aplikace pro zivotne dulezite systemy. (Jelikoz pohani veci jako letadla, vlaky a rakety tomahawk :) Ale protoze je k dispozici GPL prekladac (GCC) a nekolik vazeb k bezne pouzivanym knihovnam (gtk, xml, gl, ...) lze v tom programovat i v nasem "malem" svete.
[8] Díky za úvod. V OCaml je trochu problém v tom, že na každý typ se používá jiná sada operátorů a pak je samozřejmě problém v zadávání konstant. Asi by bylo možné definovat typ, který má rozsah od 1 do 10, ale už by to nebyl integer a musela by se použít jiná syntaxe literálů nebo pokaždé znovu explicitní konstrukce typu. Výčtové typy jsou v OCaml také symbolické a nekryjí se s intem.
C++ je jediny univerzalni programovaci jazyk s rozumnym vykonem vyslednych binarek. Ze nekdo neni schopen napsat program, ktery neleakuje a nepada, je jeho debilita. To same plati i pro jeho zamestnavatele.
C se pouziva prevazne z historickych duvodu a taky protoze ze pro spoustu lidi je C++ prilis slozity jazyk.
Funkcionalni programovani je fajn, nicmene vsechno se v tom opravdu psat neda (i kdyz uz tady mame i window manager).
Java je skvela pro firmy, jelikoz si pak muzou dovolit najmout mnohem mene zkusene programatory.
Skriptovaci jazyky jsou vhodne vyhradne k prototypovani, pripadne psani webu.
[11] Ad výkon - http://dada.perl.it/shootout/craps.html
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all
Některé méně známé jazyky si vedou dost slušně.
Ad funkcionální programování - většina funkcionálních jazyků nabízí i imperativní prvky pro případ potřeby.
Ad méně zkušení programátoři - a v OSS se zřejmě méně zkušených programátorů pohybuje hodně, když programy leakují a padají (a mají bezpečnostní díry). Je otázka, co s tím
[11]: Let_Me_Be: A kolik velkych projektu (kde se pocty radku kodu pocitaji minimalne na desetitisice) uz mas v C++, kolika takovym produktu jsi musel delat support pro zakazniky?
Existuje zname pravidlo, ze pravdepodobnost chyby narusta umerne velikosti kodu, u spatnych programatoru rychleji, u lepsich pomaleji, nicmene u velkych projektu proste chyby vznikaji, i kdyz to pisi velmi zkuseni lide.
A to je prave misto, kde prichazeji na scenu jazyky jako Java ci C#, poskytuji velkou platformu existujiciho (odladeneho) kodu, na ktere se da velmi dobre stavet, snizuji moznost (a dopad) chyb a zaroven umoznuji rychly vyvoj aplikaci - a to je presne to, co potrebuje bussiness sfera.
Ja mam C++ velmi rad, pisu v nem, ale treba predstava toho, jak nahrazuji Javovsky aplikacni server pro Javu EE vlastnim C++ resenim, mi prijde jako sci-fi... Vyvoj by se protahl o mesice (ne-li roky), zvysila by se pravdepodobnost vyskytu chyb, zobtiznila laditelnost etc. A ze je vysledne reseni vetsi, bere o neco vice pameti a je pomalejsi? No a? Uvedom si, ze treba takove Core 2 Quadcore stoji tolik, co nekolik hodin programatorova casu... Takze je asi jasne, co se vyplati...
Trochu mi to pripomina napr. embedded vyvojovou scenu, kde se najdou skalni odpurci programovani cehokoliv jineho nez assembleru a pohrdlive se divaji na kazdeho, kdo si dovoli pouzivat C:-) Celkem jsem zvedavy, kdy se zacne prosazovat v vetsi mire embedded managed kod (at uz C# nebo Java) - na Javu na to dokonce je nativni podpora procesoru (Jazelle)...
Mimochodem, Java vznikla jako reakce na komplikovany a neefektivni vyvoj a udrzbu C++ aplikaci v Sunu :-)
Ono totiž šíleně záleží na tom, co děláš. Pro systémové programování asi zatím nic lepšího než C není (případně C++) a to právě díky tomu, že to je v podstatě čitelnější assambler. A je to rychlé právě kvůli ukazatelům a přímé kontroly paměti. Na jednu stranu stoupá výkon hw, na stranu druhou klesá ochota lidí čekat. Takže stále ještě to C. A myslím si, že ještě dlouho (dokud se nezmění architektura). Pro klasické aplikační programování je C neefektivní pokud píšeš GUI aplikace. Ale třeba vala změní situaci http://live.gnome.org/Vala . Těžko být prorokem.
Mozna se v blizke budoucnosti dockame i vylepseneho JRE, ktere by konecne mohlo byt rozkouskovano na mensi dynamicky dohratelne casti. Protoze dnesni stav, kdy se i pro spusteni jednoducheho "Hello world" naalokuje pres 20MB, je napr. pro mensi utility dost neunosny a pekne to dokresluje rozsireni Javy na desktopech (servery jsou samozrejme jina vec).
Lispovka vetev jazyku je urcite zajimava, ale podle reakci spousty programatoru by na tyto jazyky tezko prechazeli. Proste imperativni kod je jim mnohem blizsi.
Jedna vec je vsak mit jazyk a druha podpurne knihovny a nastroje. Treba "naroubovani" OpenGL na Lisp je udelano pekne hnusne imperativnim kodem (v podstate 1:1 prepsani ceckovskych volani), i kdyz by to v Lispu slo udelat podstatne kvalitneji.
Mozna bych jeste vyzkousel jazyk D, ten nevypada spatne.
jen si dovolim podotknout, ze ten python neni zas tak pomalej. zvlast, kdyz clovek naprogramuje ty hardcore casti v c++ a pouziva to v pythonu jako modul. kdyz to srovnam s cimkoliv jinym, tak mi porad vychazi nejlip psat nektery veci v c++ (tam, kde jde primarne o vykon), nektery veci kombinovat a nektery veci psat jenom v pythonu (tam, kde o vykon tolik nejde a naopak mi jde o citelnost kodu, jeho snadnou rozsiritelnost atd.)
Díky za další zajímavé reakce.
[22] Jistě, Python lze urychlit mnoha způsoby - napsáním vlastních extension modulů v C, Pyrexu, (koneckonců i v tom OCaml, viz projekt Pycaml) použitím PyInline, nasazením Psyca... Na druhou stranu ale zase při psaní multiplatformních programů vznikají další problémy; například pro kompilaci rozšiřujících modulů pod win32 je třeba instalovat (pokud vím - samozřejmě pokud se bavíme o klasické binární distribuci Pythonu) celé velké Visual Studio (měla by naštěstí stačit verze expres). Ale jinak je mi řešení tohoto typu relativně sympatické, pokud pro konkrétní nasazení nejsou významné překážky.
no vezmime si jazyky na aplikacne programovanie
C - podla mna C _najkrajsi_ jazyk aky kedy existoval, bohuzal je to prilis tenka abstrakcia nad hardwarom, tazko sa to optimalizuje (pointery)..., a pisat vacsi program v C je strata casu (v jave to mam zlepene za tretinu casu)
C++ je asi najlepsie co momentalne mame ale je to _komplikovane_ (ukazte mi komplikovanejsi jazyk ako C++!) a chcelo by to garbage collector (mozno v kombinacii z dakym boehm GC... hm..)
Java - nema smerniky ale aj tak sa optimalizovat neda (vsetko sa alkouje na halde, vsetky pretypovania su dynamic_cast). okrem toho nema unsigned typy, vsetky typy <int su int atd... a 100 (alebo kolko) megovu standartnu kniznicu... privela kompromisov na zjednodusenie jazyka. btw swing vyzera ako z doby kamennej...
.NET/Mono - neviem :-) ale z toho co som cital, myslim ze riesi vacsinu problemov javy ale mam k nemu z principu negativny postoj :-)
skriptovacie jazyky maju jasne nevyhody (a vyhody) ale bavme sa o kompilovanych jazykoch. a funkcionalne jazyky nepoznam :-D
hmm takze co mi zostava ? Ada? Eiffel? D? ... aj tak to bude C/C++ ... nic lepsie (= pouzitelnost + efektivnost kodu + rozsirenost + rozsiretelnost + dostupne kniznice) jedoducho nie je ... co je skoda.
[21]: Na to "rozdelene" JVM se taky tesim, vypada to velice slibne. Jinak tech 20MB standardni knihovny je standardne sdileno mezi procesy.
[24]: ad java a optimalizace:
1. To ze neni explicitni moznost alokace na stacku neznamena, ze to JVM nedela (treba Sunovske JVM to docela dobre dela)
2. Zrovna pointery jako nutnost pro optimalizaci nevidim.
3. Ta std. knihovna nema 100MB, ale cca 20-30MB, sdilena mezi procesy.
4. Nizkourovnova optimalizace je jenom jedna z forem optimalizace a troufam si tvrdit, ze v drtive vetsine pripadu clovek nepotrebuje plne optimalizovany kod (a ten pak stejne pisete na miru architekture - jiste, pokud potrebujete maximalni vykon, je C/C++ vybornym kandidatem - prikladem budiz vypocetni systemy, graficke enginy, etc.). Ale treba Managed Direct3D taky ukazuje, ze to jde i v managed kodu docela solidne...
V Jave samozrejme optimalizovat jde a hodne, jednak algoritmicky, jednak znalosti fungovani JVM (typicky treba GC).
ad .net a mono: Mono je velmi, velmi pomale, na rozdil od .NET od Microsoftu. C# je blizsi C++, vice nez Java, coz muze byt pro nekoho vyhoda i nevyhoda...
[25]: Tak to bych rozhodne nesouhlasil, C++ s GC je velice pekne a uzitecne (navic jistou formu GC ma dost casto vetsina vetsich C++ aplikaci).
[26] Garbage collector pro C++ je overkill. Staci chytre pointery.
[19] Na webu ma java opravnene misto, tam si myslim ze je java celkem kralem, o tom se tady ale nebavime. Pokud jde o desktop tak fuj, pryc s ni. Veskere aplikace, ktere prerostou urcitou velikost jsou budto tak pomale, ze se to vubec neda pouzivat, pokud clovek nema 2GB RAM a high end procesor, nebo jsou psane vicemene C-stylem.
hlavne by si mali vsetci koderi uvedomovat pravidlo 'use the right tool for the right job'
"Hlavní důvod mojí zášti je nutnost explicitní alokace a dealokace paměti." - explicitna dealokacia programatorom nie je nutna, skus si dostudovat boost (predpokladam, ze STL poznas podrobne ked si si dovolil pisat takyto clanok). Machrov, ktori leakuju pamat ale ohrnuju jazyk nad vyssimi jazykmi (ja lubkam ruby :)) tiez nemam rad, vykrikuju ze C++ forever ale ani poriadne nevedia kodit.
Je pravda ze vacsina vyvoja co sa robi v opensource by nemusela byt v C (vid napr. bindingy pre Kde/Qt su kazdy realne rozsireny jazyk, predpokladam ze u gnome/gtk to bude podobne), ale kernel, glibc a daktore kniznice (napr. veci typu openssl/gnutls) by podla mna mali zostat v C s bindingami na zbytok sveta.
A pokial ide o C++ tak mimo Kde ho pouziva minimum projektov.
D ma velky potecial, kompiluje do binarky, je rychly, muzete pouzivat GC nebo nemusite, syntaxe blizka C/C++ primy interface k C knihovan, bohata zakladni knihovna. Pro systemove programovani muze s prehledem nahradit C++ a Javu, zatim je ale pomerne malo knihoven napr. pro GUI, DB atd
[29] Vytvářet nové univerzální jazyky má asi smysl málokdy; už teď jich je přebytek. O flame mi nejde; kdybych chtěl pořádný flame, tak si vyberu jeden jazyk a ostatní pomluvím.
[30] Při zmínce o počtu aplikací v C++ jsem vycházel ze statistik na serverech jako freshmeat.net. Je pravda, že třeba na tom Freshmeatu už C++ předhonila Java.
Je pravda, že v C++ to s tou alokací není až tak špatné jako v samotném C. Zase ale přináší jiné nevýhody - problémy se stabilitou ABI atd.
To je zas debata :-D I v dnesni dobe gigahertzovych multi-core procesoru jsou porad aplikace, kterym je to malo. Takove ma smysl psat v Cecku. Stejne tak jako ruzne veci blizko systemu. Samozrejme psani v C neni pro kazdeho, alespon se pozna kdo umi opravdu programovat :-)
Java a .NET jsou fajn pro jiny druh uloh - "prehazovani dat", velke projekty, projekty kde na vykonu az tak nezalezi atp. .NET ma vic featur, ale IMHO obcas az zbytecne prilis. Uplne by stacilo do Javy doplnit vystupni promenne a explicitni podporu enum a nemel bych zavaznejsich namitek :-)
Moc se mi líbí následující citát.
[6.5] Is C++ better than Ada?
Anyone who argues in favor of one language over another in a purely technical manner (i.e., who ignores the dominant business issues) exposes themself as a techie weenie, and deserves not to be heard. Business issues dominate technical issues, and anyone who doesn't realize that is destined to make decisions that have terrible business consequences — they are dangerous to their employer.
Loučím se s pozdravem: Zhyňtež vy Ruby, Pythony a Nety! ;)
Tak trošku nechápu, co má autor pro alokaci a dealokaci paměti....
Pamět je zdroj (resource) jako cokoliv jiného... a je věcí dobrého vychování vypůjčený zdroj zas vrátit operačnímu systému.
Stejně jako se nikdo nerozčiluje, že je potřeba po použití zavírat soubory nebo TCP/IP spojení, nemělo by nikoho vzrušovat, že je potřeba uvolňovat alokovanou paměť.
Pokud to nechcete v C++ dělat "ručně", vůbec nic Vám nebrání použít "smart pointery" nebo podobnou techniku, která proces memory managementu zautomatizuje.
Neřekl bych, že C++ (C je svými možnostmi na podobné automatizace chudší, ale zas je o něco výkonější) je lepší nebo horší než jiné jazyky... ten rozdíl je trošku jinde.
Jazyky typu C/C++ Vám (programátorovi) nic moc nenařizují... dávají Vám svobodu rozhodnutí, právo volby. Ale s onou svobobodou - zcela samozřejmě, podobně, jako v jakékoliv jiné oblasti lidského bytí - na Vás kladou i určitou zodpovědnost...
Nedívejte se na to tak, že Vás C++ nutí alokovat a dealokovat paměť. Ono Vám dává možnost, mít nad tímto procesem plnou kontrolu :-)... A v C je to podobné, jen té zodpovědnosti je ještě o fous víc...
Co mně osobně chybí na C++ a co je (resp. bylo) dle mého názoru revolučního na Javě, je opravdu široký subsystém knihoven. Ne jen pár základních funkcí (objektů, šablon), ale obecně dostupný framework zahrnující práci se soubory, síťovými prvky, GUI...
Protože standardní knihovny Céčka byly dostačující vdobě jeho návrhu. Snad i v době prvního standardu C++... ale dnes je to opravdu málo...
Hlavni vyhoda C je v jeho univerzalnosti. Neni snad zadny jazyk, pro ktery by existovaly prekladace pro tolik platforem a tolik uz hotovych knihoven (myslim ze treba java porad nema uplne OpenGL) a v kterem by se dalo napsat vsechno od operacniho systemu, ovladacu az po GUI ci web aplikace.
Shrnuti tvrzeni nesoucich nejakou informaci, ktera je falzifikovatelna, neni vseobecne znama a popisuje objektivni realitu. Tvrdi se, ze C bylo navrzeno pro psani operacniho systemu, bez uvedeni zdroju. Dale se tvrdi bez uvedeno podkladu ze z explicitni alokace prameni chyby.
Dale se dozvidame, ze jedna z hlavnich vetvi LISPu se jmenuje common LISP, bez upresneni, co znamena pojem "vetev" v programovacich jazycich a jak se urcuje, zda vetev je hlavni nebo ne. To je opet bez uvedeni zdroje.
Dale autor uvadi, ze jazyk Haskell lze prelozit i do nativniho kodu a ze se radi mezi ciste funkcionalni jazyky.
Nakonec se dozvidame, ze existuje jazyk OCaml, ktery ma objektove rozsireni, nastroje pro tvorbu prekladacu a makrojazyku, debuger, profiler a generator dokumentace.
Clanek na to jak malo informace relevantni pro ctenare obsahuje by mohl byt psan usporneji.
No, to je pekny flame ;)
Podle mne na kazdy task je dobry jiny jazyk - po skriptovanem jazyku sahnu kdyz potrebuju napsat neco rychle, nejde mi tolik o vykon.
Na WEB apliakce, a GUI legrace, kde zatimco user klikne, tak ma program cas sam sebe 2x zkompilovat, tam lze pouzit cokoliv.
Ale proboha - jak chcete napsat v nejakem C#, ci podobnem bazmeku ovladac jadra, nebo samo jadro ??? Jak tam chcete pracovat bez ukazatelu a alokaci s daty podavanymi primo hardwarovymi prostredky ??
Na toto by mne zajimala odpoved. Pokud si pamatuji (posledni dobou pisu jen ty skripty a pak hardcore C a C++ kod) tak toto v .net a jinych podobnych garbage orientovanych jazycich slo tak tezce, az vubec!
BTW: casti jadra a ovladacu se stale nekdy pisou i v assembleru, nebot da rozum, ze kdyz nekudy jde vykonavani programu mnohokrat za vterinu, tak tam se opravdu vyplati optimalizovat...
Mimochodem, chyby v referencich techto "objektu" vedou taky k peknym leakum, jen se hur hledaji, nebot nad pameti neni vubec zadna kontrola...
Dovoluji si tvrdit, ze zakladnim palivem techto flames je vzrustajici procento lidi, kteri NETUSI, jak pocitac ve skutecnosti funguje, nicmene maji erudovany nazor a potrebu davat najevo sve preference ohledne lecjake modni ptakoviny.
Skutecnost je totiz takova, ze assembler bude v urcite mire potreba vzdy, a nic lepsiho nez Ccko coby nadstavbu nikdo doposud nevymyslel a v praxi neoveril - a proto se i po 35 letech pouziva. Zato ruznych pokusu o ultra-BFU-friendly HLL jazyky a frameworky tu jiz bylo - s timtez tristnim vysledkem. Vzdy se ukazaly jako nedostatecne, pomale, a aplikace v nich vytvorene nesly jejich charakteristicke stigma. Je potreba vytvaret dalsi podobne nehoraznosti, nebo se uz svet IT pouci?
Podobne jako nejde udelat program, ktery nauci cloveka s hudebnim hluchem virtuozne hrat na housle, nelze ani sestavit programovaci jazyk/prostredi, ve kterem neznaly clovek napise korektni a efektivni aplikaci.
[47] Opravdu doporucuji se mrknout na 1.5 (Tiger), je tam moc peknych veci - evidentne je zde videt prace Joshuy Blocha a hlavne strach Sunu pred konkurenci :-)
namatkou:
1) for-each konstrukce
2) o kolekci se da specifikovat datovy typ
3) ony vycty jako soucast jazyka
4) automaticky prevod primitivnich datovych typu na jejich obalovou tridu, tj. int<->Integer apod.
ten ctvrty bod by mohl resit vas problem s vystupnimi promennymi (tedy jestli to dobre chapu, tak potrebujete vracet napriklad 3x int apod.)
Pokud se nechcete prokousavat Sunovskymi materialy, kde se to jen hemzi superlativy :-), tak i na Rootu vysel o Java 1.5 (Tiger) clanek.
namatkou kus zdrojaku, na kterem prave makam a ktery nektere vlastnosti (for-each a typovane kolekce) ukazuje:
ArrayList<String> attributeNames=itemBean.getAttributeNames();
ArrayList<String[]> attributes=new ArrayList<String[]>(attributeNames.size());
for (String attributeName:attributeNames) {
}
[47][48] jeste se pokusim ozrejmit ten automaticky prevod int-Integer atd. Automaticky neni vzdy, ale kdyz prekladac pozna, ze potrebujete z Integeru udelat int, tak tu konverzi provede sam. muze byt tedy rozdil mezi zapisem 1+x a x+1 pokud x je typu Integer.
Prikladek, kdy si s Integery hrajeme (skoro) jako s primitivnin datovym typem:
public void inc(Integer[] arr)
{
for (int i=0; i<arr.length; i++) {
arr[i]=1+arr[i]; //= 1+arr[i].intValue();
}
}
Integer[] pole={10,20,30}; // = new int[]{10, 20, 30};
inc(pole);
[44]: A kdo by chtel psat v .NET nebo Jave jadro proboha?:)) Kazdy jazyk je uplne na neco jineho... Jinak ty leaky se hledaji docela dobre, kdyz je mozne se presne podivat na to, ktery objekt kolikrat existuje a proc.
[45]: tvoje produktivita prace musi byt skutecne uzasna :)) Samozrejme, ze psat veci pro jadro, system. knihovny, etc. se musi nizkourovnove, ale to je tak vsechno, dal je to o tom, co delate a kolik vas to stoji, co se vyplati. A managed jazyky jako Java ci .NET se rozhodne vyplati, naklady jsou radove nizsi, hardware je levny, vyvoj drahy, takze neni co resit...
[48] V 1.5+ pisu obcas nejake soukrome veci, o foreach (1) a templatech (2) jsem vedel. Enum a automaticka konverze je pro mne novinka (fakt bych si mel ty release notes nekdy precist :-) ).
Ta konverze _trochu_ pomuze. Ostatne prave dnes jsem napsal metodu ktera vraci 2x datum tim stylem, ze se ji predaji dva Date objekty a ona jim nastavi cas :-) Bohuzel zdaleka ne vzdy se to da takhle osulit; neexistenci vystupnich promennych povazuji za nejvetsi problem Javy :-/
Vypocet typu "praca programatora je draha a HW je lacny" su typicke manazerske kecy odtrhnute od reality. M$ usetri na programovani a skoro cely svet si musi kupit novy HW. Alebo programator usetri hodinu prace a vsetci, co pouzivaju ten program, musia pri kazdom spusteni cakat dve minuty (tisice ludi krat tisice spusteni).
[52]: Mimo realitu jsou leda tak lide, co si mysli, ze cas na vyvoj nic nestoji :-) Konec koncu, podivej se, jak vypada realny softwarovy vyvoj - tam se s cenou prace pocita a velmi dobre pocita.. A proto maji jazyky jako je .NET ci Java uspech - zjednodusuji vyvoj a tim padem snizuji naklady... Takze co je pro firmu vyhodnejsi? A ne, opravdu komercni SW firmy nejsou verejne prospesne organizace..
[51] ano, ta konverze neni vzdy upotrebitelna, napriklad obalove tridy typu Integer jsou nemenitelne, stejne jako String. To znamena, ze ani v metode void add(Integer x) to "x" navenek nelze zmenit. Jedine to cele obalit do dalsi tridy - napriklad Complex, Point atd. vlastne nedelaji nic moc jineho.
Jde o to, jak by to Java mela delat - jit Placalovskych stylem (klicove slovo+pri volani vlastne nevim, jaka konvence je pouzita) nebo C++ovym stylem (predavani "reference na referenci")?
"A proto maji jazyky jako je .NET ci Java uspech" - kde proboha? Zatim jsem si blaha, poskytovaneho temito (bez prominuti) s*ackami neracil vsimnout.
Ano, cvicena opice v tom rychle naklika nekvalitni nanicovatou aplikaci pro urednici, s pomerem velikost*hwnaroky*nutny_environment / vykon presahujicim vsechny rozumne meze... pocitac holt nejak funguje, a kdokoli bude propagovat prilisne abstrahovani od tohoto neoddiskutovatelneho principu, po zasluze zhyne, zavalen gigabyty nesmyslneho, neefektivniho a spatneho kodu, co ani na jeho drahem HW uspokojive nepobezi. Jo, v tomto je to spravedlive. :).
Javu jsem na svem pocitaci zkousel a uspech neslavila - ac se jednalo o Linux s poslednim GCC, nezkompilovalo se to.
Meli syntakticke errory ve zdrojaku C++. Pry je Java portabilni, haha.
Podobne jsem pohorel s Perlem. Potreboval jsem aby muj jednoduchy perlovy skript (pro Ronju) z Linuxu bezel na OpenBSD. Jenze on pouzival binding na gdbm a ten v tom perlu co dodava OpenBSD nebyl. Neexistoval ani jako modul. Dodaval se defaultne v tarballu perlu. Zkusil jsem stahnout tarball perl zkompilovat a nainstalovat, ale prestal zase chodit balickovaci system OpenBSD protoze oni to maji asi nejak patchnute. Tak jsem skript po dlouhem moreni a ruznych machinacich a pokusech to rozchodit prepsal do C a od te doby to chodi vsude a jako vino :)
[48] v jave ale stale kvantum veci chyba (unsigned typy omg!!!), generika tiez nestoja za vela (vdaka spatej kompatibilite... chcelo by to proste new T()), volanie odkazom (tym by sa usetrilo kvantum zbytocnych obalovacich tried, alokcie a garbage collectovania pamati), smerniky na metody (tusim delegaty v C#) - zase by sa usetrili zbytocne kvazitriedy o jednej metode a pomale invokeinterface ... normalny gui toolkit (pridat swt do standartnej kniznce?). a keby sa tak este hello world nestartoval 2 sekundy ... :-)
aspon tie unsigned typy a smerniky na metody ... sun ... prosim :-)
[57]: Ty asi v komercni sfere neprogramujes, ze?:-) Programovat si doma na kolene nebo v akademicke sfere je prece jenom trochu rozdil od toho, kdyz delas vyvijis produkty v komercni sfere, ktere pak musis supportovat a ktery musi fungovat, nemuzes si dovolit ztracet na tom pri vyvoji cas (protoze jinak prodelavas).. A presne z techto duvodu ziskava Java a C# (a .NET), protoze pri vyvoji znacne casti aplikaci ani nepotrebujes aby to bezelo na starem HW s malo pameti (samozrejme to neplati vzdy a vsude) - resp. investice do podpory takoveho HW se nevyplaci (=naklady na vyvoje v C).
Podle podobne logiky bysme vlastne meli programovat jenom v assembleru :)
Plně se ztotožňuji s [40]!
Celá ta myšlenka článečku mi připadá poněkud zvrácená. Vezmeme-li to přísně, tak univerzální jazyk prostě neexistuje. Každý je vhodný na něco jiného.
V dnešní době je jazyk C nenahraditelný a žádné Javy, C# a o jiných jazycích ani nemluvím ani v nejmenším nemohou aspirovat na to, aby ho někdy nahradily.
To onanování nad přísnou typovou kontrolou je sice hezké, ale mám takový pocit, že takto může jásat jedině člověk, který snad nikdy neprogramoval něco většího. Je to podobné, jako jásat nad nepřítomností příkazu goto. Jestli jsem něco např. na Pascalu nesnášel, tak to bylo zrovna toto. Tahle tutorovská role překladače mne nutila akorát vymýšlet různé obezličky a okliky, jak provést to či ono, ale ve výsledku to nemělo pozitivní vliv ani na čistotu kódu, ani (nebo spíš už vůbec ne) na jeho efektivitu.
Můj názor je ten, že u programovacích jazyků platí totéž, co v celém životě. Pokud začínáme, necítíme se jisti v kramflecích nebo potřebujeme něco jednoduššího rychle, tak nám budou vyhovovat "přísnější", "bezpečnější" a "jednodušší" nástroje - auto s automatem, systém a la Windows, polévka v sáčku a konzervy, na zdění prefabrikáty a předem namíchané maltové směsi, na stavbu letadýlka stavebnice, na programování Java...
Pokud ale chceme skutečně tvořit, tak potřebujeme prostředky, které nás nebudou omezovat, ale přesně naopak - pomohou nám realizovat se. Samozřejmě že při práci s takovými nástroji se snadno můžeme pořezat nebo všechno pokazit, ale to jen proto, že to neumíme. Zkušený řezbář už se řízne jen sem-tam. Stejně jako zkušený programátor v C udělá chybu při práci s pamětí jen málokdy.
A příklad embedded aplikací tvořených v něčem jako .NET - tak to je skutečně vrchol neschopnosti. Je to jako kdyby někdo potřeboval napsat na kus papíru dopis či vzkaz, ale už by mu připadalo příliš komplikované vzít tužku a napsat to rukou. Bez počítače, editoru ve stylu Word a laserovky už by to odmítal dělat.
O jednom moznem smeru vyvoje kompilovanych jazyku vim, ale nepovim. :) Nejprve chci tento problem analyzovat sam; zatim se to zda pomerne slibne (prinejmensim jako vyzkumne pole). Nicmene, nemyslim, ze by na to nikdo jiny nemohl prijit, takze urcite nebudu prvni, kdo se o neco takoveho pokousi. Zajimave je to tim, ze je to na opacnou stranu, nez je smer strukturovane programovani -> objektove orientovane programovani (kam se ted vrha veskery vyzkum).
[60] Je pravda, ze unsigned tam chybi, ale zatim jsem na to "nenarazil". Stejne tak jako ty delegates se zatim drzely v unosne forme :-)
[62] 'To onanování nad přísnou typovou kontrolou je sice hezké, ale mám takový pocit, že takto může jásat jedině člověk, který snad nikdy neprogramoval něco většího.' Zrejme pod pojmem "neco vetsiho" myslite "neco co ma vic jak 1000 radek" :-) V opravdu velkem projektu je potreba dodrzovat konvence a pokud mozno neprasit. To plati i o goto; za poslednich nekolik let jsem ho pouzil pouze na "emulaci" bloku "try - finally" ;-)
Nikdo nerika, ze Java nahradi C, ale ani C nemuze plnohodnotne nahradit Javu (nebo nejaky jiny vyssi jazyk), je to proste o necem jinem. Ne ze by se to v C nedalo napsat, ale cas na napsani bude nekde dost jinde. Mimochodem - znam jednu oblast, kde je C dost spatne pouzitelne - tam kde musite vice pracovat s texty.
Díky všem za další příspěvky.
Chtěl jsem reagovat hlavně na [62], ale udělal to za mě Michal Kára. Jenom doplním, že si skutečně myslím, že příkaz goto má hlavní význam v jazycích, které mají slabé vyjadřovací schopnosti - ten klasický Pascal například sice zná goto, ale nezná žádné příkazy pro řízení cyklu o obsluze výjimek nemluvě. Další výborné řešení, které eliminuje potřebu dělat explicitní clean-up, je pythonovský příkaz with - nadefinuju si blok, ve kterém budu používat nějaký soubor a on se mi při ukončení bloku (normálně i pomocí výjimky) zavře automaticky. Tomu já říkám tvořivost; prasení pomocí goto je tak maximálně "lidová tvořivost" nebo z nouze ctnost.
Přílišná typová kontrola zdaleka neznamená, že to nebude zprasené. Právě naopak - pokud ji nemáte, můžete si ji konvencemi ustanovit. Pokud ji máte a musíte s ní počítat při návrhu ať chcete nebo ne, může to naopak zprasit hodně věcí. Ne nadarmo se říká, že méně je někdy více. Když vím, že jedna proměnná může mít různé, avšak smysluplné a dobře definované významy, pokud je nahlížena pohledem různých datových typů, nevidím důvod, proč toho nevyužít. Ovšem jazyky se striktní typovou kontrolou si myslí, že jsou chytřejší, než autor programu. Ikdyž - dnes tomu tak často opravdu bývá.
Pokud jde o goto - tak bych řekl, že vedle ukazatelů je to jedna z nejnebezpečnějších, ale zároveň nejúčinnějších zbraní. Pár dobře použitých goto v rámci funkce může kód významným způsobem současně zrychlit, zkrátit a zpřehlednit (ne, nezbláznil jsem se, skutečně říkám zpřehlednit).
Jazyky se "slabšími vyjadřovacími schopnostmi" dle mého názoru především nepředpokládají, že programátor je vůl a že překladač ví nejlíp, co je pro mě dobré a že dokáže všechny možné eventuality podchytit nějakou svou na míru šitou konstrukcí. Místo aby mi umožnil použít goto, které by vedlo k vygenerování jedné strojové instrukce, jež by můj problém řešila nejjednodušším možným způsobem, tak mě "chytré jazyky" nutí splácávat dohromady různé podivné balasty, jejichž opodstatnělost překladač nikdy nedokáže posoudit a o jejichž výsledné efektivitě by se dalo dlouze polemizovat. A můžete si klidně říkat že je to lidová tvořivost a prasení, stejně moje goto bude mnohem efektivnější, než vaše try-catch nebo with nebo co to bylo za příklad a podobné serepetičky. Vždycky mě fascinuje, jak určitý typ lidí cítí potřebu vnucovat ostatním svá dogmata. Řekněte "goto se mi nelíbí, protože ho neumím efektivně používat" místo toho, že je to prasárna a lidová znouzecnost. Vždyť je to jak zatracovat dláto a ruční hoblik, protože je k dispozici protahovačka a frézka - to sice ano, ale ty dva prvně zmíněné nástroje, ač mnohem jednodušší, jsou nesrovnatelně univerzálnější. Mně nepřirostlo k srdci OOP a také netvrdím, že objektové programování je prasárna. Proti gustu žádný dišputát...
Můj názor je takový, že jedině autor programu ví nejlépe, CO chce udělat a JAK to chce udělat. Jazyk ho v tom má podporovat a ne mu klást do cesty zbytečné překážky.
Takže pokud jde o C - náhrada za něj není, není tedy důvod přemýšlet nad tím, že se ještě dnes tak masivně používá. Je třeba si přiznat, že C je dnes nejuniverzálnější a nejmocnější kompilovaný programovací jazyk ze všech. Stejně tak se dodnes ve vědeckotechnické sféře používá hojně FORTRAN, protože dodnes vyhovuje nárokům v daných oblastech nejlépe.
Komu se to nelíbí nebo nad tím žasne, tak ať přijde s něčím lepším.
P.S.: navíc si myslím, že se ještě dostatečně nerozlišuje mezi "lepičem kódu" a "programátorem" v původním smyslu slova. Pro lepiče, kterých je dnes tak 80%, je C skutečně nevhodné. Pro programátora je to téměř nenahraditelná věc.
Zilogat0r: To ze jsi si toho nevsiml je vcelku zavazny problem, doporucuju prostudovat danou problematiku a zaroven si rozsirit rozhled.
Inkvizitor: C# ma zase using() a C/C++ ve sve podstate { }.
Na goto nevidim nic spatneho, pokud je pouzito spravne, je pak kod mnohem logictejsi. Bohuzel majoritne k tomu sedne nejaky Mort a vysledkem je neco horsiho nez spaghetti :).
C je v jistych smerech tezko nahraditelnym jazykem, bohudik pro nas, tech smeru je dnes jen skutecne minimum a opasek se dale utahuje.
[70] Nevšimnul jsem si, že bych tady něco někomu dogmaticky vnucoval - uznávám, že každý nástroj má své místo a nemohu (skoro) nikomu nic nařizovat. O tom, že se optimalizace a další věci budou čím dál tím více řešit automaticky, jsem ale docela přesvědčen. Teoreticky je dokonce možné, že původně interpretovaný jazyk díky JIT poběží rychleji než kompilovaný (a ručně optimalizovaný), protože má možnost za běhu generovat kód podle aktuální potřeby (rozbalení cyklu atd.).
[71] Díky za doplnění. Sice bych řekl, že { } mají v C poněkud menší moc než v C++, ale v zásadě souhlas.
[72] Však jsem taky neříkal, že konrétně vy ;-) Ovšem např. univerzální odsouzení goto, jež jste provedl, nebo obecně zavrhování C kvůli tomu, že správa paměti je přenechána programátorovi, tím dogmatismem dost zavání. No a pokud nikomu nic nechcete vnucovat, tak vám může být lhostejné, jak je C rozšířené, nebo ne?
Optimalizace by byla další velká kapitola na debatu. Moje zkušenost třeba ukazuje, že nejúčiněji si program dokáže zoptimalizovat jedině člověk a to z jednoho prostého důvodu, který ještě dlouho, ne-li nikdy, nepřekoná žádný automat - člověk rozumí tomu, co dělá, je tak nějak "o dimenzi výš", kouká na to zvenčí. A až to nějaký software dokáže taky, tak už nebudou zapotřebí programátoři - alespoň ne v lidské kůži. Troufám si tvrdit, že většina optimalizací provedených automaticky je spíše optimalizační paběrkování. To podstatné, totiž podstata algoritmů a obecně analytické návrhy softwaru, zůstává často nezoptimalizováno a s tím už nehne ani ten nejgeniálnější překladač. Ostatně podívejte se na poměr výkon/nároky současného SW a SW z doby před 20ti lety. Optimalizátory čím dál vymakanější, HW čím dál rychlejší a méně omezující, ale SW čím dál pomalejší a nespolehlivější.
No a pokud jde o interpretovaný jazyk rychlejší než kompilovaný, tak to už tu je taky desítky let - přesněji, je celkem snadné napsat jeho interpret takovým způsobem, aby tohoto stavu bylo možné docílit vhodně koncipovaným programem v tomto jazyku napsaným. Ale asi by vaším favoritem zrovna nebyl, stejně jako 99% IT populace - i když pro mě je to snad nejpozoruhodnější programovací jazyk, který byl kdy vymyšlen. Poznáte ho? ;-)
[73] Goto sice neni uplne spatne, ale melo by se jim _velmi_ setrit, pouzivat pouze v situacich kdy _opravdu_ zprehledni kod.
Optimalizace: Nojo, ale ma smysl stravit clovekomesic prace na optimalizaci po ktere dostane uzivatel reakci misto za 5ms uz za 1ms?
"Když vím, že jedna proměnná může mít různé, avšak smysluplné a dobře definované významy, pokud je nahlížena pohledem různých datových typů": Omlouva vas jen to, ze evidentne netusite nic o OOP - tomuhle se rika tusim polymorfismus :-) Jinak ano, pri zpracovani binarnich dat se vyskytuji situace kdy je typova kontrola dost na obtiz, ale to dost zalezi na tom, jaky typ uloh programujete.
Kdyz uz jsme u toho OOP - ja bych to oddelil od jazyka a nazval Object Oriented Design. To je urcity zpusob nahledu na problem (analyzy) ktery se v praxi osvedcil pro velkou radu uloh. Programatori jej vicemene znaji takze OO analyzu delanou nekym jinym vetsinou rychle pochopi. Jazyky pro OO maji podporu, takze se to da i rychle nakodovat. (A da se to nakodovat s vetsimi ci mensimi problemy i v takovem ciste C-cku, obcas to delam :-) ).
[74] S goto naprosto souhlasím.
optimalizace - no tak do takových extrémů zabíhat asi ne, ale pokud se jedná o řády, tak si myslím, že už to je nezbytné.
OOP - opravdu, nejsem ani teoretik, ani mi tento styl nesedl, ale i z toho co o tom vím bych řekl, že to co já jsem měl na mysli není polymorfismus. Polymorfismus je založen na "příbuzenských vztazích" mezi třídami, ne?
GOTO je naprosto prirozeny konstrukt. Silny, mocny, da se s nim hodne resit (a pitomec s nim muze mnoho zkazit). Ale to neznamena, ze je spatne - je to pro procesor ta nejprirozenejsi vec, zaklad vseho vetveni algoritmu - a nevim, proc by ji mely vyssi jazyky potirat - v zajmu koho?
nekompetentnich lepicu pseudokodu?
[75] IMHO jen malokdy dosahnete optimalizace o rady zmenou jazyka - to spis zmenou algoritmu (nejlepe zlepsenim asymptoticke slozitosti), ale to neni problem jazyka.
Ja take nejsem teoretik :-) Ale pokud si vezmu vicenasobnou dedicnost (nebo interfaces jak to implementuje Java), tak muzu udelat presne to co pisete. I kdyz pokud jste myslel ze mam pole binarnich dat a koukam se na ne jednou jako na znaky, jednou jako na wordy, tak to samozrejme polymorfismus neresi a OO zde neni moc vhodne, to uz jsem psal.
[76] V zajmu tech chudaku co pak musi takovy kod louskat :-D
Kod ma byt predevsim funkcni, prehlednostm je vzdy az druhorady faktor.
prehledne napsana pitomost bude muset byt stejne opravovana/upravovana, az uz tak prehledna nebude. Zatim tu nezaznelo to zakladni, a sice, ze programy nemaji byt psany rychle, za co nejmin penez, co nejmene znalymi lidmi, ale ze maji FUNGOVAT. A tomuto kyzenemu stavu nas tuny vrstev a frikulinskych vyssich jazyku spise vzdaluji, nez priblizuji, a to je kletba tohoto oboru.
Na otazku, jak asi vypada kompilator vyssiho jazyka, kompilovany bugovym kompilatorem o trochu nizsiho jazyka, bezicim na bugovem jadre, je opravdu odpoved ve hvezdach.
[80] v nefunkcnim vyssim jazyku NELZE napsat obecny funkcni kod, mily zlaty. Funguje vetsinou jen pro par "standardnich situaci". Kodokoli chce neco trosku specifictejsiho, je v naproste vetsine pripadu, bez ohledu na konkretni jazyk, odsouzeny k tweakovani a vymysleni krkolomnych konstrukci, kterak presvedcit HLL ke generovani korektniho kodu.
ano, je to o tom "na spravny ukol spravny nastroj", jenze co jsou ty spravne nastroje, se zacina zapominat. Viz hruzne nesmyslne navrhy na jadro kernelu v C++, operacni system v jave, nebo drivery v .NET, co jsem nedavno zaznamenal. Buh s nami, potom.
[78]: Ty bavis :)) Presne tak, program musi predevsim fungovat a to je snadneji dosazitelne v beznych aplikaci v managed jazycicich nez C, proto se v nich pise tolik veci, co se v nich pise :-)
[79]: No a?:-) Je to vzdy jen o kompromisech nakladu a vykonu. Konec koncu pocet uspornych procesoru celkem utesene narusta, stejne tak jak se snizuje prikon klasickych "vykonnych", evidentne proto, ze je po tom poptavka..
[82] fungovat = vyzadovat desitky megabytu navzajem nekompatibilniho environmentu, casto konkretni verze, na blbe zobrazeni par cisel ve formulari inicializovat desitky sekund pomale applety, a pri behu zahnojit operacni pamet az kam to jde?
typickym prikladem budiz e-banking KB, psany v te skvele uzasne Jave, ktery by mel tedy fungovat vsude. A jaky je vysledek? Funguje s konkretni verzi JVM na konkretnim proprietarnim systemu, jen vuci konkretni verzi IE. Volam bravo, lepici javovych hnusu...
[81] programovat skutecne neumim, ani o programovani nic nevim - natoz o tom, jak vypada efektivni strojova podoba kodu uz netusim ni zbla :))))
[83] naopak - ke spatnemu designu nektere programovaci jazyky svymi paradigmaty vylozene navadi (100% souhlas shttp://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918 ) - mluvil o tobe, Michale, a tobe podobnych :). Zeptam se - kdyz uz tak "hodnotis" kvalitu jazyku - znas vubec asm/strojovy kod x86? Nebo je tvym meritkem to, jak to vypada v textovem editoru...
[85] harry_x samozrejme, ze to nemelo s javou vubec nic spolecneho, krom idiotskeho designu emulace zasobnikove architektury s zabudovanymi objektovymi (rozumej: zpomalovacimi, bloatovacimi) rysy...
soucasna verze mi snad bude fungovat napr. s mozillou, pod Linuxem? ne, vid. a proto se ptam - proc to je tedy v jave, kdyz to jen vyzaduje dodatecny environment, a je to kvuli ni 10x pomalejsi? manazerske rozhodnuti?
[87]: co jsem cetl, tak presli na standardni sun javu, takze pravdepodobne fungovat bude (a pokud ne, tak to neni chyba Javy, ale jejich), ale e-banking KB je mi celkem ukradeny, kdyz u tehle banky nejsem :)
A to, ze to nefungovalo kvuli nestandardnim rozsirenim a zmenam, co udelal MS a pro jehoz Javu to psali, to opravdu nema nic spolecneho s architekturou Javy, to by jsi mohl chapat :-)))
Popravde se nad touto diskusi smeju, nejprve se rvalo, ze skutecni programatori neprogramuji v Fortranu, ale v assembleru (s uplne stejnymi argumenty), ted se rve, ze skutecni programatori neprogramuji v managed jazycich. Oboji je k smichu, jedno historie uz nevyvratitelna pohrbila, druhe ceka to same :-)
Jazyky jako C (ci primo assembler) budou mit vzdy sve misto na slunci, veci jako libc ci kernel v nich nikdy nebudou moci byt napsane (nebo resp. neni to zadouci) - ale to je jen zlomek aplikaci, ktere se vyviji. Vetsina aplikaci potrebuje neco uplne jineho a tam exceluji managed jazyky. Na desktopu C#, na serveru Java.
[88] neefektivita je vlastnosti javy obecne, bez ohledu na extenze.
netusim, jestli u KB s prechodem na Sunovskou Javu odstranili i zbytek nekompatibilit, ale puvodni idea, s kterou se nesmyslna Java protlacovala, tj. "pobezi to rovnou na vsem bez ohledu na system/platformu", zrejme opet vyjde naprazdno, viz: http://www.linuxsoft.cz/article.php?id_article=1371
Tedy z neslavne Javy i po letech zbyvaji predevsim nevyhody - presne, jak jsem kdysi predpovidal. A uz to snad zacina dochazet i Sunu, ze tudy cesta nevede.
[89] pokud nejaka technologie produkuje znatelne vetsi procento spatnych (zbytecne velkych, zbytecne pomalych, zbytecne na environmentu/emulaci zavislych, nesobestacnych, nekompatibilnich s verzemi vlastniho prostredi) aplikaci, jsou tedy dve moznosti:
- je to spatna technologie
- tuto technologii preferuji spatni programatori
tak si vyber, kam se zaradis.
[77] "Optimalizace změnou jazyka" - no vidíte, takové spojení mě ani nenapadlo :-) Nicméně jsou jazyky, v nichž daný algoritmus lze zapsat jednoduše a efektivně, a jsou jazyky, kde to jde hůře. A přesně o tom jsem mluvil. Proč mám vymýšlet podivné konstrukce jen abych uspokojil překladač, když by to šlo jinak a snadněji s využitím mnohem jednodušších elementů, jako je např. goto či přetypování? Takový algoritmus tak akorát pohřbím než abych ho implementoval. A to už problém jazyka je.
K tomu OOP - ano, myslel jsem spíše to druhé - kdy se na ASCII znak můžu dívat jako na cifru, na rozdíl dvou ukazatelů jako na velikost, atd. atd... Jinak vícenásobná dědičnost je pokud je mi známo věc, kterou teoretici OOP také nevidí rádi - skoro takové goto v objektové podobě :-) ... Navíc polymorfismus OOP se sice skutečně v mnoha ohledech dá přirovnat k tomu přetypovávání, ale za jakou cenu na úrovni generovaného kódu a jeho efektivity se to děje, to je nesrovnatelné.
[87] on tu zásobníkovou architekturu nakonec více či méně simuluje veškerý generovaný kód každého vyššího jazyka - je to totiž jednodušší. Práce se zásobníkem se dá celkem snadno zapsat a popsat v podstatě matematickým jazykem a lze nad touto strukturou vyslovit a dokázat spoustu tvrzení, mající charakter optimalizace práce s ní a co především - všechno je to lépe automatizovatelné. Spoustu věcí napíšete v Assembleru jednodušeji a efektivněji s využitím širokého sortimentu proměnných a registrů, ale pokud by podobný kód měl být produktem ne člověka ale jiného algoritmu, nastává spousta problémů, jejichž řešení je pro člověka celkem snadné, ale pro stroj komplikované. Člověk totiž dokáže spoustu problémů řešit ad hoc, zatímco stroj potřebuje soubor jasných a jednoznačných pravidel.
[*] Já bych si dovolil znovu opakovat, že je zásadní rozdíl mezi programátorem a lepičem. Něco jako mezi řemeslným mistrem a člověkem u pásu. Je jasné, že ti dva se pohybují každý v úplně jiné lize. Pro mne je programování vysoce tvůrčí činnost, vyžadující intenzivní myšlení a nadhled. Je to něco jiného, než vyhledávat knihovny a existující komponenty a své řešení přizpůsobovat existenci či neexistenci odpovídajících polotovarů, z nichž je pak výsledek nějak poslepován, aniž by autor tušil, jak to celé vlastně funguje. Je mi jasné, že dnes už není možné vystačit si jen s programátory, stejně jako by řemeslní mistři nestačili k uspokojení poptávky po jejich výrobcích. To mi ovšem nebrání hledět na lepiče a jejich nástroje s pohrdáním :-)
[87] - to sice ano, jakekoli strukturovane programovani (a OOP skryte) je uz z podstaty zasobnikovym pohledem na problem - jenze jde o granularitu tohoto rozvrstveni.
Stara koderska poucka "nedelej si na kazdou ptakovinu extra funkci, a kdyz uz, tak aspon inlinuj" s zakladnim atributem Javy hrube koliduje, a stigma tohoto prohresku se java sotvakdy dokaze uplne zbait, byt by se 10x jitovala.
[*] :) hehe, asi tak :)))
[93] jinak klobouk dolů před vámi, když dokážete dopředu poznat, jestli právě zpracovávaná entita je znak nebo číslo a rovnou to správně přetypujete... (bez toho, aniž byste se pokusil něco o té entitě zjistit) - to jen taková moje poznámka k tomu vašemu srovnání polymorfismu a přetypovávání
[96] boze, program je snad deterministicka zalezitost, a kdo uz jiny, nez programator - autor algoritmu, ma vedet, jaka data prave hodla zpracovavat?
takze ono se programy pisi na slepo, aby jako zhruba neco delaly, a bozsky kompilator za vas rozhodne, co vlastne? BOZE. JE TO HORSI NEZ JSEM SI MYSLEL.
[97] :-) vy jste asi nikdy nepsal žádný program, který by zpracovával uživatelský vstup, že? A který má dělat něco na základě toho, co uživatel zadá?
Právě že kompilátor se rozhodne na základě toho, co mu řeknu, jak se má rozhodnout - tj. nechat rozhodnutí až na tu chvíli, kdy ta daná entita bude zpracovávaná...
[96] a bozky Chnushnus kompilator to dela bez toho, aby neco zjistoval?
ne-e. bud je to staticky objekt, a pak uz identifikator rika, co to je (coz MUSI programator vedet take, sak ho zakladal), a nebo je dynamicky, a pak saha do objektu:
p=(_a *)&b;
80485c2: 8d 45 f0 lea 0xfffffff0(%ebp),%eax
80485c5: 89 45 ec mov %eax,0xffffffec(%ebp)
p->ahoj();
80485c8: 83 c4 f4 add $0xfffffff4,%esp
80485cb: 8b 55 ec mov 0xffffffec(%ebp),%edx
80485ce: 8b 42 04 mov 0x4(%edx),%eax
80485d1: 83 c0 0c add $0xc,%eax
80485d4: 8b 55 ec mov 0xffffffec(%ebp),%edx
80485d7: 52 push %edx
80485d8: 8b 18 mov (%eax),%ebx
80485da: ff d3 call *%ebx
80485dc: 83 c4 10 add $0x10,%esp
v nejlepsi verzi (-O4) takto:
p=(_a *)&b;
80485e7: 8d 55 f0 lea 0xfffffff0(%ebp),%edx
p->ahoj();
80485ea: 83 c4 f4 add $0xfffffff4,%esp
80485ed: 8b 42 04 mov 0x4(%edx),%eax
80485f0: 52 push %edx
80485f1: 8b 40 0c mov 0xc(%eax),%eax
80485f4: ff d0 call *%eax
... tj ZBYTECNA reference, i mirne podnapileho C programatora by jiste napadlo dat primo do objektu pri vzniku pointer na funkcni, nastaveny na tu pozadovanou - a hned mame o referenci mene, a ze 4 instrukci jednu.
A to je prosim g++ na maximalni level optimalizace, a tuto trivialitu, kdy lze nahradit blbou _vptr primou referenci (objekt mel jen 1 virt. metodu) samozrejme NEpochytilo. Jak v necem takovem chcete vytvaret, boha, optimalni kod, kdyz to i v trivialnim pripade emituje 4x vice instrukci, nez by napadlo i toho nejpritroublejsiho assembleristu?!?!
Takze stop bullshit, a misto cancu vezmete dbg...
[96] No, teď mne přivádíte do rozpaků... Představte si, že jsou programátoři, kteří to poznají, a představte si, že v minulosti ani jiní neexistovali :-)
[98] Takže vám nestačí ověřit si, že uživatel zadal platné číslo v okamžiku, kdy ho zadal, vy si to ještě musíte ověřit u každé cifry zvlášť a pak ještě sto padesát krát a pokud možno kvůli tomu nechat kompilátor vygenerovat a linker připojit stovky kilobytů naprosto redundantního kódu, jehož jediné poslání je pak v dané chvíli zpomalovat počítač, zaplácávat paměť a vnášet do celého programu další chyby, neboť není žádná bezchybná knihovna...?
[97] - bullshit. runtime polymorfismus, polopaticky receno, znamena, ze existuji 2 funkcne odlisne objekty na 1 pointeru, a jde s nimi pracovat "unifikovane". Takze ten uzivaterlsky vstup STEJNE MUSEL NEJAKY KOD ZANALYZOVAT, a a vytvorit pro nej tridu daneho typu. A jak je ukazano vyse, uz v tomto zakladnim rysu je schopnost kompilatoru "optimalizovat" tristni...
takze kdokoli mluvi o OOP efektivite, nevidi si do pusy, a zrejme ani netusi, jak moc toto paradigma zuzilo puvodni maevrovaci moznosti zde zatracovaneho "cecka". Ano, v C++ se da psat efektivne, ale pak zpetne obvykle zjistime, ze piseme... puvodni cecko.
[96] Vtip je právě v tom, že on opravdu VÍ :-). Přesně ví, s čím pracuje, jak je to v paměti uložené a navrch i ví, jak s tím přesně pracuje procesor :-)...
[102] Hezký :-).... Tuhle jsem se snažil napsat kousek kódu tak, aby to C++ překladač efektivně přeložil... Vysloveně jsem se mu podbízel... a bohužel nic....
Nakonec jsem to napsal v inline assembleru...
to zilogat0r:
mate pravdu, c++ je aj podla mojho nazoru pajazyk, ktory keby vymrel tak by hned bolo na svete krajsie :) (co som sa v nom nakodi... ach.. tolko premrhanych dni...)
Inak g++ (teda gcc pre c++) je podla mojich skusenosti (a skusenosti ludi v mojom okoli) velmi velmi velmi zly c++ kompilator (co je celkom zaujimave v kontraste s gcc pre cecko, na ktore je velmi dobry).
Podla mna cecko (a assembler) bude potreba dovtedy, dokedy budu pocitace fungovat na principe jednotiek a nul a registrov atd... :)
Avsak nechapem, co mate proti vysokourovnovym jazykom vo vseobecnosti (c++ medzi ne rozhodne nepatri). Teda mozno nic, ale ja som to tak z niektorych vasich komentarov pochopil... ak Vam nie je jasne preco v nich niekto programuje, tak sa to rad pokusim vysvetlit...
Este taky dovetok... aj ja zastavam princim, ze na spravnu ulohu spravny nastroj:
- nizkourovnova vec (jadro, ovladac) => cecko
- multiplatformova vec => Java (teraz som tu na tejto diskusii nieco cital o nie az zas tak uzasnej multiplatformovosi - tak to este pozriem teda... sakra... snad to je len problem blbych programatorov a nie Javy samotnej, ci nie?)
- cisto konkurentna a/alebo distribuovana vec => Erlang
- vsetko ostatne => Common Lisp SBCL :)
(vo vsetkych zmienenych som v podstate aj komercne kodil)
Proste C++ predstavuje naprosto posledni rozumnou a jeste "relativne" unosnou abstrakci od strojove implementace.
Proto odpoved na otazku Kudy dal v kompilovanych jazycich zni:
"Nikam, bude lepe dopsat stavajici kompilatory tak, aby
dodrzovaly platnou normu napr. co se tyce sablonovani."
Souhlasim se Zilogat0rem, ze pokud chci mit pro tridy v C++ kvalitni kod musim programovat a uvazovat jako v C. Viz. implementace polymorfizmu u desktriptorech v Symbian OS. Kde vubec vzali tvurci SymbianOS hodne vlastnosti C++ hakem. ;-)
Java a dalsi jim podobne interpretovane jazyky pouze dokazaly, ze mytus o lehke prenositelnosti programu mezi platformami je blbost. Na jinych platformach takovy "dzava" program sice mozna bezi, ale nikdo nema tolik casu, aby ho mohl pouzivat. Protoze to trvaaa hrozneee dlouhooo.
Pripadne nema tolik penez, aby mel dooost velkou pamet. (samozrejme krome ulhana)
A pokud tady bude nejaka lama hned namitat ze Java neni interpretovana a ze vlastne kazdy kod se sklada pouze a jen z volani knihoven, tak at jde pojidat koblihy a ucit se assembler.
[105] mne na jave vadi uz to, ze je - vzdyt je to prachsprosty emulator velice spatne koncipovaneho vypocetniho modelu.
vidime to dnes a denne - prime emulatory konkretnich platforem svisti (napr. qemu, rosetta...), kdezto tenhle hnus, co mel tu nevidanou vysadu stanovit si kod tak, aby se zpracovala nejefektivneji - je neefektivita sama.
kdyby autori distribuovali misto classu (a ted to prezenu) napr. m68000 binarni chunky, a na masinach bezel m68000 emulator, byl by vysledek daleko pouzitelnejsi.
jde o svevolne zavleceni naprosto zcestnych rysu do navrhu, a svevolne prosazovani teto spatne vybrane cesty demagogickym apelem na ty mene znale programatory.
lecjaky manazer si tehdy myslel, ze www == java, a tak to tu dnes holt mame, co nadelame - jako buzzword to byvalo zvucne, ale uz ve specifikaci shnile, a v implementaci shnile na druhou.
[106] Uff... no toho je strasne vela... celkom dobre to zhrnul Linus Torvalds (teraz pred chvilkou som tu v tejto diskusii na to videl odkaz, celkom sa rozohnil, dobre som sa pobavil :)
Momentik... tento:
http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918
Ako mne osobne vadi na nom uz asi vsetko, ale to je asi sposobene tym ze posledne dva roky programujem vacsinou v Common Lispe... takze uznavam, ze asi mam na tvorbu programov uplne iny nazor ako ludia co programuju v c++. Vadi mi jeho neuveritelne ukecana a smiesna syntax (vravel som Vam ze som poznaceny zatvorkami;), ale sak staci sa pozriet na normu, aky je to paskvil...
Vadi mi ze sa pouziva ako vysokourovnovy jazyk, resp. vela firiem ho tak pouziva, a tym padom prichadzam o potencionalne miesta kde pracovat, pretoze si nechcem skazit zivot ako c++ code-monkey.
Vadi mi jeho objektovy system, kde nie je vsetko objekt, nema multidispatch, nema aspektovo orientovane crty (:berofe :after :around), pretazene operatory su len na smiech (uz som to tu na root.cz raz vysvetloval), vadi mi strasne fungovanie viacnasobnej dedicnosti (prekryvanie a pod... uz si to ani nepamatam tie pravidla), vadi mi striktna zapuzdrenost, vadi mi absencia syntaktickej abstrakcie, a v podstate mi aj vadi, ze nema garbage collector - z coho vypliva ze mi vadi ze nema lambdu, closures... a tak by som mohol pokracovat...
Kazdy projekt, co som v c++ videl, by bol v rovnakom rozsahu a rovnakym sposobom naprogramovatelny v obycajnom cecku (kazdy, kto to chcel mat aspon trochu rychle sa totiz vykaslal na RTTI)
[108]
Opat suhlas... Java je hnus (aj ked mozno to trochu prehanate)...
Momentalne vsak pracujem na projekte, kde klient musi bezat v prehliadaci (skratka musi, server je samozrejme SBCL:)... mal som na vyber Java Applet alebo Flex... a po tom co som cital o Flexe sa mi do neho moc nechce...
Vedeli by ste mi poradit nieco ine? Aj ked by som uz teraz nemal cas to prepisovat, do buducna by mi to celkom bodlo...
[109] Absolutně nechci vyvolávat žádný flame, ale Linus není počítačový bůh, jen ve správný čas zkusil napsat ten správný kód... kdyby to neudělal on, udělal by to někdo jiný o půl roku později. Je jenom člověk jako každý jiný :-), některé své podivné názory změnil, jiné nikoliv... má na to právo :-).
Z toho, co jste napsal mi to přijde, že vytýkáte C++ že není superjazykem s naprosto všemi myslitelnými vlastnostmi :-)...
Zkusím to projít popořádku...
K syntaxi - tady si trošku protiřečíte ne? C a Javu byste rád, C++ nikoliv; ovšem z hlediska syntaxe je mezi nimi pouze malý rozdíl... Na druhou stranu chápu, že pokud jste poznamenán Lispem (jehož syntaxe zas připadá nikoliv směšná, ale odstrašující, mě), nebude se Vám syntaxe C-like jazyků líbit. Ale nepoužíval bych to jako argument proti C++, pokud C a Javu můžete.
Co se ukecanosti týče, mohl bych Vám připravit odkaz na kód, který je v C++ a rozhodně byste ho za ukecaný nepovažoval ;-)... bohužel za čitelný taky ne.
Norma - paskvil... opět bych se mohl zeptat, co konkrétně je tam paskvil... a určitě bychom našli něco, co se mi také nelíbí, ale nepřipadá mi rozumné ji odsoudit zrovna tímto způsobem.
C++ samozřejmě není čistý vysokoúrovňový jazyk, nicméně má hodně vysokoúrovňových rysů a proto se dá jako vysokoúrovňový úspěšně použít. Nicméně, jak už jsem psal někde výš, C/C++ jsou hodně o svobodě... můžete... nemusíte :-).
Trošku nechápu co Vám vadí na tom, že v C++ není vše objekt... Z jakého důvodu by třeba jednoduché datové typy měly být objekty? Jednak by to značně komplikovalo nízkoúrovňovější tvář C++, jednak by to bylo zbytečně pomalé... Podobné výkřiky jsou čistě OOP fanatizmus...
Multidispatch... to bohužel netuším, co by mohlo být.
Aspektově orientované rysy... ještě jsem se zcela nerozhodnul, jestli je AOP vůbec nějakým přínosem, či spíš naopak. Podle mě se dá téměř cokoliv, co řeší AOP udělat i jinak a čitelněji... ale chápu, že je to věc názoru.
AOP se objevilo relativně nedávno, možná se ho v C++ dočkáme taky :-(.
Já věřím, že v Lispu je možné udělat operátor z čehokoliv, otázka je, k čemu je to dobré (samozřejmě věřím, že vymyslíte úžasný příklad, ovšem realitě bude jistě značně vzdálený)... Přetěžování operátorů v C++ bylo primárně určené k zlepšení čitelnosti matematických výrazů nad komplexními typy a k tomu (a spoustě dalších věcí) slouží velmi dobře :-).
Vícenásobná dědičnost je samozřejmě diskutabilní věc. Ale C++ Vám ji nevnucuje. Nelíbí? Nepoužívejte ji. Občas dokáže věci hezky zamotat, ale i krásně vyřešit.
Striktní zapouzdřenost - bohužel si nejsem zcela jistý, co tím přesně máte na mysli. Zkuste prosím trošku rozvést.
Syntaktická abstrakce - protože C++ nemá, bohužel asi nebudu vědět o co jde... Takže ani nemůžu komentovat. Možná to může být užitečné...
GC - já jsem rád, že ho C++ nemá. Jak už jsem psal výše, GC se dá plně (a kontrolovaně) nahradit smartpointery, když člověk chce. Obecně si myslím, že GC je ideově pomýlený; programátor by měl být za zdroje výpůjčené od OS zodpovědný...
K poslední poznámce... Ano, to je možné. Podobně, jako každý projekt v Javě by (z hlediska funkčnosti) mohl být napsaný v C++ a každý projekt v C by mohl být napsaný v assembleru.
Nicméně, pro určité třídy aplikací jsou různé jazyky více/méně vhodné z hlediska kompromisu mezi výkonem a náročností na napsání...
Spravuji/rozvíjím ne zcela malý projekt, kde hlavně u jeho hlavní GUI aplikace jsem za C++ skutečně rád :-). Souhlasím s tím, že bychom to bývali mohli napsat i v C, nicméně spoustu věcí z C++ bychom si vlastně implementovali sami (virtuální tabulky+metody rozhodně) a přehlednost kódu by rozhodně značně utrpěla...
[108]: Bytecode m68k misto Javy? Tak to jsi mne skutecne velmi dobre pobavil :) Jen tak dal...
Ale jak se to rika, kazdy ma moznost volby :) Ja kdyz potrebuji, tak programuji v asm (embedded povetsine) nebo C/C++, enterprise aplikace programuji v Jave EE (coz mi setri cas a naklady), vyvoj je rychlejsi a efektivnejsi, klienti jsou spokojeni a ja tez :)
[108] Myslím, že v otázce bytecódu se mýlíte.
Velké množství dnešních kompilátorů pracuje interně s určitým bytekódem, který nemá přímou vazbu na výsledný strojový kód. První fáze kompilace (front end) vytvoří interní bytekód ze zdrojového kódu, druhá část (back end) generuje z bytekódu strojový kód zvolené platformy.
Java pouze při "kompilaci" před distribucí vynechává druhou fázi a provádí ji až za běhu dynamicky.
A protože dynamická kompilace může optimalizovat kód na konkrétní procesor (statická kompilace se většinou omezuje na skupinu procesorů; pro šťouraly zdůrazňuji slovo většinou :-) ), je výsledek velmi rychlý; přesněji řečeno, má potenciál být velmi rychlý.
Samozřejmě ovšem dramaticky záleží na tom, kolik kódu je potřeba kompilovat a kolikrát se daný kód prochází. U algoritmů, které jsou na zkompilování krátké, ale procesor je prochází mnohonásobně může být výsledek teoreticky rychlejší než v C...
Aplikace psané v Javě nejsou pomalé z důvodu, že by bytekód byl špatně zvolený... Příčiny jsou podle mě jinde a jsou (jak to vidím já) zhruba 3:
- Java musí provádět spoustu kontrol, které si programátor může dovolit v C vynechat, když ví co dělá
- lidé, co píšou v Javě jsou většinou hodně vzdálení HW.... většinou nemají tušení jak procesory fungují, jak efektivně pracovat s pamětí a cache...
- protože to je jazyk "in" a ne příliš komplikovaný, spoustu Javovských aplikací dělají zmínění lepiči :-)
To je zase jednou flame ... Tak nejak nechapu o co tu bezi.
Par jedincu se tu snazi presvedcit ze znaji vsechny obskurni zapovezene vlastnosti tech nizsich jazyku, aby tak nejak dokazali, ze jejich nazor ma vyssi hodnotu ... nebo to chapu spatne?
Pritom ale zcela detinsky kopou do tech 'vyssich' jazyku s horecnou nenavisti a to o nich nic ani nevi. Leda jen to, ze 'v nich urcita skupina lidi uvolnuje spatny kod'. Ktera skupina lidi? Oni 'lepici kodu'? Tak at si dal lepi sve code snippets, s takto poslepovanym programem se realne neda prosadit. Pokavad chcete, aby vas nekdo zacal brat vazne, tak pracujte s fakty a ne jen vykriky do tmy stylem 'abrakadabra'.
[86] V assembleru jsem psal. Dokonce v nekolika: Z80, 80x86, 8502, 68000 :-) Napriklad jsem napsal system ktery po spojeni Amigy a PC paralelnim kabelem umoznoval na Amize videt disk PCcka jako normalni disk :-)
Stejne tak v C jsem napsal distribuovanou replikovanou databazi obhospodarujici nekolik desitek terabajtu dat. Takze verte ze VIM o cem mluvim pokud mluvim o programovani v C na "nejvyssi urovni". Ale taky dobre vim, o co vsechno se ve vyssich programovacich jazycich _NE_musim starat a misto toho se mohu soustredit na problem jako takovy misto technickych detailu prace s pameti atp.
Ad odkaz: C++ taky nemusim, pripada mi to jako nechutny hybrid mezi C a OOP jazyky ktery me nevyhody obou ;-)
Jinak (coz se tyce i Vikiho) uz pochopte, ze v 99% programu nezalezi na efektivite - minimalne ne v mezich danych rozdilem mezi C a Javou (napriklad). Vetsinou to akorat znamena, ze procesor nebude 99.9% idle ale 99.8% idle na coz vam viteco... ;-)
Ne ze byste nemeli vubec pravdu, ale tech aplikaci kde o to jde je proste dost malo. Rozhodne min nez aplikaci kde zalezi na tom, jestli to bude napsane za den nebo za tyden.
[108] ano, jenze tento nahled NENI originalni koncepci Javy.
bytecode se hodne dlouho interpretoval (a na interpretovany beh byl Oak, pozdeji Java, puvodne navrzena), a k JIT kompilaci dochazelo az pozdeji.
Neni to zadny mezikod, postihujici obecne semantiku - je to v podstate "vysledny assembler", jen tesne pred linkovanim pro virtualni zasobnikovy pocitac - a tady s tim uz moc nenadelame - jen muzeme vice nebo spis mene efektivne zrealizovat _od_pocatku_neefektivne_ seskladany vypocet.
Nedelam si iluze, ze by nejaky JIT analyzoval semantiku deni na zasobniku, a zpetne rekonstruoval ekvivalent registroveho vypocetniho modelu - to je jen zbozne prani.
Pokud ma nekdo pocit, ze JITovana Java vede ke kvalitnejsimu kodu, nez jaky produkuje nativni kompilator, je zcela vedle - uz jen runtime kontroly jsou nechutna zatez (neodstranitelna - kod, co JITer dostane, s nimi pocita).
[116] podivej, ja jsem assemblerista, a nemusim u vyssich jazyku zabihat do detailu, pokud vidim, ze aplikace je POMALA, VELIKA, NESTABILNI, a po otevreni v debuggeru PLNA NAPROSTO ZCESTNE SESTAVENEHO KODU.
zajima mne, kde co v pameti lezi, co se s cim provadi, a jak casto - to je klic k efektivite aplikace. narozdil od nekoho, kdo mne obdari takovou naslepo poslepovanou "omalovankou", v domneni, ze prave lacino stvoril druhou Monu Lisu - ne.
Obcas mi touhy HLL matlalu pripominaji male dite, co rika: "a proc vlastne nezrusime to seti obili? navrhuji sazet bochniky chleba, to by bylo nejlepsi".
coz je usvedcuje jen z neznalosti a naivniho nadseni pro neco, co je pro ne samotne cernou krabickou.
[112]
Tak aj ja poporade teda (inak vsetko je to len moj nazor, diskutujeme, nevravim ze mam univerzalnu pravdu, len chcem hodit do plena moj pohlad na vec, tiez nechcem vyvolavat flame):
Linus nie je pocitacovy boh, suhlasim, ten link som dal len pre pobavenie (resp. preto aby ste ho nemuseli znoval hladat v diskusii, ked som sa na neho odvolaval). To co tam pise je ale podla mna zcasti pravda...
C++ vycitam to, ze nie je ani nizkourovnovy a ani vysokourovnovy jazyk. Aby bol nizkourovnovy, musite ho pouzivat v podstate ako cecko, a aby bol vysokourovnovy, chyba mu velmi vela dolezitych vlastnosti. Ja mam niekedy pocit, ze ma z oboch "svetov" to najhorsie (malicka vyrazova schopnost z nizkourovnovych jazykov, "pomalost" vysokourovnovych).
Syntax. Nemam rad C-like syntax, ale u cecka ju chapem preco je (a som aj ochotny ju pouzivat:). Vysokourovnovy jazyk by taku obmedzujucu a ukecanu syntax nemal mat. Java syntax mi nevohovuje, preto pouzivam LINJ (Lisp Is Not Java - pisete normalne v Common Lispe, s urcitymi obmedzeniami kvoli Jave..., a LINJ z toho spravi "human-readable" Java kod... takze mozete pouzivat Lispove makra a podobne...)
Norma - paskvil... beriem spat, ospravedlnujem sa... to by bolo na flame... este raz, pardon... nemal som ju tak oznacit (aj ked si to myslim)...
C++ nie je cisty vysokourovnovy jazyk, pravda, a podla mna mu chyba velmi velmi vela vlastnosti, ktore by ho mohli k vysokourovnosti priblizit.
Preco mi vadi ze vsetko nie je objekt? Nema to nic s OO modelovanim... ja v Lispe kodim casti funkcionalne, casti proceduralne, casti objektovo... a ked je vsetko objekt, tak to do seba prirodzene zapada... uz som spoznal, ze sa to tazko niekomu vysvetluje, kto neprogramoval v cisto objektovom jazyku, resp. ja to moc neviem (nikdy ma nepochopia) :)
Multidispatch.... OO jazyky, ktore poznate Vy, rozhoduju o vyslednom zavolani metody iba na zaklade jednoho (prveho) parametra.
CLOS objekty vsak neobsahuju metody, metody patria generickym funkciam, a genericke funkcie su specifikovane na rozne typy objektov, resp. maju specifikovane svoje parametre na rozne typy objektov... ak specifikujete len prvy parameter, podoba sa to na singledispatch, ktory je v OO jazykoch ake poznate. V CLOS vsak mozete specifikovat viacero parametrov (kludne aj vsetky)... ved vsetko je objekt, takze kazdy parameter je objekt... no precitajte si nieco o CLOS a Meta Object Protocole, ak Vas to zaujima, ak nie, kaslite na to...
Aspektovo orientovane rysy davaju dalsiu vyrazovu schopnost do CLOS, resp. vyrazne zvysuju jeho modularnost. Nemusite to pouzivat ak nechcete, v niektorych pripadoch je to super, ale tiez mi chvilku trvalo kym som to pochopil...
O operatoroch v c++ som uz raz pisal, naco znova (ked tak si najdite v starych clankoch na roote, resp. v diskusiach, bolo to tusim nieco o spocitavani matic)...
Viacnasobna dedicnost je super pri tzv. treadovom modeli tvorenia objektov (ci ako sa tomu odborne nadava...:). Hmm... mam to vysvetlovat? Ak vas to zaujima, tak napiste, vysvetlim, ak nie, kaslite na to...
Zapuzdrenost pomocou public, protected, private je v niektorych pripadoch nanic. Podla mna je aj dokonca zbytocna... nechapem preco by mal programator pred sebou nieco ukrivat... a ak dam vsetko public, zasa to bude vyzerat ze to patri k interfejsu objektu. Mne vyhovuje, ked mam jasny interfejs, ale zaroven aj ku vsetkemu pristup. No ale prave zapuzdrenost nie je asi nejaky velky problem v c++, len mi pride ako blbost...
Syntakticka abstakcia? Vytvarate si vlastne syntakticke konstrukcie, hmm... taky jednoduchucky priklad... ako je napriklad otravne stale pisat for pre prechadzanie pola a zoznamov a podobne, tak niektore jazyky pridali foreach. V jazyku so syntaktickou abstrakciou si kludne napisete vlastne foeach napr:
- for line in file
- for key and val in hashtable
- for computer in local-network
Naprogramujete si vlastne syntakticke vyrazy, ktore vam sprehladnia a zmensia kod, atd... (inak co vsetko sa da s makrami som myslim pisal prave pri tom vysvetlovani blbosti c++ operatorov). Znova, ak vas to zaujima a chcete si rozsirit obzor, citajte, vyhladajte... to ze teraz nevidite na co by Vam to bolo este neznamena ze by Vam to naozaj na nic nebolo...
GC je u vysokourovnovych programovacich jazykoch nutnost (IMHO). Ja som rad ze ho nema cecko.
K poslednej poznamke... chcel som povedat nie to, ze by to islo, ale ze by to nakoniec bol skoro rovnaky kod (teda podla mna... hmm... no mozno nie, toto nechajme tak:)
[122] Assemblerista ... fajn, stejne stupidne muzu zacit tvrdit, ze jelikoz drtiva majorita programatoru dnes neni schopna vyplodit kvalitni ASM kod, tak je ASM spatny?
Efektivita aplikaci je krasna vec, skoro podobny svaty gral jako znovupouzitelnost kodu a citelnost.
Tvoje idealy jsou proste jen trochu nekde jinde, nicmene porad idealy.
Ja si radeji sahnu po .Net a na jakakoli hanliva oznaceni kaslu, dani jedinci maji jen problem se semantikou.
[113] harry-x evidentne javista, co ani netusi, ze veci jdou delat JINAK a LEPE... takze je obtizne ti naznacit, ze napr. rekonstrukce obycejneho cyklu pocitajiciho sumu nad polem prvku znamena u bytecode neustale ukladani indexu, neustale ukladani reference na pole, neustale dereferencovani hodnoty (s kontrolou meze), secteni s mezivysledkem na stacku, a opakovani toho celeho?
JIT udela jen to, ze tenhle cyklus zapise natvrdo, ekvivalent opcode jeden za druhy, prolozeny runtime checky. Nikdy z toho nebude napr.
xor eax,eax
x: add eax,[ecx+(zacatek_pole - 1)]
loop x
coz vypoti i koder-zacatecnik...
pokud je rucne optimalizovany asm 1. liga, je C-cko okresni prebor, C++ utkani mistni TJ, a java kopanim do micku v arealu detskeho piskoviste.
rozdil je v r~a'du r~a'du(s krouzkem).
[123] nejak moc nepadal, ale napr. execnout aplikaci pres pc2am byla loterie 50:50, jestli neskoncime v suspend/reboot (5b/4b cross kabel na LPT, 2m) naposledy jsem to pouzil, kdyz jsem na jare logoutovi do opravene A600 vimplantoval kickstarty z vypalene A1200, a dopraval si nostalgie :).
jinac kabel stacil 10zilovy (9 zivych + opleteni), nevim ke jsi vzal toto: http://www.boomerangsworld.de/cms/apccomm/pics/LapLink4.png
kor spojeni 2-15 je usmevne, vidim, ze nejen memory, taktu, ale i dratu jsi mel vzdy habadej :)))
ale jinak celkem good, lepsi nez transferer Kumrana Karimiho :>.
[124] Koukam na C++ mame velmi podobny nazor
[126] Jenze i tak je vetsinou realny rozdil v radu mikrosekund. A vo tom to je. A taky o tom ze az se nekdy spletes a budes sahat mimo rozsah pole (nejlip zapisem) tak ta aplikace zacne padat a to je teprv chutovka odladit - uz jsi nekdy takovy problem ladil? ;-) Podle zakonu schvalnosti samozrejme pada nahodne a nekde uplne jinde nez na tom kodu ktery strili do pameti :-)
[126]: Jestli te to zajima, tak v asm jsem programoval jak spoustu embedded veci (m68k, 8051, hc12 napr.), zazil jsem projekty, kde se muselo setrit s kazdym bajtem mista, kdysi pred 7mi lety jsem v asm/x86 a C napsal mikrokernel...
Vim, ze to jde rychleji a efektivneji pro stroj (nez programovain v managed jazycich - delam jak v Jave, tak .NET), ale vubec mi to nevadi. Java mi setri cas, zvysuje efektivitu prace (=delam veci rychleji a s mensim usilim a potencialnim mnozstvim chyb)...
A zakaznikum je taktez jedno, jestli je jejich aplikace o 10% pomalejsi a zere o 20% vice pameti, zvlast k prihlednutim k tomu, jak je stavajici HW levny. Pro zakaznika je skutecne nesmyslne, aby platil za optimalnost kodu tam, kde ho naprosto nepotrebuje a kdyz by mu vyvoj takoveho "optimalnejsi" reseni prisel na radove vetsi investici (a vetsi zdrzeni)... V tomhle ohledu jsem naprosty pragmatik...
[127] toz to mas jedine stesti - ale ono to nebylo symetricke, vid - zatimco PC potrebovalo D0 z Amigy, amiga D0 z PC ignorovala (nemela cim nacist) - tj. dost zvlastni :>.
[126] dobre, ale tu sla diskuze o tom, zda by neco nemelo z linuxu vytlacit cecko, a jako navrh padala JITovana java - dovedes si v ni predstavit nejakou vazne minenou userspace aplikaci? Treba ssh, md5sum, mplayer, mpg123, putty? Vzdyt by to byla cista smrt.
[131] dobre, takze pro pole 64kB unrollne mega jitovaneho blivajzu, aby mela code-cache "lehci zivot"? :) A checky se ztrati kam?
To uz je podruhe, co slysim, ze "unrollnuty spatny kod je rychlejsi" - haha. Ne, je jen spatny^2, rychlejsi o zanedbatelnou rezii cykleni, prevazenou do zaporna rezii nacitani cache, rezii dekodovani instrukci na hranach cacheline... no, hanba domyslet :).
nehlede k tomu, ze ten cyklus mel variabilni pocet opakovani, tj. unroller by musel resit vskok dovnitr tak, aby ukonceni vyslo na ten cyklici loop, blablabla... proste zlaty voci, pohadky z CHIPu.
[128] Mě by zajímala tahle metrika. Vždycky jsem programoval věci, který sežerou procesor a když je napíšu blbě, tak poběžej klidně 10x pomaleji.
A tady každej druhej tvrdí, že je to uplně buřt, že 'všechny' programy vlastně nedělaj nic, takže je jedno, v čem se napíšou... OMFG
Pravděpodobně jsou tedy OS, Office, cokoli s videem apod. jen 'výjimky' a všechno ostatní se může psát v basicu...
Na rozdíl od jednoho z předřečníků tvrdím, že C++ je to nejlepší z obojího. Neefektivita kompilátorů, co tak vadí Zilogátorovi, je druhá naprosto nesouvisející věc.
[134] mne nevadi ani tak samo C++, jako spis styl programovani a navyky programatoru, ktere s sebou prineslo.
vadi mi nasilna objektovost tam, kde nema co delat. objekty maji zapouzdrovat rychle funkcni celky, a ne ze kazda pitoma operace uvnitr smycek bude take metoda, a vse bude objekt, malem intem pocinaje...
uz jsem videl i objekt pixel a virtualni metodu "nastav rgb", co podle sirky pixely delala 8:8:8 nebo 5:6:5 zapis... :)
[139] Mno a čemu ty metody vaděj? Když je krátká, tak se inlinuje, když je static, nepotřebuje ani this. Pokud potřebuje šmatat po proměnných, tak je stejně musíš předat, takže jediný, o co přicházíš, tak je nutnost dereference proměnný, což stejně je dneska jedna lea nebo tak něco. Virtuální metody sou zase jen převlečený pointery na fce. Je to jako C, jen se syntaxí pro lenochy ;)
A zase je třeba oddělit problém kompilátoru od problému jazyka.
Díky všem dosavadním diskutujícím za příspěvky, byť jenom zlomek z nich se přímo týká mé otázky.
Jeden citát pro Zil0gatora (a Vikiho a další): "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil." -- Donald Knuth
Jak už napsal Michal Kára v nějakém předchozím příspěvku, důležitá je hlavně asymptotická složitost algoritmu. Zvolit správnou datovou strukturu a algoritmus je základ rozumně rychlého běhu programu. Dnes málokomu záleží na jednom nebo několika CPU cyklech; o speciálních případech, kde to má význam, se nepřu.
Dobrý programátor napíše rozumný program takřka v čemkoliv a "lepič" bude mít tendenci psát spaghetti kód v jakémkoliv jazyce. Ale ta některými nenáviděná Java umožňuje minimalizovat škody a i ty méně zdatné programátory svým způsobem vede.
Pokud ale člověk neudělá botu v návrhu a základních algoritmech, má kompilátor nebo interpreter dost prostoru pro vlastní optimalizace. Proč třeba nenechat na něm, jestli inlinovat tu kterou funkci, když se z modulu nikam nevyváží? Vlk se nažere a koza zůstane celá - kód se (často) zpřehlední a zároveň je rychlost stejná, jako by ten kód byl napsán v každé metodě. Dříve se doporučovalo v C používat dereferenci namísto indexování a dnes to kompilátor zkompiluje do rychlého kódu tak jako tak. Ve funkcionálních jazycích například může kompilátor nahradit koncovou rekurzi iterací, funkcionální konstrukce typu map nebo reduce / fold bez destruktivních operací lze dokonce automaticky paralelizovat.
V mnoha případech interpretované jazyky rychlostně postačují, přesto nejsem ani já občas nadšen dosaženým výkonem a ptám se, zda není možné spojit "výhody obou světů" nebo hledat rozumný kompromis. Několik tipů tady zaznělo, díky za ně. Samozřejmě uvítám další názory.
[141] Knuth si to muze dovolit, coby autor jedne z mala BEZCHYBNYCH aplikaci. Bohuzel si neuvedomil, ze ne kazdy programator k tomu pristupuje s jeho peci (napr. v TeXu odvozoval datove typy zpracovani vystupu od vlnove delky viditelneho svetla, jako totalniho maxima myslitelneho DPI:).
Kdyby napr. autori GCC platili za bugy stejne jako on... tak zchudnou behem odpoledne.
[141] to neplati. pro realne objemy zpracovavanych dat se VELMI LEHCE stane, ze trivialnejsi (a hloupejsi) forma algoritmu jde naimplementovat jako daleko efektivnejsi zalezitost.
Typicky ruzne nekolikaprvkove sorty (3D rendery), vyhledavani, memory-management, cache-management...
Ze ma nejaky algoriotmus lepsi op. sloz z nej jeste nedela vhodneho kandidata k implementaci.
[143]: ad knuth: Jenze prave tenhle jeho citat byl myslen obecne :-)
[144]: Rychlejsi nebude. No a? Smysl managed jazyku neni, aby byly rychlejsi nez nativni, ale aby byly dostatecne rychle pro aplikace v nich vyvijene (coz neni rozhodne 100% aplikaci) a aby vyvoj v nich byl efektivnejsi.
[147] smim vedet, ktera aplikace si muze dovolit tu svatokradez mrhat strojovym casem a pameti? hm?
napadaji mne jen jednoucelove formulare pro pristup do databazi, tj. klikatka pro urednictvo. v podstate jakakoli jina aplikace musi byt skalovatelna co do kvantity zpracovavanych , a tedy napsana efektivne, no way.
[145] Ano, jistě, to je pravda. Asymptotická složitost například zanedbává konstanty, které mohou být občas nepříjemně velké. Přesto si myslím, že většina lidí neudělá chybu, pokud použije standardní knihovní řadící funkci a případné problémy s výkonem bude řešit až podle potřeby.
[147] [149] V době velmi nedávné jsem musel napsat program, který zpracovával 20GB textových denních logů.
Napsal jsem to v Perlu i s vědomím, že to jeden den přechroustá za 2 hodiny. Protože v C/CPP bych to psal dýl a určitě bych to zvoslil, tady jsem to naplácal prakticky bezrizikově za pár minut.
Na jednorázovku to bylo dobrý, ale kdyby se to mělo dělat pravidelně, asi to v tom C napíšu. Nechtěl bych vidět, jak dlouho by to trvalo v něčem ještě vyšším.
Zase mi z toho vypadlo něco tak staroprdelního jako 'všeho s mírou', no ;-)
[150] jako treba STLkovy sort (uvnitr implementovan jako introsort) - to jest ten, co pri neireflexivnim operatoru< (a op a musi byt false). takze pokud si ho nejaky C++ nadsenec do pretypovani nahradil necim jinym, co sice porovnava, ale tuto vlastnost nema, skonci v segfaultu.
a ted mi rekni - kolik C++ "lepicu" o tomhle vi? btw. ve widlich neni introsort, takze tam jim to "projde". Pak to nekdo zkusi naportovat (C++ je preci portabilni, jako spravna HLL), a ... :)))
[148] Mylis se, ja se celou tu dobu bavim o .Net, jenze ty z prispevku ctes kazde pate slovo, to se pak neni cemu divit ze plodis takovy blaboly.
Jeden specificky snippet nic nedokazuje, navic, ja netvrdim ze napr. C# JE rychlejsi ci stejne rychle jako C, pokud se to napise dobre, je to dost rychle ze to dokaze konkurovat, a dokaze to uspokojit potreby vsech s tim, ze v C# to mam napsane Xkrat rychleji.
Pokavad chces nejakou technologii otevrene bashovat, tak dukazy prekladej ty, neco tvrdit jen tak halabala, s tim jdi do politiky.
[153] ja budu tak velkorysy, ze ti dovolim dokazat to na tom tvem .NETu. jsi to ty, kdo tvrdi neco nepravdepodobneho, tak se opri o argumenty. Ja a mnozi dalsi si opravnene myslime, ze bytecode, navzdory JITovani, bude i v takto trivialnim pripade pomalejsi, nez nativne zkompilovy usek kodu. Mas sanci to vyvratit.
[154] u GCC je spis problem "pokud nekdo neumi naimplementovat STL", protoze, jak uz zminoval Linus, je to bugovy DES a HRUZA. Napr. pitomy std basicstring NEMA atomicky handlovany emptystr usagecount.
Dusledek? Kdo ve vice threadech bude zakladat basicstringy, a zase je rusit, muze se na konci podivit, ze mu to spadne. Duvod? Reference neni v heapu, ale .data, nastavena na 1 uz v sekci binarky (POD-object). A kdyz se dva konstruktory setkaji, zvedne se jen o 1, a destruktor pak zavola free nad .data :>.
Pravda dnes uz to opravili (gcc4ka), ale do te doby vsichni hlasali, jak je to STL skvele, a jak je nutne pouzivat basicstringy vsude, kde to jde... trapas.
[157] pozor, tam pisi, ze porovnavali proti rucne optimalizovane asm verzi Q2 - predpokladam, optimalizovane pro Pentium-I - tj. striktni prokladani dvou streamu ("nepouzijes tentyz registr ve 2 instrukcich vedle sebe").
coz je ovsem na PentiuIV (coz byl asi referencni procesor te doby?) nekolikanasobne zpomaleni, kvuli zvrhle uzkemu portu do registerfile (v podstate se vykon redukuje na 1 pipeline, protoze regfile nestiha pripravovat operandy, a z mezivysledku sousedni instrukce z ROB to brat nejde).
Na tyto testy bacha, na PentiuIV bezi rucne optimalizovany kod pro PentiumI vylozene spatne. A nemuzeme obvinovat jeho autory, nemohli tusit, ze u Intelu obrati o 180 stupnu a vznikne hruzne P4 (jedina metoda, jak na PIV napsat solidni strudl instrukci, je neustale hrabat pres [EBP+0xxx] na stack - pak se pipeliny nezadrhavaji - tj. to, co produkuje nejblbejsi kompilator, co si ani local var neumi nechat v registru, sigh :(.
Takze na miru blbym HLL uz se ku*vi i procesory, jak je videt. Takze dekujeme :(.
[158] Pokud vim, tak ID Soft releasnul cely VS.2003 projekt, tzn. spise v dobach PIII a ne PI.
Navic, docela si uderil hrebicek na hlavicku, k cemu ti budou tvoje super-1337 ASM optimalizace, kdyz s jinym procesorem budou akorat pomalejsi, zatimco moje managed app pobezi prinejmensim stejne.
Nemluve kdyz to same spustim na x86-64 / IA-64.
[140]
... ze misto cyklu, co by sosal argumenty v RGB, a sjoinovane do fyzicke podoby je praskal do pole framebufferu, se vubec volala nejaka fce, a navic virtualni metoda...
samozrejme, je mozne, aby nejaky hypoteticky kompilator
i z "nejoptimalnejsiho" mozneho zapisu napr. konverze nibble->hex:
unsigned char num=5; //treba
char hexascii;
hexascii = num + ((num > 9)?('A' - 10):('0');
udelal:
cmp al,0ah ;2B
sbb al,069h ;2B
das ;1B
... ale jak by na to prisel? i kdyby mel tenhle figl zakodovany nekde ve "slovniku obratu", musel by tuhle semantiku rozpoznavat a detekovat v ruznych podobach...
[159] ja za nepovedene modely procesoru nemohu (a pentiumIV je jeden z nejhorsich) - nicmene, se znalosti asm si tu verzi rutiny co pojede i na tom napisu take - aplikace muze mit v sobe obe varianty, a pouzit vzdyn tu vhodnejsi.
ze managovany kod bezi vsude stejne (spatne), v nejlepsim pripade na 70% nejhorsiho asm, je spatny argument (jakkoli se mi uz ten benchmark zda podezrely - vetsinou autor umyslne srovnava nevhodne kompilovanou nativku vuci tyden ladenemu managed.... )
"Nejde jenom o tu práci a o to, že by se měl kvalifikovaný člověk <...> zabývat takovými malichernostmi jako jsou problémy procesoru s pamětí, ale hlavně jde o to, že z toho pramení nepříjemné chyby <...>"
Ono je to tak, ze pre kvalifikovaneho cloveka to problem nie je a ti nekvalifikovani po tom volaju. Skutocne nepoznam cloveka - profesionala v pravom zmysle, ktory prave toto povazuje za spasenie. Jazyk C a jemu podobne maju tu vyhodu, ze nepredstieraju programatorovi nejaky fiktivny, akademicky lakavy stroj, ale predstavuju rozumnu mieru abstrakcie nad realnym hardwarom. Vdaka tomu mozno pisat podstatne optimalnejsie programy. Nechcem startovat flame a rad by som sa drzal vecnej roviny, ale napr. Java uz je tu dost dlhu dobu na to, aby sa ukazala nejaka pouzitelna aplikacia - tym myslim projekt rozsahu napr. Firefoxa alebo Photoshopu.
Myslienka, ze alokacia pamete je malichernost, je podla mna taktiez mylna (samozrejme, zalezi na druhu problemu a v nejakej "klikacke" na tom naozaj nezalezi). U profesionalnych aplikacii je totiz beznou vecou nielen pozorne nacasovanie alokacii a dealokacii (kedze sa jedna o casovo narocne operacie), ale aj vlastny memory management, tzn. alokator. Garbage collection a podobne techniky su dvojsecna zbran v tom zmysle, ze tuto flexibilitu potieraju.
Dalsia poznamka by snad smerovala k tomu, ze nie je nutne kvoli garbage collectoru zavadzat novy jazyk. Smart pointre, garbage collector a podobne "vychytavky" sa predsa daju implementovat aj v prostredi bezne pouzivanych jazykov.
Aj ked k Linuxu mam vyhrady a nie som nejaky nadsenec, v dohladnej dobe je miziva sanca, ze C z tohto prostredia nieco vytlaci. To sa ostatne tyka kazdeho systemoveho kodu. Staci si pozriet, ako pozorne musia autori kernelu narabat so systemovymi prostriedkami. Nie je to vec archaicka, ale vec nutna.
Jazyky typu LISP su zaujimave z akademickeho pohladu, ale svojou paradigmou sa hodia len na riesenie urciteho okruhu problemov - rozhodne ich nemozno ani len zrovnavat s C/C++.
Dodam snad len to, ze pocitace sa principialne len velmi malo zmenili. IT oblast by po technickej stranke viac vytazila zo skutocneho pochopenia pocitaca, ako z budovania abstraktnych, aj ked lakavych iluzii. Dolezite je aj rozpoznat, ktory nastroj sa v ktorych podmienkach hodi a nefetisizovat za kazdu cenu nove technologie, podporene hlavne marketingom.
[162] Takze budes mit XYZ binarek pro XYZ druhu procesoru? Ale no tak ... Navic IA-64 neni nepovedena architektura.
To ze zpochybnujes benchmark tak nejak chapu, to co si clovek nenameri sam, tak k tomu citi neduveru. Nicmene, dotazal jsi je na jakousi formu 'hmatatelneho' dukazu, ktery si nehmatatelne zpochybnil.
Takhle se debaty, ze kterych si clovek chce odnyst nejakou hodnotnou zkusenost proste nevedou.
We're beating a dead horse here ;)
[166] hura do toho, bude o _programatora_ vic!
... a ja jsem si splnil svuj den svate valky proti nezdravym trendum v IT snad vrchovate - a pokud alespon nekoho trklo, ze ne vse nove, nalestene a "trendy" je pro pocitac skutecne to prave, melo to snad smysl...
[a az mne zase nejaky thread zvedne zluc, tak nashledanou]
[165] neviem co viete o Lispe, zrejme nic... nemozno ho zrovnavat s ceckom, lebo stoji na uplne opacnom konci nizko<->vysokourovnovych jazykov (pozrite si zdrojaky SBCL, same cecko a asm - ak nechapete preco jazyky ako Lisp existuju a preco sa ludia na ne snazia robit co najvychytanejsie kompilatory, aku maju vyhodu, Vas problem...). C++ je taky shit, ze ani to nemozno porovnavat s Lispom...
[168] az Vam zasa nejaky thread "zvedne zluc", tak sa skuste nadychnut, zamysliet, precitat si toho co najviac z oblasti vyvoja softveru, ktorym ste sa doteraz zjavne nevenovali, a potom Vam mozno dojde nezmyselnost Vasej svetej vojny, ktora prameni z neznalosti istych veci... (a z vynikajucej znalosti inych, to klobuk dolu)
[149]: zilogat0r: Ktere aplikace si mohou dovolit "svatokradez" tim, ze maji neoptimalni kod? Napr. skoro vsechny business aplikace, kde zalezi na spolehlivosti, rychlosti vyvoje, udrzovatelnosti a samozrejme v neposledni rade i cene vyvoje. Coz je drtiva pripad business logiky. Znacna cast serverovych aplikaci pada do teto kategorie, neodsunuje to optimalizaci kodu (algoritmu) jako takove, ale umoznuje to efektivni vyvoj (samozrejme tez dostupnost ruznych zdroju,knihoven a existujiciho sw - ukaz mi treba treba nasaditelnou spolehlivou alternativu k Javovskym aplikacnim serverum - zvlast zdarma). Podle tve logiky bysme spravne ani nemeli pouzivat SQL databaze, protoze kod, ktery provadeji, je naprosto bezchybne suboptimalni nez kdyby se cela databaze napsala rucne :)
A tomu, ze se procesory "kazi" kvuli HLL, je tez docela usmevne - naopak, tento trend bude jiste pokracovat a rychlost kodu z HLL se tim nepochybne bude dale zvysovat. Mimochodem, krasnou ukazkou jsou napr. ARMy - kde existuje Jazelle neboli nativni spousteni Javovskeho kodu procesorem :-) Samozrejme tohle neni reseni pro desktopove/serverove procesory, ale vetsi mira "optimalizace" pro HLL tu jiste bude narustat.. Seberychlejsi procesor je k nicemu, pokud k nemu nejsou kvalitni vyvojove nastroje/popr. jediny skutecne rychly kod je nutne napsat v asembleru - na to uz v historii nekolik platforem uspesne skoncilo na smetisti dejin :)
[165]: Zadne velke projekty v Jave? Ja ti nevim, ale jestli nepovazujes napr. treba informacni systemy ruznych bank za velke produkty, tak uz fakt nevim co :-) Nenech se zmast tim, ze vetsina SW napsana v jave (aspon dle me zkusenosti) je proprietni closed source... Na psani produktu jako je Firefox ci Photoshop jsou opravdu lepsi jazyky :)
[171] V tom ze LISP a C nemozno zrovnavat s tebou uplne suhlasim. Prave vdaka tomu LISP nemoze nahradit C (v tomto duchu totiz vyznel originalny clanok) a naopak. Ostatne, LISP je jeden z najstarsich jazykov a uz by sa tak pravdepodobne stalo :) LISPu jeho pouzitie tam, kde sa hodi, neberiem. Inak nie som ziadny extra zastanca C++, ale rozlisoval by som medzi eleganciou kompilatora a eleganciou kodu. Vychytany kompilator ma totiz aj Brainfuck ale pouzitie nulove :)
[172] Ano, je to prave jedna z mala oblasti sa da prizmurit ocko. Java vsak nie je prezentovana ako servletovy jazyk, ale ako vseliek na vsetko :) Tak je myslim opravnene davat si otazku, ci vazne dokaze zastat ulohu umernu hype, ktory ju sprevadza. Podla mna nie.
[173] Vy ste napisali predtym nieco ako:
"Jazyky typu LISP su zaujimave z akademickeho pohladu, ale svojou paradigmou sa hodia len na riesenie urciteho okruhu problemov"
Lisp nie je strikne funkcionalny... je funkcionalny, ak chcete, je proceduralny, ak chcete, je objektovy (to je vzdy) - mozete navrhovat program objektovo, ak chcete... To ze je Common Lisp len akademicka zalezitost je obrovsky omyl, ktory som sa tu snazil vyvratit... taktiez to dokazuju jeho mnohe komercne nasadenia (pogooglite, urcite toho vela najdete). - to "mnohe" berte s rezervou :)... skratka existuju :)
Kompilatory Common Lispu (SBCL ako je ako opensource zastupca, a dokonca ma aj niektore vlastnosti, ktore chybaju niektorym komercnym kompilatorom) urazili za poslednych par rokov obrovsky kus cesty... a podla mna tam je buducnost kompilovanych jazykov. Pre jadro, drivery a ine striktne HW veci je tu cecko a asm (rovnako ako aj pre tvorbu kompilatorov Common Lispu... ako aj Erlangu a pod... :).
Jedine co moc nechapem je pouzivanie jazykov ako c++, no a potom inych middle jazykov (nebudem menovat, pre istotu... lebo ma tu ukamenuju:)... nechapem preco ostavat niekde v strede... tak bud robim s HW, vtedy cecko a asm, alebo robim user aplikaciu, a vtedy Common Lisp (a to ze je kompilovany Common Lisp rychlejsi ako drtiva vacsina middle jazykov dnes uz tiez nie je ziadne tajomstvo, staci popozerat rozne benchmarky)
A este dodatok... toto je napr. ukazka zo zdrojakov najnovsieho SBCL (konkretne alloc.lisp):
<code>
#+sb-assembling ; We don't want a vop for this one.
(define-assembly-routine
(move-from-signed)
((:temp eax unsigned-reg eax-offset)
(:temp ebx unsigned-reg ebx-offset))
(inst mov ebx eax)
(inst shl ebx 1)
(inst jmp :o BIGNUM)
(inst shl ebx 1)
(inst jmp :o BIGNUM)
(inst shl ebx 1)
(inst jmp :o BIGNUM)
(inst ret)
BIGNUM
(with-fixed-allocation (ebx bignum-widetag (+ bignum-digits-offset 1))
(storew eax ebx bignum-digits-offset other-pointer-lowtag))
(inst ret))
</code>
Preco by som sa ja mal zaoberat niecim, na com pracuje "banda" programatorov, ktori rozumeju assembleru omnoho viac ako ja, a davaju mi jazyk ktory mi dovoli riesit ine, a pre moju ulohu podstatnejsie problemy (naozaj vyrazovo silny jazyk)? Naco programovat 100x programovane? Oni nad optimalizaciou kompilatora a vysledneho asm kodu pracuju niekolko rokov. Mysliet si, ze ja urobim velky a zlozity projekt v asm optimalnejsie, je uplna zhovadilost (a vobec by mi nepomohlo studovat teraz roky a roky assembler, aj ked z neho samozrejme nieco malo viem - hlavne 8051, 8086...). Ako tu bolo naznacene - zmeni sa procesor a moje pidi optimalizacie su nanic. Ak niekto nechape zmysel abstrakcia, tak s tym ja uz asi nic nenarobim...
> škoda že nás ve škole učí C++ asi si půjdu stěžovat
> profesorovi a asi zapomenu i na to PHP a nebo .NET
To zalezi na tom na jake jsi skole :) Zrejme na stredni. Potom bud v klidu, nekdo taky musi delat tiskove sestavy a webove formulare.
Pokud na vysoke a nebo mas nejake vyssi ambice, tak bys mel trosku zbystrit, protoze i pres pouzivani HLL jazyku bys mel trosku myslet lowlevel a vedet, co ve vysledku dela ten ktery kus kodu. A ted nemluvim o nejakem GUI klitaru, ale o reseni "uloh" ktere vyzaduji urcitou miru strojove optimalizace, psani driveru, kompilatoru, zrychlovani smycek...
To je novodoby rozdil mezi programatory a pojidaci kolacu.
[176] jsem na vysoký
[177]: jojo ironie :)
upřímě při programování se radši soustředím na úlohu kterou mám udělat a optimalizace aby binární kód byl co nejlepší/nejmenší(?) je pro mě až druhořadá...je to taky jeden z důvodů proč se ze zájmu věnuju .NETu protože ten mě od takový "malycherností" odstiňuje
osobně se optimalizaci věnuju až ve chvíli kdy se jedná o zpomalení v řádech sedukn třeba(i když to by to musela být hezká prasárna) a ne v mili/micro sekundách a navíc většinu věci co dělám stejně napojuju na DB takže ta je tam rozhodně větší brzdou
[179] Sorry, ale tohle jsou děsný kecy. To je to samý, jako kdybych řekl, že kašlu na to, jak se řeší diferenciální rovnice, jak se počítají determinanty a vůbec všechno možné, když mám Maple a Matlab, které mi "umožňují soustředit se na řešení problému". Kulový! Pokud neumíte to co jsem psal, tak víte o matematice prd. A totéž platí o programování. O takového vysokoškoláka bych teda taky měl "obrovský zájem" - když vlastně neví o nic víc, než kdejaká lama, ale plat by předpokládal jako vysokoškolsky vzdělaný člověk. Tak co se tam teda učíte? A co je to proboha za školu?
Přesně tímhle způsobem vznikají ty nemožné internetové aplikace, které vytíží deset uživatelů a HW za 50 tisíc je jim k tomu málo.
[179]
Predpokladam, ze jeste nejsi v posledni rocniku, tak se neboj ze by jsi se o assembleru nic nedovedel, mozna se dokonce potkame ;-)
Ostatnim navrhuji se o principu fungovani pocitace neco dozvedet.
http://people.redhat.com/drepper/cpumemory.pdf
Ano bude bolet, protoze u toho budete muset premyslet, ale to stoji za to a mozna Vas to dokonce zacne bavit.
Rozhodne bych to doporucoval tem, kteri se tu jako extroverti s velkym egem vyjadrovali o dnesni zbytecnosti strojovych jazyku.
Zamestnani v IT Vam totiz muze velmi rychle ustedrit policek, kdy Vas honosne reci "V tomhle ja nikdy programovat nebudu" muzou hodne dlouho mrzet.
Ja osobne uznavam jednoduchou zasadu:
Kdyz programuji v nejakem "vysoko-urovnovem" jazyce mam vzdy uctu k tem, kteri mi svou praci moji ulohu zjednodusili tj. Pro mne tento vysokourovnovy jazyk vymysleli a implementovali a to vetsinou prave v C/C++.
A tahle ucta dnesnim HLL programatorum hrozne chybi.
To, ze muzete tvorit aplikace pod .Net, Javou, apod...
aniz by jste museli cokoliv vedet o tom jak funguje pocitac neni Vase zasluha ani dukaz vasich schopnosti,
to je naopak zasluha a dukaz schopnosti tech tisicu LLL programatoru, kteri Vas od te zaplavy podruznosti oprostili.
A neco nakonec pro Harryho_x a jim podobne:
Zilogat0r, Baze a mnoho dalsich, to nejsou pouze nicky jsou to konkretni lide (mimochodem mozna jedni z nejlepsich co ve stredni evrope mame) predstavujici nazory a uvahy LLL programatoru.
A Vase s prominutim "podivne" nazory tyto lidi silne demotivuji od dalsi prace. A to je velky problem,
protoze to oni vam vytvareji ta "HLL piskoviste" ve kterych si hrajete (a ktere Vas velmi casto dobre zivi) a co kdyz budete potrebovat sva piskoviste casem nejak poopravit.......
Poke_aka_Pety.
[184]
Aj ja by som sa k Vam chcel pridat a podakovat ludom okolo LLL jazykov za ich pracu, v poslednej dobe hrozne nedocenovanu (minimalne masou ludi okolo IT). Na trhu su ziadane code-monkey pre Javu a .NET a podobne, programatorom sa nazyva kde-kdo, kto vie zlepit 3 kniznice dohromady, urobit jeden akozealgoritmus (aj to casto uplne zle).
Dakujem.
(toto nebola ironia)
Na druhu stranu, vela LLL programatorov co poznam, maju obcas trochu skreslene nazory na skutocne HLL jazyky... ale ono to asi prameni z frustracie z dnesneho smerovania IT Buznisu, manazerkovania okolo Javicky a kavicky...
Mna kedysi bavilo bavkat sa s jednotkami a nulami, ale nejako som z toho vyrastol... ale je to _programovanie_. Ja som vzdy mal radsej veci okolo AI, Expertnych systemov, pocitacovych hier a pod... ale ja aj toto povazujem za _programovanie_. Len niekedy sa mi zda ze niektori LLL programatori nie, a to sa im snazim vzdy vyvratit...
Ja bych jen wsem tem xichtum co jejich prwni pocitac bylo P IV poradil at se podiwaj treba na www.256b.com nebo na jinaci scene weby (mozna ze tam velmi rychle najdete nicky z tohole nestastnyho blogu), at widi co deli zrno od plew a kdo ma prawo nazywat se programatorem a kdo si muze rikat radoby programator (uz sem zazil ze mi na cwiku clowek rekl ze mi muze prinyst neco na zapocet naprogramowany w php, samozrejme mel smulu jak cyp).
Ja samozrejme nikomu neberu ani nezazliwam ty HLL sracky, prosim "prgejte" si w tom dle libosti ale zdrzte se drzkowani na LLL a uz wubec nejakejch debat co se optimalizace a optimalnosti kodu tyce.
A komu se to nelibi at mi Dzawu polibi...
ikdyz je ti po tom samozrejme salam kde ucim, ale budiz
www.fjfi.cvut.cz
tady
Chtel jsem jen vedet, kde uci takovi... zde mela byt urazka. Ale nakonec ji sem nedam, protoze jsi mi zminkou o demoscene pripomnel stare casy Amigy a prave si poustim ma oblibena stara amigacka dema... i kdyz v soucasne dobe uz jen na youtube :(. Ale i tak u toho prozivam stastne chvilky, ehm.
No tak ted wis kde takze se klidne muzes prijit preswedcit na wlastni woci ];)
a newim proc si poustis dema z youtube, to neznas UAE ???
btw. nezaradil jsem se ani mezi zrno[nato sem moc linej] ani mezi plewy[na to jsem jeste linejsi, me staci C {a wer mi ze diky tomu starymu a nontrendy Ccku mozna jednou lidi budou !zadarmo! dejchat cistej wzduch a ne platit bankam za wywoj zeblitejch aplikaci ktery nam wsem kradou penize} ] tak nakonec ani newim proc ten zbytecnej post...
ale to je jedno, P0ke to napsal asi nejlip a nema cenu se dal hadat...
možná ten můj názor vyzněl tak jak jsem nechtěl...pochopitelně jsem neměl namysli že bych se na optimalizaci úplně vykašlal a nebo to bylo pro mě něco podřadnýho to ne
já měl namysli něco jako když napíšu v C++
if(i == 0)
{
return true;
}
return false;
namísto return (i == 0) kde jak mi řekl profesor se to ve výsledku přeloží jinak a je to trochu delší(nevím jak to správně říct...ASM není moje parketa resp. mu vůbec nerozumím) optimalizaci kterou myslím je že třeba nebudu zbytečně provádět cykly navíc nebo dělat takový blbosti který člověk občas vidí na http://thedailywtf.com/ a nebo třeba do DB se snažím dělat tak aby byly co nejrychlejší(jelikož vím že je to pro mojí aplikaci ta největší brzda)
[181] upřímě...srovnáváte jablka a hrušky...matika je v podstatě algoritmizace tam je jasný že potřebuju znát jakým způsobem se počítá vámi zmíněný determinant a nebo diferenciální rovnice a algoritmizace je jedna z nejdůležitějších věcí ve všech prog. jazycích ať už HLL a nebo LLL...když udělám špatně algoritmus tak je mi ve výsledku jedno jestli se mi to přeloží tak nebo onak protože pomalý to bude stejně
[184] z vašeho názoru mi trochu připadá že u HLL nepotřebuju myslet a u LLL jo což myslím musíte uznat že je blbost i když uznávám že u LLL musím myslet rozhodně víc a na víc věcí pamatovat
osobně se nesnažím shazovat práci lidí v LLL jazycích spíš je obdivuju protože si dokážu představit že dělat v tom dá někdy spoustu práce ale nadruhou stranu se mi nelíbí že tihle lidi "shazují" ty co dělají v HLL jazycích protože jsou podle nich něco míň "protože jejich kód namísto 4 instrukcí musí provést zbytečně 8 instrukcí" a ke všemu když drtívá většina dnešního softwaru typu pár formulářových políček kam sekretářka naťuká pár čísel prostě nepotřebuje výkon a je jedno jestli sežere jen tak 20MB RAM a nebo 10
jak říkám optimalizace je krásná věc a je určitě potřeba ale zase zacházet do extrémů když je občas se potřeba soustředit i na jiné věci....všechno je dneska o kompromisech
[193]
nevím ber to jako příklad...už ani nevím z jakýho to bylo programu a ani to nebylo přesně takhle...profesor mi jen ve výsledku říkal že výslednej přeloženej kód je trochu jinej...delší(co je na tom pravdy nevím...jak jsem psal ASM nerozumím a překladač je pro mě jen nástroj)
[184]: Vis, respekt a uctu si clovek neziska tim, ze se vyvisuje nad ostatni, rve na forech silacka slova a prezentuje svuj nazor jako jediny spravny :-) Ziska tim presny opak.
Co se tyka nejake vdecnosti ci ucte k LLL lidem, tak to, cemu se kdo bude venovat je kazdeho svobodna volba. Takze jsem ji asi tak stejne "vdecny", jako delnikum, co postavili dum, v kterem bydlim, lidem, kteri navrhli auto, v kterem jezdim atd. Ale rozhodne neupiram zasluhy spouste lide lidi (kterych si vazim) v tomto oboru i v jinem, ale vzdy jde o konkretni lidi a jejich konkretnich zasluhy a nikdy ne o celek...
Jestli nekoho demotivuje od prace to, ze ho ostatni nechteji vynaset do nebes, tak je to skutecne jen a jen jeho problem. Stejne jako je kazdeho problem, pokud si neustale potrebuje dokazovat, ze on je ten hardcore programator a zbytek sveta je plebs.
Kazdopadne, jak uz jsem tu psal drive, driv se kricelo, ze pravi programatori programuji v assembleru misto fortranu, pak ze pravi programatori programuji v fortranu a ne v Pascalu, dnes, ze pravi programatori programuji v C a ne v C#/Java. A realita je pochopitelne nekde uplne jinde :-)
Stejne tak, pokud se nekomu nelibi, ze managed jazyky maji na trhu sve nezastupitelne misto a vyhody, stejne tak jako maji sve aplikaci LLL jazyky na jiny druh projektu, pak je to taktez skutecne pouze jeho problem :)
no jo, protoze #1 je komparace, test a 2 nastaveni a 2 returny. #2 je komparace, negace a return. #3 uz jen negace, a #4 nic.
tusis aspon, ze ta spravna varianta je NEKONECNEKRAT rychlejsi nez vse, co jsi tu napsal, protoze misto nejakych 8, 3, nebo 2 instrukci nedela ZADNOU? a o tom je umeni programovat :). ale k tomu prave potrebujes znat zaklady, a ne jen nejakou modni HLL ptakovinu :)
[199]
>co je to za ridice, co se nevyzna v motoru?
pokud vím tak k řízení auta je potřeba jen řidičák
a většina žen co znám tomu taky nerozumí a s větším nebo menším úspěchem jim to řízení de :)
mimochodem jen taková otázka...za co povžujete znalost počítače? kde je jakej čudlík a co dělá a nebo nějaký "uchylný" podrobnosti :)
[195]: Jo, to mi ulitlo, na internetu si na pravopise opravdu zalezet nedavam, staci mi to v praci :-) Ale koukam, ze na tom nejsi o moc lip a to jsi napsal podstatne kratsi text :)
Jinak s tim motorem je to krasny priklad. Kazdy ridic se v nem trochu vyzna, vi, co tam +- je, nejjednodussi cinnosti s nim zvladne a tim to tak hasne. O treba elektronice takovy typicky ridic nevi skoro nic a nijak ho to neomezuje v moznostech auto vyuzivat:)
[196] a dalsi LLL: zde je videt zcela jasne pricina toho, proc guru LLL programatorum nezbyva nez nadavat na tezkosti tohoto sveta. Dnes je daleko dulezitejsi, aby kod byl na prvni pohled prehledny, aby bylo hned videt co tim autor myslel. Guruove optimalizuji kazdou kravinu, ale ze se v tom pak nikdo jinej nevyzna, ze trva veky tam neco vylepsit, zmenit ci opravit uz jde mimo ne. Hlavne ze usetrili pet taktu. Pak uz muzou jen nadavat, ze nejsou oceneni za sve vyjimecne znalosti a schopnosti, protoze dnes je cennejsi, kdyz clovek tvori s ohledem na ostatni, kdyz dokaze vyuzit funkce jinych i s tim ustupkem, ze nejsou zcela optimalni a kdyz i po nem zustane kod, ktery je vyuzitelny dal.
A tak zatimco "lepic", kteremu nedela problem vyuzit existujici knihovny a utility (a napsat i==0) spacha v HLL aplikaci za 1/10 casu tak, ze ji muze kdokoli vzit a rozsirit bez vetsi namahy, tak LLL guru uz ma optimalizovan ten kod ukladani do jpg tak, ze je na PIV s jadrem "cutehawk" 5x rychlejsi, co na tom, ze to celou aplikaci urychli o 10ms, na jinych platformach to nebude pouzitelne a celkove bude hotov nekdy za rok.
Jakub: ja myslim, ze nejde o optimalizaciu za kazdu cenu. Len sa divim tomu pristupu, ze vediet ako to cele vlastne funguje, je malichernost. Blondina na soferovanie znalost auta nepotrebuje, ale konstrukter uz ano. Programator predsa nie je sofer, ale konstrukter. Programovat bez znalosti je ako stanovovat diagnozu bez znalosti anatomie :) Na nejaku chripku to staci, ale dalej sa nepohnes. Clovek s prirodzenym zaujmom o techniku skuma, ako to cele funguje. Nezastavi sa na nejakej hranici a nemavne rukou s tym, ze "toto uz je nejaka blbost". Ale inak uznavam, ze v IT sa da dnes v pohode uzivit aj bez znalosti toho, co je alokacia. Len tomu nemozno davat elitarsku nalepku.
Michaelson: No, zrovna hry a AI v nich su vecnym nametom trikov a optimalizacii. Keby si sa chcel tomu venovat seriozne (tzn. aby to aj realne chodilo), hlbsim znalostiam sa nevyhnes. Napriklad na konzolach je alfou omegou znizit runtimove naroky na minimum. Mnohe krasne algoritmy z kniziek sa ukazuju ako nepouzitelne a podobne. Nakoniec sa vzdy ukaze, ze ohnut program na mieru masine je vzdy lepsie, ako snazit sa o opak. Ale aby som ta potesil, studio Naughty Dog donedavna uspesne pouzivalo vlastny klon LISPu :)
[205] Ad Lisp
Toto je prene to co hovorim. Mam celkom hlboke znalosti z fungovania pocitaca. Clovek s ktorym pracujem naprogramoval vlasny OS, mikrokernel... teraz pracujeme na projekte, ktory dufam coskoro (tak do pol roka) uvidis aj ty (uz tykam lebo si ma nasral)... a pracujeme v Common Lispe.
Ano optimalizujeme, ale na algoritmickej urovny, nie na urovni prdkania sa s instrukciami, takym pristupom by sme nespravili ani hovno, a to ani za 100 rokov... to ze sietove veci su implementovane ako priame volania c funkcii jadra (send, recv - precitaj si nieco o sb-alien), to ze predalokovavame bafre, to ze sme optimalizaciou pathfindra stravili 3 mesiace, to asi tebe nevysvetlim.
Prosim vyhni sa komentarom na Lisp, AI a podobne. Zjavne vies o to moc malo, a potom ludia co to tu citaju mozu ziskat skresleny pohlad na vec, podobne ako ho mas ty.
Ja som niekolkokrat vyzdvihol pracu LLL programatorov, lebo si myslim ze stasti som nim nejaky cas bol (aj ked nie az hardcore LLL, ale s assemblerom som samozrejme robil). Ak ty nechapes HLL, tvoj problem, to by sme sa asi museli stretnut a vyrospravat si to z oci do oci ;)
[206] 1) mikrokernely jsou slepa vyvojova vetev - Xnu budiz mementem, jak to dopadam, navzdory dodatecnemu slinkovani v pseudomonolit.
2) ad baze - zrovna tenhle clovek ma k AI a skutecne potrebe optimality kodu _hodne_ blizko. troufam si tvrdit, ze z dnesnich "takyprogramatoru" je mezi 1% tech, co jim vykon HW durazne slape na paty, a co narozdil od HLL nedouku maji na to tento tlak ustat. doporucuji google.
[207]
Ja nespominal mikrokernel kvoli tomu, ze je to buducnost alebo cojaviemco... ale kvoli tomu ze aj ludia znaly asm, znaly hw pocitaca, programuju v jazyku ako Common Lisp.
ad baze:
Ak si on mysli ze AI sa neda venovat seriozne ked sa programuje v Common Lispe, tak bud nevie nic o AI alebo o Common Lispe (asi to teda bude to druhe).
[208]
Vela ludi co programuje v middle jazykoch skutocne moc toho nevie, to vidim okolo seba. A potom sa ohanaju aki ze su to programatori a ako nic nepotrebuju vediet s HW pocitaca.
Ludia programujuci v HLL ako Lisp, OCaml, Erlang a podobne vsak taki su malokedy. Ak nehadzte ich do jedneho vreca z tym predchadzajucim pripadom. A preco programuju v HLL jazykoch? To uz sa mi 100x vysvetlovat nechce...
Michaelson: No mrzi ma ak som sa ta vazne dotkol. Mozno som ta nespravne hodil do jedneho vreca tak ako ty mna, pretoze o pisani velkych projektov na urovni instrukcii som nic nespominal. V podstate sa moj nazor da zhrnut tak, ze clovek ktory nema predstavu o tom, co sa deje "za oponou", ma len malu sancu pisat kvalitny software. S tym by si snad aj suhlasil. Aj ked ma to taha viac k low-levelu, grafike a systemovym veciam, sam programujem v C/C++ ako kazdy druhy, co su HLL. Viem aj to, ze optimalizovat treba nielen konkretnu implementaciu, ale aj algoritmy a datove struktury. S rukou na srdci priznavam, ze s LISPom som sa stretol len na skole a tam sa kladol doraz hlavne na funkcionalnu stranku. Potom mi uz osud do cesty LISP nezavial, tak ho podvedome chapem ako taku zatvorkovu exotiku :) Takze este raz sorry. Ak ti uprimne ide o to, aby pathfinding bezal dobre, tak je vsetko v poriadku.
[212]
Dosmrti vsetko dobre medzi nami... ;) Aj ja sa ospravedlnujem za to programovanie velkych projektov v asm (to som hovoril na teba?? je to mozne, prepac).
Mna to zasa vzdy tiahlo k AI v hrach, metaprogramovaniu (to posledne roky) a podobne... :)
Ked niekto nevie co je "za oponou", jeho problem... najhorsie je ze taki ludia potom v diskusiach podnecuju emocie, clovek aby vyjadril svoju myslienku tak pouziva extremne pripady... a potom sa stava co sa stava :)
Snad jednine co by som si dovolil oponovat je to, ze c a c++ nie su HLL. Aj ked asi by sme si spolu museli zadefinovat co to teda znamena HLL. Verim ze potom by sme sa urcite aj na tomto zhodli.
btw: smiem vediet kde si studoval?
[212]
Dakujem, o toto mi v CELEJ tejto diskusii islo, aspon jeden clovek ktory sa na to pozie, bez toho ze to je nejaka zatvorkova somarina... ak mas naozaj zaujem, mozem ti poslat milion liniek, zaujimavosti, komercnych nasadeni, mozem ti ukazat ako sa v kode robi prepojenie s assemblerom a ceckom (nieco som tu tusim aj postol)...
Tak mi to nedalo a udelal jsem maly test. Napsal jsem Erasthotenovo sito v C, C# a Jave. To je vec ktera procesoru "sedne", takze vyssi jazyky jsou pomerne znevyhodneny. Vysledky:
Prvocisla do 100000:
C -O9 2.24s
C# - 2.36s (+5.5%)
Java - 2.75s (+23%)
Prvocisla do 1000000:
C -O9 153s
C# - 165s (+8%)
Java - 189s (+24%)
Tolik tedy k onem "o rad radu" pomalejsim nechutne rozezranym a silene neefektivnim vyssim jazykum ;-)
Michal Kára: No, konecne sa niekto podujal na podnetny prispevok :) Moj komentar k nemu je:
1) C, C#, Java povazujem za vyssie jazyky, takze pre porovnanie by assembleristi mali zaujat bojove pozicie a nastartovat hex editor :)
2) Slo o JIT-ovanu Javu? Budem zly: je v tom zapocitany aj boot JVM? :)
3) Treba si uvedomit, o com tento zaujimavy benchmark vypoveda. Eratosthenovo sito je program na 2 slucky. Nejedna sa o ziadne objektove machinacie, alokacie, volanie funkcii a podobne, takze runtimovy balast sme nechali stranou (ale zaujimalo by nas mozno prave to). Vysledok je, ze dvojcyklovy program je o takmer o stvrtinu pomalsi. Podla mna je to silna Kava :)
1) C je v kontextu teto diskuse povazovan za nizsi jazyk ;-) V assembleru se mi to datlit nechtelo. BTW, zkousel jsem v C misto indexovani pole pouzit ukazatel, nicmene s nulovym rozdilem :-)
2) Bylo to JRE 1.5. Vzhledem k vysledku to nejspise JIT bude. Boot JVM je cca 100ms (pravda, byl uz v diskove cache; na druhou stranu jelikoz jde o jednorazovou zalezitost, myslim, ze neni az tak podstatny).
3) Ted nevim, jestli to povazujete za dobry nebo spatny vykon ;-) Jak jsem psal, ten program je "sity pro procesor". Ja osobne to povazuji za velmi slusny vykon - kdyz si uvedomite, rozdil mezi tim jak primo programujete procesor v C a pres co musi ten vas program "protect" kdyz je psany v Jave. A to nemluvim o kontrole mezi poli, ktera se tady hodne uplatnuje. (A je mozne, ze by se to nejakyma optionama JVM dalo jeste zrychlit.)
Navic nikdo netvrdil, ze programy v ASM nebo C nejsou rychlejsi, jen jsem ukazal, ze to neni o rad. Tedy kdyz nebudu mit program ktery opravdu silne vyuziva procesor (vypocty), tak IMHO neni duvod vyssi jazyky z vykonoveho duvdodu zavrhovat. A co tak mohu soudit z me praxe, vetsinou je limitem prenosova rychlost z disku (eventuelne obecne databaze) nez procesorovy vykon.
a co tak toto?:
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=gcc&lang2=java
S tou rychlostou to u javy nie je az take zle podla mna...
[217] O tom ze JIT kompilace muze dosahnout stejnych nebo lepsich vysledku nez staticka kompilace se asi nikdo nepre (to se vedelo i pred Javou o Lispu, Smalltalku apod.). Ovsem je otazka, za jakou cenu pametovych naroku se toho dosahne.
Neznam JVM, ale napr. Psyco pro Python je specializujici JIT kompiler, tj. sleduje argumenty funkci a pokud je nejaky argument casty, _specializuje_ tu funkci pro ten argument (zkompiluje jeji specialni variantu, ktera povazuje prislusny argument za konstantni). Specialnim pripadem teto metody jsou vyhledavaci tabulky. Kazda takova specialni funkce muze byt rychlejsi nez C implementace, ale zabira dodatecne misto v pameti.
Je jasne, ze napr. pro webovy server, kde vetsina navstevniku ma dokola stejne dotazy, muze takova metoda prinest znacne zrychleni. Ale za cenu znacneho zvyseni naroku na pamet. Je pak otazka, jestli by se jeste lepsiho vysledku nedalo dosahnout s JIT kompilaci LLL.
Proste, srovnavat JIT a staticky kompilator je podle me nesmysl, je to asi jako srovnavat vypocet funkce pres vyhledavaci tabulku s jejim primym vypoctem.
nicmene vynechavani parametru funkci neni optimalizace - to je jen odstraneni dusledku spatne navrzene struktury kodu. tj opet - jde o odstraneni toho nejhorsiho a nejzbytecnejsiho, nikoli o genialni zasah. assemblerista by zcela jiste nemel potrebu zbytecne predavat pokazde parametr, ktery v podstate nepouziva :>.
zrejme se tu dostatecne jasne na zacatku nespecifikovalo, co je to vlastne ten optimalni kod - ne, skutecne, to NENI to, co leze z kompilatoru, at uz je to -O3 nebo -Ojanevimkolik. :>
[227] vyyborne, linux - a cim meris cas? getrusage() okolo vlastniho sita, tj. od okamziku zacatku vypoctu do okamziku zjisteni, ze uz dalsi prvocislo v situ nezbylo (tj. vytvioreni rady vybranych indexu)?
sice tu PIV nemam po ruce, ale muzu to napsat od boku, ono se to vsakne, ze :>
Kdyz uz tady benchmarkujete... dovolim si postnout moje vysledky benchmarku stazeneho z
http://www.tommti-systems.de/go.html?http://www.tommti-systems.de/main-Dateien/reviews/languages/benchmarks.html
Doufam, ze prominete delsi prispevky... verze javy je popsana primo ve vypisu testu, C++ bylo kompilovano ve VS C++ 2003. Komp: P4, 1GB RAM, Win Xp. Srovnani s ceckem nemam, natoz s assemblerem. Ale srovnani Java vs C++ je zajimavy i tak.
Start Java benchmark
java.version: 1.6.0
java.vm.specification.version: 1.0
java.vm.version: 1.6.0-b105
Int arithmetic elapsed time: 7750 ms with max of 1000000000
i: 1000000000
intResult: 1
Double arithmetic elapsed time: 5047 ms with min of 1.0E10, max of 1.1E10
i: 1.1E10
doubleResult: 1.00116327174955E10
Long arithmetic elapsed time: 15985 ms with min of 10000000000, max of 11000000000
i: 11000000000
longResult: 776627965
Trig elapsed time: 39548 ms with max of 1.0E7
i: 1.0E7
sine: 0.9906646477361263
cosine: -0.13632151600483616
tangent: -7.267118770165242
logarithm: 6.999999956570549
squareRoot: 3162.2775020544923
IO elapsed time: 7140 ms with max of 1000000
i: 1000001
myLine: abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefgh
Array elapsed time: 438 ms - 100000000
Exception elapsed time: 3391 ms - HI=500000 / LO=500000
HashMap elapsed time: 250 ms - 18699
HashMaps elapsed time: 1312 ms - 1 9999 1000 9999000
HeapSort elapsed time: 922 ms - 0,9999928555
List elapsed time: 1281 ms - 10000
Matrix Multiply elapsed time: 16063 ms - 270165 1061760 1453695 1856025
Nested Loop elapsed time: 13219 ms - -1804337152
String Concat. (fixed) elapsed time: 94 ms - 5000000
Total Java benchmark time: 112440 ms
End Java benchmark
Start C++ benchmark
Int arithmetic elapsed time: 9141 ms with intMax of 1000000000
i: 1000000001
intResult: 1
Double arithmetic elapsed time: 12875 ms with doubleMin 10000000000.000000000000
000, doubleMax 11000000000.000000000000000
i: 11000000000.000000
doubleResult: 10011632717.495501000000000
Long arithmetic elapsed time: 18516 ms with longMax 11000000000
i: 11000000000
longResult: 776627965
Trig elapsed time: 3860 ms with max of 10000000
i: 10000000.000000
sine: 0.990664647736125
cosine: -0.136321516004849
tangent: -7.267118770164549
logarithm: 6.999999956570550
squareRoot: 3162.277502054492300
I/O elapsed time: 8750 ms with max of 1000000
i: 1000001
readLine: abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567
890abcdefgh
array elapsed time: 625 ms - 1000 100000000
HashMap elapsed time: 2234 ms - 100000
HashMaps elapsed time: 22235 ms - 1" "9999" "1000" "9999000
Heapsort elapsed time: 890 ms - 0.9999928555
Vector elapsed time: 17094 ms - 10000
Matrix Multiply elapsed time: 18422 ms - 270165 1061760 1453695 1856025
Nested Loop elapsed time: 17063 ms -1804337152
String Concat. (fixed) elapsed time: 109 ms
Total elapsed time: 131814 ms
Stop C++ benchmark
http://www.freewebs.com/godaves/javabench_revisited/ ...tento benchmark vyzera vierohodne
Michal Kára:
1) Indexovanie pola je na sucasnych procesoroch otazka jednej offsetovej load instrukcie, takze ocakaval by som, ze indexovana verzia pobezi dokonca o malicko rychlejsie. C je nizsi len v tom zmysle, ze ma pointre a alokaciu, co v nasom priklade nehra rolu. Treba povedat aj to, ze GCC je slaby compiler, ale na orientaciu to staci.
2) Ano jednorazovy start sa da zanedbat, to som si len zlomyselne rypol :)
3) No, pri tak jednoduchom programe, navyse skompilovanom, mi ta stvrtina vykonu pride dost. Ked sa napr. profiluje a optimalizuje projekt, zrychlenie nejakej casti kodu o 20 a viac percent je uz velmi solidny uspech - viac mozno cakat len malokedy.
Imho zrovnavat to, obzvlast na aritmetike, nie je reprezentativne. U nejakej matematickej operacie viac zavazi ako je ten samotny kus kodu napisany. Procesor nativne pocita s integermi a floatmi v registroch, takze nejaky ten cyklus okolo ma len malu sancu skompilovat sa nejako extra inak. U C/C++ vstupuju do hry standardizovane zaokruhlovacie konvencie, takze mnohe funkcie stravia viac casu tym, ako samotnym vypoctom. Ten skutocny rozdiel lezi inde.
Ak je bottleneckom disk, siet a podobne, tak na takomto zabomysom zrovnavani samozrejme nezalezi.
[234]: Proc ti to prijde hodne? Mezi C a Javou je hodne velky rozdil co se tyka moznosti udelat chybu, rychlosti vyvoje ruznych druhu aplikaci etc. 20% v aritmetickych operacich mi prijde jako vic nez prijatelny kompromis za vyhody HLL, kontrolu vseho mozneho i nemozneho runtime a kompletni multiplatformnost.
Samozrejme, aplikaci, ktera je silne CPU bound a zalezi u ni primarne na rychlosti a ne na spolehlivosti ci rychlosti vyvoje, by v Jave tezko kdo psal.
Vazne odporucam precitat si horeuvedeny "poctivy" benchmark s pomerne korektnou metodologiou. Nebavime sa len o 20% a len o aritmetike. Aj ked samozrejme existuju scenare, kedy rychlost vyvoja zavazi viac a bottleneckom nie je program samotny. Keby bola Java prezentovana ako jednoduchy jazyk + libky, ktory sa na taketo veci hodi, je to v pohode. Mna len hloda ta nafuknuta bublina okolo toho a ze sa to povazuje za dalsi vyvojovy krok dopredu. Ad multiplatformovost - kompilator C/C++ je predsa na kazdej dostupnej platforme :)
[238]: Vsak taky z technickeho tech vyhod zas tolik neni :-) Pokud se na to divas z _ciste_ technickeho hlediska, tak jiste neni nic lepsiho na programovani nez assembler s perfektni znalosti daneho prostredi. Maximalne se muzeme bavit o tom, jak moc to ci ono prostredi/jazyk prispiva k tvorbe chyb. Ale neni jakkoliv oddiskutovatelne, ze nejoptimalnejsiho vysledku co se tyka rychlosti a efektivity vyuziti architektury, dostanes tehdy, pokud se k architekture priblizis co jen to jde...
Ale to jsou jenom technicka meritka. Krasne to vystihuje tento citat, ktery zde uz nekdo daval:
Anyone who argues in favor of one language over another in a purely technical manner (i.e., who ignores the dominant business issues) exposes themself as a techie weenie, and deserves not to be heard. Business issues dominate technical issues, and anyone who doesn't realize that is destined to make decisions that have terrible business consequences — they are dangerous to their employer.
A to je presne duvod, proc existuji jazyky jako je Java - protoze je potreba vyvijet rychle, efektivne a s minimalizaci moznosti vzniku a dopadu chyb. Coz nejsou technicka, ale ciste ekonomicka meritka.
Jinak co se tyka te multiplatformnosti, tak mas samozrejme pravdu, ze C/C++ prekladac je na kazde platforme, ale pod multiplatformnosti si predstavuji trochu vic :) Napr. treba binarni kompatibilitu mezi platformami, zdrojovou kompatibilitu mezi verzemi (treba u vetsiny C++ prekladacu je toto docela des) a trochu sirsi standardni knihovnu (GUI, networking, thready, pristup k databazim, ...). Samozrejme lze spoustu z tohoto supplovat v C externimi knihovnami, ale to uz je jen a jen dalsi prace navic, v Jave to je automaticky (i kdyz samozrejme rozdily mezi platformami taky jsou a ne vzdy vse funguje tak, jak ma - ale preci jen je videt, ze v tom Java uz udelala docela solidni krok kupredu - mluvim ted o Sun JVM)
Mam taku rypavu otazku ... kolko z komplexnych programov alebo vyvojovych prostredi, ktore pouzivate boli napisane v asembleri pripadne v C ? V pripade ze boli vyvorene kombinaciou viacerych jazykov, ake percento v nich bolo vytvorene v tychto LLL ? Myslim ze sa v LLL sice vela optimalizuje, ale tvori sa v nom malo programov pre koncovych uzivatelov ...
[240] na um mi prichadza drviva vacsina opensourceovych aplikacii (gimp,abiword,mplayer,pidgin,cinerella,firefox/mozilla,xwindowing system,linux (kernel), ...), ktora je napisana prevazne v C, pripadne optimalizovana v asembleri. ak unixove systemy/prostredie niesu dostatocne komplexne, tak uz neviem.
[212]: Jestli si chceš o Lispu něco nastudovat, dám Ti dobrou radu: Jdi rovnou po téhle knížce: http://www.apress.com/resource/freeebook/9781590592397 - protože nic lepšího není... ;-) Spousta náhodně nalezeného materiálu na síti není až tak dobé kvality. ;-)