mboost-dp1

Alting der er galt med C++


Gå til bund
Gravatar #1 - Claus Jørgensen
2. jul. 2019 07:48
https://stackoverflow.com/a/56827906/95309

Se hvor meget diskussion der er for et simpelt svar. De kan ikke engang blive enige om hvordan man finder stoerrelsen paa en fil.
Gravatar #2 - arne_v
2. jul. 2019 12:43
#1

C og C++ folket har altid været nitpickere / language lawyers.

Og C++ har en tendens til meget komplicerede løsninger.

Den SO tråd er efter min mening ikke ret praktisk anvendelig. En løsning som kræver C++ 17 support kan ikke bruges af de fleste. Og da problemet har kunnet løses med *stat funktionerne siden for evigt, så ...
Gravatar #3 - PHP-Ekspert Thoroughbreed
3. jul. 2019 08:07
Nu spørger jeg måske dumt, men er også kun novice ... Men hvad skal man så bruge i stedet for C++? Er det C#?
Gravatar #4 - CBM
3. jul. 2019 08:14
Personligt foretrækker jeg Delphi og C#... Men kunne godt fristes af Rust

på den anden side vil jeg hellere bruge ASP, c eller c++ end hhv java, visual basic, perl, ASP eller javascript

heldigvis laver jeg meget lidt web relateret, så jeg slipper i stor omfang for javascript, ASP og PHP
Gravatar #5 - arne_v
3. jul. 2019 12:43
PHP-Ekspert Thoroughbreed (3) skrev:

Nu spørger jeg måske dumt, men er også kun novice ... Men hvad skal man så bruge i stedet for C++? Er det C#?


Det er faktisk et rigtigt godt spørgsmål.

Jeg tror at svaret vil afhænge meget af applikations typen.

Mit gæt:

business application backend kode => C#, Java

platform software code => Rust, Go

fat client Windows desktop => C#

critical embedded real-time system => Ada

Gravatar #6 - arne_v
3. jul. 2019 12:46
CBM (4) skrev:

på den anden side vil jeg hellere bruge ASP, c eller c++ end hhv java, visual basic, perl, ASP eller javascript


Hmmm....
Gravatar #7 - Claus Jørgensen
3. jul. 2019 14:02
#3

Bedre spørgsmål, hvad skal man bruge C++ til :p
Gravatar #8 - arne_v
3. jul. 2019 15:01
#7

Onde tunger vil sige at man vil mestre C++ eller Ada95 eller Scala af samme grund som man vil bestige Mt Everest.

:-)
Gravatar #9 - dub
3. jul. 2019 16:44
#8 i det mindste er der ikke kø på Mt C++
Gravatar #10 - demolition
3. jul. 2019 20:27
PHP-Ekspert Thoroughbreed (3) skrev:
Nu spørger jeg måske dumt, men er også kun novice ... Men hvad skal man så bruge i stedet for C++? Er det C#?

Kommer i høj grad an på hvad du vil. Driverudvikling? Så vil jeg sige at god gammeldags C klarer ærterne. Linux er skrevet i C f.eks.

C++ har stadig sin berettigelse som en slags high-level sprog hvor man stadig kan bevare følingen med hvad der sker helt nede på low-level. Men som det kan ses, så kan det nemt stikke helt af og blive enormt kompliceret hvis man ikke passer på..
Gravatar #11 - arne_v
4. jul. 2019 01:56
#10

Jeg tror at i praksis bliver meget C++ kode skrevet i C++ p.g.a. en afhængighed af noget som bedst tilgåes fra C++.

COM, MFC, Qt, wxWidgets etc..
Gravatar #12 - Qw_freak
4. jul. 2019 08:00
arne_v (11) skrev:
#10

Jeg tror at i praksis bliver meget C++ kode skrevet i C++ p.g.a. en afhængighed af noget som bedst tilgåes fra C++.

COM, MFC, Qt, wxWidgets etc..

Mener du:
"i praksis bliver meget C++ kode skrevet i C++ p.g.a.
Gravatar #13 - CBM
4. jul. 2019 08:08
arne_v (6) skrev:
CBM (4) skrev:

på den anden side vil jeg hellere bruge ASP, c eller c++ end hhv java, visual basic, perl, ASP eller javascript


Hmmm....

på den anden side vil jeg hellere bruge PHP, c eller c++ end hhv java, visual basic, perl, ASP eller javascript
Gravatar #14 - larsp
5. jul. 2019 09:24
arne_v (5) skrev:
platform software code => Rust, Go

Jeg afprøvede kortvarigt Go på vores embedded Linux platform. Det var ekstremt nemt at cross compile, men en hello world applikation fyldte en megabyte -ish.

