Varför har inte C några C++ funktionaliteter?

Permalänk

Varför har inte C några C++ funktionaliteter?

Jag har kört C i många år nu. Jag gillar detta språk. Det är rent och enkelt.
Enda nackdelen med C är att ibland blir det lite mycket kod då man får bygga allt från grunden. Lyckligtvis så finns det stora bibliotek som man använder som löser detta problem åt en.

Men ibland så måste något mer tillkomma för att göra det roligare att programmera C. Jag har den senaste månaden testat C++ och jag måste säga att det är ett krångligt språk på grund utav objektorienteringen. Dock är språket kraftfullt då den har alla verktyg - ibland för mycket verktyg, som löser samma problem, vilket inte finns i C.

Jag har hittat mitt sätt att programmera C++ och det är att undvika objektorienteringen till all kostnad. Istället satsa bara på funktionsprogrammering, dvs en hög med funktioner, ibland privata och ibland publika, med statiska fält utanför funktionerna.
Samt kombinera std::vector och std::string har verkligen varit hjälpt mig enormt mycket.

Så jag skulle säga att jag programmerar egentligen C, med vissa funktionaliteter av C++ som jag tycker är bra.
Då är mina två frågor:

1. Är detta normalt att C++ programmerare gör så? Man skriver C-kod, fast med vissa C++ funktionaliteter. Kompilatorn är dock C++.
2. Varför har inte C just std::vector och std::string inkluderat i C-standard library? Jag tycker dessa är väldigt användbara. Visst, man kan göra länkad lista...men vad är det för fel att inkludera std::vector och std::string? Motivering?

Permalänk
Hedersmedlem
Skrivet av heretic16:

1. Är detta normalt att C++ programmerare gör så? Man skriver C-kod, fast med vissa C++ funktionaliteter. Kompilatorn är dock C++.

C++ är som sagt ett mycket större språk än c, så det är mycket svårare att överblicka (för att inte tala om behärska) allt. Så gott som alla håller sig nog oftast till en välbekant delmängd av språket, och c-kod är ju vanligtvis giltig även i c++. Med tiden exponeras man kanske för andra delar av språket och infogar även dessa i sin repertoar.

Permalänk
Skrivet av Elgot:

C++ är som sagt ett mycket större språk än c, så det är mycket svårare att överblicka (för att inte tala om behärska) allt. Så gott som alla håller sig nog oftast till en välbekant delmängd av språket, och c-kod är ju vanligtvis giltig även i c++. Med tiden exponeras man kanske för andra delar av språket och infogar även dessa i sin repertoar.

Hur programmerar du?
Rent C++
Rent C
En blandning av C och C++?

Som jag uppfattar C++20 så är det ett riktigt högnivåspråk idag där man använder auto istället för datatyper. Typ som Python gör.

Permalänk
Medlem
Skrivet av heretic16:

Hur programmerar du?
Rent C++
Rent C
En blandning av C och C++?

Som jag uppfattar C++20 så är det ett riktigt högnivåspråk idag där man använder auto istället för datatyper. Typ som Python gör.

Sanningen är att de allra flesta projekt består av många tusen rader kod i flertalet moduler. Har man tur så är varje modul hyfsat konsistent, men oftast har man årtionden av legacy. Vissa utvecklare brinner för att använda allt det senaste, då blir det vanligt med en hel del templating från de år där det var det bästa som fanns, sen kommer åren av auto återspeglas på andra delar. Vissa delar kanske kör med compiler hints för att optimera prestandan och programfilen ännu mer

Sanningen är att det helt beror på vilket projekt du sitter i för stunden, och allt ändras över tid baserat på hur du och dina kollegor utvecklas

Permalänk
Medlem

För att svara titeln: För att det är C.
Alla som vill ha C fast mer, typ C = C+1, ja du kan gissa vart dom hamnar.
Vi klurade ut det för typ 30 år sen.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Hur programmerar du?
Rent C++
Rent C
En blandning av C och C++?

