20-talets högsta prioritet på språk - Säkerhet & Snabbhet

Permalänk
Medlem
Skrivet av heretic16:

På tal om säkerhet.

Smarta pekare används inom C++, dock inte inom C då smarta pekare är nytt. Men hur fungerar smarta pekare, förutom att det är ett säkert sätt att säga "new" ?

Varför just smarta pekare nu, men inte förr?

Kan det ha att göra med ökade branchkrav att generera mer kod och tänka mindre?
Då dyker felen upp som ett brev på posten (lite då och då).
Jag är mina rötter i den mylla som noga tänkte igenom hur en uppgift löses med minimala resurser, snarare än att bara slänga ihop något som kompilatorn släpper igenom.

Permalänk
Hedersmedlem
Skrivet av heretic16:

På tal om säkerhet.

Smarta pekare används inom C++, dock inte inom C då smarta pekare är nytt. Men hur fungerar smarta pekare, förutom att det är ett säkert sätt att säga "new" ?

Varför just smarta pekare nu, men inte förr?

Konceptet är gammalt (äldre än C), men det kostar både minne och prestanda. Kanske har bara dessa språk traditionellt fokuserat på effektivitet?

Huvudidén är att komplettera den råa pekaren med en räknare som räknas upp varje gång någon kopierar pekaren och ner varje gång en kopia försvinner. När räknaren blir 0 bör det inte finnas någon kvar som använder minnet, så då kan det lika gärna frigöras.

Permalänk
Medlem
Skrivet av Elgot:

Konceptet är gammalt (äldre än C), men det kostar både minne och prestanda. Kanske har bara dessa språk traditionellt fokuserat på effektivitet?

Huvudidén är att komplettera den råa pekaren med en räknare som räknas upp varje gång någon kopierar pekaren och ner varje gång en kopia försvinner. När räknaren blir 0 bör det inte finnas någon kvar som använder minnet, så då kan det lika gärna frigöras.

Det finns åtskilliga typer av smarta pekare, men det där är väl den vanligaste varianten.

Smarta pekare infördes i C++ som en rudimentär form av garbage collection. Med de vanliga fördelarna och nackdelarna med att ha automatisk garbage collection kontra manuell minneshantering.

Permalänk

Bröt man inte mot bakåtkompabiliteten när man införde smarta pekare?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Bröt man inte mot bakåtkompabiliteten när man införde smarta pekare?

Smarta pekare (i C++) är ju i stort bara nya klasser, det påverkar inget äldre. Man kan (men bör förstås i regel inte) göra sina egna smarta pekare.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

@heretic16 , vi paratade ju just om det här i den andra tråden om Rust. Det GÅR INTE att göra statisk analys av ett program som hittar fel av den typen du tänker dig. Oavsett hur många av världens bästa programmerare du sätter på det kommer de aldrig lyckas.

Man kan i princip göra en C-kompilator som utifrån ditt C-program genererar kod som detekterar när man gör något odefinierat och då avslutar programmet eller anropar något speciell funktion eller liknande. Det finns redan verktyg av den typen, jag har för mig du skrev att du hade testat Valgrind t ex (som dock inte detekterar alla fel, men iaf några). Problemet är att om man skulle detektera allting skulle programmet bli betydligt långsammare och mer minneskrävande än motsvarande program skrivet i ett språk som är designat för det i grunden, som t ex Java som inte har pekare.

Permalänk
Skrivet av trudelutt:

@heretic16 , vi paratade ju just om det här i den andra tråden om Rust. Det GÅR INTE att göra statisk analys av ett program som hittar fel av den typen du tänker dig. Oavsett hur många av världens bästa programmerare du sätter på det kommer de aldrig lyckas.

Man kan i princip göra en C-kompilator som utifrån ditt C-program genererar kod som detekterar när man gör något odefinierat och då avslutar programmet eller anropar något speciell funktion eller liknande. Det finns redan verktyg av den typen, jag har för mig du skrev att du hade testat Valgrind t ex (som dock inte detekterar alla fel, men iaf några). Problemet är att om man skulle detektera allting skulle programmet bli betydligt långsammare och mer minneskrävande än motsvarande program skrivet i ett språk som är designat för det i grunden, som t ex Java som inte har pekare.

Men hur kommer det sig att Rust är snabbare än C++, och ändå säkrare?
Detta får jag inte ihop.

Om Rust är snabbare och säkrare än C++....då finns det absolut ingen anledning att välja C++ om Rust är bättre än C++...på egentligen allt.

Permalänk
Medlem
Skrivet av heretic16:

Men hur kommer det sig att Rust är snabbare än C++, och ändå säkrare?
Detta får jag inte ihop.

Om Rust är snabbare och säkrare än C++....då finns det absolut ingen anledning att välja C++ om Rust är bättre än C++...på egentligen allt.