Nogle af vores programmer skal gerne kunne starte op hurtigt, og der har jeg altså mere tiltro til en 50 KB binary compilet fra C, end en 1 MB Go moppedreng. Dertil er hele Linux imaget kun ca. 30 MB zippet lige nu. For mig at se skal der være en god grund til at ofre det overhead for at køre Go. Vi afprøvede dog ikke Rust.

.. så vi kører C til lowlevel hardware interfacing og Python scripts til highlevel logic på platformen.

C++ kunne bestemt også have leveret varen, men vi har ikke brug for de ekstra features og kompleksiteten der følger med. C er så dejlig ligetil og man kan godt lave simpel objektorientering i C med structs og pointere efter behov.
Gravatar #15 - arne_v
5. jul. 2019 13:36
#14

Men er forskellen i størrelse p.g.a. faktisk genereret kode eller p.g.a. noget statisk linking?
Gravatar #16 - larsp
9. jul. 2019 06:08
arne_v (15) skrev:
#14

Men er forskellen i størrelse p.g.a. faktisk genereret kode eller p.g.a. noget statisk linking?

Ja, det er pga. statisk linket kode, runtime environment osv. https://stackoverflow.com/questions/28576173/reaso...

Fordelen er så at executables kan køre fuldstændig standalone uden afhængigheder.
Gravatar #17 - crashoverride
17. jul. 2019 12:53
øøøhhh Er vi ikke tilbage til det samme problem som MS havde da de skulle liste deres omsætning i Cent. ?

Jeg mener ok så du kan ikke få størrelsen i Byte men det er vel ok hvis du kan få den i KByte eller MByte Eller GByte hvis det skulle være ?

Ja det er ikke den helt nøjagtige værdie der er listet ned til 1 byte, men 720 MB er vel også ok og har man så bruge for denne i Byte skriver man den vel bare ud i ulong, har ikke kikket på koden endnu men C++ er jo Bedstefaren af Programmering sammen med Pascal og Asm, og der skal vel meget til at sige at der er noget galt med dette.

Jeg ville ihvertfald være meget forsigtig med at komme ud med sådanne en udtalelse.

Bare ses hvordan det gik ,lille kylling da han sage "Himlen falder.."
Gravatar #18 - arne_v
17. jul. 2019 13:04
crashoverride (17) skrev:

men C++ er jo Bedstefaren af Programmering sammen med Pascal og Asm, og der skal vel meget til at sige at der er noget galt med dette.


Hmmm. C++ er faktisk ret nyt.

Fortran : 1957
Lisp : 1958
Algol : 1958
Cobol : 1959
Basic : 1964
Pascal : 1970
C : 1972
Ada : 1980
C++ : 1985
Java : 1995
JavaScript : 1995
C# : 2000
Gravatar #19 - larsp
17. jul. 2019 13:56
#18 Lol. Basic er jo old gammelt. Interessant liste. Lad mig tilføje et par scriptsprog:

sh: 1971 (første Unix shell)
Perl: 1987
Bash: 1989
Python: 1990
PHP: 1995
Gravatar #20 - demolition
17. jul. 2019 18:21
Mange her kender nok også COMAL som er fra 1973 så det er næsten lige så gammelt som C. Har ikke selv prøvet det i nyere tid men har dårlige minder om det fra folkeskolen. :-)
Gravatar #21 - arne_v
17. jul. 2019 18:26
#20

Ja.

Jeg har aldrig selv haft "fornøjelsen" - jeg startede med Fortran. Men jeg mener at min søster har lært det engang.

Men så vidt jeg ved var COMAL primært en dansk ting.

Gravatar #23 - Septi
19. jul. 2019 05:15
En noget underlig diskussion, de plejer ellers at være fornuftige nok på stackoverflow. Den har faktisk har meget lidt at gøre med C eller C++, returnering af file størrelser mm. er noget der kun kan gøres af Operativsystemet, som så har en række implementeringer alt efter programmeringssprog.

Hvis man synes at C eller C++ er specielt kompliceret er det fordi man er blevet vant til at blive holdt i hånden af andre programmeringssprog som gemmer de grimme detaljer på hvor en computer rent faktisk virker. Hvis man ikke har behov for at lave high performance/effektiv kode, hardware nær udviklingen eller andre har leveret et API, så er C#, Node.JS og tilsvarende fint nok. (Java tæller jeg ikke med her, da det har udlevet sin plads i datalogien efter min mening)

Hvad angår syntax er C og C++ blandt de bedste, der er en grund til at de fleste moderne sprog læner sig kraftigt op af C og C++. Man kan naturligvis have en lang diskussion omkring objektorienteret vs functional programming mm. men det har meget lidt med sproget at gøre.

