Sanasto

Tällä sivulta löytyy kurssin aikana käytettyä Rust- ja ohjelmistosanastoa, ja sanojen lyhyet selitykset. Osa suomenkielisistä termeistä ei ole vakituisia. Selitykset eivät ole täsmällisiä, vaan ne ovat kirjoitettu tämän kurssin näkökulmasta. Termeillä voi olla muutakin merkitystä, kuin mitä on tänne kirjoitettu.

Viikko 1

TermiSelitys
rustMozilla Foundationin kehittämä staattisesti sekä dynaamisesti tyypitetty olio-orientoitu imperatiivinen funktionaalinen ekspressiivinen korkean tason turvallinen järjestelmäohjelmointikieli.
cargoRustin kääntö- ja paketinhallintajärjestelmä. Cargo käyttää rustc kääntämään lähdekoodit.
rustupKomentorivityökalu Rustin ja Cargon asentamiselle.
rustcRustin kääntäjä.
kääntäjä (compiler)Ohjelma, joka "kääntää" lähdekoodin konekieleksi. Kääntäjä voi optimoida (esim. nopeuttaa) koodia tekemällä tiettyjä muutoksia kääntövaiheessa. Rust-kääntäjä kääntää lähdekoodin abstraktiksi syntaksipuuksi, joka jatkaa matkaa erilaisten representaatioiden kautta konekieleksi tai käännösvirheeksi. Rust-kääntäjä on kirjoitettu Rustilla ja käyttää konekielen generoinnissa LLVM-järjestelmää. Lue lisää.
konekieli (machine code)Tietokoneohjelma koostuu listasta konekielisiä käskyjä. Konekieli on binäärikäskyjä, jotka suoraan ohjaavat prosessoria. Rustia voi kääntää esim. x86_64-konekielelle, mutta myös esim. WebAssembly-tavukoodiksi.
kirjasto (library)Kirjasto on kokoelma koodia, jonka yhdistää yhteinen toiminnallisuus ja käyttötarkoitus. Kirjastot on modulaarisia ja laajennettavia, ja usein käyttävät toisia kirjastoja. Kirjastoissa ei yleensä ole main-funktiota, eikä niitä pysty suorittamaan.
ohjelma (binary)Ohjelma on kokoelma koodia, ja sisältää main-funktion, joka on suorituksen lähtöpiste. Ohjelmat yleensä sisältävät vain käyttöliittymäkoodin ja käyttävät samassa paketissa olevia kirjaston ominaisuuksia. Tietojenkäsittelytehtävän esitys joukkona tietokoneen toteutettavaksi tarkoitettuja toimenpiteitä.
ohjelmointikieli (programming language)Ohjelmien laatimiseen ja esittämiseen tarkoitettu toimikieli, joka on muunnettavissa konekielelle. Esimerkejä ohjelmoinikielistä on C, C++, Rust.
laatikko (crate)Laatikko voi olla ohjelma tai kirjasto.
paketti (package)Paketti sisältää laatikoita. Paketin voi julkaista esim crates.io-sivulle, Rustin viralliseen pakettirekesteriin. crates.io on väärin nimetty listaus paketeista (pitäis olla packages.io).
TOMLTom's Obvious Minimal Language on konfiguraatio- ja serialisointiformaatti, jota on helppo kirjoittaa toisin kuin JSON.
editio (edition)Rustin yksi pääominaisuuksista, joka mahdollistaa yhteensopivuuden rikkomisen kolmen vuoden välein, mutta ei estä vanhan koodin kääntymistä. Editio määritellään Cargo.toml-tiedostossa, ja editioita on 3: 2015 (oletus), 2018 ja 2021. Rust-kääntäjän uusin versio aina tukee vanhintakin editiota 2015. Vertaa Python-ekosysteemin hajaantumista kahteen yhteensopimattomaan versioon 2 ja 3.
avoin lähdekoodi (open source)Mahdollistaa ohjelmiston lähdekoodin kopioimisen, muokkaamisen ja levittämisen. Isot avoimen lähdekoodin projektit, kuten GNU/Linux-pohjaiset distribuutiot, usein haarautuu moneksi eri projektiksi. Ilman avoimen lähdekoodin lisenssiä vapaasti internetistä ladattava lähdekoodi ei ole avointa lähdekoodia tekijänoikeuksien nojalla. Rust-ekosysteemin työkalut ovat avointa lähdekoodia.
käyttäjänoikeus (copyleft)Käyttäjänoikeuslisenssi on rajoittavampi avoimen lähdekoodin muoto, joka varmistaa ohjelmiston kehityksen pysyvän vapaana, eli estää kehityksen siirtymisen omisteisen lisenssin alle. Esimerkki käyttäjänoikeuslisenssistä on GPL, joka vaatii saman lisenssin käyttämistä kaikissa johdannaisissa teoksissa. Rust-ekosysteemin käyttämät lisenssit Apache ja MIT eivät ole käyttäjänoikeuslisenssejä.
syntaksi (syntax)Syntaksi määrää miten symbolit, kuten avainsanat, voivat esiintyä ohjelmassa. Syntaksivirhe tapahtuu, kun kääntäjä törmää virheelliseen tai virheellisessä paikassa olevaan symboliin jäsentäessä lähdekoodia. Esimerkiksi muuttujan nimen väärinkirjoittaminen ei ole syntaksivirhe vaan semanttinen virhe.
muuttuja (variable)Yleensä kuitenkin vakio (constant)
xburgerKuuluisa ravintola Otaniemessä

