From 557e4c5ea2acdf94b1d6b786e6beab8436fd90f5 Mon Sep 17 00:00:00 2001 From: Marko Korhonen Date: Sat, 25 Apr 2020 11:09:18 +0300 Subject: [PATCH] Wrote more about rustlang --- tex/biblio.bib | 54 +++++++++++++++++++++++-------- tex/chapters/0-abbr.tex | 8 +++-- tex/chapters/1-johdanto.tex | 2 +- tex/chapters/2-kielet.tex | 61 +++++++++++++++++++++++++++++++++-- tex/chapters/4-tulokset.tex | 1 + tex/chapters/5-yhteenveto.tex | 2 ++ tex/main.tex | 2 ++ 7 files changed, 110 insertions(+), 20 deletions(-) create mode 100644 tex/chapters/4-tulokset.tex create mode 100644 tex/chapters/5-yhteenveto.tex diff --git a/tex/biblio.bib b/tex/biblio.bib index 5f7210c..5171bb7 100644 --- a/tex/biblio.bib +++ b/tex/biblio.bib @@ -1,17 +1,45 @@ @article{medium:javascript, - title = "The Top 10 Things Wrong with JavaScript", - author = "Richard Kenneth Eng", - publisher = "Medium", - year = "2016", - journal = "asd", - url = "https://medium.com/javascript-non-grata/the-top-10-things-wrong-with-javascript-58f440d6b3d8", - lastchecked = "5. Maaliskuuta, 2020" + title = {The Top 10 Things Wrong with JavaScript}, + journal = {}, + author = {Richard Kenneth Eng}, + publisher = {Medium}, + year = 2016, + url = {https://medium.com/javascript-non-grata/the-top-10-things-wrong-with-javascript-58f440d6b3d8}, + lastchecked = {5. Maaliskuuta, 2020} } -@misc{wiki:actor, - title = "Actor model --- {W}ikipedia{,} The Free Encyclopedia", - author = "{Wikipedia contributors}", - year = "2020", - url = "https://en.wikipedia.org/wiki/Actor_model", - lastchecked = "16. Huhtikuuta, 2020" +@article{wiki:actor, + title = {Actor model}, + journal = {}, + author = {Wikipedia contributors}, + year = 2020, + url = {https://en.wikipedia.org/wiki/Actor_model}, + lastchecked = {16. Huhtikuuta, 2020} +} + +@article{rust:lang, + title = {Rust-ohjelmointikielen kotisivu}, + journal = {}, + author = {Rust Team}, + year = 2020, + url = {https://www.rust-lang.org}, + lastchecked = {24. Huhtikuuta, 2020} +} + +@article{rust:ownership, + title = {What is Ownership - Rust book}, + journal = {}, + author = {Rust Team}, + year = 2020, + url = {https://doc.rust-lang.org/stable/book/ch04-01-what-is-ownership.html}, + lastchecked = {24. Huhtikuuta, 2020} +} + +@article{wiki:garbagecollection, + title = {Automaattinen roskienkeräys}, + journal = {}, + author = {Wikipedia contributors}, + year = 2020, + url = {https://fi.wikipedia.org/wiki/Automaattinen_roskienker%C3%A4ys}, + lastchecked = {24. Huhtikuuta, 2020} } diff --git a/tex/chapters/0-abbr.tex b/tex/chapters/0-abbr.tex index f8d66f6..6dab02b 100644 --- a/tex/chapters/0-abbr.tex +++ b/tex/chapters/0-abbr.tex @@ -8,24 +8,26 @@ \newacronym{orm}{ORM}{Object-relational mapping} \newacronym{json}{JSON}{JavaScript Object Notation} \newacronym{jwt}{JWT}{JSON Web Token} +\newacronym{rest}{REST}{Representational state transfer} +\newacronym{api}{API}{Application Programming Interface} % Glossary entries \newglossaryentry{Asiakaspuoli}{ name={Asiakaspuoli}, plural={asiakaspuolen}, - description={Nettiselaimessa pyörivät ohjelmointikielet, esimerkiksi JavaScript} + description={Loppukäyttäjän käyttöliittymä ohjelmaan. Sanaa käytetään usein web-kehityksessä jossa sillä viitataan nettiselaimeen} } \newglossaryentry{Palvelinpuoli}{ name={Palvelinpuoli}, plural={palvelinpuolen}, - description={Palvelimella pyörivät ohjelmointikielet, esimerkiksi PHP} + description={Ohjelman palvelimella suoritettava osa, johon asiakaspuolen ohjelmisto yhdistyy} } \newglossaryentry{ORM}{ name={ORM}, - description={Ohjelman objektien kartoittamista relaatiotietokannan tauluihin ja tietokannasta takaisin ohjelmaan} + description={Ohjelman objektien sovittamista relaatiotietokannan tauluihin ja tietokannasta takaisin ohjelmaan} } \glsaddall diff --git a/tex/chapters/1-johdanto.tex b/tex/chapters/1-johdanto.tex index 544400f..f8abff6 100644 --- a/tex/chapters/1-johdanto.tex +++ b/tex/chapters/1-johdanto.tex @@ -1,6 +1,6 @@ % Johdanto -\chapter{Johjanto} +\chapter{Johdanto} Älylaitteiden ja tietokoneiden kehityksen sekä internetin parantuneen saatavuuden seurauksena netin kautta käytettävien palveluiden kysyntä ja tarjonta ovat kasvaneet todella kovalla vauhdilla viime vuosina. Tästä johtuen koko internetin luonne on muuttunut täysin. Olemme todella kaukana 90-luvun dokumenttipohjaisesta internetistä. Nykyaikaiset nettisivut ovat täysiverisiä ohjelmia. Tämän takia myös web-ohjelmoinnissa käytettävissä teknologioissa on tapahtunut paljon muutoksia. Jotta nettisivuista saatiin pelkkien HTML-dokumenttien sijasta ohjelmia, 90-luvun puolivälissä julkaistiin PHP (palvelinpuolen kieli) ja JavaScript (asiakaspuolen kieli). Tänä päivänä näistä kahdesta JavaScript on ehdottomasti suositumpi, minkä takia keskityn tässä opinnäytetyössä sen vertailuun Rustin kanssa. diff --git a/tex/chapters/2-kielet.tex b/tex/chapters/2-kielet.tex index e3f4690..b25f1ed 100644 --- a/tex/chapters/2-kielet.tex +++ b/tex/chapters/2-kielet.tex @@ -1,11 +1,66 @@ \chapter{Kielet} \section{Rust} -Rust on Mozillan 2010 julkaisema ohjelmointikieli. Se on hyvin suorituskykyinen järjestelmätason ohjelmointikieli, muistuttaen monilta osin C ja C++ kieliä. Rustin tarkoituksena on säilyttää näiden vanhojen kielien suorituskyky, mutta kuitenkin tarjoten samalla muun muassa vahvan tyypityksen, ratkaista C-kielille tyypilliset muistinhallintaongelmat ja taatun turvallisen rinnakkaisajon. +Rust\cite{rust:lang} on Mozillan 2010 julkaisema ohjelmointikieli. Se on hyvin suorituskykyinen järjestelmätason ohjelmointikieli, muistuttaen monilta osin C ja C++ kieliä. Rustin tarkoituksena on säilyttää näiden vanhojen kielien suorituskyky, mutta kuitenkin tarjoten samalla muun muassa vahvan tyypityksen ja taatun turvallisen rinnakaisajon. Lisäksi tyypilliset C-kielien muistinhallintaongelmat on pyritty ratkaisemaan käytännöillä, jotka ovat samalla tehokkaita mutta myös helppoja käyttää ohjelmoijalle. + +\subsection{Muistinhallinta} + +Monissa korkean tason ohjelmointikielissä, esimerkiksi JavaScriptissä, on automaattinen roskienkeräys\cite{wiki:garbagecollection} (engl. garbage collector). Se on prosessi, joka siivoaa muistista käyttämättömiä tietoja ja näin ollen vapauttaa muistia. Automaattisen roskienkeräyksen ongelma on, että se itsessään käyttää järjestelmän resursseja, ja roskienkeruu on hidasta. + +Automaattiselle roskienkeruulle on aikaisemmin ollut vaihtoehtona vain manuaalinen muistinhallinta, missä ohjelmoija varaa ja vapauttaa muistia tarpeen mukaan. Tämä on taas verratuna automaattiseen roskien keruuseen melko työlästä ja virheherkkää. + +Rustin yhtenä pääominaisuutena on mainostettu sen uudenlaista näkökulmaa muistinhallintaan: omistajuutta\cite{rust:ownership}. Siinä jokaisella arvolla on omistaja, ja kun omistaja menee näkyvyysalueen ulkopuolelle, niin menevät myös sen omistamat arvotkin, eli ne vapautetaan muistista. Arvojen omistajuutta voi myös siirtää joko väliaikaisesti lainaamalla tai pysyvästi. Otetaan esimerkkinä seuraava yksinkertainen koodi: +\clearpage + +\begin{minted}{Rust} +fn say_hello(name: String) { + println!("Hello {}!", name); +} + +fn main() { + let name = String::from("Marko"); + say_hello(name); + + println!("{}", name); +} +\end{minted} + +Rivillä 9 tapahtuva ''name'' -arvon tulostus ei toimi, koska arvon omistajuus on siirretty funktiolle ''say\char`_hello''. Funktion suorittamisen jälkeen se poistuu näkyvyysalueelta ja kaikki sen omistamat arvot vapautetaan muistista. Näin ollen arvoa ''name'' ei ole enää olemassa kun sitä yritetään käyttää rivillä 9. Koodi saadaan toimimaan pienellä muutoksella: + +\begin{minted}{Rust} +fn say_hello(name: &String) { + println!("Hello {}!", name); +} + +fn main() { + let name = String::from("Marko"); + say_hello(&name); + + println!("{}", name); +} +\end{minted} + +Tässä esimerkissä omistajuuden siirtäminen on korvattu lainauksella. Lainauksessa omistajuuden siirtäminen on väliaikainen ja omistajuus palautuu arvon lainanneelle funktiolle (tässä tapauksessa main) kun arvoa lainannut funktio poistuu näkyvyysalueelta. Arvon lainaaminen tehdään käyttämällä merkkiä ''\char`&''. + +\subsection{Vahva tyypitys} + + +\subsection{Muuttumaton data} +Rustissa kaikki arvot ovat oletuksena muuttumattomia (engl. immutable). Jos muuttumattoman datan sijasta tarvitsee muuttujia (engl. mutable), voi käyttää avainsanaa ''mut'', esimerkiksi \code{let mut name = "Marko"}. Myös lainaukset suoritetaan oletuksena muuttumattomasti ja muuttuvan lainauksen voi tehdä samalla avainsanalla, esimerkiksi \code{say\char`_hello(\char`&mut name)}. + +Yleinen konsensus ohjelmoinnin maailmassa on se, että kaikki arvot mitä ei tarvitse muuttaa pitäisi nimenomaan määrittää muuttumattomana. Tämä on tuttua kaikille, jotka ovat tutustuneet funktionaalisiin ohjelmointikieliin. Muuttumaton data on myös todella tärkeää rinnakkaisajossa, missä useampi prosessi suorittaa samoja funktioita ja käsittelee samoja arvoja samaan aikaan. + +\subsection{Luotettavuus} +Rustia kehitettäessä on aina ollut tavoitteena luotettavuus. Tämä tarkoittaa sitä, että ohjelman virheet huomataan jo koontivaiheessa, eikä vasta suorituksen aikana ohjelman tietyssä tilassa. Tämän mahdollistavat edellä mainitut omistajuusmalli ja vahva tyypitys. Omistajuusmalli varmistaa sen, että ohjelmoija joutuu koodia kirjoittaessaan miettimään arvojen eliniän, joka tekee muistivuodoista harvinaisia. Vahva tyypitys varmistaa taas sen, että data on kaikkialla ohjelmassa yhteensopivaa. + +Myös Rustin kokoojaan on panostettu paljon, ja virheiden sattuessa se on todella hyvä työkalu ohjelmoijalle. Se alleviivaa ongelmakohdat ja selittää lyhyesti mistä ongelma johtuu. Jossain tapauksissa kokooja jopa antaa pieniä koodin pätkiä mistä voi olla apua ongelman ratkaisemisessa. + +\subsection{Dokumentaatio ja yhteisö} +Rust on tunnettu todella laajasta dokumentaatiostaan ja vahvasta yhteisöstään. Molemmista on paljon apua varsinkin aloittejioille. + +Aloitin itsekin opiskelemaan Rustia vain hieman ennen tämän opinnäytetyön alkua ja vahvasta yhteisöstä oli monesti apua. \section{WebAssembly} WebAssembly on kehitteillä oleva asiakaspuolen ohjelmointikieli. Sitä on suunniteltu JavaScriptin seuraajaksi ja sen suurinpana etuna JavaScriptiin verrattuna on huomattavasti matalemman tason esitysmuoto, minkä ansiosta se on suorituskykyisempi. Kehittäjän ei ole tarkoitus kirjoittaa WebAssemblya suoraan, vaan käyttää työkaluja, joilla olemassa olevia ohjelmointikieliä voi koota WebAssemblyksi. Rust on tästä hyvä esimerkki, sillä WebAssembly on yksi sen kokoojan natiiveista "targeteista", samalla tavalla kuin vaikka x86-prosessorit. - -\clearpage diff --git a/tex/chapters/4-tulokset.tex b/tex/chapters/4-tulokset.tex new file mode 100644 index 0000000..c655a00 --- /dev/null +++ b/tex/chapters/4-tulokset.tex @@ -0,0 +1 @@ +\chapter{Tulokset} diff --git a/tex/chapters/5-yhteenveto.tex b/tex/chapters/5-yhteenveto.tex new file mode 100644 index 0000000..2b0a8fe --- /dev/null +++ b/tex/chapters/5-yhteenveto.tex @@ -0,0 +1,2 @@ +\chapter{Yhteenveto} +\clearpage diff --git a/tex/main.tex b/tex/main.tex index be9cfce..fd9d5b4 100644 --- a/tex/main.tex +++ b/tex/main.tex @@ -26,6 +26,8 @@ \input{chapters/1-johdanto.tex} \input{chapters/2-kielet.tex} \input{chapters/3-projekti.tex} +\input{chapters/4-tulokset.tex} +\input{chapters/5-yhteenveto.tex} %%%%%%%%%% \input{style/biblio.tex}