C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Permalänk
Inaktiv

Det riktiga problemet kring OP's frågeställning är snarare;

Bör vi verkligen acceptera en lägre kompetensnivå inom IT-utveckling?

För det är det det handlar om. C++ är från början och i grunden ett lågnivå-språk. Även om väldigt många arbetar för att göra C++ till ett högnivå språk, så kommer dom aldrig att nå hela vägen fram. Jag skulle snarare säga att all extra komplexitet dom lägger till i språket med åren gör det mindre säkert, snarare än tvärtom.

Vill du ha ett högnivå språk, använd ett högnivå språk. Har du rätt kompetens kommer du skriva ren, säker och stabil kod oavsett ditt val av språk.

Tål att tilläggas, samtliga högnivåspråk och deras runtime körs förmodligen på mjukvara skrivet i ett lågnivå språk, och även dessa kan skrivas av totalt inkompetenta "techbros", som i sin tur skulle göra högnivåspråket lika osäkert och ostabilt.

Våga förvänta er mer av utvecklare. C och C++ är båda i grunden fantastiska språk, som man med rätt kompetens kan utföra mirakel i.

Själv använder jag både Dart, Java, och C i mitt dagjobb. Kan säga att C-lagret är det mest stabila och robusta av hela kodbasen, förmodligen för att övriga består av mycket högre komplexitet, och är mer beroende av buggiga ramverk, bibliotek, runtimes osv.

Sen att C-lagret också presterar fenomenalt mycket snabbare än någon annan mjukvara skrivet i företaget är väl kanske bara en bonus?

Permalänk
Medlem
Skrivet av klk:

Tror du det går att skriva tester som fånga upp potentiella buggar?

Jag har skrivit tester som fångat upp buggar.

Skrivet av klk:

I tidigare inlägg skrev du om trådar, jag lovar att du har mycket svårt att hitta någon kodare som är så skicklig att den kan skriva test som testar av trådhantering (race conditions).

Det har jag inte påstått men det tror jag inte asserterna gör i heller. När jag gjorde exemplet med race condition så var det för att bemöta ditt påstående om att design pattern och namnkonventioner på något magiskt vis skulle leda till att nya utvecklare får förståelse nog att kunna bli produktiva en stor kodbas under deras första dag.

Skrivet av klk:

Tar också för lång tid innan andra utvecklare märker om de gjort fel. "assert" smäller med en gång och kodare kan rätta, förutom det förespråkar jag regresionstester. Där arbetar du med produktionskod och behöver inte bygga något extra och dessutom är det ger det bättre feedback.

Unit tester är första testinstansen så du får ju feedbacken snabbare än "regressionstester" enl. dig, jag misstänker att du menar "functional tests" eftersom även unit-test kan vara regression-tester. Har du ens läst Wiki-sidan som du länkat till?

Skrivet av klk:

Svårare domäner är ibland omöjliga. Kan bero på många saker. Så hur skriver du program som hjälper till där domänen är så svår att det är omöjligt att hitta programmerare som kan domänen?

Vilka domäner är nästan omöjliga?

Skrivet av klk:

Svar: Separera domän från kod så mycket som bara går. Och domänen kan då få en deklarativ lösning. Målet med deklarativ kod är att skriva så lite kod som möjligt, helst ingen kod alls.
Det är motsatsen till generella imperativa lösningar. Två helt olika saker

Nej det är inte målet med deklarativ kod. Om jag inte är helt ute och cyklar så är deklarativ kod att man uttrycker logiken för vad som ska göras istället för flödet så att man kan eliminera state-beroende och på köpet eliminera side-effects...

Skrivet av klk:

Vet du något mer och det projektet är kanske inte riktigt standard, samt att det har många som övervakar och strikta regler hur kod får skrivas.

Kubernetes är ett annat men generellt så är inte stora kodprojekt direktrelaterade till OS... Exempelvis andra stora projekt är Apaches projekt, React(JavaScript-ramverk), Node.js, Ruby on rails, Golang, Rust osv. Dvs ditt ursprungliga påstående är ganska meningslöst.

