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

Permalänk
Datavetare
Skrivet av klk:

Det kan så vara, att det är enklare i algoritmer men tror inte heller det är speciellt svårt i andra språk

Om jag beskriver en normal servermjukvara som skall hantera exempelvis frontend för massa användare-

  • Säkerhet

  • Databasen (här har databaser själva löst problemet, finns gott om tekniker för att skala databaskopplingar)

  • Cacha data

  • Antal endpoints

  • Specialfunktioner (här är allt som är special för specifikt system)

Om en server är stateless måste i princip alla ovanstående delar lösas utanför servern förutom endpoints (serverns körbara metoder ). Det blir snabbt en stor röra om man går utanför databas och säkehet då just databashantering och säkerhet är så vanligt så där brukar det finnas färdiga ramverk och följa. Så fort projekt går utanför ramverken är risken extremt stor för kollaps, utvecklare är inte tränade i att skriva sådant samt att ramverken i sig blir en börda (teknisk skuld).

En server som kan hantera state kan hantera säkerhet internt, databasen körs likartat med stateless servrar men saker som cache vilket kan minska ner databasanrop drastiskt, antal endpoints kan minskas och alla specialare blir så mycket enklare.
Men varje del måste hanteras så att det kan skala och vad det oftast då handlar om är att man minimerar logik för att skriva data som flera har tillgång till. All sådan kod är extremt optimerad för att undvika låsningar

Blandar du inte ihop "concurrency" och "parallellism" nu?

Parallellism är inte speciellt vida utbrett i servers då dessa generellt sett är främst I/O-begränsade.

Concurrency: hantera flera saker potentiellt överlappande, kan göras även om man bara har en CPU-tråd!!!
Parallellism: köra flera saker samtidigt, kräver multipla CPU-trådar.

De flesta språk har stöd för båda. Men ser vi idag också specialisering där Go är ett exempel på något som är riktigt bra på "concurrency", det stödjer också parallellism men det är inte fokus och effektiviteten är inte superbra.

Rust har vi t.ex. Rayon väldigt bra stöd för "parallellism". Det har också stöd för "concurrency" via t.ex. Tokio, men för egen del föredrar jag absolut Go över Rust för just "concurrency".

I standard C++ stöds "parallellism" via saker som execution policies. Concurrency stöds via coroutines. Trådar, så som definierad av POSIX-threads, är tyvärr en rätt illa designad abstraktion då det blandar ihop dessa två koncept helt och hållet (vilket inte kan beskyllas på inkompetens utan mer en konsekvens av dess ålder, initialt var det främst "concurrency" då multicore CPUer var väldigt ovanligt då).

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:

C# tog över VB, inte C++ mer än möjligen i mindre skala. Och det beror framförallt på att många program tvingas till att skrivas om då lagstiftning ändrats. Förr fanns det gott om företag med egna servrar och egen komptens, de förstod själva tekniken.
Sedan ändrades lagar och annat, chefer blev livrädda för att själva ta ansvar för säkerhet då företag kunde åka på massa böter om de "läkte" uppgifter så det mesta började flyttas till molnet (cloud).
Inom cloud kontrollerar IT jättar det mesta och där kan de styra vad som utvecklas med. C# för microsoft är en pengamaskin, inte C++ för där klarar utvecklare tekniken själva.

Sverige idag, där är det mängder med IT konsulter som skriver specialanpassade applikationer och då anpassar man sig efter det, utvecklare måste hålla nere komplexitet och de skall kunnas bytas ut samt det mesta ligger i cloud lösningar.

Java växte på grund av deras runtime, Java kunde köras på olika hårdvara utan att programmerare behövde skriva kod som kunde kompileras upp med olika regler för att passa. Detta har varit en mycket stor bromskloss för C++ där man måste kunna hårdvara och operativsystem samt att det dessutom skall vara smidigt och konfigurera upp projekten. Bara 5 år tillbaka så var det fortfarande stora problem.
Men här har det hänt massor och även om apple är ett hemskt bolag så kanske vi kan tacka dem för mest just när det handlar om att skriva C++ för olika operativsystem. Att apple flyttade till ARM och satsade på att kunna porta program har gjort det mycket enklare att skriva C++ kod till olika hårdvara och olika OS. Idag är det inte alls svårt

C# tog rätt mycket helt över det man på 90-talet skrev med C++ och MFC. Senare tog C# även över det som tidigare skrevs i VB, bl.a. då Microsoft tvingade kunderna till det via VB .NET som mer var C# med VB-syntax än "gamla VB".

Just de specialanpassade applikationer som många konsulter jobbar med är också ett exempel på sådant som på 90-talet främst skrevs i C++ och mindre del även skrevs i VB.

Javas "compile once, run everywhere" var ju länge ett meme, i praktiken fungerade det förvånansvärt dåligt och sanningen var mer "compile once, debug everywhere"... Hade detta fungera hade Go nog inte alls fått den spridning de fått på just molntjänster, för DÄR har man hittat rätt recept (man måste kompilera för den explicita målplattformen, men det kan göras "everwhere" och resultatet fungerar även i praktiken, inte bara i teorin).

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

Som jag varit inne på tidigare, skriv i C++ om ni vill det. Diskussionen är ju om C++ anses vara minnessäkert och i dagsläget är svaret, nej.

Jag har sett en ökad efterfrågan på kod som är skriven i Rust och Go. Samt att jag slår flera flugor i en smäll genom Rust eftersom jag nu har ett andra språk som jag kan skriva drivare i (till Linux).

