Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Microsoft is Rust:ing
Visa signatur
Jag fick höra detta från en klok person en gång i tiden:
Rust är bättre än C++, men om Rust ska ersätta C++ så måste Rust standaliseras. Då blir Rust utkonkurrerat.
Så orsaken varför Rust kan bli bättre än C++ är för att C++ uppdateras enligt ISO-standard, medan Rust uppdateras efter kunskap från fria utvecklare. Men skulle Rust standaliseras så skulle Rust ej kunna utvecklas i samma takt som den gör nu.
Standardisering görs för att få kvalité och säkerhet, så inte alla kör med sina olika versioner på kompilatorn och skriver olika typer av kod.
Senast redigerat
Citera flera
Citera
Skrivet av heretic16:
Jag fick höra detta från en klok person en gång i tiden:
Rust är bättre än C++, men om Rust ska ersätta C++ så måste Rust standaliseras. Då blir Rust utkonkurrerat.
Så orsaken varför Rust kan bli bättre än C++ är för att C++ uppdateras enligt ISO-standard, medan Rust uppdateras efter kunskap från fria utvecklare. Men skulle Rust standaliseras så skulle Rust ej kunna utvecklas i samma takt som den gör nu.
Standardisering görs för att få kvalité och säkerhet, så inte alla kör med sina olika versioner på kompilatorn och skriver olika typer av kod.
Varken Microsoft eller Linux-gänget skulle ens överväga Rust om de inte ansåg att det kommit till en punkt där man kan räkna med att kod som skrivs och går att kompilera idag även kommer gå att kompilera 10-20 år från nu.
Det är sant att Rust saknar en formell språkdefinition, men man har däremot en referensimplementation som är "ground-truth" (LLVM/Rustc). Vidare, en sak man specifikt lärt sig från C++ är hur man kan lösa problemet att fixa dåliga designbeslut utan att paja bakåtkompatibilitet med existerande kod: Rust Editions.
C++ var tvungen att stava "var" som "auto" och "await" som "co_await" då man skulle haft sönder allt för mycket program om man gjort om de mer logiska namnen till nyckelord.
För Rust can varje enskild "crate" (det C++ kallar "translation unit") använda sig av potentiellt olika Rust Editions. Nyckelord och andra saker som kan bryta bakåtkompatibilitet läggs aldrig till i en existerande "Rust Edition", utan kommer i en nu och vill man använda de nya sakerna väljer man den versionen för sin crate.
Avsaknad av formell specifikation är ett problem i vissa lägen, den mest relevanta givet fördelarna i Rust är formell certifiering av kod: det är i praktiken inte möjligt att göra en sådan certifiering om det inte finns en formell specifikation man kan peka på att man följer fullt ut!
Men ISO-standard är inget krav. Java och Go är inte ISO-standarder, men de har ändå formella språkdefinitioner. C#/.Net har bara en väldigt liten del som del av ISO-standard, sen finns en standard för varje release som "bara" har en formell definition.
Standard är inte det kritiska för OS-kärnor, de vill ha stabilitet och kompatibilitet. Linux använder i praktiken inte ISO C, den använder GNU C och det har gått rätt bra ändå...
Visa signatur
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Citera flera
Citera
(5)
Skrivet av Yoshman:
Varken Microsoft eller Linux-gänget skulle ens överväga Rust om de inte ansåg att det kommit till en punkt där man kan räkna med att kod som skrivs och går att kompilera idag även kommer gå att kompilera 10-20 år från nu.
Menar du Linus Torvalds också?
Han säger att det finns inget bättre språk för hårdvara än C. Det gör han än idag. Han har dock accepterat att baka in Rust i Linux. Men troligtvis är det för att han prioriterar sin kärna mer än vad han gör om språk. Ett språk är bara ett verktyg.
Citat:
Det är sant att Rust saknar en formell språkdefinition, men man har däremot en referensimplementation som är "ground-truth" (LLVM/Rustc). Vidare, en sak man specifikt lärt sig från C++ är hur man kan lösa problemet att fixa dåliga designbeslut utan att paja bakåtkompatibilitet med existerande kod: Rust Editions.
C++ var tvungen att stava "var" som "auto" och "await" som "co_await" då man skulle haft sönder allt för mycket program om man gjort om de mer logiska namnen till nyckelord.
För Rust can varje enskild "crate" (det C++ kallar "translation unit") använda sig av potentiellt olika Rust Editions. Nyckelord och andra saker som kan bryta bakåtkompatibilitet läggs aldrig till i en existerande "Rust Edition", utan kommer i en nu och vill man använda de nya sakerna väljer man den versionen för sin crate.
Jag har aldrig kört Rust, bara C och C++. Just nu (10:04) skriver jag C för matematiska beräkningar som måste vara optimala.
Det är bökigt och omständigt och jag måste ha kontroll på allt. Minsta lilla fel på indexeringen och ALLT blir fel. Det kan ta timmar att felsöka då jag får inget fel om jag överindexerar. Om jag indexerar för mycket, ja, då kan jag få ett felmeddelande att något om minnet gick inte bra. Men jag får inte vad för fel och vart felet är.
Sådant saknar jag både i C och C++. Det finns det dock i Java, MATLAB, C# och massa andra språk som är högnivåspråk. Har Rust denna funktion att kunna avgöra om man överindexerar för minsta lilla?
Citat:
Avsaknad av formell specifikation är ett problem i vissa lägen, den mest relevanta givet fördelarna i Rust är formell certifiering av kod: det är i praktiken inte möjligt att göra en sådan certifiering om det inte finns en formell specifikation man kan peka på att man följer fullt ut!
Men ISO-standard är inget krav. Java och Go är inte ISO-standarder, men de har ändå formella språkdefinitioner. C#/.Net har bara en väldigt liten del som del av ISO-standard, sen finns en standard för varje release som "bara" har en formell definition.
Standard är inte det kritiska för OS-kärnor, de vill ha stabilitet och kompatibilitet. Linux använder i praktiken inte ISO C, den använder GNU C och det har gått rätt bra ändå...
Standardiserar man ett språk så låter man en annan organisation bestämma över språket. Då tappar språket sin glöd, men språket blir applicerbart ute i verkligheten och man kan investera sin tid i språket utan att känna att man måste lära sig nytt hela tiden.
Java har ingen ISO-standard. Men Oracle har sagt att Java 8 är defacto en standardalisering av Java. Många företag kör fortfarande Java 8 för att den är pålitlig och säker. Jag säga att Java 6 uppdateras fortfarande om man är kund hos Azul. Då har språkversionen haft stöd i 20 år.
Personligen är jag lite skeptisk till Rust.
När jag tittar på språk så tittar jag inte bara på språket, utan även kulturen kring språket.
Jag skulle inte falla mig i och lära mig Python. Python är ett riktigt bra språk, ett av dom bästa i världen. Igår så tittade jag på Python-kod och försökte skriva om det till MATLAB-kod. Det gick bra och språket var enkelt att tyda. Men jag gillar inte kulturen kring språket.
Språket attraherar folk som inte orkar lära sig koda på riktigt och vill helst bara "googla" fram färdig kod som man kopierar och klistrar. Orsaken har med att Python-programmerare kommer från en annan miljö där optimalitet och minne är totalt ointressant. Fungerar koden, så fungerar koden. Vad som händer inuti koden är ointressant.
Rust är samma sak där också. Språket är jätte bra(vad jag har hört) och dom som har utvecklat språket är troligtvis folk som har sett bristerna i C++(vad jag tror). Men språket attraherar folk som ofta kommer från webbutvecklingssidan(vad jag har sett). Folk som kommer från webbutvecklingssidan vill inte hålla på med gammal teknologi. Dom vill ha nytt hela tiden för det är vad som är grejen med moderna webbapplikationer - Nytt och fräscht. C++ är gammalt som gatan och dessutom uppdateras sällan.
Därför passar inte C++ in på en ny generation av programmerare då C++ har blivit ett vetenskapligt språk på den sista tiden. Det finns en anledning varför C++ är dominerande när det kommer till hantera datorgrafik, trots att det finns andra språk som löser samma uppgift till säkerligen till ett billigare utvecklingspris
Jag däremot är en person som bara älskar Windows 95 och vill köra min kod på en Windows 95 maskin och bara skriva C kod hela dagarna. Disketter och verkligen skriva kod som är portabel och optimal, samt att koden blir aldrig "gammal", är något som jag gillar. Nej, jag kommer inte från en äldre generation, utan jag gillar det som anses vara svårt för jag får igen den förr eller senare
Vem är du då?
Citera flera
Citera
Skrivet av heretic16:
Menar du Linus Torvalds också?
Han säger att det finns inget bättre språk för hårdvara än C. Det gör han än idag. Han har dock accepterat att baka in Rust i Linux. Men troligtvis är det för att han prioriterar sin kärna mer än vad han gör om språk. Ett språk är bara ett verktyg.
Detta är ett citat från Torvalds bl.a. kring vikten av standard i en OS-kärna
"I've been very vocal on saying the standard in this area is crap. And we're going to ignore the standard because the standard is wrong. So the same is going to be true on the Rust side."
"The more important part is that the Rust compiler needs to be reliable and stable."
Skrivet av heretic16:
Jag har aldrig kört Rust, bara C och C++. Just nu (10:04) skriver jag C för matematiska beräkningar som måste vara optimala.
Det är bökigt och omständigt och jag måste ha kontroll på allt. Minsta lilla fel på indexeringen och ALLT blir fel. Det kan ta timmar att felsöka då jag får inget fel om jag överindexerar. Om jag indexerar för mycket, ja, då kan jag få ett felmeddelande att något om minnet gick inte bra. Men jag får inte vad för fel och vart felet är.
Sådant saknar jag både i C och C++. Det finns det dock i Java, MATLAB, C# och massa andra språk som är högnivåspråk. Har Rust denna funktion att kunna avgöra om man överindexerar för minsta lilla?
Rust fångar inte bara off-by-one fel, Rust garanterar att din kod överhuvudtaget inte har några fall av "undefined behavior". Det är garantier du inte får i vare sig C, C++ eller Java, C#, Python, m.fl.
Men det hindrar dig fortfarande inte att skriva logiska buggar, så fortfarande väldigt många sätt man kan göra fel.
Skrivet av heretic16:
Standardiserar man ett språk så låter man en annan organisation bestämma över språket. Då tappar språket sin glöd, men språket blir applicerbart ute i verkligheten och man kan investera sin tid i språket utan att känna att man måste lära sig nytt hela tiden.
Rust hanteras av en organisation, Rust Foundation.
Värt att nämna här är att ett av de mest använda programspråken i världen just nu, Python, saknar också en formell språkdefinition. Uppenbarligen går det att skriva väldigt mycket användbart ändå...
Skrivet av heretic16:
Java har ingen ISO-standard. Men Oracle har sagt att Java 8 är defacto en standardalisering av Java. Många företag kör fortfarande Java 8 för att den är pålitlig och säker. Jag säga att Java 6 uppdateras fortfarande om man är kund hos Azul. Då har språkversionen haft stöd i 20 år.
Och det är exakt den här typen av kompatibilitet man hanterar via Rust Editions. Om 20 år kommer man fortfarande kunna kompilera och skriva ny kod i den kompilatorversion som finns då som använder sig av Rust 2015 Edition.
"Rust Edition" inte är samma sak som språkversion, man skapar bara en ny sådan om man stöter på något som är tillräckligt bra/viktigt för att motivera en bakåtinkompatibel förändring i språket.
Skrivet av heretic16:
Personligen är jag lite skeptisk till Rust.
När jag tittar på språk så tittar jag inte bara på språket, utan även kulturen kring språket.
Jag skulle inte falla mig i och lära mig Python. Python är ett riktigt bra språk, ett av dom bästa i världen. Igår så tittade jag på Python-kod och försökte skriva om det till MATLAB-kod. Det gick bra och språket var enkelt att tyda. Men jag gillar inte kulturen kring språket.
Språket attraherar folk som inte orkar lära sig koda på riktigt och vill helst bara "googla" fram färdig kod som man kopierar och klistrar. Orsaken har med att Python-programmerare kommer från en annan miljö där optimalitet och minne är totalt ointressant. Fungerar koden, så fungerar koden. Vad som händer inuti koden är ointressant.
Rust är samma sak där också. Språket är jätte bra(vad jag har hört) och dom som har utvecklat språket är troligtvis folk som har sett bristerna i C++(vad jag tror). Men språket attraherar folk som ofta kommer från webbutvecklingssidan(vad jag har sett). Folk som kommer från webbutvecklingssidan vill inte hålla på med gammal teknologi. Dom vill ha nytt hela tiden för det är vad som är grejen med moderna webbapplikationer - Nytt och fräscht. C++ är gammalt som gatan och dessutom uppdateras sällan.
Därför passar inte C++ in på en ny generation av programmerare då C++ har blivit ett vetenskapligt språk på den sista tiden. Det finns en anledning varför C++ är dominerande när det kommer till hantera datorgrafik, trots att det finns andra språk som löser samma uppgift till säkerligen till ett billigare utvecklingspris
Rust har p.g.a. av lite olika, främst tekniska, anledningar blivit väldigt populärt ihop med Web Assembly. Men mer än så är inte Rust ett "webspråk". Ovanpå det startades Rust-projektet för att vissa inom Mozilla blev så frustrerad över hur exceptionellt lätt det är att skriva race-buggar i C++ (ett exempel på "undefined behavior" i C++, något som inte kompilerar i Rust!).
Rust är tvärtom specifikt designat för att vara systemspråk, d.v.s. i samma kategori som C och C++. Finns egentligen inga andra stora språk än dessa tre i denna kategori.
Rust är väldigt inspirerat av ML, d.v.s ett av de viktiga funktionella språket. Syntaxen för macros är långt mer "matematisk" i sin design jämfört med C/C++, där handlar det om relativt enkel sträng-substituering.
Skrivet av heretic16:
Jag däremot är en person som bara älskar Windows 95 och vill köra min kod på en Windows 95 maskin och bara skriva C kod hela dagarna. Disketter och verkligen skriva kod som är portabel och optimal, samt att koden blir aldrig "gammal", är något som jag gillar. Nej, jag kommer inte från en äldre generation, utan jag gillar det som anses vara svårt för jag får igen den förr eller senare
Vem är du då?
Jag ser ingen poäng i att hänga kvar vid gammal junk. Men som då jag jobbat med OS-kernels i nästan två decennier ser jag definitivt värdet i stabilitet och att saker är väldefinierade!
Ser definitivt inte Rust som lösningen på allt. Tror starkt på Rust för OS och OS-systemtjänster.
Men för många typer av applikationer man absolut skulle kunna välja Rust faller mitt val oftare på Go p.g.a. av de saker man fokuserat på i den senare råkar ha ett större värde än de man primärt fokuserat på i Rust.
För microkontrollers var jag väldigt skeptiskt till Micropythons framfart, för mig var det något man programmerar i C, C++ eller möjligen Rust. Har helt svängt, Raspberry Pi Pico visar hur man med stor fördel kan kombinera Micropython för "kontrollogik" med cykel-perfekt långnivåspråk för realtids-delarna.
Visa signatur
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Citera flera
Citera
(2)
Skrivet av Yoshman:
Detta är ett citat från Torvalds bl.a. kring vikten av standard i en OS-kärna
"I've been very vocal on saying the standard in this area is crap. And we're going to ignore the standard because the standard is wrong. So the same is going to be true on the Rust side."
"The more important part is that the Rust compiler needs to be reliable and stable."
Så detta betyder att Linus Torvalds går ifrån C nu?
Citat:
Rust fångar inte bara off-by-one fel, Rust garanterar att din kod överhuvudtaget inte har några fall av "undefined behavior". Det är garantier du inte får i vare sig C, C++ eller Java, C#, Python, m.fl.
Men det hindrar dig fortfarande inte att skriva logiska buggar, så fortfarande väldigt många sätt man kan göra fel.
Fast min IDE kan varna mig om jag har någon variabel som är odefinierad.
Citat:
Värt att nämna här är att ett av de mest använda programspråken i världen just nu, Python, saknar också en formell språkdefinition. Uppenbarligen går det att skriva väldigt mycket användbart ändå...
Och det är exakt den här typen av kompatibilitet man hanterar via Rust Editions. Om 20 år kommer man fortfarande kunna kompilera och skriva ny kod i den kompilatorversion som finns då som använder sig av Rust 2015 Edition.
"Rust Edition" inte är samma sak som språkversion, man skapar bara en ny sådan om man stöter på något som är tillräckligt bra/viktigt för att motivera en bakåtinkompatibel förändring i språket.
Så vad väntar företagen på då? Kasta ut alla språk då och ha bara kvar Rust?
Rust verkar ju ha löst allt som ingen har löst?
Citat:
Rust har p.g.a. av lite olika, främst tekniska, anledningar blivit väldigt populärt ihop med Web Assembly. Men mer än så är inte Rust ett "webspråk". Ovanpå det startades Rust-projektet för att vissa inom Mozilla blev så frustrerad över hur exceptionellt lätt det är att skriva race-buggar i C++ (ett exempel på "undefined behavior" i C++, något som inte kompilerar i Rust!).
Varför har inte C++ åtgärdat detta då?
Citat:
Rust är väldigt inspirerat av ML, d.v.s ett av de viktiga funktionella språket. Syntaxen för macros är långt mer "matematisk" i sin design jämfört med C/C++, där handlar det om relativt enkel sträng-substituering.
Alla språk är ju ML-inspererat idag? ML är vad stora tekniska företag marknadsför, precis som Microsoft marknadsförde C++ och Sun Microsystems marknadsförde Java under 90- och 2000-talet. Jag ser att mönstrerna återkommer igen. Inget nytt.
Snart är väll ML ute och dött och något nytt "ML 2.0" är här. Lite som "appar" är helt döda idag. Minns början på 2010-talet, då var appar "the shit". Alla skulle kunna Java och Android var det bästa som hade hänt. Nu är det webbappar som gäller där appen på telefonen är bara en webbläsare.
Citat:
Jag ser ingen poäng i att hänga kvar vid gammal junk. Men som då jag jobbat med OS-kernels i nästan två decennier ser jag definitivt värdet i stabilitet och att saker är väldefinierade!
Ser definitivt inte Rust som lösningen på allt. Tror starkt på Rust för OS och OS-systemtjänster.
Men för många typer av applikationer man absolut skulle kunna välja Rust faller mitt val oftare på Go p.g.a. av de saker man fokuserat på i den senare råkar ha ett större värde än de man primärt fokuserat på i Rust.
För microkontrollers var jag väldigt skeptiskt till Micropythons framfart, för mig var det något man programmerar i C, C++ eller möjligen Rust. Har helt svängt, Raspberry Pi Pico visar hur man med stor fördel kan kombinera Micropython för "kontrollogik" med cykel-perfekt långnivåspråk för realtids-delarna.
Gammal junk är superhäftigt! Tänk och köra knackande beräkningar på en dator från 80-talet och den ger samma resultat som en modern dator. Man stoppar in en liten diskett och sedan får datorn knacka vidare med att läsa disketten. Sedan kommer det upp några .c filer. Man kompilerar dessa, tar ca 3 minuter, sedan skriv något ut på skärmen. Det som visar är beräkningar till en grafikmotor
Du är skeptisk till Micropythons framfart. Helt korrekt. Du inser nog att Micropython attraherar folk som vill bara få saker att fungera, oavsett pris. Lite så är Arduino och Raspberry-folket. Jag har varit på många företag där dom anställda har valt Arduino eller Raspberry Pi som en funktion i deras slutprodukt. Hemska saker! Deras kod är slängt ihop utan förståelse, och sedan så ska slutprodukten ha support över 15 år!!!!
Då är det bättre att man kör PIC eller något riktigt ålderdomligt så som 8088 eller vad dom nu heter som produceras fortfarande.
Citera flera
Citera
Skrivet av heretic16:
Så detta betyder att Linus Torvalds går ifrån C nu?
"Ingen" lär gå ifrån all existerande C/C++ kod som redan är skriven och fungerar väl.
Läs vad Microsoft säger: finns ingen anledning att använda C/C++ i nya projekt, behöver man verkligen egenskaperna från dessa språk är Rust det bästa valet framåt.
En kritisk egenskap i Rust är att det har bra/effektiv kompatibilitet med existerande kod/bibliotek som använder C ABI. Det betyder att man inte behöver skriva om allt gammalt.
Skrivet av heretic16:
Fast min IDE kan varna mig om jag har någon variabel som är odefinierad.
Odefinierad variabel är inte samma sak som odefinierat beteende!
Det senare betyder: om du gör detta kan precis vad som helst hända och det är inte en bug i språket/standarden!
Skrivet av heretic16:
Så vad väntar företagen på då? Kasta ut alla språk då och ha bara kvar Rust?
Rust verkar ju ha löst allt som ingen har löst?
C, C++ och Rust täcker en rätt specifik nisch. Är mellan dessa man kan välja, för andra områden är dessa inte alls lika självklara val. Och även inom detta område finns ingen anledning att skriva om existerande kod om den fungerar väl.
Skrivet av heretic16:
Varför har inte C++ åtgärdat detta då?
Går inte med mindre än att göra språket helt bakåtinkompatibelt. Det vore helt poänglöst att paja detta, till och med de som jobbar med C++ standarden har nämnt att för nya projekt är Rust ett bättre val, men C++ kommer fortsätta vara högst relevant inom överskådlig tid p.g.a. all existerande kod som finns skrivet (och det är bättre att stanna i samma språk när man lägger till / justerar en existerande kodbas).
Inte ens Carbon kan fixa just detta problem då grundorsaken är allt för djupt rotad i hur C++ är designat. Annars är ju en huvudtanke med Carbon (specifikt designat för att vara helt kompatibelt att anropa in i existerande C++-kod) att agera känselspröt för vad man bör försöka få in i standard C++.
Har bara läst om Carbon, men för mig ser det rätt mycket ut som "vi plockar in så mycket Rust som är tekniskt möjligt och fortfarande behålla den typ av kompatibilitet vi vill ha med C++". Svårt att tro Carbon kommer slå som eget språk, men kan nog vara rätt användbart just som test-plattform för utveckling av C++.
Skrivet av heretic16:
Alla språk är ju ML-inspererat idag? ML är vad stora tekniska företag marknadsför, precis som Microsoft marknadsförde C++ och Sun Microsystems marknadsförde Java under 90- och 2000-talet. Jag ser att mönstrerna återkommer igen. Inget nytt.
Snart är väll ML ute och dött och något nytt "ML 2.0" är här. Lite som "appar" är helt döda idag. Minns början på 2010-talet, då var appar "the shit". Alla skulle kunna Java och Android var det bästa som hade hänt. Nu är det webbappar som gäller där appen på telefonen är bara en webbläsare.
ML är, tillsammans med Haskell, är en de mest kända funktionella programspråken. Det är något annat än Machine Learning.
Skrivet av heretic16:
Gammal junk är superhäftigt! Tänk och köra knackande beräkningar på en dator från 80-talet och den ger samma resultat som en modern dator. Man stoppar in en liten diskett och sedan får datorn knacka vidare med att läsa disketten. Sedan kommer det upp några .c filer. Man kompilerar dessa, tar ca 3 minuter, sedan skriv något ut på skärmen. Det som visar är beräkningar till en grafikmotor
Du är skeptisk till Micropythons framfart. Helt korrekt. Du inser nog att Micropython attraherar folk som vill bara få saker att fungera, oavsett pris. Lite så är Arduino och Raspberry-folket. Jag har varit på många företag där dom anställda har valt Arduino eller Raspberry Pi som en funktion i deras slutprodukt. Hemska saker! Deras kod är slängt ihop utan förståelse, och sedan så ska slutprodukten ha support över 15 år!!!!
Då är det bättre att man kör PIC eller något riktigt ålderdomligt så som 8088 eller vad dom nu heter som produceras fortfarande.
Smaken är olika. Personligen ser jag inget värde i att tvinga sig använda saker som är uppenbart ineffektivt och omkörd på alla relevanta sätt av nyare teknik. Men finns självklart speciella omständigheter där man behöver befatta sig med gammal teknik, då får man finna sig i det!
15 år låter väldigt lite för en ens halvlyckad embedded-produkt, man får nog räkna med 30 år.
Finns inget som hindrar någon från att skriva bra kod i Micropython. Givet hur lite kod man normalt har i en mikrokontroller finns det inte heller någon anledning att köra copy-n-paste.
Visa signatur
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Citera flera
Citera
(7)
Skrivet av Yoshman:
"Ingen" lär gå ifrån all existerande C/C++ kod som redan är skriven och fungerar väl.
Läs vad Microsoft säger: finns ingen anledning att använda C/C++ i nya projekt, behöver man verkligen egenskaperna från dessa språk är Rust det bästa valet framåt.
En kritisk egenskap i Rust är att det har bra/effektiv kompatibilitet med existerande kod/bibliotek som använder C ABI. Det betyder att man inte behöver skriva om allt gammalt.
Men om Microsoft har sagt detta så innebär detta att kasta C och C++ totalt vid ny kod? Då är det bara Rust som är det bästa?
Det låter för enkelt för att vara sant.
Rust verkar ha brutalt många buggar i sig när jag kollar på deras GitHub. 5k+ problem. Det låter väl mycket.
Citat:
Odefinierad variabel är inte samma sak som odefinierat beteende!
Det senare betyder: om du gör detta kan precis vad som helst hända och det är inte en bug i språket/standarden!
Ja, att märka sådant tycker jag är bra.
Men kan inte en kompilator märka sådant idag?
Citat:
Går inte med mindre än att göra språket helt bakåtinkompatibelt. Det vore helt poänglöst att paja detta, till och med de som jobbar med C++ standarden har nämnt att för nya projekt är Rust ett bättre val, men C++ kommer fortsätta vara högst relevant inom överskådlig tid p.g.a. all existerande kod som finns skrivet (och det är bättre att stanna i samma språk när man lägger till / justerar en existerande kodbas).
Men tror du inte C++ kommer uppdatera sig och få till sina problem? Jag menar, när man läser vad C++ frälsta skriver, så säger dom att C++ 23 så kommer det stora ändringar.
Notera att jag är inte C++ frälst. Jag är MATLAB-frälst. Jag använder dock C när MATLAB är för seg.
Däremot använder jag C++ för ImGui.
Citera flera
Citera
Skrivet av heretic16:
Så detta betyder att Linus Torvalds går ifrån C nu?
Antagligen inte, det har väl inte blivit explicit uttalat? Allt är inte binärt man kan gilla C och Rust samtidigt. Mig veterligen är det enbart moduler som skrivs i Rust och inte subsystem så vi får väl se framöver.
Skrivet av heretic16:
Fast min IDE kan varna mig om jag har någon variabel som är odefinierad.
Undefined behavior är inte samma som odefinierade variabler...
Undefined behavior (wiki)
Skrivet av heretic16:
Så vad väntar företagen på då? Kasta ut alla språk då och ha bara kvar Rust?
Rust verkar ju ha löst allt som ingen har löst?
Jag vet inte vad du försöker säga med detta. Låter som en omogen reaktion på att folk gillar Rust. Kodbaser på företag har ackumulerats under företagets existens och mycket handlar om att leverera en lösning på ett problem där kunden oftast inte bryr sig om hur problemet blivit löst. När ett företag redan rekryterat en mängd utvecklare som sitter på historisk kunskap om kodbasen så är det oftast mer värt än "Låt oss nu skriva om allt i X" och då behöva skola om/sparka sina nuvarande utvecklare.
Skrivet av heretic16:
Varför har inte C++ åtgärdat detta då?
C++ har en historiskt bagage och tidigare fattat suboptimala beslut. Vi (som utvecklarkollektiv) lär oss mer med tiden och därför kan ofta nyare språk leverera bättre upplevelser utan tekniskskuld. C++ har behövt göra avvägningar mot bakåtkompatibilitet och moderna features och vissa problem blir inte så lätta att åtgärda för att man "målat in sig i hörn". Detta ska man inte se som ett påhopp mot C++ utan snarare som att vi är människor och oförmögna att se in i framtiden. Rust kommer troligen hamna i ett liknande tillstånd i framtiden, olika språk hanterar detta på olika sätt. Exempelvis Python och Perl väljer att släppa nya major release som bryter bakåtkompatibilitet.
Skrivet av heretic16:
Alla språk är ju ML-inspererat idag? ML är vad stora tekniska företag marknadsför, precis som Microsoft marknadsförde C++ och Sun Microsystems marknadsförde Java under 90- och 2000-talet. Jag ser att mönstrerna återkommer igen. Inget nytt.
Snart är väll ML ute och dött och något nytt "ML 2.0" är här. Lite som "appar" är helt döda idag. Minns början på 2010-talet, då var appar "the shit". Alla skulle kunna Java och Android var det bästa som hade hänt. Nu är det webbappar som gäller där appen på telefonen är bara en webbläsare.
Är inte alla språk lite inspirerade av sina föregångare rent generellt? Är inte detta en del i naturlig utveckling? Språken är ju till för att vi ska kunna uttrycka oss. Är det fel enligt dig att nya konstruktioner introduceras för att vi ska kunna uttrycka oss mer effektivt eller på tydligare sätt?
Citera flera
Citera
(1)
Skrivet av heretic16:
Men om Microsoft har sagt detta så innebär detta att kasta C och C++ totalt vid ny kod? Då är det bara Rust som är det bästa?
Det låter för enkelt för att vara sant.
Rust är inte bäst i alla avseende men Microsoft tycker uppenbarligen att det är bättre än C och C++.
Skrivet av heretic16:
Rust verkar ha brutalt många buggar i sig när jag kollar på deras GitHub. 5k+ problem. Det låter väl mycket.
Ha då i åtanke att Microsoft fortfarande tycker att det är bättre och mer stabilt än C och C++. Har du någon inblick i hur det ser ut för C och C++ eller du letar enbart argument emot Rust?
Skrivet av heretic16:
Ja, att märka sådant tycker jag är bra.
Men kan inte en kompilator märka sådant idag?
I vissa fall men i andra så kan det vara unspecified.
Citera flera
Citera
(1)
Skrivet av orp:
Rust är inte bäst i alla avseende men Microsoft tycker uppenbarligen att det är bättre än C och C++.
Ha då i åtanke att Microsoft fortfarande tycker att det är bättre och mer stabilt än C och C++. Har du någon inblick i hur det ser ut för C och C++ eller du letar enbart argument emot Rust?
I vissa fall men i andra så kan det vara unspecified.
Jag har inte använt Rust så jag kan inte uttala mig något om Rust.
Jag har bara tittat på Rust och tycker att den verkar ha samma funktionaliteter som C++. Rust skrivs dock på ett sätt som jag kan tycka är lite för "grötigt". Det är en aning mer kod att skriva i Rust än i C++ kan jag tycka, men det är väll det som garanterar att Rust är ett minnessäkert språk?
Jag tror däremot att C++ kommer lära sig av Rust om nu Microsoft väljer att alla sina nya projekt skall skrivas i Rust istället för C++.
Jag har stor inblick i C och det är att I C är man alltid ensam och får inget skydd alls. Blir det fel, så blir det fel.
Än så länge så har inget annat språk klått C i just snabbhet. Det är därför jag använder C
Edit:
Amazon tog nyligen upp en jämförelse mellan olika språk. Tydligen så vinner Amazon mycket på att använda Rust istället för Java, Python, C++ osv. C slog dock Rust i alla mätningar. Men nackdelen med Rust är att det är ett svårare språk att lära sig, därmed säkrare språk också.
https://aws.amazon.com/blogs/opensource/sustainability-with-r...
Citat:
Rust is challenging to learn. Of the more than 8,000 developers responding to the 2020 Rust user survey, only about 100 identified as “expert”, and of the respondents that said they were no longer using Rust, 55% cited learning or productivity as their reason for abandoning the language.
It takes experienced engineers 3-6 months of study, supported by access to subject matter experts, to become productive with Rust. Some engineers have likened learning Rust to learning to eat your vegetables, and while many of them love it once they are productive, a lot of engineers are deciding against learning it or abandoning the effort before they become productive. The potential impact of Rust on sustainability and security will only materialize if we turn the broccoli into a brownie.
Så jag tror definitivt att minnessäkerhet kommer nog vara högsta prioritet för utvecklare i framtiden.
Men jag har kört Java under många år. Java har minnessäkerhet, men jag har känslan att jag fick mycket "Null Pointer Exception" där. Jag tycker inte detta är så säkert mot minnessäkerhet. Helst vill jag få förvarning innan jag ens debuggar koden.
Även C++ utvecklaren Bjarne Stroustrup anser att C++ bör fundera mer på minnessäkerhet. Ytterligare ett bevis på att Rust har rätt.
https://thenewstack.io/can-c-be-saved-bjarne-stroustrup-on-en...
Senast redigerat
Citera flera
Citera
Skrivet av heretic16:
Jag har inte använt Rust så jag kan inte uttala mig något om Rust.
Jag har bara tittat på Rust och tycker att den verkar ha samma funktionaliteter som C++. Rust skrivs dock på ett sätt som jag kan tycka är lite för "grötigt". Det är en aning mer kod att skriva i Rust än i C++ kan jag tycka, men det är väll det som garanterar att Rust är ett minnessäkert språk?
Posta C++ kod så kan vi visa hur motsvarande kan göras i Rust. Blir förvånad om det kommer vara någon relevant skillnad i komplexitet och skulle gissa att ställd mot C++ kommer Rust i genomsnitt i alla fall inte resultera i mer kod, snarare tvärtom.
Är inte genom komplexitet som Rust får sina garantier, är primärt genom sättet språket möjliggör för kompilatorn att kunna analysera hur många kontext som vid varje givet tillfälle kan tänkas ha en referens till en viss data.
Historisk har jag själv främst jobbat med C (kernel-kod och majoriteten av services runt detta) och C++ (systemnära applikationer). Det var initialt väldigt frustrerade att skriva Rust kod givet den bakgrunden, framförallt då jag är väldigt bekväm med saker som pekararitmetik och rent generellt jobba med "råa" C-pekare.
Skrivet av heretic16:
Jag har stor inblick i C och det är att I C är man alltid ensam och får inget skydd alls. Blir det fel, så blir det fel.
Än så länge så har inget annat språk klått C i just snabbhet. Det är därför jag använder C
Helt sant, och det är knappast speciellt önskvärt... I det du länkar nedan är Torvalds beskrivning av C tyvärr allt för träffande:
"Yet Torvalds also saw Hohndel’s analogy that it can be like juggling chainsaws. As a long-time watcher of C, Torvalds knows that C’s subtle type interactions “are not always logical” and “are pitfalls for pretty much anybody. And they’re easy to overlook, and in the kernel that’s not always a good thing.” Torvalds called Rust “the first language I saw which looked like this might actually be a solution”"
Har skrivit en del kod som krävt formell certifiering enligt DO-178C. Är en rätt restriktiv variant av C man får hålla sig till då, är allt annat än "rolig" programmering...
Skrivet av heretic16:
Edit:
Amazon tog nyligen upp en jämförelse mellan olika språk. Tydligen så vinner Amazon mycket på att använda Rust istället för Java, Python, C++ osv. C slog dock Rust i alla mätningar. Men nackdelen med Rust är att det är ett svårare språk att lära sig, därmed säkrare språk också.
https://aws.amazon.com/blogs/opensource/sustainability-with-r...
Tekniskt sett hamnade C marginellt före Rust. Slutsatsen var ändå att just C och Rust var prestandamässigt/energimässigt helt jämförbara och heltalsfaktorer före andra populära språk som Java och C#, men de var också signifikant (tiotals procent) före C++.
Lite skeptisk till det sista, om enda målet är att optimera för exekveringstid så kan C++ alltid nå minst samma prestanda som C genom helt enkelt använda C-style kod. Men gissar att man i någon mån skulle hålla sig till idiomatisk kod för varje språk i detta fall.
Likt C++ är en huvudfilisofi i Rust att försöka ha "zero cost abstractions" eller i värsta fall att man gör opt-in på kostnader från abstraktion. Skillnaden är att Rust frångår detta om det skulle orsaka fall av "undefined behavior", det har i Rust högre prio än prestanda med prestanda är rätt mycket prio#1 i C++.
Skrivet av heretic16:
Så jag tror definitivt att minnessäkerhet kommer nog vara högsta prioritet för utvecklare i framtiden.
Men jag har kört Java under många år. Java har minnessäkerhet, men jag har känslan att jag fick mycket "Null Pointer Exception" där. Jag tycker inte detta är så säkert mot minnessäkerhet. Helst vill jag få förvarning innan jag ens debuggar koden.
Och där har du en annan anledning varför Rust har värde: det går inte att få motsvarande "null pointer exception" i Rust. Även det har man designat så det kommer inte kompilera om man inte hantera ett sådant i koden (och sådan kan göra det väldigt frustrerade för de som är nya i Rust, men då ska man bara inse "skrämmande hur mycket buggar kod jag tidigare skrivet faktiskt hade...")!
Skrivet av heretic16:
Även C++ utvecklaren Bjarne Stroustrup anser att C++ bör fundera mer på minnessäkerhet. Ytterligare ett bevis på att Rust har rätt.
https://thenewstack.io/can-c-be-saved-bjarne-stroustrup-on-en...
Han pekar ju precis på orsaken varför C++ trots allt kommer vara relevant många år framåt, men också varför det inte går att rätta gamla missar i kompilator/språket.
"“One of the interesting aspects of programming language design is that if you succeed, you have what you did many many years and decades ago, and you have to live with it. Once you get users, you have responsibilities, and one of the responsibilities is not to break their code… There’s a few hundred billion lines of C++ out there, and we can’t break them.”"
Har den största respekten för Stroustrup, håller med om att C++ bara kan lösa flera av dess problem med externa verktyg men har definitivt inte hans tilltro på att det är möjligt utan göra C++ än mer komplex och hopplöst att fullt ut lära sig än vad som redan är fallet.
Visa signatur
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Citera flera
Citera
(4)
Skrivet av heretic16:
Jag har inte använt Rust så jag kan inte uttala mig något om Rust.
Jag har bara tittat på Rust och tycker att den verkar ha samma funktionaliteter som C++. Rust skrivs dock på ett sätt som jag kan tycka är lite för "grötigt". Det är en aning mer kod att skriva i Rust än i C++ kan jag tycka, men det är väll det som garanterar att Rust är ett minnessäkert språk?
Grötigt låter mest som ovana men Rust lämnar minnesgarantier som C++ inte kan exempelvis för referenser till heap-allokerat minne för items i arrayer(kan inte korrekt terminologi här).
Skrivet av heretic16:
Jag tror däremot att C++ kommer lära sig av Rust om nu Microsoft väljer att alla sina nya projekt skall skrivas i Rust istället för C++.
Kanske det men som sagt C++ kommer fortfarande vara begränsade av sin strävan för bakåtkompatibilitet.
Skrivet av heretic16:
Jag har stor inblick i C och det är att I C är man alltid ensam och får inget skydd alls. Blir det fel, så blir det fel.
Än så länge så har inget annat språk klått C i just snabbhet. Det är därför jag använder C
Jag tror ärligt talat inte att du hade märkt stor skillnad i prestanda mellan C och Rust.
Skrivet av heretic16:
Amazon tog nyligen upp en jämförelse mellan olika språk. Tydligen så vinner Amazon mycket på att använda Rust istället för Java, Python, C++ osv. C slog dock Rust i alla mätningar. Men nackdelen med Rust är att det är ett svårare språk att lära sig, därmed säkrare språk också.
...och assembly slår C i prestanda så varför skriver du inte assembly? ;P Det verkar som du tror att det är någon tävling. Om du inte gillar Rust och föredrar C och C++ så skriv C och C++. Normal reaktion till @Yoshman inlägg borde vara "Skoj att folk nu får fler språkalternativ om dom vill skriva drivare".
Skrivet av heretic16:
Så jag tror definitivt att minnessäkerhet kommer nog vara högsta prioritet för utvecklare i framtiden.
Men jag har kört Java under många år. Java har minnessäkerhet, men jag har känslan att jag fick mycket "Null Pointer Exception" där. Jag tycker inte detta är så säkert mot minnessäkerhet. Helst vill jag få förvarning innan jag ens debuggar koden.
Även C++ utvecklaren Bjarne Stroustrup anser att C++ bör fundera mer på minnessäkerhet. Ytterligare ett bevis på att Rust har rätt.
Minnessäkerhet pga säkerhetsrisker men utöver det så tror jag att det är bra med strikta språk. Buggar vill man upptäcka så tidigt som möjligt eftersom dom blir dyrare att åtgärda ju närmre kund som dom upptäcks. Rusts kompilator är väldigt gnällig och det tror jag är en poäng som du missat. Om du nu föredrar C och vill skriva säker kod så borde du kolla MISRA C, personligen så föredrar jag att skriva Rust då. ;P
Citera flera
Citera
(2)
Missad chans att använda ’Rust-ar upp’ i titeln
Citera flera
Citera
(9)
Skrivet av Yoshman:
Posta C++ kod så kan vi visa hur motsvarande kan göras i Rust. Blir förvånad om det kommer vara någon relevant skillnad i komplexitet och skulle gissa att ställd mot C++ kommer Rust i genomsnitt i alla fall inte resultera i mer kod, snarare tvärtom.
Är inte genom komplexitet som Rust får sina garantier, är primärt genom sättet språket möjliggör för kompilatorn att kunna analysera hur många kontext som vid varje givet tillfälle kan tänkas ha en referens till en viss data.
Historisk har jag själv främst jobbat med C (kernel-kod och majoriteten av services runt detta) och C++ (systemnära applikationer). Det var initialt väldigt frustrerade att skriva Rust kod givet den bakgrunden, framförallt då jag är väldigt bekväm med saker som pekararitmetik och rent generellt jobba med "råa" C-pekare.
Det var något med att i Rust om man ska implementera scanf-liknande verktyg, så måste man ha en try-catch med för att garantera säkerhet. Det är detta som jag tyckte tog typ 2 rader mer i kod än C.
Hur definierar du systemnära applikationer? För mig är det halvledare på 8 till 32-bit.
Citat:
Helt sant, och det är knappast speciellt önskvärt... I det du länkar nedan är Torvalds beskrivning av C tyvärr allt för träffande:
"Yet Torvalds also saw Hohndel’s analogy that it can be like juggling chainsaws. As a long-time watcher of C, Torvalds knows that C’s subtle type interactions “are not always logical” and “are pitfalls for pretty much anybody. And they’re easy to overlook, and in the kernel that’s not always a good thing.” Torvalds called Rust “the first language I saw which looked like this might actually be a solution”"
Har skrivit en del kod som krävt formell certifiering enligt DO-178C. Är en rätt restriktiv variant av C man får hålla sig till då, är allt annat än "rolig" programmering...
Inte speciellt önskvärt. Men enligt mig så borde väll en IDE kunna avgöra om man överindexerar på C och C++?
Citat:
Tekniskt sett hamnade C marginellt före Rust. Slutsatsen var ändå att just C och Rust var prestandamässigt/energimässigt helt jämförbara och heltalsfaktorer före andra populära språk som Java och C#, men de var också signifikant (tiotals procent) före C++.
Lite skeptisk till det sista, om enda målet är att optimera för exekveringstid så kan C++ alltid nå minst samma prestanda som C genom helt enkelt använda C-style kod. Men gissar att man i någon mån skulle hålla sig till idiomatisk kod för varje språk i detta fall.
Likt C++ är en huvudfilisofi i Rust att försöka ha "zero cost abstractions" eller i värsta fall att man gör opt-in på kostnader från abstraktion. Skillnaden är att Rust frångår detta om det skulle orsaka fall av "undefined behavior", det har i Rust högre prio än prestanda med prestanda är rätt mycket prio#1 i C++.
Jag vet inte hur avancerad Rust kod man får skriva för att uppnå samma resultat som C-kod.
Citat:
Och där har du en annan anledning varför Rust har värde: det går inte att få motsvarande "null pointer exception" i Rust. Även det har man designat så det kommer inte kompilera om man inte hantera ett sådant i koden (och sådan kan göra det väldigt frustrerade för de som är nya i Rust, men då ska man bara inse "skrämmande hur mycket buggar kod jag tidigare skrivet faktiskt hade...")!
Han pekar ju precis på orsaken varför C++ trots allt kommer vara relevant många år framåt, men också varför det inte går att rätta gamla missar i kompilator/språket.
"“One of the interesting aspects of programming language design is that if you succeed, you have what you did many many years and decades ago, and you have to live with it. Once you get users, you have responsibilities, and one of the responsibilities is not to break their code… There’s a few hundred billion lines of C++ out there, and we can’t break them.”"
Har den största respekten för Stroustrup, håller med om att C++ bara kan lösa flera av dess problem med externa verktyg men har definitivt inte hans tilltro på att det är möjligt utan göra C++ än mer komplex och hopplöst att fullt ut lära sig än vad som redan är fallet.
Men borde det inte vara några problem för en kompilator att kunna verifiera om man t.ex. överindexerar eller använder ett objekt som saknar minne? Detta påverkar ju inte syntax, funktion eller språket. Det är bara en säkerhetsfunktion för en debugger?
Jag ser inte problemet. Men tydligen så har inget gjort detta än för C och C++.
Jag har mycket problem med överindexering hos C då jag använder C för machine learning då jag måste ha supersnabba beräkningar för mitt MATLAB-system klarar inte av massdata.
Så det tar tid för mig att faktiskt programmera. Jag har stort behov av någon som kan ge mig en varning på följande:
- Du glömde frigöra minnet på matrisen....X
- Du överindexerar
- Du använder en array som saknar minne
- Du använder en array som innehåller skräpvärden
Jag menar...om MSVC kan säga åt mig att VLA arrayer är ej accepterade, då borde väll MSVC kunna säga åt mig att jag överindexerar om den verkar ha koll på mina arrayer?
Citera flera
Citera
Skrivet av heretic16:
Men borde det inte vara några problem för en kompilator att kunna verifiera om man t.ex. överindexerar eller använder ett objekt som saknar minne? Detta påverkar ju inte syntax, funktion eller språket. Det är bara en säkerhetsfunktion för en debugger?
Nix. I språk som C eller C++ går sådana fel ofta inte att upptäcka vid kompilering.
Kompilatorn har helt enkelt inte tillräckligt med information.
Det går att upptäcka och rapportera under runtime, och sådant görs ibland, men då krävs att man lägger in extra kontroller i den genererade koden vilket gör den långsammare
Citera flera
Citera
(3)
Skrivet av orp:
Grötigt låter mest som ovana men Rust lämnar minnesgarantier som C++ inte kan exempelvis för referenser till heap-allokerat minne för items i arrayer(kan inte korrekt terminologi här).
Ja, det är ovana. Men jag ogillar att man använder massa tecken. Jag tycker det är nog bökigt att C++ måste ha <> för att beskriva templates.
Citat:
Kanske det men som sagt C++ kommer fortfarande vara begränsade av sin strävan för bakåtkompatibilitet.
Det borde väll gå att låta en kompilator granska koden? Eller är detta en omöjlighet i C++ utan att kunna tangera på bakåtkompatibiliteten?
Citat:
Jag tror ärligt talat inte att du hade märkt stor skillnad i prestanda mellan C och Rust.
Jag märker ingen skillnad mellan Python och MATLAB heller.
Citat:
...och assembly slår C i prestanda så varför skriver du inte assembly? ;P Det verkar som du tror att det är någon tävling. Om du inte gillar Rust och föredrar C och C++ så skriv C och C++. Normal reaktion till @Yoshman inlägg borde vara "Skoj att folk nu får fler språkalternativ om dom vill skriva drivare".
Assembler är svårt och ej portabelt.
Nej, det är inte skoj med flera språkalternativ - Det är religion.
Citat:
Minnessäkerhet pga säkerhetsrisker men utöver det så tror jag att det är bra med strikta språk. Buggar vill man upptäcka så tidigt som möjligt eftersom dom blir dyrare att åtgärda ju närmre kund som dom upptäcks. Rusts kompilator är väldigt gnällig och det tror jag är en poäng som du missat. Om du nu föredrar C och vill skriva säker kod så borde du kolla MISRA C, personligen så föredrar jag att skriva Rust då. ;P
Att ha en gnällig kompilator skulle jag vilja ha när jag programmerar C. Borde inte detta vara enkelt fixat hos dom som utvecklar C? Jag menar, dom behöver ju inte röra bakåtkompatibiliteten? Det är väll bara lägga till en funktion som granskar koden när man kör den?
Citera flera
Citera
Skrivet av heretic16:
Att ha en gnällig kompilator skulle jag vilja ha när jag programmerar C. Borde inte detta vara enkelt fixat hos dom som utvecklar C? Jag menar, dom behöver ju inte röra bakåtkompatibiliteten? Det är väll bara lägga till en funktion som granskar koden när man kör den?
Om det är så enkelt kan väl du göra det? Finns åtskilliga C kompilatorer med öppen källkod som du kan utgå från.
(Nej, det är inte så enkelt.)
Citera flera
Citera
(4)
Skrivet av Erik_T:
Nix. I språk som C eller C++ går sådana fel ofta inte att upptäcka vid kompilering.
Kompilatorn har helt enkelt inte tillräckligt med information.
Det går att upptäcka och rapportera under runtime, och sådant görs ibland, men då krävs att man lägger in extra kontroller i den genererade koden vilket gör den långsammare
Men MSVC kan säga åt mig att den förbjuder mig att använda VLA när jag kör C eller C++.
Då borde MSVC säga åt mig att jag överindexerar också?
Så dessa funktioner som kan avgöra om man överindexerar eller liknande, dom segar ned den kompilerade applikationen?
Citera flera
Citera
Skrivet av Erik_T:
Om det är så enkelt kan väl du göra det? Finns åtskilliga C kompilatorer med öppen källkod som du kan utgå från.
(Nej, det är inte så enkelt.)
Klart det borde vara enkelt?
Om andra språk har det, varför har inte C och C++ det också?
Man behöver ju inte förändra syntaxen på koden.
Citera flera
Citera
Skrivet av heretic16:
Men MSVC kan säga åt mig att den förbjuder mig att använda VLA när jag kör C eller C++.
Då borde MSVC säga åt mig att jag överindexerar också?
Det är två väldigt olika saker.
Om du använder en VLA kan man avgöra bara genom att titta på koden, vilket är precis vad en kompilator gör. En kompilator måste ju stöda VLA:er för att överhuvudtaget kunna kompilera kod med dem.
Vad som händer när man kör koden, det går ofta inte avgöra bara genom att titta på koden.
En kompilator skulle i princip kunna varna för alla tillfällen där det är möjligt med fel-indexering (dvs för kod där den inte kan bevisa att du inte gör fel), men du skulle väldigt snabbt bli trött på alla varningar för kod som trots allt är korrekt.
Citat:
Så dessa funktioner som kan avgöra om man överindexerar eller liknande, dom segar ned den kompilerade applikationen?
Exakt. Och även om du då kan få bättre felmeddelanden som visar mer exakt var programmet gjorde fel så kan den underliggande buggen ligga någon annanstans i koden och kan ta ett tag att hitta.
Citera flera
Citera
Skrivet av heretic16:
Klart det borde vara enkelt?
Om andra språk har det, varför har inte C och C++ det också?
Man behöver ju inte förändra syntaxen på koden.
Syntax och semantik. Jo, det är precis vad du behöver förändra.
Om du inte tror mig, bevisa motsatsen. Jag och tusentals (miljoner?) andra skulle älska att ha en C kompilator som automatiskt kunde upptäcka den typen av fel.
Citera flera
Citera
Skrivet av Erik_T:
Syntax och semantik. Jo, det är precis vad du behöver förändra.
Om du inte tror mig, bevisa motsatsen. Jag och tusentals (miljoner?) andra skulle älska att ha en C kompilator som automatiskt kunde upptäcka den typen av fel.
Kolla här! Detta fungerar.
float* X = (float*)malloc(10 * sizeof(float));
free(X);
Detta blir ett problem! Du får ett felmeddelade faktiskt och detta går att upptecka i debuggern. Men den säger inte vad för typ av fel det är och vems fel det är.
float* X = (float*)malloc(10 * sizeof(float));
free(X);
free(X)
Men om jag lägger till NULL så blir det inget problem alls.
Så varför innehåller inte funktionen free() NULL som nollställer minnesadressen?
Jag menar, detta kan jag till och med lösa med ett macro. Varför har inte GCC, MSVC, LLVM osv löst detta?
Detta visar ju att om funktionen free() hade nollställt minnesadressen så skulle man aldrig kunna göra detta misstag. Varför är inte detta implementerat?
float* X = (float*)malloc(10 * sizeof(float));
free(X);
X = NULL;
free(X);
Citera flera
Citera
Skrivet av heretic16:
Kolla här! Detta fungerar.
float* X = (float*)malloc(10 * sizeof(float));
free(X);
Detta blir ett problem! Du får ett felmeddelade faktiskt och detta går att upptecka i debuggern. Men den säger inte vad för typ av fel det är och vems fel det är.
float* X = (float*)malloc(10 * sizeof(float));
free(X);
free(X)
Men om jag lägger till NULL så blir det inget problem alls.
Så varför innehåller inte funktionen free() NULL som nollställer minnesadressen?
Jag menar, detta kan jag till och med lösa med ett macro. Varför har inte GCC, MSVC, LLVM osv löst detta?
Detta visar ju att om funktionen free() hade nollställt minnesadressen så skulle man aldrig kunna göra detta misstag. Varför är inte detta implementerat?
float* X = (float*)malloc(10 * sizeof(float));
free(X);
X = NULL;
free(X);
En funktion kan inte nollställa sina argument. Visst kan du använda ett macro för att lösa just det specifika problemet, men det hjälper ju inte alla de existerande programmen.
Och den approachen skulle ändå inte lösa följande minimala förändring av ditt exempel:
float* X = (float*)malloc(10 * sizeof(float));
float *Y = X;
free(X);
X = NULL;
free(Y);
I praktiken så är motsvarande kod mycket mer komplicerad och svårare att analysera. Olika moduler och bibliotek som kompileras separat så att en fullständig analys av koden är omöjlig att göra vid kompilering, plus användande av värden som varierar vid runtime är bara början på problemen.
Citera flera
Citera
(3)
Skrivet av heretic16:
Det var något med att i Rust om man ska implementera scanf-liknande verktyg, så måste man ha en try-catch med för att garantera säkerhet. Det är detta som jag tyckte tog typ 2 rader mer i kod än C.
Skiter man i att kolla om givet data faktiskt är ett tal kan man ju göra detta.
fn read_from_stdin_c_style() {
let int_from_stdin: i32 = try_read!().unwrap_or_default();
println!("You wrote the integer {}", int_from_stdin);
}
D.v.s. det är en enda rad att läsa in "scanf()" style
let int_from_stdin: i32 = try_read!().unwrap_or_default();
Man kan skicka in formaterings-sträng till try_read!() vid behov.
Givet att man i C måste deklarera variabel på en egen rad så blir det mer komplicerat där!
Visa signatur
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Citera flera
Citera
(3)
Skrivet av Yoshman:
Skiter man i att kolla om givet data faktiskt är ett tal kan man ju göra detta.
fn read_from_stdin_c_style() {
let int_from_stdin: i32 = try_read!().unwrap_or_default();
println!("You wrote the integer {}", int_from_stdin);
}
D.v.s. det är en enda rad att läsa in "scanf()" style
let int_from_stdin: i32 = try_read!().unwrap_or_default();
Man kan skicka in formaterings-sträng till try_read!() vid behov.
Givet att man i C måste deklarera variabel på en egen rad så blir det mer komplicerat där!
Men är inte detta två rader kod? Jag menar, du anropar ju en metod från ett objekt.
Citera flera
Citera
Skrivet av heretic16:
Men är inte detta två rader kod? Jag menar, du anropar ju en metod från ett objekt.
Anrop + error handling
Citera flera
Citera
Skrivet av Erik_T:
En funktion kan inte nollställa sina argument. Visst kan du använda ett macro för att lösa just det specifika problemet, men det hjälper ju inte alla de existerande programmen.
Och den approachen skulle ändå inte lösa följande minimala förändring av ditt exempel:
float* X = (float*)malloc(10 * sizeof(float));
float *Y = X;
free(X);
X = NULL;
free(Y);
I praktiken så är motsvarande kod mycket mer komplicerad och svårare att analysera. Olika moduler och bibliotek som kompileras separat så att en fullständig analys av koden är omöjlig att göra vid kompilering, plus användande av värden som varierar vid runtime är bara början på problemen.
Är det inte bara ha någon modul som granskar koden? Jag menar, om folk lyckas skapa robotar som kan ha känslor, så kan folk säkerligen implementera någon MISRA C check-modul i en valfri IDE?
Citera flera
Citera
Skrivet av orp:
Anrop + error handling
Okej. Kostar detta extra assemblerkod?
Eller Rust kanske är skapat så att den genererar mindre assemblerkod, och är ändå säkrare?
Citera flera
Citera
Skrivet av heretic16:
Okej. Kostar detta extra assemblerkod?
Eller Rust kanske är skapat så att den genererar mindre assemblerkod, och är ändå säkrare?
Om du ska kolla returvärdet från scanf() genererar det mer assembly? Självklart kommer en extra error check generera mer maskinkod. Jag försöker förstå vad din poäng är eller om det är någon märklig "gotcha". Det går att köra try_read!() utan unwrap_or_default() ifall du nu fiskar efter det.
Jag känner att tråden har derail:at och att det mer handlar om att du inte gillar Rust och du nu känner behov av att rättfärdiga för omvärlden att du ska få fortsätta att skriva C och C++.
Du använder performance som ständigt argument men som jag tidigare nämnt så tror jag inte att du kommer märka skillnad i prestanda mellan C, C++, Rust, Zig, Carbon, med flera. Det är OK att du inte gillar Rust och ingen tvingar dig att skriva det.
Citera flera
Citera
(10)
- Apple rullar ut försenade Carplay Ultra18
- Sony avtäcker nya flaggskeppshörlurarna WH-1000XM640
- Krönika: Windows lever på lånad tid254
- Vad kallas denna kabel (bild)?33
- Har jag blivit hackad eller är de virus?12
- Dagens fynd — Diskussionstråden54k
- Cooler Master NR200P "North Edition"32
- Plats för lite gubbgnäll12k
- Ny lågbudgetrekalmfilm från microsoft hävdar Copilot + PC är 58%2
- Tre år Game Pass för 10 kr till PC och XBox912
- Skänkes 10U rack på hjul
- Säljes DDR4 2x8GB 3000Mhz Corsair
- Säljes Enklare dator, nästan komplett
- Säljes Äldre speldator: - RTX 2060 - i5 9600k -
- Säljes Oöppnad Xiaomi 14T 12GB RAM 256GB
- Köpes Sökes AM5 ITX Moderkort, CPU 9600X, RAM DDR5
- Säljes Samsung Soundbar HW-Q995D
- Säljes Ny LG OLED 42" C4
- Säljes Gamingdator utan GPU 7800X3D
- Säljes Kompetent speldator: i9 9900k, RTX 3060 12GB, 32 GB ram Corsair, Asus ROG Strix z390, Corsair Hydro H150i PRO
- Apple rullar ut försenade Carplay Ultra18
- Microsoft fixar bugg som hindrade Linux att starta21
- HAVN HS 420 VGPU – En briljant chassidebut31
- Fractal Design lanserar Meshify 3 & Meshify 3 XL33
- Sony avtäcker nya flaggskeppshörlurarna WH-1000XM640
- Google byter ut "Jag har tur" mot AI-knapp i sök17
- Quiz: Vad kan du om användargränssnitt?155
- Nej, Steam-lösenord är inte läckta20
- Konsumentverket kritiserar kassa kundtjänster55
- AMD utvecklar ARM-baserad systemkrets49
Externa nyheter
Spelnyheter från FZ
- Svenskutvecklade Lost in Random: The Eternal Die har fått släppdatum idag
- Kingdom Come: Deliverance 2:s första DLC är ute – se trailern idag
- Stellar Blades pc-datum bekräftat tillsammans med systemkrav idag
- Nintendo demonstrerar muskontroll på Switch 2:s hemskärm igår
- Diskutera – Vilken superkraft från spel vill du ha? igår