Det finns ingen anledning att välja C++ till nya program idag. Om det är program i userspace så bör man använda ett modernt programspråk med minnessäkerhet, och då är Rust ett bra alternativ. Det finns fler - Swift och Go är två andra, och det beror nog mer på vilken plattform man skriver mot. Rust är unikt just för att det kan användas i en kärna när en runtime inte är så lyckad.

Att C++ inte är så snabbt som det kanske borde vara beror delvis på att det innehåller ”allt”. Skaparen Bjarne Stroustrup lade till mer eller mindre allt som någon bad honom lägga till i språket i ett försök att marknadsföra det. Modernare språk är i allmänhet mer återhållsamma med vad de lägger till för att ge kompilatorn en chans att göra ett bra jobb.

Visa signatur

5900X | 6700XT

Permalänk
Datavetare
Skrivet av heretic16:

Men hur kommer det sig att Rust är snabbare än C++, och ändå säkrare?
Detta får jag inte ihop.

Om Rust är snabbare och säkrare än C++....då finns det absolut ingen anledning att välja C++ om Rust är bättre än C++...på egentligen allt.

C++ är och kommer vara högst relevant under många år framåt därför att det redan finns så mycket skrivet i C++.

I de flesta fall väger inte fördelar upp ett byte av språk om man "bara" ska utöka / modifiera ett existerande program, då är det bäst att fortsätta skriva i det språk som resten är skrivet i. Sedan finns områden där man kanske startar ett helt nytt projekt, men det i sin tur beror av någon som gör C++ till det enda vettiga valet: ett exempel är spel som bygger på en motor som är designat för C++ som Unreal Engine 4/5.

Det flera, bl.a. Microsoft, säger är: om man startar ett helt nytt projekt där man behöver ett systemspråk så finns ingen anledning att välja C eller C++ över Rust idag.

I det större perspektivet finns långt fler parametrar att ta hänsyn till. Svårt att se varför jag själv skulle välja C++ idag om det inte är ett hårt krav p.g.a. restriktioner jag inte styr över. Men det gör inte just Rust till ett självklar val bara för det är relativt lätt att producera högpresterande kod i.

Har på senare tid haft Go som favoritval i backend och low-level projekt. Det är inte lika "säkert" som Rust, färre saker upptäcks vid kompilering i Go. Men där finns andra saker som prioriterats högt och som för mig då varit betydligt mer värt att de saker Rust fokuserat på. Exempel här är att bibliotek för saker som ModBus, MQTT, GPIO-hantering (SBC) och low-level hantering av USB visat sig vara mer mogna i Go än under Rust. Om man primärt optimerar för I/O throughput (inte compute throughput) så spelar det betydligt mer på huvudfokus i Go än huvudfokus i Rust.

För OS utveckling är det rätt mycket C vs Rust i kärnan och C++ vs Rust för systemtjänster. Här lär C och C++ fortsätta finnas kvar mycket längre, det finns stora fördelar med att fortsätta använda samma språk. Men tror det är just här vi kommer se Rust etablera sig allt mer framåt.

Visa signatur

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

Permalänk
Medlem
Skrivet av heretic16:

Men hur kommer det sig att Rust är snabbare än C++, och ändå säkrare?
Detta får jag inte ihop.

Om Rust är snabbare och säkrare än C++....då finns det absolut ingen anledning att välja C++ om Rust är bättre än C++...på egentligen allt.

Nu är jag ingen expert på Rust utan lekte bara med det för ett par månader sedan. Det känns väldigt komplicerat och man blir lätt frustrerad på alla kompilatorfel... Troligtvis hade jag tyckt samma sak om C++ om jag börjat med det idag dock

Iaf, man kan säga att Rust är mer "låst". Kompilatorn vet mer saker om koden än den gör i C++. Ta t ex följande i C++:

void f(unsigned int* a, unsigned int* b) { for (int i = 0; i < 10; i++) { *a += *b } }

Det här ser ju ut att vara ungefär samma som

void f(unsigned int* a, unsigned int* b) { *a += *b * 10u; }

Men tänk om a och b pekar på samma int? Då stämmer inte det. Kompilatorn måste då antingen göra en extra koll om a==b och göra olika saker beroende på den jämförelsen, eller låta bli att göra den optimeringen. I C++ kan a och b mycket väl peka på samma unsigned int, men i Rust kan man göra motsvarande optimering iom att kompilatorn vet att f inte får anropas med a och b pekandes på samma int (det ger ett kompilatorfel).

Ett annat exempel är

void g(const int* pa); int a = 42; g(&a); print(a);

I motsvarande kod i Rust vet kompilatorn att a är 42 vid print(a), men i C++ kan man inte veta det trots att g tar en const-pekare som argument. Man kan ju ändra a genom att göra en const_cast någonstans i g! I Rust kan man därför hålla a i ett register (eller kanske till och med optimera bort det helt och hållet), men i C++ måste a sparas i minnet.

