Skrivet av Ingetledigtnamn:
Att jag råder folk att starta med ett annat språk än C handlar inte om att de kan råka ut för minnesläckor utan just det faktum att man måste hantera minnet explicit. Ett språk som har inbyggt stöd för listor, tupler, lätthanterade strängar och har smidiga iterationer över dessa gör att man kan fokusera på problemet man vill lösa istället för att slåss med minneshanteringen i C.
Skall man döma av de inlägg vi brukar se på detta forum är just C och C++ ofta en del av problemet för nybörjaren. De resurshanteringsproblem Yoshman nämner är saker som nybörjaren inte kommer utsättas för under de första stapplande stegen. Under den tiden behöver man ett språk som hjälper, inte ett som stjälper. I Python skapar man en lista av strängar genom att skriva ['apelsin', 'banan', 'citron']. Hur jobbigt är det i C?
Misstolka mig inte här. Visst har C sin plats här i datorvärlden och det används flitigt, men jag tror att det finns andra språk som är bättre att börja med för den som vill lära sig programmera.
Håller med. C++ är absolut inte ett språk för nybörjare.
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!