Varför var deklaration i for-loopar ej möjligt i ANSI C?

Permalänk

Varför var deklaration i for-loopar ej möjligt i ANSI C?

C har alltid varit konstant över alla år sedan 1999 då C99 standarden om. De flesta brukar följa C99 standarden.
Men ibland kan det vara nödvändigt att skriva ANSI C för att det är liksom en nivå av C språk som är kompatibel med alla kompilatorer och hårdvaror världen över.

Men varför bestämde dom att man skulle deklarera indexeringen utanför en t.ex. for-sats, i ANSI C?

int i; for(i = 0; i < 10; i++){ /* kod.... */ }

Har detta med dynamisk minnesallokering eller?

Permalänk
Medlem

regeln i ansi c är att variabler måste deklareras före allt annat i ett kodblock. lite googlande ger att den gängse teorin är att det beror på begränsningar i gamla kompilatorer (eller för att förenkla implementeringen av sagda gamla kompilatorer, beroende på om ägget eller hönan kom först…)

cheers

Permalänk
Skrivet av helmet:

regeln i ansi c är att variabler måste deklareras före allt annat i ett kodblock. lite googlande ger att den gängse teorin är att det beror på begränsningar i gamla kompilatorer (eller för att förenkla implementeringen av sagda gamla kompilatorer, beroende på om ägget eller hönan kom först…)

cheers

Okej, det var alltså en minnesbegränsning på denna tid. Då vet jag

Själv programmerar jag endast i ANSI C, trots att alla C kompilatorer idag stödjer C99 och uppåt. Men det är så satans ballt att köra avancerad C programmering på Windows 95 eller lägre.

Ett undantag är MSVC kompilatorn som ej tillåter VLA i C99 och uppåt.

Permalänk
Medlem
Skrivet av heretic16:

Okej, det var alltså en minnesbegränsning på denna tid. Då vet jag

Själv programmerar jag endast i ANSI C, trots att alla C kompilatorer idag stödjer C99 och uppåt. Men det är så satans ballt att köra avancerad C programmering på Windows 95 eller lägre.

Ett undantag är MSVC kompilatorn som ej tillåter VLA i C99 och uppåt.

Hur får du det till att vara relaterat till minnesbegränsningar?

Permalänk
Medlem

Vet man hur processorer fungerar med stack och heap så blir det mer begripligt varför C-kompilatore gör som det gör, framförallt när det gäller tidigare processor-arkitekturer - och folk som mest sett och hållit på med högnivåspråk och aldrig hållit på med assembler och jobbat med registernivå på direkt i CPU och mot hårdvara i form av register så kan många av egenheterna i olika kompilatorer vara rätt långsökta i varför det är som det är, medans de som hållit på med embedded och tex. programmerat PIC-processorer, 8052-assembler-familjen av microkontrollers och även ARM-processorer så inser man ganska snabbt varför det är som det är i C-koden.

C är ordentligt gammal programspråk och har många issue med dagens ögon sett , men fortfarande väldigt använd då den klarar en sak som andra programspråk har svårt eller väldigt omständligt att hantera - att jobba direkt mot HW och på registernivå på dessa och det är inte utan orsak varför C är dominerade på OS och drivrutin-sidan mot olika HW än idag. ...och som ibland benämns som en avancerad macro-assembler där du inte behöver kunna mnemonic för varje processorfamilj utantill.

Permalänk
Skrivet av orp:

Hur får du det till att vara relaterat till minnesbegränsningar?

Jag har ingen aning. C fokuserar på att allt ska vara optimalt och snabbt samt dra minimalt med resurser.
Då kanske man sparar en assemblerrad med att deklarera utanför?

Permalänk
Medlem
Skrivet av heretic16:

Jag har ingen aning. C fokuserar på att allt ska vara optimalt och snabbt samt dra minimalt med resurser.
Då kanske man sparar en assemblerrad med att deklarera utanför?

Jag delar inte din syn på C. Jag skulle inte säga att C "fokuserar" på, som i att vara designat för, prestanda och resursoptimering. C ger dig kontroll över minneshantering och var trevligare att arbeta med än assembly eller fortran och som en följd av att det är ett primitivt språk är snabbt. Sedan är det upp till hur utvecklaren hanterar minne och arkitektur som kommer avgöra om det upplevs som resurseffektivt i slutändan.

Utöver detta om vi går tillbaka till den ursprungliga diskussionen om for-loopen så avslutade du inlägget med att fråga om det var pga dynamisk minnesallokering. Detta ihop med slutsatsen om att detta skulle vara minnesbegränsning går inte ihop rent logiskt.

1. Dynamisk minnesallokering brukar referera till malloc, free osv, så nej det handlar inte om dynamisk minnesallokering.

