Proč je syntaxe programovacích jazyků tak složitá?

Radovan.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #135 kdy: 26. 12. 2018, 08:00:47 »
No nic, mír s vámi...
+1
Napr string.h obsahuje
#define NULL    0

A můžeš zaručit, že totéž bude ve všech možných kompilátorech na veškerých platformách, exitujících v minulosti i budoucnosti? Oni tvůrci jazyka C byli poněkud zkušenější, proto je norma v některých věcech až příliš volná...

Pokud funkce vrací NULL, předpokládám že dostanu něco jako 0x00000000, aspoň u části dnes používaných procesorů.
Ale pokud vrací '\0', může to být klidně 0x00FAB059, nebo něco ještě šílenějšího, v závislosti na šířce slova a endianitě!
O čísle 0 ani nemluvě.

Ten toaletní obrázek to vystihuje naprosto dokonale, a zároveň poslouží jako test nedostatku abstrakce u těch, kteří ho okamžitě nepochopili ::)


Neviditelný

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #136 kdy: 26. 12. 2018, 09:11:10 »
No nic, mír s vámi...
+1
Napr string.h obsahuje
#define NULL    0

A můžeš zaručit, že totéž bude ve všech možných kompilátorech na veškerých platformách, exitujících v minulosti i budoucnosti? Oni tvůrci jazyka C byli poněkud zkušenější, proto je norma v některých věcech až příliš volná...
Můžu, protože nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula. Podivné platformy, na kterých to tak není musí ošetřit kompilátor. Na takových platformách by se totiž rozbilo víc věcí, než jen porovnání vůči NULL.

Citace
Pokud funkce vrací NULL, předpokládám že dostanu něco jako 0x00000000, aspoň u části dnes používaných procesorů.
Ale pokud vrací '\0', může to být klidně 0x00FAB059, nebo něco ještě šílenějšího, v závislosti na šířce slova a endianitě!
O čísle 0 ani nemluvě.
WTF? Nula je prostě nula bez ohledu na to, jak ji zapíšu.

A dost, sorry, soudruzi, ale už mě to fakt nebaví... :)

Radovan.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #137 kdy: 26. 12. 2018, 10:01:16 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #138 kdy: 26. 12. 2018, 11:45:03 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?

protože on to tvrdí... NULL a '\0' nie je to iste a nikdy ani nebolo...

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #139 kdy: 26. 12. 2018, 12:16:48 »
protože on to tvrdí... NULL a '\0' nie je to iste a nikdy ani nebolo...

Už ti to vysvětlovalo několik lidí a stále jsi to nepochopil... Zkusím to polopatě:
Kód: [Vybrat]
#include <stdio.h>

char* foo() {
    return NULL;
}   

char* bar() {
    return '\0';
}   

int main() {
    printf("foo: %p\n", foo());
    printf("bar: %p\n", bar());
    return 0;
}   
C standard ZARUČUJE, že funkce foo a bar se chovají naprosto identicky, obě vrací ukazatel s hodnotou 0. Nejenom, že ten program dává pro foo i bar stejný výstup, ty funkce se i identicky přeloží, stačí se podívat do assembleru:
Kód: [Vybrat]
    .type   foo, @function
foo:
.LFB11:
    .cfi_startproc
    xorl    %eax, %eax
    ret
    .cfi_endproc

    .type   bar, @function
bar:
.LFB12:
    .cfi_startproc
    xorl    %eax, %eax
    ret
    .cfi_endproc
Při takovém použítí NULL a '\0', přesně jak jsi to udělal ve svém programu, není rozdíl mezi NULL a '\0'.


Kit

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #140 kdy: 26. 12. 2018, 12:28:10 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?
protože on to tvrdí... NULL a '\0' nie je to iste a nikdy ani nebolo...

