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

Permalänk
Skrivet av Ingetledigtnamn:

Ursäkta om jag ställer en naiv fråga, men jag noll erfarenhet av webb-programmering. Om du skall tillhandahålla samma funktionalitet via en endpoint istället för 100 enklare, blir inte din enda endpoint väldigt komplex då? Och svårt att avgöra om testerna verkligen täcker in det som 100 endpoints gjorde tidigare? Bara för att alla anrop kommer via samma endpoint så är det väl det ingen garanti att de täcker in all funktionalitet som finns och att all kod faktiskt blir körd?

Den närmaste "enklaste" - kanske inte mest prestandaeffektivaste - lösningen är att nyttja GraphQL eller liknande lösinng där du skickar de data du vill ha som en JSON-sträng och sedan kommer GraphQL (eller liknande lösning) att bearbeta detta och tala med databas(er) och sedan returnera tillbaka behörig data i JSON-struktur enligt den tillhandahållna i JSON-strängen (och efter vedertagen validering och/eller autentisering/auktorisering). Även här blir funktionalieten - förhoppningsvis av uppenbara säkerhetsskäl - begränsad till vad du konfigurerar GraphQL (eller liknande lösning) att få göra i sin direktkommunikation mot databas(er) och/eller var nu all data finns lagrad.

Liknande på lågnivå (efter jag frågat Gemini om det) är att ha eget skräddarsytt nätverksprotokoll efter ha tagit emot och "sytt ihop" alla TCP-nätverkspaket (TCP av pragmatiska skäl) och fått fram en dataström av "opcode-kommandon" som sedan kontrolleras mot "vitlistade opcodes" och sedan görs vad som behövs göras för att hämta data från databas(er) och/eller hur nu all data må vara lagrad hos "lågnivåmottagaren". Möjligen används väldigt strikt Regex för att separera ut olika opcodes och sedan i sin tur olika opcodes' lagrade värden/argument/parametrar från dem?🤔

I samma skickade sammansatta nätverkspaket kanske du vill ha någon (valfri) liknande autentisering och/eller auktorisering i början av "nätverkspaketsströmmen". Alla nätverkspaket skickas då till en specifik DESTINATION:PORT vilket blir själva ändpunkten att tala med i lågnivåexemplet. En eval() som vem som helst skulle kunna "prata med" skulle jag aldrig rekommendera då det är en alldeles för "frispråkig regex" för att uttrycka det milt!

(I mitt hobbyprojekt har jag kommandon såsom 's_eval' och 'v_eval' vilket betyder att Utvecklaren blir medveten om att eval() kommer att användas på vissa specificerade regexade fildata när kommandona körs lokalt så det är då 100 % på egen risk att använda dem! - De kan endast köras lokalt och aldrig mot/från internet.)

Mvh,
WKF.

Visa signatur

(V)ulnerabilities
(I)n
(B)asically
(E)verything
Programming

Permalänk
Medlem
Skrivet av klk:

Jag postade kod som visar hur du kan rensa bort i princip alla endpoints in webserver.
Den "bästa" koden är den kod som inte behöver skrivas.
Mitt försök var att visa hur viktigt det är med återanvändning för det som sker när man rensar och återanvänder är att den koden körs hela tiden. Därför behöver du inte skriva test.

Om du däremot skriver hårkodade lösningar, låt säga att du har 100 endpoints, då har du så många att det inte går att veta när de körs. En ny version är en "röra" och därför tvingas du göra något för att ändå se att det fungerar som det skall.

Du fokuserar jättemärkliga saker och jag kommer anta att du syftar på API endpoints som hanteras av webbservern. Olika typer av API-designer har olika mängd endpoints. Vissa API-designer typ REST använder endpoints flitigt eftersom endpoints mappas till resurser(typ objekt eller tabeller eller dokument beroende på backend och syfte). Att reducera mängden endpoints betyder enbart att API-designen ändrats så att motsvarande information om resurstyp förmedlas på annat sätt, det säger inget om läget blivit bättre eller sämre. Enda gången detta är tydligt bättre är om man upptäckt att en eller flera resurser är redundanta och man kan simplifiera API-designen genom att ta bort dom men det är ju bara som ett resultat av att man haft suboptimal API-design inledningsvis...

Exempelvis om man byter till JSON RPC så behöver du enbart en endpoint men då ligger resurstypen i JSON-objektet istället, dvs inte nödvändigtvis bättre enbart annorlunda. Samma komplexitet måste istället hanteras i parsningen av JSON-objektet istället för HTTP-requesten.

Skrivet av klk:

Om du däremot skriver hårkodade lösningar, låt säga att du har 100 endpoints, då har du så många att det inte går att veta när de körs. En ny version är en "röra" och därför tvingas du göra något för att ändå se att det fungerar som det skall.

Detta låter jättemärkligt, vad menar du med att inte veta när dom körs? Din webbserver vet ju när den redirectar requesten alternativt så kommer underliggande kod(API-implementationen) vet ju när den anropas. :S

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Ursäkta om jag ställer en naiv fråga, men jag noll erfarenhet av webb-programmering. Om du skall tillhandahålla samma funktionalitet via en endpoint istället för 100 enklare, blir inte din enda endpoint väldigt komplex då?

Absolut blir det en en annan nivå på ett sådant API jämfört med enskilda men det är en _annan_ typ av komplexitet. Att läsa "bra" kod eller försöka förstå bra lösningar är heller inte bortkastad tid. Läsa bra kod är väl spenderad tid för det är få saker man lär sig så mycket av. Gör så ofta, läser annans kod för att se om man kan lära sig något nytt.
Jämför du med 100 endpionts så har du också svårigheter och det kräver resurser, massor. Och underhåll går inte att jämföra (100x)
Gör du 100 endpoints och plötsligt märker att ni behöver skriva om systemet, att något tillkommit eller på annat sätt gjort att förutsättningarna ändrats så är det bara att säga GRATTIS, ett hästjobb väntar.
Ett flexiblare system kan lätt anpassas för nya krav.

Skrivet av Ingetledigtnamn:

Och svårt att avgöra om testerna verkligen täcker in det som 100 endpoints gjorde tidigare? Bara för att alla anrop kommer via samma endpoint så är det väl det ingen garanti att de täcker in all funktionalitet som finns och att all kod faktiskt blir körd?

