Skip to content

Instantly share code, notes, and snippets.

@TheZoq2
Created November 9, 2015 14:35
Show Gist options
  • Save TheZoq2/265c008027f6663a08e2 to your computer and use it in GitHub Desktop.
Save TheZoq2/265c008027f6663a08e2 to your computer and use it in GitHub Desktop.
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc} %Make sure all UTF8 characters work in the document
\usepackage{listings} %Add code sections
\usepackage{color}
\usepackage{textcomp}
\definecolor{listinggray}{gray}{0.9}
\definecolor{lbcolor}{rgb}{0.9,0.9,0.9}
\lstset{
backgroundcolor=\color{lbcolor},
tabsize=4,
rulecolor=,
basicstyle=\scriptsize,
upquote=true,
aboveskip={1.5\baselineskip},
columns=fixed,
showstringspaces=false,
extendedchars=true,
breaklines=true,
prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},
frame=single,
showtabs=false,
showspaces=false,
showstringspaces=false,
identifierstyle=\ttfamily,
keywordstyle=\color[rgb]{0,0,1},
commentstyle=\color[rgb]{0.133,0.545,0.133},
stringstyle=\color[rgb]{0.627,0.126,0.941},
}
%Set page size
\usepackage{geometry}
\geometry{margin=3cm}
\usepackage{parskip} %used for \setlength \setlength{\parindent}{15pt} %Add line break after each paragraph \raggedright %Right justify text
\title{Dynamisk typning är superbra för nybörjare}
%\author{Frans Skarman}
\date{November 2015}
\begin{document}
\maketitle
\newpage
\section{Inledning}
\subsection{Bakgrund}
Vilket språk som är bäst att använda när man börjar lära sig programmering
är något som debateras ofta och många har en stark åsikt om. En skilnad mellan
språk som kan göra stor skilnad för en nybörjare är om ett språk är dynamiskt eller
statiskt typat.
Jag anser att dynamiskt typade språk i almänhet passar mycket bättre för att lära
sig programmering än starkt typade språk, dock inte nödvändigtvis på grund av typningen utan
därför att de ofta är enklare designade än starkt typade språk.
I den här rapporten kommer jag att fokusera på tre språk som ofta används som introduktionsspråk
på universitet, java, C++ och python. Python är dynamiskt typat och stödjer en mängd olika programmerings
paradigm medan java är statiskt typat och påtvingar använding av objektorientering. C++ har också stöd för många programmeringsparadigm men är väldigt nära hårdvaran jämfört med java och speciellt python.
\subsection{KÄLLDISKUTION!!!!}
\section{Huvuddel???}
\subsection{Kodkomplexitet \label{complexityHeadline}}
En stor skilnad mellan statiskt och dynamiskt typade språk som är väldigt viktig när någon ska lära sig
grunderna i programmering är hur mycket kunskap som krävs för att lösa enkla programmeringsproblem. Python
och java skiljer sig väldigt mycket i det här avseendet vilket kan ilustreras med ett exempel. En övning
en nybörjare skulle kunna göra är att skriva ett program som tar emot två tal och skriver ut produkten
av dem vilket kan se ut såhär i java respektive python.
\subsubsection{Java}
\begin{lstlisting}[language=java]
import java.io.*;
public class main
{
public static void main()
{
InputStreamReader stdin = new InputStreamReader(System.in);
BufferedReader console = new BufferedReader(stdin);
int i1 = 0,i2 = 0;
try
{
i1 = Integer.parseInt(console.readLine());
i2 = Integer.parseInt(console.readLine());
}
catch(Exception e)
{
System.exit(1);
}
System.out.println(i1 * i2);
}
}
\end{lstlisting}
\subsubsection{Python}
\begin{lstlisting}[language=python]
a = input()
b = input()
c = a * b
print(c)
\end{lstlisting}
\subsubsection{C++}
\begin{lstlisting}[language = C++]
#include <iostream>
int main()
{
int a, b, c;
std::cin >> a >> b;
c = a * b;
std::cout << c << std::endl;
}
\end{lstlisting}
Man ser snabbt att pythonkoden kräver färre rader och tecken kod för att lösa samma problem vilket kan
vara en fördel när man börjar programmera, men en mycket större skilnad är vad man behöver veta för
att förstå vad koden gör. För att helt förstå pythonkoden krävs det att man förstår tilldelningsoperatorn,
funktionsanrop, funktionsparametrar, variabler samt additionsoperatorn.
För att förstå javakoden är det betydligt fler saker man behöver förstå. Allt det som krävs i python krävs även av java men det tillkommer att man för full förståelse måste veta vad public, static class, och '. operatorn' betyder vilket kräver kunskap om objektorientering. Man måste även veta vad try-catch satsen gör och sist men inte minst måste man förstå statiskt typade variabler vilket i det här fallet inte enbart är grundläggande datatyper som int, void och String utan avancerade objekt som Stream readers och Exception objekt.
C++ koden är lite kortare och har inte fullt så många koncept som beöhver förstås eftersom att det inte kräver objektorientering men det är fortfarande en hel del extrakod runt om. För att fullständigt förstå koden behöver man förstå importering av bibliotek, main funktionen, datatyper samt input och output med dataströmmar. Man får inte heller se några funktionsanrop eftersom att cin och cout använder strömmar istället vilket kan vara både bra och dåligt\footnote{http://mcsp.wartburg.edu/zelle/python/python-first.html}.
Den dramatiskt lägre mängden "onödig" kod gör att nybörjare kan fokusera på det viktiga i programmet utan att behöva bry sig om avancerade koncept som objektorientering, imports eller funktionsanrop innan de förstår grunderna. De som lär ut språket slipper samtidigt att göra valet om man ska förklara allt som står och göra introduktionen mer svåförståelig eller om man ska säga något i stil med "bry er inte om den här koden så länge, vi tar det sen".\footnote{\label{py-cpp}http://www.openbookproject.net/pybiblio/papers/pyyhs/year01/pyyhs.html}
Effekten av den enklaren syntaxen och lägre mängden kod kan ses direkt i hur svårt det är att lära ut språket. Jeffery Elkner skriver i en rapport\footnotemark[\ref{py-cpp}] om att byta från C++ till python i en amerikansk "High scool", ungefär motsvarigheten till gymnasiet. I rapporten skriver Elkner att när han skrev om kursboken "how to think like a computer scientist" från att använda C++ till python att delen där hello world förklaras gick från 13 stycken till två. I java skulle det antagligen tagit ännu mer text för att förklara hello world då C++ kräver förhållandevis lite kod jämfört med java.
\subsection{Hög- eller lågnivå}
Som jag nämnde i inledningen är C++ ett språk som är väldigt nära hårdvaran medan java och speciellt python arbetar på en högre nivå. Java kompileras till bytecode där delar av den sedan översätts till maskinkod vid körning\footnote{https://en.wikipedia.org/wiki/Java\_virtual\_machine} medan python tolkas av en python interpretator. Detta har stora effekter på snabbheten av språken där python är överlägset långsammast av de tre språken.\footnote{https://bjpelc.wordpress.com/2015/01/10/yet-another-language-speed-test-counting-primes-c-c-java-javascript-php-python-and-ruby-2/}
Snabbheten i C++ kommer dock med en stor nackdel för nybörjare, manuell minneshantering. Python och java har båda någon from av garbage collector för att städa upp minne som inte används\footnote{https://en.wikipedia.org/wiki/Java\_\%28software\_platform\%29}\footnote{https://en.wikipedia.org/wiki/Python\_\%28programming\_language\%29} medan C++ ger programmeraren direkt åtkomst till minnet. Eftersom att garbage collectorn tar över arbetet med minneshantering från programmeraren så behöver inte en nybörjare oroa sig över den delen av programmet. Utöver det ger både python och java felmeddelanden med användbar debug output när något går fel, till exempel vid avreferens av en null-pointer medan C++ i bästa fall krashar och skriver ut "segmentation fault" eller i värsta fall, korumperar minnet på en annan plats i programmet.
En annan nackdel med den låga nivån i C++ är att de grundläggande datatyperna är ganska begränsade. I Jeffery Elkners rapport skriver han att delen i boken "how to think like a computer scientist" som handlar om strängar blev så mycket kortare när han skrev om den för python att han kunde lägga in information om olika python kontainrar i samma del av boken.
\subsection{Simpel syntax \label{simplesyntax}}
%Hitta källa på detta
Som sagt i \ref{complexityHeadline} kräver python mycket mindre kod för att lösa problem tack vare sin enkla syntax men det är inte den enda fördelen med den. Syntaxen innehåller färre specialtecken och ord och nyckelorden i språket är istället mer beskrivande. Ett exempel på detta är deklarationer och anrop som i python ser ut såhär:
\begin{lstlisting}[language=python]
#Definiera en funktion
def square(a):
return a**
#Anropa den
result = square(5);
\end{lstlisting}
och såhär i C++ och java
\begin{lstlisting}[language = C++]
//Definera en funktion
float square(float a)
{
return a * a;
}
//Anropa funktionen
float result = square(5);
\end{lstlisting}
Enligt Jeffery Elkner så har den tydligare syntaxen hjälpt studenter att lära sig skilnaden på funktions anrop och funktionsdefenition. Nyckelordet "def" visar tydligt att en funktion ska definieras vilket inte är lika tydligt i C liknande språk\footnote{http://www.openbookproject.net/pybiblio/papers/pyyhs/year01/pyyhs.html}.
En annan fördel med pythons syntax pythons simpla syntax är användningen av indentering för strukturering av kodblock istället för C-liknande språk som använder '{' och '}' vilket löser en mängd problem som nybörjare kan stöta på \footnote{http://mcsp.wartburg.edu/zelle/python/python-first.html}. Avsaknaden av start och slutmarkeringar till kodblock gör dock att vissa studenter har svårt att förstå vilka delar av koden som kommer att köras i de olika blocken\footnote{http://www.openbookproject.net/pybiblio/papers/pyyhs/year01/pyyhs.html}.
\subsection{Nackdelar \label{negatives}}
Ett vanligt argument mot användningen av python och liknande språk i undervisning är att C++ och Java är väldigt vanliga i industrin och är något man måste kunna. John M. Zelle menar i sin rapport "python as a first language" att det är bättre att lära ut ett språk där studenterna kan fokusera på generella koncept innom programmering istället för syntax och detaljer av ett mer avancerat språk. Zelle skriver att det är bättre att lära ut programdesign först och sedan lära ut detaljer och mer avancerade koncept i andra språk i efterfröjande kurser\footnote{http://mcsp.wartburg.edu/zelle/python/python-first.html}.
Att python inte används innom industrin stämmer inte heller så bra längre. Githubs statistik om användning av olika programmeringsspråk sätter python på tredje plats med JavaScript, som också är ett dynamiskt typat språ och Java på första och andra plats. C och C++ kommer långt efter på sjunde och åttonde plats. Det ska dock nämnas att C++ och C har nästan 10\% fler "pushes per repository" än python och Java som har ungefär lika många \footnote{http://githut.info/ [06/11]}. Detta betyder att python används mycket i små projekt medan C++ och C används mer i större projekt.
Fördelen med statiskt typade språk är att den statiska typningen gör att kompilatorn kan hitta typfel innan programmet körs vilket vissa hävdar
\section{Slutsatser}
Den informationen jag har hittat tycker jag tydligt visar att python är ett mycket bättre språk för nybörjare än Java eller C++ men hurvida det är tack vare den dynamiska typningen går att diskutera. Som jag skrev i \ref{complexityHeadline} så krävs det både mindre kod och mer kunskap för att skriva enkla program i java och C++ jämfört med python. I python jämfört med C++ är det på grund av typningen men i java är det på grund av påtvingandet av klasser runt all kod. Python och C++ skiljer sig inte jättemycket vid sådana enkla program och jag misstänker att med några korta förklaringar om vad int och void betyder samt var olika pranteser ska sitta så skulle en nybörjare inte ha så mycket problem med att förstå C++ versionen av exempel programmet.
C++ blir istället mycket svårare när man kommer till minneshantering och olika sätt att skicka variabler som funktionsparametrar. De kan skickas som referenser, kopior eller pekare och det är inte jättetydligt vad skilnaden är samtidigt som man kan få fel som är svåra att hitta om man gör fel. Till exempel om man returnerar en pekare till något och glömmer att rensa minnet när man är klar, eller om man indexerar sig utanför en array. I python och java slipper man problemet helt tack vare garbage collectorn.
Python har som jag skrev i \ref{simplesyntax} en mängd syntatiska fördelar jämfört med java och C++ tack vare att man slipper typdefenitioner och syntaxen är mer förklarande. En for-loop över en array i python är till exempel mycket tydligare vad den gör än en for loop med index i java och C++. Den strikta indenteringen gör koden mer lättläst vilket jag tror är bättre både för den som skriver koden och lärare som ska försöka läsa och hjälpa till med den. I gymnasiet där jag läste en introduktionskurs till programmering hade jag en kompis som skrev ett program där han hade två semikolon och tre \} på samma rad vilket inte händer i python.
\iffalse
\section{Slutsatser old}
Den informationen jag har hittat tycker jag tydligt pekar på att dynamisk typning och speciellt python som språk är det bästa sättet att lära sig programmering. Som jag skrev i \ref{negatives} så handlar inledande programmeringskurser främst om att lära ut grundläggande koncept innom programmering och i viss mån att skapa eller öka intresset för programmering. Att i en sådan kurs börja att använda ett programmeringsspråk där programmeraren måste lära sig så lite som möjligt om ett specifikt språk känns då som en väldigt bra ide. Java kräver användning av klasser redan från början vilket gör att en nybörjare antingen måste lära sig objektorientering inann hen kan skriva ett program själv. C++ och kräver inte objektorientering men det kräver istället att användaren är väldigt noga med att inte göra några fel med minneshanteringen.
Även om det inte är den statiska typningen i Java och C++ som skapar problem så är språk som arbetar på en låg nivå eller fungerar bra i storskaliga projekt även språk som använder statisk typning. Nybörjare behöver varken hög prestanda eller bra skalning utan klarar sig med språk där de kan prova olika saker i små test-projekt. Många som vill lära sig programmering, i alla fall de som börjar programmera på fritiden, börjar tack vare ett intresse av att göra sina egna spel vilket kräver ganska mycket grafik.
En sak som jag inte tycker att mina källor nämnde tydligt nog är att python och andra dynamiskt typade språk lämpar sig väldigt bra för experimentering och att snabbt skapa något fungerande program. Programmering är väldigt praktiskt och att snabbt kunna testa nya ideer och funderingar tror jag hjälper väldigt mycket när man ska lära sig programmering. Det är till exempel svårt att förstå vad man ska ha objektorientering till om man inte har skrivit något icke objektorienterat program som blivit så stort att objektorientering skulle hjälpt till med strukturen. När jag började programmera så var ett av de första riktiga "projekten" jag gjorde ett spel där jag hade fiender att skjuta på. Jag började med att inte använda en array för mina fiender utan varje fiende hade en egen variabel, enemy1, enemy2 och så vidare. Självklart insåg jag snabbt att detta inte var hållbart och jag började då leta efter något sätt att gruppera fiender och jag hittade snabbt att det kappittlet om arrayer som jag hade hoppat över i tutorialen jag läste var precis vad jag behövde. För mig som lärde mig programmering som en hobby var det ett mycket sätt att introduceras till arrayer än att läsa om något abstrakt användningsområde för dem.
\fi
\end{document}
%notes
\iffalse
%Possible sources
python edu source thingy https://www.python.org/community/sigs/current/edu-sig/
Python beginner book. http://www.greenteapress.com/thinkpython2/html/thinkpython2001.html#toc1
short paper on going java->python http://www1.chapman.edu/~radenski/research/papers/python-iticse06.pdf
Dålig benchmark källa, byt om möjligt
http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/
https://bjpelc.wordpress.com/2015/01/10/yet-another-language-speed-test-counting-primes-c-c-java-javascript-php-python-and-ruby-2/ %Possibly better, though still uknonwn author
Nämn något om att github statistiken kan vara orerperesetnativ av java pga OSS kultur.
%Counter arguments:
C++ and java are used in industry
Dynamic typing catches errors earlier https://www.ics.uci.edu/~lopes/teaching/inf212W12/readings/rdl04meijer.pdf p1
%Arguments
Python uses indentation which forces learning of propper styling
%Todo
fixa källhänvisning med ett index per
\fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment