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

Permalänk
Medlem
Skrivet av Erik_T:

Det är ingen särskild poäng med att skriva deklarativ kod, precis som det inte finns någon särskild poäng med att skriva imperativ kod. Det är bara lite olika angreppssätt, och olika sätt att skriva kod.
Vissa problem är enklare att lösa med det ena sättet, andra problem med det andra - men det har ytterst sällan eller aldrig att göra med om problemet är domänspecifikt eller inte.

Det är ungefär som att fråga vad det är för poäng med att använda franska istället för tyska. Man kan ju säga samma saker i bägge språken.

Det som beskrivs in den här videon är alltså fel enligt dig?

Även den här länken har missuppfattat
Imperative vs Declarative Programming

Permalänk
Skrivet av anon362173:

Vill du faktiskt dra nytta av att du använder ett native språk så _vill du_ hantera minnet själv. Du vill kunna göra det för att hantera minneslokalitet, undvika onödigt frekventa eller små allokeringar, optimera minnesaccess för cache coherency/locality och så vidare. Det finns ett väldigt brett spann på kodkvalitet när det kommer till C/C++, och du kommer _aldrig_ att uppnå dom högsta nivåerna om du är lat med din minneshantering. Du _VILL_ veta precis hur var och när ditt minne allokeras, läses, skrivs, fetchas till cache på olika trådar och så vidare. Bra eller dåligt skriven kod här kan vara skillnaden på flera storleksordningar i exekveringstider/prestanda.

Om du inte gör det kan du lika gärna använda C# eller ett annat högnivå-språk med GC, runtime/AOT/JIT osv. istället. Men oavsett blir du ju också kvar med usel prestanda i jämförelse som resultat.

Nu skall vi vara noga med vad _du vill kunna_ göra och vad _man måste_ göra. Baserat på 80/20-regeln vågar jag påstå att för minst 80% av all programvara spelar det ingen som helst roll om du har kört minneshanteringen via STLs make_shared/make_unique eller via en noggrant uttänkt modell där du hanterar minnet själv med new och delete. Du kommer spendera mer tid väntandes på nätverket, disk I/O eller user input än du kör din kod så du kommer inte märka av den overhead STL introducerar. I de fall där du kan märka någon skillnad är det fortfarande 80% av koden som är helt irrelevant att optimera. Enligt mina uppskattningar är det 4% av koden där du kan få brilliera med dina kunskaper

De kvarvarande 96% av koden måste inte skrivas supereffektiv. Ute i den bistra verkligheten är ofta utvecklingstiden långt viktigare än prestanda och smarta pekare hjälper till att korta utvecklingstiden genom att avlasta utvecklarhjärnorna. Du skriver "väldigt brett spann på kodkvalitet", vad menar du med kodkvalité? För de flesta företag är kodkvalité a) korrekt kod och b) enkel och lättförståelig kod som är lätt (för andra) att göra ändringar i. Skulle tro att topprestanda kommer ganska långt ner på listan, det är nog mer en nice-to-have. Smarta pekare gör även språket mer tillgängligt för mindre erfarna utvecklare och hjälper dem göra färre misstag. Jag har svårt att se hur världen skulle vara bättre utan smarta pekare.

Permalänk
Inaktiv
Skrivet av Ingetledigtnamn:

Nu skall vi vara noga med vad _du vill kunna_ göra och vad _man måste_ göra. Baserat på 80/20-regeln vågar jag påstå att för minst 80% av all programvara spelar det ingen som helst roll om du har kört minneshanteringen via STLs make_shared/make_unique eller via en noggrant uttänkt modell där du hanterar minnet själv med new och delete. Du kommer spendera mer tid väntandes på nätverket, disk I/O eller user input än du kör din kod så du kommer inte märka av den overhead STL introducerar. I de fall där du kan märka någon skillnad är det fortfarande 80% av koden som är helt irrelevant att optimera. Enligt mina uppskattningar är det 4% av koden där du kan få brilliera med dina kunskaper

De kvarvarande 96% av koden måste inte skrivas supereffektiv. Ute i den bistra verkligheten är ofta utvecklingstiden långt viktigare än prestanda och smarta pekare hjälper till att korta utvecklingstiden genom att avlasta utvecklarhjärnorna. Du skriver "väldigt brett spann på kodkvalitet", vad menar du med kodkvalité? För de flesta företag är kodkvalité a) korrekt kod och b) enkel och lättförståelig kod som är lätt (för andra) att göra ändringar i. Skulle tro att topprestanda kommer ganska långt ner på listan, det är nog mer en nice-to-have. Smarta pekare gör även språket mer tillgängligt för mindre erfarna utvecklare och hjälper dem göra färre misstag. Jag har svårt att se hur världen skulle vara bättre utan smarta pekare.

Jag förstår din poäng, men du missar en detalj: Många bäckar små.

Windows 95 rekommenderade specifikationer var en ancient singlecore 386 på 12.5MHz, 4MB arbetsminne, och 50MB diskutrymme.

Windows 11 rekommenderade specifikationer är modern dualcore 2000 MHz, 4000MB arbetsminne, och 64000MB diskutrymme.

Nog finns det vissa förbättringar här som befogar dom ökade kraven, men om 80% av koden är skriven slappt som du säger, så är det inte jättekonstigt att tänka sig att en majoritet av dessa ökade krav kommer från slappt skriven kod.

Detta är inte bara tillämpbart för Windows såklart, detta gäller nästan all mjukvara idag. Desto kraftfullare hårdvara vi får, desto slappare blir utvecklare. Och jag hatar det!

Tänk vad mycket prestanda som ligger på bordet här, som blir helt bortslösat på slappt kodhantverk.

Är programmering bara ens dagjobb och inget mer, dvs. man vill bara få arbetsdagen klar, man skiter i kvalitet på denna nivå, ja då är säkert (o-)"smart" minneshantering jättebra.

Men bryr man sig det minsta om hantverket man utför så ger man mer effort än såhär, tycker jag. Tänk om alla utvecklare var lika mycket neuropatiska autister som jag själv, och la 15% mer arbetskraft på att alltid göra saker ordentligt? Kan du tänka dig hur mycket processeringskraft, minne osv. vi hade haft idag? All mjukvara hade varit sinnessjukt snabb i jämförelse med skräpet som finns idag.

Utopiskt, javisst. Men jag tycker ändå man kan försöka bryta denna lathetstrend.

Tillägg: Och skiter man i detta, ja men använd C# eller Java istället. C++ ger dig ingenting i dessa fall!

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Nu skall vi vara noga med vad _du vill kunna_ göra och vad _man måste_ göra. Baserat på 80/20-regeln vågar jag påstå att för minst 80% av all programvara spelar det ingen som helst roll om du har kört minneshanteringen via STLs make_shared/make_unique eller via en noggrant uttänkt modell där du hanterar minnet själv med new och delete. Du kommer spendera mer tid väntandes på nätverket, disk I/O eller user input än du kör din kod så du kommer inte märka av den overhead STL introducerar. I de fall där du kan märka någon skillnad är det fortfarande 80% av koden som är helt irrelevant att optimera. Enligt mina uppskattningar är det 4% av koden där du kan få brilliera med dina kunskaper

De kvarvarande 96% av koden måste inte skrivas supereffektiv. Ute i den bistra verkligheten är ofta utvecklingstiden långt viktigare än prestanda och smarta pekare hjälper till att korta utvecklingstiden genom att avlasta utvecklarhjärnorna. Du skriver "väldigt brett spann på kodkvalitet", vad menar du med kodkvalité? För de flesta företag är kodkvalité a) korrekt kod och b) enkel och lättförståelig kod som är lätt (för andra) att göra ändringar i. Skulle tro att topprestanda kommer ganska långt ner på listan, det är nog mer en nice-to-have. Smarta pekare gör även språket mer tillgängligt för mindre erfarna utvecklare och hjälper dem göra färre misstag. Jag har svårt att se hur världen skulle vara bättre utan smarta pekare.

Företag med kodbaser i C++ definerar definitvt hög prestanda som ett bra mått på kodvalitét. Samma företag premierar också utvecklare som inte lever enligt någon 80/20-regel. Man väljer liksom inte C++ om ens enda mål är att implementera lite businesslogik med kort utvecklingstid.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Ute i den bistra verkligheten är ofta utvecklingstiden långt viktigare än prestanda och smarta pekare hjälper till att korta utvecklingstiden genom att avlasta utvecklarhjärnorna.

Varför skulle det vara lättare eller korta tiden?

Jag kan ta ett exempel med annat språk för att beskriva problemet.

Python räknas ofta som ett enkelt språk, behövs knappt programmeringskunskaper för att åtakomma något i python och det behövs inte mycket kod heller om man lyckats leta upp bra bibliotek.

Superlätt eller hur eller kanske inte

För jag vill påstå att o-dokumenterad pythonkod där saker namngivits efter domänen är bland det svåraste som finns för andra utvecklare att sätta sig in i.

Pythonkod kan lätt bli helt omöjlig för andra än den som skrivit koden att förstå.

Permalänk
Medlem
Skrivet av Yoshman:

Din representation ovan kanske verkar smart. Det är fullt rimligt, men den är i praktiken långsammare än den som i alla fall LLVM libc++ och GNU C++ biblioteket använder.

Meningen var inte att jag skulle skriva en egen strängklass utan visa poängen. Jag vet att strängklasserna i stl är mycket optimerade och man behöver inte skriva en egen

Strängar brukar de flesta känna till så därför tog jag det som ett exempel

Permalänk
Medlem
Skrivet av Yoshman:

Just a FYI: för C-programmerare lär första tanken kring vad ett _s suffix betyder inte matcha med vad som står här (där står det för "safe").

Möjligen men många vet fortfarande vad hungarian notation är och har två till markeringar av samma slag
*_s = static medlemmar eller metoder
*_g = globala variabler eller metoder
*_d = debug variabler eller metoder

Finns några regler till och de finns där för att ta ner vad man ibland kallar för "cognitive load". Programmeraren skall inte behöva memorera något utöver att följa koden i debug.

Skrivet av Yoshman:

Vilket leder tillbaka till frågan: varför anser du det irrelevant att det finns klara minnes-buggar i den kod du listade? Om de är irrelevanta, varför finns det då ens assert() som fångar de flesta?

Om jag säger så här, man kan inte skriva för få assert. Assert är ett superbra komplement för att säkra koden. Men de här kan vara rätt slarviga, det gör inte så mycket och håller man på och testar kod, det råkar smälla så kan man lägga till mer assert då och ytterligare säkrar upp.

Jag personligen lägger inte så mycket tid på att fundera ut vilka assert jag tar med mer än de som jag kan tycka behövs just då när jag skriver koden.
Jämför lite med att skriva test. Test tar inte i närheten av alla fel som kan uppkomma men en del tycker det ändå är viktigt att skriva tester. Med assert behövs knappt tester för assert tar mer
Istället kan man fokusera på att skriva tester som kör produktionskod och jämför resultat eller liknande

Permalänk
Medlem
Skrivet av Yoshman:

TL;DR se till att använd standardbiblioteket i C++, det är designat av folk som faktiskt vet vad de håller på med (i alla fall för de mest populära systemen/kompilatorerna)!!!

Och förhoppningsvis dyker det snart upp en strängklass för utf-8 för det saknas om den inte nyligen dykt upp. En sådan har jag behövt skriva och det är faktiskt en väldigt bra övningsuppgift, och svår sådan.
utf-8 krånglar till det ordentligt för en del saker samtidigt som man får bra förståelse för varför vissa saker ibland måste optimeras genom att anpassa koden

Permalänk
Skrivet av Wefod:

Företag med kodbaser i C++ definerar definitvt hög prestanda som ett bra mått på kodvalitét. Samma företag premierar också utvecklare som inte lever enligt någon 80/20-regel. Man väljer liksom inte C++ om ens enda mål är att implementera lite businesslogik med kort utvecklingstid.

Skrivet av anon362173:

Tillägg: Och skiter man i detta, ja men använd C# eller Java istället. C++ ger dig ingenting i dessa fall!

Om man i dag väljer C++ som programspråk står sannolikt prestanda högt upp på önskelistan, men en hel del gjorde valet långt tidigare. Jag har i modern tid jobbat i olika kodbaser som har sina rötter i förra årtusendet. Där och då var C++ det naturliga valet om man ville upplevla sina C-projekt till något mer modernt. Inom embedded kan urvalet av programspråk vara begränsat. Det finns tillfällen där prestanda är det enda man bryr sig om, men jag tror inte programmerande i C++ nödvändigtvis likställer termen kodkvalité med prestanda hos den genererade koden.

Skrivet av anon362173:

Utopiskt, javisst. Men jag tycker ändå man kan försöka bryta denna lathetstrend.

Jo, jag håller med, mjukvara som utvecklas i dag skulle definitivt kunna förbättras om folk brydde sig (mer). Frågan är om man åstadkommer detta genom att kategoriskt avfärda mindre kunniga utvecklare, och de som inte behöver bry sig om prestanda, som idioter

Permalänk
Skrivet av klk:

Varför skulle det vara lättare eller korta tiden?

Min teori är att om man inte behöver bry sig om saker som när objekt behöver frigöras, då kan utvecklarhjärnan fokusera på att lösa problemet som ska lösas snarare än att hålla reda på vilken som är den sista referensen till objektet. Klipper man bort objektadministrationen från utvecklingstiden torde den bli kortare.

Dessutom slipper du en kategori elaka buggar med stale pointers där problemen ofta inte visar sig i unit tester utan märks först när det frigjorda minnet allokerats om och har annat innehåll än den som följer pekaren tror att det har. Ja, det finns verktyg som hjälper dig att hitta dessa, men det är väl bättre att slippa dem helt och hållet?

Permalänk
Inaktiv
Skrivet av Ingetledigtnamn:

Om man i dag väljer C++ som programspråk står sannolikt prestanda högt upp på önskelistan, men en hel del gjorde valet långt tidigare. Jag har i modern tid jobbat i olika kodbaser som har sina rötter i förra årtusendet. Där och då var C++ det naturliga valet om man ville upplevla sina C-projekt till något mer modernt. Inom embedded kan urvalet av programspråk vara begränsat. Det finns tillfällen där prestanda är det enda man bryr sig om, men jag tror inte programmerande i C++ nödvändigtvis likställer termen kodkvalité med prestanda hos den genererade koden.

Jo, jag håller med, mjukvara som utvecklas i dag skulle definitivt kunna förbättras om folk brydde sig (mer). Frågan är om man åstadkommer detta genom att kategoriskt avfärda mindre kunniga utvecklare, och de som inte behöver bry sig om prestanda, som idioter

Handlar inte om att avfärda någon som idiot. Handlar om att sätta en högre ribba för vad som betraktas som acceptabelt.

Permalänk
Skrivet av anon362173:

Handlar inte om att avfärda någon som idiot. Handlar om att sätta en högre ribba för vad som betraktas som acceptabelt.

Jag tänkte mer på dina tidigare uttalanden om slöa, lata och inkompetenta utvecklare som behövde kryckor och stödhjul.

Permalänk
Inaktiv
Skrivet av Ingetledigtnamn:

Jag tänkte mer på dina tidigare uttalanden om slöa, lata och inkompetenta utvecklare som behövde kryckor och stödhjul.

Mina kommentarer handlar om C++ funktionalitet som är utvecklade specifikt för att fungera som kryckor/stödhjul för lata utvecklare. Handlar inte om att avfärda utvecklarna eller att låta nedsättande, handlar om att kritisera utvecklingen av C++ och trenden av lata utvecklare i stort.

Sammanhang är viktigt.

Permalänk
Datavetare
Skrivet av klk:

Och förhoppningsvis dyker det snart upp en strängklass för utf-8 för det saknas om den inte nyligen dykt upp. En sådan har jag behövt skriva och det är faktiskt en väldigt bra övningsuppgift, och svår sådan.
utf-8 krånglar till det ordentligt för en del saker samtidigt som man får bra förståelse för varför vissa saker ibland måste optimeras genom att anpassa koden

Att direkt representera strängar m.h.a utf-8 är en väldigt dålig idé. Varför skulle man vilja göra det när det ger lång prestanda för att indexera, och därmed slice:a, i strängen?

Utf-8 är ett format man behöver kunna göra encode/decode till/från. När strängar befinner sig i RAM använder man unicode, och det stödjer C++ sedan länge även om det i praktiken finns en lång rad problem då de flesta bibliotek bara hanterar strängar där varje tecken är en "char".

Så applikationer med stor mängd stränghantering är väl också ett bra exempel på när man nog i första hand ska använda något annat än C++. Inte för att "modern C++" egentligen har några problem med det, utan därför att om man kör C#, Rust, Go etc så är ju fördelen att de aldrig haft någon annan form av sträng än en som hanterar unicode och därmed hanteras det också korrekt i bibliotek.

Visa signatur

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

Permalänk
Inaktiv
Skrivet av Ingetledigtnamn:

Min teori är att om man inte behöver bry sig om saker som när objekt behöver frigöras, då kan utvecklarhjärnan fokusera på att lösa problemet som ska lösas snarare än att hålla reda på vilken som är den sista referensen till objektet. Klipper man bort objektadministrationen från utvecklingstiden torde den bli kortare.

Dessutom slipper du en kategori elaka buggar med stale pointers där problemen ofta inte visar sig i unit tester utan märks först när det frigjorda minnet allokerats om och har annat innehåll än den som följer pekaren tror att det har. Ja, det finns verktyg som hjälper dig att hitta dessa, men det är väl bättre att slippa dem helt och hållet?

Sånt här kommer med erfarenhet, för mig sitter minneshantering i ryggmärgen. Det är en tröskel att ta sig över och sen måste man hålla sig lite slipad för att inte bli rostig, men det blir en ickeissue med tid och erfarenhet!

Tar du spelbranschen som exempel så blir dessa saker alltid viktiga. Ta ett partikelsystem eller ett poolat system av dekaler som exempel, gör du den lata approachen så får du mycket stuttering och höjda frametimes, och begränsar antalet partiklar avsevärt. Gör du det ordentligt istället så kommer du knappt märka systemen i din profiler, trots att du kan ha 10x så många partiklar på skärmen samtidigt.

Permalänk
Datavetare
Skrivet av klk:

Möjligen men många vet fortfarande vad hungarian notation är och har två till markeringar av samma slag
*_s = static medlemmar eller metoder
*_g = globala variabler eller metoder
*_d = debug variabler eller metoder

Finns några regler till och de finns där för att ta ner vad man ibland kallar för "cognitive load". Programmeraren skall inte behöva memorera något utöver att följa koden i debug.

Om jag säger så här, man kan inte skriva för få assert. Assert är ett superbra komplement för att säkra koden. Men de här kan vara rätt slarviga, det gör inte så mycket och håller man på och testar kod, det råkar smälla så kan man lägga till mer assert då och ytterligare säkrar upp.

Jag personligen lägger inte så mycket tid på att fundera ut vilka assert jag tar med mer än de som jag kan tycka behövs just då när jag skriver koden.
Jämför lite med att skriva test. Test tar inte i närheten av alla fel som kan uppkomma men en del tycker det ändå är viktigt att skriva tester. Med assert behövs knappt tester för assert tar mer
Istället kan man fokusera på att skriva tester som kör produktionskod och jämför resultat eller liknande

Du borde nog kalla det något annat än "hungarian notation". Standarder är bra, alla borde ha en (egen...).

I den "riktiga" hungarian notation är det ju bara ett prefix, inte ett suffix. Vidare finns inte någon av de betydelser du listar ovan med.

Men kanske viktigast: "hungarian notation" borde väl rimligen totalt poänglöst i ett starkt/statiskt typat språk (som C++)? Microsoft använde det friskt på 80-talet i C och det lever delvis kvar än p.g.a. historik.

Det hade en poäng när dels kompilatorer var betydligt sämre på den tiden, dels har det ett större värde i C som är ett svagt/statisk typat språk (stark/svag är en skala, men C är väsentligt svagare jämfört med C++ som i sin tur är svagare än t.ex. Go och Rust som inte tillåter några som helst implicita omvandlingar).

Visa signatur

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

Permalänk
Inaktiv
Skrivet av Yoshman:

Att direkt representera strängar m.h.a utf-8 är en väldigt dålig idé. Varför skulle man vilja göra det när det ger lång prestanda för att indexera, och därmed slice:a, i strängen?

Utf-8 är ett format man behöver kunna göra encode/decode till/från. När strängar befinner sig i RAM använder man unicode, och det stödjer C++ sedan länge även om det i praktiken finns en lång rad problem då de flesta bibliotek bara hanterar strängar där varje tecken är en "char".

Så applikationer med stor mängd stränghantering är väl också ett bra exempel på när man nog i första hand ska använda något annat än C++. Inte för att "modern C++" egentligen har några problem med det, utan därför att om man kör C#, Rust, Go etc så är ju fördelen att de aldrig haft någon annan form av sträng än en som hanterar unicode och därmed hanteras det också korrekt i bibliotek.

Hm, utf8 är ju Unicode? Håller med om att utf8 bara är att betrakta relevant för encode/decode från andra källor. Personligen brukar jag köra UTF32 för mina interna strängrepresentationer (som behöver ha hela Unicode set supportat). Det blir ett 4 bytes heltal för varje kod, så smidigt att slicea och indexa sen ser jag till att stödja UTF8 decode för att göra om ASCII och andra char strängar till UTF32 (utf8 är ju najs på det sättet att det är bakåtkompatibelt och en bra ”catchall” för 1 byte per karaktär strängar)

Permalänk
Datavetare
Skrivet av anon362173:

Hm, utf8 är ju Unicode? Håller med om att utf8 bara är att betrakta relevant för encode/decode från andra källor. Personligen brukar jag köra UTF32 för mina interna strängrepresentationer (som behöver ha hela Unicode set supportat). Det blir ett 4 bytes heltal för varje kod, så smidigt att slicea och indexa sen ser jag till att stödja UTF8 decode för att göra om ASCII och andra char strängar till UTF32 (utf8 är ju najs på det sättet att det är bakåtkompatibelt och en bra ”catchall” för 1 byte per karaktär strängar)

Fel av mig: menade UTF32 där jag skrev unicode. Utf-8 är ett sätt att koda, UTF32 ett annat. Rust/Go etc använder UTF32 för strängar så de hanterar Unicode.

Poängen är, utf-8 encoding är ett dåligt format för att representera strängar i RAM. Det är bra format på disk, nätverk etc.

Visa signatur

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

Permalänk
Inaktiv
Skrivet av Yoshman:

Fel av mig: menade UTF32 där jag skrev unicode. Utf-8 är ett sätt att koda, UTF32 ett annat. Rust/Go etc använder UTF32 för strängar så de hanterar Unicode.

Poängen är, utf-8 encoding är ett dåligt format för att representera strängar i RAM. Det är bra format på disk, nätverk etc.

Då är jag med, och håller med!

Det finns förövrigt C++ bibliotek för texthantering som gör saken väldigt enkel även i detta språket.

Permalänk
Medlem
Skrivet av Yoshman:

Du borde nog kalla det något annat än "hungarian notation". Standarder är bra, alla borde ha en (egen...).

Hungarian notation är alltid "egen". Det är en teknik för att ta bort mental stress (syreförbrukning i hjärnan)

Skrivet av Yoshman:

I den "riktiga" hungarian notation är det ju bara ett prefix, inte ett suffix. Vidare finns inte någon av de betydelser du listar ovan med.

Stämmer inte, beskrivningen av hungarian på wikipedia är felaktig

Skrivet av Yoshman:

Men kanske viktigast: "hungarian notation" borde väl rimligen totalt poänglöst i ett starkt/statiskt typat språk (som C++)? Microsoft använde det friskt på 80-talet i C och det lever delvis kvar än p.g.a. historik.

Jag skulle tippa på att det forfarande används för deras C/C++ kod men jag vet att Microsoft och många andra jättar har stora problem med att få tag i programmerare som kan, de kan behöva anpassa sig. Hungarian Notation kräver mycket disciplin och därav blir det mer problematiskt när mängden utvecklare växer.

Skrivet av Yoshman:

Det hade en poäng när dels kompilatorer var betydligt sämre på den tiden, dels har det ett större värde i C som är ett svagt/statisk typat språk (stark/svag är en skala, men C är väsentligt svagare jämfört med C++ som i sin tur är svagare än t.ex. Go och Rust som inte tillåter några som helst implicita omvandlingar).

Jag tror att just detta med "typer" är den största missuppfattningen om Hungarian.
Att det handlar om typer för en som inte känner till hur stilen skall användas, för den är det som snabbast plockas uppfattas. Typer är självklart viktiga.
Ta ett exempel. Om en metod skrivs och metoden är 1000 rader lång. I programmerare idag säger direkt. Skriv aldrig så långa metoder, vilket självklart är riktigt.
MEN med Hungarian Notation går sådana metoder att skriva, det går att skriva mycket längre. Mitt rekord i vad jag sett i gammal kod, alltså kod skriven av annan är en metod som var strax över 5000 rader.
Det visar lite hur effektiv stilen är även om man självklart måste förstå att olika tekniker inte bör användas överallt. Att bara för det går skriva gigantiskt långa metoder bör man kanske tänka på andra bra regler i hur kod skrivs.

Jobbas i ett projekt så skall utvecklare endast välja förkortningar de uppfattar naturliga för det projektet. De skall inte behöva lära sig ens, utan endast naturliga används. Hungarian är en teknik för att minimera antalet förkortningar och skriva kod som inte skiljer sig mellan olika programmerare.
Det hjälper också i att namnge objekt bra eftersom instanser av objekt ofta får namnen på objekten och är namnen dåliga blir koden genast mer svårläst

Jag tror faktiskt att Hungarian med AI kommer börja växa i popularitet igen.
Har själv använt det i några månader nu och det är extremt effektivt. AI plockar upp dessa mönster direkt.
Skriver jag en klass idag kan jag skriva deklarationerna och sedan be AI skriva definitioner av dem, Man behöver självklart rätta men det är förbluffande hur rätt det blir. Samma med kommentarer, har man kodat med Hungarian är AI otroligt duktig på att producera kommentarer.

De som inte tycker det är någon mening med Hungarian brukar inte ha något alternativt över huvudtaget. Vad som där brukar prakiseras är "skriv som du vill" och då bli det oftast domänspecifika namn i olika varianter. Den typen av kod skiljer sig för varje utvecklare och där har AI inte alls lika lätt att plocka upp mönster

Permalänk
Datavetare
Skrivet av anon362173:

Sånt här kommer med erfarenhet, för mig sitter minneshantering i ryggmärgen. Det är en tröskel att ta sig över och sen måste man hålla sig lite slipad för att inte bli rostig, men det blir en ickeissue med tid och erfarenhet!

Tar du spelbranschen som exempel så blir dessa saker alltid viktiga. Ta ett partikelsystem eller ett poolat system av dekaler som exempel, gör du den lata approachen så får du mycket stuttering och höjda frametimes, och begränsar antalet partiklar avsevärt. Gör du det ordentligt istället så kommer du knappt märka systemen i din profiler, trots att du kan ha 10x så många partiklar på skärmen samtidigt.

Well, gör du ett partikelsystem rätt så ser man endera till att inte behöva allokera speciellt mycket per-frame. Eller så använder man en arena-allokator, vilket är fullt möjligt även om man t.ex. jobbar i C#.

Så det är rätt mycket ett problem som är ortogonalt mot om man använder nakna pekar eller ej. Men visst, det fungerar inte att använda std::unique_ptr<> eller std::shared_ptr<>, men går att göra andra "smarta pekare" för ovan.

Är inte riktigt med på varför du är så emot smarta pekare. En av C++ "killer features" är ju zero-cost abstractions, så är ju 100 % möjligt att använda smarta pekare med samma prestanda som nakna pekar. Men den stora fördelen att man bättre visar för andra vem som är ansvarig för att det pekare pekar på frigörs.

Och ovanpå det frigörs ju det hela vid "rätt tillfälle". Oavsett vilken mänsklig diagnos man råkar ha kommer kompilator göra ett minst lika träffsäkert jobb på den punkten (där Rust samt även "safe-C++" förslaget drar det till sin spets så att det faktiskt inte ens kompilerar om man gör fel här).

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:

Stämmer inte, beskrivningen av hungarian på wikipedia är felaktig

Tänket på denna
https://learn.microsoft.com/en-us/previous-versions/visualstu...

Givet att det var Microsoft som "uppfann" detta lär vad de säger vara "rätt".

Skrivet av klk:

Jag skulle tippa på att det forfarande används för deras C/C++ kod men jag vet att Microsoft och många andra jättar har stora problem med att få tag i programmerare som kan, de kan behöva anpassa sig. Hungarian Notation kräver mycket disciplin och därav blir det mer problematiskt när mängden utvecklare växer.

Kritiken mot Hungarian Notation är att det gör koden svårare att läsa samtidigt som de fördelar det en gång i tiden gav har minskat med moderna editorer/IDE:er och än mer när man kombinerar det med statiskt/starkt typade språk.

Skrivet av klk:

Jag tror att just detta med "typer" är den största missuppfattningen om Hungarian.
Att det handlar om typer för en som inte känner till hur stilen skall användas, för den är det som snabbast plockas uppfattas. Typer är självklart viktiga.
Ta ett exempel. Om en metod skrivs och metoden är 1000 rader lång. I programmerare idag säger direkt. Skriv aldrig så långa metoder, vilket självklart är riktigt.
MEN med Hungarian Notation går sådana metoder att skriva, det går att skriva mycket längre. Mitt rekord i vad jag sett i gammal kod, alltså kod skriven av annan är en metod som var strax över 5000 rader.
Det visar lite hur effektiv stilen är även om man självklart måste förstå att olika tekniker inte bör användas överallt. Att bara för det går skriva gigantiskt långa metoder bör man kanske tänka på andra bra regler i hur kod skrivs.

Historisk fanns det i någon mening ett "försvar" till att skriva väldigt långa funktioner: rätt gjort resulterade det i snabbare binärer, även om man kunde göra en del preprocessor trix med liknande effekt.

Sedan införandet av LTO är det en meningslös optimering. Skriv korta funktioner som gör en sak!

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

Well, gör du ett partikelsystem rätt så ser man endera till att inte behöva allokera speciellt mycket per-frame. Eller så använder man en arena-allokator, vilket är fullt möjligt även om man t.ex. jobbar i C#.

Har tittat på en del sådan lösningar i rust (intressant namnval , typiskt rust) och jag upplever den koden som klart svårare än vad jag kan göra i C++. Självklart har jag en bias men försöker tänka bort den.

I ett projekt jag sitter i nu, där använder vi två olika objekt som vi själva skrivit "överallt" nästan. De är rejält optimerade så internt i dessa är de självklart svårläst. Men de är testade och investerad tid i dem är tagen. Med dessa kan vi rensa upp massor av annan kod.

Permalänk
Medlem

C/C++ kommer finnas kvar i minst 60 år till.

På C++ sidan var det nog '98 jag börja med. Var då mycket new och delete; lite templates etc.
I C++ som följer '17 standard är det extremt ovanligt med att att ens ser new och delete.
Man blir väldigt bra på att använda sdt::make_unique, sdt::unique_ptr och std::move istället.
Dock är visa containrar svåra att hantera. Blir lätt fel. Det är också väldigt ofta man ser folk säga den här är mest effektiv, syftar på big O, men i verkligheten är kanske en ren vektor bättre då den ligger bra i minnet och är snabbare att accessa. (en del cpu:er har enorma cacher idag också).

Tittar på på säkra system så finns det bra standarder så som MISRA. Tycker MISRA C++ inte är så tokig om man vill göra det lätt för sig. Dessa upplevs dock ofta som föråldrade av moderna programmerare.

Erfarenhet? Gör definitivt skillnad men många industrier vill 'skala'. Det är viktigare än kvalité; så om det inte finns någon som beställer att det ska vara säkert enlig 'X' så får du nog det som konsencus på företaget tycker är rimlig kvalité. Jag har hittills aldrig jobbat för någon som på 'riktigt' bryr sig om koden. (en lite tråkig känsla).

Rust kan nog alldeles utmärkt ersätta C++, men hittills så har jag bara sett lite verktyg i Rust. Det finns idag inget business case som skulle få mig att använda Rust. Har stött på lite ramkverk där man försökt varit cool och valt ett annat språk; vilket sen gör det jobbigt med resurs tillförsel när dessa slutar. Om jag hade ansvar för ett sånt område så är det tveksamt att jag skulle tillåta Rust enbart pga. att det inte används i så stor utsträckning ännu.

Webb-världen känns mer flummig där och vi kan Javascripta allt... Minne? vem f*n bryr sig?
Kraschar det så tar vi snabbt upp en till instans... bara det inte craschar för ofta.
Stora Embedded system kommer gå mot det också; det händer redan.

Permalänk
Medlem
Skrivet av Yoshman:

Tänket på denna
https://learn.microsoft.com/en-us/previous-versions/visualstu...

Givet att det var Microsoft som "uppfann" detta lär vad de säger vara "rätt".

Kommer inte ihåg exakt men någon nämnde att xerox (kan ha fel namn) var först och att Charles Simony plockade upp ideen samt förfinade den lite.
Charles Simony är inte en verbalt utåtriktad person som jag uppfattat det. Han är typisk ingenjör så jag antar att detta är en ingengörslösning och bör läsas ur det perspektivet. Så har i alla fall jag tolkat det.
Vad många glömmer av när man lyssnar på "talare" är att utvecklare generellt är introverta. För varje utvecklare som gillar att snacka går det minst 10 introverta som ofta är duktigare än de som gillar att snacka.