Tvärtom, ALLT blir så mycket enklare och du kan göra test som inte är möjligt mot hårdkodade API

Skrivet av Ingetledigtnamn:

För att ta en liknelse jag förstår, blir det inte lite som att inte vilja göra direkta funktionsanrop i Python så istället skriver man funktionsanropet i en sträng som man anropar eval() på? Om allting går via eval så behöver vi inte testa något i Python? Den funktionen kommer ju köras hela tiden. Eller missar jag det fina i kråksången?

Python i sig är interpreterande så allt tolkas med en parser. Och skall du göra ett flexibelt API som ersätter endpoints kan du säkert nå närmare 80% täckning med enklare SQL generering, men för att ta resten behövs skriva templates, att SQL genereras från templates och kanske något intern enklare skriptlogik.

exempel:

SELECT {=name} FROM customers UNION SELECT {=name} FROM deleted_customers ORDER BY {=name} WHERE {{expression code}};

Skrivet av Ingetledigtnamn:

Det jag jobbar med körs typiskt från kommandoraden, med eller utan GUI. Återanvändning av kod sker i form av bibliotek, header-filer och Python-moduler.

Japp, i python skrivs inte sådan här kod, det tar för mycket tid/planering och python i sig är inte gjort för sådant här

Permalänk
Medlem
Skrivet av klk:

Python i sig är interpreterande så allt tolkas med en parser.

Alla språk tolkas mha parser men jag misstänker att du försöker säga något annat som du missat att skriva.

Skrivet av klk:

Japp, i python skrivs inte sådan här kod, det tar för mycket tid/planering och python i sig är inte gjort för sådant här

Vad för kod skrivs inte i Python?

Här är matrix(kommunikationsprotokoll) API specification med åtminstone 110 endpoints:
https://github.com/matrix-org/matrix-spec/tree/main/data/api

Här är server-(referens)implementationen av protokollet, i Python:
https://github.com/element-hq/synapse

115 miljoner användare enl. https://www.thestack.technology/matrix-protocol-users-2023

Permalänk
Medlem
Skrivet av orp:

115 miljoner användare enl. https://www.thestack.technology/matrix-protocol-users-2023

Hur är det relevant sett till det jag skrev? om de sedan packar upp och kör en massa metoder internt i webservern så har de fortfarande samma problem

Permalänk
Datavetare
Skrivet av klk:

Men då då får de inte funktionaliteten, skall du göra svåra saker får man köpa att det blir svår kod. Och det är få utvecklare som ens klarar att review den typen av kod. C++ utvecklare som klarar skriva parallella lösningar växer inte på träd.

Vad är det du typiskt utvecklar? D.v.s. hur komplicerad är domänen och vad är implikationen när det går fel?

Skulle säga att när man jobber med väldigt komplexa problem är det kritiskt att bryta ned delarna så de blir relativt enkla. Annars lär man aldrig få ihop något som fungerar.

Är när man jobbar med relativt enkla problem man kan kosta på sig att göra lite mer fancy lösningar som i sig kan vara lite mer komplex.

Skrivet av klk:

Eftersom utvecklare får så lite träning att skriva kod är det få som klarar att hantera stora kodmassor. Det är orsaken och bristen på utvecklare har varit extrem. Företag har tvingats anpassa sig till vad de kan få tag på. Finns säkerligen gott om företag där man inte får göra för svår kod även om det innebär bra funktionalitet.

Låter som du jobbat i organisationer med rätt kass styrning. Men rätt strategi kan man få god utväxling även med rätt juniora utvecklare i komplexa projekt med väldigt stora kodbaser.

Skrivet av klk:

Microsoft som "kom på" HN hade under tiden de här utvecklarna var med, perioden runt 1993 - 2005 mycket skickliga utvecklare. Allt de gjorde då var ofta mycket bättre än vad andra tog fram. Ta språket Java, M$ tog fram bästa miljön och blev stämda, bäst browser och de var till och med innovativa. Sedan började de tappa och idag tror jag det är rätt kass med deras utveckling.
När Visual Studio kom tog den över Borland snabbt, Borland var också duktiga men klarade inte att stå emot. Självklart hade Borland inte alls samma chans då M$ också ägde Windows

Angående Java: (jobbade med Java på Windows runt 2000) det fanns en licens att följa för 3:e-parts JVM:er, Microsoft misslyckads med det, blev stämda och tror de själva fattade att de inte var bättre än någon annan att bygga JVM:er. De tog istället .NET spåret där det kunde pusha Windows specifika tekniker utan att hamna i rätten.

Skrivet av klk:

Hade Linux inte varit så anti M$ tror jag de vunnit mycket på att också ta till sig bra tekniker, istället agerade de som "barn" och bara för att M$ gjorde det så kunde de inte göra samma sak.

Givet att Linux dominerar i stort sätt allt förutom desktop, inklusive flertalet områden Microsoft försökt pushat Windows och misslyckas kapitalt då det är tekniskt underlägset Linux i de områdena, så är det rätt naturligt att flödet mer än Linux -> Windows sedan rätt långt tillbaka.

WSL2 var i.o.f.s. ett genidrag av MS. Fixar inte att arbeta utan *NIX system, för mig har WSL2 gjort Windows användbart igen!

Är inte alls med på vad du ser som så bra med Windows. De dominerar PC-spel och desktop, båda egentligen på gamla meriter. Kollar man OS/system-nivå funktioner innehåller Windows väldigt många WTF?! medan både Linux och MacOS långt oftare tänkt till före.

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:

Vad är det du typiskt utvecklar? D.v.s. hur komplicerad är domänen och vad är implikationen när det går fel?

Har i princip alltid utvecklat system där domänen varit så komplex att det är omöjligt för utvecklare att hantera den.
Så för att sammanfatta den lösningsmetod som jag generellt diskuterar i tråden så är det DOD (data orienterad design)

Blev precis klar med sista steget i mitt lilla hobbyprojekt (sökning i kod) igår. Skall bara snygga till lite men kan kanske använde den som förklaring och varför den trots förhållandevis lite jobb ändå klarar mer än andra sökverktyg. Har ju varit min anledning till att göra den (trött på kassa sökvertyg).
Den är däremot inte snabbast men funderar på att lägga till det med :), bara för att retas.

Permalänk
Medlem
Skrivet av Yoshman:

Givet att Linux dominerar i stort sätt allt förutom desktop, inklusive flertalet områden Microsoft försökt pushat Windows och misslyckas kapitalt då det är tekniskt underlägset Linux i de områdena, så är det rätt naturligt att flödet mer än Linux -> Windows sedan rätt långt tillbaka.

WSL2 var i.o.f.s. ett genidrag av MS. Fixar inte att arbeta utan *NIX system, för mig har WSL2 gjort Windows användbart igen!

Är inte alls med på vad du ser som så bra med Windows. De dominerar PC-spel och desktop, båda egentligen på gamla meriter. Kollar man OS/system-nivå funktioner innehåller Windows väldigt många WTF?! medan både Linux och MacOS långt oftare tänkt till före.

Windows är ett mycket mer omfattande OS, det är gigantiskt mycket större så de har mer och "släpa på". Ta bara hela registry, något Unix varianter helt saknar utan där är saker mycket mer fasta och därför har de enklare att utveckla.
Windows har också COM, också det en teknik som andra systemet helt saknar

Windows problem idag är att det är omfattande om man ser till att snabbt installera mindre system. Men de tekniker de har kommer inte komma till Linux för det saknas komptens mm samt jag tror inte de klarar att underhålla linux om det blir för komplext

Permalänk
Medlem

Angående windows och problem
Tror de har ett jätteproblem med att de valde Unicode istället för utf-8. Det här har kostat dem mycket men att det är en teknisk skuld de har svårt att plocka bort. tror inte de kände till utf8 när beslutet togs om unicode, eller inte förstod potentialen, eventuellt för att datorer då var så långsamma

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Det jag jobbar med körs typiskt från kommandoraden, med eller utan GUI. Återanvändning av kod sker i form av bibliotek, header-filer och Python-moduler.

Skrivet av klk:

Japp, i python skrivs inte sådan här kod, det tar för mycket tid/planering och python i sig är inte gjort för sådant här

Skrivet av klk:

Hur är det relevant sett till det jag skrev? om de sedan packar upp och kör en massa metoder internt i webservern så har de fortfarande samma problem

Det är relaterat till din annekdot om 100 endpoints och din citering av @Ingetledigtnamn som beskrev återanvändning av kod där du sedan hävdade att det inte går. Jag har svårt att veta vad du verkligen menar eftersom ditt inlägg var lite vagt i det avseendet. Synapse har både interna och externa moduler som tyder på återanvändning av kod samt att dom har 100+ endpoints. Dom gör inte massa magi i webservern utan använder den som en reverse proxy och verkar inte ha några problem med sin design.

Permalänk
Medlem
Skrivet av orp:

Det är relaterat till din annekdot om 100 endpoints och din citering av @Ingetledigtnamn som beskrev återanvändning av kod där du sedan hävdade att det inte går. Jag har svårt att veta vad du verkligen menar eftersom ditt inlägg var lite vagt i det avseendet.

Jag menar att "samma" kod körs hela tiden, det är återanvändning. Att det finns olika tekniker för att parsa en URL är inte samma sak

Permalänk
Medlem
Skrivet av klk:

Angående windows och problem
Tror de har ett jätteproblem med att de valde Unicode istället för utf-8. Det här har kostat dem mycket men att det är en teknisk skuld de har svårt att plocka bort. tror inte de kände till utf8 när beslutet togs om unicode, eller inte förstod potentialen, eventuellt för att datorer då var så långsamma

Detta är nonsens. UTF-8 (Unicode Transformation Format 8-bit) är som namnet antyder en del av Unicode.

Windows körde under lång tid på Windows 1252 (en utökning av ISO-8859-1, även känd som Latin-1) som teckenkodning. Detta lever till viss del kvar än idag i vissa program. Om det haft någon signifikant inverkan på att den saliga röra till OS som Windows är kan jag dock inte uttala mig om.

Edit: Windows Code Page heter legacy-teckenkodningssystemet, där page 1252 är teckenkodningen som används för de flesta västerländska språk.

Permalänk
Medlem
Skrivet av klk:

Jag menar att "samma" kod körs hela tiden, det är återanvändning. Att det finns olika tekniker för att parsa en URL är inte samma sak

Så när du säger att "återanvända kod", vad syftar du på då? I min bok kan detta vara allt ifrån macros, generics, templates, interface, moduler, externa lib:ar osv. Allt detta är exempel på kod som är skriven en gång och kan återanvändas.

När du säger att "återanvända kod" så är det svårt iaf för mig att veta exakt vad du syftar på och då kommer jag falla tillbaka på vad jag vet sedan tidigare och om Python-koden ifråga använder en eller flera av sakerna ovan så kommer jag tolka det som att Python-koden är kapabel till att återanvända kod och invalidera ditt påstående.

I detta fallet så vet jag inte heller vad du menar med "samma" kod. I min bok så är det samma kod om checksumman på källkodsfilerna.

Permalänk
Medlem
Skrivet av SimpLar:

Detta är nonsens. UTF-8 (Unicode Transformation Format 8-bit) är som namnet antyder en del av Unicode.

Windows körde under lång tid på Windows 1252 (en utökning av ISO-8859-1, även känd som Latin-1) som teckenkodning. Detta lever till viss del kvar än idag i vissa program. Om det haft någon signifikant inverkan på att den saliga röra till OS som Windows är kan jag dock inte uttala mig om.

Hur kommer det sig att nära nog varenda Windows API som hanterar text har två versioner?
Exempel:
- CreateFileA / CreateFileW
- RegCreateKeyA / RegCreateKeyW
- CreateProcessA / CreateProcessW

Permalänk
Medlem
Skrivet av orp:

Så när du säger att "återanvända kod", vad syftar du på då? I min bok kan detta vara allt ifrån macros, generics, templates, interface, moduler, externa lib:ar osv. Allt detta är exempel på kod som är skriven en gång och kan återanvändas.

Av det du räknar upp så för mig är återanvändning möjligen templates, men där genereras kod upp så det är lite fejk. Kompilatorn producerar bloat.
Framförallt handlar det om kod som är specifikt skriven så att den är generell och det är nästan alltid kod för att hantera data eller system domänen (OS). Att någon i teamet eller man själv skriver kod som skrivs för att fungera i så många sammanhang som möjligt.

Extern kod är självklart också en form av återanvändning men det är annans kod man använder sig av, det kostar alltid lite och framförallt så kan man sällan modifiera den koden, man får ta paketet som det kommer.