Exakt! Jag lämnar nu tråden. Det är samma gamla diskussion som alltid kommer upp. C++ utvecklare som inte vill eller ännu inte lärt sig modernare språk mumlar om hur C++ är bäst och nya verktyg inte egentligen är bättre, bara man skriver C++ "rätt".

Men stora organizationer som Google, Amazon, Microsoft och usas regering säger nu att C++ inte bör användas i nya projekt. Jag har själv sett hur mycket effektivare våra team är som jobbar i Rust än C++.

De utvecklare som lär sig de nya verktygen har en edge i framtiden, iaf tills AIn ersätter oss helt. Men existerande C++ kodbaser kommer som sagt inte försvinna, och även mängden C++ utvecklare minskar snabbt vilket gör att det inte direkt är något hot mot folk som bara vill jobba med C++.

Vi har absolut sett problem att hitta kompetent C++ folk, och att erbjuda folk att kunna delvis jobba i Rust har gjort att vi lockat en del heta kandidater som är hungriga på att skriva Rust professionellt.

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Medlem
Skrivet av Yoshman:

Blandar du inte ihop "concurrency" och "parallellism" nu?

det gör jag inte

Det är bara olika effekter som man är ute efter och det är ganska typiskt för servrar som är stateless att fokusera på concurrency, de vill inte vänta på att något arbete som tar lång tid stoppar annat. Krävs inte mycket innan saker går mycket långsammare så personligen är det här inget att fundera på för serverlösningar.

mjukvara som är enkeltrådade lösnignar funderar inte ens på parallellism och behöver inte tänka på att skydda data. data är automatiskt skyddad då bara en tråd kan läsa eller skriva.

parallellism är att lägga på en extra komplexitet men också då kunna dra nytta av flera kärnor och få upp hastigheten. Det som blir något enklare med parallellism är att varje jobb kan köras färdigt. Men får reservera för att min erfarenhet av concurrency mest handlar om frontend (javascript och då asynkron hantering) eller UI för klientapplikationer. Windows och liknande är ju event styrt precis som en browser är.

Skrivet av Yoshman:

Parallellism är inte speciellt vida utbrett i servers då dessa generellt sett är främst I/O-begränsade.

Det är ovanligt för det är svårt. Och som jag skrev, en smart server kan ta ner antalet anrop ordentligt. Istället för att köra fem olika endpoints (kommandon) samtidigt som man måste skicka mängder med data kan en server som hanterar state lösa allt med ett anrop utan att en massa data följer med.

Permalänk
Skrivet av orp:

Som jag varit inne på tidigare, skriv i C++ om ni vill det. Diskussionen är ju om C++ anses vara minnessäkert och i dagsläget är svaret, nej.

Jag har sett en ökad efterfrågan på kod som är skriven i Rust och Go. Samt att jag slår flera flugor i en smäll genom Rust eftersom jag nu har ett andra språk som jag kan skriva drivare i (till Linux).

Jag skriver C++ för jag kan bara C och C++. Jag tycker Rust är för svårt.

Skrivet av Yoshman:

Finns absolut C++ programmerare som aldrig riktigt anammat "modern C++" (C++11 och framåt). Och finns nog flera orsaker till det.

En kritik mot "modern C++" är att det gjorde ett redan komplex språk ännu mer komplext. Men den vanligast är nog den "@Gräs-Mannen" tar upp: man jobbar vidare med "gammal kod" och finns ibland fullt rationella anledningar att det man stoppar in fortsätter följa stilen/nivån som resten håller.

C++11 och senare var en av de större förändringarna som språket gått igenom. Det är en viss tröskel att ta sig över.

Fast Java var knappast en trend som blåste förbi. Java/C# har i praktiken helt ersatt C++ inom en rad områden. De har däremot inte ersatt C++ inom alla områden, Microsoft brände sig bl.a. på att de försökte använda .NET även där det inte passade (eller i alla fall inte var tillräckligt moget när "longhorn" var aktuellt).