Angående sikkerhed af code lavet i C/C++ så er det jo stort set i hænderne på programmøren, hvis man benytter testede biblioteker er det det blandt de sikreste, hvis man laver alt selv uden at vide hvad man gør, så er det ikke.


Gravatar #24 - demolition
19. jul. 2019 08:13
arne_v (21) skrev:
Men så vidt jeg ved var COMAL primært en dansk ting.

COMAL er udviklet af et par danskere ja, men det er blevet brugt en del i flere andre lande også, både resten af skandinavien samt UK og US, primært til undervisningsbrug.
Gravatar #25 - larsp
19. jul. 2019 08:59
Septi (23) skrev:
Hvis man synes at C eller C++ er specielt kompliceret er det fordi man er blevet vant til at blive holdt i hånden af andre programmeringssprog som gemmer de grimme detaljer på hvor en computer rent faktisk virker.

(...)

Hvad angår syntax er C og C++ blandt de bedste, der er en grund til at de fleste moderne sprog læner sig kraftigt op af C og C++.

C++ er et UHYRE kompliceret sprog, og her tænker jeg på alle de features der er mht. objektorienteret programmering. C++ template metaprogrammering er turing complete, hvilket er bizart i sig selv og hele template showet er med til at C++ kan tage ekstremt lang tid at kompilere. C++ har faldgruber på faldgruber når det kommer til objekt orienteret design, læs f.eks. om rule of 3 og rule of 5, og C++ understøtter adskillige programmeringsparadigmer. Ja, man kan lave pæn og fornuftig C++ kode, ingen tvivl om det, og ingen tvivl om at det er et yderst potent sprog. Men man kan dælme også komme galt af sted.

C er det primitive brute force sprog der kan klare alt lowlevel, men det er altså heller ikke særlig kønt, og der er ærligtalt et par features man savner, f.eks. fuld kontrol over bytes i structs (C indsætter padding), deklarering af Little / Big endian, bedre styr på bits i felter, måder at gange f.eks. 32 x 32 bit til 64 bit resultat, uden at skulle lave en 64 x 64 bit = 64 bit operation. Den slags må man hoppe i assembler for at gøre. Og der kunne godt være lidt mere ensartethed mht. deklarationer. Se bare alle de måder man kan lave structs på f.eks.

... bare for at sige at C og C++ ikke er rosenrøde. De er gamle støvede sprog der har overlevet fordi de er så udbredte, de er ikke perfekte.
Gravatar #26 - demolition
19. jul. 2019 12:18
larsp (25) skrev:
der er ærligtalt et par features man savner, f.eks. fuld kontrol over bytes i structs (C indsætter padding)

Nu er det ganske vist compiler-specifikt, men padding er vel ret universelt understøttet gennem compiler-direktiver?
Gravatar #27 - arne_v
19. jul. 2019 14:12
Septi (23) skrev:

En noget underlig diskussion, de plejer ellers at være fornuftige nok på stackoverflow. Den har faktisk har meget lidt at gøre med C eller C++, returnering af file størrelser mm. er noget der kun kan gøres af Operativsystemet, som så har en række implementeringer alt efter programmeringssprog.


Øh.

Det har vel udelukkende med C og C++ at gøre.

Styre systemet har en måde at finde størrelsen af en fil på. Det er givet. Men det er jo ikke emnet de diskueterer.

Diskussion drejer sig om C og C++ bibliotekernes funktioner til at hente den information og den retur type de er erklæret med.

Septi (23) skrev:

Hvad angår syntax er C og C++ blandt de bedste, der er en grund til at de fleste moderne sprog læner sig kraftigt op af C og C++.


Sprog fra 1990-2005 kopierede meget C/C++ syntax.

Men idag skifter man et større eller mindre omfang til andre syntaxer.

Septi (23) skrev:

Man kan naturligvis have en lang diskussion omkring objektorienteret vs functional programming mm. men det har meget lidt med sproget at gøre.


Det har vel alt at gøre med sproget. Både OO og FP ligger mest i sproget og kun begrænset i library/runtime.

Septi (23) skrev:

Angående sikkerhed af code lavet i C/C++ så er det jo stort set i hænderne på programmøren, hvis man benytter testede biblioteker er det det blandt de sikreste, hvis man laver alt selv uden at vide hvad man gør, så er det ikke.


Der findes stadig buffer overflow fejl og andre fejl i testede biblioteker.

Arne

Gravatar #28 - arne_v
19. jul. 2019 14:33
demolition (26) skrev:

larsp (25) skrev:

der er ærligtalt et par features man savner, f.eks. fuld kontrol over bytes i structs (C indsætter padding)


Nu er det ganske vist compiler-specifikt, men padding er vel ret universelt understøttet gennem compiler-direktiver?