Permalänk
Medlem
Skrivet av klk:

Hur kommer det sig att nära nog varenda Windows API som hanterar text har två versioner?
Exempel:
- CreateFileA / CreateFileW
- RegCreateKeyA / RegCreateKeyW
- CreateProcessA / CreateProcessW

En bra förklaring finns här och jag tolkar det som att, om jag av en olycklig händelse skulle skriva mitt första Windows-program, så skulle jag inte behöva bry mig om namnen ovan alls. För att använda dessa så används macrona CreateFile(), CreateProcess() etc och korrekt variant bestämms av systemets konfiguration, oklart om det är runtime eller compile-time.
https://stackoverflow.com/questions/51462048/what-is-the-diff...

För övrigt har jag kväljningar redan.. Använder man verkligen CreateFile() för att LÄSA en fil i Windows ????
https://learn.microsoft.com/en-us/windows/win32/fileio/openin...

hFile = CreateFile(argv[1], // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security OPEN_EXISTING, // existing file only

OK, den här meningen kanske förklarar orsaken..
https://learn.microsoft.com/en-us/windows/win32/api/winbase/n...

Citat:

The OpenFile function does not support Unicode file names or opening named pipes.

Som du säger, vilken sörja! Då jag reagerar ganska starkt på sådana här dumheter så känner jag att mitt liv har varit väldigt förnöjt då jag flera gånger tackat nej till Windows-programmeringsuppdrag.

Permalänk
Medlem
Skrivet av klk:

Hur kommer det sig att nära nog varenda Windows API som hanterar text har två versioner?
Exempel:
- CreateFileA / CreateFileW
- RegCreateKeyA / RegCreateKeyW
- CreateProcessA / CreateProcessW

Suffix A -> Windows Code Page (där page 1252 som jag nämnde är den som används för de flesta västerländska språk)

Suffix W -> Unicode

https://learn.microsoft.com/en-us/windows/win32/intl/conventi...

Det är dock inte relevant för mitt inlägg. Oavsett svaret på den frågan så hade ditt initiala uttalande om Unicode och UTF-8 varit nonsens.

Permalänk
Datavetare
Skrivet av klk:

Har i princip alltid utvecklat system där domänen varit så komplex att det är omöjligt för utvecklare att hantera den.
Så för att sammanfatta den lösningsmetod som jag generellt diskuterar i tråden så är det DOD (data orienterad design)

Blev precis klar med sista steget i mitt lilla hobbyprojekt (sökning i kod) igår. Skall bara snygga till lite men kan kanske använde den som förklaring och varför den trots förhållandevis lite jobb ändå klarar mer än andra sökverktyg. Har ju varit min anledning till att göra den (trött på kassa sökvertyg).
Den är däremot inte snabbast men funderar på att lägga till det med :), bara för att retas.

Har inte du blandat ihop DOD med DDD (Data Driven Design)?

För ser inte att du har fokus på hur data är organiserat i minne, eller lägger du saker i SOA-ordning för lättare hantering m.h.a. SIMD?

Sen konkrent, vad har de saker du gör för implikation när det går fel?

Egna exempel är kod som skickats till Mars, hyfsat svårt att skicka en service-tekniker om det strular. Kod som sitter på platser där en bug kan orsaka fysisk skada i form av att potentiellt orsaka brand (BMS-styrsystem) eller ta livet av folk (styrsystem för flygplan). Kod som vid fler orsakar extrema kostnader, som nätverkslösningen i ASML-scanners där en bug lär paja pågående "wafer" (en sådan kostar idag 20k-30k USD styck) och ännu värre om det stoppar produktion (~2000 wafer per dag).

Alla ovan exempel är också exempel på varför det tråden egentligen handlar om är högst kritiskt. Så länge som man skriver i C eller i C++ (alla exempel ovan är skrivna i C utom BMS som är i Go) och man inte fixar de problem andra har löst relaterade till minnessäkerhet så ser vi gång på gång att i C och C++ är >50 % av buggarna relaterade till minnesproblem. Buggar som i stort sett inte existerar i minnes-säkra språk!

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:

Angående windows och problem
Tror de har ett jätteproblem med att de valde Unicode istället för utf-8. Det här har kostat dem mycket men att det är en teknisk skuld de har svårt att plocka bort. tror inte de kände till utf8 när beslutet togs om unicode, eller inte förstod potentialen, eventuellt för att datorer då var så långsamma

Alla moderna språk/ramverk jag känner till har inbyggt stöd för Unicode. Nog rätt svårt att få in riktigt bra C/C++ stöd i efterhand tyvärr, så där kommer det fortsätta vara drygt att hantera...

Så tabben var inte att gå till Unicode, tabben var att basera hela "moderna" Win32 APIet på UTF-16 och inte UTF-8.

Även i C# där stränghantering är "helt byggt för att vara native med modern Win32" har redan vissa problem p.g.a. av valet av UTF-16 och hur det medförde att "Char" rimligen då är ett 16-bit tal: inget bra stöd för code-points >65535...

Tror nog de som jobbar med filhantering, web etc nog stött på problem med hantering av BOM p.g.a. Microsoft val att gå UTF-16 native och resten av världen i praktiken valt UTF-8. UTF-8 BOM "EF BB BF", UTF-16 (little-endian) BOM "FF FE".

Skrivet av SimpLar:

Detta är nonsens. UTF-8 (Unicode Transformation Format 8-bit) är som namnet antyder en del av Unicode.

Windows körde under lång tid på Windows 1252 (en utökning av ISO-8859-1, även känd som Latin-1) som teckenkodning. Detta lever till viss del kvar än idag i vissa program. Om det haft någon signifikant inverkan på att den saliga röra till OS som Windows är kan jag dock inte uttala mig om.

Edit: Windows Code Page heter legacy-teckenkodningssystemet, där page 1252 är teckenkodningen som används för de flesta västerländska språk.

Behöver själv göra en "refresher" kring hur allt detta hänger ihop rätt ofta. Vill bara att text-hantering ska fungera, men det är rätt komplext...

Unicode är en standard som säger vad varje tal (code-point) ska representera. Det är valt så 0-127 är samma som ASCII.

