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

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Men sedan börjar du tillskriva C++-programmerare och andra grupper egenskaper och jag undrar
[ul]
[li]Är average Joe som programmerar C++ mer van att hantera stora kodbaser? Det finns stora projekt i C++, ingen tvekan om det, men gör det att C++-programmerare i allmänhet hanterar större kodmängder än de som jobbar i andra språk? Kanske inte, men avsaknaden av ramverk som Django, Spring och React tvingar nog C++-programmeraren att göra mer "för hand", så de kanske jobbar med mer egenskriven kod. Så jag får nog köpa argumentet att de är mer vana att jobba med en större kodbas, men är bristen på hjälpande ramverk en bra sak?[/li]

Jag tror faktiskt inte att C++ ens funderas över för mindre projekt, till och med jag skulle troligen välja något annat för småsaker.
C++ väljer jag för att jag önskar möjligheter att skala (både snabbhet och storlek), lång livslängd, "konkurrens" (koden måste vara bättre för att kunna sälja), köras i många miljöer (finns säkert något mer).

"React" är ju web (något helt annat). Men Django, Spring har allt alternativ i C++ också men väljs C++ skulle man aldrig koda på samma sätt som i java eller python.

Skrivet av Ingetledigtnamn:

[li]Varför gör det mindre ont att skriva dålig kod i andra språk? Vad lägger du i begreppet "dålig kod"? Är det minneshanteringen som spökar igen? Om man nu har problem att göra en bra lösning, oavsett språk, är det då en bra idé att lägga extra sten på bördan genom att välja ett språk som inte har automatisk minneshantering? Den oerfarne C++-utvecklaren får ju bara ännu fler möjligheter att skjuta sig i foten. Handlar det om dålig design/arkitektur så ser jag ingen som helst skillnad på om de gör sina nybörjarmisstag i C++ eller i något annat språk[/li]
[/ul]

Dålig kod är mycket, allt från dålig arkitektur till krångliga lösningar till svårläst kod till kod som är svår att hitta i och en hel massa till.
Ett ämne för en egen tråd.

En C++ programmerare har också fler möjligheter att skriva säker kod

Permalänk
Medlem
Skrivet av orp:

Fall 1: Personen kodar i Python och:
- Kan Pythons många finesser.
- Introducera få buggar.
- Undviker onödig komplexitet.
- Optimerar där det behövs optimering.

Fall 2: Personen kodar i C++ och:
- Kan inte C++ många finesser.
- Introducera flertalet buggar.
- Skriver onödigt komplex kod.
- Optimerar inte där det behövs.

Två helt olika saker

Ja självklart kan du lära dig python och bli skicklig python användare, men då lär du dig inte programmering utan allt som följer med i python. Python är som en verktygslåda där du lär dig använda verktygen.
C++ däremot, där programmerar du. Du gör verktygen

Fall 2 kommer inte bli långvarig i C++

Permalänk
Medlem
Skrivet av klk:

Ok, jag skulle nog kalla det för någon slags elitism om man kräver att andra skall klara av en hög med ord för att uppfattas som bra utvecklare.
De flesta riktigt duktiga utvecklare jag vet om är ganska introverta och inte alls speciellt verbalt begåvade.

Att kunna vedertagna termer och definitioner handlar om att vi vill beskriva saker på ett mer kompakt sätt och om du inte kan dessa så var ärligt och säg "Sorry, jag kan inte detta".

Varför är somliga termer och definitioner ok enl. dig som templates, namespaces osv men inte andra?

Att ha en introvert personligheter innebär ofta att man är mer tillbakadragen i sociala sammanhang inte att man är dåligt påläst. Dvs introverta personer kan ofta termer och definitioner men hoppar ogärna in i diskussioner för att hävda det.

Permalänk
Medlem
Skrivet av klk:

Två helt olika saker

Ja självklart kan du lära dig python och bli skicklig python användare, men då lär du dig inte programmering utan allt som följer med i python. Python är som en verktygslåda där du lär dig använda verktygen.
C++ däremot, där programmerar du. Du gör verktygen

Fall 2 kommer inte bli långvarig i C++

Nu trollar du igen...

Python är ett programmeringsspråk så om du skriver Python så per definition så programmerar du.

Annars kan vi inte klassa C++ som programmering i heller det är enbart ett par stödhjul till C. C++ är ju enbart en verktygslåda för folk som är för dåliga för att koda C...

Permalänk
Medlem
Skrivet av orp:

Nu trollar du igen...

Python är ett programmeringsspråk så om du skriver Python så per definition så programmerar du.

Annars kan vi inte klassa C++ som programmering i heller det är enbart ett par stödhjul till C. C++ är ju enbart en verktygslåda för folk som är för dåliga för att koda C...

Jag trollar inte men du och jag tänker olika om programmering, vad det är.

En python programmerare förstår inte hur en C++ programmerare tänker (självklart finns undantag).

Att hårdkoda är för de flesta python programmerare helt naturligt. Att hårdkoda för C++ programmerare är inte alls bra

Det är massor som man ofta gör i python som man inte skulle göra i C++

Permalänk
Medlem
Skrivet av klk:

Jag trollar inte men du och jag tänker olika om programmering, vad det är.

Jag tror att du trollar eftersom det du skriver nedan brukar folk avgöra med lite abstrakt tänkande...

Skrivet av klk:

En python programmerare förstår inte hur en C++ programmerare tänker (självklart finns undantag).

Om det finns undantag så _bör_ du inte generalisera.

Skrivet av klk:

Att hårdkoda är för de flesta python programmerare helt naturligt.Att hårdkoda för C++ programmerare är inte alls bra

Alla hårdkodar oavsett programmeringsspråk. I min editor just nu så har jag en hårdkodad sträng i C för en socket-path, kan du gissa varför?

Skrivet av klk:

Det är massor som man ofta gör i python som man inte skulle göra i C++

Där är mängder av saker man gör i C++ som man inte gör i C, så därför kan vi inte klassa C++ som programmering?

Permalänk
Skrivet av klk:

Hur tänker du när du menar negativa saker?

Jag tar några axplock.

Här säger du att Go är värdelöst:

Skrivet av klk:

Go använder vad jag kan se en GC och har programmet en GC så är det förpassat till ålderdomshemmet. Språk med GC är inte snabba. Bli inte förvånad om optimerad kod i C++ kan bli 10 gånger snabbare (eller mer) än språk med GC om det är lite luriga saker som skall göras.
Språk med GC använder mer minne (mycket mer), drar inte alls lika mycket nytta av prefetchers, har större fragmentering förutom att de inte kan trixa med bytsen.

Hävdar ogrundat att prefetching skulle fungera sämre i Go. Att man skulle få mer fragmentering, vilket är helt fel eftersom ett språk med GC faktiskt kan packa om saker på heapen. Och att man inte skulle kunna "trixa med bytsen" tror jag inte heller på.

När jag borrar lite djupare i detta ämne får jag veta andra språk utnyttjar cache, prefetching och SIMD sämre:

Skrivet av klk:

Idag handlar nästan allt om cache om man vill ha upp prestandan. Utvecklingen av hårdvara har utvecklats från java till C++ om man tänker på att man måste kontrollera minne för att få hastighet och det har med cachen att göra.

Orsaken till varför C++ (att kontrollerat minnet) är så mycket snabbare är:
Mindre minne används för samma mängd information, med trixande kan man få in mycket mer på liten yta (Många C och C++ utvecklare jobbar med bitar för att få in flera olika saker i exempelvis ett 32 bitars tal).
Kod anpassas till hur en cache fungerar, exempelvis att hantera data i multiplar av 4. Ett objekt som har en sizeof = 64 är mycket snabbare än ett objekt som har en sizeof = 72 och det beror på att en "cache lane" ofta är 64 byte (eller 128).
Prefetchers är väldigt viktiga för att få in data i snabbare delare av cache för idag har processorer cache i flera nivåer.

Lägg på SIMD, ligger data i arbetsminne fungerar de inte, data måste in i cache för att dra nytta av SIMD instruktioner.