Det er meget normalt at kunne bestemme alignment/padding for en compilation unit via compiler switches.

Der er muligvis også C/C++ compilere som kan gøre det per type omend jeg ikke kan komme i tanke om et eksempel.

Men andre sprog har det ihvertfald.

C#

[StructLayout(LayoutKind.Explicit)]
public class Foobar
{
[FieldOffset(0)] public int A;
[FieldOffset(4)] public int A;
}

VMS Pascal

type
foobar = record
a : [POS(0)] integer;
b : [POS(32)] integer;
end;

Begge eksempler er indtastet her og utestet!!
Gravatar #29 - Claus Jørgensen
19. jul. 2019 15:24
C++ med smart pointers er vel nu ogsaa rimelig sikkert nu om dage. Men problemet er vel mere at folk skriver kode som ikke bruger C++'s sikkerheds features fordi at de vil have lidt super-duper-ekstra-performance.

Der var ogsaa rigtig mange tidligere C++ udviklere som aldrig rigtig gad laere det nye i C++11 (som f.eks. std::move). Og det er ikke ligefrem unormalt at udviklere som har arbejdet med det samme programmeringssprog i 10-20 aar ikke rigtig gider laere alt det nye. Saa det har jo absolut en paavirkning.
Gravatar #30 - arne_v
20. jul. 2019 03:12
arne_v (27) skrev:

Der findes stadig buffer overflow fejl og andre fejl i testede biblioteker.


MS har lige udgivet et research paper:

https://www.microsoft.com/en-us/research/uploads/p...
Gravatar #31 - Septi
20. jul. 2019 21:37
larsp (25) skrev:

C++ er et UHYRE kompliceret sprog, og her tænker jeg på alle de features der er mht. objektorienteret programmering. C++ template metaprogrammering er turing complete, hvilket er bizart i sig selv og hele template showet er med til at C++ kan tage ekstremt lang tid at kompilere. C++ har faldgruber på faldgruber når det kommer til objekt orienteret design, læs f.eks. om rule of 3 og rule of 5, og C++ understøtter adskillige programmeringsparadigmer. Ja, man kan lave pæn og fornuftig C++ kode, ingen tvivl om det, og ingen tvivl om at det er et yderst potent sprog. Men man kan dælme også komme galt af sted.


C++ eller C er som sprog ikke mere kompliceret end C# eller Java. Hvis du vil se et kompliceret sprog så kig på Object-C. Det er korrekt at C++ er meget stort i forhold til features og tilgængelige biblioteker. Det åbner op for du kan stort set hvad du vil, inklusive rent faktisk at udvide sprogets muligheder med templates, som næsten er en videnskab i sig selv.

Det betyder jo også, at det ikke er sproget men de benyttede biblioteker som er kompliceret, STL, er ikke nemt at overskue. Men programmøren er jo sidste ende den som beslutter sig for hvor kompliceret, han vil gøre det. Men det er lidt prisen man må betale hvis man skal lave kode hvor maksimal kontrol over eksekveringen af koden er nødvendig, og assembler er overkill.

Men jeg er enig i at de mange paradigmer som kan understøttes kan være udfordrende, da mange valg ikke er taget for dig. Det er op til udviklerne at vælge hvad der er bedst for dem. Men jo, man kan komme galt afsted, især med de mere avancerede OOP dele, man kan diskutere om OOP delen i C++ reelt ikke er mere avanceret er godt er. Men igen, ingen tvinger dig til at bruge det. i C# er mange af disse valg taget for dig, med de begrænsninger de så giver.

C er det primitive brute force sprog der kan klare alt lowlevel, men det er altså heller ikke særlig kønt, og der er ærligtalt et par features man savner, f.eks. fuld kontrol over bytes i structs (C indsætter padding), deklarering af Little / Big endian, bedre styr på bits i felter, måder at gange f.eks. 32 x 32 bit til 64 bit resultat, uden at skulle lave en 64 x 64 bit = 64 bit operation. Den slags må man hoppe i assembler for at gøre. Og der kunne godt være lidt mere ensartethed mht. deklarationer. Se bare alle de måder man kan lave structs på f.eks.

... bare for at sige at C og C++ ikke er rosenrøde. De er gamle støvede sprog der har overlevet fordi de er så udbredte, de er ikke perfekte.


Angående padding af structs er ikke et problem, du kan benytte "__attribute__((__packed__)) " til at "pakke" din struct. Little/Big Endian er system specifik, så den implementering du laver burde kunne portes til andre systemer. Men jo hvis man får data fra andre systemer direkte som benytter en anden Endian, så skal man lave det selv, men det skal man også i andre sprog. Hvis har behov hvor en bestemt optimering f.eks i forbindelse med gange eller division så skal man i assembler. Men du kan gøre det hvis du skal, inline, det er der ikke mange andre sprog der tilbyder.