UTF-8, UTF-16 och UTF-32 är olika sätt att representera code-points på disk/RAM etc. UTF-8 har den stora fördelen att det blir identiskt med ASCII om man bara använder code-points <128.

Så här i efterhand hade det kanske varit bäst att utelämna UTF-16 helt... UTF-32 används rätt sällan, men finns ett värde. T.ex. löser Go-lang det problem C# har med code point >65535 genom att "Rune" (i praktiken det närmaste man kommer C# Char) använder UTF-32. I alla lägen där man representerar en sekvens av code points (t.ex. strängar) används UTF-8.

Skrivet av klk:

Hur kommer det sig att nära nog varenda Windows API som hanterar text har två versioner?
Exempel:
- CreateFileA / CreateFileW
- RegCreateKeyA / RegCreateKeyW
- CreateProcessA / CreateProcessW

FooBarA → Den äldre varianten som bara stödjer 8-bitars tecken. En av Windows stora styrkor är dess mycket goda bakåtkompatibilitet, och därför finns det fortfarande mycket kod som saknar Unicode-stöd, särskilt sådan som är skriven i C och C++.

FooBarW → Unicode-varianten som använder UTF-16 i little-endian-format.

Vilken variant som används avgörs vid kompilering. Om man råkar blanda ihop dem kan det leda till ganska förvirrande länkfel, särskilt om man inte är bekant med denna uppdelning.

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:

Av det du räknar upp så för mig är återanvändning möjligen templates, men där genereras kod upp så det är lite fejk. Kompilatorn producerar bloat.

Möjligen? Om inte STL och Boost är återanvändning, vad har du för definition av återanvändning? Är det bara genererad kod som räknas? I C++ torde templates tävla med funktioner om att vara den av de mest utbredda formen av "skriv en gång, använd i flera sammanhang". Funktionen är ju den mest grundläggande formen av återanvändning, men templates används ju till allting i C++. Frågan är om inte ett modern C++-program instansierar mer template-kod än användaren har skrivit själv.

Det du föraktfullt kallar bloat används ganska ofta för att optimera C++-kod. Genom att använda template specialization istället för virtuella funktioner ges kompilatorn helt andra möjligheter till inlining och optimeringar över funktionsanropsbarriären. Visst, det blir mer kod, men det är en balansgång mellan prestanda och kodstorlek där man själv får bestämma vad som är viktigt.

Skrivet av klk:

Framförallt handlar det om kod som är specifikt skriven så att den är generell och det är nästan alltid kod för att hantera data eller system domänen (OS). Att någon i teamet eller man själv skriver kod som skrivs för att fungera i så många sammanhang som möjligt.

"Generell" och "skrivs för att fungera i så många sammanhang som möjligt" signalerar för mig att koden kommer göra många olika saker och det kommer vara svårt att få bra coverage med enbart systemtester. Är inte detta ett typexempel på kod som skulle må bra av enhetstester?

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Möjligen? Om inte STL och Boost är återanvändning, vad har du för definition av återanvändning? Är det bara genererad kod som räknas? I C++ torde templates tävla med funktioner om att vara den av de mest utbredda formen av "skriv en gång, använd i flera sammanhang". Funktionen är ju den mest grundläggande formen av återanvändning, men templates används ju till allting i C++. Frågan är om inte ett modern C++-program instansierar mer template-kod än användaren har skrivit själv.

Menar inte att kod inte återanvänds med STL (eller boost) men det beror också en del på vilka glasögon man använder. Om det är processorn eller programmeraren. Ha du processorns glasögon så är det inte kod som återanvänds, däremot slipper programmeraren skriva koden.
Och självklart är det värdefullt med STL, det sparar mycket tid för utvecklare men samtidigt så pratar vi C++. Att välja C++ som har en mycket högre tröskel än andra språk görs inte om man inte har krav, och det behöver inte bara vara snabb kod, finns mycket annats som säker kod, hantera stora mängder kod mm. När kraven stiger behöver man tänka på hur flexibla de olika språken är och där vinner C++ stort.

Problem med STL och BOOST är att det är kod skriven för att kunna fungera på väldigt mycket olika typer av hårdvara. Det begränsar dem i vad de kan göra. Exempelvis tror jag aldrig de skulle våga lägga till logik där bitar används för att beskriva information. Om du har ett 32 bitars tal, då går det att få in en hel del i det talet om man väljer att använda olika bitar för olika saker. Är det mycket data som behöver hanteras kan sådant här spela stor roll, även för återanvändbar kod. Finns annat som begränsar den typen av bibliotek, att de oftast måste välja 64 bitars variabler för om koden kompileras upp för 64 bitars processorer, eller 32 bitars variabler om det är 32 bitars processorer.

Det priset (priset stl och boost har att de måste fungera i många situationer) är ibland för högt om kraven är hårt satta.

Skrivet av Ingetledigtnamn:

Det du föraktfullt kallar bloat används ganska ofta för att optimera C++-kod. Genom att använda template specialization istället för virtuella funktioner ges kompilatorn helt andra möjligheter till inlining och optimeringar över funktionsanropsbarriären. Visst, det blir mer kod, men det är en balansgång mellan prestanda och kodstorlek där man själv får bestämma vad som är viktigt.

Men det måste gå och hantera koden också. Svår C++ kod med trix för att fixa till templates är fantastiskt svår att läsa

Permalänk
Medlem
Skrivet av Yoshman:

UTF-8, UTF-16 och UTF-32 är olika sätt att representera code-points på disk/RAM etc. UTF-8 har den stora fördelen att det blir identiskt med ASCII om man bara använder code-points <128.

En utmaning som inte alls är så lätt som man kanske tror ä att skriva en sträng klass (kanske liknande stl::string) som stödjer UTF-8, finns anledningar till varför den dröjt (stl::u8string). Exempelvis sortera utf8 text, inte lätt.

Och just sådana här "småsaker" är ofta områden som gör att applikationer kan sticka ut från mängden eller det som gör att viss typ av kod blir så mycket svårare att få fram. Då måste utvecklare klara och skriva det för det finns inte med i språket de valt. Alternativt kan man inte ta med funktionaliteten.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

"Generell" och "skrivs för att fungera i så många sammanhang som möjligt" signalerar för mig att koden kommer göra många olika saker och det kommer vara svårt att få bra coverage med enbart systemtester. Är inte detta ett typexempel på kod som skulle må bra av enhetstester?