Vissa av de här sakerna kan man naturligtvis komma runt genom att titta på en lite större del av programmet istället för att bara titta på en funktion i taget. Jag vet inte hur bra kompilatorer är på det egentligen, men det går i alla fall inte för kompilatorn att bevisa såna här saker i alla möjliga situationer.

Permalänk
Skrivet av mpat:

Det finns ingen anledning att välja C++ till nya program idag. Om det är program i userspace så bör man använda ett modernt programspråk med minnessäkerhet, och då är Rust ett bra alternativ. Det finns fler - Swift och Go är två andra, och det beror nog mer på vilken plattform man skriver mot. Rust är unikt just för att det kan användas i en kärna när en runtime inte är så lyckad.

Att C++ inte är så snabbt som det kanske borde vara beror delvis på att det innehåller ”allt”. Skaparen Bjarne Stroustrup lade till mer eller mindre allt som någon bad honom lägga till i språket i ett försök att marknadsföra det. Modernare språk är i allmänhet mer återhållsamma med vad de lägger till för att ge kompilatorn en chans att göra ett bra jobb.

Fast man behöver inte använda allt i C++ heller.

Bjarne Stroustrup har sagt i en månad gammal intervju att han kan inte ta bort något från C++, bara förenkla användningen av C++. Bjarne Stroustrup har sagt att han planerar att baka in en statisk analyserare som granskar koden och C++ ska bli ett säkerhetsspråk. Han säger dock att det kommer ta år att implementera sådant och han har redan börjat jobba på detta för 7 år sedan.

Jag har ingen aning om hur mycket jobb det är att baka in en statisk analyserare i t.ex. GCC eller MSVC. Det är väll sådant Rust redan använder?

Dessutom har Bjarne Stroustrup sagt att han skulle implementera regler för C++ hur man får programmera.

Skrivet av Yoshman:

C++ är och kommer vara högst relevant under många år framåt därför att det redan finns så mycket skrivet i C++.

I de flesta fall väger inte fördelar upp ett byte av språk om man "bara" ska utöka / modifiera ett existerande program, då är det bäst att fortsätta skriva i det språk som resten är skrivet i. Sedan finns områden där man kanske startar ett helt nytt projekt, men det i sin tur beror av någon som gör C++ till det enda vettiga valet: ett exempel är spel som bygger på en motor som är designat för C++ som Unreal Engine 4/5.

Det flera, bl.a. Microsoft, säger är: om man startar ett helt nytt projekt där man behöver ett systemspråk så finns ingen anledning att välja C eller C++ över Rust idag.

I det större perspektivet finns långt fler parametrar att ta hänsyn till. Svårt att se varför jag själv skulle välja C++ idag om det inte är ett hårt krav p.g.a. restriktioner jag inte styr över. Men det gör inte just Rust till ett självklar val bara för det är relativt lätt att producera högpresterande kod i.

Har på senare tid haft Go som favoritval i backend och low-level projekt. Det är inte lika "säkert" som Rust, färre saker upptäcks vid kompilering i Go. Men där finns andra saker som prioriterats högt och som för mig då varit betydligt mer värt att de saker Rust fokuserat på. Exempel här är att bibliotek för saker som ModBus, MQTT, GPIO-hantering (SBC) och low-level hantering av USB visat sig vara mer mogna i Go än under Rust. Om man primärt optimerar för I/O throughput (inte compute throughput) så spelar det betydligt mer på huvudfokus i Go än huvudfokus i Rust.

För OS utveckling är det rätt mycket C vs Rust i kärnan och C++ vs Rust för systemtjänster. Här lär C och C++ fortsätta finnas kvar mycket längre, det finns stora fördelar med att fortsätta använda samma språk. Men tror det är just här vi kommer se Rust etablera sig allt mer framåt.

Detta förklarar inte varför Rust ska vara snabbare än C++.

Skrivet av trudelutt:

Nu är jag ingen expert på Rust utan lekte bara med det för ett par månader sedan. Det känns väldigt komplicerat och man blir lätt frustrerad på alla kompilatorfel... Troligtvis hade jag tyckt samma sak om C++ om jag börjat med det idag dock

Iaf, man kan säga att Rust är mer "låst". Kompilatorn vet mer saker om koden än den gör i C++. Ta t ex följande i C++:

void f(unsigned int* a, unsigned int* b) { for (int i = 0; i < 10; i++) { *a += *b } }

Det här ser ju ut att vara ungefär samma som

void f(unsigned int* a, unsigned int* b) { *a += *b * 10u; }

Men tänk om a och b pekar på samma int? Då stämmer inte det. Kompilatorn måste då antingen göra en extra koll om a==b och göra olika saker beroende på den jämförelsen, eller låta bli att göra den optimeringen. I C++ kan a och b mycket väl peka på samma unsigned int, men i Rust kan man göra motsvarande optimering iom att kompilatorn vet att f inte får anropas med a och b pekandes på samma int (det ger ett kompilatorfel).