Som jag uppfattar C++20 så är det ett riktigt högnivåspråk idag där man använder auto istället för datatyper. Typ som Python gör.

Jag använder en hel del finesser från c++, men det innebär inte att stora delar av koden kanske skulle kunna vara c också. C är ju som sagt till stor del en delmängd av c++, och ofta råkar man ju skriva giltig c-kod även om man försöker göra något enkelt i c++.
auto är rätt praktiskt för att inte behöva skriva ut långa typer där kompilatorn ändå vet vad man vill, men det är mer en genväg än någon fundamental språkförändring.

Permalänk
Medlem

C är gammalt och många gillar C som det är och vill inte ha mängder med oanvänd funktionalitet. Min uppfattning är att det gör språket mer svårportat och att många anser inte att funktionaliteten är kritisk. Varför tycker du att det ska vara en del av standard lib:et istället för ett separat lib typ ELL eller Glib?

Detta är tredje eller fjärde tråden som du skriver där du inleder med att du kodat C länge och du beklagar dig över dess funktionalitet, kanske dags att se dig om? Jag kan tipsa om Rust.

Permalänk
Medlem
Skrivet av heretic16:

Jag har kört C i många år nu. Jag gillar detta språk. Det är rent och enkelt.
Enda nackdelen med C är att ibland blir det lite mycket kod då man får bygga allt från grunden. Lyckligtvis så finns det stora bibliotek som man använder som löser detta problem åt en.

Men ibland så måste något mer tillkomma för att göra det roligare att programmera C. Jag har den senaste månaden testat C++ och jag måste säga att det är ett krångligt språk på grund utav objektorienteringen. Dock är språket kraftfullt då den har alla verktyg - ibland för mycket verktyg, som löser samma problem, vilket inte finns i C.

Jag har hittat mitt sätt att programmera C++ och det är att undvika objektorienteringen till all kostnad. Istället satsa bara på funktionsprogrammering, dvs en hög med funktioner, ibland privata och ibland publika, med statiska fält utanför funktionerna.
Samt kombinera std::vector och std::string har verkligen varit hjälpt mig enormt mycket.

Så jag skulle säga att jag programmerar egentligen C, med vissa funktionaliteter av C++ som jag tycker är bra.
Då är mina två frågor:

1. Är detta normalt att C++ programmerare gör så? Man skriver C-kod, fast med vissa C++ funktionaliteter. Kompilatorn är dock C++.
2. Varför har inte C just std::vector och std::string inkluderat i C-standard library? Jag tycker dessa är väldigt användbara. Visst, man kan göra länkad lista...men vad är det för fel att inkludera std::vector och std::string? Motivering?

1.man får skriva c++ precis hur man vill, använd ingenting om du inte vill. folk gör det som passar det dom vill lösa.
2. ja c har inte de som behövs för att implementera std::string, templates konstruktor + destruktor ligger på den som skriver kod i C , de finns verktyg för att generera den koden i C++.

sen är standarbiblioteket i c++ verkligen inte objektorienterat

Permalänk
Skrivet av orp:

C är gammalt och många gillar C som det är och vill inte ha mängder med oanvänd funktionalitet. Min uppfattning är att det gör språket mer svårportat och att många anser inte att funktionaliteten är kritisk. Varför tycker du att det ska vara en del av standard lib:et istället för ett separat lib typ ELL eller Glib?

Detta är tredje eller fjärde tråden som du skriver där du inleder med att du kodat C länge och du beklagar dig över dess funktionalitet, kanske dags att se dig om? Jag kan tipsa om Rust.

Att du minns vad jag har skrivit..... Kanske bara jag som har skrivit dessa frågor?
Jag har hört att Rust är bra, verkligen bra men kan inte verifiera om det är värt att kunna rust då det inte tillämpas på inbygga system, men jag ogillar den komplexa syntaxen.

Permalänk
Medlem

Jag jobbar som senior c++-utvecklare och kan konstatera att c++-utvecklare kommer i många former och färger. Vissa skriver i princip C, vissa skriver allt i templates, och vissa håller sig på lagom nivå och anpassar sig efter vad som är lämpligt i teamet man jobbar i - dvs oftast objektorienterat, med smartpekare, sparsamt med auto, och inte alltför mycket c++20-nymodigheter.
Templateprogrammerarna är hemska att ha att göra med. C-programmerarna är ok, deras kod går åtminstone att läsa.
Om du "lyxprogrammerar" för personligt bruk så gör du givetvis på det sätt du trivs bäst med.

Visa signatur

h170i-plus i5 6600 2x8gb ddr3l 850 pro 256gb
Don't argue with an idiot. He will drag you down to his level, and beat you with experience.

Permalänk
Medlem
Skrivet av Frappee:

1.man får skriva c++ precis hur man vill, använd ingenting om du inte vill. folk gör det som passar det dom vill lösa.

Om du skriver program på egen kammare för dig själv så ja. Skriver du åt nån annan eller i ett team (vanligast) så får man anpassa sig.

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem
Skrivet av heretic16:

Att du minns vad jag har skrivit..... Kanske bara jag som har skrivit dessa frågor?
Jag har hört att Rust är bra, verkligen bra men kan inte verifiera om det är värt att kunna rust då det inte tillämpas på inbygga system, men jag ogillar den komplexa syntaxen.

Jag känner igen mig en del i det du skriver så därför hamnar det på minnet, samt att det inte brukar vara så många C relaterade trådar. Efter att ha kodat C i några år så har jag lärt mig att älska begränsningarna och resonemangen kring stabiliteten och portabilitet. Jag ser programmeringsspråken som verktyg som fyller olika syften och jag vill ha en bra variation av verktyg i min verktygslåda. I fall jag sitter med ett projekt som kräver funktionalitet som C inte erbjuder då väljer jag hellre ett annat språk i min repertoire som passar projektet bättre än att försöka anpassa C.

Jag har nyligen börjat med Rust för att jag tänker att det skulle kunna komplettera min bakgrund inom C. Min uppfattning är att kompilatorstödet för olika plattformar är bra och det finns en online-bok som specifikt täcker embedded men jag har inte kommit dit än så ta det med en nypa salt. För olika boards så brukar det komma med lite header-filer alternativt ett SDK som hanterar boardspecifika bitar och dessa tror jag saknar Rust-stöd. Det går däremot att interface:a mot C från Rust som gör det möjligt att lappa ihop boardspecifik C-kod med din Rust-kod.

Permalänk
Medlem
Skrivet av talonmas:

Om du skriver program på egen kammare för dig själv så ja. Skriver du åt nån annan eller i ett team (vanligast) så får man anpassa sig.

Jo precis men skriver man tex rust kommer det se rätt lika ut på olika teams medan skriver du C++ är det extremt olika beroende på vad man har för förutsättningar. Är kompileringstid en viktig del av produkten som man arbetar på kommer det vara mindre OK att använda mycket som är standard i C++, man kan komma undan det och ofta likar det lite mer C.

Permalänk
Datavetare
Skrivet av medbor:

Sanningen är att de allra flesta projekt består av många tusen rader kod i flertalet moduler. Har man tur så är varje modul hyfsat konsistent, men oftast har man årtionden av legacy. Vissa utvecklare brinner för att använda allt det senaste, då blir det vanligt med en hel del templating från de år där det var det bästa som fanns, sen kommer åren av auto återspeglas på andra delar. Vissa delar kanske kör med compiler hints för att optimera prestandan och programfilen ännu mer

Sanningen är att det helt beror på vilket projekt du sitter i för stunden, och allt ändras över tid baserat på hur du och dina kollegor utvecklas

Det markerade: vissa försöker vara smartare än kompilatorn. Initialt kanske det, ibland, faktiskt fungerar. Ett hyfsat välkänt projekt, Linux-kärnan, hade en del sådant. Linus testade att rensa bort allt sådant och i alla fall han testade så var det snabbare utan dessa "hints".