Ja, C og C++ er samlet set i forhold til hvornår de er udviklet, og nej bestemt ikke perfekte, det er der nok intet der er. Men i rigtig mange tilfælde er C/C++ det bedste værktøj. Software udvikling er big business, og hvis der kom andre sprog som var bedre/hurtigere en C/C++ til hvad det gør, så ville de fleste meget hurtigt skifte.
Gravatar #32 - Septi
20. jul. 2019 21:52
arne_v (27) skrev:

Øh.

Det har vel udelukkende med C og C++ at gøre.

Styre systemet har en måde at finde størrelsen af en fil på. Det er givet. Men det er jo ikke emnet de diskueterer.

Diskussion drejer sig om C og C++ bibliotekernes funktioner til at hente den information og den retur type de er erklæret med.


Min pointe er at hvis man udvikler kompliceret kode, bør man benytte styresystemets API til at finde den type information, jo det er måske nemmere at bruge en pæn template, men du mister meget kontrol, hvilket de jo klager over.


Sprog fra 1990-2005 kopierede meget C/C++ syntax.

Men idag skifter man et større eller mindre omfang til andre syntaxer.


Hvis du kigger på de top 10 mest brugte sprog er 9/10 baseret på C Syntax, de nyeste er fra 2014. Hvorfor skulle man også ændre det, det virker. "If it ain't broken..."


Det har vel alt at gøre med sproget. Både OO og FP ligger mest i sproget og kun begrænset i library/runtime.


FP er et paradigme, har intet med sprog, biblioteker eller runtime at gøre. De biblioteker og API'er du benytter har ikke indflydelse på hvorvidt du overholde reglerne for FP i din kode. Eneste forskel er at nogen sprog kun understøtter FP, og tvinger dig til det. Jeg kan lave helt det samme kode i C/C++ som jeg kan i Scala.


Der findes stadig buffer overflow fejl og andre fejl i testede biblioteker.


Ja, helt enig, det gør der i alle sprog, systemer mm. I sidste ende er alt maskinkode på en CPU. Man kan lave alle de sanity checks man vil, men du kan aldrig vide dig sikker. Uanset sprog.
Gravatar #33 - Claus Jørgensen
20. jul. 2019 22:12
#32

Jeg vil argumentere for at uden closures så har man ikke mulighed for funktionelt programmering.

Og meget funktionelt programmering er også bygget op omkring et bestemt API set (map/reduce) som ikke findes i alle sprog. F.eks. fik C++ først std::reduce i C++17.
Gravatar #34 - arne_v
20. jul. 2019 23:08
#33

C++ fik closures i C++ 11.

Gravatar #35 - arne_v
20. jul. 2019 23:15
Septi (31) skrev:

Angående padding af structs er ikke et problem, du kan benytte "__attribute__((__packed__)) " til at "pakke" din struct.


Bemærk at det ikke er en standard feature, men en feature i visse implementationer.

Septi (31) skrev:

Little/Big Endian er system specifik, så den implementering du laver burde kunne portes til andre systemer. Men jo hvis man får data fra andre systemer direkte som benytter en anden Endian, så skal man lave det selv, men det skal man også i andre sprog.


Nej.

Både i Java og .NET får man det med.
Gravatar #36 - Claus Jørgensen
20. jul. 2019 23:17
#34

Ja, det ved jeg godt. Men argumentet var mere for andre sprog. F.eks. vil jeg ikke mene at C giver en mulighed for rigtig funktionelt programmering.
Gravatar #37 - arne_v
20. jul. 2019 23:23
Septi (32) skrev:
arne_v (27) skrev:

Øh.

Det har vel udelukkende med C og C++ at gøre.

Styre systemet har en måde at finde størrelsen af en fil på. Det er givet. Men det er jo ikke emnet de diskueterer.

Diskussion drejer sig om C og C++ bibliotekernes funktioner til at hente den information og den retur type de er erklæret med.


Min pointe er at hvis man udvikler kompliceret kode, bør man benytte styresystemets API til at finde den type information,


Stort set alle sprog kommer med den funktionalitet: Java, .NET, C, PHP, nu C++.

Så nej man bruger ikke altid OS API til det.

Nogen sætter pris på portabilitet.

Septi (32) skrev:

jo det er måske nemmere at bruge en pæn template, men du mister meget kontrol, hvilket de jo klager over.


Som jeg læser det så klager de mest over de valgte retur type. Det har ikke noget me dkontrol at gøre. Men dækker over C og C++ meget vide rammer for implementationer som gør livet hårdt for de gode udviklere i disse sprog.