Ett annat exempel är

void g(const int* pa); int a = 42; g(&a); print(a);

I motsvarande kod i Rust vet kompilatorn att a är 42 vid print(a), men i C++ kan man inte veta det trots att g tar en const-pekare som argument. Man kan ju ändra a genom att göra en const_cast någonstans i g! I Rust kan man därför hålla a i ett register (eller kanske till och med optimera bort det helt och hållet), men i C++ måste a sparas i minnet.

Vissa av de här sakerna kan man naturligtvis komma runt genom att titta på en lite större del av programmet istället för att bara titta på en funktion i taget. Jag vet inte hur bra kompilatorer är på det egentligen, men det går i alla fall inte för kompilatorn att bevisa såna här saker i alla möjliga situationer.

Genererar detta extra assemblerkod för Rust jämfört med C++ om man har dessa krav på hur kod får vara?

Permalänk
Datavetare
Skrivet av heretic16:

Detta förklarar inte varför Rust ska vara snabbare än C++.

Rust är inte generellt sett snabbare än C++. Det är snabbare i vissa specifika fall, du har redan fått detaljerna kring ett sådan exempel här där underliggande orsaken kommer av skillnader i alias-regler för data som nås via en pekare.

Ur alla praktiska hänseenden är prestanda i genomsnitt likvärdigt mellan C, C++ och Rust förutsatt att man löser problemet på samma sätt.

Så uppsidan med Rust är att man får säkerhetsfördelarna, utan att offra prestanda.

Visa signatur

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

Permalänk
Skrivet av Yoshman:

Rust är inte generellt sett snabbare än C++. Det är snabbare i vissa specifika fall, du har redan fått detaljerna kring ett sådan exempel här där underliggande orsaken kommer av skillnader i alias-regler för data som nås via en pekare.

Ur alla praktiska hänseenden är prestanda i genomsnitt likvärdigt mellan C, C++ och Rust förutsatt att man löser problemet på samma sätt.

Så uppsidan med Rust är att man får säkerhetsfördelarna, utan att offra prestanda.

Cppcon 2021 har tagit upp just säkerhetsaspekter kring C++ och grundaren av C++ verkar ha väldigt många idéer.

Hans idéer är att inte göra om C++, utan lägga till:

- Statisk analyserare i kompilatorn
- Ett program som tvingar användaren att följa regler

Det är säkert mer som han kommer med. Men dessa två saker är vad jag har fått information om.
Grundaren av C++ har sagt att han vill inte modifiera bakåtkompabiliteten och det går inte förenkla C++ som syntax. Däremot går det förenkla användningen av C++.

Vad tror du om detta?

Permalänk
Medlem
Skrivet av mpat:

Det finns ingen anledning att välja C++ till nya program idag.

Att välja något du kan istället för något nytt är en bra anledning, det finns säkert många fler

Permalänk
Skrivet av pine-orange:

Att välja något du kan istället för något nytt är en bra anledning, det finns säkert många fler

Jag tycker att det är intressant att det utvecklas många olika språk för att hitta det bästa språket som kan bygga system för hårdvara och kärnor.

C, C++, Rust och nu helt plötsligt så utmanar Zig programmeringsspråket Rust. Men många säger att Googles Carbon kommer ersätta dom alla. Men innan Carbon har kommit ut så har säkert 2-3 andra språk som ska ersätta Carbon redan på väg ut också...

Vem vet

Carbon låter lovande. Det är som Rust som kan använda C++-kod rakt av.

Permalänk
Medlem

De som säger att språk Y kommer att döda/byta ut språk X är väl mest click baiters, det förstår nog de flesta. Det är samma sak som när det kommer nya JS-ramverk eller exempelvis Microsoft Blazor, de har lärt sig av sina föregångare och kanske har coola features som löser vanliga problem från sina föregångare men det finns nog ingen som tror att alla kommer sluta rakt av med de äldre sakerna då för mycket tid har investerats, både i arbetstid och kompetensmässigt.

Så om det sker en förändring är den nog mer långsam, över ett decennium eller mer.

Permalänk
Medlem
Skrivet av heretic16:

C, C++, Rust och nu helt plötsligt så utmanar Zig programmeringsspråket Rust. Men många säger att Googles Carbon kommer ersätta dom alla.

[...]

Carbon låter lovande. Det är som Rust som kan använda C++-kod rakt av.

Att påstå att Carbon skulle kunna ersätta andra moderna språk ger en grovt felaktig bild av dess syfte, så jag hoppas det inte är så många som säger det. Det är menat att vara ett bättre sätt att förvalta stora kodbaser som beror tungt på C++ och är inte något som bör användas för nya projekt. Det är absolut inte som Rust. Att Carbon på det stora hela är ett mindre ont än C++ snarare än ett riktigt bra språk i sig är tydligt från FAQn.