Kan mycket väl vara lite samma sak vi ser på storbolagen nu med Rust. Rust kommer knappast ersätta C++ helt och hållet, men 10-20 från nu (Java fyller 30 år 2026 och C# fyller 25 år) kan vi mycket väl se samma sak vi sett med Java/C#: saker som idag fortfarande nyutvecklas i C++ kanske nästan helt gått över till Rust då.

Jag tycker Modern C++ har renare syntax än gamla C++.

Jag tror ISO kommittén kommer hitta en bra lösning. Dom är för smarta för att låta C++ tappa i popularitet. Men just nu verkar det som att dom kommer inte vidare.

Permalänk
Medlem
Skrivet av Yoshman:

C# tog rätt mycket helt över det man på 90-talet skrev med C++ och MFC. Senare tog C# även över det som tidigare skrevs i VB, bl.a. då Microsoft tvingade kunderna till det via VB .NET som mer var C# med VB-syntax än "gamla VB".

Vad jag vet fanns det inte många applikationer som skrevs med MFC men de som gjorde det och inte flyttat till serverlösningar i en browser, där lever många kvar idag. Samma kod som skrevs för mer än 20 år sedan.
Det är INTE lätt att skriva om klientapplikation skriven i C++ till C#, vet knappt jag sett en C# utvecklare som skrivit klientapplikation. Det är server/backend lösningar för hela slanten

Permalänk
Medlem
Skrivet av Gräs-Mannen:

Men stora organizationer som Google, Amazon, Microsoft och usas regering säger nu att C++ inte bör användas i nya projekt. Jag har själv sett hur mycket effektivare våra team är som jobbar i Rust än C++.

C++ är svårt och de flesta som skriver kod förstör, går inte att placera en som precis tagit körkort i en formula 1 bil. Så helt rätt att välja annat språk om man inte har kompetensen.

Det är inte samma sak som att _allt_ plötsligt går mycket snabbare bara för att man byter språk

Permalänk
Medlem
Skrivet av klk:

Så helt rätt att välja annat språk om man inte har kompetensen.

Du menar alltså att 3 av 7 företag i MAG7 byter p.g.a. kompetens-brist? Har dom inte ringt dig då?

Permalänk
Datavetare
Skrivet av klk:

det gör jag inte

Det är bara olika effekter som man är ute efter och det är ganska typiskt för servrar som är stateless att fokusera på concurrency, de vill inte vänta på att något arbete som tar lång tid stoppar annat. Krävs inte mycket innan saker går mycket långsammare så personligen är det här inget att fundera på för serverlösningar.

mjukvara som är enkeltrådade lösnignar funderar inte ens på parallellism och behöver inte tänka på att skydda data. data är automatiskt skyddad då bara en tråd kan läsa eller skriva.

parallellism är att lägga på en extra komplexitet men också då kunna dra nytta av flera kärnor och få upp hastigheten. Det som blir något enklare med parallellism är att varje jobb kan köras färdigt. Men får reservera för att min erfarenhet av concurrency mest handlar om frontend (javascript och då asynkron hantering) eller UI för klientapplikationer. Windows och liknande är ju event styrt precis som en browser är.

Det är ovanligt för det är svårt. Och som jag skrev, en smart server kan ta ner antalet anrop ordentligt. Istället för att köra fem olika endpoints (kommandon) samtidigt som man måste skicka mängder med data kan en server som hanterar state lösa allt med ett anrop utan att en massa data följer med.

Du blandar helt klart ihop "concurrency" med "parallellism". Notera att "concurrency" inte kräver parallellism, men en trevlig bieffekt är ofta att man får viss parallellism när man utnyttjar "concurrency" i många ramverk.

Även om man kör på en enda fysisk CPU-kärna så krävs ju synkroniseringsprimitiver om "concurrency" realiseras via m.h.a. OS-trådar (vilket innan coroutines var rätt vanligt i C++).

Men "concurrency" kan absolut vara enkeltrådat också. NodeJS och därmed också Electron-appar är i grunden helt enkeltrådade, även om det finns sätt runt det hela.

Skrivet av klk:

Vad jag vet fanns det inte många applikationer som skrevs med MFC men de som gjorde det och inte flyttat till serverlösningar i en browser, där lever många kvar idag. Samma kod som skrevs för mer än 20 år sedan.
Det är INTE lätt att skriva om klientapplikation skriven i C++ till C#, vet knappt jag sett en C# utvecklare som skrivit klientapplikation. Det är server/backend lösningar för hela slanten

C# är idag dels hyfsat vanligt för att utveckla spel. Sen kanske du hört talas om applikationer som Visual Studio och MS Office? Även om stora delar fortfarande är skrivna C++ är väldigt mycket av UI-logiken idag C#/WPF.

Microsofts första UI-ramverk för C# var Windows Forms. Ett ramverk man försökt dödat under väldigt lång tid utan att lyckas då helt enkelt allt för många fortfarande använder det. C#/Winforms var och C#/WPF är rätt mycket standardmetoden för att skriva desktop-applikationer i Windows sedan länge. Men trenden går helt klart mot Electron och än mer mot webblösningar, så det går "sådär" med de försök MS gjort med att ersätta WPF (WinUI3 är "det senaste", men det verkar ha relativt lite resurser från MS...).

MFC var rätt stort. Vet inte hur bra det går att söka bakåt, men det fanns ju väldigt mycket böcker och andra resurser om MFC på 90-talet. En kritik ramverket dock fick var att Microsoft inte "ate their own dogfood". Utanför Visual Studio var det väldigt få produkter från Microsoft som använder MFC och det var tyvärr en hel del buggar i MFC (använde det själv hos två olika arbetsgivare i slutet på 90-talet).

Skrivet av klk:

C++ är svårt och de flesta som skriver kod förstör, går inte att placera en som precis tagit körkort i en formula 1 bil. Så helt rätt att välja annat språk om man inte har kompetensen.

Det är inte samma sak som att _allt_ plötsligt går mycket snabbare bara för att man byter språk

Den liknelsen fungerar bara om man ser F1-bil som något hyfsat vanligt. Rust är rätt mycket också en F1-bil i så fall, med den liknelsen en lite nyare modell där man kan åka lika snabbt / snabbare med bättre säkerhet.

Även om Javas "JIT kan ge bättre prestanda än native-språk" länge var "i teorin, men inte i praktiken" är det något man faktiskt lyckades få till. Idag kan JVM-baserade språk prestera på absolut topp-nivå inom många områden, du har fått konkreta exempel i tråden där en GC faktiskt kan ge bättre prestanda jämfört med logiskt motsvarande C, C++ eller Rust-kod.

Finns också optimeringar man kan göra relaterat till lock-free/wait-free algoritmer som endera kräver att minne är typ-konstant (en viss minnesadress representerar samma typ genom hela programmet) alt. man har access till en GC. I din liknelse är väl det kanske formula-e då för JVM-språken, d.v.s. sämre på vissa saker och bättre på andra.

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

Ibland
C++ är svårt och de flesta som skriver kod förstör, går inte att placera en som precis tagit körkort i en formula 1 bil. Så helt rätt att välja annat språk om man inte har kompetensen.

Det är inte samma sak som att _allt_ plötsligt går mycket snabbare bara för att man byter språk

Herregud.

Vi har nästan en miljon rader C++ kod i produktion, deployat både på AWS men även hundratusentals bilar kör vår mjukvara.

Vi tar det igen. Jag säger inte att C++ kommer försvinna.

Men när vi tittar på hur snabbt och säkert, utan buggar och kraschar olika team kan producera kod, då ligger Rust mjukvaran före i vår organisation. Att säga att att "du behöver bara undvika att skriva buggig kod" funkar inte i verkligheten.

Som företag kan man antingen ta in sån statistik (finns liknande historier bland stora FAANGS som redan länkats i tråden) eller så kan man stoppa huvudet i sanden och fortsätta med C++ till nyutveckling också.

Om man har personal som enbart kan C++ och inte vill lära sig nytt, och er domän och mjukvara inte ändrar sig speciellt fort, ja då kanske det valet att stanna på C++ funkar ett tag till. Vad vet jag.

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Skrivet av Gräs-Mannen:

Herregud.

Vi har nästan en miljon rader C++ kod i produktion, deployat både på AWS men även hundratusentals bilar kör vår mjukvara.

Vi tar det igen. Jag säger inte att C++ kommer försvinna.

Men när vi tittar på hur snabbt och säkert, utan buggar och kraschar olika team kan producera kod, då ligger Rust mjukvaran före i vår organisation. Att säga att att "du behöver bara undvika att skriva buggig kod" funkar inte i verkligheten.

Som företag kan man antingen ta in sån statistik (finns liknande historier bland stora FAANGS som redan länkats i tråden) eller så kan man stoppa huvudet i sanden och fortsätta med C++ till nyutveckling också.

Om man har personal som enbart kan C++ och inte vill lära sig nytt, och er domän och mjukvara inte ändrar sig speciellt fort, ja då kanske det valet att stanna på C++ funkar ett tag till. Vad vet jag.

Ska jag vara helt ärlig så har jag inte sett något företag efterfråga om Rust.
Oftast är det .NET eller webbutvecklare typ WordPress. Du vet...90-talets tråkiga språk.

Permalänk
Medlem
Skrivet av heretic16:

Ska jag vara helt ärlig så har jag inte sett något företag efterfråga om Rust.
Oftast är det .NET eller webbutvecklare typ WordPress. Du vet...90-talets tråkiga språk.

Ja, andelen problem där du behöver systemspråk som C++/Rust är otroligt få i relation till all mjukvara. I sverige är ju Ericsson och Volvo enorma arbetsgivare där C++ används till stor del pga embedded vilket ger en något skev bild av hur stort C++ är jämfört med en mer internationell vy.

Jag skulle säga att Rust är större i USA än i Sverige, även om det finns många bolag som inte syns mycket i Sverige som använder Rust.

Visa signatur

Archlinux, Sway och Rust, vad mer behövs?

Permalänk
Skrivet av Gräs-Mannen:

Ja, andelen problem där du behöver systemspråk som C++/Rust är otroligt få i relation till all mjukvara. I sverige är ju Ericsson och Volvo enorma arbetsgivare där C++ används till stor del pga embedded vilket ger en något skev bild av hur stort C++ är jämfört med en mer internationell vy.

Jag skulle säga att Rust är större i USA än i Sverige, även om det finns många bolag som inte syns mycket i Sverige som använder Rust.

Jag skulle också kunna tro att Rust är större i USA än i Sverige. Utvecklare har en tendens att alltid vilja köra med nyaste biblioteket, uppdateringen och ramverken. Jag förstår det också. Nytt är fräscht och modernt. C++ framstår som ett språk för den äldre generationen där man måste veta vad man håller på med.

Jag uppskattar idén om en kompilator som kan ge varningsflaggor och rekommendationer på vad som ska göras bättre. Detta är något som jag tycker Microsoft och GCC borde införa. Detta är inget som förändrar språket. Snarare skulle det vara bra med tips & trix från kompilatorn om vad som rekommenderas.

- Smartare kompilator som ger återkoppling på förbättringar
- Pakethanterare (Alla andra språk har ju detta så...)

Permalänk
Medlem
Skrivet av Yoshman:

Vill du se exempel på idiomatisk Rust som också visar hur man dels kan skriva inom ramen för, just nu, bästa tänkbara skydd mot minnes-osäker kod kan du kika på t.ex.

https://github.com/tkaitchuck/aHash - Hashset/map som är API kompatibel med den i std:rust, fast med klart bättre prestanda

https://github.com/serde-rs/serde - väldigt bra exempel på hur "traits" kan användas väldigt ortogonalt mot andra saker ett bibliotek gör där serde "bara" tillför möjligheten att serialisera/deserialisera dina datastrukturer till JSON, YAML, CSV, Pickle, eller vad det nu må vara. Det på ett högt effektivt och minnes-säkert sätt

https://github.com/rayon-rs/rayon - min favorit då det man uppnår här är på flera sätt helt makalöst, fångar data-race compile-time. Finns få saker som är svårare att få rätt i modern programmering än just concurrency-problem.

Alla dessa tre är saker som inte är del av standardbiblioteket, men som alla är väldigt populära "crates" som alla har 100-tals miljoner nedladdningar. De är alla också utvecklare med idiomatisk Rust.

Ja det var bättre kvalitet där, mer dokumentation också Kanske inte helt rättvist att jämföra generell kod med applikationer
De verkar hålla sig till standardiserade namn inom rust, annars hade dessa bibliotek troligen inte blivit så populära men bra att ta efter även när man skriver applikationer

Passar på att nämna en grej om VS Code som var okänd för mig (gillar inte VS Code). Körs någon konsolapplikation i terminalen och skriver ut saker som liknar filnamn är VS Code dukig på att känna igen och göra namnet klickbart för att öppna filen
Måste ju Visual Studio ta och fixa med, skulle underlätta att köra en hel del i terminalen utan att bygga extensions.

Permalänk
Datavetare
Skrivet av heretic16:

Ska jag vara helt ärlig så har jag inte sett något företag efterfråga om Rust.
Oftast är det .NET eller webbutvecklare typ WordPress. Du vet...90-talets tråkiga språk.

Snabb sökning begränsad till Stockholm ger 50+ jobb taggade med "Rust". Så om man absolut vill jobba med ett specifikt språk går det nog att fixa, i alla fall om det inte är allt för exotiskt språk och man befinner sig i närheten av någon lite större stad.

Det är extremt lätt att bli "hemmablind" och att dra allt för stora växlar på vad man ser i sitt eget närområde. Har jobbat relativt lite med Rust på arbetstid, men har ändå jobbat med Rust-projekt på två olika företag.

Ska man gå på "vad företag söker" gissar jag Python, Java, C# och JS är rätt dominerade idag...

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 Gräs-Mannen:

Herregud.

Vi har nästan en miljon rader C++ kod i produktion, deployat både på AWS men även hundratusentals bilar kör vår mjukvara.

Vi tar det igen. Jag säger inte att C++ kommer försvinna.

Men när vi tittar på hur snabbt och säkert, utan buggar och kraschar olika team kan producera kod, då ligger Rust mjukvaran före i vår organisation. Att säga att att "du behöver bara undvika att skriva buggig kod" funkar inte i verkligheten.

Har inte sagt det heller utan sagt det du beskriver, måste man hantera stor rotation eller likartat med utvecklare behöver man anpassa sig. Men jag tycker många företag missar en hel del om de inte låter utvecklare träna när de skriver kod. Det vanliga är att miljöer är så låsta så det är nära "löpande bandet" på att producera kod. Utvecklare skriver samma sak. Speciellt eftersom smart kod kan ge så mycket tillbaka

Skrivet av Gräs-Mannen:

Som företag kan man antingen ta in sån statistik (finns liknande historier bland stora FAANGS som redan länkats i tråden) eller så kan man stoppa huvudet i sanden och fortsätta med C++ till nyutveckling också.

Den största myten är kanske att FAANGS bolag skulle samla de bästa programmerarna, så är det inte.

Skrivet av Gräs-Mannen:

Om man har personal som enbart kan C++ och inte vill lära sig nytt, och er domän och mjukvara inte ändrar sig speciellt fort, ja då kanske det valet att stanna på C++ funkar ett tag till. Vad vet jag.

Vad menar du skulle vara nytt och lära sig i annat språk, exempelvis rust?
Det enda en C++ skulle lära sig som är nytt där är isåfall att man inte får göra saker som man får lov i C++, alltså bli begränsad

Permalänk
Medlem
Skrivet av heretic16:

Ska jag vara helt ärlig så har jag inte sett något företag efterfråga om Rust.
Oftast är det .NET eller webbutvecklare typ WordPress. Du vet...90-talets tråkiga språk.

Samma förutom då att det ändat sig massor senaste halvåret och tror att efterfrågan på .NET minskat mer än hos andra språk, det mesta minskar. Frontend är som jag tolkar det nära nog omöjlig.

Permalänk
Medlem
Skrivet av Yoshman:

Du blandar helt klart ihop "concurrency" med "parallellism". Notera att "concurrency" inte kräver parallellism, men en trevlig bieffekt är ofta att man får viss parallellism när man utnyttjar "concurrency" i många ramverk.

Även om man kör på en enda fysisk CPU-kärna så krävs ju synkroniseringsprimitiver om "concurrency" realiseras via m.h.a. OS-trådar (vilket innan coroutines var rätt vanligt i C++).

Men "concurrency" kan absolut vara enkeltrådat också. NodeJS och därmed också Electron-appar är i grunden helt enkeltrådade, även om det finns sätt runt det hela.

Förstår inte, vad menar du att jag tror det är?
Skrev jag så otydligt för jag tror nog jag skrev ganska exakt samma som du även om jag förklarade syftet med "concurrency".

Permalänk
Medlem
Skrivet av Yoshman:

MFC var rätt stort. Vet inte hur bra det går att söka bakåt, men det fanns ju väldigt mycket böcker och andra resurser om MFC på 90-talet.

Kan en del om MFC för jag och två andra utvecklare skrev det första programmet i Sverige som blev godkänt för Windows 95, vi skrev det i C++ och MFC. Och det programmet är troligen orsaken till varför SQL Server dominerar stort i Sverige. Vårt samarbete med Microsoft var bra för sålde vi så tjänade de också massor.

Permalänk
Datavetare
Skrivet av klk:

Förstår inte, vad menar du att jag tror det är?
Skrev jag så otydligt för jag tror nog jag skrev ganska exakt samma som du även om jag förklarade syftet med "concurrency".

"parallellism" och "concurrency" är två rätt olika saker som väldigt ofta blandas ihop.

Det du beskriver som önskvärt på servers är "concurrency", vilket är rätt naturligt.

Det finns absolut potentiella säkerhetsproblem, vissa orsakade av felaktig synkronisering mellan OS-trådar (well, om man inte råkar använda safe Rust där sådant upptäcks av kompilatorn). Finns självklart också problematik relaterat till prestanda, om man vill förbättra detta med olika former av cache så blir det så klart också synkroniseringsproblematik.

Det vi diskuterade längre upp är om C++ eller Rust är enklast/mest effektiv om man vill optimera för parallellism, d.v.s. huvudmålet är att så effektivt som möjligt optimera ett "compute-bound" problem. Här är min rätt bestämda åsikt att Rust idag har ett övertag mot C++ både i prestanda och säkerhet (race-conditions kompilerar inte i Rust, de ger buggar som kan vara skitsvåra att hitta i C++).

Men det du beskriver är som sagt "concurrency". Min åsikt är att Rust inte är fullt lika stark där, även om stödet finns i form av Tokio. C++ har historiskt inte varit stark här heller, ASIO är knappast roligt och även om det absolut går att göra detta väldigt effektivt i C++ (något t.ex. NodeJS är ett exempel på) så är det allt annat än enkelt eller elegant. Nu finns ändå coroutines vilket potentiellt kan förbättra denna punkt framåt. Men tror ändå inte vare sig C++ eller Rust kommer matcha Go på denna punkt.

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:

"parallellism" och "concurrency" är två rätt olika saker som väldigt ofta blandas ihop.
Det du beskriver som önskvärt på servers är "concurrency", vilket är rätt naturligt.

Menar du att man inte önskar parallellism på en server?
Låt säga att en webserver skall klara av att serva 1000 samtidiga användare, skall det skötas men en kärna?

Permalänk

I nästa C++ version. C++26 med andra ord. Vad för minnessäkerhet har dom lagt till där? Något måste dom ha lagt till. Dom har ju babblat om minnessäkerhet i flera år nu hos C++ gänget. Något resultat måste dom kunna leverera. Annars får man byta ut cheferna där till mera bittra och stränga.

Permalänk
Datavetare
Skrivet av klk:

Menar du att man inte önskar parallellism på en server?
Låt säga att en webserver skall klara av att serva 1000 samtidiga användare, skall det skötas men en kärna?

Just då man ofta, men långt ifrån alltid, kan dra nytta av flera kärnor när man optimerar för concurrency är orsaken varför dessa koncept ofta blandas ihop.

I både Rust och C# blir nog distinktionen mer tydlig. I Rust är Rayon och i C# är t.ex. TPL bra verktyg för att hantera "parallellism". Det är nog sällan man tar till dessa i fallet du beskriver ovan.

Istället skulle man använda async/await i båda fallen. Huvudmålet är inte att maximera användning av CPU-kärnor, tvärtom är det positivt och rätt gjort ett av utfallen av bra "concurrency design" att man kan hantera väldigt många samtida användare per kärna.

I C/C++ var det tidigare ännu lättare att blanda ihop dessa två koncept då båda byggde på OS-trådar, som i sin tur tyvärr har en dålig abstraktion där dessa två koncept blandas ihop. Idag är det mer renodlat: coroutines för "concurrency" och parallell execution policy för "parallellism". I den server som fullt ut nyttjar C++23 skulle man långt mer använda coroutines, parallell execution policies är något man eventuellt kan nytta i något specialfall där.

Fast oavsett: när det kommer till det klart svåraste, att skapa kod som är fritt från data-race (något som kan ge alla möjliga typer av buggar, inklusive säkerhetshål), så har Rust egenskapen att kunna garantera att programmet är data-race free och samtidigt också ge motsvarande effektivitet som C++. Det är en jättefördel!

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:

Just då man ofta, men långt ifrån alltid, kan dra nytta av flera kärnor när man optimerar för concurrency är orsaken varför dessa koncept ofta blandas ihop.

I både Rust och C# blir nog distinktionen mer tydlig. I Rust är Rayon och i C# är t.ex. TPL bra verktyg för att hantera "parallellism". Det är nog sällan man tar till dessa i fallet du beskriver ovan.

Klistarar in C kod för hur ett fönster registreras in windows för att exemplifiera för en gissning är att det sker något liknande i javascript när man skapar en async, async registrerar eller lägger troligen in något (callback ?) som javascript motorn kan anropa när arbetet är utfört. Så fungerar windows i alla fall, varje applikation har en meddelande snurra som kan anropa registrerade callbacks (WindowProc). Och applikationens meddelande snurra registreras i windows kernel (har säkert fina namn).

Flera språk har ju tagit efter javascripts (kanske annat språk var före) syntax för att registrera callbacks istället för att skriva som man gjorde förr i C.

Detta vad var jag menade med "UI" eller javascripts asyncrona logik. Tror däremot inte att det fungerar händelsestyrt i C# eller en gissning är i alla fall att de har annan hantering för att kunna dra nytta av processorkärnor när det skrivs server kod (var länge sedan jag skrev C# och känner inte till bra hur det fungerar under ytan)

#include <windows.h> // Window procedure (callback) to handle events LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: // Handle window close event PostQuitMessage(0); return 0; case WM_PAINT: { // Handle painting the window PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // Draw text in the window TextOut(hdc, 10, 10, L"Hello, Windows!", 14); EndPaint(hwnd, &ps); return 0; } case WM_KEYDOWN: // Handle key press (e.g., ESC to close) if (wParam == VK_ESCAPE) { DestroyWindow(hwnd); } return 0; } // Default handling for unprocessed messages return DefWindowProc(hwnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Define the window class WNDCLASS wc = { 0 }; wc.lpfnWndProc = WindowProc; // Set the callback function wc.hInstance = hInstance; // Application instance wc.lpszClassName = L"MyWindowClass"; // Unique class name wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Default cursor wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Background color // Register the window class if (!RegisterClass(&wc)) { MessageBox(NULL, L"Window Registration Failed!", L"Error", MB_ICONERROR | MB_OK); return 1; } // Create the window HWND hwnd = CreateWindow( L"MyWindowClass", // Class name L"Simple Windows App", // Window title WS_OVERLAPPEDWINDOW, // Window style CW_USEDEFAULT, CW_USEDEFAULT, // Position (x, y) 800, 600, // Width, height NULL, // Parent window NULL, // Menu hInstance, // Application instance NULL // Additional data ); // Show the window ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // Message loop to process events MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0)) // Translate and dispatch messages to the window procedure TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }

Permalänk
Medlem

Tittade på limbo som är sqlite implementationen i rust, vet inte om jag missuppfattat det hela för hoppas att projektet tar sig. det behövs flera databaser och sqlite's monopol är inte bra

| D:\dev\investigate\limbo\core | schema.rs | 1615 | 1313 | 27781 | 149 | 236 | | D:\dev\investigate\limbo\core | types.rs | 1673 | 1387 | 32677 | 123 | 59 | | D:\dev\investigate\limbo\core\functions | datetime.rs | 1696 | 1440 | 33182 | 155 | 376 | | D:\dev\investigate\limbo\core\storage | sqlite3_ondisk.rs | 1752 | 1389 | 36108 | 193 | 41 | | D:\dev\investigate\limbo\core | util.rs | 1984 | 1740 | 39846 | 102 | 418 | | D:\dev\investigate\limbo\core\translate | expr.rs | 2616 | 2423 | 44231 | 112 | 72 | | D:\dev\investigate\limbo\core\json | jsonb.rs | 3992 | 2822 | 65700 | 355 | 526 | | D:\dev\investigate\limbo\core\vdbe | execute.rs | 7084 | 6498 | 145416 | 110 | 536 | | D:\dev\investigate\limbo\core\storage | btree.rs | 7339 | 5987 | 138357 | 742 | 298 | | Total: | | 62289 | 50911 | 1102657 | 4617 | 6364 | +-------------------------------------------------------+-------------------+-------+-------+---------+------+------+

Ok att man kan göra mycket med smart kod men det känns inte som det här utvecklas snabbt
https://github.com/tursodatabase/limbo

Permalänk
Medlem
Skrivet av klk:

Tittade på limbo som är sqlite implementationen i rust, vet inte om jag missuppfattat det hela för hoppas att projektet tar sig. det behövs flera databaser och sqlite's monopol är inte bra

| D:\dev\investigate\limbo\core | schema.rs | 1615 | 1313 | 27781 | 149 | 236 | | D:\dev\investigate\limbo\core | types.rs | 1673 | 1387 | 32677 | 123 | 59 | | D:\dev\investigate\limbo\core\functions | datetime.rs | 1696 | 1440 | 33182 | 155 | 376 | | D:\dev\investigate\limbo\core\storage | sqlite3_ondisk.rs | 1752 | 1389 | 36108 | 193 | 41 | | D:\dev\investigate\limbo\core | util.rs | 1984 | 1740 | 39846 | 102 | 418 | | D:\dev\investigate\limbo\core\translate | expr.rs | 2616 | 2423 | 44231 | 112 | 72 | | D:\dev\investigate\limbo\core\json | jsonb.rs | 3992 | 2822 | 65700 | 355 | 526 | | D:\dev\investigate\limbo\core\vdbe | execute.rs | 7084 | 6498 | 145416 | 110 | 536 | | D:\dev\investigate\limbo\core\storage | btree.rs | 7339 | 5987 | 138357 | 742 | 298 | | Total: | | 62289 | 50911 | 1102657 | 4617 | 6364 | +-------------------------------------------------------+-------------------+-------+-------+---------+------+------+

Ok att man kan göra mycket med smart kod men det känns inte som det här utvecklas snabbt
https://github.com/tursodatabase/limbo

Veckans orelaterade gnäll?

Det har merge:ats patch sets varje dag denna månaden så jag vet inte riktigt vad du syftar på...

Snabbkoll i git-historiken(patchar mot master denna månaden):

180 files changed, 14118 insertions(+), 6437 deletions(-)

Nu har jag inte benkoll på hur `git diff --stat` fungerar men har tagit mellan första commiten för månaden och HEAD så det borde finnas ännu mer arbete som pågår på diverse brancher som inte merge:ats ännu.

Permalänk
Medlem
Skrivet av orp:

Veckans orelaterade gnäll?

Det har merge:ats patch sets varje dag denna månaden så jag vet inte riktigt vad du syftar på...

Det är tydligen en hel hög med deltagare och det är ju bra, men titta på koden. Skall se om det hänt något om någon månad men en gissning kan vara att projektet haft en sådant där typiskt RAD kurva (RAD = rapid application development). Det går jättesnabbt i en vecka

Här är en bra intervju, alltså det är en allmänt BRA intervju med han som dragit igång rust och sqlite. Värd att lyssna på

Permalänk
Medlem
Skrivet av klk:

Ok att man kan göra mycket med smart kod men det känns inte som det här utvecklas snabbt

What are you, the code police?

Alltså, vad är din poäng? Du väljer ut random GitHub Repo och...vad?

Gubbgnäll har ju en egen tråd, men det tror jag du vet.

Permalänk
Medlem
Skrivet av Xeonist:

What are you, the code police?

Alltså, vad är din poäng? Du väljer ut random GitHub Repo och...vad?

Gubbgnäll har ju en egen tråd, men det tror jag du vet.

Tror du utvecklare kommer lära sig om de uppfattar kritik som gnäll? Här har du en stor orsak till varför många programmerare inte lär sig. Mycket viktigare för säker kod än att bygga in regler i verktyg
Självklart finns det säkert orsaker som jag inte känner till och en databas är inte lätt. Men det är inte svårt och se orsaker varför ett projekt går långsamt. Trassla till det för sig kan vem som helst göra.

Permalänk
Datavetare
Skrivet av klk:

Klistarar in C kod för hur ett fönster registreras in windows för att exemplifiera för en gissning är att det sker något liknande i javascript när man skapar en async, async registrerar eller lägger troligen in något (callback ?) som javascript motorn kan anropa när arbetet är utfört. Så fungerar windows i alla fall, varje applikation har en meddelande snurra som kan anropa registrerade callbacks (WindowProc). Och applikationens meddelande snurra registreras i windows kernel (har säkert fina namn).

Flera språk har ju tagit efter javascripts (kanske annat språk var före) syntax för att registrera callbacks istället för att skriva som man gjorde förr i C.

Detta vad var jag menade med "UI" eller javascripts asyncrona logik. Tror däremot inte att det fungerar händelsestyrt i C# eller en gissning är i alla fall att de har annan hantering för att kunna dra nytta av processorkärnor när det skrivs server kod (var länge sedan jag skrev C# och känner inte till bra hur det fungerar under ytan)

Linux lär i NodeJS hänga i en epoll() längst ned. Det är ett väldigt effektivt sätt att hantera många samtida händelse. När någon blir klar aktiveras associerad promise (eller callback, men det är väl rätt old-school?) och man kör den logiken. Det är typexempel på concurrency.

I Windows kanske man hänger i en message pump, skulle i alla fall fungera rent logiskt men är inte lika effektivt som epoll() och den mer direkta motsvarigheter i Windows är I/O-completion ports.

Går att ha flera Windows messages pumps i samma applikation. Går att ha en per tråd om man behöver. COM STA (Single Threaded Apartment) använder Windows message pump som del i sin IPC-marshaling. Det är också exempel på concurrency (STA var/är rätt vanligt då VB/VBA inte stödjer MTA).

#include <algorithm> #include <chrono> #include <coroutine> #include <execution> #include <iostream> #include <numeric> #include <thread> #include <vector> // This would be some I/O-bound operation in a real application struct SleepAwaitable { std::chrono::milliseconds duration; bool await_ready() const noexcept { return false; } void await_suspend(std::coroutine_handle<> h) const { std::thread([h, d = duration]() { std::this_thread::sleep_for(d); h.resume(); }).detach(); } void await_resume() const noexcept {} }; struct Task { struct promise_type { Task get_return_object() { return {}; } std::suspend_never initial_suspend() noexcept { return {}; } std::suspend_never final_suspend() noexcept { return {}; } void return_void() noexcept {} void unhandled_exception() { std::terminate(); } }; }; Task hello_coroutine(int i) { co_await SleepAwaitable{std::chrono::milliseconds(10 * i)}; std::cout << "[C" << std::dec << i << "]Hello from thread " << std::hex << std::this_thread::get_id() << "\n"; } void hello_par(int i) { std::vector<int> indices(i); std::iota(indices.begin(), indices.end(), 0); // Run in parallel std::for_each(std::execution::par, indices.begin(), indices.end(), [](int idx) { // This would be some compute bound operation in a real application std::this_thread::sleep_for(std::chrono::milliseconds(10 * idx)); std::cout << "[P" << std::dec << idx << "]Hello from thread " << std::hex << std::this_thread::get_id() << "\n"; }); } int main() { int i = 0; for (; i < 10; i++) { // Run concurrently, _may_ be on a single thread or on multiple threads hello_coroutine(i); } hello_par(i); std::this_thread::sleep_for(std::chrono::milliseconds(300)); return 0; }

En notering: vilken shit show det var att använda något efter C++17, specifikt std::print, coroutines samt parallel execution policy...

std::print fungerar inte på Linux med GCC, specifikt fungerar det inte med GNU libstdc++. libc++ (Clang, standard på MacOS) stödjer dock detta.

parallel execution policy är däremot inte implementerad av Clang/libc++... På MacOS gick det inte heller att enkelt få det att fungera med g++ (men ett helt annat fel än med Clang).

På Linux "fungerar" det rakt av, fast inget körs parallellt... Det är helt enligt standard då det bara är en hint. Länkar man med Intel Thread building block så blir det helt plötsligt också parallellt.

coroutines fungerade rakt av både på GCC/Clang och på Linux/MacOS. Men tydligen behövs det där lite handpåläggning om man kör med Windows/MSVC (enligt ChatGPT).

Bortsett från problemen med minnessäker kod känns det som allt bortom C++17 i praktiken är rätt oanvändbart om man vill ha något form av stabilt stöd på mer än en enda plattform. Hur har det blivit SÅ dåligt (har inte använt C++ jättemycket efter C++17, dock använt C++11/14/17 massor då jag bl.a. varit med och implementerat standardbiblioteket för ett OS till PowerPC, 32-bit Arm, ARM64 och x86/x86_64).

Visa signatur

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