Laiteläheinen C-kieli, mitä C-käännösprosessissa tapahtuu

Samankaltaiset tiedostot
1. NetBeans-ohjelman asennus ja käyttöönotto pva

Laiteläheinen C-kieli osa 1 pva

KYMENLAAKSON AMMATTIKORKEAKOULU

Laiteläheinen C-kieli, hello.c

NetBeans asennus ja etäkäyttö C-kielen opiskeluun, Windows

NetBeans asennus ja etäkäyttö C-kielen opiskeluun, Linux

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Raspin Geany-IDE:n etäkäyttö

Loppukurssin järjestelyt

Loppukurssin järjestelyt C:n edistyneet piirteet

C-ohjelmointi, syksy Modulaarinen ohjelmointi. Luento C-ohjelmointi Syksy

Modulaarinen ohjelmointi

Laiteläheinen C-kieli, yleistä

BL40A1810 Mikroprosessorit, harjoitus 1

Ohjelmointi Linuxissa. Sisällysluettelo. 1. Mitä tarvitaan sovellusten tuottamiseen? Tehnyt: Antti Martikainen ( )

5. HelloWorld-ohjelma 5.1

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Raspin Geany-IDE:n etäkäyttö Windows-ympäristössä

.NET ajoympäristö. Juha Järvensivu 2007

4. Lausekielinen ohjelmointi 4.1

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Luento 4. Timo Savola. 21. huhtikuuta 2006

4. Lausekielinen ohjelmointi 4.1

IDE asennus, Integrated Development Environment Atmelin AVR-mikro-ohjaimille pva

5. HelloWorld-ohjelma 5.1

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Ohjelmoinnin perusteet Y Python

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Kieliversiointityökalu Java-ohjelmistoon. Ohje

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Simulaattorin asennus- ja käyttöohje

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Julkaiseminen verkossa

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Luento 1 Tietokonejärjestelmän rakenne

ASCII-taidetta. Intro: Python

Ohjelmistojen testaus ja hallinta. Gradle

Coolselector Asennusohje

JAKELUPISTE KÄYTTÖOHJE 2/6

TIETORAKENTEET JA ALGORITMIT

3. C-kieli sulautetun järjestelmän ohjelmointikielenä , pva

Punomo Tee itse -julkaisun tekeminen

CVS. Kätevä väline usein päivitettävien tiedostojen, kuten lähdekoodin, hallitsemiseen

Ohjeita LINDOn ja LINGOn käyttöön

Luento 2. Timo Savola. 31. maaliskuuta 2006

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Johdatus ohjelmointiin

Poista tietokoneessasi olevat Javat ja asenna uusin Java-ohjelma

Ohjelmoinnin perusteet, syksy 2006

INTERBASE 5.0 PÄIVITYS VERSIOON 5.6

Test-Driven Development

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Mathcad Flexnet lisenssipalvelimen asennus

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

TeleWell TW-LTE/4G/3G USB -modeemi Cat 4 150/50 Mbps

Käännös, linkitys ja lataus

PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER

Ohjelmointi 1. Kumppanit

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Kääntäjän virheilmoituksia

KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Tietoverkkotekniikka. Joni Korjala APACHE WWW-PALVELIN Seminaarityö 2012

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Hieman linkkejä: lyhyt ohje komentoriviohjelmointiin.

Octave-opas. Mikä on Octave ja miksi? Asennus

OHJE Jos Kelaimeen kirjautuminen ei onnistu Mac-koneella Sisällys

Ohjelmointi 1 / syksy /20: IDE

FOTONETTI BOOK CREATOR

ArcGIS Pro -ohjelmiston käyttöönotto. Ohje /

TTY TKT-1110 Mikroprosessorit TKT. HEW-ohjeet ver 1.0

Toimi näin, jos et pääse verkkopankkiin Mozilla Firefox-selaimella

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

MALWAREBYTES ANTI-MALWARE

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

Ohjelmoinnin perusteet Y Python

FTP -AINEISTOSIIRRON OHJE PC / MAC Ympäristö

Valppaan asennus- ja käyttöohje

Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)

TIE Ohjelmistojen suunnittelu

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Eclipse ja JUnit-ohjelmoijatestit

Asennuksessa kannattaa käyttää asennusohjelman tarjoamia oletusarvoja.

MOODLE-OHJE: Liitetiedoston lisääminen ja päivittäminen

12. Näppäimistöltä lukeminen 12.1

ITKA203 Käyttöjärjestelmät, kesä Kesäkurssi Opettaja: Paavo Nieminen

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

Transkriptio:

Laiteläheinen C-kieli, mitä C-käännösprosessissa tapahtuu PUNOMO NETWORKS OY 25.8.2016, pva Sisältö 1. Komentoriviltä kääntäminen - jotta selviää miten toimitaan ja mitä terminologiaa eli käsitteitä on osattava 2. NetBeans-IDE-kääntäminen Raspissa - osoitan miten helpolla pääsee 3. Selvitän miten käännösprosessi etenee, mitä missäkin pisteessä tapahtuu jne. 4. Mitä tekee make ja makefile Johdanto Seuraavassa kerron millainen on käännösprosessi kun C-kielinen lähdekoodi käännetään GCC-kääntäjällä Raspberryssä olevalle ARM-ohjaimelle. GNU Compiler Collection (yleensä GCC) on GNU-projektin kääntäjien kokoelma. Se on Free Software Foundationin vapaata ohjelmistoa. GCC on GNU:n kehitysympäristön tärkein osa ja vapaiden Unixin kaltaisten käyttöjärjestelmien vakiokääntäjä ja usein hyödynnetty myös kaupallisten kehitysympäristöjen kanssa. GCC osaa kääntää C:tä ja myös C++, Javaa, Fortrania, Adaa, Objective-C:tä (Apple). https://fi.wikipedia.org/wiki/gcc Isot ohjelmat Ajatelkaamme vaikka kännykän ohjelmiston tekemistä. Koodia tarvitaan paljon. Osa siitä hoitelee äänen digitointia, toinen osa muokkaa sen lähetykseen sopivaksi, kolmas tarkkailee tukiasemia ja hoitelee radioyhteyttä, neljäs valvoo sähkön kulutusta ja akun tilaa. Lisää koodia tarvitaan hälytyksien soittoon, puhelutietojen tallentamiseen, tekstiviesteihin, puhelinluettelon ylläpitoon, kameraan, peleihin ja vaikka mihin. Ohjelmiston tekemiseen tarvitaan tuhansia koodin tekijöitä, tuhansittain tiedostoja, vielä enemmän funktiota ja headereita ja ties mitä. Pienet ohjelmat kannattaa rakentaa samalla periaatteella kuin isot, siis jakaa ne pieniin toimiviin kokonaisuuksiin, moduuleihin. Homma pysyy hanskassa. Kääntäjän tarvitsemat ohjeet ovat ohjelmien kasvaessa hyvin monimutkaisia ja valitettavasti samalla kääntämiseen tarvittavien komentojen määrä kasvaa. Pitää tietää mistä eri tiedostoista ohjelma koostuu, mitkä niistä pitää milloinkin kääntää, mitä ei välttämättä tällä kertaa tarvitse kääntää, jne. Fiksu tietokoneen käyttäjä laittaa tietokoneen töihin. Sitä varten on ohjelma make. 1

