Ludovic L'HOURS github.com/madbrain
Est ce qu'un nouveau langage généraliste est vraiment utile ?
Il existe par contre de nombreux domaines où un langage spécifique (DSL) serait judicieux
main:inlet -> valve -> f1:filter { transfert: x^2 + 1 } f1 -> pump { power: 500W, pressure: 1 bar } -> heater { power: 2kW } -> acc:accumulator -> o1:outlet f1 -> v1:valve -> o2:outlet v1 + acc -> mixer -> o3:outlet
Un langage dédié (Domain specific language) est un langage de programmation dont les spécifications sont conçues pour répondre aux contraintes d'un domaine d'application précis
Avantages | Inconvénients |
---|---|
Plus expressif | Nouvelle syntaxe |
Plus compact | Périmètre réduit* |
*implique plusieurs langages (cf. HTML, CSS, JS)
%plumber --pipe-diameter input.plumb 42
%plumber --pipe-diameter other-input.plumb Exception in thread "main" org.plumber.parser.ParseException: Parse Error at org.plumber.parser.Parser.doParseLiteral(Parser.java:21) at org.plumber.parser.Parser.doParseExpression(Parser.java:17) at org.plumber.parser.Parser.doParseStatement(Parser.java:13) at org.plumber.parser.Parser.doParseFile(Parser.java:9) at org.plumber.parser.Parser.parse(Parser.java:5) at org.plumber.interpreter.Launcher.main(Launcher.java:7)
Le langage, afin d'être exploitable par le plus grand nombre, doit être associé à des outils qui fournissent:
Un DSL interne est écrit en utilisant un langage hôte, on peut donc profiter de l'outillage associé à ce langage hôte.
Exemple de DSL interne (Java):
interface Start {
End singleWord();
End parameterisedWord(String parameter);
Intermediate1 word1();
Intermediate2 word2();
Intermediate3 word3();
}
interface End {
void end();
}
interface Intermediate1 extends End {
End optionalWord();
}
interface Intermediate2 {
End wordChoiceA();
End wordChoiceB();
}
interface Intermediate3 extends End {
Intermediate3 word3();
}
public interface NewElementBuilder {
ElementBuilder pump();
ElementBuilder filter();
ElementBuilder pump(String name);
ElementBuilder filter(String name);
NextElementBuilder ref(String name);
}
public interface ElementBuilder extends NextElementBuilder {
ParametersBuilder parameters();
}
public interface NextElementBuilder extends NewElementBuilder {
NewElementBuilder pipe();
}
builder()
.pump("main").pipe().filter("f1").parameters().pipe().pump()
.ref("f1").pipe().pump();
Pour créer son propre langage :
Des questions ?