Permalänk
Skrivet av Yoshman:

Ska man bara hålla sig till en liten delmängd av språket är ju inte C++11 (ser C++11 som ett annat språk än "klassiska" C++, idiomatisk C++11 kan vara rätt olik klassis C++), Java eller C# (som alla har automatiskt minneshantering och betydligt bättre stränghantering än C) på något sätt sämre val än Python för nybörjare, i min mening är de bättre för nybörjare då de är statiskt typade.

Jag ser faktiskt den dynamiska typningen som en fördel för nybörjaren. Ett statiskt typat språk skulle hitta en del fel vid kompileringen, men den typiska lösningen för de programmeringsövningar man gör i nybörjarkurserna kan skrivas på 10 till 15 rader kod (utan att använda list comprehensions). I C++1[14] gör auto att man klarar sig utan de flesta av deklarationerna man var tvungen att skriva i tidigare versioner, men det blir inte riktigt lika enkla och snygga lösningar.

Permalänk
Medlem

Hijackar tråden lite med nedanstående som fråga.

Skrivet av Darkboot:

1. Hur ska man börja lära sig?

Och har någon erfarenhet av boken C Programming Language av just Dennis Ritchie?
Om inte, någon annan rekommendation?

Permalänk
Datavetare
Skrivet av Ingetledigtnamn:

Jag ser faktiskt den dynamiska typningen som en fördel för nybörjaren. Ett statiskt typat språk skulle hitta en del fel vid kompileringen, men den typiska lösningen för de programmeringsövningar man gör i nybörjarkurserna kan skrivas på 10 till 15 rader kod (utan att använda list comprehensions). I C++11[14] gör auto att man klarar sig utan de flesta av deklarationerna man var tvungen att skriva i tidigare versioner, men det blir inte riktigt lika enkla och snygga lösningar.