Dagens kompilatorer är i de flesta fall så pass kompetenta och avancerade att de gör ett bättre jobb än en förkrossande majoritet av mänskliga programmerare när det kommer till den här typen av optimeringar.

Undantag finns naturligtvis alltid. Men just denna typ av optimering fungerande bättre förr när kompilatorer var sämre och CPUer saknade väldigt djup out-of-order körning. Idag kan optimeringar som känns logiska för en människa har motsatt effekt då man designat CPUer för att hantera typfallen.

Skrivet av orp:

C är gammalt och många gillar C som det är och vill inte ha mängder med oanvänd funktionalitet. Min uppfattning är att det gör språket mer svårportat och att många anser inte att funktionaliteten är kritisk. Varför tycker du att det ska vara en del av standard lib:et istället för ett separat lib typ ELL eller Glib?

Detta är tredje eller fjärde tråden som du skriver där du inleder med att du kodat C länge och du beklagar dig över dess funktionalitet, kanske dags att se dig om? Jag kan tipsa om Rust.

Det finns en väldigt bra anledning varför C fortfarande är väldigt populärt, framförallt till systemprogrammering på lägre nivå samt kernel-utveckling.

C är datorvärldens lingua franca. Om ett programspråk/plattform har någon form av stöd för att kommunicera med andra språk/plattformar går det nästan uteslutande via C ABI.

C++ har haft problem i dessa område bl.a. p.g.a av att Bjarne explicit valde att inte definiera C++ på binärnivå.

Skrivet av heretic16:

Att du minns vad jag har skrivit..... Kanske bara jag som har skrivit dessa frågor?
Jag har hört att Rust är bra, verkligen bra men kan inte verifiera om det är värt att kunna rust då det inte tillämpas på inbygga system, men jag ogillar den komplexa syntaxen.

Rust har ett jätteproblem: det är en rätt ordentlig tröskel man måste ta sig över för att vara någorlunda produktiv i det språket. Betydligt större än andra populära språk (avancerad template-meta programmering i C++ undantaget, det måste ta något form av pris i komplexitet...).

Rust har massor med fördelar, en av de absolut största fördelarna hänger rätt tätt ihop med varför det blir en rätt stor tröskel att lära sig språket. Rust tillåter bara kodkonstruktioner som kompilatorn kan bevisa är korrekta ur minnessäkerhetsynpunkt (både inom en tråd, och vad som är helcoolt, mellan CPU-trådar). En bieffekt av detta är att vissa fall som är korrekta, i alla fall i det speciella kontext man tänkt sig, misslyckas att kompilera då de medger de svar/garantier som behövs för att upprätthålla allt det man garanteras inom ramen för Rust.

Om man inte använder "unsafe Rust" så är man garanterad att en program som kompilerar saknar "data-race" (absolut värsta typen av buggar i multitrådade program), det finns inga "null-pointer" referenser (personen som införde "null" i Agol 1965, Tony Hoare, har kallat det sitt "The Billion Dollar Mistake" givet hur mycket problem det ställt till med), m.m.

Prestandamässigt är Rust helt i nivå med C och C++. Skriver man någorlunda idiomatisk kod av respektive språk är i praktiken C++ och Rust i flera fall lite snabbare än C. Orsaken är att kompilatorn har mer kontext kring vad man faktiskt försöker göra i de två förra språket (men självklart kan man "hand-jaga" C-koden till att vara lika snabb, men det kan vara rätt drygt).

Finns några nischer där Rust-kompilatorer kan göra optimeringar kompilatorn inte kan göra i C/C++ inom ramen av standarden (men finns typisk kompilatorflaggor för att säga: "skit i standarden, jag vet vad jag gör", så får man tillbaka de enstaka procenten).

