Portál AbcLinuxu, 6. listopadu 2025 02:16
Mám ten sajt rád, ale beru výsledky tzv. "with a boulder of salt".
Proč ne? Tak třeba: 1) Je to šest let staré! Minimálně bych to nedával do zpráviček, tady na ten server už několikrát řeč přišla. Ať si o svém nadšení autor napíše v blogu.Jó, tak to soráč. Viděl jsem to v nějakým blogu, takže to člověk automaticky interpretoval jako novinku :D
Extrémně starý Win32 shootout je tady.
haha, vravim si jak je mozne ze vyhralo c alebo c++? Pozriem a uz je mi to jasne. V teste sa nezucastnil kompilator Borland Delphi. Myslim to smrtelne vazne.
Pokud budete měřit rychlost kompilace, pak je to docela dobře možné. Ale co do rychlosti výsledného kódu… to opravdu ne.
). A pak se vsichni zacnou hadat, protoze i kdyz je mozne urcit absolutni cisla, vysledky budou zcela nesrovnatelne, protoze kazde vozidlo je navrzene pro jiny teren a jiny ucel.
Kdyz se bude zavodit na dokonale, pevne draze, nejspis vyhraje formule, nasledovana B-747, pokud se povoli zavod i ve vzduchu, B-747 je jasne nejrychlejsi. A kdyz se povoli koleje, vyhraji raketove sane (ktere budou mit i nejvetsi zrychlenni). Ale pri zavodech v tezkem terenu nejspis vyhraje tank, nasledovany traktorem, offroadem a konem.
A kdyz se usporadaji zavody v supermarketu, tak nejspis vyhraje kun, sekacka nebo invaldini vozik, protoze ostatni vozdila bud neprojdou vchodem, nebo se neotoci na miste (i kdyz, kdyz dovolime destrukci zavodni drahy, tak se so toho mohou zamichat i tank a bagr
). A pokud se vezme v potaz ekonomika provozu, tak pravdepodobne vyhraje pozjidna nakupni taska ci podobny maly vuz, protoze bude mit suverene nejmensi spotrevu v l/km, pripadne kun (pokud mate vlasni staj) ci dokonce invalidni vozik (jezdi na nabijeci baterky).
Takze - porovnavat obecne programovaci jazyky je nesmysl, pokud je to ciste obecne porovnani. Vzdyt i v ramci jedine aplikace muze byt pouzito neklolik jazyku (napr. nejnizsi rutiny v ASM, knihovny a runtime v C/C++ a samotna aplikace v Lispu).
A navic, v kazdem jazyce se puziva jiny pristup - to, co se v klasickych imperativnich hjazycich (typu Fortran/PascalC/C++/Java) napise smyckou, udelaji deklarativni jazyky (jako Prolog a Lisp) rekurzi.
I samotne uvazovani programtora je urceno tim, jake jazyky pouziva (viz Sapir-Whorfova hypoteza a programovaci jazyky), proto jsou napr. priklady v C/C++ psane Javisty obcas naprosto silene (z pohledu Cckare), s perlami typu alokace jedineho intu pres new/malloc() uvnitr cyklu (to jsem videl na vlasni oci, ten priklad jde jeste nekde vygooglit).
To, co je v jednom jazyce prirozenost, je v druhem podivnost, v tretim zvrhlost a ve ctvrtem vec, kterou vubec nesmite. Jako je treba GOTO - v assembleru se bez skoku neobejdete, v Basicu bezna soucast jazyka, Pacalu a Ccku vec, ktera se nema delat a v Lispu skok neudelate vubec.
Kdyz se navic pridaji vlasnoti typu alokace pameti (vlastnorucni vs. GC), podpora vyjimek, run-time kontrola vseho mozneho, nativni podpora vlaken a paralelizace vypoctu, nutne predpoklady pro beh (nic/OS/knihovny/runtime/interpreter) a podobne veci, tak name tolik rozdilnych kategorii, ze neexistuje jazyk, ktery by byl vhodny uplne pro vsechny.
I kdyz nektere jazyky jsou dost univerzalni, jejich univerzalnost je jako univerzalnost kuchynskeho robota, ktereho ctvrt hodiny sestavujeme, pul minuty v nem krouhame mrkev a pak pul hodiny rozebirame, cistime a uklizime, zatimco se starym dobrym struhadlem by cela prace byla hotova za pet minut vcetne cisteni.
Proto nema smysl delat bencmarky mimo tech typu, kde je presne specifikovana oblast (napr. nejrylejsi jazyk na psani toho a toho algoritmu) a ani potom nejde presne urcit viteze, protoze ten nejrychlejsi nemusi byt ten nejjednodussi a nejlepe napsatelny a odladitelny.
...a v Lispu skok neudelate vubec.A vo co že jo?
(defun funkce1 ()
(tagbody
(labels ((funkce2 ()
;; Ackoliv je tag OUT lexikalne vymezen formou TAGBODY,
;; muze byt skok na nej proveden z vnorene funkce o nekolik
;; stack frames nize. V takovem pripade se ovsem korektne
;; odroluje zasobnik a provede se cleanout cehokoli, co je
;; zapotrebi. Cize zadne pitome JMP, ale dobre osetreny
;; bailout jako u vyjimky. Mame preci jednadvacate stoleti! :)
;; (Nekteri z nas uz takovych tricet let... :D)
(unwind-protect (funkce3)
(print "Zasobnik se odrolovava, cistime resources!")))
(funkce3 ()
;; Fuj, GOTO ahead! ;) Kdyz tam nedam tu podminku, smaze
;; mi kompilator kus kodu jako nedosazitelny, parchant jeden! :D
(if (/= (random 2) 0) (go out))))
(funkce2)
(print "Normalni navrat.")
(return-from funkce1))
out
(print "Navrat skokem na OUT")))
Vy už simulujete výjimky a odrolování zásobníku
Ale kdysi mě napadlo, kdo vlastně poprvé v životě zešílel strachy a neudržel moč při pohledu na goto a rozšířil tak dogma o škodlivosti goto - a on to Dijkstra. Takže zastřelte Dijkstru a goto přestane být škodlivé a začne se objevovat ve většině jazyků
Tady se prostě projeví high-level jazyk - obyčejné (GO OUT) může vést na různý zkompilovaný kód podle kontextu. (Tedy podle MIT školy.
Cčko je New Jersey school a tam se prostě vrzne JMP, a co JMP neumí, to nebude umět ani goto a basta fidli.
) Kdyby to bylo v rámci jedné funkce, bude to jen JMP i v tom Lispu.
(I když tech konstrukcí, které se musejí ošetřit, je několik - ovšem jen pokud okolo jsou.)
Jasan, já to chápu. Co takhle zavést inline asm do LISPu a to goto tam natvrdo napsat
To by teprve byl bordel
S výjimkou CLISPu, který nemá generátor kódu v runtimu, jelikož nemá nativní kompilátor, o žádném nevím. A minimálně v OpenMCL je to docela dlouho oficiálně podporovaná fíčura kvůli vektorovým operacím. Nicméně zatím si vystačím s GO.
BTW, Vy taky píšete v podezřelou hodinu, ale Vás už mám na seznamu od nepaměti.
defppclapfunction/defx86lapfunction v OpenMCL) pro SBCL nevím. Ale poměrně konformní cestou, jak nějakou operaci dostat do SBCL skrzevá assembler, by mělo být napsání vlastního VOPu. Navíc je to mírně granulárnější než napsání funkce a snad by to mohlo hrát líp se zbytkem kompilátoru. Zatím jsem to nepotřeboval, ale docela by se mi na některé věci hodila instrukce PSADBW, hlavně na metrické stromy
. Předpokládám, že na to by mi měl stačit i jen ten VOP. Co takhle se zeptat rovnou vývojářů, pokud máte v tomhle větší potřebu než já?
C. Rhodes se o tom kdysi zmiňoval na comp.lang.lisp, se slovy "Jak to udělat, máte popsané tady", a uvedl dnes již neplatný link. :-/
A samozřejmě mluvím o CL, přičemž ABCL je AFAIK zatím docela nedotažené, proto ho neuvažuju.
Navíc jeho autor se teď věnuje XCL, nevím, jak moc se ABCL vůbec bude věnovat v budoucnu. (Možná jsem mohl doplnit i GCL a podobné věci, ale ty mi stejně poslední dobou přišly ta nějak mrtvé...)
Brr.. GOTO
Ješte lepší jsou samomodifikující se kusy kódu ... a tohle není hardcore příklad, ale dejme tomu taková ukázka běžného použití.
CONTROLS ld a,(CONSEL_B) out (254),a ld a,(CONSEL_CL) ld (CLS_COL),a call CLS ld hl, CONTR_TXT call TEXTOUT CONTROLS0 call PAUSENK ; počkej dokud uživatel nepustí klávesu call INKEY cp 49 jr z,CONTR_KB ; uživatel zvolil klávesnici cp 50 jr z,CONTR_AM ; uživatel zvolil AMOUSE cp 51 jr z,CONTR_KM ; uživatel zvolil KMOUSE cp 113 CONTR_QA jp z,CONTROLS ; tato adresa má být přepsána adresou pro ukončení programu jr CONTROLS0 CONTR_KB xor a jr CONTR_END CONTR_AM ld a,1 jr CONTR_END CONTR_KM ld a,2 CONTR_END ld (MOUSE_HID),a ; nastaví human interface device CONTR_EA jp CONTROLS ; tato adresa má být přepsána adresou pro pokračování běhu
A nepřijde mu to divné, proč taky, v Javě se to tak dělá, tak jaký křeče. Většinou je totiž C/C++ zdroják přesným opisem Javy, včetně toho, že třeba enum je v C++ dokonalá třída se vším všudy, včetně konstruktoru, destruktoru a virtuálních metod.
"JVM dokaze delat za behu dalsi optimalizace, ktere ani ten nejskveleji optimalizujici kompilator bez kristalove koule v compile time zvladnout nemuze. Bohuzel, na prikladech typu vynasob dve matice a udelej to rychle, se to neprojevi."Jak píše pan Ponkrác, AOT kompilátor zase může v compile time provádět další optimalizace, které ani nejskvělejší optimalizující JVM nemůže bez stroje času provést, protože na ně prostě nemá čas.
Přičemž recyklování optimalizací prováděných JVM (těch, které stojí za to), pokud se někdy bude provádět, nebude až taková sranda. Jako potomek Strongtalku HotSpot s největší pravděpodobností generuje kód, u kterého se těžko dá říct, co patří ke které funkci.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.