Ohjelmoinnin peruskurssien laaja oppimäärä

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssien laaja oppimäärä

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Osoitin ja viittaus C++:ssa

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

4. Lausekielinen ohjelmointi 4.1

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

2 Konekieli, aliohjelmat, keskeytykset

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Harjoitustyö: virtuaalikone

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Jakso 4 Aliohjelmien toteutus

13/20: Kierrätys kannattaa koodaamisessakin

TIE Principles of Programming Languages CEYLON

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Ohjelmoinnin peruskurssi Y1

Tähtitieteen käytännön menetelmiä Kevät 2009

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmoinnin peruskurssi Y1

8. Näppäimistöltä lukeminen 8.1

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Ohjelmoinnin peruskurssien laaja oppimäärä

Zeon PDF Driver Trial

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin peruskurssien laaja oppimäärä

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssien laaja oppimäärä

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Korpusten käsittely clt131, P Luento 1

Hajautettujen sovellusten muodostamistekniikat, TKO_2014 Johdatus kurssiin

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Virtualisointiympäristössä on kolme pääosaa: isäntä (host), virtualisointikerros ja vieras (guest).

15. Ohjelmoinnin tekniikkaa 15.1

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Ohjelmoinnin perusteet Y Python

19/20: Ikkuna olio-ohjelmoinnin maailmaan

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Hakemistojen sisällöt säilötään linkitetyille listalle.

ASM-kaavio: reset. b c d e f g. 00 abcdef. naytto1. clk. 01 bc. reset. 10 a2. abdeg. 11 a3. abcdg

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

11/20: Konepelti auki

C++11 lambdat: [](){} Matti Rintala

17/20: Keittokirja IV

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Tietotekniikan valintakoe

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä.

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Tieto- ja tallennusrakenteet

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 / syksy /20: IDE

Harjoitus 3 (viikko 39)

CUDA. Moniydinohjelmointi Mikko Honkonen

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

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

Apuja ohjelmointiin» Yleisiä virheitä

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Ohjelmoinnin peruskurssien laaja oppimäärä

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Ohjelmoinnin perusteet Y Python

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Luento 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Ohjelmoinnin peruskurssi Y1

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä Luento 10: Aliohjelmat, foreign function interface Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 25. 3. 2013

Sisältö 1 Aliohjelmien käyttäminen 2 Kielten sekoittaminen: foreign function interface

Aliohjelmat jotkut ohjelmat käynnistävät toisia ohjelmia aliohjelminaan syitä aliohjelmien käyttämiseen: valmiissa ohjelmassa on jo haluttu toiminto (joskus tosin olisi myös vastaava kirjasto) aliohjelmaa voi testata kokonaan erillään pääohjelmasta helppo tapa käyttää eri ohjelmointikieliä yhdessä helppo tapa tehdä rinnakkaisuutta aliohjelman voi hajauttaa eri koneelle (toisin kuin säikeen) useimmiten aliohjelma tekee jonkin selkeästi rajatun toiminnon tarkemmin rajatun kuin useimmmat kirjastot pää- ja aliohjelman välisen kommunikoinnin kannattaa olla yksinkertaista esimerkkejä: kuvatiedostoja voi skaalata ja konvertoida eri formaattiin ImageMagick-komentorivityökaluilla (tähän olisi kirjastojakin) jotkut selaimet tekevät nimipalvelukyselyt aliohjelmalla monet WWW-palvelimet ajavat sivuja tuottavaa koodia omissa aliohjelmissaan

Aliohjelman käynnistäminen Pythonissa aja komento ja odota että se loppuu: subprocess.call(['lp', 'foo.pdf']) aja komento taustalla: p = subprocess.popen(['sleep', '10'])... p.wait() aja komento ja lue sen syöte: out = subprocess.popen(['ls', '-l'], stdout=subprocess.pipe).communicate() aja komento ja kirjoita sille syötettä: p = subprocess.popen('gzip -c >x.txt.gz', stdin=subprocess.pipe, shell=true) p.communicate(inputstr) todellisuudessa pitää myös mm. tarkistaa paluuarvo ohje: http://docs.python.org/library/subprocess.html muissa kielissä nämä ovat usein nimellä system ja popen C:stä ja Unixin toiminnoista ks. http://www.gnu.org/ software/libc/manual/html_node/processes.html

(Ali)ohjelman kommunikointitavat 1/2 kaikilla käynnistetyillä ohjelmilla eli prosesseilla on: syötevirta (standard input, stdin = 0) tulostevirta (standard output, stdout = 1) virhetulostevirta (standard error, stderr = 2) paluuarvo lopettaessa (exit code, kokonaisluku 0127) prosessille voi lähettää signaalin (kokonaisluku noin 131) virtoja voi olla enemmänkin alla oleva toteutus: jätetään tiedostoja auki kun pääohjelma jakautuu pää- ja aliohjelmaksi useimmiten aliohjelman kanssa kommunikoidaan syöte- ja tulostevirroilla sekä paluuarvolla hyvin käyttäytyvä (ali)ohjelma kirjoittaa virheilmoituksensa stderr:iin eikä stdout:iin paluuarvo on yleensä 0 jos kaikki sujui hyvin virroilla voi tehdä kaksisuuntaista interaktiivisessa kommunikointia, mutta pitää muistaa puskurointi

(Ali)ohjelman kommunikointitavat 2/2 aliohjelman käynnistänyt ohjelma saa tiedon aliohjelman loppumisesta toteutettu signaalilla sekä wait-kutsulla joka saa paluuarvon Pythonissa subprocess.popen:n palauttaman olion wait-metodi odottaa aliohjelman loppumista poll-metodi kertoo, onko aliohjelma vielä hengissä send_signal-metodi lähettää aliohjelmalle signaalin Pythonin signal-moduulilla voi käsitellä saatuja signaaleja esimerkkejä aliohjelmien käytöstä: inkscape-0.47.0/share/extensions/perspective.py epydoc-3.0.1/epydoc/cli.py ja util.py

Erilliset ohjelmat joskus ohjelmat kommunikoivat keskenään ilman että pääohjelma on käynnistänyt aliohjelman erona edelliseen pitää löytää toinen ohjelma ja muodostaa yhteys kommunikointia varten usein käytetään joko verkkoyhteyksiä tai koneen sisäisiä yhteyksiä (esim. Unix domain socket) tai esim. käyttöliittymäkirjaston/työpöytäympäristön palveluita joskus myös käynnistää toinen ohjelma tarvittaessa käyttöjärjestelmissä on palveluita, jotka käynnistävät sellaisia pyydettäessä (Linuxissa esim. inetd ja D-Bus)

Sisältö 1 Aliohjelmien käyttäminen 2 Kielten sekoittaminen: foreign function interface

melkein kaikissa ohjelmointikielissä on tapa liittää samaan ohjelmaan toisen kielen koodia melkein aina C/C++-kielien kautta esim. Python-ohjelma kutsuu C-funktiota tai C-funktio kutsuu Python-koodia myös esim. käyttöjärjestelmän C:llä tehtyjä kirjastoja kutsutaan samaan tapaan kuin omaa C-koodia useimmiten esim. Pythonilla tehty pääohjelma kutsuu yksittäisiä C-funktioita toisen kielen rajapinta C:n käyttöön on nimeltään foreign function interface (FFI) poikkeus: muutamat kielet sopivat yhteen suoremmin esim. C ja C++ sekä Java ja muut Javan virtuaalikonetta käyttävät kielet

Argumentit ja paluuarvot 1/2 suurin vaikeus kielten yhteiskäytössä on argumenttien välitys esim. toisen kielen merkkijono ei ole sama kuin C:n merkkijono samoin paluuarvot tapa 1: C:n tyypit toisessa kielessä natiivien arvojen lisäksi kielessä voi tehdä C-kielisiä arvoja yleensä niillä voi tehdä paljon vähemmän kuin natiiveilla arvoilla: tarkoitettu lähinnä C-funktioiden käyttöön esim. Pythonin ctypes-moduulin ctypes.c_int(42) tekee C-kokonaisluvun tapa 2: toisen kielen tyypit C:ssä C-kielinen koodi näkee toisen kielen arvoja (yleensä osoittimia, joita käsitellään tietyillä C-funktioilla) tässä mitä tahansa C-koodia ei voi kutsua suoraan: vain sellaista, joka ymmärtää näitä toisen kielen tyyppejä useimmiten kutsuttavat C-funktiot tekevät tyyppimuunnoksia ja lopulta kutsuvat tavallisia C-funktioita

