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

Radovan.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #150 kdy: 26. 12. 2018, 14:44:44 »
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ě.
To mi připomíná jak tu kdysi Jehovista prohlásil, že na to má svědky :o

Jasně, vrácení NULL ještě samo o sobě nic neudělá, je to číslo jako každé jiné. Až jeho nevhodné použití může vést k nežádoucím efektům, někdy i pyrotechnickým. Zvlášť když si někdo plete NULL a NUL :-X

Spíš si přečti tohle: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/


Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #151 kdy: 26. 12. 2018, 14:45:53 »
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).

i tak je to zbytočné, pretože kód máš zdokumentovaný a máš v ňom komentáre (teda vo vývojovej vetve), samozrejme do produkcie ide čistý kód... takže čitelný je i bez zbytočných "sekaní" metod/funkcií.

Kit

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #152 kdy: 26. 12. 2018, 15:08:25 »
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).

To si jen myslíš že to pojmenování není znovupoužitelné. Podstatné je, že identifikátory dodávají programu sémantiku, která je důležitá pro jeho pochopení.

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #153 kdy: 26. 12. 2018, 15:09:12 »
To mi připomíná jak tu kdysi Jehovista prohlásil, že na to má svědky :

Ono by stačilo, kdybys znal C standard, když se vyjadřuješ (chybně) k jazyku C.

Jasně, vrácení NULL ještě samo o sobě nic neudělá, je to číslo jako každé jiné. Až jeho nevhodné použití může vést k nežádoucím efektům, někdy i pyrotechnickým. Zvlášť když si někdo plete NULL a NUL :-X

Standard C jasně definuje, co se při dereferenci NULL pointeru stane, je to UNDEFINED. Ty jsi začal valit nějaké nesmysly o tom, že NULL je v jazyce C kvůli detekci chybných programů, aby spadly. Promiň, ale to je naprostá blbost a nepochopení, proč je v C NULL. Zaprvé  programy v C při dereferenci NULL spadnout nemusí (můžou dělat cokoliv), zadruhé důvod existence NULL v C je úplně jiný, je to implementace maybe typů (empty values). Že je to implementace historická a ne úplně vyhovující současným požadavkům na bezpečnost kódu, to všichni vědí.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #154 kdy: 26. 12. 2018, 15:38:53 »
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).

i tak je to zbytočné, pretože kód máš zdokumentovaný a máš v ňom komentáre (teda vo vývojovej vetve), samozrejme do produkcie ide čistý kód... takže čitelný je i bez zbytočných "sekaní" metod/funkcií.

A I tak máš v ideálních podmínkách (ty komentáře někdo updateoval s kódem...) metrák čtení i tam, kde tě zajímá jenom základ (třebas musíš zjistit zda je v tom burgeru rajče nebo paprika).

O tom, že pak musíš skákat mezi různými úrovněmi abstrakce nemluvě.


Radovan.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #155 kdy: 26. 12. 2018, 15:53:44 »
... polopatě.
Nepochopils'.

Standard C jasně definuje ... UNDEFINED.
Aha.

Není jenom C. Není jenom NULL. Viz výše.

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #156 kdy: 26. 12. 2018, 16:03:18 »
... polopatě.
Nepochopils'

Standard C jasně definuje ... UNDEFINED.
Aha.

Není jenom C. Není jenom NULL. Viz výše.

Aha. Takže ty píšeš nesmysly o chování NULL v C a teď to budeš obhajovat tak, že v jiných jazycích se NULL chová jinak? No to je ale překvapení, kdo by to byl čekal...

dev null

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #157 kdy: 26. 12. 2018, 18:41:47 »
Taaak, hezky Vanoce vam vsem, jelikoz tomu nerozumim, tak jsem ten pravy, abych vam to vysvetlil.

Mlociku bohuzel nemas pravdu, tva funkce unsigned char* b_e vraci ukazatel na unsigned char, coz '\0' rozhodne neni. Jak tady poznamenal Neviditelny, mas stesti ze se z toho udela 0 stejne jako z NULL. Pokud neveris, zkus si zkompilovat kod, co ti posilal Neviditelny, funguje to, jak pise. Pokuds chtel v pripade, ze dostanes prazdny retezec take prazdny retezec vratit, musis to udelat jinak nez vracet nulu.

Co se tyce hamburgeru, samozrejme psat funkce (metody) co maji prilis mnoho radku je _OBVYKLE_ spatne. Pokud to jde rozdrobit, je vhodne to udelat, a to i v pripade, ze tyto rozdrobene metody budou pouzity jen jednou. Duvodem je zejmena lepsi citelnost.

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #158 kdy: 26. 12. 2018, 18:48:29 »
Pokud si to dobře pamatuju, za NULL pointer se v c považuje pointer, který ukazuje "nikam" (ve smyslu není za ním skovaný žádný datový typ), jako konvence se bere, že takový pointer má hodnotu 0 (nula), tj. ukazuje na adresu 0.
(bacha, neinicializovaný pointer může ukazovat kamkoli, klidně i do existující paměti)

A zřejmě proto, aby byl jazyk c co nejjednodušší, tak jeho návrh (a pak implementace) žádné explicitní klíčové slovo pro takový pointer nedeklaruje, pak se to ojebává těmi "ex post" deklaracemi (viz v kolika hlavičkáčích je ten NULL deklarován (a jak)).
A ani papež nikomu nezabrání, aby si ve svým zdrojáku nenadeklaroval hodnotu NULL třeba na deadbeaf.

c++ (od verze 11) to řeší (systémově) novým klíčovým slovem nullptr.

'\0' je znak s hodnotou 0 (nikoli znak 0), používá se jako ukončovač c stringů.
Smutné je, že tento znak má označení ASCI NUL, nicméně pro tyto stringy se používá označení "null-terminated" string.

Velikost toho znaku '\0' je 1 znak (jeden char (8 bitů)), velikost NULL pointeru (pokud si to nikdo nepředeklaroval) je roven velikosti datového typu ukazatel (na daném železe).
(číselně mají tento znak i NULL pointer stejnou hodnotu)


PS: Že v *nixech končí pokus o dereferenci NULL pointeru segfaultem je dáno jen tím, že (tuším, že záměrně) většinou první (a tedy i s adresou 0) virtuální stránka paměti nemá namapovanou fyzickou paměť, anebo k ní user nemá přístup.

andy

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #159 kdy: 26. 12. 2018, 23:04:20 »
Citace
PS: Že v *nixech končí pokus o dereferenci NULL pointeru segfaultem je dáno jen tím, že (tuším, že záměrně) většinou první (a tedy i s adresou 0) virtuální stránka paměti nemá namapovanou fyzickou paměť, anebo k ní user nemá přístup.
To je schválně udělané proto, aby programy, které tam šáhnou, spadly...


Jinak k původní otázce: jsou jazyky, které mají syntaxi strašně jednoduchou (lisp), a pak jazyky, který ji mají docela rozvětvenou (C++). A pak je tu Java, která dlouho odolávala, ale nakonec na ni taky došlo a přibylo tam pár "složitějších" věcí (lambda funkce apod.), ale i python s chováním "yield", comprehensionama apod. se taky trošku zesložiťuje. Problém je, že jazyky postupně bobtnají s tím, jak se přidávají vlastnosti a některé vlastnosti prostě nejde přidat jinak než rozšířením syntaxe.

Jazyky, které se blíží přirozeným jazykům (COBOL?) jsou IMO ve stejné kategorii jako to C++; ono je hezké, že člověk rozumí tomu, co tam je napsané, ale bohužel to je taky většinou jediný způsob, jak to napsat. Který vás samozřejmě nenapadne, když to zrovna potřebujete a pak je to, jako když se člověku, který neumí česky, snažíte 10 různými způsoby sdělit totéž a doufáte, že alespoň někdy porozumí.

