Varför måste man hela tiden snåla i C ?

Permalänk
Medlem

Ett alternativ till lat mjukvara är att välja en utvecklingsmiljö som som är effektiv för det program du utvecklar. Det finns en orsak till att man väljer att skriva vissa saker i C# och andra i Ruby eller Go. Det sämsta är dålig kod i en programmeringsmiljö med låg abstraktion, det kommer att ta mest energi att få ordning på det.

Permalänk
Medlem
Skrivet av kufra:

Inte för inte som assembler och C är de första man lär ut på universitet.

Nu läser jag förvisso elektroteknik och inte ren datateknik, men hittills (i tvåan) har vi bara skrivit Java.

Permalänk
Skrivet av heretic16:

Snålhet = heltalstyper

Att använda heltalstyper är inte snålhet. Flyttalstyper och heltalstyper används till olika saker.

Permalänk
Medlem
Skrivet av kufra:

Inte för inte som assembler och C är de första man lär ut på universitet.

Håller med föregående talare, på Chalmers börjar man t.ex. med Haskell:
TDA555 - Introduktion till funktionell programmering

  • Skriva små funktionella program för olika tillämpningar

  • Använda en grundläggande repertoar av programmeringstekniker i ett typat funktionellt språk, såsom modellering med datatyper, rekursion och användning av högre ordningens funktioner

  • Genomföra testning av små program med hjälp av lämpliga verktyg

Values, types, and functions. Compound data structures (lists, tuples, user-defined types). Top-down program design. Recursion and recursive types. Concept of time complexity, good and bad algorithms. Input-output. Modules, abstraction, interfaces, and specifications. Verification by testing and proof. Higher-order functions and bulk data operations.

Permalänk
Datavetare
Skrivet av beh:

Det sämsta är dålig kod i en programmeringsmiljö med låg abstraktion, det kommer att ta mest energi att få ordning på det.

Dålig C kod är rena drömmen att jobba med jämfört med dålig kod i språk som har implicita anrop (som ofta anses ha "högre" abstraktion), C++ är nog det skräckexempel som flest stöt på men det är möjlig att missbruka implicita anrop även i språk som C# och Scala. I projekt som innefattar väldigt många programmerare med väldigt varierande kunskapsnivå så vill man ha språk där alla anrop måste vara explicita för att undvika "smarta" saker som inte direkt syns. Java är OK även om autoboxing och finalizers är en form av implicta anrop, Java designades bl.a. för att ersätta C++ men ändå vara mycket enklare som språk. C, Go och Erlang saknar alla implicita anrop "by design" då de är framtagna för att användas i väldigt stora projekt (C saknar det även p.g.a. av sin ålder men man har aldrig ens funderat på att lägga till sådant stöd i C99 eller C11).

Till TS: "snålar" man på "rätt" sätt i C (framförallt C99 och senare där man kan allokera en dynamisk mängd utrymme på stacken) så kan man ofta förenkla eller helt eliminera minneshantering av temporära objekt/minnesareor. Sådana optimeringar förenklar inte bara koden utan gör även koden snabbare på en CPU-kärna och väldigt skalbar över flera CPU-kärnor (stacken är alltid "cache-hot" och orsakar i princip aldrig TLB-missar). Det är en typ av optimering man i princip bara kan utföra i C, C++ och Go.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd

Håller inte med dig här virtual void
I stora projekt måste man ha uppsatta ramar och regler för hur man jobbar i projektet. Om man använder implicita eller explicita pattern spelar ingen roll. Tex är jag ett stort fan av Convention over configuration där det mesta är implicit deklarerat via konventioner. Teamet måste helt enkelt veta hur ramverken de använder fungerar, detta ska dokumenteras och sedan uppföljas av en lead developer / arkitekt. Jag älskar distribuerade versionshanterare av just denna anledning då du får en naturlig code review vid merge till master

Visa signatur
Permalänk
Medlem

<hoppar till slutet>

Tycker att (nästan) alla mjukvaruutvecklar tjänar på att fatta hur mikroprocessorer och minne fungerar, och det exponeras rätt tydligt i ett lågnivåspråk som C.

Nej datorer har inte oändliga resurser och nej program blir inte bra i längden om du bara skriver på utan att tänka först vart du vill hamna, planera syftet och utförandet av ditt program.

Optimalt bör du titta både på hur CPUer funkar och även programmera dom någorlunda hårdvarunära. Sen kan du gå vidare till nästan vilket högnivåspråk som helst när du har basförståelsen.

/my 2c

Visa signatur

|[●▪▪●]| #Monster Battle Station(tm)#: Ryzen 3700X >-< GB-X570-AE >-< 32GB RAM >-< RTX 4070S >-< Crucial 2TB SSD |[●▪▪●]|

Permalänk
Medlem
Skrivet av Human_Metal:

Att använda heltalstyper är inte snålhet. Flyttalstyper och heltalstyper används till olika saker.

För att inte tala om hur mycket mer resurskrävande det är för maskinen att räkna med flyttal. Kanske inte om du gör PC program men om du går ner på simplare processorer typ C166..

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk
Medlem
Skrivet av Yoshman:

Dålig C kod är rena drömmen att jobba med jämfört med dålig kod i språk som har implicita anrop (som ofta anses ha "högre" abstraktion), C++ är nog det skräckexempel som flest stöt på men det är möjlig att missbruka implicita anrop även i språk som C# och Scala. I projekt som innefattar väldigt många programmerare med väldigt varierande kunskapsnivå så vill man ha språk där alla anrop måste vara explicita för att undvika "smarta" saker som inte direkt syns. Java är OK även om autoboxing och finalizers är en form av implicta anrop, Java designades bl.a. för att ersätta C++ men ändå vara mycket enklare som språk. C, Go och Erlang saknar alla implicita anrop "by design" då de är framtagna för att användas i väldigt stora projekt (C saknar det även p.g.a. av sin ålder men man har aldrig ens funderat på att lägga till sådant stöd i C99 eller C11).

Jo jag håller med dig och jag tror att det möjligen kommer av att många helt enkelt inte förstår de mer avancerade funktionerna i dessa språk (autoboxing, polymorphism, objektorientering etc.). Hur många har man inte mött som inte vet varför de skriver public och private före sina klasser och hur arv och objektorientering fungerar över huvud taget. Mycket FUD är det också, liknande "det fungerar om jag lägger alla mina class filer i c:\Program Files (x86)\Java\jdk1.6.0_05\bin" etc.