Argumentit ja paluuarvot 2/2 tapa 3: automaattiset tyyppikonversiot kuten tapa 1, mutta C-kielen arvoja ei käsitellä erikseen, vaan kerrotaan vain C-funktioiden tyypit ja toisen kielen toteutus tekee konversiot taustalla tätä on usein helppo käyttää ongelmia: osaa yleensä konvertoida vain tiettyjä tyyppejä; joskus tekee turhaa konversiotyötä yleensä kielissä on ainakin tapa 1, usein kaikki kolmekin esimerkkejä FFI:n käytöstä Pythonissa: tapa 1: python2.6-2.6.6/lib/uuid.py tapa 2: pygame-1.8.1release/src/key.c

Kielten yhteiskäytön hankaluuksia useimmiten kielten tyyppien väliset muunnokset aiheuttavat kopiointia esim. taulukosta joudutaan usein tekemään kopio monimutkaisten tyyppien muuntaminen on hankalaa mm. oliot, funktiot ja kokoelmatyypit (esim. dict) yleensä joko muunnos pitää tehdä käsin tai automaattisessa muunnoksessa ei näy kaikkea (esim. metodeja) tai toimii vain tietynlaisille arvoille (esim. taulukko jonka kaikki alkiot ovat samantyyppisiä) muistinhallinta pitää yleensä tehdä käsin eli C-koodin pitää itse vapauttaa varaamansa muisti paitsi jos tekee toisen kielen arvoja (tapa 2 edellä) rinnakkaisuus on hankalaa tai huonosti määritelty ei kannata muuttaa samaa dataa eri säikeestä ja eri kielestä

Käytännön ohjeita koska argumentit yleensä kopioidaan, kannattaa tarkistaa että niissä on vain tarvittava data funktioargumentteja kannattanee välttää, vaikka ne useimmiten periaatteessa toimivat kannattaa pitää kielten välinen rajapinta mahdollisimman selkeänä ja yksinkertaisena jos tekee C-koodin itse, koodista tulee selkeämpää jos pyrkii tekemään yleiskäyttöisen C-kirjaston eikä tee C-koodia tarkasti toisen kielen koodin ehdoilla tyypillisimmin FFI:tä käytetään kutsumaan jo olemassaolevaa C:llä tehtyä kirjastoa kannattaa pyrkiä yhdistämään toinen kieli C:hen ei siis esim. yhdistää Pythonia ja Schemeä samaan ohjelmaan sillä se on hankalampaa (vaikka periaatteessa mahdollista) varsinkin tähän aliohjelmien käyttäminen on helpompi ratkaisu

Toinen tapa: sulautettu tulkki toinen tapa FFI:n sijaan: esim. C:llä tehty ohjelma voi sisältää Python-tulkin, jolla se ajaa Python-koodia eli toisen kielen tulkki on sulautettuna (embedded) ohjelmaan näin päin tehdään yleensä jos toista kieltä käytetään ohjelman laajentamiseen tai kongurointiin yleisimpiä sulautettavia kieliä: Scheme (osa toteutuksista toimii paremmin), Python ja Perl peleissä Lua (helppo sulauttaa) selaimissa JavaScript (tarvitaan muutenkin) joskus sovelluksen oma kieli (esim. Emacs Lisp) käytetään esim. tukemaan toisilla kielillä tehtyjä plugineja selaimia voi usein laajentaa JavaScriptilla Gimp-kuvankäsittelyohjelmaa voi laajentaa Schemellä, Pythonilla tai Perlillä Gnomen Hearts-pelin teköälyjä voi tehdä Pythonilla (ennen Lua)