Exempelvis så i kod hade Microsoft bland annat c* för variabler som på något sätt var en count (räknare). Skulle man på 90-talet skriva ett windows program men den tidens miljöer var det omöjligt utan Hungarian. Så mycket olika parametrar i en mycket spartansk utvecklingsmiljö kunde ingen utvecklare hålla reda på.

Eller så fanns VB (visual basic) för de som inte kunde programmera.

Simony vart Microsofts chefs-arkitekt och låg bakom Excel som är Microsoft utan konkurrens bästa projekt. Resten av office produkterna tog efter Excel. Innan hade Microsoft försökt i mer än 6 år tror jag att få MS Word att bli en konkurrent till WordPerfect. Koden var fruktansvärd. Efter Excel och deras "Api" skrev de om allt.

Jag tror att utan Simony hade Microsoft inte var de är idag, han är ingen idiot och då bör man också ha det i bakhuvudet när man läser om hans ideer.

Har lyssnat på några av hans få intervjuer i poddar med.

Angående länken så gissar jag att det är en översiktlig förenkling men om man läser det här

Citat:
  1. Mnemonic value—so that the programmer can remember the name.

  2. Suggestive value—so that others can read the code.

  3. "Consistency"—this is often viewed as an aesthetic idea, yet it also has to do with the information efficiency of the program text. Roughly speaking, we want similar names for similar quantities.

  4. Speed of the decision—we cannot spend too much time pondering the name of a single quantity, nor is there time for typing and editing extremely long variable names.

Borde man enligt mig kunna räkna ut syftet, det är tillräckligt
Speciellt nummer 1 och 2.

De som ogillar Hungarian vill plocka bort nummer 1 och observera beskrivningen "so that the programmer can remember the name.". Man vill alltså skriva kod som är svår för programmerare att komma ihåg. Om man tycker ovanstående beskrivning är ok

Python kodare brukar skriva kod för icke programmerare, Python är egentligen ett språk för de som inte tycker om att programmera men ändå måste få något gjort. Python kod som inte är dokumenterad är bland det mest svårlästa som finns även om det är så lätt så att en icke-programmerare kan skriva kod

Permalänk
Inaktiv
Skrivet av Yoshman:

Well, gör du ett partikelsystem rätt så ser man endera till att inte behöva allokera speciellt mycket per-frame. Eller så använder man en arena-allokator, vilket är fullt möjligt även om man t.ex. jobbar i C#.

Så det är rätt mycket ett problem som är ortogonalt mot om man använder nakna pekar eller ej. Men visst, det fungerar inte att använda std::unique_ptr<> eller std::shared_ptr<>, men går att göra andra "smarta pekare" för ovan.

Är inte riktigt med på varför du är så emot smarta pekare. En av C++ "killer features" är ju zero-cost abstractions, så är ju 100 % möjligt att använda smarta pekare med samma prestanda som nakna pekar. Men den stora fördelen att man bättre visar för andra vem som är ansvarig för att det pekare pekar på frigörs.

Och ovanpå det frigörs ju det hela vid "rätt tillfälle". Oavsett vilken mänsklig diagnos man råkar ha kommer kompilator göra ett minst lika träffsäkert jobb på den punkten (där Rust samt även "safe-C++" förslaget drar det till sin spets så att det faktiskt inte ens kompilerar om man gör fel här).

Tycker jag redogjort i tråden nog varför jag tycker det är en dum grej. Det är ett extra lager komplexitet (i termer av kod inte prestanda eller genererad kod), och det uppmuntrar en att vara lat med minnet.

Det finns förövrigt tusen saker till som du missat i din lösning i hur man gör det rätt, och vad som är viktigt att tänka på. Att allokera minnet är bara en grej. Att göra det på ett sätt som läses, skrivs, fetchas till CPU cacher vid rätt tillfälle på rätt trådar osv kommer till.

Smarta pekare ger ingenting till erfarna utvecklare, för en kostnad av komplexitet och uppmuntran till industridestruktiva mönster

Permalänk
Medlem
Skrivet av Yoshman:

Historisk fanns det i någon mening ett "försvar" till att skriva väldigt långa funktioner: rätt gjort resulterade det i snabbare binärer, även om man kunde göra en del preprocessor trix med liknande effekt.

Sedan införandet av LTO är det en meningslös optimering. Skriv korta funktioner som gör en sak!

Problemet idag handlar istället om att programmerare får lära sig någon slags regel om hur lång en metod får lov att vara. Det är lika fel det. Bryta isär metoden endast för att den skulle nå någon slags gräns.

Permalänk
Inaktiv
Skrivet av prklinteractive:

Tycker jag redogjort i tråden nog varför jag tycker det är en dum grej. Det är ett extra lager komplexitet (i termer av kod inte prestanda eller genererad kod), och det uppmuntrar en att vara lat med minnet.

Det finns förövrigt tusen saker till som du missat i din lösning i hur man gör det rätt, och vad som är viktigt att tänka på. Att allokera minnet är bara en grej. Att göra det på ett sätt som läses, skrivs, fetchas till CPU cacher vid rätt tillfälle på rätt trådar osv kommer till.

Smarta pekare ger ingenting till erfarna utvecklare, för en kostnad av komplexitet och uppmuntran till industridestruktiva mönster

För att simplifiera min poäng i den här tråden lite, då jag känner att den leder till cirkulära diskussioner:

Smarta pekare (och mycket annat i nyare STL) tycker jag går att jämföra med stödhjul i motocross. Ja, det hjälper förmodligen mindre erfarna förare då det förhindrar att dom trillar om kull.
Men för erfarna utvecklare blir det istället ett hinder (pga reglerna det enforcerar i pekares fall). Dessutom får det en att ställa sig frågan, bör man inte förvänta sig mer för motocrossförare? Är det verkligen rätt väg att gå att uppmuntra detta ens för nybörjare? Förarna lär sig att köra med stödhjul, tills dom kommer till en bana där dom blir totalt demolerade pga stödhjulen, och att dom aldrig lärt sig något annat.