Céčkařům prostě nevysvětlíš, co je to sémantické programování. Stejně obtížně bys jim vysvětloval, že posun o jeden bit vlevo není násobení dvěma. Jsou zvyklí přemýšlet nad tím, jak to zpracuje stroj a to je pro ně podstatné.

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #141 kdy: 26. 12. 2018, 12:35:14 »
Céčkařům prostě nevysvětlíš, co je to sémantické programování. Stejně obtížně bys jim vysvětloval, že posun o jeden bit vlevo není násobení dvěma. Jsou zvyklí přemýšlet nad tím, jak to zpracuje stroj a to je pro ně podstatné.
PHP lopatám nevysvětlíš, že existuje něco jako standard jazyka C, který jasně definuje, jak se co chová. Jsou schopni blábolit něco o třídách v C, škoda mluvit... Dneska fakt může psát na net každý pologramota.

Neviditelný

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #142 kdy: 26. 12. 2018, 12:37:37 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?
To by ses musel zeptat Dennise Ritchieho. Osobně předpokládám, že je to proto, abys mohl s ukazatelem zacházet úplně stejně jako s integerem, což se v dobách, kdy bylo C nejvíce relevantní jazyk dost hodilo. Navíc přiřadit speciální význam právě nule dává tak nějak intuitivně smysl.

NULL je makro definované jako (void*)0, '\0' je znakový literál reprezentující číselnou nulu. Oboje je víceméně syntaxtický cukr, aby nebylo nutné explicitně psát ptr != (void*)0 a str[N-1] = (char)0. Je nanejvýš děsivé, že ač je C staré šestačtyřicet let a leckde se vyučuje v základech algoritmizace jako první jazyk to chápe jediný lopata...

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #143 kdy: 26. 12. 2018, 12:48:57 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?
To by ses musel zeptat Dennise Ritchieho. Osobně předpokládám, že je to proto, abys mohl s ukazatelem zacházet úplně stejně jako s integerem, což se v dobách, kdy bylo C nejvíce relevantní jazyk dost hodilo. Navíc přiřadit speciální význam právě nule dává tak nějak intuitivně smysl.

NULL je makro definované jako (void*)0, '\0' je znakový literál reprezentující číselnou nulu. Oboje je víceméně syntaxtický cukr, aby nebylo nutné explicitně psát ptr != (void*)0 a str[N-1] = (char)0. Je nanejvýš děsivé, že ač je C staré šestačtyřicet let a leckde se vyučuje v základech algoritmizace jako první jazyk to chápe jediný lopata...

díky za pochvalu..  ;D nebo koho si tu lopatu myslel?

Radovan.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #144 kdy: 26. 12. 2018, 13:22:11 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?
To by ses musel zeptat Dennise Ritchieho.
Jenže ten to nevymyslel, vzniklo to roky před Unixem i C: https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare ;)

Ve skutečnosti je to prasecká ojebávka, související s fungováním procesorů, která má zaručit, že když se chybně napsaný program pokusí číst nebo dokonce zapisovat tam, kde kromě operačního systému nemá nikdo co pohledávat, tak dojde k přerušení, a OS ho bez milosti odstřelí jak rudoarmějec nácka. Takže jako vyjádření chyby se prostě vrací adresa úplného počátku operační paměti -> 0.

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #145 kdy: 26. 12. 2018, 13:28:52 »
nulový ukazatel je standardem jazyka C definován jako ukazatel s číselnou hodnotou nula.
Proč?
To by ses musel zeptat Dennise Ritchieho.
Jenže ten to nevymyslel, vzniklo to roky před Unixem i C: https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare ;)

Ve skutečnosti je to prasecká ojebávka, související s fungováním procesorů, která má zaručit, že když se chybně napsaný program pokusí číst nebo dokonce zapisovat tam, kde kromě operačního systému nemá nikdo co pohledávat, tak dojde k přerušení, a OS ho bez milosti odstřelí jak rudoarmějec nácka. Takže jako vyjádření chyby se prostě vrací adresa úplného počátku operační paměti -> 0.

konečne niekto, kto tomu rozumie,... :-)

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #146 kdy: 26. 12. 2018, 13:40:28 »
Ve skutečnosti je to prasecká ojebávka, související s fungováním procesorů, která má zaručit, že když se chybně napsaný program pokusí číst nebo dokonce zapisovat tam, kde kromě operačního systému nemá nikdo co pohledávat, tak dojde k přerušení, a OS ho bez milosti odstřelí

Mýlíš se. Dereference NULL v C nezaručuje, že program spadne. Existuje spousta architektur, na kterých se C používá, kde čtení/zápis adresy 0 nezpůsobí pád programu. Standard C jasně definuje, že dereference NULL je undefined behavior. To znamená, že program nemusí spadnout, může se stát cokoliv. Na architekturách bez MMU nespadne, poběží normálně dál, co to ale bude dělat, to je undefined...

Koncept NULL není v C kvůli odstřelení chybných programů, je to jedna z možností, jak implementovat maybe typy (empty values). Praxe ukázala, že implementace maybe pomocí NULL nebyl úplně šťastný nápad, je to prostě historické dědictví.

Radovan.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #147 kdy: 26. 12. 2018, 14:07:35 »
Na architekturách bez MMU nespadne, poběží normálně dál, co to ale bude dělat, to je undefined...
No, třeba na ZX Spectru to po zavolání adresy 0x0000 poběží normálně dál, akorát s maličkým "resetem" ;D

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #148 kdy: 26. 12. 2018, 14:18:36 »
No, třeba na ZX Spectru to po zavolání adresy 0x0000 poběží normálně dál, akorát s maličkým "resetem" ;D

Dobře, stále ti nedochází důsledky, takže ti to vysvětlím víc polopatě. Na architekturách s MMU dereference NULL nezaručuje, že program spadne. Protože je dereference NULL podle standardu undefined behavior, může překladač s takovou konstrukcí udělat cokoliv, klidně ji úplně vyhodit pryč a v běžícím programu vůbec neprovést. To totiž stále spadá pod definici undefined behavior a překladač to v rámci optimalizací rád udělá.

https://stackoverflow.com/questions/22847539/does-dereference-a-null-pointer-guarantee-to-crash-a-program-in-c-c

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #149 kdy: 26. 12. 2018, 14:21:31 »
Protoze pak neni ta metoda ten chliv, co jsi poslal, ale neco, co se da precist a pochopit.

takže podľa tebe je jednoduchšie povedať "chcem dolnú časť žemle hamburgeru na ňom kurací rezeň, a na ňom hornú časť žemle hamburgeru" než "chcem kurací hamburger", to je teda fajn logika. Čitatelnejšie to o nič nieje, a ani to nepotrebuješ. Predsa si hamburger kupuješ ako celok. Obsah hamburgeru zaujíma len zamestnanca mcdonalda, ktorý ale vytvára celistvý "produkt" teda hamburger.

Ne, konzument API samozrejme rika "chci burger".

Ale ta implementace musi byt rozdelena na male kusy, kazdy citelny a kazdy spravne pojmenovany. Aby to pak vypadalo zhruba

Kód: [Vybrat]
burger =
    (horni, dolni) <- houskaNaPul
    return Burger(horni, okurka, maso, dolni)

private okurka = ...

private maso = ...

To tvoje je spis

Kód: [Vybrat]
burger =
    police <- najdiPolici
    housky <- police.prihradky.findFirst(\p -> p.maObrazekHousty)
    houstka <- houstky.vemJednu()
    if (houstka == NULL) ....
    ...
    ...

Pojmenovani jednotlivych casti ma smysl, prestoze nejsou znovupouzitelne. Kdyz to udelas, tak se stane jasne, co se deje (burger je z pulek houstky, okurky a masa), aniz by se musel nekdo prehrabovat v nejakem storadkovem bordelu.

Nemluve o tom, ze ty male pojmenovatelne casti mohou byt napr. samostatne testovatelne (coz muze i nemusi byt dobry napad vyuzit).