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

Permalänk
Medlem
Skrivet av heretic16:

Nu när tråden är varm, då tänkte jag ställa en liten fråga som berör struktur.

Jag jobbar inte som mjukvarutuvecklare, men jag håller på programmera mycket på fritiden och även inom jobbet.
När jag programmerar så har jag en tendens att strukturera om mina filer hela tiden i mappar. Jag har liksom många mappar där bara enskilda filer ligger.

Detta tar dock en tid, men när jag hittar min struktur så blir projektet allt lättare att modifiera vid behov.
Känner ni igen er också att varje projekt tar sin tid att få sin struktur och när strukturen är klar, ja då är det 10X lättare att programmera?

Jag försöker undvika till varje pris att få spagettikod. Jag skriver aldrig sådant dock, så jag är mycket noga på att från vissa t.ex. .cpp filer så skall man ej kunna anropa vissa funktioner.

Jag kör inte OOP, om inte behovet finns tydligt.

Oftast så följer man nog en etablerad standard, åtminstone på jobbet. Databasfiler ligger där, controllers ligger där, e t c.

Permalänk
Datavetare
Skrivet av heretic16:

Jag har forskat lite bland språk då jag har kommit i kontakt med "C++ vs Rust" debatter dom senaste månaderna och sett lite statistik om vilka språk som är snabbast.

Jag brukar följa Dave's Garage på YouTube: https://www.youtube.com/watch?v=pSvSXBorw4A&ab_channel=Dave%2...

Han listar 5 snabbaste språken idag:

  1. Zig

  2. Rust

  3. C

  4. C++

  5. Java

Han beskriver deras styrkor och syften. Han går inte in på deras nackdelar, då det är inte relevant. Men något som jag märker att han pratar mycket om är just säkerhet kring dessa språk. Java ska tydligen vara supersäkert att programmera i. C och C++ är inte alls säkra språk. Rust är mycket säkert. Jag kan inte uttala mig hur säkert Rust är, men jag har läst att Rust skapades för att vara säkert.

Men sedan finns det ett språk till som, enligt Dave's Garage, är det snabbaste språket. Det är Zig. Zig är tydligen en "kopia" på C++ fast med en säkerhet som Java och en snabbhet som C.

Jag började gräva djupare bland Zig och helt plötsligt så hittade jag "Zig VS Rust" debatter där Zig anses vara ett bättre språk.
Jag grävde ännu djupare och nu hittar jag "Carbon Vs Zig".

Det allt detta "VS" handlar om är just minnessäkerhet och snabbhet. Bara det. Inget annat.
Då tänkte jag, är inte detta just 20-talets framtida fokus på språk?

På 90-talet så skulle OOP vara högst prioriterat. Allt skulle vara en klass. på 00-talet så skulle allt kunna köras överallt, typ Python, Java, Matlab, C# osv. På 10-talet så skulle allt optimeras och nu så är säkerhet största fokus.

Vad tror ni? Kommer vi se ett språk som är så fasansfullt säkert att man knappt behöver skriva kod?

Övrigt så tycker jag Zig ser lovande ut. En relativ enklare syntax som är lätt att läsa, jämfört med Rust. Men jag vågar nog inte investera min tid varken i Zig eller Rust för att snart har vi säkerligen ett nytt språk som konkurrerar ut allt och alla...Vem vet?

Kommer vi se nya språk(inom kort) som är ännu säkrare och snabbare än Zig? Om svaret är Ja: Varför gör man inte ett språk som är så optimerat att det går inte optimera något mera?

Har läst på lite om Zig senaste två veckorna, så har bara skrapat på ytan än, men när det kommer till att vara det språk som man kan skriva "snabbast tänkbara kod" i har det visat sig att det är mer än bara varmluft!

I de mest grundläggande sakerna påminner syntaxen i Zig en hel del om Rust, men Zig-gänget ser sig helt som en modern version av C medan Rust kanske mer kan ses som en modern version av C++.