Gravatar #38 - arne_v
20. jul. 2019 23:28
Septi (32) skrev:


Sprog fra 1990-2005 kopierede meget C/C++ syntax.

Men idag skifter man et større eller mindre omfang til andre syntaxer.


Hvis du kigger på de top 10 mest brugte sprog er 9/10 baseret på C Syntax, de nyeste er fra 2014. Hvorfor skulle man også ændre det, det virker. "If it ain't broken..."


Sådan ser det ud hvis man kun kigger på curly brackets.

Men går man lidt dybere ser man at ?:, switch etc. bliver erstattet eller suppleret med andre konstruktioner.

Septi (32) skrev:


Det har vel alt at gøre med sproget. Både OO og FP ligger mest i sproget og kun begrænset i library/runtime.


FP er et paradigme, har intet med sprog, biblioteker eller runtime at gøre. De biblioteker og API'er du benytter har ikke indflydelse på hvorvidt du overholde reglerne for FP i din kode. Eneste forskel er at nogen sprog kun understøtter FP, og tvinger dig til det. Jeg kan lave helt det samme kode i C/C++ som jeg kan i Scala.


Det er umuligt at lave FP i et sprog som ikke har data typer til at indeholder funktioner.

Det er meget besværligt at lave FP i et sprog som ikke har mulighed for lamda/anonyme funktioner med capture af kontekst.

Du kan i C++ er fordi C++ har FP support i sproget.

C har function pointer men mangler resten.
Gravatar #39 - arne_v
20. jul. 2019 23:32
Septi (32) skrev:


Der findes stadig buffer overflow fejl og andre fejl i testede biblioteker.


Ja, helt enig, det gør der i alle sprog, systemer mm. I sidste ende er alt maskinkode på en CPU. Man kan lave alle de sanity checks man vil, men du kan aldrig vide dig sikker. Uanset sprog.


Korrekt.

Men nogen sprog fanger fejl tidligere/nemmere end andre.

Compile time fejl er bedre end runtime fejl hvor problemet findes.

Runtime fejl hvor problemet findes er bedre end runtime fejl på et andet sted senere.

C og C++ er sprog som giver den sidste type fejl oftere end stort set alle andre sprog (assembler ikke inklusive).



Gravatar #40 - arne_v
20. jul. 2019 23:33
Claus Jørgensen (36) skrev:
#34
Ja, det ved jeg godt. Men argumentet var mere for andre sprog. F.eks. vil jeg ikke mene at C giver en mulighed for rigtig funktionelt programmering.


Det er jeg helt enig i.

#38
Gravatar #41 - Septi
21. jul. 2019 19:59
Claus Jørgensen (33) skrev:
#32

Jeg vil argumentere for at uden closures så har man ikke mulighed for funktionelt programmering.

Og meget funktionelt programmering er også bygget op omkring et bestemt API set (map/reduce) som ikke findes i alle sprog. F.eks. fik C++ først std::reduce i C++17.


Det er vigtigt ikke at blande C/C++ sammen med de standard biblioteker som er med, hvilket er system specifikt. Du kan godt lave ordentlig FP i C/C++, det er ikke nødvendigvis kønt, men det er fordi at C og C++ er meget hardware nært. Når vi snakker FP, rykker vi også meget langt væk fra hardware, og over i det meget akademiske. Uagtet findes der faktisk mange gode biblioteker som understøtter FP i C++ hvis man gerne vil det fungere faktisk rigtig godt, og er på højde med sprog som grundlæggende er FP orienteret.

Jeg kan anbefale at kigge på https://www.researchgate.net/publication/220177604...

Men igen, C/C++ er et værktøj til at løse problemer, som alt andre er. Hvis du har et problem hvor den primære udfordringer er at det skal løses med FP, vil jeg aldrig kigge på C/C++.
Gravatar #42 - Septi
21. jul. 2019 20:10
arne_v (35) skrev:

Bemærk at det ikke er en standard feature, men en feature i visse implementationer.


Alle C/C++ kompilere understøtter packed strukture, med forskellige keywords (mit eksempel var fra GCC), det er brugt utroligt meget i driver udvikling og netværks programmering. Hvordan den enkelte kompilere skal sættes op, kan variere, men er ikke nogen større udfordring.

arne_v (35) skrev:

Nej.

Både i Java og .NET får man det med.


Så må du gerne demonstreret hvordan java eller .Net kan vurdere om 4 tilfældige bytes i et word er Big eller Little Endian? før eller siden skal du fortælle systemet hvordan disse data skal fortolkes, er det et word, eller et array på 4 bytes etc. Data er i sidste ende jo bare bytes i hukommelsen, det er udvikleres (eller kompileres om) job at fortælle computere hvordan de skal fortolkes.
Gravatar #43 - Claus Jørgensen
21. jul. 2019 20:18
#41

