Re: Proè to není chyba?

Jan Waclawek konfera na efton.sk
Neděle Duben 28 10:15:47 CEST 2024


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?

-- 

Martin Záruba

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list