Likt C lyfter Zig fram egenskaper som
* "det är ett språk man kan lära sig på mycket kort tid". likt t.ex. Go, orsak: så man bara behöver debugga problemet, inte sina kunskaper i språket
* "no hidden control flow", "a=b+c" är verkligen bara en addition, det kan inte finnas gömda anrop genom att överlagra "=" och "+" (samt i C++ kan man även vara kreativ med implicit typomvandling...).

En trevlig sak är null pointer safety, även i de fall Rust kallar "unsafe" (även Rust har detta i "safe Rust"). (null är av sin skapare benämnt som "NULL: The Billion Dollar Mistake").

samt lite annat smått och gott.

Zig försöker inte göra det Rust åstadkommer med sin borrow-checker, man ur en viss synvinkel lägre satta krav på "säkerhet" men ur andra högre satta krav. Det finns saker som är svårt/omöjligt att göra inom ramen av "safe Rust", Zig verkar ha som mål att inte ha specialfall får något relevant fall för t.ex. mikrokontrollers, OS-kärnor etc men ändå vara långt säkrare än C och C++.

Sedan till prestanda: idiomatisk Zig kan i vissa lägen producera maskinkod som är (något) snabbare än C/C++/Rust, en orsak är att man bl.a. definierar alla former av overflow som "undefined behavior". C/C++/Rust har alla väldefinierad aritmetik med "unsigned" medan C och C++ har "signed" overflow som UB.

Finns en del extra optimeringar kompilatorn kan göra i vissa lägen i Zig p.g.a. Vill man ha väldefinierad hantering av overflow i Zig går det både för signed och unsigned, finns speciella operatorer för det.

Men den stora saken är att hantering av SIMD är en first-class citizen i Zig. LLVM (kompilatorinfrastrukturen som Rust standardkompilatorn använder, som C/C++ kompilatorn Clang använder, Swift kompilatorn använder m.fl.) har väldigt avancerad hantering av SIMD. Bl.a. Intel har lagt en hel del krut på detta via deras ISPC projekt (en C variant som påminner om Nvidias CUDA), även Nvidia/AMD har jobbat med LLVM då de använder tekniken för deras GPUer.

Semantiken i grundspråken C, C++ och även Rust gör det relativt svårt för en kompilator att använda SIMD mer än väldigt sporadisk, det blir inte i närheten samma nivå som t.ex. med ISPC.

Det ISPC gör för CPUer är i praktiken en grundläggande den av Zig. Några saker det medför är:
* problem som är data-parallella kan kodas i ett sätt med Zig som gör det trivialt för en kompilator att generera väldigt effektiv SIMD kod när man bygger för en CPU som har SIMD-stöd, samtidigt som koden fortfarande blir effektiv och gör rätt saker även man t.ex. bygger för en 8 bit AVR (populär CPU för mikrokontrollers)

* man kan utnyttja SIMD fullt ut utan att behöva dra till med specifika för x86/x86_64 eller ARM64 eller OS-specifika saker.

Ett område där Zig känns som handen-i-hansken är spel! Dels p.g.a. SIMD-hanteringen men också då spelmotorer ofta har behov av custom-minneshanterare, Zigs standardbibliotek är designat så att allt som arrayer, hashmaps, ja allt, inte förutsätter något kring minnesallokering utan de tar en allokator som argument.

Även WebASM har nytta av detta då minneshanteringen där är "speciell" och har ofta svårt att samarbete bra med standardbiblioteken i de flesta andra språk.

Är det en given succé? Knappast, är rätt tuff konkurrens att bli en relevant språk. Men Zig har i alla fall ett par rätt trevliga egenskaper och det är (i nuläget) "bäst" på ett par saker. Blir spännande att följa språket fram till 1.0 (årets Advent of Code språk är nog hittat för min del )!

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:

Har läst på lite om Zig senaste två veckorna, så har bara skrapat på ytan än, men när det kommer till att vara det språk som man kan skriva "snabbast tänkbara kod" i har det visat sig att det är mer än bara varmluft!

I de mest grundläggande sakerna påminner syntaxen i Zig en hel del om Rust, men Zig-gänget ser sig helt som en modern version av C medan Rust kanske mer kan ses som en modern version av C++.

Likt C lyfter Zig fram egenskaper som
* "det är ett språk man kan lära sig på mycket kort tid". likt t.ex. Go, orsak: så man bara behöver debugga problemet, inte sina kunskaper i språket
* "no hidden control flow", "a=b+c" är verkligen bara en addition, det kan inte finnas gömda anrop genom att överlagra "=" och "+" (samt i C++ kan man även vara kreativ med implicit typomvandling...).

En trevlig sak är null pointer safety, även i de fall Rust kallar "unsafe" (även Rust har detta i "safe Rust"). (null är av sin skapare benämnt som "NULL: The Billion Dollar Mistake").

samt lite annat smått och gott.

Zig försöker inte göra det Rust åstadkommer med sin borrow-checker, man ur en viss synvinkel lägre satta krav på "säkerhet" men ur andra högre satta krav. Det finns saker som är svårt/omöjligt att göra inom ramen av "safe Rust", Zig verkar ha som mål att inte ha specialfall får något relevant fall för t.ex. mikrokontrollers, OS-kärnor etc men ändå vara långt säkrare än C och C++.

Sedan till prestanda: idiomatisk Zig kan i vissa lägen producera maskinkod som är (något) snabbare än C/C++/Rust, en orsak är att man bl.a. definierar alla former av overflow som "undefined behavior". C/C++/Rust har alla väldefinierad aritmetik med "unsigned" medan C och C++ har "signed" overflow som UB.

Finns en del extra optimeringar kompilatorn kan göra i vissa lägen i Zig p.g.a. Vill man ha väldefinierad hantering av overflow i Zig går det både för signed och unsigned, finns speciella operatorer för det.

Men den stora saken är att hantering av SIMD är en first-class citizen i Zig. LLVM (kompilatorinfrastrukturen som Rust standardkompilatorn använder, som C/C++ kompilatorn Clang använder, Swift kompilatorn använder m.fl.) har väldigt avancerad hantering av SIMD. Bl.a. Intel har lagt en hel del krut på detta via deras ISPC projekt (en C variant som påminner om Nvidias CUDA), även Nvidia/AMD har jobbat med LLVM då de använder tekniken för deras GPUer.

Semantiken i grundspråken C, C++ och även Rust gör det relativt svårt för en kompilator att använda SIMD mer än väldigt sporadisk, det blir inte i närheten samma nivå som t.ex. med ISPC.

Det ISPC gör för CPUer är i praktiken en grundläggande den av Zig. Några saker det medför är:
* problem som är data-parallella kan kodas i ett sätt med Zig som gör det trivialt för en kompilator att generera väldigt effektiv SIMD kod när man bygger för en CPU som har SIMD-stöd, samtidigt som koden fortfarande blir effektiv och gör rätt saker även man t.ex. bygger för en 8 bit AVR (populär CPU för mikrokontrollers)

* man kan utnyttja SIMD fullt ut utan att behöva dra till med specifika för x86/x86_64 eller ARM64 eller OS-specifika saker.

Ett område där Zig känns som handen-i-hansken är spel! Dels p.g.a. SIMD-hanteringen men också då spelmotorer ofta har behov av custom-minneshanterare, Zigs standardbibliotek är designat så att allt som arrayer, hashmaps, ja allt, inte förutsätter något kring minnesallokering utan de tar en allokator som argument.

Även WebASM har nytta av detta då minneshanteringen där är "speciell" och har ofta svårt att samarbete bra med standardbiblioteken i de flesta andra språk.