Viikko 2

TermiSelitys
abstraktio (abstraction)Abstraktio jostain konseptista auttaa ihmistä käsittämään ja käsittelemään konseptia korkeammalla ajattelun tasolla. Esimerkiksi luku voi olla abstraktio tietokoneen prosessorissa olevista jännitteistä tai Option<T>-enumeraatio on abstraktio vaihtoehtoisesta arvosta. Erittäin abstrakti makro println! piilottaa koodaajalta täysin I/O operaatiot ja käyttöjärjestelmän yksityiskohdat.
funktio (function)Funktiota voi ajatella abstraktiona tietyn tyyppisen datan algoritmisestä manipuloinnista, jossa data voi olla mitä vain (kunhan tyyppi on oikea).
argumentti (argument)Argumentilla tarkoitetaan dataa joka annetaan funktiolle sitä kutsuttaessa. Esimerkiksi lausekkeessa Some(5) kutsutaan funktiota Option::Some, jolle annetaa argumentiksi 5. Ei tule sekoittaa parametriin.
parametri (parameter)Parametrit ovat funktion muuttujia, jotka saavat arvokseen funktiokutsun argumentit. Esimerkiksi funktiodeklaraatiossa fn frobnify(target: Foo) on yksi parametri target tyyppiä Foo.
metodi (method)Metodi on tiettyyn tyyppiin kiinnitetty funktio. Metodit on kätevä tapa organisoida koodia/funktioita niin että ne ovat helposti löydettävissä. Metodin kutsumisen voi tehdä .-syntaksilla tai ilman. Esimerkiksi metodikutsu cat.meow() on sama kuin Cat::meow(&cat). Metodit määritellään impl-lohkoilla.
lauseke (expression)Lauseke on osa koodia, joka on vakio, muuttuja tai jokin yhdistelmä operaatioita. Kun lauseke suoritetaan, tulokseksi saadaan arvo. Lausekkeet koostuu usein toisista lausekkeista. Esimerkiksi lauseke total.sum() / total.len() koostuu kahdesta lausekkeesta total.sum() ja total.len() jotka suoritetaan ennen jakolaskua. Rustissa myös ohjausrakenteet, kuten if, for ja loop, ovat lausekkeita ja ne tuottaa arvoja.
käsky (statement)Käskyt ovat yleensä kaikki koodinpätkät jotka loppuvat puolipisteeseen ;. Esimerkiksi let-käskyllä määritellään muuttuja ja fn-käskyllä funktio. Käskyt usein sisältävät lausekkeita. Esimerkiksi käsky cat.meow(); kutsuu cat ilmentymälle metodia meow ja unohtaa palautetun arvon.
muuttumattomuus (immutability)
ohjelmointivirhe (software bug)Ohjelmointivirhe johtuu väärillä oletuksilla kirjoitetun koodin väärästä toiminnasta. Rust-kääntäjä estää jotkin semanttiset virheet, kuten muistinhallintavirheet, mutta ei virheitä esimerkiksi kilpailutilanteissa ja bisneslogiikassa.