Sen vet jag inte vad du definierar som "inbyggda system". Världens största realtids OS, VxWorks, har officiellt Rust stöd (för applikationer) sedan 2019 (var en av arkitekterna som pushade hårt för att få in Rust i produkten). Vidare lär Linux med råge vara världens populäraste "embedded OS" idag, där används ju Rust numera även i kärnan och stödet för applikationer är ju lysande då Linux, Windows och MacOS är de OS Rust-team:et ser som "primära".

Angående den ursprungliga frågan kring varför C och C++ inte har så mycket inbyggda funktioner finns tre primära svar:

1. de är gamla, när dessa språk skapades lade man typiskt inte till gigantiska standardbibliotek som vi ser hos Python, Java, .NET, m.fl.
2. båda är primärt designade som "systemspråk". Enda moderna systemspråket vi sett med någon större framgång är Rust. Just då Rust designats för att vara systemspråk har man likt C++ standardbibliotek fokuserat på väldigt generella funktioner med mycket brett användningsområde. Resultatet är ett relativt litet standardbibliotek
3. associerat med 2., för att kunna använda standardfunktionerna i alla typer av system språken kan tänkas användas till blir det flertalet saker som inte har någon relevans i standardbiblioteket. T.ex. grafik, ljud etc då det inte ens är relevant på vissa inbyggda system och definitivt inte på en typisk mikrokontroller

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

Sen vet jag inte vad du definierar som "inbyggda system". Världens största realtids OS, VxWorks, har officiellt Rust stöd (för applikationer) sedan 2019 (var en av arkitekterna som pushade hårt för att få in Rust i produkten). Vidare lär Linux med råge vara världens populäraste "embedded OS" idag, där används ju Rust numera även i kärnan och stödet för applikationer är ju lysande då Linux, Windows och MacOS är de OS Rust-team:et ser som "primära".

När jag menar inbygga system så menar jag IC-kretsar som kostar 3-30 kr ute på marknaden. Dom som normalt brukar programmeras med C. Jag hittar inte att Microchip, AVR, NXP, ST, Nordic Semiconductor med mera har erbjudit stöd för Rust till sina produkter.

Sedan tror jag inte att Rust kommer ersätta C++ eller C. Varje går kommer det upp nya språk som utmanar C++ och C.
Carbon är den senaste.

Permalänk
Datavetare
Skrivet av heretic16:

När jag menar inbygga system så menar jag IC-kretsar som kostar 3-30 kr ute på marknaden. Dom som normalt brukar programmeras med C. Jag hittar inte att Microchip, AVR, NXP, ST, Nordic Semiconductor med mera har erbjudit stöd för Rust till sina produkter.

Sedan tror jag inte att Rust kommer ersätta C++ eller C. Varje går kommer det upp nya språk som utmanar C++ och C.
Carbon är den senaste.

Fast den typen av system har i praktiken bara ett kodsegment där du kan stoppa in vad som helst bara det kan prata via C ABI.

Rust har explicit stöd för att kommunicera med C + att det finns en väldefinierad delmängd av Rust som specifikt inte beror av någon OS-runtime. D.v.s. det finns allt stöd man kan tänka sig för mikrokontrollers.

Rust är inte populärt inom mikrokontroller än, men stödet finns där redan idag och det mesta är beskrivet i Rust Embedded book som nämns i tråden.

VxWorks må sakna officiellt Rust stöd i kärnan, men med informationen i Rust Embedded book var det inga större svårigheter att använda Rust i dess kärna redan innan officiella stödet lades till. Har sett folk använda Rust ihop med FreeRTOS, bl.a. på ESP32/ESP8266 (som normalt kör Arduino, d.v.s. definitivt mikrokontrollers)

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

När jag menar inbygga system så menar jag IC-kretsar som kostar 3-30 kr ute på marknaden. Dom som normalt brukar programmeras med C. Jag hittar inte att Microchip, AVR, NXP, ST, Nordic Semiconductor med mera har erbjudit stöd för Rust till sina produkter.

Sedan tror jag inte att Rust kommer ersätta C++ eller C. Varje går kommer det upp nya språk som utmanar C++ och C.
Carbon är den senaste.