Som professionell motocrossförare (utvecklare) tycker jag det väldigt krasst är dagisfasoner med ”smarta pekare” och det stjälper mer än det hjälper om man kollar på effekten det har på hela industrin och hela ekosystemet av mjukvara som finns.

Och gillar du inte cross och bryr dig mer om att ta dig från punkt A till punkt B, så kan du köra en trygg stor säker långsam lastbil istället (C#, Java osv)

Permalänk
Datavetare
Skrivet av anon362173:

Tycker jag redogjort i tråden nog varför jag tycker det är en dum grej. Det är ett extra lager komplexitet (i termer av kod inte prestanda eller genererad kod), och det uppmuntrar en att vara lat med minnet.

Det finns förövrigt tusen saker till som du missat i din lösning i hur man gör det rätt, och vad som är viktigt att tänka på. Att allokera minnet är bara en grej. Att göra det på ett sätt som läses, skrivs, fetchas till CPU cacher vid rätt tillfälle på rätt trådar osv kommer till.

Smarta pekare ger ingenting till erfarna utvecklare, för en kostnad av komplexitet och uppmuntran till industridestruktiva mönster

Grejen är att access av minnet är högst ortogonalt mot hur det allokeras, så man förlorar ingenting.

Tvärtom kan man både bättre visa för andra användare vad syftet med en viss minnespool är kontra en annan genom att hantera dem genom olika typer av smarta pekare. T.ex. på en XSX där det finns minne som är olika effektivt för GPU att jobba med eller rent generellt när man har kod där både CPU och andra acceleratorer accessar.

Och om man sen även har minnesareor med samtida access från flera kärnor (vilket man bör undvika som pesten, än mer så i språk som saknar tracing GC) är även själva accessen helt ortogonal. Hanteringen av resurser behöver i högsta grad veta om det finns concurrency-problematik, något som är direkt idiotiskt att lämna upp till användarna att lura ut på egen hand.

Skrivet av anon362173:

För att simplifiera min poäng i den här tråden lite, då jag känner att den leder till cirkulära diskussioner:

Smarta pekare (och mycket annat i nyare STL) tycker jag går att jämföra med stödhjul i motocross. Ja, det hjälper förmodligen mindre erfarna förare då det förhindrar att dom trillar om kull.
Men för erfarna utvecklare blir det istället ett hinder (pga reglerna det enforcerar i pekares fall). Dessutom får det en att ställa sig frågan, bör man inte förvänta sig mer för motocrossförare? Är det verkligen rätt väg att gå att uppmuntra detta ens för nybörjare? Förarna lär sig att köra med stödhjul, tills dom kommer till en bana där dom blir totalt demolerade pga stödhjulen, och att dom aldrig lärt sig något annat.

Som professionell motocrossförare (utvecklare) tycker jag det väldigt krasst är dagisfasoner med ”smarta pekare” och det stjälper mer än det hjälper om man kollar på effekten det har på hela industrin och hela ekosystemet av mjukvara som finns.

Och gillar du inte cross och bryr dig mer om att ta dig från punkt A till punkt B, så kan du köra en trygg stor säker långsam lastbil istället (C#, Java osv)

Vi lär inte komma längre och som något som kört cross i ca 14 år i sin ungdom tycker jag liknelsen på alla sätt är horribel... Stödhjul på en motocross skulle vara direkt kontraproduktivt och farligt.

Enda vi verkar vara överens om är att vi inte lär komma överens

Edit: för att förtydliga varför analogin är usel. Finns absolut inget i användning av abstraktioner som smarta pekar som hindrar exakt samma prestanda som nakna pekar, finns inget som hindrar samma möjligheter till optimering över CPU-kärnor (snarare tvärtom då man enklare kan säkerställa att saker som false-sharing inte händer av misstag), etc. Stödhjulen gör en lång rad rätt normal saker svårare, omöjligt och/eller direkt farligt.

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

Smarta pekare (och mycket annat i nyare STL) tycker jag går att jämföra med stödhjul i motocross. Ja, det hjälper förmodligen mindre erfarna förare då det förhindrar att dom trillar om kull.

Smarta pekare (och mycket annat i nyare STL) tycker jag går att jämföra med stödhjul i motocross. Ja, det hjälper förmodligen mindre erfarna förare då det förhindrar att dom trillar om kull.
Men för erfarna utvecklare blir det istället ett hinder (pga reglerna det enforcerar i pekares fall). Dessutom får det en att ställa sig frågan, bör man inte förvänta sig mer för motocrossförare? Är det verkligen rätt väg att gå att uppmuntra detta ens för nybörjare? Förarna lär sig att köra med stödhjul, tills dom kommer till en bana där dom blir totalt demolerade pga stödhjulen, och att dom aldrig lärt sig något annat.
...

Får passa på och ge beröm för en mycket bra förklaring

OT
Tränade min son i fotboll för en del år sedan, när han var ung (8-12 år). Där gillade en del att dribbla och skjuta mål, passa var inte lika kul. Växte de snabbt kunde en enda spelare avgöra en match.

Var detta bra långsiktigt, för denna snabbväxande spelaren märkte snart hur andra växte ikapp. De andra hade tränat mer på försvar, att passa varandra och taktik.

Flera av de som vart stjärnor som unga slutade för det var inte riktigt lika skoj när de märkte att de inte längre klarade att springa igenom och skjuta mål.

Samma sak är det i programmering, eller annat om man vill bli duktig. Man behöver förstå vad man måste lära sig och där går det inte ta genvägar. Man måste träna