Continue writing report

This commit is contained in:
Marko Korhonen 2020-05-03 17:20:09 +03:00
parent f36c9fef60
commit 834ed4b3e8
No known key found for this signature in database
GPG key ID: 911B85FBC6003FE5
11 changed files with 128 additions and 23 deletions

View file

@ -11,9 +11,11 @@ Automaattiselle roskienkeruulle on aikaisemmin ollut vaihtoehtona vain manuaalin
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 siirtää joko pysyvästi tai väliaikaisesti lainaamalla.
\clearpage
\begin{code}
\inputminted{Rust}{code/ownership.rs}
\captionof{listing}{Omistajuus}
\captionof{listing}{Omistajuus Rustissa}
\label{code:rust:ownership}
\end{code}
@ -87,7 +89,7 @@ Edellä mainittu tyyppi u8 on niin kutsuttu allekirjoittamaton kokonaisluku (eng
\caption{Rustin kokonaislukutyypit ja niiden vaihteluvälit}
\end{table}
Toisin kuin C- ja C++ -kielissä, Rustissa on oletuksena allekirjoittamattomien kokonaislukujen ylivuoto pois päältä. Tämä tarkoittaa sitä, että jos 8-bittisen allekirjoittamattoman kokonaisluvun (u8) arvo on esimerkiksi 256, siitä tulee 0. Rustin kääntäjä siis ei anna tällaisen tapahtua vaan kääntämisen yhteydessä tulee virheviesti:
\clearpage
\begin{code}
\inputminted{shell}{code/integer-overflow}
@ -95,6 +97,8 @@ Toisin kuin C- ja C++ -kielissä, Rustissa on oletuksena allekirjoittamattomien
\label{code:rust:integer-overflow}
\end{code}
Toisin kuin C- ja C++ -kielissä, Rustissa on oletuksena allekirjoittamattomien kokonaislukujen ylivuoto pois päältä. Tämä tarkoittaa sitä, että jos 8-bittisen allekirjoittamattoman kokonaisluvun (u8) arvo on esimerkiksi 256, siitä tulee 0. Rustin kääntäjä siis ei anna tällaisen tapahtua vaan kääntämisen yhteydessä tulee virheviesti, jonka voi nähdä koodiesimerkissä \ref{code:rust:integer-overflow}.
\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 \mintinline{Rust}{let mut name = "Marko"}. Myös lainaukset suoritetaan oletuksena muuttumattomasti ja muutettavan lainauksen voi tehdä samalla avainsanalla, esimerkiksi \mintinline{Rust}{say_hello(&mut name)}
@ -106,9 +110,7 @@ Rustia kehitettäessä on aina ollut tavoitteena luotettavuus. Tämä tarkoittaa
Myös Rustin kääntäjään on panostettu paljon, ja virheiden sattuessa se on todella hyvä työkalu ohjelmoijalle. Se alleviivaa ongelmakohdat ja selittää lyhyesti, mistä ongelma johtuu. Jossain tapauksissa kääntäjä jopa antaa pieniä koodin pätkiä mistä voi olla apua ongelman ratkaisemisessa.
\subsection{Paketinhallinta}
Rustin paketinhallinta on toteutettu Cargo-nimisellä ohjelmalla. Sitä voi käyttää koko ohjelmiston elinkaaren ajan aina projektin luomisesta sen julkaisemiseen. Cargon käsittelemiä paketteja kutsutaan laatikoiksi (eng. crate), jotka julkaistaan crates.io \cite{rust:cratesio} pakettirekisterissä. Laatikot voivat myös olla riippuvaisia toisista laatikoista.
Laatikon tiedot ja riippuvuudet määritetään Cargo.toml tiedostossa.
Rustin paketinhallinta on toteutettu Cargo-nimisellä ohjelmalla. Sitä voi käyttää koko ohjelmiston elinkaaren ajan aina projektin luomisesta sen julkaisemiseen. Cargon käsittelemiä paketteja kutsutaan laatikoiksi (eng. crate), jotka julkaistaan crates.io \cite{rust:cratesio} pakettirekisterissä. Laatikot voivat myös olla riippuvaisia toisista laatikoista. Laatikon tiedot ja riippuvuudet määritetään Cargo.toml tiedostossa.
\begin{code}
\inputminted{TOML}{code/Cargo.toml}
@ -118,27 +120,51 @@ Laatikon tiedot ja riippuvuudet määritetään Cargo.toml tiedostossa.
Cargoon on saatavilla myös useita liitännäisiä, esimerkiksi cargo-watch, joka suorittaa halutun toiminnon aina kun projektin sisällä tapahtuu muutoksia ja tässäkin projektissa käytetty cargo-web, joka helpottaa WebAssembly-ohjelmien kehittämistä.
\subsection{Makrot}
Yksi todella mielenkiintoinen ominaisuus Rustissa on makrot. Se on toiminnallisuus mikä mahdollistaa metaohjelmoinnin \cite{wiki:metaprogramming}. Metaohjelmoinnissa koodia voi generoida kääntämisen aikana, mikä on erityisen hyödyllistä esimerkiksi silloin, kun ohjelmoija tarvitsee useita toiminnalisuudeltaan samankaltaisia funktioita.
\begin{code}
\inputminted{Rust}{code/macro.rs}
\captionof{listing}{Runsassanainen laskin toteutettuna Rustin makrona}
\label{code:rust:macro}
\end{code}
Makron sisällä suluissa olevat lauseet ovat verrattavissa Rustin \mintinline{Rust}{match} -lauseeseen. Kun makron syöte vastaa jotakin näistä lauseista, hakasulkujen sisällä oleva koodi generoidaan. Makrossa käytetty \mintinline{Rust}{println!()} on myös itsessään makro, joka tulee Rustin ''std'' -kirjaston mukana.
\clearpage
\begin{code}
\inputminted{Rust}{code/println.rs}
\captionof{listing}{Rustin sisäänrakennettu println!() makro \cite{rust:println}}
\label{code:rust:println}
\end{code}
Metaohjelmointi avaa aivan uudenlaisia mahdollisuuksia sille, mitä ohjelmointikielellä voi tehdä. Makroilla voi toteuttaa vaikka kokonaisen ohjelmointikielen \cite{rust:macro-lisp}.
\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.
Aloitin itsekin opiskelemaan Rustia vain hieman ennen tämän opinnäytetyön alkua ja yhteisöstä oli monesti apua projektin aikana vastaan tulleissa ongelmissa.
\section{WebAssembly}
WebAssembly \cite{webassembly:home} on kehitteillä oleva asiakaspuolen ohjelmointikieli. Sitä on suunniteltu JavaScriptin seuraajaksi ja sen suurimpana etuna JavaScriptiin verrattuna on huomattavasti matalamman tason esitysmuoto, minkä ansiosta se on suorituskykyisempi.
Kehittäjän ei ole tarkoitus kirjoittaa WebAssemblya itse, vaan käyttää työkaluja, joilla olemassa olevia ohjelmointikieliä voi kääntää WebAssemblyksi. Rust on tästä hyvä esimerkki, sillä WebAssembly on yksi sen kääntäjän natiiveista ''targeteista'', samalla tavalla kuin vaikka x86-prosessorit.
WebAssembly on siis ensisijaisesti binääriformaatti, mutta sen voi muuntaa myös tekstiformaatiksi, jonka nimi on WebAssembly text \cite{webassembly:text}. WebAssembly text käyttää S-lauseita, joten se muistuttaa syntaxiltaan hyvin paljon Lisp-ohjelmointikieltä.
WebAssembly on siis ensisijaisesti binääriformaatti, mutta sen voi muuntaa myös tekstiformaatiksi, jonka nimi on WebAssembly text \cite{webassembly:text}. WebAssembly text käyttää S-lauseita, joten se muistuttaa syntaksiltaan hyvin paljon Lisp-ohjelmointikieltä.
\begin{code}
\inputminted{Lisp}{code/plus.wat}
\captionof{listing}{Lukujen yhteenlasku WebAssembly text -formaatissa}
\label{code:webassembly:plus}
\end{code}
\clearpage
\begin{code}
\inputminted{Lisp}{code/plus.wat}
\captionof{listing}{Lukujen yhteenlaskufunktio WebAssembly text -formaatissa}
\label{code:webassembly:plus}
\end{code}
\begin{code}
\inputminted{Rust}{code/plus.rs}
\captionof{listing}{Lukujen yhteenlasku Rustilla}
\captionof{listing}{Lukujen yhteenlaskufunktio Rustilla}
\label{code:rust:plus}
\end{code}
WebAssembly textiä käytetään esimerkiksi debuggereissa.