Allt detta gör att en utvecklare som optimerar något viktigt i ett program kan få dramatiskt förbättrad prestanda.

10x är inte så konstigt som det låter när man lägger på de här lagren med olika optimeringar. Men det är en okänd värld för de som vägrar att ta i pekare (adresser).

Rent nys.

Långsiktighet och skalning är inte viktigt i Python. Språket är inte gjort för det:

Skrivet av klk:

Python används för att skriva så deklarativa lösningar som möjligt, målet med python kod är att minimera tid i python, bl.a. för att det är seeeeegt. Python är fruktansvärt långsamt.

C++ är visserligen anpassat för mer deklarativ kod än C men normalt är det starkt fokus på imperativa lösningar.
Långsiktighet och att kunna skala koden är viktigt i C++, det är inte alls viktigt i python, Språket är inte gjort för det i alla fall.
Givetvis kan man använda språk till olika saker.

Det är en massa optimering som kompilatorn inte kan göra om språket har GC:

Skrivet av klk:

Förutom att det tar tid att kontrollera access mot minne så är det en hel massa optimeringar en kompilator inte kan göra.

När jag fråga om vilka optimeringar man inte kunde göra för att språket körde GC kom ett exempel med C++ mot Rust!
C++-kompilatorn kunde minsann generera SIMD-kod. Även om du inte uttalat skriver att Rust-kompilatorn inte kan generera SIMD, så är det underförstått i en A mot B-jämförelse. Om både A och B kan göra något är det ju missvisande att lista det för bara den ena.

Skrivet av klk:

Här har du exempelkod när kompilatorn optimerar med simd
https://godbolt.org/z/a7dovoP3s

Jo, Rust kan också generera SIMD-kod.

Om du istället för att droppa random teknisk term och tillskriva det till C++ faktiskt höll dig till det du vet är sant (och kan backa upp med källor) skulle du få mycket mindre mothugg.

Permalänk
Medlem
Skrivet av klk:

Jag trollar inte men du och jag tänker olika om programmering, vad det är.

Nej, det är inte enbart du och jag som tänker olika om programmering. Du och resten av världen tänker olika om innebörden av programmering. Enl. din egen definition för programmering så kan det inte ens tolkas som svenska.

Från SOAL(svenska.se):

Citat:

pro·­gramm·­era verb ~de ~t • ut­arbeta program för dator

Från SO(svenska.se):

Citat:

programmera programmerade programmerat
verb
programme´ra
● analysera ett problem och om­forma det till en arbets­instruktion för en dator

Jag är övertygad om att Python uppfyller dessa kriterier och därför klassas som programmering.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Här säger du att Go är värdelöst:

Ja för snabbhet är det värdelöst och det står jag för

Skrivet av Ingetledigtnamn:

Hävdar ogrundat att prefetching skulle fungera sämre i Go. Att man skulle få mer fragmentering, vilket är helt fel eftersom ett språk med GC faktiskt kan packa om saker på heapen. Och att man inte skulle kunna "trixa med bytsen" tror jag inte heller på.

När jag borrar lite djupare i detta ämne får jag veta andra språk utnyttjar cache, prefetching och SIMD sämre:

Rent nys.

Håller inte med, bara att du inte sett den typen av lösningar som ofta görs i C++. Postade bl.a. en video om det

Så ur snabbhet så tycker jag alla språk med GC är värdelöst

Du får gärna överbevisa mig med exempelkod på realistiska lösningar. Jag har inte letat efter GO kod som skrivs för prestanda, däremot java och C# och det existerar inte

Permalänk
Medlem
Skrivet av klk:

Ja för snabbhet är det värdelöst och det står jag för

Håller inte med, bara att du inte sett den typen av lösningar som ofta görs i C++. Postade bl.a. en video om det

Så ur snabbhet så tycker jag alla språk med GC är värdelöst

Du får gärna överbevisa mig med exempelkod på realistiska lösningar. Jag har inte letat efter GO kod som skrivs för prestanda, däremot java och C# och det existerar inte

Jag tror det är bortkastad tid att försöka överbevisa något för dig eftersom du trollar och ignorerar alla bevis som presenteras.

