Re: Proè to není chyba?

Petr Labaj labaj na volny.cz
Neděle Duben 28 13:57:53 CEST 2024


Moc pěkné čtení.
Pochvala a díky za takové příspěvky.

PL

******************

Dne 28.4.2024 v 10:15 Jan Waclawek napsal(a):
> Historicko-kulturno-normativna odpoved na otazku v subj.:
>
> Koncom 60tych rokov mal navrh vyssich programovacich jazykov za sebou uz
> asi 15 rokov intenzivneho rozvoja (od FORTRANu
> (https://www.mikrozone.sk/pluginy/content/content.php?content.66 ) po
> Algol68 a v "americkej vetve" PL/1 z programu Multics, s "praktickym
> nasledkom" vo forme Pascalu) a mnozstvo teoretickej prace akademikov aj
> praktikov, namierenej najma na sposoby, ako jazyk moze napomahat pisaniu
> programov s co najmensim mnozstvom chyb.
>
> Ale C necerpalo z tejto prace, teda len nepriamo.
>
> Thompson a Ritchie (a aj ini) boli zamestnancami AT&T/Bell Labs v programe
> Multics, a AT&T sa z toho programu stiahlo (kvoli prietahom, sposobenym
> okrem ineho prave akademickostou a snahou o dokonalost). Oni takto prisli
> o pristup k relativne modernemu a velkemu pocitacu, OS aj programovaciemu
> jazyku; a zostal im nejaky stary a obmedzeny PDP-7 (neskor sa mi podarilo
> vymamit od zamestnavatela PDP-11) s assemblerom. A tak Thompson zacal
> bastlit nejaky primitivny operacny system zalozeny na skusenostiach s
> Multicsom, a Ritchie mu k tomu pisal nejaky o chlpok vyssi programovaci
> jazyk nez assembler na zaklade cohosi, co mali od kamarata, ktory sa s
> myslienkou primitivneho vyssieho jazyka uz predtym zahraval.
>
> Aby som to skratil, takto vznikli UNIX a C.
>
> A aby som to povedal jasne, oboje je hack.
>
> Ono to je vlastne sucast uspechu, kedze vela programatorov (ak nie vsetci)
> maju k hackom uctu, maju ich radi a obdivuju inych programatorov, co pisu
> hacky. Len to ma nasledky, ktore nesieme dodnes.
>
> Takze jeden z tych hackov, ktore robia dojem, je fakt, ze priradenie v C
> nie je *prikaz*, ale *vyraz* - na rozdiel od programovacich jazykov
> "akademickej linie" (napr. Pascal, ISO7815, 6.8.2.2
> Assignment-statements). T.j. v C priradenie ma vysledok (je nim
> priradovana hodnota po prislusnych konverziach) a da sa nadalej priradit
> (t.j. da sa napisat a = b = sin(x);) , pouzit ako parameter
> (printf("%d\n", a = sin(x));) apod.
>
> Cool, vsak? Tak sa poznaju hacky, ze su cool.
>
> Ale aby sa priradenie - ktore uz vieme, ze je *vyraz* - dalo pouzit v
> programe, co je sekvencia *prikazov*, tak nastupuje dalsi cool hack,
> ktorym je "expression statement" t.j. "prikaz typu vyraz", C99 6.8.3,
> ktory hovori, ze ak za *vyraz* napiseme bodkociarku, stane sa *prikazom*;
> s tou semantikou, ze vysledok vyrazu je zahodeny.
>
> Nasledok napriklad je, ze volanie funkcie foo(); nemusi byt priradene
> nikam, aj ked foo() ma ne-void navratovu hodnotu (v povodnom C mala kazda
> funkcia uniformne navratovu hodnotu int; navratova hodnota void je
> dodatocna snaha trocha ten hack umravnit).
>
> Ale nasledok, ktory nas tu zaujima, je aj to, ze *akykolvek vyraz* za
> ktorym nasleduje bodkociarka, t.j. aj +10; (co je unarny operator
> "prefixove +" aplikovany na celociselnu konstantu 10 - mimochodom, C nema
> zaporne celociselne konstanty a -10 je vyraz, kde unarny operator
> "prefixove -" je aplikovany na celociselnu konstantu 10), alebo trebars
> samotne foo; (kde foo(); by bolo volanie funkcie ale foo samotne je vyraz
> ktory sa vyhodnoti ako smernik na tu funkciu; toto je pomerne casta chyba)
> su plne legalne prikazy, t.j. prekladac kvoli tomuto nesmie skoncit chybou
> (moze upozornit warningom - a ano, prekladace vedia mat rezim kde kazdy
> warning je chybou, ale to, vzate zbytocne prisne, nie je podla normy).
>
> Inaksie povedane, hacky so cool, ale maju nasledky.
>
> wek
>
> PS. ... no a C++ je hack na druhu.
>
>
> ----- Original Message ---------------
>
> Subject: Proč to není chyba?
>     From: Martin Záruba <swz na volny.cz>
>     Date: Sat, 27 Apr 2024 14:39:26 +0200
>       To: Martin Zaruba <hw-list na list.hw.cz>
>
> Chtěl jsem napsat (zjednofu±eno, pro přehled, obě řádky byly velmi dlouhé)
>
> a = 5
>     + 10;
>
> Výsledek by pochopitelně byl 15, jenµe já omylem za 5 udělal středník,
> takµe vzniklo
>
> a = 5;
>     + 10;
>
> A kompilátor nehlásí µádnou chybu a výsledek je 5, druhý řádek se
> ztratil. Proč ale neřve, ľe to je syntaktická chyba, vľdy» nemá s tou 10
> co udělat?


Další informace o konferenci Hw-list