Domänspecifika språk. TDP007 Konstruktion av datorspråk Föreläsning 5. Peter Dalenius Institutionen för datavetenskap 2013-02-11



Relevanta dokument
Konstruktion av datorspråk

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

TDP007 Konstruktion av datorspråk Hemtentamen

Deklarativ programmering

Prova på-laboration i Ruby

Mer om språk och Ruby

Konstruktion av datorspråk

Deklarativ programmering

Konstruktion av datorspråk

Mer om språk och Ruby

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Introduktion till Ruby

Programmeringteknik. Planering MÅL LABB: MOMENT LAB4 HTML - EXEMPEL HTML. Webbdelen

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Introduktion till Ruby

SMD 134 Objektorienterad programmering

Objektorienterad programmering, allmänt

Viktiga egenskaper hos ett program (Meyer): Objektorienterad programmering, allmänt. Vilka egenskaper vill vi att våra program ska ha?

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering

729G75: Programmering och algoritmiskt tänkande. Tema 1. Föreläsning 1 Jody Foo

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Grundläggande programmering DVG A08 & ISG A04. Allmän information. Å vem är jag då. Karlstads Universitet, Johan Öfverberg 1

729G75: Programmering och algoritmiskt tänkande. Tema 1, föreläsning 1 Jody Foo

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Algoritmer. Två gränssnitt

TDP002 Imperativ programmering

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Användarhandledning Version 1.2

Historik: OOP. Objektorientering. Historik: OOP (forts) En Dum Fråga

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Föreläsning 2. Operativsystem och programmering

IT OCH PROGRAMMERING I SKOLAN. Jan Erik Moström Peter Vinnervik

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Inledande programmering med C# (1DV402) Introduktion till C#

Imperativ programmering. Föreläsning 4

Konstruktion av datorspråk

Programmering B med Visual C

Konstruktion av datorspråk

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Programmering för språkteknologer II, HT2014. Rum

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Programmering. Hur, var, när och varför. 22 November. Lars Ohlén Tieto

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Introduktion till programmering och Python Grundkurs i programmering med Python

Design av interaktiv multimedia. Läs i förväg om det som övningarna kommer att beröra. Träna hemma både före och efter övningarna.

Introduktion till programmering. Programspråk och paradigmer

Tentamen i Grundläggande programmering STS, åk 1 fredag

Viktiga begrepp. Algoritm. Array. Binärkod. Blockprogrammering. Bugg / fel och felsökning. Dataspel. Dator

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Grundkurs i programmering - intro

OOP Objekt-orienterad programmering

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

Grundläggande databehandling ht 2005

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Kursplanering Objektorienterad programmering

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Att skriva till och läsa från terminalfönstret

729G75: Programmering och algoritmiskt tänkande. Tema 3, föreläsning 2

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Programmering för språkteknologer II, HT2011. Rum

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Mjukstart i programmering

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 5 5DV086 - Programspråk

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Grafik. TDDC66 Datorsystem och programmering Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

TDP002 - Imperativ programmering

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 15: Repetition DVGA02

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

JAVA Mer om klasser och objektorientering

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

OOP F1:1. Föreläsning 1. Introduktion till kursen OOP Vad är Java? Ett första Java-program Variabler Tilldelning. Marie Olsson

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

PROGRAMMERINGSTEKNIK TIN212

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

Classes och Interfaces, Objects och References, Initialization

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Transkript:

Domänspecifika språk TDP007 Konstruktion av datorspråk Föreläsning 5 Peter Dalenius Institutionen för datavetenskap 2013-02-11

Domänspecifika språk Ett domänspecifikt språk (eng. domain specific language, DSL) är ett oftast litet språk vars syfte är att uttrycka problem eller lösningssätt för ett specifikt begränsat problemområde. Alternativa benämningar: application oriented language, special purpose language, specialized language, task-specific language. Alla kanske inte är med om att skapa ett fullskaligt programspråk, men det är inte otroligt att man kommer att ta fram ett domänspecifikt språk någon gång under karriären. Wikipedia-artikeln om domain-specific language är en bra introduktion.