2. Gällande slutsatsen om att det skulle vara minnesbegränsningar. Att deklarera iterator variabeln i for-loopen borde reducera scopet för variabeln men detta hade framförallt varit aktuellt med Rust. Jag skrev två applikationer där jag enbart flyttade deklarationen och de båda producerade identisk assembly med gcc 13.1.1 och objdump v2.40.0 (med viss varning för att detta inte kanske inte är ett entydigt sätt att disassemble:a). Dvs det är antagligen ett designval man gjorde när man introducerade C men som man insett är en onödig begränsning som bara sätter hinder för utvecklares alternativ att uttrycka sig.

Permalänk
Skrivet av orp:

Jag delar inte din syn på C. Jag skulle inte säga att C "fokuserar" på, som i att vara designat för, prestanda och resursoptimering. C ger dig kontroll över minneshantering och var trevligare att arbeta med än assembly eller fortran och som en följd av att det är ett primitivt språk är snabbt. Sedan är det upp till hur utvecklaren hanterar minne och arkitektur som kommer avgöra om det upplevs som resurseffektivt i slutändan.

Jag såg en dokumentär om just C och lite om övriga språk. Men fokus var mycket om C.

Allt började med 1 och 0, bokstavligen. Detta kallas för maskinernas kod och en 1:a kunde antingen bestå av ett hål i ett kort, eller 12V hög spänning, där 0:an motsvarar 0 volt spänning.

Men eftersom så blev det allt mer krav på att en maskin måste göra mer. Programmen blev större och tillslut så bestämde man sig att ersätta maskinkoden med instruktioner istället. Nu uppfanns assembler. Assembler var enkelt, men även där så blev det problem när assemblerkoden blev flera hundra rader lång.

Ett nytt verktyg måste utvecklas. Målet var att verktyget skulle vara enkelt och lika effektivt som assembler.
Många försök gjordes på att hitta det optimala språket.

Under 50-talet så började man tänka i algoritmer. Tyskarna var tidigt ute med matematiska algoritmer så som Plankalkül och Superplan. Dessa var alltså en direkt översättning från räkneram till algoritmer. Därför hete dom Plan-Kalkylator. Amerikanernas motsvarighet hette Fortran - Formula transformation.

Men dessa var matematiska språk. Behovet var ett programmeringsspråk som kunde hantera algoritmer. Vid år 1958, bara ett år efter Fortran kom till världen, så skapades ALGOL 58 - Algorithms 1958. Det var ett bra språk som kunde ersätta assembler.

Notera att på denna tid så växte det fram väldigt många olika språk som gjorde in princip samma sak.
- ALGOL 60
- Lisp
- Cobol
- PL/1

Nu började språken få sin moderna form. Men det var ofta en gröt där vissa av språken hade vissa fördelar och andra delar av språken hade nackdelar. Det måste finnas ett språk som verkligen kan göra allt som dessa 50-språk kan göra.

Om man kombinerar dessa språk, då får man CPL (Combined Programming Language). Alltså ett språk som kunde göra allt som 50-talets språk kan!

Men CPL var bökigt. Det måste bli enklare, för nu blev det enklare att programmera assembler. Datorutvecklarna tyckte att CPL borde vara ett rätt "basic" språk, så man lade till BCPL (Basic Combined Programming Language).

Men nu var det inte ett kombinerat språk längre. Det var ett eget språk för BCPL hade utvecklats till en egen gren. Så man tog bort CPL från BCPL och fick programmeringsspråket B. B står för BASIC om någon undrar varför man inte började på "A".

Men B var ung och hade mycket uppdateringar. Tillslut när dom lanserade sin stabila version av B så kallade dom den för C, för det var liksom nästa version. C blev en succé för den verkligen blev enkel, snabb och kunde ersätta assembler.

Målet var uppfyllt. Men när datorerna skulle utvecklas till mer avancerade system och datorgrafik var ett krav på 80-talet, då var det helt plötsligt bökigt att skriva C, för C var konstruerad för att vara optimal och enkel, inte hantera komplexa saker.

Så då lade man till objektorientering i C och kallade den för "C with classes", vilket var C's nästa version. Objektorienteringen gjorde det lättare att hantera fönster på skärmen. Men istället för att kalla C för D, så valde man bara att skriva C++ för skaparen ville markera att det var samma språk, bara en utökning.

Så jag delar inte din syn på C

Citat:

1. Dynamisk minnesallokering brukar referera till malloc, free osv, så nej det handlar inte om dynamisk minnesallokering.

