Citat:
ADA är världens sämsta språk. Och fått sitt namn från en kvinna som knulla runt och på först på sin dödsbädd bad hon om förlåtelse.
Om man tittar lite på vad som brukar orsaka runtimefel i program skrivna i C/C++ så är det några saker som är ständigt återkommande.
1) Man deklarerar en pekare, glömmer att initiera den, och när man använder pekaren till nåt så smäller det eftersom den pekar nånstans slumpmässigt i minnet. Typisk får man ett SIGSEGV avslut.
2) Man pekar på någonting, som kompilatorn optimerar och lägger i ett processorregister, och
då kan man inte peka på det längre, därför att register inte är adresserbara i de flesta processorarkitekturer. En pekare i sig är ju bara en adress (pekarens värde) och storleken på
det den pekar på (pekarens typ). Hamnar det utpekade objektet i ett processorregister så
är det inte säkert att pekaren är användbar längre...
(tanken med intrinsicen "volatile" är att förhindra sånt, men det fanns inte i tidig C)
3) Ursprungligen hade C ingen syntax för att skilja på by-value och by-reference argument till
funktioner. C++ har det (&) men på gamla C-kompilatorer skickade man över pekare eller const-pekare som argument. By value betyder ju att man kopierar värdena till stacken, funktionen använder dem, och när funktionen returnerar så kastas stacken bort. By reference, där skickar man in ADRESSERNA (pekare) till det man vill joxa med, så det man joxat med finns kvar längre upp i stacken eller på heapen.
4) Allokera minne på heapen (malloc() i C eller new i C++), få en pekare till vad man nu har allokerat,
och sedan slarvar man bort pekaren. En klassisk minnesläcka med andra ord.
Minnesallokering är i grund och botten en tjänst från operativsystemet, det är ju inte ens säkert att man har ett operativsystem, jag har aldrig fått den ynnesten på 8-bitars MCU:er, och då finns inget malloc()/free() eller new/delete. I C++ är new/delete intrinsics... jag har å andra sidan ALDRIG sett C++ kod på små 8- eller 16-bitars MCUer.
I Ada kan du inte deklarera en pekare och ha den oinitierad, kompilatorn slår dig på fingrarna direkt.
Det finns i Ada syntaktiskt stöd för argument, om de ska vara "in" (by value), "in out" (by reference) eller "out" (by reference const). Nu har ju C++ försökt göra samma sak med referenser men ADAs syntax är snyggare. Även Pascal skiljer på argument som är by value och by reference, de sistnaämnda deklarerade men med "var" i argumentlistan om jag minns rätt.
I Ada får du inte peka på en variabel med mindre än att du deklarerar variabeln som pekbar, just för att förhindra att variabeln optimeras till ett register. C/C++ "adress-of" operator (&) motsvaras av Adas 'access.
Sen gillar INTE Adakompilatorn att du blandar typer, om du har deklarerat en typ som heter TwoDigitInteger som kan vara 0-99, så kan du inte automatiskt blanda den med vanliga integers, du
måste explicit casta eller deklarera övelagrade operatorer m.m. där man hanterar hur Integer och TwoDigitInteger ska hantera varandra.
Nu har jag inte joxat med Ada på några år för det är i princip bara SAAB som använder det i Sverige, men jag har hållit på med det periodvis sedan 1999. C++ är mycket mycket vanligare.
Lite synd på sätt och vis, Ada är fanimig inget dåligt språk om man ska bygga riktigt stora system.
1) Man deklarerar en pekare, glömmer att initiera den, och när man använder pekaren till nåt så smäller det eftersom den pekar nånstans slumpmässigt i minnet. Typisk får man ett SIGSEGV avslut.
2) Man pekar på någonting, som kompilatorn optimerar och lägger i ett processorregister, och
då kan man inte peka på det längre, därför att register inte är adresserbara i de flesta processorarkitekturer. En pekare i sig är ju bara en adress (pekarens värde) och storleken på
det den pekar på (pekarens typ). Hamnar det utpekade objektet i ett processorregister så
är det inte säkert att pekaren är användbar längre...
(tanken med intrinsicen "volatile" är att förhindra sånt, men det fanns inte i tidig C)
3) Ursprungligen hade C ingen syntax för att skilja på by-value och by-reference argument till
funktioner. C++ har det (&) men på gamla C-kompilatorer skickade man över pekare eller const-pekare som argument. By value betyder ju att man kopierar värdena till stacken, funktionen använder dem, och när funktionen returnerar så kastas stacken bort. By reference, där skickar man in ADRESSERNA (pekare) till det man vill joxa med, så det man joxat med finns kvar längre upp i stacken eller på heapen.
4) Allokera minne på heapen (malloc() i C eller new i C++), få en pekare till vad man nu har allokerat,
och sedan slarvar man bort pekaren. En klassisk minnesläcka med andra ord.
Minnesallokering är i grund och botten en tjänst från operativsystemet, det är ju inte ens säkert att man har ett operativsystem, jag har aldrig fått den ynnesten på 8-bitars MCU:er, och då finns inget malloc()/free() eller new/delete. I C++ är new/delete intrinsics... jag har å andra sidan ALDRIG sett C++ kod på små 8- eller 16-bitars MCUer.
I Ada kan du inte deklarera en pekare och ha den oinitierad, kompilatorn slår dig på fingrarna direkt.
Det finns i Ada syntaktiskt stöd för argument, om de ska vara "in" (by value), "in out" (by reference) eller "out" (by reference const). Nu har ju C++ försökt göra samma sak med referenser men ADAs syntax är snyggare. Även Pascal skiljer på argument som är by value och by reference, de sistnaämnda deklarerade men med "var" i argumentlistan om jag minns rätt.
I Ada får du inte peka på en variabel med mindre än att du deklarerar variabeln som pekbar, just för att förhindra att variabeln optimeras till ett register. C/C++ "adress-of" operator (&) motsvaras av Adas 'access.
Sen gillar INTE Adakompilatorn att du blandar typer, om du har deklarerat en typ som heter TwoDigitInteger som kan vara 0-99, så kan du inte automatiskt blanda den med vanliga integers, du
måste explicit casta eller deklarera övelagrade operatorer m.m. där man hanterar hur Integer och TwoDigitInteger ska hantera varandra.
Nu har jag inte joxat med Ada på några år för det är i princip bara SAAB som använder det i Sverige, men jag har hållit på med det periodvis sedan 1999. C++ är mycket mycket vanligare.
Lite synd på sätt och vis, Ada är fanimig inget dåligt språk om man ska bygga riktigt stora system.