Za to muze Ccko nebo podobny low-level jazyk. Opravdu nechapu proc to pouzivat krom par low-level driveru v jardu OS.
Na vse ostatni nejaky normalni vyssi jazyk (aspon C++11) nebo javu, python, D, ..cokoli. Pak clovek muze resit myslenku a ne to jak (de)alokovat pamet pro string apod.
Je to jako kdyby psali knizku a soustredili se, jak prvnacek, na cmarani pismenek namisto vyjadreni myslenky.
1. myslis sdi, ze v C++, ci v jave alebo v pythone sa nedaju naprogramovat chybne aplikacie?
2. na veci ako GRUB nie je vhodny ani java (nutnost JVM), ale ani python (nutnost interpretra), cize tvoje riesenie by vyzadovalo najskor spustenie jednej velkej aplikacie (radovo desiatky az stovky MB), aby sa spustil GRUB, cize je to pomocou Javy, ci pythonu nerealne...
Zrovna GRUB jakožto bootloader je relativně low-level záležitost, zde si myslím je jazyk C na místě.
Hmm... koukám, že nejsem jediný, kdo zrovna GRUB napsaný v Javě nebo Pythonu si nedokáže dost dobře představit.
Lze však souhlasit s tím, že na aplikační programování je rozumné používat vyšší programovací jazyky, kde již některé elementární věci pořešené.
Nicméně chybám to nezabrání. Ošetřit vstup od uživatele je skoro nutnost.
Trochu přeneseně se dá říci, že s Céčkem je to asi jak s ostrými předměty, které malým dětem do rukou nepatří.
Ale vstupy se prece zasadne neosetrujou, sak ono to vrati exepsnu, ne? Proste vemes vstup, a vynasobis ho deseti (trebas) ... a kdyz to neprojde, tak vyblejes na usera 100radku nejaky hruzy. Mno ... a kdyz to projde, treba proto ze se pouzije nejaky pretypovani tak nejak "od prirody", tak se user prozmenu divi, jak je mozny, ze pismena se nasobej deseti a vraci to i vysledky ... a tvurce se samo dusuje, ze to neni mozny ...
Tak přesně tohle se tu stalo minulý týden. Začal se restartovat výrobní systém. Chvíli trvalo, než se přišlo na důvod. Problém je v textech typu "1234E6". O tom funkce isnumber tvrdí, že to číslo je (vlastně to má pravdu, je to vědecký zápis čísla). Ale konverze to za číslo nepovažuje a vypadne na chybu. Zkrátka nám selhává tohle:
if( Number.isNumber(x))
y = Number.toNumber(x)
else
y = 0;
Ono je nám vlastně úplně jedno, jak se isNumber a toNumber k tomu 1234E6 zachová. Ale proč se proboha každá chová jinak? Už se to opravuje, ale vám by se to nelíbilo. Protože funkce isNumber nově místo regexpu bude dělat tohle:
try { x = toNumber(y); return(true); } catch(Exception e) { } return(false);
Problém je to v tom, že nikdo při smyslech to takhle nedělá. Od počátku programování se tato věc dělá nějak takhle:
bool ConvertStringToInteger(int &output, string value)
a podle návratové hodnoty true/false se pozná zda se konverze zdařila. Žádné IsNumber a podobné sračky se nepoužívají a proto s nimi nemůže být problém.
Tak prave tieto IsNumber a ConvertToNumber veci su z dovodu vynimiek - chudaci programatori v jazykoch ktore nepoznaju odovzdavanie hodnoty referenciou/pointerom chceli jednoduchu funkciu (ConvertToNumber):
int a = ConvertToNumber(b);
avsak tato vypluje vynimku ak mas na vstupe nejaku blbost. Vratit dve hodnoty nemozes a vytvarat cely stacktrace pri spracovani velkeho mnozstva dat to samozrejme spomaluje spracovanie veci dost vyznamne takze sa prislo s workaroundom IsNumber ktory nevyhadzuje vynimku.
BTW napriklad C# kvoli tomuto zaviedol specialnu syntax TryParse ktory robi presne to ale neviem ako by sa nieco take naimplementovalo napriklad v Javascripte.