Om du tittar på t.ex. laboration 2 i tillämpad datalogi på KTH, på vilket sätt blir det enklare lösningar i Python än C++11 (eller Java, eller C#)? Man får tydligen använda "deque" from standardbiblioteket för att lösa uppgiften, C++ har också haft sådant sedan STL först introducerades 1994. Deluppgift 5. blir lättare med C++ då Python saknar länkad lista i standardbiblioteket.

Däremot skulle C generera fler satser i denna uppgift, svagheten i C är standardbiblioteket är väldigt avskalat (men det finns en anledning till det, C ska fungera även på extremt enkla enheter så grundspråket måste vara minimalt). Fördelen med C är att det går att lära sig hela språket, inklusive standardbibliotek, på rätt kort tid.

En sak som tidigare tog mer kod i C++ än t.ex. Python var deklaration av sekvenser med någon form av initalvärde. Med "initializer lists" som kom i C++11 kan man nu göra det men en sats

vector<string> fruit{"apelsin", "banan", "citron"};

Python

fruit = ["apelsin", "banan", "citron"]

Man behöver inte heller hålla på att explicit jobba med iteratorer i C++11 i majoriteten av fallen. Lambdauttryck gör också STL betydligt kraftfullare och closure stödet är mer flexibelt i C++11 än i andra liknande språk (programmerarens val hur lokala variabler används i ett lambda, byval/byref).

Skrivet av heny:

Hijackar tråden lite med nedanstående som fråga.
Och har någon erfarenhet av boken C Programming Language av just Dennis Ritchie?
Om inte, någon annan rekommendation?

Boken är bra, men rätt kortfattad. Om de inte gjort en större översyn på sistone så täcker den bara ANSI C från 1989. En uppdatering kom med ISO C99 (som inte innehöll jättemycket nytt) och en större uppdatering kom med ISO C11 (massor med saker kring portabel/effektiv programmering av multicoresystem).

ANSI C89 är fortfarande en fullt giltigt delmängd av C99. C11 förändrar inte heller sättet man använder språket, något C++11 gjorde (där det på vissa håll blir rätt dramatiska skillnader i hur man bör använda språket). Så skulle säga att "C Programming Language" än i dag är en av de absolut första böckerna man bör läsa om man är intresserad av C.

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:

Om du tittar på t.ex. laboration 2 i tillämpad datalogi på KTH, på vilket sätt blir det enklare lösningar i Python än C++11 (eller Java, eller C#)? Man får tydligen använda "deque" from standardbiblioteket för att lösa uppgiften, C++ har också haft sådant sedan STL först introducerades 1994. Deluppgift 5. blir lättare med C++ då Python saknar länkad lista i standardbiblioteket.

Skall man döma av vad jag sett brukar uppgifterna vara formulerade (eller tillrättalagda om du vill ha negativ klang) så att Pythons egna typer lämpar sig för lösningen. De inbyggda typerna tillsammans med den dynamiska typningen gör att man slipper en massa typdeklarationer och de blir ofta lite mer koncisa än motsvarande lösning i C++.

Beträffande uppgift 5 ovan uppfattade jag det som att det var en övning där man själv skulle skriva just en kö med en länkad lista. Är det inte lite fusk att använda sig av std::forward_list då? Gör man inte det borde väl lösningarna blir snarlika?

DD1320 är inte en "lär dig at första stegen inom programmering"-kurs utan handlar snarare om att lära sig olika datastrukturer och algoritmer. På den här nivå skulle jag inte tro att man har några större fördelar av att köra Python. Den stora nytta är i början när det finns listor, tupler och strängar utan att man behöver tänka på det.

Permalänk
Medlem
Skrivet av Yoshman:

Detta är ingen protest, men kan vara lite djävulens advokat kring Python.

Modern C++ (d.v.s. C++11 eller senare) är inte alls samma språk som tidigare C++. T.ex. så innehåller idiomatisk C++11 aldrig "delete", man har inte GC men minnesallokering är ändå automatiskt och till skillnad från t.ex. Java/C# så kan C++11 hantera alla typer av resurser på ett sätt så man inte direkt behöver tänka på att fria dem. Så om resurshantering är problemet med C så är i så fall C++11 enklare än i princip alla existerande språk. Standard C++11 har också saker som listor, tupler, lätthanterande strängar och smidig traversering av dessa.

För att svara på din fråga om hur krångligt exemplet du ger kan man först peka på ett uppenbart problem i Python: hur är

['apelsin', 'banan', 'citron']

överhuvudtaget implementerat? Är det en lista (vilket typiskt betyder att det är mest effektivt att addera/ta bort element i fronten och index-operator är ineffektiv) eller är det något annat?

Behöver man ens veta sådant? Om målet är något enkelt "throw away" program, så nej. Men om det överhuvudtaget finns en chans att det program man skriver någon gång kommer hantera väldigt stora sekvenser av data är det absolut kritiskt att förstå exakt hur data är representerat i minne. Ett enkelt litmus-test är att skapa en lista med säg 10M element och jämföra tiden det tar att hämta första, mittersta och sista elementet. Gör man det inser man att Python listor faktiskt inte är listor, de är arrayer. Något man också märker om man försöker addera ett element i början av en lista med 10M element, det är dyrt.

Så hur ser exemplet ovan ut i C, den direkta motsvarigheten är

{"apelsin", "banan", "citron"}

inte så annorlunda. Dynamisk array kan skapas via va_args och en hjälpfunktion

str_array_t *arr = make_str_array("apelsin", "banan", "citron", NULL);

Och för att fortsätta djävulsadvokatspåret: om målet är att lära sig programmera, är det då inte en fördel att man måste lära sig skriva egna sorteringsalgoritmer, egna binärträd, egna länkade listor etc? Är inte det precis vad man lär ut i grundkurserna i programmering på högskola/universitet?

Om målet bara är att lösa ett problem man för tillfället står inför, visst att göra det i ett skriptspråk som Python är säkert det snabbaste sättet. Men om målet är att lära sig programmera bör man då inte förstå byggstenar som datorprogram normal sett står på?

Notera att jag som sagt är lite kärringen mot strömmen bara för att belysa att det finns anledningar varför språk som Python kanske är helt optimalt för nybörjare. I praktiken fungerar det utmärk att använda t.ex. Python eller Ruby, går ju att låta bli att använda de inbyggda algoritmerna. Min personliga övertygelse är ändå att statiskt typade språk är bättre för nybörjare, ska man ovillkorligen köra dynamiskt typat skulle jag förslå LISP över Python (t.ex. Clojure).

Anledningen är åter hur enkelt själva språket är. "På min tid" gillade KTH LISP som första språk (man använde en variant som kallas Scheme), anledningen är att språkdefinitionen för hela Scheme kan man lära ut på en/två föreläsningar (är typ två A4 sidor text, definitionerna enbart för språket är hundratals sidor för C++/C#). Resten av kursen kan sedan dediceras till att lära sig programmera!

På BTH(civilingenjör i datorsäkerhet) läste vi C ->C++ ->algoritmer och databasstrukturer detta året som gick. Det var mitt första år och C var det första språket jag bekantade mig med ordentligt. Mycket trevligt språk :). Själv tänkte jag och försöka mig på python resterande tid av sommeren

Visa signatur

OS: MacOS/ Windows 10 Pro 64-bit MB: ASUS-Z97-A CPU: i7 4790k
NÄTAGG: EVGA SUPERNOVA G2
RAM: 32768 MiB GPU: 1070 FTW Chassi: Fractal Design R4
MBP 13" i5 | 256GB | 16GB RAM | MID 2014

Permalänk
Inaktiv

Programmeringsspråk som C#, Java och javascript är bara att rekommendera för du kommer i 9/10 fall stöta på dem. C och C++ ser du sällan om aldrig i nyutveckling förutom på hårdvarunära komponenter idag är min erfarenhet, med det beror på om du vill läsa data eller IT iofs samt om du vill vara delaktig i den öppna källkodens värld med Linux. Data sitter närmare metallen än vi som klassas som IT som sitter bortskämt och litar på kompilatorn för vi har ofta mer kraft än vi behöver i maskinerna om man inte skriver riktigt jädra dålig kod.

Inom IT så är läsbarhet och underhåll av kod många många gånger viktigare än ren prestanda. Mina professorer på Chalmers brukade säga att datorn skiter i hur din kod ser ut med hur många mellanrum eller tabbar du har, om du har camel eller snake case, om du skriver ett tecken per rad om man du har tecken som indikerar uttrycksslut för den bryter ner det till instruktioner osv till bitströmmar som genomgått många lager av effektivisering som 9/10 programmerare inte själva skulle komma ihåg eller göra så koden du skriver är i första hand till för oss människor så se till att dina kamrater och kollegor kan läsa vad metoden gör på under en halv minut. Om så inte är fallet så skriver du DÅLIG kod som ska refaktoriseras så först när du och andra kan läsa ut vad en metod gör på några få sekunder kan vi börja diskutera kodkvalité, lagom antal rader och testbarhet för funktionsverifiering. Med tiden inser man att det finns flera hundra sätt att programmera precis samma sak på och minst lika många grupperingar av programmerare som anser att hennes sätt är det rätta in terms of språk och läsbarhet.

Summering: lära sig språket C skulle jag inte prioritera över Java eller C#. Framförallt så måste du koda socialt och inte bara skriva så du själv förstår för det är HELT irrelevant för en programmerare Det tål även att nämna att dig&dat, maskinorienterad programmering och digitalteknik var kurserna på Chalmers som gav mig mest uppenbarelse om programmering när man fick skriva program i assembler som man sedan översatte till C-kod samt att man fick program skrivna i C-kod som man sedan skulle skriva om till långa sidor med assembler. Imao otroligt bra övning i att förstå varför man bör uppskatta varje abstraktionsnivå, framförallt t ex Java och C# som skämmer bort dig. Programming Paradigms är också en trevlig kurs på Chalmers sedan där du får program skrivna i språk X som du sedan ska översätta till en fyra fem andra språk. Görkul!

Permalänk
Inaktiv

Social kodning ska ha +1! Väldigt ofta när jag var handledare på Chalmers så fick jag arga mail ifrån eleverna som tyckte att hen hade en bra lösning som jag underkänt men om eleven har den inställningen när en handledare som ser DÅLIG kod dagligen säger annorlunda så visar det att eleven har fel approach precis som du skriver. Det är mycket viktigare att andra uppskattar och förstår lösningen än att den som själv skrivit den anser det är det bästa som någonsin skrivits, eller i som i detta fallet "Good enough för 3;a". Läsbarhet och att snabbt kunna resonera kring kod och dess sidoeffekter i OO-språk är tillsammans med JRebel helt ovärderligt

Skrivet av Garumental:

Programmeringsspråk som C#, Java och javascript är bara att rekommendera för du kommer i 9/10 fall stöta på dem. C och C++ ser du sällan om aldrig i nyutveckling förutom på hårdvarunära komponenter idag är min erfarenhet, med det beror på om du vill läsa data eller IT iofs samt om du vill vara delaktig i den öppna källkodens värld med Linux. Data sitter närmare metallen än vi som klassas som IT som sitter bortskämt och litar på kompilatorn för vi har ofta mer kraft än vi behöver i maskinerna om man inte skriver riktigt jädra dålig kod.

Inom IT så är läsbarhet och underhåll av kod många många gånger viktigare än ren prestanda. Mina professorer på Chalmers brukade säga att datorn skiter i hur din kod ser ut med hur många mellanrum eller tabbar du har, om du har camel eller snake case, om du skriver ett tecken per rad om man du har tecken som indikerar uttrycksslut för den bryter ner det till instruktioner osv till bitströmmar som genomgått många lager av effektivisering som 9/10 programmerare inte själva skulle komma ihåg eller göra så koden du skriver är i första hand till för oss människor så se till att dina kamrater och kollegor kan läsa vad metoden gör på under en halv minut. Om så inte är fallet så skriver du DÅLIG kod som ska refaktoriseras så först när du och andra kan läsa ut vad en metod gör på några få sekunder kan vi börja diskutera kodkvalité, lagom antal rader och testbarhet för funktionsverifiering. Med tiden inser man att det finns flera hundra sätt att programmera precis samma sak på och minst lika många grupperingar av programmerare som anser att hennes sätt är det rätta in terms of språk och läsbarhet.

Summering: lära sig språket C skulle jag inte prioritera över Java eller C#. Framförallt så måste du koda socialt och inte bara skriva så du själv förstår för det är HELT irrelevant för en programmerare Det tål även att nämna att dig&dat, maskinorienterad programmering och digitalteknik var kurserna på Chalmers som gav mig mest uppenbarelse om programmering när man fick skriva program i assembler som man sedan översatte till C-kod samt att man fick program skrivna i C-kod som man sedan skulle skriva om till långa sidor med assembler. Imao otroligt bra övning i att förstå varför man bör uppskatta varje abstraktionsnivå, framförallt t ex Java och C# som skämmer bort dig. Programming Paradigms är också en trevlig kurs på Chalmers sedan där du får program skrivna i språk X som du sedan ska översätta till en fyra fem andra språk. Görkul!

Permalänk
Datavetare

@Garumental och @Wienerschnitzel

Håller med om att man måste skriva kod med tanke på att man läser den långt oftare än den skrivs, är därför det är totalt irrelevant om något går att skriva några rader kortare i ett språk jämfört med ett annat. Det erfarenhet visar är att explicit är bättre än implicit (trots att de förra typiskt ger lite mer kod).

Håller däremot inte med om att effektivitet är irrelevant. Dels betyder mer effektiv kod idag längre batteritid på mobila enheter och färre spenderade cykler i "molnet" (där tar man ofta betalat för CPU-tid). Dels ska man alltid lösa varje givet problem med ansatsen "do the simplest thing that could possibly work" (som vissa blandar ihop med "det första de kommer på"), min erfarenhet är att enkla lösningar kommer av att programmeraren förstår problemdomänen och enkla lösningar typiskt också är bland de mest effektiva (men uppenbart att många programmerare sovit sig igenom kurserna som behandlar algoritmer och abstrakta datatyper...).

Anta att er lärare hade rätt och effektivitet är irrelevant. Förklara då alla resurser som plöjts ner i JIT för Java, varför är "effektivitet" den egenskap Apple trycker hårdast på i Swift, varför startade Google ett projekt för ett språk som effektivt hanterar "concurrent programmering" (Go), varför försöker folk lura ut hur delar av program kan köras på GPUer, etc?

Skriver man program där effektivitet är irrelevant skriver man antagligen inget mer än lite klister mellan ett gäng middle-wares. Man har då istället spenderat resurser (pengar) på att inhandla middle-wares där utvecklarna typiskt lagt signifikant tid på att göra något effektivt, varför skulle man annars använda middle-wares?

OOP är definitivt ingen silver bullet, det passar väldigt bra till simuleringar, GUI-programmering och liknande. OOP är ren katastrof ihop med parallel programming och concurrent programmering (som inte är samma sak) då metodanrop är associerade med ett implicit tillstånd (objektet) och inte självklart hur det tillståndet ska hanteras mellan trådar (OOP trycker på inkapsling av tillstånd, parallel/concurrent absolut kräver explicit kunskap om hur data representeras och potentiellt modifieras). OOP har aldrig heller resulterat i speciellt återanvändbar kod, något som Erlangs skapare gillar att påpeka

"I think the lack of reusability comes in object-oriented languages, not functional languages. Because the problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle."

Ser inte heller hur Java och C# skulle på något sätt skulle ha en signifikant högre abstraktionsnivå än C. Språk som Clojure, Haskell och Rust har definitivt en högre abstraktionsnivå, t.ex. omöjliggör språken race-conditions om man inte explicit åsidosätter det. Men lägger man till GC till C (vilket kan göras via bibliotek) så är det bara bristen på "boundary checks" och lite syntaktiskt socker (som inte alltid är en fördel, implicit vs explicit) som skiljer C från de andra.

OOP är ett sätt att strukturera sitt program, inte en egenskap i något specifikt språk. Förstår man OOP kan man använda det när det är vettigt även i C, både i form av polymorfism via arv (är lite syntaktisk lite bökigare än C++/Java/C#) och likt JavaScripts "prototype-based" polymorfism (klart enklare i C och den metod jag oftast använder).

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

@Darkboot

Om du kör huvudsakligen Windows, så tycker jag att C# är ok att börja med, eftersom det finns så automatiserade funktioner för att skapa ett fönster, lägga till text och knappar osv på en gång. Då får man snabbt resultat som syns och får lite hum om hur det fungerar.

Sen kan man rätt snabbt gå över och kika på C om man vill lära sig mer grunder och hur saker faktiskt fungerar med minne och grafikhantering osv.

Själv började jag med AMOS på Amigan och även lite Amiga-Basic, och gick senare lite kurser i C på Gymnasiet och Universitetet, samtidigt som jag körde AmigaE hemma för att kunna göra lite roligare saker som småspel och ritprogram med lite mer grafik och jag mest körde på Amigan hemma, med sitt fina PowerPC-kort och allt

Nu blir det inte mycket programmerat, men på jobbet om jag behöver något snabbt så är det enklast med C# just för att man får upp ett grafiskt gränssnitt så snabbt utan att behöva ha koll på att reservera minnen och själv jobba mot grafikkort osv.

Visa signatur

Shadows never sleep...
Specs: Ryzen 5600X, Powercolor Fighter RX 6700XT, ASUS B550-I ITX, 32GB 3600MHz DDR4, Bitfenix Phenom µ-ATX

Permalänk
Medlem
Skrivet av blackeagle:

@Darkboot

Om du kör huvudsakligen Windows, så tycker jag att C# är ok att börja med, eftersom det finns så automatiserade funktioner för att skapa ett fönster, lägga till text och knappar osv på en gång. Då får man snabbt resultat som syns och får lite hum om hur det fungerar.

Sen kan man rätt snabbt gå över och kika på C om man vill lära sig mer grunder och hur saker faktiskt fungerar med minne och grafikhantering osv.

Själv började jag med AMOS på Amigan och även lite Amiga-Basic, och gick senare lite kurser i C på Gymnasiet och Universitetet, samtidigt som jag körde AmigaE hemma för att kunna göra lite roligare saker som småspel och ritprogram med lite mer grafik och jag mest körde på Amigan hemma, med sitt fina PowerPC-kort och allt

Nu blir det inte mycket programmerat, men på jobbet om jag behöver något snabbt så är det enklast med C# just för att man får upp ett grafiskt gränssnitt så snabbt utan att behöva ha koll på att reservera minnen och själv jobba mot grafikkort osv.

Det är ju superpraktiskt med det snabba gui-skapandet i visual studio + c# när man ska göra ett litet praktiskt program.
Jag kommer väl ihåg min lycka när jag provade det första gången!
På mitt jobb brukar jag använda ibland python då det är textfiler som ska hackas upp och analyseras och konverteras på en massa sätt.
Där finns det något som heter easygui som man kan göra för att fixa väldigt enkla popuprutor, filechooser och allt sådant där. Kanske inget som passar stora program men när man gör de där småprylarna.

fleltsvaning
Visa signatur

/M

Permalänk
Inaktiv

Vet inte hur jag blev inblandad men det du skriver är självklara saker och ser inte att jag sagt mot det? Jag gav bara +1 för social kodning för många på den tidan jag gick på Chalmers satt själva i ett hörn med sin lösning livrädda för att bli anklagade för fusk när fuskvågen gick på Chalmers. Den kod man möter i systemen i fält however idag är långt klinisk och sanningen är ju att det finns många många fler mindre bra programmrare än det finns universitetskliniska och det som antagligen åsyftades i Garumentals inlägg var att om man ska prioritera så är läsbarhet något som ligger för långt ner på listan så det varken bir effektivt för människan eller maskinen men jag vet inte. Jag råkade bara ha vägarna förbi av ren slump

Skrivet av Yoshman:

@Garumental och @Wienerschnitzel

Håller med om att man måste skriva kod med tanke på att man läser den långt oftare än den skrivs, är därför det är totalt irrelevant om något går att skriva några rader kortare i ett språk jämfört med ett annat. Det erfarenhet visar är att explicit är bättre än implicit (trots att de förra typiskt ger lite mer kod).

Håller däremot inte med om att effektivitet är irrelevant. Dels betyder mer effektiv kod idag längre batteritid på mobila enheter och färre spenderade cykler i "molnet" (där tar man ofta betalat för CPU-tid). Dels ska man alltid lösa varje givet problem med ansatsen "do the simplest thing that could possibly work" (som vissa blandar ihop med "det första de kommer på"), min erfarenhet är att enkla lösningar kommer av att programmeraren förstår problemdomänen och enkla lösningar typiskt också är bland de mest effektiva (men uppenbart att många programmerare sovit sig igenom kurserna som behandlar algoritmer och abstrakta datatyper...).

Anta att er lärare hade rätt och effektivitet är irrelevant. Förklara då alla resurser som plöjts ner i JIT för Java, varför är "effektivitet" den egenskap Apple trycker hårdast på i Swift, varför startade Google ett projekt för ett språk som effektivt hanterar "concurrent programmering" (Go), varför försöker folk lura ut hur delar av program kan köras på GPUer, etc?

Skriver man program där effektivitet är irrelevant skriver man antagligen inget mer än lite klister mellan ett gäng middle-wares. Man har då istället spenderat resurser (pengar) på att inhandla middle-wares där utvecklarna typiskt lagt signifikant tid på att göra något effektivt, varför skulle man annars använda middle-wares?

OOP är definitivt ingen silver bullet, det passar väldigt bra till simuleringar, GUI-programmering och liknande. OOP är ren katastrof ihop med parallel programming och concurrent programmering (som inte är samma sak) då metodanrop är associerade med ett implicit tillstånd (objektet) och inte självklart hur det tillståndet ska hanteras mellan trådar (OOP trycker på inkapsling av tillstånd, parallel/concurrent absolut kräver explicit kunskap om hur data representeras och potentiellt modifieras). OOP har aldrig heller resulterat i speciellt återanvändbar kod, något som Erlangs skapare gillar att påpeka

"I think the lack of reusability comes in object-oriented languages, not functional languages. Because the problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle."

Ser inte heller hur Java och C# skulle på något sätt skulle ha en signifikant högre abstraktionsnivå än C. Språk som Clojure, Haskell och Rust har definitivt en högre abstraktionsnivå, t.ex. omöjliggör språken race-conditions om man inte explicit åsidosätter det. Men lägger man till GC till C (vilket kan göras via bibliotek) så är det bara bristen på "boundary checks" och lite syntaktiskt socker (som inte alltid är en fördel, implicit vs explicit) som skiljer C från de andra.

OOP är ett sätt att strukturera sitt program, inte en egenskap i något specifikt språk. Förstår man OOP kan man använda det när det är vettigt även i C, både i form av polymorfism via arv (är lite syntaktisk lite bökigare än C++/Java/C#) och likt JavaScripts "prototype-based" polymorfism (klart enklare i C och den metod jag oftast använder).

Permalänk
Medlem
Skrivet av heny:

Hijackar tråden lite med nedanstående som fråga.
Och har någon erfarenhet av boken C Programming Language av just Dennis Ritchie?
Om inte, någon annan rekommendation?

Enligt min erfarenhet så är den boken den bästa om just C programmering då den är skriven av skaparen av C själv. Men om du är total nybörjare då ska du hålla dig borta från den i början, läs gärna exempelvis andra upplagan av C Programming: A Modern Approach av K.N. King. Det är en väldigt bra bok (kort och pedagogisk bok men som ändå inte lämnar detaljer) som KTH och många universitet runt om i världen använder som grundkurs i C programmering. När man är klar med den boken så återkommer man och läser med nöje The C Programming Language av Kernighan och Ritchie

Och alla som säger att du ska undvika C som första språk, lyssna inte på dom.
Visst, om du ska hålla på med GUI och webbprogrammering då kanske C inte är bästa språket men jag tycker ändå att man ska börja med C som första språk, så man får man en liten hum om hur datorer fungerar, med minneshantering osv. Kompaktheten och kraftfullheten som C erbjuder är svårslaget.

Gott!

Visa signatur

"Early to bed and early to rise, makes a man healthy, wealthy and wise."

Permalänk
Medlem

Språk är verktyg i en verktygslåda. Vilket du vill lära dig borde vara beroende på vad du vill göra. C till exempel är ett av de viktigaste språken tillsammans med ren assembler för lågnivåprogrammering av t.ex. microcontrollers. Vill du hålla på med sånt så är det nog nästan oundvikligt att lära dig C.
Annars vad du KAN programmera med C finns det nog inga gränser på. Det blir bara mer eller mindre trubbigt

Personligen är jag inte ett stort fan, jag har arbetat en hel del med C men jag föredrar absolut en större abstraktionsnivå och mina intressen ligger definitivt på andra områden. Mina favoriter är nog Prolog och Ruby och det är för det mesta dessa som jag hoppar till i första hand om inte något annat språk är uppenbart bättre för uppgiften.

Permalänk
Avstängd

Du måste ju fundera på vilken ambitionsnivå du har liksom. Om du ska ta körkort så kan du lära dig allt om hur förbränningsmotorer, växellådor och kopplingar fungerar först eller så kan du helt enkelt lära dig att köra bil och de trafikregler som gäller. Vill du ha en djupare förståelse för vad som händer när ett program gör något eller så så kanske C (eller Assembler ) är bra men om du ser det mer pragmatiskt och vill lära dig något som du kan använda så går det mycket lättare att börja med Python, Java eller C#.

Sen är förstås inte språket det viktiga utan att du lär dig programmeringstänket men det skiljer sig förstås beroende på typ av språk, objektorienterat eller ej, osv. Vill man verkligen stånga huvudet mot väggen så kan man ju försöka med Haskell, F# eller så.

Permalänk
Medlem

@darkboot
Jag har försökt lära mig olika språk men aldrig riktigt greppat det, sen började jag med VB.net relativt nyligen och har lärt mig rätt mycket, just nu håller jag på med en krypterad chatt, viktigaste är att du själv känner att språket är kul och att du kan åstadkomma det du vill göra i språket.

I min åsikt, lyssna inte på vilket språk som är bäst, känn efter själv vad du känner är roligast.

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Inaktiv

C är ett klassiskt språk och mycket aktuellt. Helt klart värt att lära sig. Inte lika plottrigt, knöligt och överlastat som C++. Jag gillar C skarpt men avskyr C++. Här är vad Linus tycker om C++:

http://harmful.cat-v.org/software/c++/linus

Han börjar med att säga att "C++ is a horrible language." Punkt. Man kanske inte behöver läsa mer än så men han är både rolig och vass så det är kul att läsa vidare ändå.

Den klassiska boken är givetvis Ritchie men jag skulle vilja dra en lans för för Jan Skansholms bok. Jag har ett gammalt slitet ex. Vill du trots vad Linus säger ända böka runt med C++ så är "Accelerated C++" av Koenig & Moo i mitt tycke det minst dåliga sättet att skaffa sig den kunskap man verkligen har nytta av.

Permalänk
Medlem
Skrivet av anon214822:

"C++ is a horrible language."

Eller som skaparen av C++ sade.
"There are only two kinds of languages. The ones people complain about and the ones nobody uses."

Permalänk
Inaktiv
Skrivet av Apupu:

Eller som skaparen av C++ sade.
"There are only two kinds of languages. The ones people complain about and the ones nobody uses."

En annan variant på samma tema är att två miljarder flugor kan inte ha fel. Han får hitta på något bättre.

Stroustrup är ett av mina hatobjekt. Goldfarb är en annan. Samma andas barn. Skall hållas j-vligt kort.

Massor med snille. Ingen smak.

Permalänk
Medlem

Ni som säger att prestanda inte är lika viktigt idag, hur tänker ni då? Det är nu det verkligen är viktigt att skriva bra kod, och välja språk efter det. Hårdvaran utvecklas knappt längre (i jämförelse med 10 år tillbaka i tiden), hur ska man då kunna göra större och mer avancerade program om man inte strävar efter att skriva så bra och effektiv kod som möjligt?

Visa signatur
Permalänk
Inaktiv
Skrivet av Thornblom:

Ni som säger att prestanda inte är lika viktigt idag, hur tänker ni då? Det är nu det verkligen är viktigt att skriva bra kod, och välja språk efter det. Hårdvaran utvecklas knappt längre (i jämförelse med 10 år tillbaka i tiden), hur ska man då kunna göra större och mer avancerade program om man inte strävar efter att skriva så bra och effektiv kod som möjligt?

Det man tänker är att datorer är såpass snabba idag att prestanda blir mindre intressant. Dessutom finns det så mycket färdigskriven högpresterande kod man kan ta med.

I dagsläget är det i princip inga problem att göra anrop mot internet, sortera eller söka i stora mängder data, rita något på skärmen, skriva utskrifter, läsa från hårddisk och MYCKET annat. Något som var ett stort problem för bara några år sedan.

Däremot skall man ju inte heller vara vårdslös, särskilt om man är många som jobbar på mycket stora applikationer. Det är absolut inte lika viktigt som förr att utnyttja varje rad kod, men man får ändå tänka lite.

Kan jag skriva något klabbigt lite mindre effektivt men mycket enklare att förstå (genom att exempelvis cacha en sträng med ett bra namn, göra ett metodanrop, skippa duplicerad kod etc) kommer jag alltid göra det.

Permalänk
Medlem
Skrivet av anon81912:

Det man tänker är att datorer är såpass snabba idag att prestanda blir mindre intressant. Dessutom finns det så mycket färdigskriven högpresterande kod man kan ta med.

I dagsläget är det i princip inga problem att göra anrop mot internet, sortera eller söka i stora mängder data, rita något på skärmen, skriva utskrifter, läsa från hårddisk och MYCKET annat. Något som var ett stort problem för bara några år sedan.

Däremot skall man ju inte heller vara vårdslös, särskilt om man är många som jobbar på mycket stora applikationer.

Absolut. Men hur ser det ut om 5 år? Ska programutvecklingen stanna upp bara för att hårdvaruprestandan inte ökar med mer än ~5 % per år? Resurser blir större i högre takt än vad prestandan utvecklas idag.

Skrivet av anon81912:

Det är absolut inte lika viktigt som förr att utnyttja varje rad kod, men man får ändå tänka lite.

Jag tror att vi kommer se en tid där det blir mer viktigt igen.

Visa signatur
Permalänk
Inaktiv
Skrivet av Thornblom:

Absolut. Men hur ser det ut om 5 år? Ska programutvecklingen stanna upp bara för att hårdvaruprestandan inte ökar med mer än ~5 % per år?

Jag vet faktiskt inte. Jag tror och hoppas på att man kommer kliva mer åt neural network hållet och saker kommer vara fundamentalt annorlunda. I verkligheten tror jag man kommer ha snäppet effektivare kompilatorer och snabbare ramverk med mindre overhead.

Permalänk
Medlem
Skrivet av anon81912:

Jag vet faktiskt inte. Jag tror och hoppas på att man kommer kliva mer åt neural network hållet och saker kommer vara fundamentalt annorlunda. I verkligheten tror jag man kommer ha snäppet effektivare kompilatorer och snabbare ramverk med mindre overhead.

Framtiden har aldrig varit såhär intressant som den är nu, inom IT. Vi har pressat dagens teknik (läs: 1970s teknik) så pass långt att det måste utvecklas något helt nytt för att det ska hända något mer än förbättrad strömförbrukning en intjänad klockcykel. Detta är ytterst intressant och jag tror att vi som datavetare och systemutvecklare kommer att få vara med om en stor förändring inom de kommande 30 åren. Nu spårade detta ur lite, och jag känner att jag kan fortsätta snacka om sånt här in på småtimmarna, men det hör inte hemma där

Visa signatur
Permalänk

Kommandes från embedded-sidan måste jag påpeka att det programmeras fortfarande en ryslig massar prylar där prestanda är minst lika viktiga som förr (mikrovågsugnen, ABS-bromsen, trafikljuset, fönsterhissen, ja i princip vilken pryl som helst som har en liten processor i sig). Om någon säger att prestanda inte är viktigt betyder de att de har desktop-skygglapparna på. Kliver vi upp till mobiltelefonerna betyder varje onödig instruktion som utförs kortare batteritid och kort batteritid har vi alldeles för gott om.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Kommandes från embedded-sidan måste jag påpeka att det programmeras fortfarande en ryslig massar prylar där prestanda är minst lika viktiga som förr (mikrovågsugnen, ABS-bromsen, trafikljuset, fönsterhissen, ja i princip vilken pryl som helst som har en liten processor i sig). Om någon säger att prestanda inte är viktigt betyder de att de har desktop-skygglapparna på. Kliver vi upp till mobiltelefonerna betyder varje onödig instruktion som utförs kortare batteritid och kort batteritid har vi alldeles för gott om.

Jag håller med om att det finns massor av embedded och iot där prestanda kan vara mycket viktigt. Men just när det gäller mobiler verkar det inte krävas att man kör c för att prestandan ska vara tillräcklig. Java är ju väldigt välanvänt för android till exempel.

Visa signatur

/M

Permalänk
Skrivet av Marowak:

Jag håller med om att det finns massor av embedded och iot där prestanda kan vara mycket viktigt. Men just när det gäller mobiler verkar det inte krävas att man kör c för att prestandan ska vara tillräcklig. Java är ju väldigt välanvänt för android till exempel.

Jag kanske var lite otydlig.

Min kommentar var riktad enbart mot uttalanden om att prestanda är oviktigt. Jag menade inte att man måste programmera mobiltelefoner i C. Å andra sidan kan man fundera på hur effektivt Java egentligen är. Jag känner flera personer som kör en gammal GSM-telefon. Den kan inte alls lika mycket, men de behöver inte ladda den oftare än var tredje vecka.

PS. Jag tycker fortfarande inte att C är ett bra val för den som skall lära sig programmera. Väljer man ett språk med redan fungerande listor, tupler och strängar kan man fokusera på övningarna istället för att bråka med minneshanteringen i C. DS.

Permalänk
Datavetare

@Marowak: lite mer avancerade spel har typiskt sina prestandakritiska delar i C++ (C är idag rätt ovanligt i spel), även på mobilerna. I både Android och Windows Phone försökte man initialt skippa stöd för "native" utveckling, i båda fallen fick man släppa på detta (NDK introducerades i Android 1.5 och WP8 fick stöd för "native development").

WP7 visade väldigt tydligt hur viktigt C++ är för en sådan plattform, många tyckte OSet och de program som följde med WP7 (t.ex. webbläsaren) hade riktigt bra flyt. Problemet var att 3:e-partstillverkare kunde bara få motsvarande upplevelse i väldigt enkla applikationer och det visade sig att Microsoft själva skrev i princip alla sina egna program för WP7 i C++, inte "managed" C#.

En annan väldigt stor fördel för C/C++ på mobiler är att rent krasst så är detta de två enda språk du hittar som verkligen är cross-platform. Stora kodbaser som kan förväntas köras på flera OS-plattform, som t.ex. spelmotorer, är betydligt enklare att anpassa till resp. OS om de är utvecklade i C eller C++ då det idag inte finns ett större OS som saknar C++ kompilator och finns nog inget OS i någon kategori som inte har en C-kompilator.

Angående inbyggda system så kan dessa vara långt mer än de små och enkla system många initialt associerar med detta. Jobbar själv en hel del med "inbyggda system" där plattformen består av 2-4 socket Xeon E5 och massor med 10-100Gbit/s Ethernet portar. Många skulle nog kalla dessa för "servers" och linjen är nog rätt luddig, skillnaden här är att prestanda är absolut kritiskt då man har en last som måste kunna hanteras inom en viss tid (så skalning av enskilda transaktioner över flera CPU-kärnor är inte möjligt) och varje maskin måste kunna hantera en viss aggregerad last (separata transaktioner måste skala över kärnor) då det finns begränsning i hur mycket ström systemet kan dra.

Ett relativt vanligt krav är att man ska klara minst 10Gbit/s per CPU-kärna, det betyder upp till 14.4M paket per sekund eller under 200-250 klockcykler (~70µs) per paket i genomsnitt. Företag som Ericsson, Nokia, Huawei, Cisco m.fl. ställs alla inför liknade problem och inne på dessa företag hittar man massiva C-kodbaser, även nyutvecklingen sker typiskt i C. Kodbaserna räknas typiskt i tiotals miljoner rader kod, man har testat bl.a. C++ men erfarenheten är språk med mer komplicerade funktioner fungerar illa i system som är väldigt stora, med riktigt hårda prestandakrav och där väldigt många personer är involverade.

@anon81912: angående effektivitet så är min erfarenhet att det inte alls finns ett motsatsförhållande mellan enkel kod och effektiv kod. Skulle säga att oerfarna programmerare alt. erfarna programmerare med dålig domänkunskap har svårt att skriva kod som är både enkelt och effektiv, men förstår man sin domän väldigt väl så klarar man av att göra enkla (eng. simple) lösningar och steget till att även göra dessa till bland det mest effektiva lösningarna ligger i hur man modellerar/representerar data (extremt kritiskt för skalning över CPU-kärnor) och vilka algoritmer man använder.

Tittar man framåt så tvivlar jag att det blir mindre fokus på effektivitet, när företag allt mer flyttar in sina serverrum i "molnet" så får man en väldigt konkret koppling mellan effektiviteten på de program man kör och driftkostnaden då Amazon EC2, Microsoft Azure, m.fl. tar betalt efter hur mycket CPU-tid, hur mycket RAM och hur mycket lagringsutrymme man använder.

Säger däremot inte att man därmed ska skriva allt i C, t.ex. Java har sedan Java7 blivit helt fantastisk effektivt. Redan sedan 1995 pratade man om att Java (eller vad som helst som kör bytekod på en VM) i teorin kan bli lika snabbt (eller till och med snabbare) som C/C++. Tog nästan 20 år, men något gjorde man väldigt rätt i samband med Java7 för många saker är numera lika snabba i Java som i C/C++. Däremot kommer alltid språk med garbage-collector dra mer RAM (GC blir väldigt ineffektiv om VM inte får ha en hel del "slack" mellan när data slutas refereras och när den faktiskt skräpsamlas) och sakna hårda realtidsegenskaper. Så C/C++ lär knappast försvinna inom överskådlig tid.

Visa signatur

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

Permalänk
Inaktiv
Skrivet av Yoshman:

@Killbom: angående effektivitet så är min erfarenhet att det inte alls finns ett motsatsförhållande mellan enkel kod och effektiv kod.

Jag menar inte att det är motsatt. Men ibland är inte världen alltid helt perfekt. (Kanske jättestora projekt med redan skriven kod etc) Då kanske man inte har tid att lägga en vecka på att refaktorisera kod för att fixa en liten grej och därmed uppnå både prestanda och läsbarhet. I det fallet menar jag på att det kan vara bättre att välja den lite långsammare vägen och skapa strängen pathToFile istället för att göra en jättesnitsig Path.Combine(,,,,) fylld av olika LINQ uttryck etc. Särskilt om man nu får betalt för att lösa ett specifikt problem. Eller liknande, man kanske loopar över en lista två gånger istället för att bryta ner MotherOfAllForLoops metoden och ändrar på objekten efteråt (många bäckar små).

Alla arbeten hamnar ju inte om att man börjar jobba på ny kula. Det finns en hel del kod idag som finns kvar från igår (eller ännu tidigare) som människor jobbar med. Det behöver inte alls ha med oerfarenhet / okunskap att göra, det kan också ha med projektet man jobbar med, ledningen, hårdvaren eller verktygen man får använda. Visst blir det bättre om alla är proffs, men ibland byts folk ut och tiden går.

EDIT: mer text

Permalänk
Medlem

Om du vill lära dig programmera från grunden(och kanske även jobba som programmerare) skulle jag börja med C, eftersom att det är grunden till många av de nyare språken. Det är alltid lätt att börja med ett nytt språk sen när du kan grunden.

Vill du istället ganska snabbt komma igång med användbara program skulle jag använda Python, det går snabbt att lära sig och väldigt kraftfult med moduler som kan göra ditt arbete lättare.

En modul till Python är i princip en funktion en annan användare programmerat som du kan importera det finns hur många som helst.

Sammanfattning:
Ska det bli en hobby -> Python
Ska det bli en karriär -> Börja med C

Permalänk
Datavetare

@anon81912: Skulle inte använda orden "prestanda" och "LINQ" i samma mening, men förstår vad du skriver.

Tror inte riktigt vi diskuterar samma sak heller. I de flesta lägen är prestanda irrelevant (80/20-regeln), då ska man definitivt köra varianten att skapa en temporär sträng i ditt fall.

Jag menar på arkitekturnivå blir den enkla lösning väldigt ofta bland de mest effektiva. Man kanske måste använda en binärheap för att hålla reda på timeouts i stället för att bara ha dem i en lista, specifikt för C så finns väldigt många fall där man helt kan undvika allokera minne (vilket både garanterar att det inte kan gå fel p.g.a. out-of-memory, man kan inte läcka minne och det är mycket snabbare än dynamiskt minne).

Förutsätter man att alla är proffs lär projektet kantra rätt snabbt. Är just den insikten de som utvecklat riktigt stora och komplexa system gjort, där har slutsatsen blivit att enklare språk är att föredra även om det blir lite mer kod (och i praktiken är det betoning på lite, de skillnader folk hävda finns kanske stämmer på ett 10k rader program, vid >100k eller än mer programmerar man typiskt i väldigt domänspecifika APIer där det blir lika många satser i C som i C# som i Python). Jag debuggar tusen gånger hellre dålig C-kod än dålig C++ kod, i C är allt explicit vilket är ovärderligt när man ska förstå andras kod.

Vi hade (eller har fortfarande, men det vidareutvecklas inte lägre) relativt mycket Python-kod (jag var själv väldigt pådrivande i detta...), handlar om ~100k rader. Initialt fungerande det rätt bra, men med tiden (när de blev allt mer bekväm med Python) började vissa använda allt mer avancerade språkfunktioner. Att försöka förstå delar av den koden och än värre debugga skiten är idag en mardröm, har skrivit om det mesta nu i C++11 (relativt C-lik kod fast STL, closures och automatiskt minneshantering används, ingen OOP) och det är löjligt mycket snabbare, faktiskt mindre kod för tillfället (men beror nog mer på att man förstår problemdomänen bättre nu).

Här kan man vara jämföra Java med C#. Man ser ofta klagomål på allt som Java saknar, men hur många >1M rader kod projekt hittar man i C#? Java är mer lämpligt för riktigt stora projekt, inte trots att det är ett enklare språk utan just p.g.a. av detta.

Visa signatur

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