Skrivet av Ingetledigtnamn:
Även om det finns stöd för listor, tupler och strängar i C++ så är det uppenbart att de lades till i efterhand. Funktionsmässigt må de vara ekvivalenta med motsvarande funktionalitet i Python, men syntaxen är inte nybörjarvänlig. Nya användningen av auto och moderna iterationer har gjort underverk för att städa upp i template-träsket, men det kommer inte i närheten av hur smidigt det är att använda listor, tupler och strängar i Python där språk och notation designats med dem i fokus.
På din och min nivå spelar vilket (imperativt) språk vi programmerar i inte någon roll. När vi brutit ner problemet i hanterbara bitar handlar det mera om frågor i stil med "vilken syntax använder språket X för en map/dict/associative array" och sedan skriver vi så som språket kräver. Vi har ju redan löst problemet. För nybörjaren är språket i sig en del av problemet och en bökig syntax gör språket till ett större problem. Jag tror att det är lättare att lära sig programmera i ett språk som har en mindre krånglig syntax. Att Python inte är lämpat för alla uppgifter är vi helt överens om, men jag tror fortfarande att det kommer gå fortare att lära sig programmera om man väljer Python istället för C++. Vill du kalla det fördomar?
Skapa en lista med strängar i Python
# här måste jag senare komma ihåg att 'aList' är en lista med strängar
aList = ["kalle", "pelle", "olle"]
Skapa en lista med strängar i C++11
// här måste jag i.o.f.s. explicit tala om att det är en lista med strängar
// gör jag senare ett misstag så påminner kompilatorn om vad som gäller
list<string> aList{"kalle", "pelle", "olle"};
I inget av fallen behöver man bry sig om minneshantering.
Den skillnaden kan inte var relevant, vidare så kommer Python gladeligen acceptera
aList = ["kalle", "pelle", "olle", 123]
vilket i de flesta fall knappast är vad man ville medan motsvarande i C++11 kommer ge kompileringsfel som upplyser om att något inte står rätt till
list<string> aList{"kalle", "pelle", "olle", 123}; // kompileringsfel
Vid uppackning och användning av specifika tuplefält är det relativt enkelt att skjuta sig i foten genom att packa upp till en annan variabel man tänkt sig, något som igen C++11 fångar redan i kompileringssteget om de olika fälten har olika typ.
Vidare betyder statisk typning att man som nybörjare kan få långt mer hjälp från sin IDE i form av Intellisense. Refactoring kanske inte är det första man tänker på för nybörjare, men det kan också vara användbart allt eftersom nybörjaren lär sig lämplig namngivning, hur vettiga signaturer till funktioner bör se ut osv. Inget av detta går att göra riktigt tillförlitligt i dynamiskt typade språk, en av huvudanledningarna till att Microsoft lagt så mycket resurser på TypeScript är att kunna erbjuda deras typiska VisualStudio-upplevelse även för de områden där man i princip måste köra JavaScript (webb-front-end).
Kör man sina C++ (eller C#/Java/Go) program i en debugger så får man typiskt en långt mer överskådlig bild över variabler som är aktiva, tillstånd på variabler, klassinstanser och egendefinierade datatyper. Man kan enkelt köra koden rad för rad och se hur tillståndet förändras. Detta går att göra i Python, men IDE-stödet är typiskt betydligt mer yxigt.