Exempel

Exempel

Domänspecifik är inte entydigt DSL Domain Specific Language GPL General Purpose Language HTML Excel Shell script Ruby Java BNF SQL C++ Språken behöver inte nödvändigtvis vara körbara.

Varför vill man ha DSL? Bättre uttryckskraft inom ett begränsat område kan ge högre produktivitet. snabbare utveckling kortare kod med färre fel Mindre behov av att kunna allmän programmering gör att fler personer, framför allt med domänkunskap, kan vara med och utveckla program.

Bättre uttryckskraft för att underlätta saker som man gör många gånger, t.ex. testning lättare och tydligare definiera komplicerade datastrukturer lättare bearbeta datastrukturer (t.ex. XSLT för att traversera XML-dokument) konfigurera system konstruera grafiska gränssnitt

Kan man mäta produktivitet? Språk Tillämpningsområde Nivå Rader källkod per FP Excel 5 Kalkyl 57 6 SQL Databasfrågor 25 13 HTML 3.0 Webbsidor 22 15 VHDL Design av hårdvara 17 19 Make Bygga programvara 15 21 Java Generellt språk 6 53 C Generellt språk 2,5 128 Programming Languages Table (Software Productivity Research)

Implementation av DSL Externt DSL Ny syntax som inte är gemensam med något existerande programspråk. Kräver helt nya verktyg, men man kan skapa ett uttrycksfullt språk för det specifika problemet. Internt DSL Utvidgning av ett existerande programspråk (en typ av abstraktion), med fördelen att man lätt kan bearbeta koden.

Verktyg för körbara DSL Interpretator (helt ny eller utbyggd) Kompilator (helt ny eller utbyggd) Preprocessor API Vi kommer att testa interna DSL (dvs som bygger på Ruby) som utnyttjar och utökar Ruby-interpretatorn.

Exempel på eget DSL article 1234 name "Sune" description "Book shelf" color "Red" inventory 42 article 5678 inventory 29 name "Berra" color "Brown" description "Mirror" Denna textfil innehåller information om ett antal artiklar i ett lager. Betrakta textfilen som programkod och försök skriva ett verktyg som kan tolka den. Hur då?

def article(n) # lagra artikelnummer def name(the_name) # lagra artikelnamn def description(the_text) # lagra beskrivning Detta är ett förslag på definition av metoder som kan ta emot information om artiklar. a) Hur ska vi kunna köra koden som finns i filen? b) Hur ska vi lagra informationen som läses in? def color(c) # lagra färg def inventory(n) # lagra antal i lager

Körning av kod med eval >> eval "1+3" => 4 >> eval "'abcd'.length" => 4 >> eval "def a(n);n+2;;a(45)" => 47 >> a(3) => 5 >> eval File.read("code.rb") Hello, world! => "All_the_world s_a_stage" code.rb puts "Hello, world!" "All the world s a stage".gsub(/ /, "_")

Om eval i olika kontexter eval() kör koden i den globala kontexten, ungefär som om man skrivit in den vid prompten i irb (definierad i klassen Kernel) o.instance_eval() kör koden i kontexten av objektet o, vilket innebär att man t.ex. kan komma åt instansvariabler (definierad i klassen BasicObject) C.class_eval() kör koden i kontexten av klassen C, vilket innebär att man t.ex. kan komma åt klassvariabler och definiera nya metoder (definierad i klassen Module) Det finns även en module_eval som körs i kontexten av en modul. Några av dessa metoder kan förutom en sträng även ta ett block. 14

class Warehouse < Array def Warehouse.load(filename) w = new w.instance_eval(file.read(filename)) w def article(number) self << {:article => number} def name(the_name) self.last[:name] = the_name # Metoderna description, color och inventory # definieras på samma sätt som name. Inläsning av data till en array av hashtabeller. >> w = Warehouse.load("lager.txt") => [{:article=>1234, :name=>"sune", :description=>"book shelf", :color=>"red", :inventory=>42}, {:article=>5678, :inventory=>29, :name=>"berra", :color=>"brown", :description=>"mirror"}]