Viikko 3

TermiSelitys
tyyppi (type)Kaikella tiedolla on tyyppi, joka määrittelee ja rajoittaa missä muodossa tieto esiintyy. Samantyyppistä tietoa voi syöttää samalle funktiolle. Omia tyyppejä voi määritellä tekemällä tietueita tai enumeraatiotita. Vaikka kaksi tyyppiä olisivat identtisiä, niitä ei voi sekoittaa.
tietue (struct)Tietue koostuu kentistä (field), jotka sisältävät jonkin tyyppistä dataa. Tietue koostuu vain tietoa ja määrittelee mitä tyyppiä tämä tieto on. Tietue voi myös olla tuple, tällaista tietuetta kutsutaan tuple structiksi.
enumeraatio (enumeration)Enumeraatio on summatyyppi eri tyypeistä. Enumeraatio koostuu varianteista, jotka voivat sisältää eri tyyppejä. Enumeraation instanssi voi olla vain yksi variantti kerrallaan. Option on yksi tärkeimmistä enumeraatioista, jonka variantteja ovat None ja Some(T).
ilmentymä (instance)Ilmentymä on jonkin tyyppistä tietoa, joka esiintyy suorituksen aikana muistissa. Ilmentymä luodaan aina tyypin, kuten tietueen tai enumeraation mukaisesti. Esim koodissa let kana = Kana::new(), kana on ilmentymä tyypistä Kana. Rustissa kaikki ilmentymät ovat oliota, koska Rust on olioperusteinen (object-oriented) kieli.
olio (object)Olio kapseloi tiedon ja toiminnallisuuden yksityiskohdat yhtenäiseksi korkeamman tason kappaleeksi. Rustissa ei ole luokkia eikä niiden välistä periytymistä. Tyypeille voi määritellä piirteitä (trait).
piirre (trait)Eri piirteet määrittelevät erilaisen käytöksen rajapinnan. Piirteitä käytetään yhtenäistämään eri tyyppien yhteistä toiminnallisuutta. Piirteissä pystytään määrittelemään ainoastaan assosioituja funtkioita, mutta ei esimerkiksi kenttiä. Piirteet voivat periytyä toisista piirteistä, kuten luokat muissa olioperusteisissa kielissä.
kapselointi (encapsulation)Yhteen kuuluvien tietojen ja toimintojen kokoaminen yhdeksi kokonaisuudeksi. Olioperusteisessa ohjelmoinnissa olio on tieto ja toiminnnallisuus enkapsuloitu yhdeksi. Ei tee koodista turvallisempaa, mutta ilmaisee tarkoituksen selkeämmin.
moduuli (module)Moduuli mod on Rustissa kokoelma funktioita, tyyppejä, vakioita, staattisia muuttujia tai toisista moduuleista. Moduuli sisältää vain julkisia jäseniä. Moduulin jäseneihin pääsee käsiksi :: syntaksilla. Esim std::collections on moduuli (ja hyödyllinen sellainen).
tietorakenne (data structure)Tietorakenne on sovelluskohtainen tapa tallentaa ja käsitellä tietoa. Tietorakenteita ovat esimerkiksi taulukot, joukot, vektorit, listat, mapit, ja puut. Tietorakenteilla on usein tarkasti määritellyt käyttäytymisvaatimukset esim aika- ja muistikompleksisuudesta.
nimeämiskäytäntö (naming convention)Nimeämiskäytäntö määrää miten moniosaiset sanat kirjoitetaan. Eri nimeämiskäytäntöjä käytetään monissa eri konteksteissa. Rustissa muuttujat kirjoitetaan snake_casessa, tyypit PascalCasessa, vakiot SCREAMING_SNAKE_CASEssa ja laatikoiden nimet hyvin usein kebab-casessa.
tyyppipäättely (type inference)Rust-kääntäjä voi monessa tilanteessa johtamaan mikä tyyppi pitää olla missäkin. Funktion parametrien tyyppejä tai palautustyyppiä ei voi jättää pääteltäväksi. Joissain tilanteissa voi jättää osan tyypistä pois _-merkillä, esim let v: Vec<_> = hashmap.collect().
indeksi (index)Indeksi on järjestysluku esimerkiksi taulukkoon, tai sliceen. Indeksit ovat aina tyyppiä usize eli 64 bittiä modernilla prosessorilla. Myös taulukon tai slicen pituus on aina tyyppiä usize.
prosessi (process)Käyttöjärjestelmän hallitsema ajossa oleva ohjelma. Jokaisella prosessilla on käytössä oma muistialue ja resursseja joihin muut prosessit eivät pääse käsiksi. Prosessi koostuu aina yhdestä tai useasta säikeestä, jotka voivat suorittaa koodia samanaikaisesti.
omistajuus (ownership)Rustin muistinhallintaparadigma, joka varmistaa muistin käytön turvallisesti sekä vapauttaa käyttämättömät resurssit. Jokaisella arvolla on tasan yksi omistaja, ja se mitä ei omisteta ei pystytä käyttämään.
borrow checker
referenssi (reference)Rustin hallitsema osoitin lainattuun (borrowed) tietoon. Lainauksen aikana muistia ei pysty muuttamaan eikä siirtämään. Lainaus loppuu referenssin pudotessa. Referenssi voi olla muuttumaton &T tai muuttuva &mut T. Muuttuvan lainaukset poissulkevat toiset muuttuvat lainaukset sekä muuttumattomat lainaukset. Rustin borrow checker varmistaa nämä invariantit.
kehys (frame)Jokainen (suljettu) funktiokutsu työntää kutsupinoon kehyksen, joka sisältää funktion parametrit ja funktion paikalliset muuttujat. Kehys sisältää muutakin tietoa, kuten osoitteen, josta prosessori jatkaa funktion palauttaessa. Kehyksiä ei pysty määrittämään lähdekoodissa, koska se on ABIn määrittämä.
kutsupino (call stack)Jokaisella prosessilla on kutsupino, joka sisältää kehykset pinossa ajonaikana. Kutsupino luodaan säikeen käynnistyessä. Kutsupinolla on rajallinen koko, jonka takia prosessi kaatuu jos sisäkkäisiä funktiokutsuja on liian monta. Jos taulukkoon (array), joka on tallennettu kutsupinolle (eikä keolle), kirjoitetaan liian monta alkioita, voidaan saada aikaiseksi kutsupinon ylivuotovirhe, jossa "vahingossa" ylikirjoitetaan kehyksen palautusosoite. Tämä virhe on syynä monelle kriittiselle tietoturvahaavoittuvuudelle.
monadi (monad)Monadi on monoidi endofunktorien kategoriassa.