Jeg er uenig. Standard biblioteker er vigtige. Vores arbejde som software udviklere at løse problemer effektivt og kosteffektivt. Sprog med gode standard biblioteker gør os mere effektive. Og når vi siger C++ mener vi ikke "sproget C++ og intet mere" men "sproget C++ and the standard library".

Hvis du har et problem hvor den primære udfordringer er at det skal løses med FP, vil jeg aldrig kigge på C/C++.
Jeg tror ikke rigtig du forstår hvordan FP bliver brugt i moderne sprog som C#, Swift og Javascript.

Funktionalitet som map, reduce og andre higher-order functions tillader dig at skrive kode med mindre fejl, mindre muligheder for fejl (side-effects), og imo. kode som nemmere at læse og forstå.
Gravatar #44 - Septi
21. jul. 2019 20:19
arne_v (37) skrev:


Stort set alle sprog kommer med den funktionalitet: Java, .NET, C, PHP, nu C++.

Så nej man bruger ikke altid OS API til det.

Nogen sætter pris på portabilitet.


Nej, det har disse sprog ikke, de har en standard syntax (bibliotek eller indbygget) som kalder operativsystems API på dine vegne. Det er efter min mening ikke særlig smart da et API kan ændres, eller returnere forskellige strukturer af data alt efter operativsystemet som så skal fortolkes. Det er betydeligt nemmere at kun at holde styr på om et operativ systems API ændre sig. Men det er jo smag og behag.



Gravatar #45 - Septi
21. jul. 2019 20:24
arne_v (38) skrev:

Sådan ser det ud hvis man kun kigger på curly brackets.

Men går man lidt dybere ser man at ?:, switch etc. bliver erstattet eller suppleret med andre konstruktioner.


Det kan jo blive en lang diskussion hvis man skal ned og vurder hvor meget de har lånt af C/C++. Nogle meget, andre mindre.


Det er umuligt at lave FP i et sprog som ikke har data typer til at indeholder funktioner.

Det er meget besværligt at lave FP i et sprog som ikke har mulighed for lamda/anonyme funktioner med capture af kontekst.

Du kan i C++ er fordi C++ har FP support i sproget.

C har function pointer men mangler resten.


Jeg er enig i at C er begrænset da det ikke har de udvidelsesmuligheder som der er i C++ , ihvertfald ikke i samme grad. Men de biblioteker og det research jeg har læst omkring FP i C++, er minimum på højde med sprog som er dedikeret til formålet.
Gravatar #46 - Septi
21. jul. 2019 20:34
arne_v (39) skrev:

Korrekt.

Men nogen sprog fanger fejl tidligere/nemmere end andre.

Compile time fejl er bedre end runtime fejl hvor problemet findes.

Runtime fejl hvor problemet findes er bedre end runtime fejl på et andet sted senere.

C og C++ er sprog som giver den sidste type fejl oftere end stort set alle andre sprog (assembler ikke inklusive).


Det lyder mere som du diskutere managed vs. unmanaged kode? Enig i at det er bedre at "Fail Fast". Men i alle unmanaged sprog sidder du med de samme udfordringer, blandt unmanaged sprog er C/C++ klart det bedste.
Gravatar #47 - Septi
21. jul. 2019 21:45
Claus Jørgensen (43) skrev:
#41

Jeg er uenig. Standard biblioteker er vigtige. Vores arbejde som software udviklere at løse problemer effektivt og kosteffektivt. Sprog med gode standard biblioteker gør os mere effektive. Og når vi siger C++ mener vi ikke "sproget C++ og intet mere" men "sproget C++ and the standard library".

Hvis du har et problem hvor den primære udfordringer er at det skal løses med FP, vil jeg aldrig kigge på C/C++.
Jeg tror ikke rigtig du forstår hvordan FP bliver brugt i moderne sprog som C#, Swift og Javascript.

Funktionalitet som map, reduce og andre higher-order functions tillader dig at skrive kode med mindre fejl, mindre muligheder for fejl (side-effects), og imo. kode som nemmere at læse og forstå.


Helt enig angående C++ og STL. Jeg burde have formuleret mig mere klart, og blot skrevet biblioteker som kan benyttes med C++. Jeg mente ikke standard biblioteker som i STL.

Angående FP, så er jeg fuldt på højde med paradigmet går ud på, blandt andet er der ingen af de sprog du nævner som tvinger "Pure Functional programming". Jeg mener det er et paradigme fordi det intet har med den måde en CPU virker på.

