Typer

Jag har tänkt en del på typer på sistone. Jag har kommit fram till att jag gillar dem, och att de fortfarande är på uppgång i konventionella programmeringsspråk.

Jag pratar om ord som `int` i nedanstående programsats:

    int sum = 0;

Detta bruk av ordet "typ" är bekant för användare av språk i C-familjen, inklusive Java och C#. I samband med att vi introducerar variabeln `sum` så deklarerar vi också att den ska ha en heltalstyp med en viss storlek. Om inte annat så att kompilatorn ska veta hur den ska allokera variabeln, och vilka operationer den ska tillåta.

"OK", kan läsaren tycka. "Det låter ju rätt uppenbart." Låt oss genast göra saker lite mindre självklara.

Min bakgrund är till stor del med dynamiska språk, som Perl, Python, och JavaScript. I vart och ett av de språken anger man _inte_ typen på en variabel man introducerar:

    my $sum = 0;                 # Perl
    sum = 0                           # Python
    let sum = 0;                                          // JavaScript (ES6)

Med undantag för ytliga skillnader i syntax så gör de språken exakt samma sak i det här fallet: de introducerar variabeln _utan_ att ange att dess typ ska vara `int` (eller något annat, för den delen). Det är lite det vi menar med "dynamiskt språk".



En av de stora säljpunkterna med de dynamiska språken är att man kan skriva kod utan att vara så nitisk med sina typer. Det liksom funkar i alla fall. Den resulterande känslan är luftigare och smidigare; vägen från problem A till lösning B kantas inte av typrelaterade kompileringsfel.

En van användare av C++ eller något annat statiskt typat språk kan mycket väl fråga sig hur de dynamiska språken över huvud taget kan fungera:

Hur vet kompilatorn hur mycket minne den ska allokera om den inte vet vilken typ variabeln ska ha
Vad händer om man försöker lägga en sträng i `sum` senare?
Vad händer om man försöker göra något med en `int` som man i själva verket bara kan göra med strängar, eller arrayer?

Svaret är att kompileringsprocessen mestadels håller sig utanför sådana frågor i dynamiska språk. Variabeln `sum` i sig _har_ inte någon typ. Det är bara värdet (0) som har en typ. Vilket svarar på frågan om vad som skulle hända om man lade en sträng eller något annat i `sum` senare i programmet i ett dynamiskt språk: ingenting särskilt. Det fortsätter att fungera.

På samma sätt fungerar det att inte veta vid kompilering hur mycket minne en variabel kommer att behöva. Allt det hanteras istället under körning. Resultatet blir att vi inte är helt optimala vad gäller prestanda och minnesåtgång i dynamiska språk. Men det betraktas som en acceptabel tradeoff mot att programmet är lättare att skriva och ändra.

Slutligen, om man försöker behandla värdet 0 som en sträng eller en array eller liknande: de två saker som kan hända är

1.      att värdet 0 konverteras implicit till rätt typ innan operationen utförs, eller
2.      att ett fel meddelas vid den punkten under körning.

(Vilken av dessa som händer beror på exakt vilka typer som är inblandade, samt hur tillåtande språket är.) I ingetdera fall får vi en tidig varning under kompilering; vi måste vänta tills någonting faktiskt går fel i programmet för att vi ska märka det.

Det är den här sista punkten jag har tänkt på mycket på sistone. Förespråkare för de statiskt typade språken kan omedelbart peka på detta som en form av vansinne: varför skulle man vilja få fel vid körning som man skulle kunna få vid kompilering? Varför skulle man välja att ens starta ett program som var felaktigt på det sättet? ("Skjut aldrig upp till körning vad du kan göra vid kompilering"...)

Man kan ju svara att program som skrivs i de dynamiska språken ofta är rätt småskaliga: de är inte så långa i antalet rader mätt, och de tar inte så lång tid att köra. Så alla eventuella fel man gör på vägen upptäcker man också rätt snabbt.

Även om det antagandet ofta stämmer, så tror jag att det allt oftare är fel. Idag skrivs storskaliga, ambitiösa, affärskritiska program även i dynamiska språk. Ta PHP hos Facebook som exempel. Eller JavaScript hos i princip vem som helst med frontend-kod. Det är två exempel på språk som gradvis har funnit sig i betydligt större skor än vad de ursprungligen skapades för. När saker skalar upp så blir avsaknaden av statisk typning allt mer kännbar.

Något spännande har dock hänt de senaste åren. Facebook har lanserat Hack, en statiskt typad version av PHP. Microsoft har släppt TypeScript, en statiskt typad version av JavaScript. Båda de här insatserna vinner framgång genom att *behålla* de dynamiska språken som redan har vunnit popularitet, men att i efterhand förse dem med statisk typning. Ofta kan man skriva sin kod som man brukade göra, men där man vill kan man ange en statisk typ, och då kontrolleras den vid kompilering. Det är på många sätt den bästa av två världar: ett dynamiskt språk med statiska drag.

Även Python har på sistone fått statisk typning, via PEP 484 (ett förslag om "Type Hints" i språket) och det externa verktyget `mypy`. Men känslan är lite annorlunda än Hack och TypeScript — PEP 484 är tydlig med att det _inte_ handlar om att få typfel vid kompilering, utan att det är en sorts API-dokumentation. Riktlinjer, snarare än hårda regler. I slutänden får marknaden avgöra om man vill skriva Python med eller utan typer. Jag ser fram emot att prova med, och känna hur det känns.

Jag gillar tanken på att kunna ha ett dynamiskt språk som inte är i vägen när man skriver små saker, men som också klarar av att stötta upp en med statisk typkontroll när man behöver struktur och skala.

Typer i programmering har en intressant historia. Tre till synes oberoende definitioner har flödat samman till ett enda koncept:

·    Typ som i "datatyp", precis som i `int sum` ovan: representationen av ett värde i minnet. Det bruket går tillbaka till Algol på 60-talet, och är vad de flesta idag menar med ordet. Innan kunde man se ordet "typ" användas på ett vardagligt sätt; i och med Algol börjar det betyda "representation".

·    Typ som i "algebraisk typ" eller "typalgebra": insikten att typer är värden som kan kombineras och manipuleras på olika sätt. `struct` i C är en typisk produkttyp, till exempel, men även `Tuple` i många språk. Det finns typer som `Either` och `Option` som indikerar val av olika slag. Den största påverkan den här traditionen har haft på industrin är nog dock generiska typer: om man har en `String` så kan man också bilda en `List<String>` eller en `Promise<String>`.

·    Typ som i "typteori". På tidigt 1900-tal gick matematiken igenom en kris i sina grundvalar. Bertrand Russell och andra undersökte sätt att undvika paradoxer i formella logiska system; typer blev en möjlig mekanism. Långt senare visade det sig att det finns en bro som överför alla resultat i logik till motsvarande resultat i programmering, och vice versa. Det som man hade kallat typer i matematik är precis det som man kallar typer i programmering.

Vi som industri har rätt bra koll på den första definitionen av typ. Vi får allt bättre förståelse av den andra definitionen. Den tredje har fortfarande inte börjat lämna spår i konventionella språk, men det känns som att det är i den riktningen vi rör oss.

Vi vet inte hur de kommande årtiondens programspråk kommer att se ut, men min gissning är att de kommer att utnyttja statisk typning på alltmer intressanta sätt. Man får mersmak av att skriva program som gör rätt sak första gången man kör dem.







Carl Mäsak 
A developer with a fondness for dynamic languages, evolutionary design, and meaningful unit testing. Likes to heal ailing legacy applications. Designs and implements programming languages in his spare time.


Hela Informators kursutbud inom Webbutveckling hittar du här


DDoS vs DynDNS : the cyber attack that crippled American WEB giants

Security experts were unanimous: the Mirai botnets network had the capacity to massively disturb the majority of internet websites. Indeed, end of last week, it massively hit the DynDNS service, indirectly affecting thousands of american websites, for several hours.



DynDNS allows websites having dynamic IP addresses to only have a single URL, the company then taking care of providing the service redirecting the web user towards the right IP address.
On Friday night, the DynDNS service became victim of a harsh DDoS cyber attack from the Marai botnet network, which comprises of IoT devices such as IP security cameras and Routers/switches. Several major american players were affected, among which Netflix, Spotify, Twitter, Ebay and many others. In a nutshell, it is safe to say that all websites using DynDDS were affected, a share that was later estimated at just below 5% of the world wide web.
Mostly American web users got affected by those successive cyber attacks, even though a small share of Europeans also encountered difficulties while trying to log in to those services.
On Saturday, DynDNS published a blog post explaining the attack, and mentioning that the situation was now under control. Nevertheless, last Friday’s attack was very significant in terms of sophistication and complexity, not to mention the financial aspect of things. Indeed, Giants such as Paypal or Ebay are likely to have lost quite an amount of business during the downtime. Numbers are still to be communicated, if ever.



Do you feel the power?
No later than last Thursday, our trainer Erno Jeges was giving a presentation on secure coding. As part of our introduction, we spoke about the current situation with Botnets. While exchanging with some of the attendees, Erno mentioned how quickly a hacker, somewhere in the world, could assemble a “team” of 5,000 botnets. He then asked the audience : “Do you feel the power?”.
Well, now, you know the power.
Last October, a study revealed Mirai had around 213.000 infected machines. A few days ago, another study revealed that Mirai has over 500.000 infected machines.
So, again… Do you feel the power?

What now?
Well, friends, the situation is dark. Due to the nature of the vulnerability (default credentials that the users might not always be able to change), more attacks can be expected in the following weeks since this whole mess  will not be fixed by applying a single patch. In order for this to stop, the botnet network has to be stopped, somehow.
This not all, however. Hackers started to sell access to a huge army of hacked IoT devices, so as to launch attacks capable of disrupting web connections. More information can be found here.

“It takes less time to do a thing right, than it does to explain why you did it wrong.” - Henry Wadsworth Longfellow

/Gauthier 
Gauthier has been active in the IT field for over 10 years. Currently working for Scademy Ltd, He oversees global Sales and Marketing.
Informator har lång erfarenhet av utbildning inom olika inriktningar och systemutvecklingsspråk. Tillsammans med vår partner Secure Coding Academy presenterar vi det antagligen mest heltäckande kursutbudet när det kommer till att skriva säker kod. 




Shakespeare och Linux

I går var det premiär för 3-dagars kursen Linux Systems Programming. Det är en kolossalt roligt kurs att både utveckla och undervisa i, samt mina elever verkar ha väldigt kul de med.

Kursen handlar om allt man behöver veta för att programmera på systemnivå i Linux/Unix. Såsom en förståelse for hur en applikations process är organiserad i olika minnes segment, hur det i detalj går till när en funktion anropas och returnerar, hur man gör sk longjmp.

I dag har vi pratat om signaler och process hantering, dvs exakt hur går det till bakom kulisserna när en ny applikation startar, sett i termer av systemanropen fork, exec, dup2, open/close, exit och mycket mer.

Det första vi gjorde i morse var dock att prata om avancerad I/O, som till exempel minnes mappade filer. Nå, vad ska man ha det till? Antag att man behöver läsa in en stoooor fil och sedan bearbeta innehållet. Det traditionella sättet är att läsa rad-för-rad och göra något. Men det blir genast mer komplicerat om man behöver göra flera bearbetningspass. Tänk om man på ett magiskt sätt kunde ha hela filen på plats direkt i minnet?

Det är detta som är minnes mappade filer. Eleverna fick börja med att ladda ned Shakespeares samlade verk från Project Gutenberg. Texten finns i ett flertal filformat. För kursen övningsuppgift använde vi text-versionen, som du kan hitta här>>. Sedan fick eleverna skriva ett C program som mappade upp filen i minnet och leta efter fraser såsom 'to be ' eller Hamlet. Så här kan det då se ut när man kör programmet:
Om du någon gång undrat över hur många gånger Shakespeare använde namnet Hamlet i sina texter, så har du nu svaret här ovanför.

I morgon fredag kommer vi prata om olika sätt för processer att kommunicera med varandra, sk IPC. Det blir allt från pipes, messages queues, shared memory till TCP sockets.

Verkar detta kul, alltså att lära sig om processer, signaler, minnes-mappade filer och en massa annat? Registrera dig då på nästa kurs-tillfälle.