Citat:

If you can use Rust, ignore Carbon

If you want to use Rust, and it is technically and economically viable for your project, you should use Rust. In fact, if you can use Rust or any other established programming language, you should. Carbon is for organizations and projects that heavily depend on C++; for example, projects that have a lot of C++ code or use many third-party C++ libraries.

We believe that Rust is an excellent choice for writing software within the pure Rust ecosystem. Software written in Rust has properties that neither C++ nor Carbon have. When you need to call other languages from Rust, RPCs are a good option. Rust is also good for using APIs implemented in a different language in-process, when the cost of maintaining the FFI boundary is reasonable.

Källa

Permalänk
Skrivet av Xenofonus:

De som säger att språk Y kommer att döda/byta ut språk X är väl mest click baiters, det förstår nog de flesta. Det är samma sak som när det kommer nya JS-ramverk eller exempelvis Microsoft Blazor, de har lärt sig av sina föregångare och kanske har coola features som löser vanliga problem från sina föregångare men det finns nog ingen som tror att alla kommer sluta rakt av med de äldre sakerna då för mycket tid har investerats, både i arbetstid och kompetensmässigt.

Så om det sker en förändring är den nog mer långsam, över ett decennium eller mer.

Är du säker på att det är "click baiters"? Jag menar, Rust har många fördelar över C++. Det är ett minnessäkert språk och visar god prestanda och i många fall visar en prestanda som är bättre än C++. Jag har dock ingen aning hur man skapar ett språk som är både säkert och kraftfullt. Brukar inte säkerhet bekosta prestanda?

Skrivet av SimpLar:

Att påstå att Carbon skulle kunna ersätta andra moderna språk ger en grovt felaktig bild av dess syfte, så jag hoppas det inte är så många som säger det. Det är menat att vara ett bättre sätt att förvalta stora kodbaser som beror tungt på C++ och är inte något som bör användas för nya projekt. Det är absolut inte som Rust. Att Carbon på det stora hela är ett mindre ont än C++ snarare än ett riktigt bra språk i sig är tydligt från FAQn.

Källa

Fast borde inte Carbon vara bättre än Rust?
Jag menar, många säger att Carbon ska vara en ersättare till Rust av dess prestanda och säkerhet?

Jag tycker att det vore intressant och prata om C++ kommer lyckas övertyga många att det kommer bli ett säkert programmeringsspråk i framtiden. "Modern C++" sägs vara minnessäkert på grund utav vektorer och smarta pekare. Du behöver inte dynamiskt allokera minne alls.

Permalänk
Medlem
Skrivet av heretic16:

Fast borde inte Carbon vara bättre än Rust?

Varför skulle Carbon vara bättre än Rust, hur resonerar du? Jag har redan gett resonemang och källa till varför så inte är fallet nu och varför det är osannolikt att det blir så i framtiden.

Skrivet av heretic16:

Jag menar, många säger att Carbon ska vara en ersättare till Rust av dess prestanda och säkerhet?

Vem säger det? De som utvecklar Carbon säger det rakt motsatta, så vilka är dessa "många"? Jag kommer inte att ta ditt ord för att detta är sant, du behöver källhänvisa när du gör starka påståenden om något som inte är vedertaget.

Permalänk
Medlem
Skrivet av heretic16:

Varför skulle den bli ogiltig? Jag har inte förstått detta. Så länge man inte rör syntaxen så anser jag att koden är helt enkelt orörd. Det är bara kompilatorn som har blivit smartare.

Har inte du redan loopat igenom det här i tråden om att Microsoft börjar "Rusta upp" där det varit en ganska lång diskusion som förklarar varför vissa problem inte lyckats lösas i kompilatorn i C eller tänker jag på en annan person?

Permalänk
Skrivet av SimpLar:

Varför skulle Carbon vara bättre än Rust, hur resonerar du? Jag har redan gett resonemang och källa till varför så inte är fallet nu och varför det är osannolikt att det blir så i framtiden.

Vem säger det? De som utvecklar Carbon säger det rakt motsatta, så vilka är dessa "många"? Jag kommer inte att ta ditt ord för att detta är sant, du behöver källhänvisa när du gör starka påståenden om något som inte är vedertaget.

Om man bygger ett språk som är både snabbare och säkrare samt kan använda C++ kod, ja då uppfattar jag språket som helt enkelt bättre.

Så här skriver Googles Carbon om Carbon själv: https://github.com/carbon-language/carbon-lang

  • Performance-critical software

  • Interoperability with and migration from existing C++ code

  • Software and language evolution

  • Code that is easy to read, understand, and write

  • Practical safety and testing mechanisms

  • Fast and scalable development

  • Modern OS platforms, hardware architectures, and environments