Jo, det kan være super elegant, men det er ikke en universel løsning på alle problemer vi har i softwareudvikling, så langt fra. Ja det har mange fordele som du blandt andet nævner, samt parallelisering af kode, da du har frakoblet data fra kode. Som så mange andre udviklings paradigmer har det helt klart sine fordele og ulemper.

Men hverken Scala, Haskell eller andre FP sprog gør noget magiske, andet end at holde dig inden for paradigmet. Hvis du så rent faktisk kompilere Haskell bliver det jo lige lavet til C kode først.

Igen handler det om at vælge det rigtig værktøj til jobbet, og lade vær med at stirre sig blind på kun en måde at gøre tingene på. Det kommer der sjældent noget godt ud af.

Vi kan så diskutere hvornår det bør benyttes. For mig handler det om nemt at kunne paralleliserer sin kode i forbindelse med f.eks Big Data analyse eller i forsknings brug, hvor det er kunne regne sig frem og bevise en systems tilstand er mere vigtigt en effektivitet.





Gravatar #48 - arne_v
21. jul. 2019 22:57
Septi (42) skrev:
arne_v (35) skrev:

Bemærk at det ikke er en standard feature, men en feature i visse implementationer.


Alle C/C++ kompilere understøtter packed strukture, med forskellige keywords (mit eksempel var fra GCC), det er brugt utroligt meget i driver udvikling og netværks programmering. Hvordan den enkelte kompilere skal sættes op, kan variere, men er ikke nogen større udfordring.


Det ender med et stort antal ifdef'er hvis ens kode skal bruges på flere platforme.

Septi (42) skrev:

arne_v (35) skrev:

Nej.

Både i Java og .NET får man det med.


Så må du gerne demonstreret hvordan java eller .Net kan vurdere om 4 tilfældige bytes i et word er Big eller Little Endian? før eller siden skal du fortælle systemet hvordan disse data skal fortolkes, er det et word, eller et array på 4 bytes etc. Data er i sidste ende jo bare bytes i hukommelsen, det er udvikleres (eller kompileres om) job at fortælle computere hvordan de skal fortolkes.


Spørgsmålet var ikke om man skulle vide om det er big eller little endian spørgsmålet er om man selv skal kode efter det.

Du glemte citatet af dig:

Septi (31) skrev:

Little/Big Endian er system specifik, så den implementering du laver burde kunne portes til andre systemer. Men jo hvis man får data fra andre systemer direkte som benytter en anden Endian, så skal man lave det selv, men det skal man også i andre sprog.


Fed skrift er tilføjet af mig.

Man skal selv tilføje en del kode i C og C++.

I Java sætter man bare order på sin java.nio.ByteBuffer. Det er transparent for alle metoder og fuldt portabelt.

Og så må jeg tilstå at jeg kan ikke finde den mulighed i .NET + jeg mener at jeg gar set det, men jeg kan ikek finde det, så må tager jeg fejl med det.

Gravatar #49 - arne_v
21. jul. 2019 23:03
Septi (41) skrev:
Claus Jørgensen (33) skrev:
#32
Jeg vil argumentere for at uden closures så har man ikke mulighed for funktionelt programmering.

Og meget funktionelt programmering er også bygget op omkring et bestemt API set (map/reduce) som ikke findes i alle sprog. F.eks. fik C++ først std::reduce i C++17.


Det er vigtigt ikke at blande C/C++ sammen med de standard biblioteker som er med, hvilket er system specifikt.


????

Definitionen på et standard bibliotek er at det ikke er system specifikt men defineret i sprogets standard og derfor findes på alle systemer.

C++ standarden definerer en række biblioteker som skal være der. For C++ 11 er det kapitlerne 18-30.

Gravatar #50 - arne_v
21. jul. 2019 23:13
Septi (44) skrev:
arne_v (37) skrev:


Stort set alle sprog kommer med den funktionalitet: Java, .NET, C, PHP, nu C++.

Så nej man bruger ikke altid OS API til det.

Nogen sætter pris på portabilitet.


Nej, det har disse sprog ikke, de har en standard syntax (bibliotek eller indbygget) som kalder operativsystems API på dine vegne.


Det betyder at de sprog tilbyder funktionalitet til udvikleren. Det kan i sagens natur ikke implementeres uden at kaldet noget i styresystemet.

Septi (44) skrev:

Det er efter min mening ikke særlig smart da et API kan ændres, eller returnere forskellige strukturer af data alt efter operativsystemet som så skal fortolkes. Det er betydeligt nemmere at kun at holde styr på om et operativ systems API ændre sig. Men det er jo smag og behag.


Det er rigtigt smart.

Der er hundredetusinder af eksempler på at man har porteret applikationer mellem OS.

Jeg tror at der er nul eksempler på at styresystemet har ødelagt sprog bibliotek ved at ændre API for filstørrelse.

Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login