Baksidan av eval Ett gigantiskt säkerhetshål som bara väntar på att utnyttjas. Möjlighet att skapa fullständigt obegriplig kod. 16

En mer generell lösning Vi vill kunna hantera vilka egenskaper som helst och slippa ha likadana metoder för name, description, color, etc. Om vi tar bort dessa metoder får vi naturligtvis fel. Kan vi fånga upp det på något hanterbart sätt? irb(main):002:0> w=warehouse.load("lager.txt") NoMethodError: undefined method `name' for [{:article=>1234}]:warehouse from warehouse.rb:5:in `instance_eval'... article 1234 name "Sune" description "Book shelf" color "Red" inventory 42 article 5678 inventory 29 name "Berra" color "Brown" description "Mirror" 17

Anrop till metoder som saknas 1. Man kan fånga undantag, precis som i många andra språk. 2. Man kan överlagra den interna metoden method_missing, som anropas varje gång en metod inte finns. Några tips angåe method_missing: Se till att den kan ta godtyckligt många argument: def method_missing(name, *args) Lägg under utvecklingen gärna in spårutskrifter som skriver ut argumenten, för att lättare förstå varför den anropas. 18

class Warehouse < Array def Warehouse.load(filename) w = new w.instance_eval(file.read(filename)) w def article(number) self << {:article => number} def method_missing(name, *args) self.last[name] = args[0]

Två tekniker som gör Ruby bra för DSL Kernel#load Kernel#eval BasicObject#instance_eval BasicObject#instance_exec Module#class_eval Module#class_exec För att köra kod som finns i en sträng, en fil eller ett kodblock. Kernel#method_missing Module#const_missing För att fånga upp när vi anropar en metod som inte finns.

Exempel 2 (körning) zaza1 <1> cat config.rb a 42 b 4711 c 1337 zaza1 <2> irb --simple-prompt >> load "configuration.rb" => true >> cfg=configuration.new => #<Configuration:0x2fdda0c @c=1396, @b=4711, @a=45> >> cfg.a => 45

Exempel 2a (programkod) class Configuration def initialize(filename="config.rb") instance_eval(file.read(filename)) def method_missing(method_name,arg) Configuration.class_exec { attr_accessor method_name } instance_eval("self.#{method_name}=#{arg}") Vad händer om man skapar flera objekt?

Exempel 2b (programkod) class Configuration def initialize(filename="config.rb") instance_eval(file.read(filename)) def method_missing(method_name,arg) @@var = method_name class << self class_eval { attr_accessor(@@var) } instance_eval("self.#{method_name}=#{arg}")

Exempel 3: Mofo class HCalar < Microformat container :vevent one:class, :description,:dt, :dtstamp, :dtstart,:duration,:status, :summary, :uid,:last_modified, :url => :url,:location => [ HCard, Adr, Geo, String] many :category class HCard < Microformat container :vcard one:fn, :bday,:tz,:sort_string, :uid,:class, :geo => Geo many :label,:sound,:title, :role,:key, :mailer, :rev,:nickname, :category, :note,:logo=> :url,:url=>:url, :photo=> :url,:adr=> Adr one:ndo one:family_name, :given_name, :additional_name many :honorific_prefix, :honorific_suffix...

Övning I filen expr.rb finns ett exempel på ett domänspecifikt språk för att beräkna matematiska uttryck. Varje rad består av ett variabelnamn följt av ett uttryck som detta ska bindas till. a 7 b 5 c a+3 # 10 d c*b*2 # 100 e d-7 # 93 Din uppgift är att läsa in och beräkna den här typen av uttryck med hjälp av DSL-tekniker. Exempel: >> Expression.calculate( expr.rb ) => 93

www.liu.se