Permalänk
Medlem
Skrivet av orp:

Jag tror det är bortkastad tid att försöka överbevisa något för dig eftersom du trollar och ignorerar alla bevis som presenteras.

Frågar så här då.
Jag skall lagra 10 olika strängar. Vill inte allokera 10 minnesblock utan ett enda block för alla 10 strängar.
Lagringen för varje sträng vill jag ha som en pekare rätt in i minnet där den finns för att få upp snabbhet och helst alignad med så det fungerar att använda simd instruktioner optimalt.

Konstlad situation men går det här att lösa utan att koden ser bedrövlig ut är jag beredd att backa lite på min åsikt.

Permalänk
Medlem
Skrivet av klk:

Frågar så här då.
Jag skall lagra 10 olika strängar. Vill inte allokera 10 minnesblock utan ett enda block för alla 10 strängar.
Lagringen för varje sträng vill jag ha som en pekare rätt in i minnet där den finns för att få upp snabbhet och helst alignad med så det fungerar att använda simd instruktioner optimalt.

Konstlad situation men går det här att lösa utan att koden ser bedrövlig ut är jag beredd att backa lite på min åsikt.

Nu hittar du enbart på nya saker. Du kan börja med att besvara tidigare frågor innan jag lägger tid på att förklara saker för dig.

Permalänk
Medlem
Skrivet av klk:

Konstlad situation men går det här att lösa utan att koden ser bedrövlig ut är jag beredd att backa lite på min åsikt.

All kod i språk som man inte behärskar ser ju bedrövlig ut.

Skrivet av orp:

Nu hittar du enbart på nya saker. Du kan börja med att besvara tidigare frågor innan jag lägger tid på att förklara saker för dig.

Det här håller jag med om, jag har t.ex. tidigare bett dig berätta om något du faktiskt har gjort, det skulle vara ett bra sätt för oss att kunna verifiera att du är den överlägsna programmeraren du påstår dig vara.

Och nu senast så bad någon dig om din definition på "state".

Permalänk
Medlem
Skrivet av orp:

Nu hittar du enbart på nya saker. Du kan börja med att besvara tidigare frågor innan jag lägger tid på att förklara saker för dig.

När du svarar så då bekräftar du bara för mig att min åsikt stämmer.
Nej jag hittar inte på och kan berätta.
Att ha alla strängar i ett enda block är bra för lokalitet och att det blir ett allokeringsanrop istället för 10 eller mer. När allt ligger i ett block fungerar processorn som bäst och då går det mycket snabbare.
För att ha strängen i ett block behöver du också längden, så varje sträng prefixas med ett längdvärde och sedan kommer tecknen. Det innebär att en kompilator inte kan konstruera blocket och därför inte vet hur det skall optimeras.

Exemplet har de saker där det börjar bli svårt att optimera utan att vara allt för invecklat.

Har nämnt det tidigare men har bl.a. gjort en lösning som lagrar en hel tabell från databasen i minnet med en enda allokering om det inte är långa strängvärden (de använder annan teknik). Valfri SELECT fråga kan mellanlagra information i ett enda minnesblock. I blocket finns det självklart viktiga possitioner och olika typer av data men det ligger samlat.

Permalänk
Skrivet av klk:

Frågar så här då.
Jag skall lagra 10 olika strängar. Vill inte allokera 10 minnesblock utan ett enda block för alla 10 strängar.
Lagringen för varje sträng vill jag ha som en pekare rätt in i minnet där den finns för att få upp snabbhet och helst alignad med så det fungerar att använda simd instruktioner optimalt.

Nu är detta utanför mina normala domäner, men ChatGPT hade inga som helst problem med din utmaning:

package main import ( "fmt" ) // PackedStrings holds multiple strings with 64-byte alignment. type PackedStrings struct { data []byte offsets []int } // alignUp rounds `n` up to the nearest multiple of `alignment`. func alignUp(n, alignment int) int { return (n + alignment - 1) &^ (alignment - 1) } // PackStrings packs multiple strings with 64-byte alignment. func PackStrings(strs []string) PackedStrings { const alignment = 64 var totalLen int offsets := make([]int, len(strs)+1) // Compute total size needed, including padding for alignment pos := 0 for i, s := range strs { offsets[i] = pos pos = alignUp(pos+len(s), alignment) } offsets[len(strs)] = pos // End boundary // Allocate a single large byte slice data := make([]byte, pos) // Copy strings into the aligned positions pos = 0 for i, s := range strs { copy(data[offsets[i]:], s) } return PackedStrings{data, offsets} } // Get retrieves the original string by slicing the packed data. func (ps PackedStrings) Get(index int) string { if index < 0 || index >= len(ps.offsets)-1 { return "" } return string(ps.data[ps.offsets[index]:ps.offsets[index+1]]) } func main() { strs := []string{"Hello", "World", "GoLang", "CacheOptimized"} ps := PackStrings(strs) // Retrieve and print packed strings for i := range strs { fmt.Println(ps.Get(i)) } // Print memory layout fmt.Println("Offsets:", ps.offsets) }

Dold text
Permalänk
Medlem
Skrivet av Xeonist:

All kod i språk som man inte behärskar ser ju bedrövlig ut.

Menade att koden är bedrövlig för att säkerhet eller annat behöver kopplas bort

Permalänk
Medlem
Skrivet av klk:

De riktigt kassa språken, alltså där jag anser att de faktiskt är dåliga är java och C# (framförallt java). Dessa språk har så mycket designfel i sig, kanske inget de som jobbar med språken tänker på men de finns där i alla fall.