Tror ingen förväntar sig att Rust ersätter C eller C++. Är väl egentligen inget av de programspråk som i något läge varit riktigt populärt som blir ersatt, de har bara minskat i popularitet.

C lär stanna, just då det är den "standard" som i praktiken alla andra språk använder som brygga mot omvärlden*

Samma sak gäller C++. Väldigt mycket av den infrastruktur vi beror av dagligen använder enorma mängder C++ kod, ytterst få av dessa bjässar kommer skrivas om i något annat språk.

Men till och med C++ världen får erkänna att om man startar från scratch finns få anledningar att använda C++ över Rust om det senare har de bibliotek man behöver.

Rust och Carbon siktar på två väldigt olika mål. Min gissning är att Rust kommer (skulle säga att den redan har) hitta sina nischer, betydligt mer tveksamt att Carbon gör det.

Rust försöker göra det bästa tänkbara programspråket för systemprogrammering, utan att begränsas av något tidigare bagage.

Carbon huvuddesignmål är att ge "bi-directional C++ interop" (d.v.s. ska vara möjligt att anropa all C++ från Carbon och även anropa Carbon från C++). I de senare C++ standard versionerna har man bl.a. sneglat på vad Rust gjort rätt och man har infört de delar som kan införas utan att paja bakåtkompatibiliteten.

Carbon tar det ett steg längre, här tillåter man sig rätta "gamla" misstag så läge som man kan göra det inom ramen av C++<->Carbon kompatibilitet. En sak man därför inte kan erbjuda i Carbon är de garantier Rust kan göra kring data-race säkerhet.

Så Carbon är tänkt som "ett bättre C++" i fall där man redan är fast med C++. Fråga är om fördelarna är tillräckligt stora för att ska få någon fart. Rust är tänkt som "det bästa systemprogramspråk vi i nuläget är kapabla att skapa", det utan att tänka på C++ (men man har explicit tänkt på C interop, fast det hamnar inom "unsafe rust" ramen).

* Inte helt sant, Go är ett spännande undantag där man inte alls använder libc eller motsvarande under huven för att prata med OS:et utan där går man alltid direkt på systemanropen som ligger en nivå lägre. Man har explicit stöd för att anropa C, men det är rätt ineffektivt och ska aldrig användas i någon "critical path".

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

Jag tycker nog c++ är mest problematiskt för det finns så många sätt att göra samma sak. Det är ofta mer underhållbart att välja andra språk av den anledningen. Få utvecklare kan tillräckligt av språket för en djupare förståelse av begreppen som andra kanske väljer att använda. Inom en viss modul och med rätt verktyg kan det absolut bli extremt kraftfullt med bra prestanda, men min känsla är att det ofta inte är värt det och att dessa delar i projekt ofta blir orörda farliga delar när dess utvecklare lämnar företaget. En absolut källa till att göra sig själv oumbärlig är att skriva mysko native-kod som ingen annan förstår

https://www.cs.utah.edu/%7Eelb/folklore/mel.html

Liknande exempel jag nyligen läste för första gången

Permalänk
Medlem

I "stora" C++ projekt är udda kodstilar oftast ett väldigt marginellt problem. Jag jobbar i ett projekt med 1+ miljoner rader kod (mitt tredje i den storleksklassen) och inom projektet är kodstilen ganska likriktad. Guidelines och våra egna libbar gör att det mesta ser ungefär likadant ut.

Men jag förstår problemet, i projekt med bara en handfull utvecklare kan lite vad som helst hända, inklusive att någon tok producerar kod som är extremt svårunderhållen...

Man behöver absolut inte känna att man måste programmera på ett "objektorienterat" sätt bara för att C++ har stöd för den stilen. Det finns mycket annat att uppskatta med C++ om man kommer från C-världen. Trådskaparen nämnde t.ex. std::vector och std::string. Jag vill även tipsa om algorithm.h och lambda-uttryck.