BTW: proti Perlu mi ostatní jazyky přijdou úplně v pohodě. Asi měsíc jsem se snažil zapamtovat si, jaký znak v kterém kontextu znamená co a pak jsem to vzdal....

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #160 kdy: 27. 12. 2018, 00:14:51 »
Podle mne je u naprosté většiny programovacích jazyků syntaxe naopak velice jednoduchá! Mám spíše dojem, že programovací jazyky, které se snaží podobat mluvenému lidskému slovu jsou mnohem méně přehledné a tudíž hůře čitelné.

Kit

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #161 kdy: 27. 12. 2018, 00:37:39 »
Podle mne je u naprosté většiny programovacích jazyků syntaxe naopak velice jednoduchá! Mám spíše dojem, že programovací jazyky, které se snaží podobat mluvenému lidskému slovu jsou mnohem méně přehledné a tudíž hůře čitelné.

Syntaxe je složitá například u Cobolu. Stovky klíčových slov jsou z dnešního pohledu zvráceností. Ani nevím, kolik jich má Visual Basic, ale asi také dost. Když jsem se učil Pascal, tak jich bylo cca 40. To už se celkem dalo. Jazyk C je v tomto ohledu minimalistický, ale z velké části toho dosahuje používáním symbolů. Stále však nedosahuje jednoduchosti Lispu, jehož syntaxe vlastně obsahuje jen závorky. Dodnes lituji, že jsem se ho nezačal učit dříve, protože mi poskytl nový pohled na programování v ostatních jazycích.

Petr

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #162 kdy: 27. 12. 2018, 05:26:14 »
Mne syntaxe prog. jazyků přijde jednoduchá.

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #163 kdy: 27. 12. 2018, 15:34:22 »
Podle mne je u naprosté většiny programovacích jazyků syntaxe naopak velice jednoduchá! Mám spíše dojem, že programovací jazyky, které se snaží podobat mluvenému lidskému slovu jsou mnohem méně přehledné a tudíž hůře čitelné.

moje slová

adam

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #164 kdy: 27. 12. 2018, 15:52:19 »
vy ste schopný i autorov jazyka C prehovoriť že v ich jazyku je NULL to isté čo '\0' ... smutné, hlavne že oni sami píšu že to to isté nieje.

Fakt?
Kód: [Vybrat]
madcat@The-Raza ~/Devel/zzz # cat n.c
#include <stdio.h>

int main()
{
        printf("Equals? %s\n", (NULL == '\0') ? "Yes" : "No");

        return 0;
}
madcat@The-Raza ~/Devel/zzz # clang -Wall -Wextra -pedantic n.c -o n
madcat@The-Raza ~/Devel/zzz # ./n                                   
Equals? Yes

No nic, mír s vámi...

Chtelo by to pouzit vyzralejsi prekladac a ne nejaky trapny pokus o nej :)

Kód: [Vybrat]
$ gcc -Wall -Wextra -pedantic n.c -o n
n.c: In function ‘main’:
n.c:4:38: warning: comparison between pointer and zero character constant [-Wpointer-compare]
         printf("Equals? %s\n", (NULL == '\0') ? "Yes" : "No");
                                      ^~
In file included from /usr/include/_G_config.h:15:0,
                 from /usr/include/libio.h:31,
                 from /usr/include/stdio.h:41,
                 from n.c:1:
n.c:4:33: note: did you mean to dereference the pointer?
         printf("Equals? %s\n", (NULL == '\0') ? "Yes" : "No");
Clang - na rozdíl od GCC - zase správně varuje, že return '\0' z funkce, která vrací char * je potenciální chyba; GCC v tomto případě mlčí. To ale nemá žádný vliv na to, jak takový kód bude fungovat. NULL a '\0' se budou efektivně lišit jen tehdy, pokud bude NULL definováno na něco jiného než (void *)0, což jsem chtěl ukázat.

To je ale pravda jenom pro porovnani, '\0' a NULL budou mit hodne pravdepodobne jinou delku, pokud bude napr. funkce s promennym poctem argumentu zakoncena NULL (hojne pouzivano), nebude to pri zavolani s '\0' fungovat, protoze bude mit pravdepodobne kratsi delku.