Permalänk
Medlem
Skrivet av heretic16:

Om man bygger ett språk som är både snabbare och säkrare samt kan använda C++ kod, ja då uppfattar jag språket som helt enkelt bättre.

Så här skriver Googles Carbon om Carbon själv: https://github.com/carbon-language/carbon-lang

  • Performance-critical software

  • Interoperability with and migration from existing C++ code

  • Software and language evolution

  • Code that is easy to read, understand, and write

  • Practical safety and testing mechanisms

  • Fast and scalable development

  • Modern OS platforms, hardware architectures, and environments

Det är en väldigt personlig tolkning. Att använda C++ ser jag som något negativt.

Sättet som du använder "snabbare och säkrare" på ihop med ditt citat refererar till Rust och inget i texten som du copy paste:at styrker sådana påstående om att Carbon skulle vara säkrare eller snabbare _än_ Rust.

@heretic16 du verkar ha fastnat i ett resonemang där valet av programmeringsspråk verkar vara en tävling. Välj istället ett språk som du trivs med. Om du gillar C och C++, fortsätt koda C och C++.

Permalänk
Datavetare
Skrivet av heretic16:

Om man bygger ett språk som är både snabbare och säkrare samt kan använda C++ kod, ja då uppfattar jag språket som helt enkelt bättre.

Så här skriver Googles Carbon om Carbon själv: https://github.com/carbon-language/carbon-lang

  • Performance-critical software

  • Interoperability with and migration from existing C++ code

  • Software and language evolution

  • Code that is easy to read, understand, and write

  • Practical safety and testing mechanisms

  • Fast and scalable development

  • Modern OS platforms, hardware architectures, and environments

Från din egen länk

"Existing modern languages already provide an excellent developer experience: Go, Swift, Kotlin, Rust, and many more. Developers that can use one of these existing languages should."

Till och med de som designar Carbon helt med på att det inte är inte en perfekt lösning, utan en lindring i det fall man sitter så djupt i träsket att det inte är realistiskt att komma ut ur det.

NSA har (bl.a. till Bjarne Stroustrup förtret) kommit till samma slutsats som bl.a. Microsoft

"NSA advises organizations to consider making a strategic shift from programming languages that provide little or no inherent memory protection, such as C/C++, to a memory-safe language when possible"

Alla inser att det finns extremt mycket skrivet i C och C++ och att det inte är realistiskt att skriva om all den koden i något annat. Men de flesta är ändå införstådda med att om möjligheten finns gör man bäst i att välja något annat än dessa språk idag.

Hur mycket C++ och saker som försöker vara kompatibelt med C++, som Carbon, än lyckas rätta till existerande problem kvarstår ett gigantiskt problem: ska man vara bakåtkompatibel blir alla nya säkrare finesser "opt-in", d.v.s. det finns inga garantier för att ens ny kod utnyttjar eventuella förbättringar (det skrivs tyvärr fortfarande en del ny C++ kod som ur alla praktiska hänseenden är pre-2011 style, något även Bjarne är smärtsamt medveten kring "Unfortunately, much C++ use is also stuck in the distant past, ignoring improvements, including ways of dramatically improving safety.").

Men just därför att det finns så många fall där C och C++ redan är är en så central del kommer båda dessa språk finnas kvar under överskådlig framtid. Det ändrar inte att det finns bättre alternativ i de fall något annat är ett realistiskt alternativ.

Visa signatur

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

Permalänk
Skrivet av Yoshman:

Från din egen länk

"Existing modern languages already provide an excellent developer experience: Go, Swift, Kotlin, Rust, and many more. Developers that can use one of these existing languages should."

Till och med de som designar Carbon helt med på att det inte är inte en perfekt lösning, utan en lindring i det fall man sitter så djupt i träsket att det inte är realistiskt att komma ut ur det.

NSA har (bl.a. till Bjarne Stroustrup förtret) kommit till samma slutsats som bl.a. Microsoft

"NSA advises organizations to consider making a strategic shift from programming languages that provide little or no inherent memory protection, such as C/C++, to a memory-safe language when possible"

Alla inser att det finns extremt mycket skrivet i C och C++ och att det inte är realistiskt att skriva om all den koden i något annat. Men de flesta är ändå införstådda med att om möjligheten finns gör man bäst i att välja något annat än dessa språk idag.

Hur mycket C++ och saker som försöker vara kompatibelt med C++, som Carbon, än lyckas rätta till existerande problem kvarstår ett gigantiskt problem: ska man vara bakåtkompatibel blir alla nya säkrare finesser "opt-in", d.v.s. det finns inga garantier för att ens ny kod utnyttjar eventuella förbättringar (det skrivs tyvärr fortfarande en del ny C++ kod som ur alla praktiska hänseenden är pre-2011 style, något även Bjarne är smärtsamt medveten kring "Unfortunately, much C++ use is also stuck in the distant past, ignoring improvements, including ways of dramatically improving safety.").