Kan du ge några (fler än 2, färre än 10) egna, konkreta exempel på dessa designfel.
Inga länkar till andras åsikter, jag vill höra dina personliga åsikter om vad för designfel Java (eller kanske C#) har.
Inte för att säga emot dig utan för att förstå din ståndpunkt bättre.

Du kan skippa GC, det har avhandlats en del redan och vi vet att du värderar manuell minneshantering högre än enklare och säkrare kod.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Nu är detta utanför mina normala domäner, men ChatGPT hade inga som helst problem med din utmaning:

Ja att göra ett minnesblock med offsettadresser går i alla språk (det har vi konstaterat) men den skall vara smidig att jobba med. det är det jag menade med att koden inte skall vara bedrövlig. För sådan här kod görs inte om den är för konstig

Permalänk
Medlem
Skrivet av klk:

När du svarar så då bekräftar du bara för mig att min åsikt stämmer.
Nej jag hittar inte på och kan berätta.

När jag säger att "du hittar på" så anser jag inte att din påhittade utmaning är omöjlig utan att det är ett korkat sidospår istället för att avsluta alla andra sidospår du dragit igång.

Permalänk
Medlem
Skrivet av holycrap:

Kan du ge några (fler än 2, färre än 10) egna, konkreta exempel på dessa designfel.
Inga länkar till andras åsikter, jag vill höra dina personliga åsikter om vad för designfel Java (eller kanske C#) har.

Java är sämre än C# eftersom de tvingar fram exceptions regler i några sammanhang.

Men allt är "objekt" utan att följa objektorientering eftersom objekt skickas som referenser. Skall du skicka objekten (kopior) så behöver man trixa.
Det här är värstingen för det är ingen liten miss.

Förutom det så tvingar de fram tilldelning. Och har olika logik kring primitiva typer och extended types (klasser).

Har för mig att java inte har unsigned int heller, eller kan ha fel här.

Sedan har vi detta med att språket tillåts göra saker under ytan som utvecklaren inte vet om, tror visserligen inte det är ett problem för javautvecklare men det är absolut tabu för C/C++ kodare.

C# har också allt i objekt likt java, de har inte javas tvingande exeptions men C# har lagt på "godis" som lockar dålig kod. Exempelvis är det vanligt med getters och setters i C# för det är så lätt. DTO objekt är också vanligt då det finns inbyggd funktionalitet för det i utvecklingsmiljön.

Språken kommer också med gigantiska bibliotek man skall använda sig av, kanske inte skall klandra språksyntaxen för det men gillar det inte

Permalänk
Skrivet av klk:

Ja att göra ett minnesblock med offsettadresser går i alla språk (det har vi konstaterat) men den skall vara smidig att jobba med. det är det jag menade med att koden inte skall vara bedrövlig. För sådan här kod görs inte om den är för konstig

Om du skriver samma sak i C++ blir koden helt plötsligt smidig att jobba med? Skall vi jämföra äpplen och äpplen förväntar jag mig att ditt interface mot blocket presenterar strängarna som std::string.

Permalänk
Medlem
Skrivet av klk:

Sedan har vi detta med att språket tillåts göra saker under ytan som utvecklaren inte vet om, tror visserligen inte det är ett problem för javautvecklare men det är absolut tabu för C/C++ kodare.

Varför är det inte OK att Java gör saker under ytan?
Varför är det OK att C++ gör saker under ytan?

Skrivet av klk:

Språken kommer också med gigantiska bibliotek man skall använda sig av, kanske inte skall klandra språksyntaxen för det men gillar det inte

Varför är det OK att C++ kommer med gigantiska bibliotek?

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Om du skriver samma sak i C++ blir koden helt plötsligt smidig att jobba med? Skall vi jämföra äpplen och äpplen förväntar jag mig att ditt interface mot blocket presenterar strängarna som std::string.

I C++ kan du casta om saker och göra det enklare, känner inte till möjligheterna för det i Go men om språket skall vara minnessäkert gissar jag att det är problem med sådant.

Den här typen av kod är mycket vanlig i C/C++, har inte sett samma i GC språk
Exemplet var också enkelt men har det som ofta behöver göras

Permalänk
Medlem
Skrivet av orp:

Varför är det OK att C++ gör saker under ytan?
Varför är det OK att C++ kommer med gigantiska bibliotek?

Inget är ok

Permalänk
Medlem
Skrivet av klk:

Inget är ok

Så C++ är inte OK så vi ska hålla oss till C och Zig?

Permalänk
Medlem
Skrivet av orp:

Så C++ är inte OK så vi ska hålla oss till C och Zig?

inte ok att göra saker under ytan (utvecklaren har inte kontroll)
inte ok att skeppa med massa saker för att kunna köra programmet

samma med C och jag tror zig följer detta mönster

Permalänk
Datavetare
Skrivet av klk:

Så ur snabbhet så tycker jag alla språk med GC är värdelöst

Du har redan fått konkret exempel på fall där samma imperativa logik blir väldigt mycket snabbare med en GC jämfört med C++, kanske på plats med sanna konkreta exempel på varför GC är så mycket långsammare? (Och, nej din video duger inte då arena-allokator är absolut inte unikt för C++ utan går med fördel att göra även om man har en GC)

Skrivet av klk:

Du får gärna överbevisa mig med exempelkod på realistiska lösningar. Jag har inte letat efter GO kod som skrivs för prestanda, däremot java och C# och det existerar inte

Får väl tillstå att jag helst slipper koda i Java. Men går inte att komma ifrån att det vi fick höra under senare delen av 90-talet om att "JIT-kod kan vara precis lika snabb som kompilerad C/C++, eller i vissa fall till och med snabbare" kanske kändes som ett skämt de första 10-20 åren efter Javas intåg på marknaden.

Idag är det en realitet, ignorerat "JIT-warmup" så är presterar de mest optimerande JVM:miljöerna otroligt bra och de används absolut i en del väldigt prestandakrävande miljöer.

Några exempel där Java används bl.a.

LMAX Disruptor: A low-latency messaging library developed for a trading platform; Java-based and famous for its performance.

Sedan finns "big-data" ramverken Kafka, Hadoop och Spark som alla körs på JVM (skrivna i Java och Scala).

Vad det gäller Go är som sagt inte dess styrka "compute-bound". Men med mindre än att du också överger väldigt grundläggande funktioner som libc och det som ligger direkt ovanpå i C++ standardbibliotek så är det rejält svårt att matcha I/O-prestandan man hyfsat lätt når i Go från C++ (framförallt i Linux där Go använder io-ring och liknande "by default").

Visa signatur

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

Permalänk
Datavetare
Skrivet av klk:

Ja att göra ett minnesblock med offsettadresser går i alla språk (det har vi konstaterat) men den skall vara smidig att jobba med. det är det jag menade med att koden inte skall vara bedrövlig. För sådan här kod görs inte om den är för konstig

Vad är det det specifika problemet i andra språk?

Go har pekare, men inte pekar-aritmitik. Vad är det som är krångligt i det exempel som Ingetledigtnamn gav dig i Go ovan, ser väl väldigt "enkelt" ut och är framförallt ingen extra kopiering av data eller liknande. Gör man en minimal förändring går det också enkelt att iterera över sina "packade" strängar (fortfarande utan kopiering).

func (ps PackedStrings) Get(index int) (string, bool) { if index < 0 || index >= len(ps.offsets)-1 { return "", false } return string(ps.data[ps.offsets[index]:ps.offsets[index+1]]), true } func (ps PackedStrings) Iter() iter.Seq[string] { return func(yield func(string) bool) { for i := 0; ; i++ { if s, ok := ps.Get(i); !ok || !yield(s) { return } } } } ... // Can then iterate like this over the packed strings, zero-copy for s := range ps.Iter() { fmt.Println(s) }

Dold text

Att kunna casta saker i princip hur som helst har sina användningsområden, men det är ändå en av sakerna som lite kommit att bita C och C++ i arslet för idag kan det hindra kompilator från att göra vissa optimeringar som är möjliga i andra språk som Rust, Go, C#, Java m.fl.

Att inte kunna garantera att en viss minnesadress är typ-stabil under sin livslängd hindrar också vissa multicore-optimeringar. I.e. det är C och C++ som börjar uppvisa vissa ålderdomssymtom här då HW-design har ändrats!

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 klk:

inte ok att göra saker under ytan (utvecklaren har inte kontroll)
inte ok att skeppa med massa saker för att kunna köra programmet

samma med C och jag tror zig följer detta mönster

Vi har pratat om det här förut. Ur språkstandardens synvinkel är det bara effekterna synliga i den virtuella maskinen som beskrivs. Finns de där är det en tillåten översättning.

Kompilatorn gör saker under ytan hela tiden. Det anropas destruktorer. Det görs en massa hemskheter under ytan när du har virtuella baser och ett objekt skall ses om en av dess virtuella baser.

Hur påverkas din bild av att inget får göras under ytan när man slår på optimering? Loop invariant code motion flyttar exempelvis ut kod ur en loop. Koden som lyfts ut är inget du har bett om att det skall evalueras före loopen. Common sub expression kan flytta kod långt. Det är också kod som kommer evalueras på ett ställe där du inte har bett om det.

Stavfel
Permalänk
Medlem

Läser denna tråd som en spännande deckare full med tvists och oväntade vändningar. Samtidigt som man lär sig mycket så är det omöjligt att sätta fingret på vem antagonisten är och hur man kan kommentera för att ringa in denne.

Skrivet av klk:

Sedan har vi detta med att språket tillåts göra saker under ytan som utvecklaren inte vet om, tror visserligen inte det är ett problem för javautvecklare men det är absolut tabu för C/C++ kodare.

Tänker du på kompilatoroptimering här? Det är ju stor skillnad på -O1 och -O3, för du kör väl med optimering? Eller kör du utan optimering; för att det ger bättre kontroll på vilken assembler som genereras utifrån hur du skriver din kod?

När du jämför språken, hur ställer du dig till att kompilatorerna har gemensam backend för flera språk med gemensam optimering.

GCC LLVM Yes Yes C Yes Yes C++ Yes - Objective C Yes Yes Fortran Yes Yes Ada (GNAT) Yes Yes D Yes Finns Go Finns Yes Rust - Yes Zig Med många fler...

Precis som COBOL och FORTRAN idag har blivit nischade i bank- respektive den akademiska världen så utsätts språken ständigt för ökade krav. I C får man snällt handkoda för de finesser som efterfrågas på dagens moderna marknad, medans C++ möter detta med att återigen införa utökningar i språket. Evolutionen går vidare och ideer och tankesätt flödar ständigt mellan språken.