Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?
Isåfall tycker jag att du kan lägga fram dom argumenten som du hittar i videon som är fel, och lägger fram motargument. Istället för att gnälla om "wuääh videon är inte faktagranskad! min mamma måste godkänna allt jag tittar på wuääh!"
Du som började lägga vikt vid ordens innebörd noterade varken att jag sa att videon är "irrelevant" för ämnet minnessäkerhet och att jag använde "källkritisk" eftersom videon kan vara faktamässigt korrekt men vilseledande eller i detta faller irrelevant för diskussionen.
Finns intervjuer med Zuckerberg, kolla på dom. Vet inte om det var Joe Rogan som hostade dom. Men han har varit uppe i kongressen och vittnat också, där det också framkommit detaljer.
Jag tycker varken av dessa är bevis för något av det som du sagt.
Så är det inte alls. För att ta ett annat perspektiv vilket jag tror många utvecklare inom C++ också funderar över så handlar det generellt om denna nya ide om C++ och minnessäkerhet. Varför just amerikanska underrättelsetjänster går ut med det.
Det är som att förstöra möjligheter att utveckla bra mjukvara med ekosystemet och mängden kod som driver det mesta.
Om programmerare inte lär sig hantera minne kommer de heller inte klara och göra en hel massa som är viktigt för att få till en hel hög med olika lösningar
Tror ingen tvivlar på att man kan skriva bra mjukvara i C++. Det är ju inte samma sak som att man kanske bör undvika att skriva viss mjukvara i C++, håller du inte med? Exempelvis operativsystem, safety-relaterade saker (flygplan,bilar,tåg,medicinsk utrustning), generella webbservrar.
Jag har inga problem med C++ i exempelvis desktop-applikationer, system service:ar, spishällar(dvs icke-kritiska embeddedenheter), osv.
Tror kritiken mer kommer från faktumet att folk försöker använda C++ (och förändra det) till något det öht inte är designat för. Använd C# för C# grejer, använd C/C++ för C/C++ grejer, en hammare gör en spik, och en såg för en planka.
Vad anser du att C++ är designat för? Baserat på Stroustrups tidiga böcker ser jag inte något direkt fokus på prestanda. Första meningen i The C++ Programming Language är "C++ is a general purpose programming language designed to make programming more enjoyable for the serious programmer."
I The Design and Evolution of C++ listas "the fundamental aims of C++:
C++ makes programming more enjoyable for serious programmers.
C++ is a general-purpose programming language that
- is a better C
- supports data abstraction
- supports object-oriented programming"
Tittar vi på historien från C with Classes till det vi har i dagsläget så handlar det om att göra ett språk som är lättare att programmera i än C. Detta utan att man offrar effektiviteten hos C och bakåtkompatibiliteten som möjliggör systemprogrammering och direkt access till hårdvaran, men fokuset ligger ju på att ge abstraktionsmöjligheter som saknas i C. C++ har nu fått sällskap av flera andra imperativa språk med support för OOP. Vad skulle du säga en typisk C#-grej är och vad en typisk C/C++-grej är? Kan man inte tänka sig att C++, om ett par iterationer, skulle kunna bli så lättanvänt att man även kan lösa C#-grejer i C++ med en vettig arbetsinsats?
Baserat på guldkorn som "The language design task is to isolate the low-level features and render them unnecessary for code that doesn't deal directly with system details. The aim is to protect programmers against accidental misuse without imposing undue burdens." så tror jag att språket var tänkt även till andra saker än motocross och att "stödhjulen" faktiskt är helt i linje med de ursprungliga tankarna.
Sedan får jag väl hålla med om att det kan vara svårt att se någon verklig nytta med somliga nya språkfeatures. Men om C++-kommitén nu betraktar C++ som ett general-purpose-språk och vill göra språket mer användbart till olika saker så ser jag inga problem med lägga till saker så länge man slipper betala för det man inte använder. Vad är det för poäng med att ha ett programspråk som är svårt att använda? Det måste finnas enklare sätt att lära sig än genom trial and error. Jag får hålla med Yoshman här, om det handlar om någon form av organmätartävling varför skriver du inte direkt i assembler som riktiga karlar?
Tror ingen tvivlar på att man kan skriva bra mjukvara i C++. Det är ju inte samma sak som att man kanske bör undvika att skriva viss mjukvara i C++, håller du inte med? Exempelvis operativsystem, safety-relaterade saker (flygplan,bilar,tåg,medicinsk utrustning), generella webbservrar.
Jag håller verkligen inte med, tvärtom så när det är krav på säkerhet är det C++ som skall väljas men självklart behöver de som skriver koden behärska språket.
C++ i rätt händer är det säkraste som finns
Vad anser du att C++ är designat för? Baserat på Stroustrups tidiga böcker ser jag inte något direkt fokus på prestanda. Första meningen i The C++ Programming Language är "C++ is a general purpose programming language designed to make programming more enjoyable for the serious programmer."
I The Design and Evolution of C++ listas "the fundamental aims of C++:
C++ makes programming more enjoyable for serious programmers.
C++ is a general-purpose programming language that
- is a better C
- supports data abstraction
- supports object-oriented programming"
Tittar vi på historien från C with Classes till det vi har i dagsläget så handlar det om att göra ett språk som är lättare att programmera i än C. Detta utan att man offrar effektiviteten hos C och bakåtkompatibiliteten som möjliggör systemprogrammering och direkt access till hårdvaran, men fokuset ligger ju på att ge abstraktionsmöjligheter som saknas i C. C++ har nu fått sällskap av flera andra imperativa språk med support för OOP. Vad skulle du säga en typisk C#-grej är och vad en typisk C/C++-grej är? Kan man inte tänka sig att C++, om ett par iterationer, skulle kunna bli så lättanvänt att man även kan lösa C#-grejer i C++ med en vettig arbetsinsats?
Baserat på guldkorn som "The language design task is to isolate the low-level features and render them unnecessary for code that doesn't deal directly with system details. The aim is to protect programmers against accidental misuse without imposing undue burdens." så tror jag att språket var tänkt även till andra saker än motocross och att "stödhjulen" faktiskt är helt i linje med de ursprungliga tankarna.
Sedan får jag väl hålla med om att det kan vara svårt att se någon verklig nytta med somliga nya språkfeatures. Men om C++-kommitén nu betraktar C++ som ett general-purpose-språk och vill göra språket mer användbart till olika saker så ser jag inga problem med lägga till saker så länge man slipper betala för det man inte använder. Vad är det för poäng med att ha ett programspråk som är svårt att använda? Det måste finnas enklare sätt att lära sig än genom trial and error. Jag får hålla med Yoshman här, om det handlar om någon form av organmätartävling varför skriver du inte direkt i assembler som riktiga karlar?
Från början var C++ ett högnivå språk. Men det är från grunden och fortfarande ett lågnivåspråk i stil med C (jämfört med C# och andra nya varianter av språk)
I c++ hanterar du _alltid_ minnet i grunden själv. Alltid. Det finns hjälpmedel som kan hjälpa dig på vägen, men all officiell dokumentation som finns förtydligar hela tiden hur viktigt det är att ha stenkoll på vad som händer under huven när du använder dessa hjälpmedel. Nu har vi kommit till en punkt att alla dessa hjälpmedel snarare stjälper dig, eftersom att mängden information du måste hålla koll på för att göra allt rätt och by the book är så stor att det blir orimligt att kunna göra det, och det blir kontraproduktivt istället.
Bra C++ kodare skapar sina egna verktyg och hjälpmedel, och då sitter all denna information i ryggmärgen från början.
Vid detta laget bör man absolut använda ex. c# om man vill ha dessa hjälpmedel gratis, för då bryr man sig troligtvis inte om fördelarna med att göra saker by the book.
Kanske är jag mest inne på att man ska använda rätt verktyg för rätt jobb. I kombination med trenden att försöka göra en hammare (C++) till en såg (C#). Du kan vässa den där hammaren hur mycket du vill, men i slutändan kommer den fungera dåligt både som hammare och som såg.
Ett exempel från verkligheten:
På mitt dagsjobb så hanterar vi stora mängder data. Denna data måste samlas in snabbt, processerar snabbt (med en mängd tunga filter/annan signalprocessering), sparas snabbt, läsas snabbt, och rasteriseras snabbt.
När jag kom dit så hade vi ett par olika mjukvaror, som alla presterar riktigt dåligt. Koden var skriven i diverse högnivå språk, med skräckexempel som länkade listor av doubles för rådata som allokerades hit och dit överallt. I dessa mjukvaror så finns det fullt av laddningstider, buffringstider när man läser/rasteriserar data, och många vänt-tider på förprocessering. På high-end desktop PC.
Jag påbörjade en ny ersättningsmjukvara, där jag använder Dart/Flutter för UI, som funkar bra för sin sak, men sen har jag implementerat allt tungt lyftande i ett C bibliotek istället. Resultatet? Allting som den gamla mjukvaran gjorde på en highend PC, med långa väntetider, buffringstider och förprocesseringstider på flera minuter, körs nu istället helt i realtid på en midrange Android tablet, med 20-120 FPS (beroende på vad man gör och hur mycket processering som är inräknat).
Detta är en prestanda skillnad på flera storleksordningar.
Detta uppnådde jag genom att väldigt noggrant göra allting by the book, i C, där jag noggrant kontrollerar minnesaccess, allokeringar, hur cache fetchas, multitrådning osv osv.
Rätt verktyg för rätt arbete helt enkelt, med fenomenala resultat. Detta kanske är ett skräckexempel, men jag ser den här trenden överallt; lata programmerare som inte kunde bry sig mindre om att göra saker korrekt, och förlitar sig alldeles för mycket på högnivå hjälpmedel utan att bry sig om att förstå hur dom fungerar i grunden. Sen väljer dom ibland C++ för att "då blir det snabbare".
-- Och nu för att knyta an till topic: --
Vill du ha enkla hjälpmedel, inte behöva bry dig så mycket, och så vidare, så finns det INGEN anledning att använda C++ alls. Det blir så himla mycket bökigare. Använd för bövelen C# istället.
Och ska du använda C++, så snälla använd det för vad det faktiskt är bra på (och i mitt tycke vad det är designat för); Lågnivå programmering!!
När C++ kommitten nu frenetiskt arbetar för att försöka göra C++ till ett såntdär "enkelt högnivå språk", så blir det att dom sabbar språket istället. Och samtidigt uppmuntrar en destruktiv trend som spridit sig brett i industrin, och som förstör den; Lathet.
C++ kommitten borde skärpa till sig och arbeta för vad C++ faktiskt är istället, och ge oss bättre lågnivå verktyg (istället för värdelösa högnivå-abstraktioner som ger noll värde), mindre ambiguitet (istället för mer), simplifiera saker istället för att lägga till komplexitet (det är programmerarens uppgift).
Sen om du ändå vill plåga dig själv och använda C++ för lat programmering så be my guest, men du gör ingen en tjänst (och verkligen inte dig själv).
Vilka nya features i Modern C++ är då skadligt för prestanda och/eller försvårar nästan alltid hur svårt det blir att underhålla koden?
Exempel:
- std::unique_ptr + std::shared_ptr
- Move-semantik
- Lambda-uttryck
- algorithm.h: inklusive std::all_of, std::transform, std::accumulate, etc.
- constexpr + consteval
- std::span + std::array
- std::variant + std::visit
- std::atomic
- Concepts
- Coroutines
- Concepts
Bara en kommentar angående Concepts, den vart mycket lyckad. Har precis börjat använda concepts och förenklar samt möjliggör en hel del saker som kanske endast 3 personer (eventuellt några till men många är det inte) i världen behärskade med templates tidigare.
Kanske är jag mest inne på att man ska använda rätt verktyg för rätt jobb. I kombination med trenden att försöka göra en hammare (C++) till en såg (C#). Du kan vässa den där hammaren hur mycket du vill, men i slutändan kommer den fungera dåligt både som hammare och som såg.
Ett exempel från verkligheten:
På mitt dagsjobb så hanterar vi stora mängder data. Denna data måste samlas in snabbt, processerar snabbt (med en mängd tunga filter/annan signalprocessering), sparas snabbt, läsas snabbt, och rasteriseras snabbt.
När jag kom dit så hade vi ett par olika mjukvaror, som alla presterar riktigt dåligt. Koden var skriven i diverse högnivå språk, med skräckexempel som länkade listor av doubles för rådata som allokerades hit och dit överallt. I dessa mjukvaror så finns det fullt av laddningstider, buffringstider när man läser/rasteriserar data, och många vänt-tider på förprocessering. På high-end desktop PC.
Jag påbörjade en ny ersättningsmjukvara, där jag använder Dart/Flutter för UI, som funkar bra för sin sak, men sen har jag implementerat allt tungt lyftande i ett C bibliotek istället. Resultatet? Allting som den gamla mjukvaran gjorde på en highend PC, med långa väntetider, buffringstider och förprocesseringstider på flera minuter, körs nu istället helt i realtid på en midrange Android tablet, med 20-120 FPS (beroende på vad man gör och hur mycket processering som är inräknat).
Detta är en prestanda skillnad på flera storleksordningar.
Detta uppnådde jag genom att väldigt noggrant göra allting by the book, i C, där jag noggrant kontrollerar minnesaccess, allokeringar, hur cache fetchas, multitrådning osv osv.
Rätt verktyg för rätt arbete helt enkelt, med fenomenala resultat. Detta kanske är ett skräckexempel, men jag ser den här trenden överallt; lata programmerare som inte kunde bry sig mindre om att göra saker korrekt, och förlitar sig alldeles för mycket på högnivå hjälpmedel utan att bry sig om att förstå hur dom fungerar i grunden. Sen väljer dom ibland C++ för att "då blir det snabbare".
-- Och nu för att knyta an till topic: --
Vill du ha enkla hjälpmedel, inte behöva bry dig så mycket, och så vidare, så finns det INGEN anledning att använda C++ alls. Det blir så himla mycket bökigare. Använd för bövelen C# istället.
Och ska du använda C++, så snälla använd det för vad det faktiskt är bra på (och i mitt tycke vad det är designat för); Lågnivå programmering!!
När C++ kommitten nu frenetiskt arbetar för att försöka göra C++ till ett såntdär "enkelt högnivå språk", så blir det att dom sabbar språket istället. Och samtidigt uppmuntrar en destruktiv trend som spridit sig brett i industrin, och som förstör den; Lathet.
C++ kommitten borde skärpa till sig och arbeta för vad C++ faktiskt är istället, och ge oss bättre lågnivå verktyg (istället för värdelösa högnivå-abstraktioner som ger noll värde), mindre ambiguitet (istället för mer), simplifiera saker istället för att lägga till komplexitet (det är programmerarens uppgift).
Sen om du ändå vill plåga dig själv och använda C++ för lat programmering så be my guest, men du gör ingen en tjänst (och verkligen inte dig själv).
Är inte ditt "problem" egentligen att du använder C++ på ett sätt som faktiskt är långt mer lämpligt för C?
Det finns ju en rad tillämpningar C++ aldrig blivit speciellt populärt för, utan det är helt dominerat av C. Ett sådan exempel är OS-kärnor där det helt klart finns massor med anledningar varför man vill vara väldigt explicit med hur t.ex. minne hanteras.
Efter att jobbat med OS-kärnor under nästa två decennier håller jag med. När jag började kändes det lite "suger att inte kunna använda C++" (lärde mig C++ innan C, var ju mest assembler på Atari ST/Amiga tiden och det samt C++ "borde täcka allt" tänkte jag då), men med tiden blev det rätt klart att C är ett mycket bättre val.
Skulle också säga att en av de "värsta" C++ programmerarna nog är väldigt bra C programmerare som får för sig att skriva lite C++... Hur man bäst använder dessa två språk är rätt olika, och det har definitivt divergerat sedan "modern C++" äntrade scenen. Så förstår varför Bjarne, Herb m.fl. rätt surt brukar undrar vad det där C/C++ språket så många nämner är för något.
Om man förstår styrkorna och svagheterna just mellan C och C++, är då det känns så helt främmande att klaga på saker som smarta-pekare, STL, etc. Det är ju vad som gör C++ unikt från C och rätt använt kan dessa C++ finesser användas med samma prestanda man får i C, fast RAII gör att väldigt mycket av det som är explicit i C blir automatiskt i C++.
Det du beskriver ovan, "länkade listor av doubles för rådata som allokerades hit och dit överallt", är ju ett prestandahaveri oavsett språk. Givet alla år jag jobbat med C och C++ (och assembler, även om det är väldigt länge sedan nu) blev jag enorm positivt överraskad hur bra prestanda man kan få med t.ex. Go (är man I/O-bunden undrar jag vad som kan vara bättre idag). Jobbar med ett rätt stort embedded-projekt som historiskt garanterat skulle varit ett C++-projekt med C i botten, men som rullar hur bra som helst på en Orange Pi 5 (det skulle nog fungera även på en RPi 4, men någonstans där är gränsen).
Flera av de grundläggande tjänsterna är sådant som jag översatt från C till Go så vi kunde skriva 100 % Go. Och det är saker som ligger rätt mycket direkt på hårdvaran, bl.a. lågnivå kommunikation över CAN, SPI, I2C, RS485 där själva drivern så klart är i kärnan men all protokollhantering låg i C och nu görs i Go.
TL;DR är det inte rätt sak för rätt uppgift? Samt också att optimala är att göra något där det är "svårt att göra fel", istället för att bara ha något där det är "möjligt att göra rätt". Det sista är väl ändå rätt mycket lättare om man väljer något med så hög abstraktion som möjligt, men inte högre?
Vilka nya features i Modern C++ är då skadligt för prestanda och/eller försvårar nästan alltid hur svårt det blir att underhålla koden?
Exempel:
- std::unique_ptr + std::shared_ptr
- Move-semantik
- Lambda-uttryck
- algorithm.h: inklusive std::all_of, std::transform, std::accumulate, etc.
- constexpr + consteval
- std::span + std::array
- std::variant + std::visit
- std::atomic
- Concepts
- Coroutines
Vad som är svårt beror på vem du frågar och var dennes kunskap ligger.
Men om du pratar med programmerare som kan hårdvara (vilket man kan tycka de flesta programmerare borde kunna). Så skulle jag nog säga att
std::unique_ptr, std::span, std::array, std::variant och möjligen en del i algorithm.h som är tveksamt till att användas. Där tror jag många väljer att lösa det själva.
- Move-semantik, Lambda-uttryck, constexpr, consteval är bättre kompilatorer. Kompilatorn är ett viktigt verktyg för C++ utvecklare och att man kan nyttja detta verktyg bättre gynnar många.
- Ser man till stl där det gör nytta för många så de objekt som gör att utvecklare kan skriva plattformsoberoende kod, där är nyttan stor. Exempelvis är några delar i Boost väldigt användbara just på grund av att koden fungerar på olika operativsystem och hårdvara.
Personligen så gör jag skillnad på programmerare och kodare. Att bli kodare är inte så svårt, lära sig något språk och vad språket erbjuder i hjälp. Så är det med C++ också, man kan lära sig språket och dra nytta av STL och ibland lyckas få ihop något utan att vara programmerare.
För mig är en programmerare en person som förstår sig på hur datorer fungerar och kan skriva program. För dem är ett språk endast ett av alla verktyg som behövs för att skriva applikationer.
Är inte ditt "problem" egentligen att du använder C++ på ett sätt som faktiskt är långt mer lämpligt för C?
Det finns ju en rad tillämpningar C++ aldrig blivit speciellt populärt för, utan det är helt dominerat av C. Ett sådan exempel är OS-kärnor där det helt klart finns massor med anledningar varför man vill vara väldigt explicit med hur t.ex. minne hanteras.
Efter att jobbat med OS-kärnor under nästa två decennier håller jag med. När jag började kändes det lite "suger att inte kunna använda C++" (lärde mig C++ innan C, var ju mest assembler på Atari ST/Amiga tiden och det samt C++ "borde täcka allt" tänkte jag då), men med tiden blev det rätt klart att C är ett mycket bättre val.
Skulle också säga att en av de "värsta" C++ programmerarna nog är väldigt bra C programmerare som får för sig att skriva lite C++... Hur man bäst använder dessa två språk är rätt olika, och det har definitivt divergerat sedan "modern C++" äntrade scenen. Så förstår varför Bjarne, Herb m.fl. rätt surt brukar undrar vad det där C/C++ språket så många nämner är för något.
Om man förstår styrkorna och svagheterna just mellan C och C++, är då det känns så helt främmande att klaga på saker som smarta-pekare, STL, etc. Det är ju vad som gör C++ unikt från C och rätt använt kan dessa C++ finesser användas med samma prestanda man får i C, fast RAII gör att väldigt mycket av det som är explicit i C blir automatiskt i C++.
Det du beskriver ovan, "länkade listor av doubles för rådata som allokerades hit och dit överallt", är ju ett prestandahaveri oavsett språk. Givet alla år jag jobbat med C och C++ (och assembler, även om det är väldigt länge sedan nu) blev jag enorm positivt överraskad hur bra prestanda man kan få med t.ex. Go (är man I/O-bunden undrar jag vad som kan vara bättre idag). Jobbar med ett rätt stort embedded-projekt som historiskt garanterat skulle varit ett C++-projekt med C i botten, men som rullar hur bra som helst på en Orange Pi 5 (det skulle nog fungera även på en RPi 4, men någonstans där är gränsen).
Flera av de grundläggande tjänsterna är sådant som jag översatt från C till Go så vi kunde skriva 100 % Go. Och det är saker som ligger rätt mycket direkt på hårdvaran, bl.a. lågnivå kommunikation över CAN, SPI, I2C, RS485 där själva drivern så klart är i kärnan men all protokollhantering låg i C och nu görs i Go.
TL;DR är det inte rätt sak för rätt uppgift? Samt också att optimala är att göra något där det är "svårt att göra fel", istället för att bara ha något där det är "möjligt att göra rätt". Det sista är väl ändå rätt mycket lättare om man väljer något med så hög abstraktion som möjligt, men inte högre?
I yield. Ögonöppnande kommentar. Du har rätt.
C++ i sin nuvarande form fyller nog ganska bra en roll som språk mitt emellan C och C#.
Fick också helt plötsligt mycket mindre ångest över mitt hobbyprojekt (spelmotor) som, trots att den är väl skriven (i C++), inte alls är så "optimalt" skriven som den hade kunnat vara i C. Men det är nog okej.
Tack för dessa diskussioner!
Skulle också säga att en av de "värsta" C++ programmerarna nog är väldigt bra C programmerare som får för sig att skriva lite C++... Hur man bäst använder dessa två språk är rätt olika, och det har definitivt divergerat sedan "modern C++" äntrade scenen. Så förstår varför Bjarne, Herb m.fl. rätt surt brukar undrar vad det där C/C++ språket så många nämner är för något.
Det här behöver jag protestera mot. De absolut bästa C++ programmerarna är de som först lärt sig C och sedan gått över.
Går man rakt på C++ och försöker använda STL till allt utan att lära sig vad som händer ytan (vilket många låter bli), då förstår de inte och den koden dessa programmerare producerar är inte rolig med få undantag.
Satt nyligen i kod där det exempelvis fanns en std::tuple som hade över 30 objekt. Den används som någon form av lista utan att vara en lista med "smart" kompilator-teknik för att hämta respektive objekt. Självklart har det från början inte tänkt varit en sådan lösning men man kan trassla in sig något otroligt med cool C++ och sedan är det en mardröm att ta sig ur.
De som först lär sig C lär sig också hårdvara och förstår vad som sker även när de kodar C++ och risken för missbruk av stl och templates är inte alls lika stor. De väljer i princip alltid en enklare lösning vilket ofta fungerar utmärkt även om det kan bli något mer kod jämfört med "smart" C++ och de trasslar inte in sig lika lätt.
Förutom att inte missbruka C++ så de som lär sig jobba med minnet och kan ibland göra lösningar som förenklar och klarar saker där annat producerar mängder med kod. Att jobba direkt med minne är också ett mycket kraftfullt verktyg.
Det här behöver jag protestera mot. De absolut bästa C++ programmerarna är de som först lärt sig C och sedan gått över.
Går man rakt på C++ och försöker använda STL till allt utan att lära sig vad som händer ytan (vilket många låter bli), då förstår de inte och den koden dessa programmerare producerar är inte rolig med få undantag.
Satt nyligen i kod där det exempelvis fanns en std::tuple som hade över 30 objekt. Den används som någon form av lista utan att vara en lista med "smart" kompilator-teknik för att hämta respektive objekt. Självklart har det från början inte tänkt varit en sådan lösning men man kan trassla in sig något otroligt med cool C++ och sedan är det en mardröm att ta sig ur.
De som först lär sig C lär sig också hårdvara och förstår vad som sker även när de kodar C++ och risken för missbruk av stl och templates är inte alls lika stor. De väljer i princip alltid en enklare lösning vilket ofta fungerar utmärkt även om det kan bli något mer kod jämfört med "smart" C++ och de trasslar inte in sig lika lätt.
Förutom att inte missbruka C++ så de som lär sig jobba med minnet och kan ibland göra lösningar som förenklar och klarar saker där annat producerar mängder med kod. Att jobba direkt med minne är också ett mycket kraftfullt verktyg.
Att förstå minneshantering hjälper självklart. Det jag menar är att bra skriven C är inte idiomatiskt C++, vilket då också betyder att även om det är "bra C med lite C++ dialekt" är inte det bra C++ för det uppför sig inte och ser inte ut som "bra C++" borde göra.
Så om bra C programmerare, som inte ha koll på C++, är med i C++ projekt skriver de typiskt effektiv och fungerande kod men som med stor sannolikhet kommer göra de som är bra på C++ mindre effektiva.
"Satt nyligen i kod där det exempelvis fanns en std::tuple som hade över 30 objekt. "
Det har inget med bra/dålig C++ att göra. Går ju göra korkade saker även i C. Men just det du listar ovan är klart osannolikare att man gör i C, primärt då man redan från start fastnar i gyttja med att ens skapa sådana strukturer när allt behöver göras explicit.
Rätt använt är en sak som tuples (något C saknar) väldigt användbart. Men precis som nästan allt går det att missbruka.
Den i min mening viktigaste feature C++ har och C saknar är RAII. Använder man inte det (RAII är en kritisk del i STL, smarta pekare etc) bör man nog använda C i stället.
Specifikt RAII är ju "kopierat" in i en rad nyare språk, "using/IDispatch i C#", "defer i Go" och "Drop trait i Rust".
RAII är också en väldigt viktig komponent för att minska risken för det tråden handlar om, att skriva minnes-säkra program. Det är långt ifrån allt som behövs för att skriva minnes-säkra, men det är ett väldigt bra hjälpmedel.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Det här behöver jag protestera mot. De absolut bästa C++ programmerarna är de som först lärt sig C och sedan gått över.
Går man rakt på C++ och försöker använda STL till allt utan att lära sig vad som händer ytan (vilket många låter bli), då förstår de inte och den koden dessa programmerare producerar är inte rolig med få undantag.
Nu måste jag protestera. Vad menar du med "inte rolig"? Är det den genererade koden igen?
Jag håller med om att om man slentrianmässigt tänker i STL-containers, som list, vector och map, när man löser sina problem, blir det kanske inte optimala lösningar. Men å andra sidan, är dessa containers en central del av C++, alla kan använda dem och förstår vad som händer. De är bra hjälpmedel i jakten på en fungerande lösning som många kan förstå. Om du använder samma verktyg som alla andra blir det sannolikt lättare att förstå din lösning. Detta är i mina ögon långt viktigare än prestandan för den genererade koden.
Om lösningen visar sig inte vara tillräckligt snabb, då är det dags att optimera. Här kan det då vara praktiskt att ha en lättförståelig, fungerande lösning som referens när man optimerar och när man skall förklara för andra.
Att gå in med inställningen att allt måste vara supersnabbt är dålig hushållning med resurserna. Jag vet inte hur många gånger som magkänslan har varit helt ute och cyklat när exekveringstiden sprungit iväg. Man tycker att det borde vara en viss del av koden som går långsamt men profileringen visar att man spenderar tiden någon hel annanstans. Mät, och bränn krutet där det gör störst nytta.
De som först lär sig C lär sig också hårdvara och förstår vad som sker även när de kodar C++ och risken för missbruk av stl och templates är inte alls lika stor. De väljer i princip alltid en enklare lösning vilket ofta fungerar utmärkt även om det kan bli något mer kod jämfört med "smart" C++ och de trasslar inte in sig lika lätt.
Att ha förståelse för vad som händer under ytan hjälper helt klart när man skall skriva effektiva program. Men jag tvivlar på att det finns något direkt samband mellan kunskap om C och hårdvara. Vi kommer från en svunnen generation där vi satt och pulade med sin C64 eller Spectrum (Amiga eller Atari för er ungdomar ) och var intresserade av allting. Där utsattes man för BASIC, C, assembler och det som i dagsläget kallas hårdvarunära programmering. Är det kanske så att erfarna utvecklare väljer bättre lösningar, och de råkar både kunna C och vara intresserade av hårdvaran?
C exponerar lågnivådetaljer som typiskt är dolda i andra programmeringsspråk, men om du lärde dig C som ett general purpose-programmeringsspråk så är det variabler, villkor och loopar precis som i vilket annat språk som helst. Man får typiskt skriva mer komplexa saker för att hantera dynamiskt minne, men räcker det för att förmedla kunskaper om hårdvaran?
Jag blir lite nyfiken, varför väljer ni C++ framför ren C? Att du skriver "missbruk" av STL och templates antyder att du kanske kör lite STL.
Nu måste jag protestera. Vad menar du med "inte rolig"? Är det den genererade koden igen?
Här är en json parser från ett företag som ofta sponsrar C++ event, "think-cell". Ett tyskt företag och de är kända för att ha duktiga C++ programmerare.
Koden i länken är alltså bra C++, de är väldigt duktiga på att använda nytt i språket C++ så detta är alltså inget skräckexempel.
https://github.com/think-cell/think-cell-library/blob/main/tc...
Trots att detta är bra C++ hade jag i 10 fall av 10 valt en mer C anpassad parser med inslag av vettig funktionalitet i C++ för den typen av kod blir mycket enklare att läsa, debugga och hantera.
Störst problem med "C++ nördar" om jag kan uttrycka mig så är att de blir förälskade i språket. De förstår inte att ett programmerings språk endast är ett verktyg för att producera maskinkod och där är det mycket att tänka på för att få till en fungerande lösning. Exempelvis skriva kod som är lättläst, lätt att debugga, dokumenterad och så vidare
Här diskuteras "Contracts". Det är på gång i C++ och utan att själv gått djupare i det så vad jag förstår är det macrot "assert" men att det byggs in i språket och får mer funktionalitet.
Med detta sagt så glöms det ofta av hur mycket funktionalitet C/C++ har för att generera säker kod.
Exempelvis makrot "assert", ser jag någon kritisera säkerhet, man får se kod från personen och den inte har kod som granskar. Då vet man att vederbörande pratar i nattmössan.
assert är mycket viktigt, hade jag fått välja mellan att använda tester eller assert så är det ett lätt val. assert tar så mycket mer och utvecklare ser direkt när de gör fel. Krångligare kod så kan säkert ~30% av koden endast vara för att kontrollera.
Projektverktyg som CMake är också en skänk från ovan, CMake får ofta kritik för att det är för svårt/konstigt och det stämmer till viss del. Gissar att CMake byggdes för att hantera stora projekt och sedan konverterat till något som många använder. Nu har det blivit default.
CMake är dock mycket enklare idag jämfört med några år sedan. Det går till och med att debugga CMake kod i visual studio, går kanske i andra verktyg med.
Här får också ofta C++ kritik för att det är för komplicerat med att hantera projekt. De som kritiserar förstår inte att säkerhet kräver att man vet vad för typ av kod som används och hur. Att det är lätt att plocka in nya komponenter är inget som är bra för säkerhet.
CMake är heller inte språkberoende för C++ vilket gör att att man kan göra mycket runt om för projekt. Att CMake är så flexibelt är en styrka, inte en svaghet. De som kritiserar och att använder argumentet det är för svårt, tror jag inte förstår det.
Senaste nytt från Bjarne: Something simple, safe, flexible, and fast
Tipsar om den här blogposten, mycket bra text som går igenom dispyten inom linux där de prövar på att ha med RUST.
Texten går igenom varför det kan vara så svårt för programmerare med olika bakgrund och/eller kunskap att diskutera. Samt vad som fungerar och vad som inte gör det.
Rust doesn’t belong in the Linux kernel; it’s all about ideology
Senaste nytt från Bjarne: Something simple, safe, flexible, and fast
Tipsar om den här blogposten, mycket bra text som går igenom dispyten inom linux där de prövar på att ha med RUST.
Texten går igenom varför det kan vara så svårt för programmerare med olika bakgrund och/eller kunskap att diskutera. Samt vad som fungerar och vad som inte gör det.
Rust doesn’t belong in the Linux kernel; it’s all about ideology
Tycker båda dessa kastar bra ljus på verkliga problem. Men tycker också båda missar rätt uppenbara saker.
Börjar med Bjarne och C++ och hans slutkläm
"However, the evolutionary approach caused some serious problems. Many people got stuck with an outdated view of what C++ is. Today, we still see endless mentions of the mythical language C/C++, usually implying a view of C++ as a minor extension of C embodying all the worst aspects of C together with grotesque misuses of complex C++ features. Other sources describe C++ as a failed attempt to design Java. Also, tool support in areas such as package management and build systems have lagged because of a community focus on older styles of use."
Han har helt rätt, men är inte den uppenbara slutsatsen att en av C++ största styrkor är att så mycket kod idag redan är skriven i C++?
Men det medför också de typiska problemen med sådana ekosystem, som att det alltid kommer finnas många som tänker "Jag gör som jag alltid har gjort."
Frågan är alltså om rätt fokus för C++ verkligen är att försöka klämma in alla möjliga nya funktioner, och om man dessutom skulle börja jaga det så kallade "safe C++"-förslaget från ISO, vilket skulle förändra fundamentala aspekter av hur C++ fungerar. Samtidigt som det Bjarne beskriver ovan säkerställer att man aldrig kommer att nå den nivå av säkerhet som Rust erbjuder, även om man skulle lägga till motsvarande funktioner.
C/Rust-debatten inom Linux belyser ett liknande problem från ett annat perspektiv. Om man började skriva ett OS från scratch idag, skulle Rust – eller möjligen Zig (fast det borde nog nå version 1.0 först) – vara utmärkta alternativ. Rust börjar dessutom få ordentlig fart inom MCU-er och inbyggda system, vilket känns rimligt eftersom det är fullt realistiskt att ha hel-Rust-projekt där!
Linux är över 30 år gammalt och skrivet i C. Jag är inte en "boomer", men väl Gen X, och jag har nog aldrig sett något gott komma ur att man försöker använda fler än ett huvudspråk i ett projekt.
Linux är skrivet i C och bör nog förbli C-only. I userland lär vi däremot se (vilket är en positiv utveckling) att allt fler projekt går över till Rust. Men förhoppningsvis innebär det att man migrerar helt till Rust, snarare än att blanda språk.
Linux-kärnan är dock för stor för att migreras idag. Möjligen blir LLMs så avancerade att de kan genomföra en sådan migrering i framtiden – exakt så som DoD planerar att porta sina gigantiska C- och C++-kodbaser till Rust. Det ska bli extremt spännande att följa!
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Han har helt rätt, men är inte den uppenbara slutsatsen att en av C++ största styrkor är att så mycket kod idag redan är skriven i C++?
Om det är en styrka eller inte kanske går att tvista om men det är absolut en mycket viktig faktor.
Startas ett större projekt idag så väger den biten mycket tungt. Jag hade aldrig valt att använda de alternativ som finns för C/C++ om det är för ett större projekt.
Känner till några företag som börjat nosa på RUST, har för mig att bl.a. Volvo använder det men jag tror inte det flyter speciellt bra med tanke på deras förseningar.
Men det medför också de typiska problemen med sådana ekosystem, som att det alltid kommer finnas många som tänker "Jag gör som jag alltid har gjort."
Det här tror jag faktiskt stämmer mycket mer på andra språk jämfört med C eller C++. Min uppfattning om de som använder C eller C++ är att de vet exakt varför de måste använda det, det finns egentligen inte något alternativ. Man vet redan innan att det är svårare och det är svårt att hitta kompetens men måste ha en pragmatisk vinkel och därför behöver ta det ändå.
Har jobbat en del med C# utvecklare, fantastiskt svårt att diskutera teknik med många där. Där stämmer det enligt mig mycket bättre med "Jag gör som jag alltid har gjort.".
C/Rust-debatten inom Linux belyser ett liknande problem från ett annat perspektiv. Om man började skriva ett OS från scratch idag, skulle Rust – eller möjligen Zig (fast det borde nog nå version 1.0 först) – vara utmärkta alternativ. Rust börjar dessutom få ordentlig fart inom MCU-er och inbyggda system, vilket känns rimligt eftersom det är fullt realistiskt att ha hel-Rust-projekt där!
Här håller jag inte med och det är av två orsaker, alltså om man fått för sig att skriva ett nytt OS.
Rust har väl fortfarande endast en kompilator (LLVM), Zig tror jag har två (LLVM och någon egen). C++ har 3 som dominerar och två bra till (alla stödjer mer eller mindre det senaste i språket vilket inte är lite). C har väl över 100 kompilatorer.
Men för mig som ännu inte testat Rust var artikeln jag postade helt avgörande för jag kände inte till att så simpla saker som att göra en länkad lista är en utmaning i Rust.
Citerar artikeln (avsnittet Dead End):
I mentioned that initially I thought Rust was a good idea, in fact, in the previous article I wrote about it I still gave it the benefit of the doubt, however, it all changed when I tried to write a simple linked list, which turned out to be impossible.
Jag förstår precis vad Felipe Contreras (han som skrivit posten) menar. Att behärska minneshantering och få lov att göra vad man vill är ett fantastiskt verktyg. C programmerare kan detta. De vet hur mycket de kan göra genom att kontrollera minnet.
Detta är den största styrkan med C och de som inte lärt sig hantera minnet har svårt att förstå hur starkt detta är.
Det går aldrig att vinna över en kodare som vet hur man jobbar med minnet jämfört med andra kodare som skriver "säker" kod. Framförallt går det att skriva återanvändbara lösningar som helt krossar andra lösningar i effektivitet. Men har man aldrig lärt sig detta är det som hokus pokus, de förstår inte.
Andra citatet
When I discuss with Rust advocates and mention the fact that you can’t write a simple linked list like linux does (intrusive doubly circular linked list), they say two things 1) “yes you can” (untrue), and 2) “you shouldn’t want that”. Typical “it’s not happening and it’s a good thing that it is” responses.
The moment somebody tells me “you shouldn’t want that”, I stop using their software. Period.
Den reaktion Felipe Contreras beskriver här är helt logisk för C och C++ programmerare. Skulle någon använda argumentet "you shouldn’t want that" mot mig sett till hur vilka lösningar som går att göra, då har vederbörande dragit ner byxorna på sig själv. Jag skulle inte ens fortsätta argumentera för det är så dumt.
En duktig C programmerare som kan hantera minnet kommer springa cirklar kring utvecklare som försöker koda samma sak utan att direkt manipulera minnet.
Linux är skrivet i C och bör nog förbli C-only. I userland lär vi däremot se (vilket är en positiv utveckling) att allt fler projekt går över till Rust. Men förhoppningsvis innebär det att man migrerar helt till Rust, snarare än att blanda språk.
Absolut, efter att han läst in på C vs Rust i Linux så är det någon slutsats man kan dra så är det att inte blanda. C nördar kan inte diskutera med Rust nördar. Två olika världar.
Linux-kärnan är dock för stor för att migreras idag. Möjligen blir LLMs så avancerade att de kan genomföra en sådan migrering i framtiden – exakt så som DoD planerar att porta sina gigantiska C- och C++-kodbaser till Rust. Det ska bli extremt spännande att följa!
Här tror jag faktiskt på motsatsen. LLM verktyg är bäst för de som "vet vad de håller på med" om beskrivningen tillåts. Utvecklare som inte helt är med på vad som genereras kommer enligt mig att hamna i skiten ganska omedelbart. De vet inte när det är dags att bromsa eller de måste göra långsiktigt. Jag tror att det är vanligare att C programmerare vet vad de gör och LLM verktyg plockar också upp mönster snabbt. Bra struktur har bättre nytta av verktyget.
LLM kan självklart skriva en hel massa python eller för att inte ta webben, där kan man fråga nästan var som helst men det blir mycket duplicerad kod och det gäller att kunna rätta och/eller refaktorera.
Som jag tolkar det nu så fungerar LLM bättre för språk som C eller C++ jämfört med enklare språk när det gäller projekt som kan skala. Precis sett ett projekt skrivet i python som helt gick över styr, 4 utvecklare som satt ett halvår och fick slänga och göra om. De har lärt sig mycket, bl.a. att man måste skriva kod som går att underhålla.
Om det är en styrka eller inte kanske går att tvista om men det är absolut en mycket viktig faktor.
Startas ett större projekt idag så väger den biten mycket tungt. Jag hade aldrig valt att använda de alternativ som finns för C/C++ om det är för ett större projekt.
Känner till några företag som börjat nosa på RUST, har för mig att bl.a. Volvo använder det men jag tror inte det flyter speciellt bra med tanke på deras förseningar.
Jag har haft lyxen att jobba med två green-field projekt senaste åren. I båda fallen hade C++ varit det självklara valet om man backat bandet 20-25 år.
Skulle aldrig välja C++ i ett green-field projekt idag med mindre än att det skulle råka finnas något färdigt som löser 80-90 % direkt som bara är tillgängligt i C++.
I det ena fallet blev det Go, i det andra fallet blev det C# och i båda fallen kände jag hur otroligt mycket bättre de valen var än att sitta fast i C++. Det skrivet, Go har imponerat positivt på många sätt medan C# har förvånansvärt många foot-guns (men i det andra fallet var C++ och C# egentligen de enda två realistiska valen).
Det här tror jag faktiskt stämmer mycket mer på andra språk jämfört med C eller C++. Min uppfattning om de som använder C eller C++ är att de vet exakt varför de måste använda det, det finns egentligen inte något alternativ. Man vet redan innan att det är svårare och det är svårt att hitta kompetens men måste ha en pragmatisk vinkel och därför behöver ta det ändå.
Har jobbat en del med C# utvecklare, fantastiskt svårt att diskutera teknik med många där. Där stämmer det enligt mig mycket bättre med "Jag gör som jag alltid har gjort.".
Har jobbat med otroligt duktiga personer genom åren, men som ändå haft attityden: jag är för gammal för att orka lära om, tänker inte skriva i något annat än i C...
Men har absolut sett den attityden hos väldigt många, man har jobbat väldigt länge i samma språk/ramverk och ser den barriär det ändå är att välja något annat som "inte värt det". I antal stämmer det bättre på icke C eller C++ programmerare, fast är mer en funktion av att majoriteten av de man träffar idag använder andra språk än dessa två.
Här håller jag inte med och det är av två orsaker, alltså om man fått för sig att skriva ett nytt OS.
Rust har väl fortfarande endast en kompilator (LLVM), Zig tror jag har två (LLVM och någon egen). C++ har 3 som dominerar och två bra till (alla stödjer mer eller mindre det senaste i språket vilket inte är lite). C har väl över 100 kompilatorer.
En kompilator verkar fungera rätt bra, bara den som finns är tillräckligt bra. Linux fungerade under väldigt lång tid bara med GCC och inte sällan bara med speciella versioner av GCC. Idag är det också möjligt att också använda Clang/LLVM, men det stödet är relativt nytt.
Torvalds syn på C++ är inte nådig. En sak han bl.a. riktat eldkastaren mot är att "ingen" är kapabel att skriva en kompilator till det språket som har en stabilitet på nivån som krävs för en OS-kernel. Möjligen en hyperbol idag, men definitivt 100 % sant på 90-talet när Linux-projektet startade.
Har inte jobbat med kompilatorer, men väl med implementation standardbibliotek till C (specifikt C99) och C++ (C++11 samt C++14). Det senare är inte lätt att få till (gjordes till ett realtids-OS).
Men för mig som ännu inte testat Rust var artikeln jag postade helt avgörande för jag kände inte till att så simpla saker som att göra en länkad lista är en utmaning i Rust.
Citerar artikeln (avsnittet Dead End):
I mentioned that initially I thought Rust was a good idea, in fact, in the previous article I wrote about it I still gave it the benefit of the doubt, however, it all changed when I tried to write a simple linked list, which turned out to be impossible.
Jag förstår precis vad Felipe Contreras (han som skrivit posten) menar. Att behärska minneshantering och få lov att göra vad man vill är ett fantastiskt verktyg. C programmerare kan detta. De vet hur mycket de kan göra genom att kontrollera minnet.
Detta är den största styrkan med C och de som inte lärt sig hantera minnet har svårt att förstå hur starkt detta är.
Fast är inte det inte uppenbart att han är ute cyklar här? Länkad lista finns ju med i standardbiblioteket för Rust och kikar man på dess implementation så ser man: den är skriven i Rust!
Skrivit en del kernel kod, delvis till Linux, men främst till realtids OS (som likt Linux var 100 % C). Det finns väldigt bra förklaringar till varför länkade listor är så vanliga i OS och orsaken är ytterst sällan att "det är vad som ge bäst prestanda".
Här är den trista sanningen att kernel-programmerare inser hur mycket mer värt det är att ha något som är relativt enkelt och relativt snabbt. Specifikt, relativt enkelt givet de begränsningar man har när man skriver i C.
Det finns nästan ingen rationell anledning alls att använda en länkad lista någonstans, OS-kernel eller ej, om man använder Rust (eller ens om man använder C++, men "ingen" använder C++ för kernels). För Rust/C++ har finesser som gör det möjligt att använda bättre presterande datastrukturer utan att komplexiteten för de som använder systemet exploderar.
Ju mer latens och "IPC" begränsade CPUer bli, ju sämre idé är det att hålla på med datastrukturer som länkade listor.
Det går aldrig att vinna över en kodare som vet hur man jobbar med minnet jämfört med andra kodare som skriver "säker" kod. Framförallt går det att skriva återanvändbara lösningar som helt krossar andra lösningar i effektivitet. Men har man aldrig lärt sig detta är det som hokus pokus, de förstår inte.
Andra citatet
When I discuss with Rust advocates and mention the fact that you can’t write a simple linked list like linux does (intrusive doubly circular linked list), they say two things 1) “yes you can” (untrue), and 2) “you shouldn’t want that”. Typical “it’s not happening and it’s a good thing that it is” responses.
The moment somebody tells me “you shouldn’t want that”, I stop using their software. Period.
Den reaktion Felipe Contreras beskriver här är helt logisk för C och C++ programmerare. Skulle någon använda argumentet "you shouldn’t want that" mot mig sett till hur vilka lösningar som går att göra, då har vederbörande dragit ner byxorna på sig själv. Jag skulle inte ens fortsätta argumentera för det är så dumt.
En duktig C programmerare som kan hantera minnet kommer springa cirklar kring utvecklare som försöker koda samma sak utan att direkt manipulera minnet.
Han har ju fel om länkade listor och Rust, men samtidigt är svaret här: om du förstår minneshantering fattar du också varför länkad lista (nästan) aldrig kommer vara rätt val i Rust (eller C++), men varför det mycket väl kan vara rationellt i C.
Absolut, efter att han läst in på C vs Rust i Linux så är det någon slutsats man kan dra så är det att inte blanda. C nördar kan inte diskutera med Rust nördar. Två olika världar.
Här tror jag faktiskt på motsatsen. LLM verktyg är bäst för de som "vet vad de håller på med" om beskrivningen tillåts. Utvecklare som inte helt är med på vad som genereras kommer enligt mig att hamna i skiten ganska omedelbart. De vet inte när det är dags att bromsa eller de måste göra långsiktigt. Jag tror att det är vanligare att C programmerare vet vad de gör och LLM verktyg plockar också upp mönster snabbt. Bra struktur har bättre nytta av verktyget.
LLM kan självklart skriva en hel massa python eller för att inte ta webben, där kan man fråga nästan var som helst men det blir mycket duplicerad kod och det gäller att kunna rätta och/eller refaktorera.
Som jag tolkar det nu så fungerar LLM bättre för språk som C eller C++ jämfört med enklare språk när det gäller projekt som kan skala. Precis sett ett projekt skrivet i python som helt gick över styr, 4 utvecklare som satt ett halvår och fick slänga och göra om. De har lärt sig mycket, bl.a. att man måste skriva kod som går att underhålla.
Håller 100 % med om att C och Rust är två separata världar. Även om Go inte är lämpligt för att skriva kernels är just Go för mig det närmaste man kommer "modern C", och är nog därför jag gillar det språket så skarpt (jobbade med C-programmering under nästan 20 år, ser begränsningarna i C men gillar språket).
C++ och Rust får fightas om vilken av dessa som är det mest komplexa språk med någon form av popularitet som gjorts så här långt. C# designades (enligt Microsoft) som ett modernt C++, och även om det är betydligt lättare än C++ och Rust är det förvånansvärt komplex när man använder det för att skriva högpresterande kod (och då måste man bl.a. förstå hur det hanterar minne)...
Rust är lite motsatsen till Go för egen del: trodde jag skulle älska språket (och har kört ett greenfield projekt i Rust), inte minst då jag gillade C++ skarpt under 90/00-talen. Ser styrkorna hos Rust och skulle använda det i vissa lägen, men det är helt klart för komplext för sitt eget bästa (i min smak, många verkar ju trots allt älska språket).
Vad det gäller LLMs: för 2 år sedan var det vi har idag något man såg i Star Trek. Kanske kör vi fast, men skulle definitivt inte säga att det DoD ger sig på är omöjligt.
Gjorde advent of code i C++ någon av de tidiga åren. Testade innan jul att slänga in alla 25 lösningar i ChatGPT 4o med frågan: kan du skriva om det i Rust? Alla 25 dagarna fick forfarande rätt svar efter översättningen, det var i stort sätt lika snabbt + den hittade någon bug vid översättningen tack vare analys av vad Rust borrow-checker ställer för krav!
o3 är klart bättre än 4o på lite klurigare kodprylar, så det lär fungera ännu bättre idag att göra samma sak.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Jag har haft lyxen att jobba med två green-field projekt senaste åren. I båda fallen hade C++ varit det självklara valet om man backat bandet 20-25 år.
Skulle aldrig välja C++ i ett green-field projekt idag med mindre än att det skulle råka finnas något färdigt som löser 80-90 % direkt som bara är tillgängligt i C++.
Menar du att det inte finns färdiga bibliotek i C++, måste man alltid börja på 0
Finns massor att välja på om man inte vill skriva logiken själv.
I det ena fallet blev det Go, i det andra fallet blev det C# och i båda fallen kände jag hur otroligt mycket bättre de valen var än att sitta fast i C++. Det skrivet, Go har imponerat positivt på många sätt medan C# har förvånansvärt många foot-guns (men i det andra fallet var C++ och C# egentligen de enda två realistiska valen).
Givetvis skall man inte välja C++ om man saknar kompetensen, välj det utvecklarna behärskar.
Har jobbat med otroligt duktiga personer genom åren, men som ändå haft attityden: jag är för gammal för att orka lära om, tänker inte skriva i något annat än i C...
Varför skall de skriva om? Det är inte mycket som kan konkurrera med C idag
En kompilator verkar fungera rätt bra, bara den som finns är tillräckligt bra. Linux fungerade under väldigt lång tid bara med GCC och inte sällan bara med speciella versioner av GCC. Idag är det också möjligt att också använda Clang/LLVM, men det stödet är relativt nytt.
Är du säker på det, skall inte Linux gå och kompilera på en hel hög med olika processorer och därför måste köra C
Torvalds syn på C++ är inte nådig. En sak han bl.a. riktat eldkastaren mot är att "ingen" är kapabel att skriva en kompilator till det språket som har en stabilitet på nivån som krävs för en OS-kernel. Möjligen en hyperbol idag, men definitivt 100 % sant på 90-talet när Linux-projektet startade.
Hade heller inte valt C++ för operativsystem. Med så många deltagare och att släppa lös C++ programmerare blir det snabbt extremt svårt att tolka koden. C++ kräver extrem disciplin.
Fast är inte det inte uppenbart att han är ute cyklar här? Länkad lista finns ju med i standardbiblioteket för Rust och kikar man på dess implementation så ser man: den är skriven i Rust!
Vad han gjorde var att välja den enklaste han kunde hitta och det var tydligen problem. Jag vet inte hur andra gör i Rust men sökte lite och det såg inte ut som att det var lätt. Och läs vad han skriver angående hur lätt det är i C++ att lägga på heapen eller på stacken. Det samt att styra vad som sätts (har för mig att Rust alltid sätter pekare till null).
Det finns nästan ingen rationell anledning alls att använda en länkad lista någonstans, OS-kernel eller ej, om man använder Rust (eller ens om man använder C++, men "ingen" använder C++ för kernels). För Rust/C++ har finesser som gör det möjligt att använda bättre presterande datastrukturer utan att komplexiteten för de som använder systemet exploderar.
Det är möjligt men det finns användning för en hel hög med andra strukturer i alla fall. Och de kan vara betydligt mer invecklade än en länkad lista.
Han har ju fel om länkade listor och Rust, men samtidigt är svaret här: om du förstår minneshantering fattar du också varför länkad lista (nästan) aldrig kommer vara rätt val i Rust (eller C++), men varför det mycket väl kan vara rationellt i C.
Som sagt, jag vet inte vad som passar i deras miljö men jag tror de har koll på vad som fungerar bäst.
Håller 100 % med om att C och Rust är två separata världar. Även om Go inte är lämpligt för att skriva kernels är just Go för mig det närmaste man kommer "modern C", och är nog därför jag gillar det språket så skarpt (jobbade med C-programmering under nästan 20 år, ser begränsningarna i C men gillar språket).
Har inte Go en GC? Allt med GC går bort omedelbart för mig. Så slött, men självklart så behövs inte prestanda eller att man kan slösa på minne så spelar det mindre roll
C++ och Rust får fightas om vilken av dessa som är det mest komplexa språk med någon form av popularitet som gjorts så här långt.
Efter att följt en del diskussion och granskat mer hur de resonerar så kan jag säga att C och Rust inte kan jobba ihop. De är för olika och jag tror faktiskt att Rust har sett sina glansdagar eller snart ser det. Därmed inte sagt att språket inte kommer användas för jag tror många småprojekt kommer köras med Rust. Men den attityden de har och hur språket fungerar gör att de aldrig kommer klara att hantera större projekt.
Menar du att det inte finns färdiga bibliotek i C++, måste man alltid börja på 0
Finns massor att välja på om man inte vill skriva logiken själv.
Lite otydligt, menar att "om det inte finns färdiga bibliotek som löser det projektet är satt att lösa till 80-90 %". Finns ju en lång rad (mindre) projekt där merjobbet är rätt minimalt, men även här har jag haft lyxen att primärt jobba med saker som krävt väldigt stora arbetsinsatser och där är det mer värdefullt med grundläggande bibliotek av riktig hög kvalité.
Finns ju väldigt många bibliotek av hög kvalité, i fallet C++ är den lite trista sanningen att väldigt många är C-bibliotek vilket nog är en (av många) orsaker till det resultat Bjarne uttrycker frustration för: man använder inte potentialen i C++, än mindre potentialen i "modern C++" för de saker som ändå är C++ (eller mer vanligt, har en OK C++ wrapper runt ett C-bibliotek) är rätt sällan uppdaterade till "modern C++".
Givetvis skall man inte välja C++ om man saknar kompetensen, välj det utvecklarna behärskar.
Det är en viktig parameter, i mitt fall föll valet på annat än C++ trots att de som ingår alla är mycket erfarna C++-programmerare.
Varför skall de skriva om? Det är inte mycket som kan konkurrera med C idag
Har genom åren nog kunnat jobba med ovanligt många greenfield projekt. Så självklart var referensen här "ett projekt/produkt startas från scratch vilket bl.a. gör saker som språkval mer öppet".
I många fall stod valet i praktiken mellan C eller C++, precis som C vs Rust har jag uppfattat det som att det finns en icke-försumbar andel C-programmerare som ser med C++ med avsky. En del för de inte kan C++, en del för att de kan tillräckligt mycket för att säga "det där är löjligt komplext".
Är du säker på det, skall inte Linux gå och kompilera på en hel hög med olika processorer och därför måste köra C
Ja är 100 % säker att det under de i alla fall under de första 20 åren var så. Linux-kärnan var (gissar är) beroende av flertalet GCC-specifika utökningar. Orsaken att just Clang fungerar är att man implementerat dessa utökningar även där (har hyfsad koll på Clang då det var underliggande kompilatorn när jag jobbade med C99, C++11 och C++14 standardbibliotek).
Vad han gjorde var att välja den enklaste han kunde hitta och det var tydligen problem. Jag vet inte hur andra gör i Rust men sökte lite och det såg inte ut som att det var lätt. Och läs vad han skriver angående hur lätt det är i C++ att lägga på heapen eller på stacken. Det samt att styra vad som sätts (har för mig att Rust alltid sätter pekare till null).
Han visar just hur svårt det är att göra rätt i C... Hans exempel är korrekt när hans "person" typ är globalt deklarerad, den har inslag av UB när den används ihop med heap/automatiska variabler. Sådana misstag kompilerar inte i Rust!!!
Det är möjligt men det finns användning för en hel hög med andra strukturer i alla fall. Och de kan vara betydligt mer invecklade än en länkad lista.
Absolut, men just länkad lista verkar vara oproportionerligt komplicerat att implementera i Rust (std-lib versionen är ~2000 rader).
Fast det är inte det viktiga här, även om det är svårt att implementera är det hanterbart då det görs en gång. Det som gör länkad lista i stort sätt poänglös i de flesta språk är att andra, under huven potentiellt långt mer komplicerade, datastrukturer är att de typiskt inte är svårare att använda än andra containers. I C läcker tyvärr ofta sådan komplexitet ut till den som använder det hela alt. så blir prestanda lidande.
C saknar rätt mycket det som brukar kallas "zero overhead abstractions" i C++/Rust.
Har inte Go en GC? Allt med GC går bort omedelbart för mig. Så slött, men självklart så behövs inte prestanda eller att man kan slösa på minne så spelar det mindre roll
Go har en GC. Rust hade också initialt en GC och med en sådan hade det varit ett långt enklare språk.
En GC uteslutet vissa use-case, men för den som kan sin minneshantering och sina lock-free/wait-free algoritmer vet också att om man vill optimera för multicore så är ofta en GC ett krav för riktigt bra prestanda/skalbarhet.
Linux, likt de flesta moderna OS, har för sina avancerade multicore optimerade algoritmer "tillräckligt mycket" av en GC för att hantera ABA-problemet. Att ha inbyggd GC gör tröskeln att, korrekt, använda multicore betydligt lägre.
Men det är inte styrkan i Go. Dess styrka ligger i dels hur enkelt det är att lära sig (enklare än C och långt enklare än C++/Rust) samt i fall där primära flaskhalsen är I/O och inte compute. Saker som boost::asio är sådant man använder för att att man är fast med C++, inte för att det skulle vara en nära den bästa lösningen på problemet.
Efter att följt en del diskussion och granskat mer hur de resonerar så kan jag säga att C och Rust inte kan jobba ihop. De är för olika och jag tror faktiskt att Rust har sett sina glansdagar eller snart ser det.
Därmed inte sagt att språket inte kommer användas för jag tror många småprojekt kommer köras med Rust. Men den attityden de har och hur språket fungerar gör att de aldrig kommer klara att hantera större projekt.
Likt C++ är/kommer Rust största hinder för bred acceptans vara dess brutala komplexitet. Sett lite olika bud på hur lång tid det tar för någon att blir "produktiv" i Rust. De som säger "minst ett halvår" är nog knappast pessimister, fast är det egentligen mindre för C++?
C++ är på dekis sett till användning. Rust har definitivt hinder framför sig, men flera av de riktigt stora IT-jättarna verkar ju gå mot att föredra "minnessäkra" språk. Tror aldrig C++ i praktiken kommer nå dit och tror det är ett misstag av C++-ISO kommittén pusha språket i den riktningen.
Även om "safe-C++" förslaget skulle gå igenom, tror någon att existerande kodbaser kommer skrivas om? För om man gjorde det, varför välja C++ överhuvudtaget?
Huruvida trycket mot "minnessäkra" språk kommer göra Rust stort återstår att se. För är bara om man behöver C, C++ och Rust nivå på "compute-efficiency" som det inte finns alternativ. C# och JVM-språken är rätt nära (om man hanterar minne rätt), språk som Go är minst lika bra om flaskhalsen istället är I/O.
Jag tror aldrig Rust blir ett dominerande språk, men det kan mycket väl vara större än C++ inom ett decennium.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
C++ är på dekis sett till användning. Rust har definitivt hinder framför sig, men flera av de riktigt stora IT-jättarna verkar ju gå mot att föredra "minnessäkra" språk. Tror aldrig C++ i praktiken kommer nå dit och tror det är ett misstag av C++-ISO kommittén pusha språket i den riktningen.
Jag tror IT jättar håller på att tänka om eller i vart fall måste de förändra sin affärsmodell. Det har framförallt att göra med AI men även att det är nytt styre i USA. De har kunnat leva gott på att IT varit ett oligopol. Saker som DEI håller på att läggas ner.
Den nya administrationen i USA verkar vara inriktad på marknadslösningar så gissningsvis blir det ändringar. Flera IT jättar har redan börjat ändra om.
C++ har alltid varit på “dekis” ändå så om man skulle ta ett genomsnitt av all maskinkod som körs på datorer är förmodligen över 90% kompilerad C/C++ kod. Det läggs mycket mankraft på resterande 10% och det har och göra med att där sker konvertering från data anpassad för datorer till människor.
C++ är inte ett språk för alla, språket är inte gjort för att vara lätt. C och C++ är optimerade verktyg för att klara av och bygga exakt det utvecklare vill bygga och göra det så bra som möjligt.
Allt sådant här tar tid att lära sig, många projekt som kraschar eftersom så få utvecklare kan bygga större system. En frustration många C++ programmerare ofta känner och därför bara struntar i att ta diskussionen.
"nya" utvecklare som precis löst sina först grejer och plötsligt tror de kan skriva vad som helst, hur många har inte varit med om det? De måste sätta sig i skiten innan de fattar att det tar lång tid att bli duktig, att lära sig ett eller några språk är den enkla biten.
De allra flesta lär sig aldrig och kanske heller inte behöver för majoriteten av all utveckling handlar om att underhålla system.
Flera stora företag i Sverige har riktigt dyra och stora projekt som kraschat på grund av ledningen inte förstått hur man skriver system.
Känner själv till flera och några som är på väg.
Men för att ta ett äldre system så man inte avslöjar företagshemligheter
Sök på EHPT, stort företag samägt mellan Ericsson och HP, 3000 anställda och gjorde system för växelsystem till mobiler.
I slutet på 1990 talet vart java väldigt poppis, allt skulle bli objektorienterat. EHPT beslöt att skriva sitt nya system i java istället för C som befintligt system var gjort i. Mycket pengar investerades och man höll på att utveckla i knappt 3 år om jag minns rätt. Några utvecklare ( alla falll en, en vän till mig ) som satt där som konsult förstod efter några månader för han kom in senare, att projektet höll på att haverera. Prestanda var inte i närheten av vad de måste klara av och java är segt som sirap.
Han försökte ta upp det med ledning men de vägrade lyssna. Många chefer med hög lön som inte kan utveckla, låg mycket prestige i beslut. De kan inte backa. Företaget gick i konkurs och anställda hade turen att de kunde gå över till Ericsson.
Känner till flera liknande även om EHPT kanske är det största i Sverige som konkade. Volvo Car har mega problem, de har köpt in nya företag för det är för tungt att byta kunskap när så många är rädda om sina jobb. Deras smala lycka är att andra bilföretag har samma problem.
Ericsson är hyffsat duktiga idag, de hade flera kraschade projekt i början på 2000 talet där de lärde sig mycket. Men det är tufft att hitta kompetens.
Personligen tror jag att om det skulle komma något bättre än C/C++ hade en majoritet bytt ganska omedelbart om de inte sitter i kod som behöver underhållas. Erfarna programmerare där är pragmatiska. De kan också snabbt se om ett språk är värt att titta på. Nästan alla "nyare" språk har byggt in hinder som de marknadsför som features, alltså bra grejer. Där reagerar många erfarna precis tvärtom, det blir stora hinder.
Dom flesta har nog inte missat den ganska infekterade rust-situationen i Linux. Men tycker Greg Kroah-Hartman senaste uttalande var rätt relevant för den här diskussionen om problem med minnessäkerhet eller då "icke-problem" i C (oavsett vad man tycker om Rust i linux-kärnan):
"As someone who has seen almost EVERY kernel bugfix and security issue for the past 15+ years (well hopefully all of them end up in the stable trees, we do miss some at times when maintainers/developers forget to mark them as bugfixes), and who sees EVERY kernel CVE issued, I think I can speak on this topic.
The majority of bugs (quantity, not quality/severity) we have are due to the stupid little corner cases in C that are totally gone in Rust. Things like simple overwrites of memory (not that rust can catch all of these by far), error path cleanups, forgetting to check error values, and use-after-free mistakes. That's why I'm wanting to see Rust get into the kernel, these types of issues just go away, allowing developers and maintainers more time to focus on the REAL bugs that happen (i.e. logic issues, race conditions, etc.)"
Jag tror IT jättar håller på att tänka om eller i vart fall måste de förändra sin affärsmodell. Det har framförallt att göra med AI men även att det är nytt styre i USA. De har kunnat leva gott på att IT varit ett oligopol. Saker som DEI håller på att läggas ner.
Den nya administrationen i USA verkar vara inriktad på marknadslösningar så gissningsvis blir det ändringar. Flera IT jättar har redan börjat ändra om.
Kan du ge exempel? För tvivlar att Google, Microsoft, Meta och liknande baserade sin ställningstagande här på om presidenten var Dem eller Rep...
Microsoft trummar på med sin storskaliga övergång till Rust, med tanke på att din spaning ovan var att "det kanske används i småprojekt". Google har bl.a. skrivit om sin sök-backend från C++ till Go.
I fallet Microsoft är det intressant att de nu också börjar kika på att skriva om vissa C#-kodbaser. C# räknas ändå som "minnes-säkert" av t.ex. America's Cyber Defence Agency. Men som jag skrev ovan, även om C# är en förbättring över C++ m.a.p. minnesäkerhet och komplexitet är det fortfarande ett av de mer komplexa språken med, för mig, förvånansvärt många foot-guns.
https://www.techzine.eu/news/devops/116080/microsoft-continue...
C++ är inte ett språk för alla, språket är inte gjort för att vara lätt. C och C++ är optimerade verktyg för att klara av och bygga exakt det utvecklare vill bygga och göra det så bra som möjligt.
Vilket gjorde C++ helt unikt under många många år! Men senaste 10-20 åren har vi fått rätt många andra språk/miljöer som har visat sig väldigt starka, ofta i lite mer nischade områden men det har bl.a. gjort C++ lite mer av en "Jack-of-all-trades-master-of-none".
Likt hur det finns vissa designval i Fortran som gjort det lättare att skriva kompilatorer som ger väldigt bra prestanda inom vissa matematiska områden (vilket är en stor förklaring till varför Fortran är relevant i HPC än idag) finns det designval i Rust som möjliggör vissa optimeringar där som inte är möjliga i C eller C++. Rust är unikt i att det på alla relevanta har lika låg overhead som C++, men det ger samtidigt en lång rad garantier som vi bara haft i "högnivåspråk" tidigare. Ovanpå det har Rust några helt unika egenskaper, som att data-races ger kompileringsfel i safe-Rust.
Allt sådant här tar tid att lära sig, många projekt som kraschar eftersom så få utvecklare kan bygga större system. En frustration många C++ programmerare ofta känner och därför bara struntar i att ta diskussionen.
"nya" utvecklare som precis löst sina först grejer och plötsligt tror de kan skriva vad som helst, hur många har inte varit med om det? De måste sätta sig i skiten innan de fattar att det tar lång tid att bli duktig, att lära sig ett eller några språk är den enkla biten.
De allra flesta lär sig aldrig och kanske heller inte behöver för majoriteten av all utveckling handlar om att underhålla system.
Då flera undersökningar pekar på samma sak, ca 60-70 % av säkerhetsproblem i C och C++ kod kommer från misstag som de flesta "minnessäkra" språk skulle fånga (blir typiskt en krasch istället för ett säkerhetshål, så ändå en bug): är det bara en "skill issue" eller borde man kanske fråga sig "är C och/eller C++ rätt val för de problemen?".
Sök på EHPT, stort företag samägt mellan Ericsson och HP, 3000 anställda och gjorde system för växelsystem till mobiler.
I slutet på 1990 talet vart java väldigt poppis, allt skulle bli objektorienterat. EHPT beslöt att skriva sitt nya system i java istället för C som befintligt system var gjort i. Mycket pengar investerades och man höll på att utveckla i knappt 3 år om jag minns rätt. Några utvecklare ( alla falll en, en vän till mig ) som satt där som konsult förstod efter några månader för han kom in senare, att projektet höll på att haverera. Prestanda var inte i närheten av vad de måste klara av och java är segt som sirap.
Han försökte ta upp det med ledning men de vägrade lyssna. Många chefer med hög lön som inte kan utveckla, låg mycket prestige i beslut. De kan inte backa. Företaget gick i konkurs och anställda hade turen att de kunde gå över till Ericsson.
Känner till flera liknande även om EHPT kanske är det största i Sverige som konkade. Volvo Car har mega problem, de har köpt in nya företag för det är för tungt att byta kunskap när så många är rädda om sina jobb. Deras smala lycka är att andra bilföretag har samma problem.
Ericsson är hyffsat duktiga idag, de hade flera kraschade projekt i början på 2000 talet där de lärde sig mycket. Men det är tufft att hitta kompetens.
Sökte och fick tillbaka att det var ett system som är (ö)känt för sitt misslyckade. Men stod också att endast vissa front-end och webb-delar var skrivet i Java. Den större delen verkar ha varit skrivet i C++ samt en del av de drift-kritiska delarna använder Erlang.
Hade inte hört talas om det innan, men som stor C++ evangelist på 90/00-talet har jag hört talas om ett annat Ericsson-projekt många gånger. Det från folk som jobbat med AXE-N under 90-talet och väldigt ofta som exempel på "man ska hålla sig till C, för Ericsson försökte med storskalig C++ och det gick inget vidare".
Har själv aldrig jobbat på Ericsson, så kan inte säga hur relevant ovan är och samtidigt kan man ju peka på en rad väldigt framgångsrika C++ projekt genom tiderna som visar att det är möjligt att skriva väldigt framgångsrika saker med språket.
Reflekterar jag tillbaka över allt jag sett under åren har det varit klart vanligare med "WTF!" tanke när man sett många C++ projekt samtidigt som de flesta "oh, det här var riktigt elegant" har betydligt oftare varit i C. Men vet inte om man ska dra så stora växlar på det om man jobbat med kernel-utveckling (C-kod) väldigt många år där då C++ koden då var applikationer samt test-kod. Kernel-kod i ett OS som är certifierad för säkerhetskritiska applikationer tenderar nog ha rätt hög nivå.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Dom flesta har nog inte missat den ganska infekterade rust-situationen i Linux. Men tycker Greg Kroah-Hartman senaste uttalande var rätt relevant för den här diskussionen om problem med minnessäkerhet eller då "icke-problem" i C (oavsett vad man tycker om Rust i linux-kärnan):
"As someone who has seen almost EVERY kernel bugfix and security issue for the past 15+ years (well hopefully all of them end up in the stable trees, we do miss some at times when maintainers/developers forget to mark them as bugfixes), and who sees EVERY kernel CVE issued, I think I can speak on this topic.
The majority of bugs (quantity, not quality/severity) we have are due to the stupid little corner cases in C that are totally gone in Rust. Things like simple overwrites of memory (not that rust can catch all of these by far), error path cleanups, forgetting to check error values, and use-after-free mistakes. That's why I'm wanting to see Rust get into the kernel, these types of issues just go away, allowing developers and maintainers more time to focus on the REAL bugs that happen (i.e. logic issues, race conditions, etc.)"
Han gör ju rätt mycket exakt samma reflektion som t.ex. Microsoft
https://msrc.microsoft.com/blog/2019/07/a-proactive-approach-...
"~70% of the vulnerabilities Microsoft assigns a CVE each year continue to be memory safety issues"
och Google
https://www.chromium.org/Home/chromium-security/memory-safety...
"Around 70% of our high severity security bugs are memory unsafety problems (that is, mistakes with C/C++ pointers). Half of those are use-after-free bugs."
Blir rätt mycket "Dune sandworm" beteenden om man bara hävdar "skill issue" på problem som aldrig verkar riktigt bli bättre och som det idag till stor del finns (automatiska) lösningar på.
Jag tror C++ ISO-kommittén känner att de är "between a rock and a hard place" kring vilken väg man bör ta framåt. Bjarnes drömscenario känns lite naivt, tycker han lite väl mycket bara anser "de flesta problem skulle inte finnas bara folk kunde följa våra guidelines och använda senaste C++ standarden".
Men tror inte heller safe-C++ förslaget är rätt väg. Kan absolut ha missförstått det, är vad jag förstår det största/längsta förslag någonsin och det har rätt stor påverkan på hur man bör skriva C++. Man implementerar rätt mycket Rust borrow-checker i C++, fast det kommer bli opt-in istället för opt-out som i Rust, och givet Bjarnes frustration har vi kanske facit på hur bra det kommer gå...
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Han gör ju rätt mycket exakt samma reflektion som t.ex. Microsoft
https://msrc.microsoft.com/blog/2019/07/a-proactive-approach-...
"~70% of the vulnerabilities Microsoft assigns a CVE each year continue to be memory safety issues"
och Google
https://www.chromium.org/Home/chromium-security/memory-safety...
"Around 70% of our high severity security bugs are memory unsafety problems (that is, mistakes with C/C++ pointers). Half of those are use-after-free bugs."
Blir rätt mycket "Dune sandworm" beteenden om man bara hävdar "skill issue" på problem som aldrig verkar riktigt bli bättre och som det idag till stor del finns (automatiska) lösningar på.
Jag tror C++ ISO-kommittén känner att de är "between a rock and a hard place" kring vilken väg man bör ta framåt. Bjarnes drömscenario känns lite naivt, tycker han lite väl mycket bara anser "de flesta problem skulle inte finnas bara folk kunde följa våra guidelines och använda senaste C++ standarden".
Men tror inte heller safe-C++ förslaget är rätt väg. Kan absolut ha missförstått det, är vad jag förstår det största/längsta förslag någonsin och det har rätt stor påverkan på hur man bör skriva C++. Man implementerar rätt mycket Rust borrow-checker i C++, fast det kommer bli opt-in istället för opt-out som i Rust, och givet Bjarnes frustration har vi kanske facit på hur bra det kommer gå...
Microsoft kan väll börja anställda erfarna programmerare istället för att anställda nyexaminerade?
Jag tror deras "vulnerabilities" skulle sjunka från 70% till 20% direkt.
Att anställda folk som inte kan koda, eller inte kan göra medvetet fel, är också en risk.
Jag har kodat mycket i C och C++ och jag har aldrig riktigt känt att minnesläckage är ett problem. Man märker när det drar minne när man debuggar liksom.
Det jag gör är att jag bara aktiverar flaggan AddressSanitizer och därmed så kan jag avgöra om jag har buggar, minnesläckage eller bryter mot arrayernas element. Ja allt.
Så jag skulle säga att C++ och C är som språk inga "minnessäkra" språk. Men med lite smarta verktyg så som en riktigt IDE (Visual Studio, Eclipse, QT Creator, JetBrains etc...) + lite känsla för programmering, och inte något hocus pocus bluff som Emcas, vim eller VS Code eller andra notepads. Då kan man programmera minnessäkert.
Microsoft kan väll börja anställda erfarna programmerare istället för att anställda nyexaminerade?
Jag tror deras "vulnerabilities" skulle sjunka från 70% till 20% direkt.
Jag tror att du också är kapabel till att förstå att företag inte enbart kan rekrytera seniora utvecklare. Vidare, jag har stött på seniora utvecklare som lyckats skapa buggar.
Linux-kärnan är ju notorisk för att ha höga standarder gällande kodkvalitet, testning, automatiserade verktyg, extern granskning med mera men det leta sig fortfarande in simpla buggar som typ use after free och inte kolla felkoder som hade fångats av Rust. Såg att @jefff redan postat om detta.
Att anställda folk som inte kan koda, eller inte kan göra medvetet fel, är också en risk.
Alla kan göra misstag även du.
Jag har kodat mycket i C och C++ och jag har aldrig riktigt känt att minnesläckage är ett problem. Man märker när det drar minne när man debuggar liksom.
Det jag gör är att jag bara aktiverar flaggan AddressSanitizer och därmed så kan jag avgöra om jag har buggar, minnesläckage eller bryter mot arrayernas element. Ja allt.
Om jag inte har fel för mig så har även ASan begränsningar.
Så jag skulle säga att C++ och C är som språk inga "minnessäkra" språk. Men med lite smarta verktyg så som en riktigt IDE (Visual Studio, Eclipse, QT Creator, JetBrains etc...) + lite känsla för programmering, och inte något hocus pocus bluff som Emcas, vim eller VS Code eller andra notepads. Då kan man programmera minnessäkert.
De flesta seniora utvecklarna jag känner till använder inte en IDE utan emacs eller vim. Min uppfattning är att man får bättre förståelse med emacs och vim eftersom man kommer närmre underliggande verktyg(som IDEer vanligtvis bygger på). Vilka magiska IDE-features bidrar till att man kan koda "minnessäkert" i C och C++ enl. dig?
- Dagens fynd — Diskussionstråden54k
- Spotify höjer priset i Sverige70
- Microsofts Magnus är modulär7
- Katt lika rolig som hårdvara! [Bild på din katt-tråden]4,1k
- exception_access_violation Ark Survival Ascended4
- Tråden om Xbox Series X|S8,2k
- GPU fläktar på max och sprakar från GPU:n när man använder tryckluft på det?5
- Apple TV eller chromecast4
- Google förlorar mot Epic Games – dom om olagligt monopol står fast26
- Bilder på ditt (fysiska) skrivbord!4,9k
- Säljes LG 48" C1 4K OLED 120Hz
- Köpes AMD Ryzen 7 5700X3D AM4
- Köpes Gaming stationär/laptop
- Säljes 3080 Gainward Phoenix GS 10gb med vattenblock
- Säljes Playstation VR 2
- Köpes Söker efter uppgradering för am4 i göteborgstrakten/närheten
- Säljes PS5 Pro 2 TB, PlayStation Portal Remote Player + mer tillbehör
- Säljes Playstation 5 Disc Edition
- Säljes ASUS RTX 2070 SUPER - ROG STRIX
- Köpes Söker corsair Type 3 eller Type 4 PCIE-sladd
- Microsofts Magnus är modulär7
- Samsung Galaxy Z Fold 7 – den bästa hittills19
- AMD lanserar Radeon RX 906013
- Spotify höjer priset i Sverige70
- Rykte: 192 MB L3-cacheminne på kommande Ryzen-processor31
- Google förlorar mot Epic Games – dom om olagligt monopol står fast26
- Snabbkoll: Har du separata datorer för jobb och nöje?63
- Microsoft lägger ned Windows 11 SE14
- Amazons vd vill ha reklam i AI‑assistent47
- MSI:s nya RTX 5080 har blower‑kylare32
Externa nyheter
Spelnyheter från FZ