Viikko 4

TermiSelitys
vapaakokoinen (unzised)Vapaakokoinen tyyppi (piirre ?Sized) on sellainen tyyppi jonka koko (pituus bitteinä) tiedetään vasta ajonaikana. Vapaakokoista dataa ei voi säilyttää kehyksessä vaan se pitää tallentaa kekoon, esim Boxin avulla. Piirreolio (trait object) on esimerkki vapaakokoisesta tyypistä. Vec tai String eivät toisaalta ole vapaakokoisia, mutta [T] ja str ovat.
tyyppiturvallisuus (type safety)Tyyppiturvallinen ohjelmointikieli estää T tyyppisen tiedon t kopioimista/siirtämistä sellaiseen muuttujaan u (osoitteeseen muistissa), jossa t:n bitit ei ole kyseisen osoitteen tyyppijoukossa U. Esimerkiksi Rust on tyyppiturvallinen, koska bool (yleensä tavun kokoinen) tyyppinen muuttuja on aina binääriesityksenä 0 tai 1 eikä voi olla esimerkiksi 3. Rust estää tyyppien "väärinkäytön" kääntöaikana toisin kuin esimerkiksi Python heittää vasta ajonaikana tyyppivirheen TypeError. Useimmat dynaamisesti tyypitetyt kielet, kuten JavaScript ja Python ovat tyyppiturvallisia.
muistiturvallisuus (memory safety)Epätyyppiturvallinen kieli, joka lisäksi sallii arbitraarisen luvun muuttamisen (cast) osoittimeksi on epämuistiturvallinen kieli. Esimerkiksi C ja C++ osoittimia voi tallentaa lukuihin ja lukuja osoittimiin. Rust on tyyppiturvallinen joten se on myös muistiturvallinen. Esimerkkejä epämuistiturvallisten kielten muistivirheistä on puskurin ylivuotovirhe, data race ja use after free.
turvallisuus (safety)Turvallisella ohjelmoinnilla tarkoitetaan ohjelmointikäytäntöjä, joilla vältytään esimerkiksi tietoturvahaavoittuvuuksilta. Epäturvallisia ohjelmointikieliä ovat esimerkiksi C ja C++, koska niissä tehtyjä muistinhallintavirheitä on erittäin vaikeaa havaita ja estää.
muistivirhe (memory error)Muistivirhe on looginen virhe (ei aina tunnistettavissa), jossa muistia esim pinolla tai keolla käytetään väärin. Esimerkkejä väärinkäytöstä on saman muistin lukeminen ja kirjoittaminen samanaikaisesti, ei-initialisoidun muistin lukeminen tai muistin unohtaminen/vuotaminen. Kaikki muistivirheet eivät ole määrittelemätöntä käytöstä, esimerkiksi Rust ei suoraan estä muistivuotoja mutta estää määrittelemättömän käytöksen. Määrittelemätön käytös voi aiheuttaa muistin korruptoitumista, ohjelman kaatumisen, tai mitä tahansa muuta mikä on mahdollista.
yhdistelmätyyppi (composite type)Yhdistelmätyyppi koostuu muista tietotyypeistä tai myös itsestään. Kaikki structit, tuplet ja enumit ovat yhdistelmätyyppejä.
algebrallinen tietotyyppi (algebraic datatype)Algebrallinen tietotyyppi koostuu muista tietotyypeistä tai myös itsestään. Algebrallisia tietotyyppejä on kahdenlaisia: tulotyyppejä T * U ja summatyyppejä T + U. Rustissa yhdistelmätyypit ovat algebrallisia, joten niitä pystyy matchaamaan ergonomisesti. Muissa olioperusteisissa kielissä yhdistelmätyypit eivät ole yhtä algebrallisia.
tulotyyppi (product type)Tulotyyppi sisältää samanaikaisesti monta tyyppiä sisällään. Esimerkiksi kaikki tyypin (i32, bool) jäsenet koostuvat validista i32sta ja boolista. Kaikki structit ovat myös tulotyyppejä, koska ne ovat kuin tupleja joilla on nimetyt alkiot.
summatyyppi (sum type)Summatyyppi koostuu useasta eri variantista, joista vain ja tasan yksi variantti voi olla tallennettu muuttujaan tietyllä hetkellä. Esimerkiksi Option<T> summatyyppi koostuu None variantista ja Some(T) variantista. Option ei voi sisältää molempia samaan aikaan. Kaikki enumit ovat summatyyppejä. Enumin variantit eivät ole tyyppejä vaan konstructoreita, jotka palauttavat kyseisen enumin tyyppistä tietoa. Enumin variantti voi sisältää toisia enumeita tai tulotyyppejä, kuten tupleja. C-kielissä enumit tehdään unioneina.
geneerisyys (generics)Kuten kaikki muukin ohjelmoinnissa, geneerisyys on abstraktio. Geneerisyys on mekanismi, jonka avulla funktioita ja tietorakenteita saadaan toimimaan monella eri tyypillä käännösaikana. Esimerkiksi vektori Vec<T> on geneerinen tietorakenne, koska se voi sisältää listan (lähes) mitä tahansa tyyppiä. Vektorin tyyppiä T kutsutaan nimetyksi tyyppiparametriksi, joten voidaankin ajatella että Vec on kääntämisvaiheessa "tyyppifunktio", joka ottaa sisään esimerkiksi argumentin Vec<i32> ja palauttaa konkreetin tyypin. Kyseessä ei ole kuitenkaan alityypitys: funktio jonka parametri on tyyppiä Animal voi antaa argumentiksi tyyppiä Cat olevaa tietoa.
sulkeuma (closure)Klosuuri on nimetön ilmentymä funktiosta. Sulkeuma \|a\| a + 1 ottaa sisään yhden numeerisen argumentin ja palauttaa numeron. Sulkeuma yleensä päättelee parametrien tyypit kontekstista. Sulkeuma eroaa tavallisista funktioista siinä, että ne voivat sulkea sisäänsä muuttuja ympäröivästä skoopista.
elinaika (lifetime)Kaikella datalla on elinaika, joka tiedetään käännösaikana. Esimerkiksi paikallisten muuttujien elinaika on sama (tai lyhyempi) kuin kyseisen funktion kehyksen. Jos muuttujan data palautetaan funktiosta ja sidotaan uuteen muuttujaan, on kyseessä eri elinaika.
elinaikamerkintä (lifetime annotation)Elinaikamerkintää 'a tarvitaan aina välillä selkeyttämään kääntäjälle tarkoituksemme. Elinaikamerkintöjä harvemmin näkee, koska kääntäjä pystyy päättelemään ne, samalla tavoin kuin tyypit. Esimerkiksi funktio fn(&'a str) -> &'a str ottaa sisään string slicen ja palauttaa string slicen, mutta elinaikamerkintää ei tarvitse merkitä koska kääntäjä pystyy sen päättelemään: fn(&str) -> &str. Merkinnässä heittomerkin jälkeen voi tulla mikä tahansa nimi, kuten muuttujilla. Erikoiselinaikamerkintä 'static tarkoittaa että tietoa ei pudoteta eikä siirretä ennen ohjelman (tarkemmin säikeen) sulkeutumista.
segmentointivirhe (segmentation fault)Segmentointivirhe voi tapahtua epämuistiturvallisissa kielissä, jos prosessi yrittää lukea tai kirjoittaa muistia, joka ei kuulu sille. Esimerkiksi NULL-osoittimen dereferensointi aiheuttaa segmentointivirheen.
turbokala (turbofish)Turbokalaoperaattorilla ::<> voi määritellä funktion geneeriset tyyppiargumentit sen kutsumisen yhteydessä. Esim iteraattorien .collect metodille voi antaa kohdetyypin turbokalan avulla (1..10).into_iter().collect::<Vec<i32>>().