2. Gällande slutsatsen om att det skulle vara minnesbegränsningar. Att deklarera iterator variabeln i for-loopen borde reducera scopet för variabeln men detta hade framförallt varit aktuellt med Rust. Jag skrev två applikationer där jag enbart flyttade deklarationen och de båda producerade identisk assembly med gcc 13.1.1 och objdump v2.40.0 (med viss varning för att detta inte kanske inte är ett entydigt sätt att disassemble:a). Dvs det är antagligen ett designval man gjorde när man introducerade C men som man insett är en onödig begränsning som bara sätter hinder för utvecklares alternativ att uttrycka sig.

Så det var bara ett val av design?
Handlar det inte mera om att undvika mer assemblerkod?

Permalänk
Medlem
Skrivet av heretic16:

Så jag delar inte din syn på C

Du förklarar inte riktigt hur men utifrån det jag skrev, har du sett något skriftligt uttalande från Kernighan eller Ritchie om att det var ett explicit designval att optimera för prestanda annat än minneshanteringen?

Skrivet av heretic16:

Så det var bara ett val av design?

Jag tycker att det är bra att man får deklarera variabler som en del av for-loopen.

Skrivet av heretic16:

Handlar det inte mera om att undvika mer assemblerkod?

Inte vad jag kan se.

Permalänk
Skrivet av orp:

Du förklarar inte riktigt hur men utifrån det jag skrev, har du sett något skriftligt uttalande från Kernighan eller Ritchie om att det var ett explicit designval att optimera för prestanda annat än minneshanteringen?

Nej. Det är därför jag skapade denna tråd för att jag visste inte.

Citat:

Jag tycker att det är bra att man får deklarera variabler som en del av for-loopen.

Det tycker jag också. Men jag skriver mest bara ANSI C bara för att liksom. Jag skrev normalt efter senaste C standarden, än fast C har varit väldigt likt sedan C99, men ANSI C gav mig möjligheter att applicera koden inte bara på äldre system, utan alla system.

Permalänk
Medlem
Skrivet av heretic16:

Nej. Det är därför jag skapade denna tråd för att jag visste inte.

Du måste ha citerat fel. Du skrev denna tråden om att få förtydligande gällande tidiga designval av syntaxen och jag sagt att jag tror inte det har en djupare betydelse än att det var startpunkten och sedan har språket utvecklats för att bli trevligare att arbeta med.

Om du citerade rätt så denna diskussionen är en annan där du uttrycker dig som om det skulle varit ett aktivt designval av K&R att göra C snabbt. Jag sa att jag inte delar denna synen eftersom jag inte sett ett explicit uttalande om detta från K&R. Du säger att du inte delar min syn och citerar en dokumentär som inte ger klarhet i diskussionen och jag bad dig att förtydliga.

Skrivet av heretic16:

Det tycker jag också. Men jag skriver mest bara ANSI C bara för att liksom. Jag skrev normalt efter senaste C standarden, än fast C har varit väldigt likt sedan C99, men ANSI C gav mig möjligheter att applicera koden inte bara på äldre system, utan alla system.

Jag läste din fråga fel. Japp, jag tolkar det som enbart ett designval.

Permalänk
Skrivet av orp:

Du måste ha citerat fel. Du skrev denna tråden om att få förtydligande gällande tidiga designval av syntaxen och jag sagt att jag tror inte det har en djupare betydelse än att det var startpunkten och sedan har språket utvecklats för att bli trevligare att arbeta med.

Om du citerade rätt så denna diskussionen är en annan där du uttrycker dig som om det skulle varit ett aktivt designval av K&R att göra C snabbt. Jag sa att jag inte delar denna synen eftersom jag inte sett ett explicit uttalande om detta från K&R. Du säger att du inte delar min syn och citerar en dokumentär som inte ger klarhet i diskussionen och jag bad dig att förtydliga.

Jag vet inte vad detta har med den ursprungliga diskussionen att göra.

Jag citerade inte fel.

Din syn på vad utvecklarna bakom C hade för planer, skiljer sig från vad jag har hört i 20 år.

Jag har alltid hört att målet med C är att hitta ett superenkelt språk som är är optimerat.

Permalänk
Medlem
Skrivet av heretic16:

Jag citerade inte fel.

Din syn på vad utvecklarna bakom C hade för planer, skiljer sig från vad jag har hört i 20 år.

Jag har alltid hört att målet med C är att hitta ett superenkelt språk som är är optimerat.

Framför behövde skaparna av C ett maskinnära språk för att skriva utilities till sitt nya Unix OS som gick att använda på små maskiner och gärna också vara effektivt.
Att det blev ett enkelt språk var till stor del för att de inte hade tid eller resurser till att utveckla ett mer komplett språk.
Mycket av de ursprungliga designbesluten bakom C kan hänföras till "det verkade som en bra ide just då" snarare än en genomtänkt plan.

För mer av historien bakom C så rekommenderar jag att läsa följande, skrivet av en av skaparna av C:
https://www.bell-labs.com/usr/dmr/www/chist.html