Men just därför att det finns så många fall där C och C++ redan är är en så central del kommer båda dessa språk finnas kvar under överskådlig framtid. Det ändrar inte att det finns bättre alternativ i de fall något annat är ett realistiskt alternativ.

Jag har sett lite intervjuer med Bjarne Stroustrup och han har sagt att han kan inte förenkla syntaxen i C++ för det skulle bryta bakåtkompabiliteten. Däremot så kan han förenkla användningen av C++.

Just denna sekund använder jag C++ med ImGui(Bästa GUI-ramverket någonsin) för att göra grafiska applikationer. Normalt brukade jag använda JavaFX för att göra grafiska applikationer. Men med tanke på att JavaFX är liksom bara så 2008 så dog det helt enkelt ut för mig.

När jag programmerar så brukar VPS-Studio (Analysprogram) för Visual Studio Community larma hela tiden att jag gör fel. Men felet behöver inte vara allvarligt. Den bara "larmar för kul" typ.

Jag hade önskat att det borde ingå i C++ standarden att en C++ kompilator kan ej tillåta minnesläckor. Om en minnesläcka upptäcks, så ska den sluta kompilera. Samt om man överindexerar. Jag förmodar att Stroustrup har en plan för sådant, men med tanke på att han verkar ha redan jobbat på detta i 7 år, då undrar man varför är det inte implementerat än?

Permalänk
Medlem
Skrivet av heretic16:

Jag hade önskat att det borde ingå i C++ standarden att en C++ kompilator kan ej tillåta minnesläckor. Om en minnesläcka upptäcks, så ska den sluta kompilera. Samt om man överindexerar. Jag förmodar att Stroustrup har en plan för sådant, men med tanke på att han verkar ha redan jobbat på detta i 7 år, då undrar man varför är det inte implementerat än?

Som du redan har fått förklarat för dig många gånger:
Därför att en C++ kompilator inte kan upptäcka alla instanser av sådant, och skulle den refusera alla program som kanske innehåller en minnesläcka eller en överindexering (dvs program där kompilatorn inte kan bevisa att sådant inte förekommer) så skulle den stora majoriteten av existerande C++ kod inte kompilera.

Det finns garanterat utrymme för förbättringar, men för att kunna ge några vettiga garantier så måste språket ändras så pass mycket att bakåtkompatibilitet ryker och vi i praktiken får ett nytt språk.

Om du inte tror på oss, så försök fixa problemet själv istället för att bara hålla på och jiddra om att det borde gå. Även om du kommer att misslyckas så kommer du förhoppningsvis att lära dig en massa på vägen.

Permalänk
Skrivet av Erik_T:

Som du redan har fått förklarat för dig många gånger:
Därför att en C++ kompilator inte kan upptäcka alla instanser av sådant, och skulle den refusera alla program som kanske innehåller en minnesläcka eller en överindexering (dvs program där kompilatorn inte kan bevisa att sådant inte förekommer) så skulle den stora majoriteten av existerande C++ kod inte kompilera.

Det finns garanterat utrymme för förbättringar, men för att kunna ge några vettiga garantier så måste språket ändras så pass mycket att bakåtkompatibilitet ryker och vi i praktiken får ett nytt språk.

Om du inte tror på oss, så försök fixa problemet själv istället för att bara hålla på och jiddra om att det borde gå. Även om du kommer att misslyckas så kommer du förhoppningsvis att lära dig en massa på vägen.

För att det är fel på koden?
Är det detta man försöker undvika att rädda?

Permalänk
Medlem
Skrivet av heretic16:

För att det är fel på koden?
Är det detta man försöker undvika att rädda?

Nu vet jag inte vad Bjarne Stroustrup sagt om det här, men min spontana gissning är att han vill att all ny C++ ska skrivas på ett visst sätt, t ex inga new/delete, regler för när man får spara undan en pekare etc. Det blir så att säga ett subset av C++. Följs de reglerna kanske kompilatorn kan bevisa vissa egenskaper på programmet, t ex att ingen use-after-free förekommer. Det borde vara möjligt. Men man kan inte analysera gammal kod som inte följer de nya reglerna för att bevisa varken att den uppfyller egenskaperna eller inte uppfyller egenskaperna, av anledningar som redan förklarats flera gånger.

Permalänk
Medlem
Skrivet av heretic16:

För att det är fel på koden?
Är det detta man försöker undvika att rädda?

Nej, det är inte fel på koden. Koden är skriven enligt spec idag. Det du vill är att kompilatorn skall analysera koden som kommer in och förhindra den här typen av fel. Det Erik_T skriver är att det enda sättet att åstadkomma det är att också blockera en hel massa kod som inte har några problem alls. Då är det inte längre C++, utan ett C+++ eller nåt. Det är i sig inte svårt att göra ett programspråk som liknar C++ men är minnessäkert, men då är det inte C++. Om man skall gör något nytt så kan man lika gärna fixa alla andra korkade grejer i C++, och så blir det ett av de många språk som växer idag. Rust är ett av dem.