Viikko 5

TermiSelitys
periytyminen (inheritance)
tunnus (identifier)
vakio (constant)
paniikki (panic)
poikkeus (exception)
pakettirekisteri (package registry)
nollakustannusabstraktio (zero-cost abstraction)
rakentaja (constructor)
koersio (coercion)Tyyppikoersiot ovat automaattisia tyyppimuutoksia (cast), esimerkiksi &mut T voi koersoitua eli muuttua &T:ksi tietyissä tilanteissa. Elinajat koersoituu alityypityksen sääntöjen mukaan. Lue lisää Nomiconista.
ariteetti (arity)
alityypitys (subtyping)Alityypitys on olio-orientoidun ohjelmoinnin ominaisuus, jonka mukaan alityyppiä, esimerkiksi Catin ilmentymää voi aina käyttää Animalin sijasta varianssisääntöjen mukaan muuttamatta ohjelman toimintaa. Rustissa tyypit eivät muodosta luokkahierarkiaa toisin kuin traditionaalisissa olio-orientoiduissa kielissä, joten alityypityssäännöt pätevät vain elinajoilla.

Muita unpinnattuja (saattaa siirtyä)

Rustiin liittyvät

TermiSelitys
keko (heap)
debuggaus
testaaminen
kohdearkkitehtuuri
sidonta (dispatch)
avainsana
sijoitus (assignment)
literaali
operaattori
osoitin
kopiointi
kloonaus
kuormittaminen (overloading)
rekisteri (register)
määrittelemätön käyttäytyminen (undefined behavior)
race conditionEi tule sekoittaa termin data race kanssa
data race
roskankeräin
muistivuoto
makro
allokointi (allocation)
haara (branch)
siepata (catch)
rakentaja (builder)https://rust-unofficial.github.io/patterns/patterns/creational/builder.html
semafori (semaphore)
RAII
SoC (separation of concerns)
erikoistaminen (specialization)
polku

Lähteet

Osa selityksistä ja suomennoksista on otettu seuraavista lähteistä