Är det en given succé? Knappast, är rätt tuff konkurrens att bli en relevant språk. Men Zig har i alla fall ett par rätt trevliga egenskaper och det är (i nuläget) "bäst" på ett par saker. Blir spännande att följa språket fram till 1.0 (årets Advent of Code språk är nog hittat för min del )!

Det finns ett annat relativt nytt språk som har lite liknande ambitioner (C ersättare). https://odin-lang.org/

Permalänk
Datavetare
Skrivet av pine-orange:

Det finns ett annat relativt nytt språk som har lite liknande ambitioner (C ersättare). https://odin-lang.org/

Har du någon erfarenhet av Odin?

Läste på lite snabbat om språket, det verkar ju skapat ungefär samtidigt som Zig. Det är skapat av Ginger Bill (är det hans riktiga namn?) som bl.a. är spelprogrammerare.

Men verkar som Odin inte alls fått samma fart som Zig, ser ut som det är långt färre som hjälper till där och om jag förstod det hela rätt kör man med transpiling till C, i stället för som Zig ha en native-implementation med kompilatorn.

Ett mål med Odin är att inte binda det hårt till LLVM, Zig har gjort det omvända och gått "all-in" med LLVM. Ett ställe man ser detta är prestanda, i nuläget verkar likvärdiga program skrivna i Zig vara rätt mycket snabbare än motsvarande i Odin (t.ex. Benchmark Game för respektive språk).

Nu är båda dessa språk väldigt unga, ingen har nått 1.0 än. I nuläget verkar Odin ha lite mer uppförsbacke då det inte nått lika långt, samtidigt har de stora överlapp i att båda har väldigt enkel/effektiv integration mot C, båda siktar på att vara en modern variant av C, d.v.s. snabba, effektiva, men fortfarande enkla språk med manuell minneshantering.

Får lägga upp Odin på listan över saker "att undersöka vidare i framtiden". Saker kan ju hända, sannolika för de flesta språk är att typ "ingen" bryr sig. Men kan också ta fart rätt vad det är, som Rust som nu hittat in både i Linux och Windows kernel vilket lär garantera att det språket kommer hänga med ett bra tag framåt.

Visa signatur

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

Permalänk
Medlem
Skrivet av Yoshman:

Har du någon erfarenhet av Odin?

Läste på lite snabbat om språket, det verkar ju skapat ungefär samtidigt som Zig. Det är skapat av Ginger Bill (är det hans riktiga namn?) som bl.a. är spelprogrammerare.

Men verkar som Odin inte alls fått samma fart som Zig, ser ut som det är långt färre som hjälper till där och om jag förstod det hela rätt kör man med transpiling till C, i stället för som Zig ha en native-implementation med kompilatorn.

Ett mål med Odin är att inte binda det hårt till LLVM, Zig har gjort det omvända och gått "all-in" med LLVM. Ett ställe man ser detta är prestanda, i nuläget verkar likvärdiga program skrivna i Zig vara rätt mycket snabbare än motsvarande i Odin (t.ex. Benchmark Game för respektive språk).

Nu är båda dessa språk väldigt unga, ingen har nått 1.0 än. I nuläget verkar Odin ha lite mer uppförsbacke då det inte nått lika långt, samtidigt har de stora överlapp i att båda har väldigt enkel/effektiv integration mot C, båda siktar på att vara en modern variant av C, d.v.s. snabba, effektiva, men fortfarande enkla språk med manuell minneshantering.

Får lägga upp Odin på listan över saker "att undersöka vidare i framtiden". Saker kan ju hända, sannolika för de flesta språk är att typ "ingen" bryr sig. Men kan också ta fart rätt vad det är, som Rust som nu hittat in både i Linux och Windows kernel vilket lär garantera att det språket kommer hänga med ett bra tag framåt.

Det har jag inte, men när du nämnde att du troligtvis hade hittat årets språk för AoC så tänkte jag bara göra dig uppmärksam om ytterligare ett C alternativ

Som du säger, det återstår att se om språket får någon kritisk massa.