Skrivet av klk:

Det tror jag säkert men det är inte samma sak som att alla är det och de flesta projekt jag sett i RUST (alla) är primärt för linux/mac.
Också tolkat att det är personer som ofta gillar vim eller liknande.

Du har väldigt selektiv syn på världen. Microsoft har väl flest och mest omfattande Rust projekt nu när de skriver om delar av Windows i Rust. https://www.theregister.com/2023/04/27/microsoft_windows_rust...

Skrivet av klk:

Också tolkat att det är personer som ofta gillar vim eller liknande.

Vad speler det för roll om vilket editor folk använder för att skriva Rust? Kanske folk som kodar Rust gillar att ha kontroll på sina saker?

Permalänk
Medlem
Skrivet av anon362173:

För det är det det handlar om. C++ är från början och i grunden ett lågnivå-språk.

Min uppfattning av C++ har alltid varit som ett högnivåspråk.

Skrivet av anon362173:

Även om väldigt många arbetar för att göra C++ till ett högnivå språk, så kommer dom aldrig att nå hela vägen fram. Jag skulle snarare säga att all extra komplexitet dom lägger till i språket med åren gör det mindre säkert, snarare än tvärtom.

Vill du ha ett högnivå språk, använd ett högnivå språk. Har du rätt kompetens kommer du skriva ren, säker och stabil kod oavsett ditt val av språk.

Jag håller med om att jag inte är helt nöjd med C++ modernisering. Det känns clunky och svårt att förstå vad som händer under huven men jag har enbart lite erfarenhet av C++ så kan vara skill issue från min sida. Jag försöker undvika C++ och kör antingen C eller Rust.

Skrivet av anon362173:

Våga förvänta er mer av utvecklare. C och C++ är båda i grunden fantastiska språk, som man med rätt kompetens kan utföra mirakel i.

C är framförallt fantastiskt (skämtsamtprovocerande)

Permalänk
Medlem
Skrivet av orp:

Vilka domäner är nästan omöjliga?

De flesta. Områden som forskning, automotive(bilar), sjukvård, spel, byråkrati, saker med hög prestanda och så vidare

Där separeras i princip alltid domänen från grundläggande kod

Skrivet av orp:

Har du ens läst Wiki-sidan som du länkat till?

Det gjorde jag inte När det kommer till programmering så står det mest en massa smörja på wiki men jag fick upp den sidan när jag sökte

Permalänk
Medlem
Skrivet av orp:

Min uppfattning av C++ har alltid varit som ett högnivåspråk.

C++ är "allt" (multi-paradigm)

Permalänk
Medlem
Skrivet av orp:

Nu tror jag du fick ett antal citeringar fel - det mest av det där var det inte jag som hade skrivit.

Permalänk
Medlem
Skrivet av Erik_T:

Nu tror jag du fick ett antal citeringar fel - det mest av det där var det inte jag som hade skrivit.

Jag ber om ursäkt! Jag ska ha justerat det nu <3

Permalänk
Medlem
Skrivet av klk:

Normalt när man utvecklar program så hanterar programmet en domän (ämnesområde). Denna domän kan vara mer eller mindre svår. Lättare databassystem, där är det kanske ok om utvecklare också lär sig domänen men det är är sällan kul, utvecklare gillar att koda.
Svårare domäner är ibland omöjliga. Kan bero på många saker. Så hur skriver du program som hjälper till där domänen är så svår att det är omöjligt att hitta programmerare som kan domänen?
Svar: Separera domän från kod så mycket som bara går. Och domänen kan då få en deklarativ lösning. Målet med deklarativ kod är att skriva så lite kod som möjligt, helst ingen kod alls.
Det är motsatsen till generella imperativa lösningar. Två helt olika saker

Du använder fortfarande en väldigt märklig, och närmast unik, definition av "deklarativ". I den betydelse ordet normalt har när det gäller programmering så har det ingen som helst koppling till domän-specifik kod.

