{"id":2017,"date":"2018-04-06T20:48:32","date_gmt":"2018-04-06T17:48:32","guid":{"rendered":"http:\/\/spektrum.fi\/spektraklet\/?p=2017"},"modified":"2018-04-08T14:47:34","modified_gmt":"2018-04-08T11:47:34","slug":"programtolkning","status":"publish","type":"post","link":"http:\/\/spektrum.fi\/spektraklet\/programtolkning\/","title":{"rendered":"Spr\u00e5k och tolkning"},"content":{"rendered":"<p>Eftersom jag har kodat p\u00e5 ett skolprojekt under hela veckoslutet t\u00e4nkte jag\u00a0 skriva en artikel om det. Uppgiften var att skriva en programtolk f\u00f6r det simpla MiniPL programmeringsspr\u00e5ket (tekniska specifikationen finns <a href=\"https:\/\/www.cs.helsinki.fi\/u\/vihavain\/k18\/Compilers\/Project\/Mini_pl_syntax_2018.pdf\">h\u00e4r<\/a>\u00a0f\u00f6r de nyfikna).<\/p>\n<p><em>En vad?<\/em><\/p>\n<p>En programtolk\/interpretator (eng. <em>interpreter<\/em>) \u00e4r ett program som tar in kod av ett specifikt spr\u00e5k och g\u00f6r\/k\u00f6r det som koden beg\u00e4r. Detta \u00e4r skillnad till en kompilator, som helt enkelt \u00f6vers\u00e4tter kod fr\u00e5n ett spr\u00e5k till ett annat. Programtolken \u00e4r ofta uppdelad i 4\u00a0 huvudsakliga delar: lexikal-, syntax- och semantisk analys, som tillsammans skapar en m\u00e4ngd programinstruktioner, och till sist sj\u00e4lva k\u00f6rningen av instruktionerna.<\/p>\n<p>Tolkningen b\u00f6rjar med lexikalanalys d\u00e4r karakt\u00e4rer\u00a0grupperas till &#8221;symboler&#8221; eller ord (eng. <em>tokens<\/em>). Vi tar som exempel meningen &#8221;<em>Datorer har en von Neumann-arkitektur.&#8221;\u00a0<\/em>Karakt\u00e4rerna\u00a0kan grupperas till f\u00f6ljande symboler: &#8221;Datorer&#8221;, &#8221;har&#8221;, &#8221;en&#8221;, &#8221;von Neumann&#8221;, &#8221;-&#8221;, &#8221;arkitektur&#8221; och till sist &#8221;.&#8221;-tecknet. Till symbolerna tills\u00e4tts till\u00e4ggsdata, som att symbolen &#8221;Datorer&#8221; \u00e4r ett substantiv i plural, symbolen &#8221;har&#8221; \u00e4r ett verb osv.<\/p>\n<p><a href=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_lexer.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-2020\" src=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_lexer.png\" alt=\"\" width=\"581\" height=\"151\" srcset=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_lexer.png 581w, http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_lexer-300x78.png 300w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><\/a><\/p>\n<p>Syntaxanalysen tar in dessa symboler, och f\u00f6rs\u00f6ker bygga upp satser och meningar av dessa, enligt specifierade grammatikregler. Satserna och meningarna sparas i ett s\u00e5 kallat (abstrakt) syntaxtr\u00e4d. Av exempelmeningen kan man bygga upp f\u00f6ljande tr\u00e4d:<\/p>\n<p><a href=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_parser.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-2021\" src=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_parser.png\" alt=\"\" width=\"605\" height=\"291\" srcset=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_parser.png 605w, http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_parser-300x144.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/a><\/p>\n<p>I programmeringsspr\u00e5k \u00e4r det ytterst viktigt att man kan tolka de givna symbolerna bara p\u00e5 ett visst s\u00e4tt, dvs. spr\u00e5ket f\u00e5r inte vara tvetydigt. Olikt en m\u00e4nniska vet inte datorn vad den skall g\u00f6ra d\u00e5 en kod kan betyda tv\u00e5 olika saker.\u00a0Tvetydighet uppkommer oftast i syntaxanalysen, d\u00e5 man inte kan utg\u00f6ra hurdant syntaxtr\u00e4d som ska byggas upp med hj\u00e4lp av grammatikreglerna. Grammatiken m\u00e5ste omformas f\u00f6r att fixa problemet.<\/p>\n<p>Efter att syntaxet \u00e4r granskat s\u00e5 s\u00f6ker den semantiska analysen efter &#8221;meningen&#8221; bakom meningarna &#8212; vad den givna koden eller texten betyder. En syntaktiskt korrekt mening beh\u00f6ver inte vara semantiskt korrekt. Ett typexempel \u00e4r\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Colorless_green_ideas_sleep_furiously\">&#8221;F\u00e4rgl\u00f6sa gr\u00f6na id\u00e9er sover h\u00e4ftigt.&#8221;<\/a>\u00a0Meningen \u00e4r inte alls vettig (s\u00e5 l\u00e4nge man inte \u00e4r alltf\u00f6r poetisk av sig), men f\u00f6ljer \u00e4nd\u00e5 de svenska grammatikreglerna.<\/p>\n<p>Vi tittar igen p\u00e5 exemplet &#8221;<em>Datorer har en von Neumann-arkitektur.&#8221;<\/em>\u00a0Den semantiska analysen f\u00f6r\u00a0detta p\u00e5st\u00e5ende kan bland annat best\u00e5 av att svara dessa fr\u00e5gor: \u00c4r datorer saker med en &#8221;arkitektur&#8221;? \u00c4r\u00a0&#8221;von Neumann-arkitektur<em>&#8221;\u00a0<\/em>en egenskap som en dator kan ha? Syntaxtr\u00e4det omvandlas eller p\u00e5fylls sedan med den information som man har samlat och rent syntaktiska element sk\u00e4rs bort, som punkter och bindestreck.<\/p>\n<p><a href=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_analyzer-1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-2039\" src=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_analyzer-1.png\" alt=\"\" width=\"459\" height=\"321\" srcset=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_analyzer-1.png 459w, http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/04\/Vecktrakel2_analyzer-1-300x210.png 300w\" sizes=\"(max-width: 459px) 100vw, 459px\" \/><\/a><\/p>\n<p>I semantisk analys av\u00a0programmeringsspr\u00e5k granskas det att variabel-\/funktiontyperna \u00e4r \u00f6verensst\u00e4mmande och att de variabler\/funktioner som anv\u00e4nds \u00e4r definierade. Syntaxtr\u00e4det omvandlas samtidigt till en m\u00e4ngd programinstruktioner (oftast \u00e4nd\u00e5 i formen av ett tr\u00e4d) samt en &#8221;symboltabell&#8221;, d\u00e4r definitionerna av variabler och funktioner sparas.<\/p>\n<p>Efter allt detta kan instruktionerna k\u00f6ras. Under k\u00f6rningen sparas variabelv\u00e4rden i symboltabellen, varifr\u00e5n de kan \u00e5terh\u00e4mtas senare. Programtolken borde inneh\u00e5lla en liten m\u00e4ngd basfunktioner (som aritmetik och loopar) som sedan kan anv\u00e4ndas av programmerare f\u00f6r att bygga upp mer komplexa funktioner. Eller varf\u00f6r inte en ny programtolk?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eftersom jag har kodat p\u00e5 ett skolprojekt under hela veckoslutet t\u00e4nkte jag\u00a0 skriva en artikel om det. Uppgiften var att skriva en programtolk f\u00f6r det simpla MiniPL programmeringsspr\u00e5ket (tekniska specifikationen finns h\u00e4r\u00a0f\u00f6r de nyfikna). En vad? En programtolk\/interpretator (eng. interpreter) \u00e4r ett program som tar in kod av ett specifikt spr\u00e5k och g\u00f6r\/k\u00f6r det som &hellip; <a href=\"http:\/\/spektrum.fi\/spektraklet\/programtolkning\/\" class=\"more-link\">Forts\u00e4tt l\u00e4sa <span class=\"screen-reader-text\">Spr\u00e5k och tolkning<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[87,5],"tags":[53,126],"_links":{"self":[{"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts\/2017"}],"collection":[{"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/comments?post=2017"}],"version-history":[{"count":11,"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts\/2017\/revisions"}],"predecessor-version":[{"id":2041,"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts\/2017\/revisions\/2041"}],"wp:attachment":[{"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/media?parent=2017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/categories?post=2017"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/tags?post=2017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}