Citat:

Jag hade önskat att det borde ingå i C++ standarden att en C++ kompilator kan ej tillåta minnesläckor. Om en minnesläcka upptäcks, så ska den sluta kompilera. Samt om man överindexerar. Jag förmodar att Stroustrup har en plan för sådant, men med tanke på att han verkar ha redan jobbat på detta i 7 år, då undrar man varför är det inte implementerat än?

Just det här problemet är lite speciellt i att vi faktiskt vet att det inte går att lösa genom att bara analysera koden innan den körs. Det finns matematiska bevis på det. Hade det inte varit så, hade någon säkert gjort ett C+++ som bara är minimala förändringar för att göra det säkert. Istället spenderar man mycket mer tid med att göra nya programspråk, för det finns inget lättare sätt.

Strostrup är allt annat än neutral i frågan. Han har ryckt ut till språkets försvar, för antagligen är språket precis som han vill ha det. Han måste vara medveten om kritiken mot språket, och märker att säkerhetsargumentet är den kofot som fungerar när det gäller att få den stora massan att byta bort hans språk. Jag upplever att han mest snackar för att vinna tid. Problemet är olösligt, vilket han säkerligen vet.

Visa signatur

5900X | 6700XT

Permalänk
Medlem
Skrivet av heretic16:

För att det är fel på koden?
Är det detta man försöker undvika att rädda?

Det behöver inte vara något fel på koden (fel då i betydelsen att koden fungerar annorlunda än avsett), men det kan vara omöjligt för kompilatorn att bevisa att den inte innehåller vissa typer av fel.

Permalänk
Skrivet av trudelutt:

Nu vet jag inte vad Bjarne Stroustrup sagt om det här, men min spontana gissning är att han vill att all ny C++ ska skrivas på ett visst sätt, t ex inga new/delete, regler för när man får spara undan en pekare etc. Det blir så att säga ett subset av C++. Följs de reglerna kanske kompilatorn kan bevisa vissa egenskaper på programmet, t ex att ingen use-after-free förekommer. Det borde vara möjligt. Men man kan inte analysera gammal kod som inte följer de nya reglerna för att bevisa varken att den uppfyller egenskaperna eller inte uppfyller egenskaperna, av anledningar som redan förklarats flera gånger.

Ja. Jag har hört att det finns något som heter "Modern C++". Detta är väll ett försök att låta gammal C++ kod försvinna med tiden så att C++ kan bli mer minnessäkrare, utan att bryta bakåtkompabiliteten.

Skrivet av mpat:

Nej, det är inte fel på koden. Koden är skriven enligt spec idag. Det du vill är att kompilatorn skall analysera koden som kommer in och förhindra den här typen av fel. Det Erik_T skriver är att det enda sättet att åstadkomma det är att också blockera en hel massa kod som inte har några problem alls. Då är det inte längre C++, utan ett C+++ eller nåt. Det är i sig inte svårt att göra ett programspråk som liknar C++ men är minnessäkert, men då är det inte C++. Om man skall gör något nytt så kan man lika gärna fixa alla andra korkade grejer i C++, och så blir det ett av de många språk som växer idag. Rust är ett av dem.

Just det här problemet är lite speciellt i att vi faktiskt vet att det inte går att lösa genom att bara analysera koden innan den körs. Det finns matematiska bevis på det. Hade det inte varit så, hade någon säkert gjort ett C+++ som bara är minimala förändringar för att göra det säkert. Istället spenderar man mycket mer tid med att göra nya programspråk, för det finns inget lättare sätt.

Strostrup är allt annat än neutral i frågan. Han har ryckt ut till språkets försvar, för antagligen är språket precis som han vill ha det. Han måste vara medveten om kritiken mot språket, och märker att säkerhetsargumentet är den kofot som fungerar när det gäller att få den stora massan att byta bort hans språk. Jag upplever att han mest snackar för att vinna tid. Problemet är olösligt, vilket han säkerligen vet.

Jag vet inte vad för korkade saker som C++ har.

Är detta inte vanligt med programmeringsspråk? Jag menar, jag ser många som tycker att Rust är lösningen på allt. Sedan så ser jag att vissa anser att Zig är bättre än Rust och Google's Carbon kommer konkurrera ut exakt alla, speciellt Rust. Det är många exalterade situationer.

Skrivet av Erik_T:

Det behöver inte vara något fel på koden (fel då i betydelsen att koden fungerar annorlunda än avsett), men det kan vara omöjligt för kompilatorn att bevisa att den inte innehåller vissa typer av fel.

Hur har dom löst det innan att skriva säkert C++ kod?