Deklarativ kod kan vara domän-specifik, eller generell. Imperativ kod kan vara domän-specifik, eller generell. Ingendera är bättre för det ena eller det andra.

Permalänk
Medlem
Skrivet av klk:

De flesta. Områden som forskning, automotive(bilar), sjukvård, spel, byråkrati, saker med hög prestanda och så vidare

Där separeras i princip alltid domänen från grundläggande kod

Vad gör dessa till "omöjliga" domäner?

Jag har inte sett den separationen när jag jobbat inom saker med högprestanda.

Skrivet av klk:

Det gjorde jag inte När det kommer till programmering så står det mest en massa smörja på wiki men jag fick upp den sidan när jag sökte

...

Permalänk
Medlem
Skrivet av klk:

C++ är "allt" (multi-paradigm)

Många språk är multiparadigm ... JavaScript är multiparadigm, C är multiparadigm.

Jag skriver mest C så därför ser jag C++ som hög(re)-nivå.

Permalänk
Medlem
Skrivet av klk:

C++ är "allt" (multi-paradigm)

C++ försöker vara "allt", och precis som alla andra försök att få något att vara bra på allt så slutar det bara med att det inte är särskilt bra på något.
Utom möjligen då att göra det lätt att skriva obegriplig kod. Det är C++ bra på.

Permalänk
Medlem
Skrivet av orp:

Många språk är multiparadigm ... JavaScript är multiparadigm, C är multiparadigm.

Jag skriver mest C så därför ser jag C++ som hög(re)-nivå.

haha, ok
problemet med de andra språken är att du måste installera en hel hög med komponenter och dessa komponenter är normalt skrivna i C/C++

Permalänk
Medlem
Skrivet av Erik_T:

Utom möjligen då att göra det lätt att skriva obegriplig kod. Det är C++ bra på.

Du kan göra det motsatta med, friheten gör att man kan göra mycket. Exempelvis köra av vägen men också köra väldigt snabbt. Hur C++ hanteras beror på utvecklarna.
Det C++ inte är bra på är det sista lagret (helst om utvecklare skött sin uppgift) som tar hand om domänspecifika operationer. Det tar tid att uppdatera kompilerad maskinkod från C/C++

Permalänk
Medlem
Skrivet av orp:

Många språk är multiparadigm ... JavaScript är multiparadigm, C är multiparadigm.

Jag skriver mest C så därför ser jag C++ som hög(re)-nivå.

C är inte multiparadigm. Det är ett ganska konventionellt procedurellt språk, lämpat för låg-nivå programmering.
Det har en del features som låter dig använda tekniker från funktionell programmering och objektorienterad programmering, men inte alls på samma nivå som språk som är designade för sådant.

C++ låter dig skriva kod på en lite högre nivå än vad C tillåter. Men man vinner inte mycket på det. Eftersom C++ har kvar allt stöd för lågnivå-programmering, så har man kvar alla nackdelar med lågnivåprogrammering om inte alla inblandade är väldigt försiktiga när de skriver kod.

C++ är lite som en schweizisk armékniv - det går att använda till det mesta, men för varje enskilt problem så finns det något annat verktyg som är bättre.

Permalänk
Medlem
Skrivet av klk:

Du kan göra det motsatta med, friheten gör att man kan göra mycket. Exempelvis köra av vägen men också köra väldigt snabbt. Hur C++ hanteras beror på utvecklarna.

Problemet är inte att det går att skriva dålig och oläslig kod i C++. Det kan man i alla språk.
Problemet är att det är mycket lättare att göra det i C++ än i de flesta andra språk.

Citat:

Det C++ inte är bra på är det sista lagret (helst om utvecklare skött sin uppgift) som tar hand om domänspecifika operationer.

På vilket sätt menar du att domänspecifika operationer skulle göras bättre i andra språk?

Citat:

Det tar tid att uppdatera kompilerad maskinkod från C/C++

Jag måste erkänna att jag inte har den blekaste aning om vad du försöker säga med det där.

Permalänk
Inaktiv
Skrivet av Erik_T:

C är inte multiparadigm. Det är ett ganska konventionellt procedurellt språk, lämpat för låg-nivå programmering.
Det har en del features som låter dig använda tekniker från funktionell programmering och objektorienterad programmering, men inte alls på samma nivå som språk som är designade för sådant.

C++ låter dig skriva kod på en lite högre nivå än vad C tillåter. Men man vinner inte mycket på det. Eftersom C++ har kvar allt stöd för lågnivå-programmering, så har man kvar alla nackdelar med lågnivåprogrammering om inte alla inblandade är väldigt försiktiga när de skriver kod.

C++ är lite som en schweizisk armékniv - det går att använda till det mesta, men för varje enskilt problem så finns det något annat verktyg som är bättre.

Om man skippar all ny idioti i C++ ("smarta" pekare osv), och använder det som många erfarna använder det; Som C med klasser, så blir det ett väldigt bra språk i sin egen ära.

Man måste dock ha samma tänk som man har i C; Full koll på minnesallokeringar, pekare, cache-vänlig data layout, osv. Därför menar jag att C++ faktiskt är ett lågnivå språk. Man kan slänga alla möjliga typer av komplexiteter in i C++, och hävda att "råa pekare är farliga och obsolete!", men det ändrar inte riktigt verkligheten.

Permalänk
Medlem
Skrivet av Erik_T:

C är inte multiparadigm.

Jag vet om att det är hårklyveri men C är procedural och structured. Jag nämnde det mest för att poängtera att multiparadigm inte säger särskilt mycket i sammanhanget.

Permalänk
Medlem
Skrivet av Erik_T:

Problemet är inte att det går att skriva dålig och oläslig kod i C++. Det kan man i alla språk.
Problemet är att det är mycket lättare att göra det i C++ än i de flesta andra språk.

Absolut är det lättare men det kommer alltid finnas nivåer i hur saker kan göras. Vill man bli skicklig utvecklare och göra bra saker så är det inte så mycket annat att välja på än C++. Och några få utvecklare där som behärskar språket slår det mesta, de producerar bättre saker än vad kanske det 10 dubbla gör i andra språk (jag vet att detta retar.....) men har man exempelvis sätt dataorinterade lösningar och vet hur lösningar går att få återanvändningsbara är det inte så konstigt.
Andra språk som snabbt kan skapa saker har ju oftast en grund skriven i C/C++ som gör "jobbet" även om utvecklare i exmpelvis nodejs tror att det är javascript som är så bra

Skrivet av Erik_T:

På vilket sätt menar du att domänspecifika operationer skulle göras bättre i andra språk?

Eftersom vi disktuerar på sweclockers så är spel säkert bekant och det är mycket vanligt att spel "embeddar" lua och då görs sista lagret (domänen) i lua. Spelplaner och annat som hela tiden ändrar sig passar inte C++ för.
Ofta kan sådant här kallas för metadata, nästan alla C++ applikationer läser in metadata som har konfigurerar koden för hur den skall bete sig. Desto mer flexibilitet desto mer "avancerad" metadata och ibland går det över till skriptspråk som lua eller python.

Permalänk
Medlem
Skrivet av klk:

Absolut är det lättare men det kommer alltid finnas nivåer i hur saker kan göras. Vill man bli skicklig utvecklare och göra bra saker så är det inte så mycket annat att välja på än C++. Och några få utvecklare där som behärskar språket slår det mesta, de producerar bättre saker än vad kanske det 10 dubbla gör i andra språk (jag vet att detta retar.....) men har man exempelvis sätt dataorinterade lösningar och vet hur lösningar går att få återanvändningsbara är det inte så konstigt.
Andra språk som snabbt kan skapa saker har ju oftast en grund skriven i C/C++ som gör "jobbet" även om utvecklare i exmpelvis nodejs tror att det är javascript som är så bra

Göra bra saker går alldeles utmärkt att göra i andra språk än C++. Oftast bättre.
C++ är inte ett bra språk. Att det fortfarande används är mest på grund av att det finns så mycket existerande kod i C++ som är för mycket jobb att skriva om i något annat språk.