1. Komentoriviltä kääntäminen Loggaudu Mint-koneesta Putty-ohjelmalla Raspiin. Olet pi-käyttäjän kotihakemistossa. Luo sinne kansio c-codes: sudo mkdir c codes siirry sinne, anna komento cd c codes. Käynnistä nano-editori sudo nano Kirjoita seuraava koodi. #include <stdio.h> int main(void) { printf("hello Raspi World!\n"); return 0; } tallenna CTRL + o, kysyy tiedostolle nimeä, anna hello.c lopetus CTRL + x Funktio/metodi päätetään return 0 -vakiokomennolla, sillä C- ja C++ -kielissä kaikki metodit palauttavat jonkun arvon Kirjoita komento: gcc hello.c Kuten kuvasta näet ja omasta koneesta myös, gcc-kääntäjän käännöstulos ilman parametreja on a.out. Näin se on kaikilla C-käännöksillä, oli käännettävän koodin nimi mikä tahansa, käännöstulos on aina sama a.out (Unixin ominaisuus). a.out tarkoittaa assembler output, ajokelpoinen tiedosto. Tässä kun sen ajaa:./a.out, niin lopputulos on Hello Raspi World!, kuten kuvastakin näkyy. Kun kirjoitetaan komento./hello, niin käyttöjärjestelmä tietää, että ajettava hello-tiedosto on oletushakemistossa (siinä jossa par'aikaa ollaan). Muuten se lähtisi hakemaan tioedostoa polkumäärityksen perusteella ja ajaisi ensimmäisen tuolla nimellä olevan ajokelpoisen tiedoston. assembly on assembly-kieli assembler on assembly-kielen kääntäjä 2

Annetaan kääntäjälle lisäohjeita, kirjoita komento: sudo gcc o hello hello.c -o <tiedosto> Ohjaa tuloste <tiedostoon> eli gcc o hello hello.c, käännöstulos saa nimen hello eli gcc o apu hello.c, käännöstulos saa nimen apu voit käyttää kääntäjän kutsuun myös merkintää cc, joka on Unixin tapa gcc-kääntäjän parametreista saa lisäinfoa komennolla: gcc --help katso kansion sisältö ls-komennolla, hello on tullut lisää. Anna komento:./hello Tällä tavalla me voimme antaa ajettavalle koodille uuden nimen a.outin tilalle. Anna ls käskylle parametrit -al, ja katsotaan mitä tapahtuu. (.) tarkoittaa tässä yhteydessä oletushakemistoa, eli sitä missä ollaan (..) tarkoittaa seuraavaa ylätason hakemistoa, johon mennään komennolla [cd.., change directory, vaihda hakemisto], huomaa tyhjä väli d:n ja ekan pisteen välissä. http://linux.fi/wiki/komentorivin_perusteet Pieni GCC ohje 1: Jos haluat kääntää hello.c ja main.c koodit ohjelmaksi ekakoodi, se tapahtuu näin: gcc Wall pedantic ansi g lm main.c hello.c o ekakoodi Pieni GCC ohje 2: gcc Wall std=c99 o hello hello.c Wall = warnings all, jolloin GCC varoittaa mikäli koodi on virheellistä. pedantic = noudata tarkasti standardia ansi = pitää noudattaa ansi standardia g = käännä mukaan debug-informaatio gdb-ohjelmaa (tai vastaavaa varten) lm = linkitä mukaan tarpeen vaatiessa matematiikkakirjasto o = ekakoodi on syntyvä ajettava tiedosto std=c99 puolestaan kertoo, että ohjelmakoodi on kirjoitettu C99-standardia noudattaen. Tällöin GCC tarkistaa, että ohjelmakoodi noudattaa tarkasti C99- standardia ja ilmoittaa mikäli ohjelmakoodi on virheellistä. 3

2. NetBeans-IDE-kääntäminen Kun koodi valmis, talleta klikkaamalla disketin kuvaketta. Talleta lähdekoodi Sitten on tullut aika testata toimiiko kaikki niinkuin pitää. Käännetään ensin varmuuden vuoksi. Ensimmäisen koodin kääntäminen ja ajo Ensin käännös Käännös ja ajo samassa napissa NetBeans työntää lähdekoodin verkon kautta SSH-yhteydellä Raspiin, etsii sieltä C- kääntäjän ja kääntää koodin. Siis jos yhteys toimii ja lähdekoodi on virheetöntä, se ilmoittaa onnistumisen (ja myös epäonnistumisen) verkon kautta takaisin NetBeansin ikkunaan. NetBeansin käyttöliittymän oikeaan alaosaan avautuu Output-info-ikkuna. Jos kaikki toimii oikein, niin saat ilmoituksen että OK, eli Build Successful. Aja ohjelma. Klikkaa vihreää nuolta, katso kuva yllä. Jos käännös onnistui, niin todennäköisesti myös ajo onnistuu. Ohjelma tulostaa tekstin Hello Raspi, kuten kuvasta näkyy. 4