Har utvecklare kommit så långt att de klarar av att skriva generell kod så vet de absolut om att inte skriva kod som gör "många" saker för då har du inte generell kod. En av de absolut viktigaste principerna för att kod skall kunna användas i många sammanhang är att den gör EN sak, så länge den gör det kan man optimera rejält och återanvända.

Enligt mig så det viktigaste för att få kod återanvändbar är att lyckas få till något så data kan "kännas igen" utan att koden anropar metoder direkt, att få till ett bra format för att transportera data mellan objekt utan att de vet om varandra. Lyckas man med det så ökar förutsättningarna ordentligt för att kunna skriva kod som är återanvändbar.

Vill man lära sig mer om hur det kan göras så titta på Microsofts COM teknologi. En bra början, det finns missar där men förstår man systemet så förstår man poängen och då kan man fila på likartade lösningar.

Permalänk
Datavetare
Skrivet av klk:

En utmaning som inte alls är så lätt som man kanske tror ä att skriva en sträng klass (kanske liknande stl::string) som stödjer UTF-8, finns anledningar till varför den dröjt (stl::u8string). Exempelvis sortera utf8 text, inte lätt.

Och just sådana här "småsaker" är ofta områden som gör att applikationer kan sticka ut från mängden eller det som gör att viss typ av kod blir så mycket svårare att få fram. Då måste utvecklare klara och skriva det för det finns inte med i språket de valt. Alternativt kan man inte ta med funktionaliteten.

För någon som är så hemma i datadriven design borde det ju knappast vara några problem alls!

UTF-8 är self-synchronizing (vilket även gäller UTF-16), så går hitta punkten där två strängar skiljer sig genom memcmp()-lik funktionalitet och sedan backa till början av innevarande code-point.

Sen är det bara extrahera varje code-point som 32-bit och jämföra -> det avgör lexikografisk ordning.

Och bara för det tagit till Ragnarök i C++ betyder inte att folk redan löst problemet. Java/C# har sedan start hanterat strängar som sekvenser av UTF-16 och Go-lang har hanterat strängar som UTF-8 sedan första release.

Skrivet av klk:

Att välja C++ som har en mycket högre tröskel än andra språk görs inte om man inte har krav, och det behöver inte bara vara snabb kod, finns mycket annats som säker kod, hantera stora mängder kod mm.

Givet vad denna tråd egentligen handlar om och givet trenderna tror jag extremt få skulle välja C++ för ett green-field projekt idag. Det lär man bara göra för man helt enkelt inte kan något bättre. C++ finns (och kommer fortsätta finnas under överskådlig tid) nästan uteslutande för man jobbar med brown-field alt. måste använda brown-field bibliotek som bara fungerar med C++.

Förut fanns ändå ett värde med C++ direkt vansinniga komplexitet. Inget annat matchade prestandan. Men beroende på vad man gör är inte längre C++ det bäst presterande alternativet. T.ex. finns flera smarta optimeringar i multicore-programmering som inte blir korrekt utan GC (sure, man kan implementera en GC även i C och C++, faktum är att Linux-kernel använder den här typen av optimeringar på vissa ställen och har då "tillräckligt mycket av en GC" för att få det att fungera).

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:

För någon som är så hemma i datadriven design borde det ju knappast vara några problem alls!

UTF-8 är self-synchronizing (vilket även gäller UTF-16), så går hitta punkten där två strängar skiljer sig genom memcmp()-lik funktionalitet och sedan backa till början av innevarande code-point.

Sen är det bara extrahera varje code-point som 32-bit och jämföra -> det avgör lexikografisk ordning.

Enligt dig är ju allt "lätt" bara man inte väljer C eller C++
Nej det är inte lätt men om man aldrig försökt sig på att skriva den typen kod är det svårt att förstå vilka problem det är. Skrev inte att det är omöjligt däremot, det är en utmaning. För att skriva en "vanlig" sträng klass är busenkelt och mycket bra övningsuppgift för nya utvecklare, alla borde göra det i sin utbilding. en sträng klass för utf+8 är typ minst 10 gånger svårare (om man kan gradera). Den är så svår att en ny programmerare inte skulle klara av det.

Varför är det nyttigt att förstå? För att när man begriper sådant här så förstår man också att allt inte är så "himla lätt" som det kan verka om man bara är van vid att koda python exempelvis.

Skrivet av Yoshman:

Och bara för det tagit till Ragnarök i C++ betyder inte att folk redan löst problemet. Java/C# har sedan start hanterat strängar som sekvenser av UTF-16 och Go-lang har hanterat strängar som UTF-8 sedan första release.

Men det är inte Åsa Nisse som skrivit den koden, de som skriver bibliotek till Java, Go-Lang och annat har nog en del års erfarenhet.

Skrivet av Yoshman:

Givet vad denna tråd egentligen handlar om och givet trenderna tror jag extremt få skulle välja C++ för ett green-field projekt idag. Det lär man bara göra för man helt enkelt inte kan något bättre. C++ finns (och kommer fortsätta finnas under överskådlig tid) nästan uteslutande för man jobbar med brown-field alt. måste använda brown-field bibliotek som bara fungerar med C++.

Det är extremt få utvecklare som klarar av att skriva applikationer som skall konkurrera med andra applikationer där det råder konkurrens. Det tar lång tid att lära sig. Om man tror att "nu har jag lärt mig java och kan lite html, så nu är jag fullärd programmerare" då har man kanske inte riktigt fattat :). Det är då resan börjar. Duktig utvecklare tar många år att bli

Eftersom en mycket stor majoritet av alla applikationer handlar om att skyffla data fram och tillbaka mellan browser och en databas så finns det ändå en arbetsmarknad. Men den typen av utveckling har enligt mig ganska lite att göra med programmering

Permalänk
Medlem
Skrivet av Yoshman:

Har inte du blandat ihop DOD med DDD (Data Driven Design)?

Jag tror att det är svårt med alla dessa busswords och säga exakt vad det är men man kan få en aning om vad det handlar om. DOD är vad jag vet något ganska nytt ord för en teknik som praktiserats länge men som saknat namn. Förr i tiden vart alla utvecklare mer eller mindre tvingade att skriva DOD kod (om jag kallar det så) eftersom datorer var så långsamma. Idag klarar man att skriva rätt mycket utan att behöva tänka på prestanda eftersom datorer blivit så snabba att de inte gör något om programmet kunnat göras 1000 gånger snabbare med andra lösningar, det är tillräckligt snabbt ändå.