Permalänk
Inaktiv
Skrivet av Erik_T:

Göra bra saker går alldeles utmärkt att göra i andra språk än C++. Oftast bättre.
C++ är inte ett bra språk. Att det fortfarande används är mest på grund av att det finns så mycket existerande kod i C++ som är för mycket jobb att skriva om i något annat språk.

Om du inte menar C eller assembly nu, så är du ute och cyklar litegrann Vill du pressa prestanda från hårdvaran i någon form alls (cutting edge spelutveckling, signalprocessering av stora mängder data, embedded programmering osv) så är det i princip ett skallkrav att använda C/C++ (i vissa fall Rust, även om jag inte är ett stort fan av det språket)

Permalänk
Medlem
Skrivet av Erik_T:

Göra bra saker går alldeles utmärkt att göra i andra språk än C++. Oftast bättre.

Hur då?

Permalänk
Medlem
Skrivet av anon362173:

Om du inte menar C eller assembly nu, så är du ute och cyklar litegrann Vill du pressa prestanda från hårdvaran i någon form alls (cutting edge spelutveckling, signalprocessering av stora mängder data, embedded programmering osv) så är det i princip ett skallkrav att använda C/C++ (i vissa fall Rust, även om jag inte är ett stort fan av det språket)

Embedded programmering täcker ju ett brett spektrum av system och problem. Allt från system utan några stora prestandakrav där man skulle kunna använda olika skriptspråk utan problem, till små system med minimalt minne och hårda realtidskrav där i stort sett bara C och assembler är realistiska alternativ.

För tunga beräkningar av olika slag så finns det ju en lång tradition av att använda Fortran, som i sina moderna inkarnationer (Fortran 90 och senare) inte är så dumt.

Permalänk
Medlem
Skrivet av klk:

Genom att skriva bra kod. Duh.

Permalänk
Medlem
Skrivet av orp:

Jag håller med om att jag inte är helt nöjd med C++ modernisering. Det känns clunky och svårt att förstå vad som händer under huven men jag har enbart lite erfarenhet av C++ så kan vara skill issue från min sida.

Vad är det i Modern C++ (säg version 17 eller 20) som du tycker är svårt / problematiskt / onödigt komplext?

T.ex. varför är raw pointers bättre än std::unique_ptr? (Vilket någon annan i tråden hävdade)

Permalänk
Medlem
Skrivet av Erik_T:

… till små system med minimalt minne och hårda realtidskrav där i stort sett bara C och assembler är realistiska alternativ.

Så varför använder Volvo, BMW, GM och de andra stora biltillverkarna C++ 14/17 för bl.a. förarassistanssystem som har semi-hårda realtidskrav? Vad gör C++ till ett dåligt val här?

Permalänk
Inaktiv
Skrivet av Perkoff:

Vad är det i Modern C++ (säg version 17 eller 20) som du tycker är svårt / problematiskt / onödigt komplext?

T.ex. varför är raw pointers bättre än std::unique_ptr? (Vilket någon annan i tråden hävdade)

Dom försöker ändra C++ till något det absolut inte är; Ett högnivå språk. Det blir högre komplexitet, helt i onödan, och således ett sämre språk att jobba med.

Raw pointers (eller bara pekare) är vad C++ alltid har haft, och det finns inget fel med det. Det är lågnivå av en anledning och krävs en del kompetens för att inte göra misstag, men det är så det är tänkt från början. Unique_ptr är en krycka för n00bs som vill hävda sig vara grymma programmerare. Det tillför ingenting annat än onödig komplexitet och en inbillad prestige.

Istället för att fråga varför pekare är bättre än "smarta pekare", ställ dig frågan varför behövs ens "smarta" pekare? Bortsett från shared_ptr och weak_ptr som kan vara användbara (dock i min åsikt så bör man oftast själv implementera sådan funktionalitet om man behöver det, då shared/weak är extremt generiska implementationer).