3. Mitä käännnösprosessissa oikein tapahtuu? C-kielen kääntäjä toimii kaksiosaisesti, ensin C-kielinen lähdekoodi käännetään assemblyksi-kieleksi ja se edelleen kohdeprosessorin konekoodiksi. Näin siksi, että jos kohdeprosessorin konekieli vaihtuu, niin varsinaiseen C-koodiin ei tarvitse tehdä mitään muutoksia, ainostaan jälkimmäinen kääntäjän osa vaihdetaan kohteen mukaan. 5

Lähdekoodi Kirjoitetaan Raspi-ympäristössä nano-editorilla tai mieluummin NetBeans-IDEssä ja Mint- (Windows-)pöytäkoneessa. Build Käännös alkaa make-ohjelman käynnistämisellä. Se lukee ohjeet makefile-tiedostosta ja käynnistää C-kääntäjän. Esikääntäjä, preprocessor on ohjelma, joka käsittelee lähdekoodia ennen kuin varsinainen kääntäjä ottaa sen käsittelyynsä. Esikäsittelysäännöt alkavat aina risuaitamerkillä # ja ne ovat siis ohjeita esikääntäjälle. Esikääntäjä työstää ohjelmoijan työtä helpottavia vakiomäärittelyjä, makroja ja ehdollisen kääntämisen komentoja. Rivin loppuun ei kirjoiteta puolipistettä. C-kielen esikääntäjä suorittaa tekstikorvauksia ennen varsinaista käännöstä, käsittelee #include direktiivit, laajentaa #define määrittelyiden mukaiset makrot ja poistaa kommentit. Kääntäjä, compiler Kääntäjän tehtävä on kääntää lähdekielinen ohjelma symboliselle konekielelle, eli assembly-kieleksi. Muunnoksessa lähdekielestä konekielelle kontrollirakenteet (if, while, for,... ) muutetaan hyppykäskyiksi (jmp, branch ) ja kohdeosoitteiksi (label). Kääntäjä tekee myös paljon tarkistuksia, koska kielissä on sääntöjä ja rajoituksia, jotta mahdollisimman paljon virheitä paljastuisi ennen ajoa Konekielikääntäjä, assembler Konekielikääntäjä muuntaa symbolisen konekielen binääriseen muotoon objektitiedostoksi. Tiedostotarkennin on tässä vaiheessa *.o. Symboliset osoitteet korvataan numeerisilla osoitteilla, mutta lopulliset osoitteet ovat vielä tässä vaiheessa tuntemattomia. Konekieliohjelma koostuu käskyistä, muistiosoitteiden nimistä (label) ja käännöstyötä ohjaavista ohjauskomennoista (direktiiveistä). Yhdistelijä, linkittäjä, linkkeri, linker Linkkeri kokoaa ohjelman keräämällä yhteen käännetyt objektitiedostot ja valmiit Kirjastotiedostot ja generoi niistä ajokelpoisen ohjelman, *.out. Linkkeri kiinnittää ohjelman sijainnin muistissa, käyttöjärjestelmä tai ympäristö määrää, mikä tämä osoite on. Yhdistely voi olla staattista tai dynaamista: staattisessa yhdistelyssä kaikki osat kootaan yhdeksi suoritettavaksi tiedostoksi, dynaamisessa yhdistelyssä kirjastot liitetään vasta ohjelman latauksen yhteydessä. Eri käyttöjärjestelmien objektiformaatteja: ELF, Executable and Linkable Format Solaris, Linux, System V Unix, BSD Unix COFF, Common Object File Format Tru64 Unix, Systen V Unix, Linux MSDOS, *.exe, *.com Unix, Linux, a.out Muokkain, modifiers Muuttaa tiedoston nimen ja tekee tarvittaessa muita lisäyksiä koodiin. 6