DOD är för mig att programmeraren försöker tänka som en processor tänker istället för att tänka som människor normalt tänker. Programmerare skriver kod för att konvertera mänsklig data till något en dator kan arbeta med, det är därför programmerare behövs.

Hur data placeras är viktigt och anpassas det efter hur en processor vill ha datat går det snabbare. Den snabbheten kan användas till mycket, ibland för att få något att gå snabbare men man kan göra annat. Exempelvis bygga in mer funktionalitet. Låt säga att en lösning kan göra 10 gånger mer bara för att den är optimerad jämfört med annan teknik så kan det användas för att göra koden mer lätthanterlig och/eller återanvändbar.

Skrivet av Yoshman:

För ser inte att du har fokus på hur data är organiserat i minne, eller lägger du saker i SOA-ordning för lättare hantering m.h.a. SIMD?

Det har jag, väldigt stort fokus på det

Skrivet av Yoshman:

Sen konkrent, vad har de saker du gör för implikation när det går fel?

Går fel? Hur tänker du när du skriver fel, att det inte blir maximalt optimerat eller att det smäller

Skrivet av Yoshman:

Egna exempel är kod som skickats till Mars, hyfsat svårt att skicka en service-tekniker om det strular. Kod som sitter på platser där en bug kan orsaka fysisk skada i form av att potentiellt orsaka brand (BMS-styrsystem) eller ta livet av folk (styrsystem för flygplan). Kod som vid fler orsakar extrema kostnader, som nätverkslösningen i ASML-scanners där en bug lär paja pågående "wafer" (en sådan kostar idag 20k-30k USD styck) och ännu värre om det stoppar produktion (~2000 wafer per dag).

I en sådan situation hade snabbheten kunnat användas för att göra koden säkrare (mer logik för säkerhet), snabbhet kan användas till mycket

Set till prestanda så vad som kommer bli mycket viktigare är att skala till flera trådar, det är viktigt nu men det har tills nu ofta varit ganska enkel skalning. Att en webserver tar emot en request i egen tråd eller spel som har en renderingstråd och andra slavtrådar. Varje tråd får sin arbetsuppgift och då kan man slippa en del av krånglet när data delas mellan trådar.

Snart när det knappt går att köpa processorer med mindre än 10 kärnor så ökar möjligheterna att slarva lite med data i syfte att kunna parallellisera istället. Data behöver alltså inte ligga perfekt för cache, istället placeras data för att fungera för flera trådar.

Permalänk
Datavetare
Skrivet av klk:

Enligt dig är ju allt "lätt" bara man inte väljer C eller C++

Du har du helt missförstått vad jag anser är komplex i C++. Det är språket som allt för komplext, något som bl.a. manifestera sig i vad som lär vara den lägsta specifikation av alla relevanta programspråk just nu.

Det syns också i de löjligt långa kompileringstider, något som gör det allt mer tveksamt att välja C++ för riktigt stora projekt (Go utvecklades av 3st C++ programmerare som också råkade ha tidigare erfarenhet av språkdesign, enligt ryktet gjordes första draft:en "medan vi väntade på att ett av Googles C++-projekt skulle kompilera om").

C är inte komplex, efter C++ lär nog C# vara #2 (sett till hur omfattande specifikationen är). Så Microsoft lyckades verkligen göra C# till "ett modernt C++" ur den aspekten...

Inget av ovan är speciellt relevant i att bygga en effektiv hantering av UTF-strängar. Igen vettig människa använder C frivilligt i saker som kräver stora mängder stränghantering, C har inte en bra design för just detta. C++ är bättre än C här, men ändå långt sämre än andra "moderna" språk så av den anledningen lär UTF-8 hantering inte varit #1 för C++ världen.

Skrivet av klk:

Nej det är inte lätt men om man aldrig försökt sig på att skriva den typen kod är det svårt att förstå vilka problem det är. Skrev inte att det är omöjligt däremot, det är en utmaning. För att skriva en "vanlig" sträng klass är busenkelt och mycket bra övningsuppgift för nya utvecklare, alla borde göra det i sin utbilding. en sträng klass för utf+8 är typ minst 10 gånger svårare (om man kan gradera). Den är så svår att en ny programmerare inte skulle klara av det.

Visst är det en utmaning om man av någon outgrundlig anledning måste skriva en egen implementation från scratch.

Men varför skulle man göra det med någon annan anledning är "vill lära mig detaljerna som ett kul projekt"? Det är ett i stort sett löst problem med otroligt smarta optimeringar för att validera att en byte-sekvens är giltig UTF-8, för jämförelser etc. Använd det så är det inte svårt!

Skrivet av klk:

Varför är det nyttigt att förstå? För att när man begriper sådant här så förstår man också att allt inte är så "himla lätt" som det kan verka om man bara är van vid att koda python exempelvis.

Väldigt många gör saker i Python som antagligen är långt över huvudet på alla oss i den här tråden, inte minst inom machine-learning. Så det behöver inte vara så "himla lätt" bara för att det är Python, det är inte nödvändigtvis ens lätt att använda de färdiga biblioteken för men rätt kunskaper om algoritmer och avancerad matematik kan man addera väldigt komplexa saker ovanpå.

Men finns också saker som går hur bra som helst att använda utan att förstå. Kan matematiken bakom 3D väldigt väl, ändå känns det rätt onödigt att veta hur ett bra bibliotek fungerar mer än "de har gjort optimeringar lämpliga för moderna CPUer". Och likt UTF-8, varför skriva själv när det redan finns flera alternativ där man redan putsat effektiviteten rejält?

Skrivet av klk:

Men det är inte Åsa Nisse som skrivit den koden, de som skriver bibliotek till Java, Go-Lang och annat har nog en del års erfarenhet.

Exakt. Med rätt abstraktioner kan "vem som helst" utnyttja expertisen från andra och man kan då hålla fokus på det problem man själv ämnar lösa. Ett problem som i sig kan vara rätt komplext, då kritiskt att kunna slippa gräva ned sig i andra komplexa saker samtidigt.

Skrivet av klk:

Det är extremt få utvecklare som klarar av att skriva applikationer som skall konkurrera med andra applikationer där det råder konkurrens. Det tar lång tid att lära sig. Om man tror att "nu har jag lärt mig java och kan lite html, så nu är jag fullärd programmerare" då har man kanske inte riktigt fattat :). Det är då resan börjar. Duktig utvecklare tar många år att bli

Eller "nu har jag lärt mig pre-C+11 och hur man optimerar för CPUer pre-very-wide-OoO-eran", så nu är jag fullärt och alla som inte fattar det jag fattar är n00b:s. Världen har en tendens att gå vidare, gamla sanningen är inte längre nödvändigtvis sanna längre!

Skrivet av klk:

Eftersom en mycket stor majoritet av alla applikationer handlar om att skyffla data fram och tillbaka mellan browser och en databas så finns det ändå en arbetsmarknad. Men den typen av utveckling har enligt mig ganska lite att göra med programmering

Och en annan helt ad-hoc definition är "om koden inte används i saker som omsätter >1 miljard USD per år har det rätt lite med programmering att göra".

Din definition av programmering är lika meningslös som den jag hittade på ovan, acceptera att vad som är programmering innefattar definitivt all for av kodskrivande oavsett språk. Sen kan man eventuellt diskutera om "HTML-knackande" även är programmering.

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:

Visst är det en utmaning om man av någon outgrundlig anledning måste skriva en egen implementation från scratch.

sizeof på std::string tror jag ligger över 20 byte på alla implementationer. Har du miljoner objekt där man tar med std::string som medlem är det dyrt

Skrivet av Yoshman:

Väldigt många gör saker i Python som antagligen är långt över huvudet på alla oss i den här tråden, inte minst inom machine-learning.

Det görs inte i python utan python används för att konfigurera C/C++ komponenter

Permalänk
Datavetare
Skrivet av klk:

Jag tror att det är svårt med alla dessa busswords och säga exakt vad det är men man kan få en aning om vad det handlar om. DOD är vad jag vet något ganska nytt ord för en teknik som praktiserats länge men som saknat namn.

Beror på vad du anser är "nytt". DOD som koncept daterar tillbaka till strax efter millennieskiftet.

Skrivet av klk:

Förr i tiden vart alla utvecklare mer eller mindre tvingade att skriva DOD kod (om jag kallar det så) eftersom datorer var så långsamma. Idag klarar man att skriva rätt mycket utan att behöva tänka på prestanda eftersom datorer blivit så snabba att de inte gör något om programmet kunnat göras 1000 gånger snabbare med andra lösningar, det är tillräckligt snabbt ändå.

Det är inte bara det. På 80-talet skrev väldigt mycket av spel i assembler. Inte bara för det var snabbt, utan för att dåtiden kompilator-teknik var inte alls på samma nivå som idag.

Idag går det inte cykel-räkna samtidigt som moderna kompilatorer (inte minst de som som kan JIT:a) kan göra optimeringar som är helt orimliga att få ut ur en människa inom någon form av rimlig tid.

Väldigt nära 100 % av tiden, givet ett inte helt trivialt problem, lär bättre prestanda (om det behövs) komma ur saker som bättre algoritmer eller min egen favorit: lura ut sätt som gör att man överhuvudtaget inte behöver göra beräkningen, och om den måste göras görs den långt mer sällan.

Skrivet av klk:

DOD är ett väldigt lågnivåverktyg. Det har med framgång används i spelvärlden, men det löser långt ifrån alla prestandaproblem utan är rätt nischade saker. Här tycker jag Epics jobb med Verse känns väldigt spännande, de ser begränsningarna med dagens teknik men de vill hitta vägar där vi framåt kommer kunna ha spel-sessioner med 100k kanske >1M samtida spelare. Det är inte något DOD fixar med någon realistiskt arbetsinsats, men kan finnas andra sätt!

DOD är för mig att programmeraren försöker tänka som en processor tänker istället för att tänka som människor normalt tänker. Programmerare skriver kod för att konvertera mänsklig data till något en dator kan arbeta med, det är därför programmerare behövs.

Hur data placeras är viktigt och anpassas det efter hur en processor vill ha datat går det snabbare. Den snabbheten kan användas till mycket, ibland för att få något att gå snabbare men man kan göra annat. Exempelvis bygga in mer funktionalitet. Låt säga att en lösning kan göra 10 gånger mer bara för att den är optimerad jämfört med annan teknik så kan det användas för att göra koden mer lätthanterlig och/eller återanvändbar.

Det har jag, väldigt stort fokus på det

OK, ge ett konkret exempel på hur du använder SOA i din kod. Är inte det lite utmanande när du samtidigt verkar gilla variants (antar att du kallar det "ha flexibilitet i datatformat"...).

Skrivet av klk:

Går fel? Hur tänker du när du skriver fel, att det inte blir maximalt optimerat eller att det smäller

Båda. Har tidsmässig i arbetslivet mest erfarenhet av RTOS-världen. Det som skiljer hård-realtid från "vanliga" program är att ett korrekt svar som kommer efter den dead-line som krävs är lika mycket en bug som ett felaktigt svar.

Men för denna diskussion: håll dig till "det blir fel svar / smäller".

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:

sizeof på std::string tror jag ligger över 20 byte på alla implementationer. Har du miljoner objekt där man tar med std::string som medlem är det dyrt

OK, så använd något mer modernt / bättre anpassat för uppgiften?

I Go är inte strängar bara UTF-8, de tar 16 bytes på 64-bit arkitekturer och 8 bytes på 32-bit arkitekturer (den senare är i praktiken bara relevant för MCUer idag, men Go används där också)

I Rust är string-slices (&str) 16/8 bytes på 64/32-bit medan mutable strängar (String) är 24/12 bytes. I de flesta fall jobbar man där med &str utom när man bygger strängarna. Här hålls också strängarna i UTF-8 format.

Edit: fast vad gör man för att det ska vara relevant??? Man måste i det läget göra extremt trivial datahantering av extremt många ytterst korta strängar. För annars kommer man ha andra viktigare flaskhalsar!!!

Skrivet av klk:

Det görs inte i python utan python används för att konfigurera C/C++ komponenter

Även om de lägsta nivåerna av t.ex. Pytorch och NumPy är skrivna i C/C++ är det långt mer än "konfigurering" som sker i Python-kod när man jobbar med modern ML-teknik.

Så just den delen är bara en implementations-detalj.

Visa signatur

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