Det finns också en mörk sanning kring utvecklingen av C++, som involverar en trend av mental ohälsa som påverkar hela industrin negativt (som även påverkar C++ consortium). Detta är dock inget jag vill vidareutveckla i tråden, men eftersök själv i ämnet om du är nyfiken.

Försök inte laga något som inte är trasigt, säger jag bara

Permalänk
Inaktiv
Skrivet av Erik_T:

Embedded programmering täcker ju ett brett spektrum av system och problem. Allt från system utan några stora prestandakrav där man skulle kunna använda olika skriptspråk utan problem, till små system med minimalt minne och hårda realtidskrav där i stort sett bara C och assembler är realistiska alternativ.

För tunga beräkningar av olika slag så finns det ju en lång tradition av att använda Fortran, som i sina moderna inkarnationer (Fortran 90 och senare) inte är så dumt.

Embedded kännetecknas nästan alltid av begränsade systemresurser, men också möjligheter för hårdvaruspecifika optimeringar. Att använda något annat än ett native språk blir då ganska slössamt.

C och C++ hanterar tunga beräkningar precis lika bra som Fortran, som också är ganska nischat idag.

Permalänk
Medlem
Skrivet av anon362173:

Dom försöker ändra C++ till något det absolut inte är; Ett högnivå språk. Det blir högre komplexitet, helt i onödan, och således ett sämre språk att jobba med.

Varför blir det mer komplext?
Jag skulle snarare säga att det blir *mindre* komplext eftersom ägandeskapet kring en unique_ptr blir glasklart.

Skrivet av anon362173:

Unique_ptr är en krycka för n00bs som vill hävda sig vara grymma programmerare. Det tillför ingenting annat än onödig komplexitet och en inbillad prestige.

Detta är ett icke-argument. Varför tror du att Google C++ Style Guide uppmuntrar till användningen?

Permalänk
Inaktiv
Skrivet av Perkoff:

Varför blir det mer komplext?
Jag skulle snarare säga att det blir *mindre* komplext eftersom ägandeskapet blir glasklart.

Rent kodmässigt blir det högre komplexitet. Det är ett extra lager ovanpå vanliga pekare, med tillhörande regler, rekommendationer osv. Det tillför dessutom ingen konkret funktionalitet, mer än ett påtvingande programmerarbeteende, som inte alltid är positivt.

Skrivet av Perkoff:

Detta är ett icke-argument. Varför tror du att Google C++ Style Guide uppmuntrar till användningen?

Google rekommenderar dessa stödhjul, eftersom att Google investerar mycket i billig arbetskraft i bulk, och som du säkert vet så får man vad man betalar för (inkompetenta programmerare). I google's fall så fungerar dessa stödhjul till att minska antalet buggar i koden, eftersom att en stor del av deras programmerare är inkompetenta techbros.

Smarta pekare finns endast till för att kompensera för osmarta utvecklare. Och dom gör i princip alltid kodbasen sämre, om inte annat för att det ökar komplexiteten i koden.

Permalänk
Medlem
Skrivet av anon362173:

Rent kodmässigt blir det högre komplexitet. Det är ett extra lager ovanpå vanliga pekare, med tillhörande regler, rekommendationer osv. Det tillför dessutom ingen konkret funktionalitet, mer än ett påtvingande programmerarbeteende, som inte alltid är positivt.

Extra lager implicerar inte högre komplexitet. En så pass trivial sak som inkapsling (OOP) innebär ett extra lager, men kan göra kod lättare att underhålla.

Skrivet av anon362173:

Google rekommenderar dessa stödhjul, eftersom att Google investerar mycket i billig arbetskraft i bulk, och som du säkert vet så får man vad man betalar för (inkompetenta programmerare). I google's fall så fungerar dessa stödhjul till att minska antalet buggar i koden, eftersom att en stor del av deras programmerare är inkompetenta techbros.

Bolaget har en medianlön på $135K, så nej, inte direkt låg konkurrens om platserna där.

Om det minskar antalet buggar tyder väl det på att det är bra för något…? Men visst, det är omaaanligt att använda sig av en modern style guide som minskar antalet buggar…