4. Mitä tekee make ja makefile make Isot ohjelmat koostuvat useasta lähdekoodi- ja otsikkotiedostosta (samassa työssä voi olla monta koodaajaa tai ohjelman koko edellyttää sitä). Kääntäjän tarvitsemat ohjeet ovat ohjelmien kasvaessa hyvin monimutkaisia, koska tarvittavien komentojen määrä kasvaa. Kaikkea ei ole kuitenkaan tarpeen kääntää joka pikku muutoksella. Unix/Linux-maailmassa on apuvälineenä käytössä make, make- tai gmake (Gnu make) -apuohjelma. Makella käännösprosessi automatisoidaan ja siitä poistetaan arkirutiinit. Makea varten tehdään ohjetiedosto makefile. Siitä make lukee käännösohjeet. Ohjeiden perusteella make ohjaa kääntäjää, linkkeriä, yms. tekemään vain ne tarvittavat toimet, jotka työstettävä ohjelma kulloinkin vaatii. Se ohjaa kääntämään vain ne osat, jotka ovat muuttuneet edellisen prosessoinnin jälkeen. Viisas make tuntee kellon ja kalenterin, siis käännöksien ajankohdat. Ohjeitten on oltava samassa työhakemistossa, missä meillä on käännettävä lähdekoodi. Make lukee tätä ohjetiedostoa, jossa kuvataan miten käännösprosessi tehdään. If you wish to download and install make youself, you can find it at http://www. gnu.org/software/make. Mikä maken versio: $ make --version Makefile makefile on puhdas ASCII-tekstitiedosto, joka sisältää ohjeet miten GCC-kääntäjä kääntää C-kielisen lähdekoodin ARM-ohjaimen ymmärtämäksi konekoodiksi. Makefile on erilaisia komentorivejä, erilaisia ohjeita ja sääntöjä (mm. tiedostojen riippuvuudet toisistaan) sisältävä tiedosto. Makefile sijaitsee yleensä samassa hakemistossa missä lähdekoodikin. Makefilen syntaksi on tarkoin määritelty. Se muodostuu - kohteista (targets), - riippuvuuksista (dependencies) ja - säännöistä (rules). Riippuvaisuustiedostot ovat yleensä ohjelman moduleja, tiedostoja, joista muodostuu kääntämällä, linkittämällä tai muilla sääntöjen määräämällä tavalla kohdetiedosto. Eli lyhyesti, makefile kertoo mitkä tiedostot pitää kääntää ja miten. Oikeastaan se on vain luettelo erilaisia ohjeita ja sääntöjä. 7

Viisi kysymystä joilla selviää mistä koostuu ja mitä tekee makefile 1. Millä kääntäjällä tiedostot käännetään? make osaa ohjata useita eri kääntäjiä, tässä ARM-GCC-kääntäjää. 2. Mille mikro-ohjaimelle tiedostot käännetään? Eli mikä on se ARM:n tyyppi, jolle koodi käännetään. 3. Mitkä koodit käännetään? Mitkä kaikki koodit tulee kääntää eli mistä eri tiedostoista ohjelma koostuu. Makefilessä kerrotaan minkälaisia riippuvuussuhteita eri tiedostojen välillä vallitsee. Näistä suhteista ja tiedostojen muutosajoista make osaa päätellä, mitkä tiedostot on käännettävä, linkitettävä tai muulla tavoin päivitettävä ajan tasalle. 4. Miten koodi käännetään? Tarvitaanko ajokelpoisen tallennettavan *.-koodin lisäksi muita tiedostoja? Eli tarvitaanko EEPROM-muistia varten oma tiedosto, tarvitaanko debuggausta eli virheen jäljitintä varten oma koodiformaatti, millaisia käännösoptioita käytetään (mahdollisimman nopea vai mahdollisimman pieni koodi), jne. 5. Mitä muuta kääntäjän tulee tehdä? Tulostetaanko virheilmoitukset, eritelty tilasto koodien koosta, käännöksen etenemisen esitys, tehdäänkö tarpeettomien (välitulosteet) tiedostojen poisto, jne. 8