Rainer Stropek cubido. Baumschule Expression Trees in C#, CLR und DLR



Ähnliche Dokumente
Übung 1 mit C# 6.0 MATTHIAS RONCORONI

DSLs mit Xtext entwerfen , A. Arnold

Definition von domänenspezifischen Sprachen mit Xtext: Einführung. 19. November 2014

Java: Vererbung. Teil 3: super()

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

2.0. Jens Weller Joel de Guzman Hartmut Kaiser

Ich liebe Java && Ich liebe C# Rolf Borst

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Objektorientierte Programmierung

Ein subjektiver Vergleich zwischen SSIS und Kettle mit Ausblick auf die Generierung von BI-Lösungen

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Oracle: Abstrakte Datentypen:

WebService in Java SE und EE

WhiteStarUML Tutorial

Windows Presentation Foundation (WPF) -Grundlagen -Steuerelemente. Dr. Beatrice Amrhein

How To: Wie entwickle ich mit SharpDevelop Anwendungen für die PocketPC-Platform

Formale Spezialisierungstechniken. am Beispiel des binären Baums. Hybride Programmiersprachen Daniel Krompass Berlin, 2009

4D Server v12 64-bit Version BETA VERSION

pyaxl2 Sebastian Kratzert Was ist AXL? Datenstrukturen Aufbau von pyaxl Die CCM-Objekte pyaxl2 Beispiele Ende Sebastian Kratzert 5.

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

C# im Vergleich zu Java

Neue Features in C# 2.0

Anwenderhandbuch logiware IO-Stick

PHP Kurs Online Kurs Analysten Programmierer Web PHP

Anwendungsbeschreibung an einem Beispiel

Vorkurs C++ Programmierung

5.2 Neue Projekte erstellen

Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kapitel 4. Einführung in den Scannergenerator Flex. Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Innere Klassen in Java

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Java Einführung Operatoren Kapitel 2 und 3

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Pragmatik von Programmiersprachen

Programmieren in Java

Besonderheiten von C#

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Software Engineering II

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Java Entwicklung für Embedded Devices Best & Worst Practices!

JSP Grundlagen. JEE Vorlesung Teil 5. Ralf Gitzel

Prüfungsvorbereitung: Präsentation und Anwenderschulung

Einführung in die Informatik Tools

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Javakurs 2013 Objektorientierung

Was ist ein Compiler?

SDK zur CRM-Word-Schnittstelle

Software Engineering Klassendiagramme Einführung

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmierkurs Java

Grundlagen von Python

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Software-Engineering Grundlagen des Software-Engineering

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv

Nathan Burgener. Design by Contract. Modul SWE

Anleitung zum Arbeiten mit Microsoft Visual Studio 2008 im Softwarepraktikum ET/IT

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

Kapitel 6. Vererbung

Tagesprogramm

Event Stream Processing & Complex Event Processing. Dirk Bade

Anwenden eines Service Packs auf eine Workstation

Java Kurs für Anfänger Einheit 5 Methoden

Test-Driven Design: Ein einfaches Beispiel

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

PostgreSQL in großen Installationen

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Zählen von Objekten einer bestimmten Klasse

Datenhaltung für Android Model First Christian Ingenhaag, Frederik Götz, Carl Steeg

Vorlesung Informatik II

Informatik 12 Datenbanken SQL-Einführung

OP-LOG

WPF Steuerelemente Listbox, ComboBox, ListView,

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Whitepaper. Produkt: combit Relationship Manager. Einbindung externer FiBu-/Warenwirtschaftsdaten. combit GmbH Untere Laube Konstanz

Studentische Lösung zum Übungsblatt Nr. 7

Kapitel 6. Vererbung

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

1 Software Engineering 1

Generierung & Übersetzung mit XLE

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

2. XML 2.1 XML 1.0 und XML Schema. Jörg Schwenk Lehrstuhl für Netz- und Datensicherheit

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Delegatesund Ereignisse

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Kurzanleitung zu XML2DB

Kapitel 6. Vererbung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Es wird das Struts <html:option> Element erläutert und anhand von kleinen Beispielen der Umgang veranschaulicht.

Transkript:

Rainer Stropek cubido Baumschule Expression Trees in C#, CLR und DLR

Inhalt Als Anwendungsentwickler kommt man selten mit Expression Trees in Berührung. Sie sind ein Implementierungsdetail von LINQ. Ihre Bedeutung nimmt jedoch durch die zunehmende Beliebtheit von dynamischen Sprachen auf Basis der DLR zu. Rainer Stropek zeigt in seiner Session, was hinter Expression Trees steckt. Wie werden sie von LINQ genutzt und warum sind sie für C# 4.0, IronPython und Co. so wichtig?

SEHEN WIR DEN WALD VOR LAUTER BÄUMEN NOCH?

Von Text zum Baum <Garden xmlns="clr-namespace:treenursery.xaml;assembly=treenursery"> <Garden.Trees> <Tree> <Tree.Fruit> <Apple /> </Tree.Fruit> Parser </Tree> <Tree> <Tree.Fruit> <Apple /> </Tree.Fruit> </Tree> <Tree> <Tree.Fruit> <Apricot /> </Tree.Fruit> </Tree> </Garden.Trees> </Garden>

Von Text zum Baum Sequentieller Inhalt mit Struktur Baumstruktur im Speicher Sequentielle Ausgabe Operationen

Einige Beispiele Lexer/Parser XML in DOM SQL in Execution Plan Compiler bzw. Lexer/Parser/Generator C# in IL FetchXML in SQL (MS CRM) Interpreter SQL Server Execution Plan Compiler-Compiler ANTLR Coco/R

Wichtige Begriffe Praktisches Anwendungsbeispiel ANTLR EIN WENIG THEORIE

Wichtige Begriffe Compiler Grammatik Generatorregeln Source Lexer, Parser Tree (Syntax Tree) Generator Target Interpreter

Wichtige Begriffe Grammatik Grammatik Compiler- Compiler Lexer Parser

EBNF Quelle: The Definitive ANTLR Reference, Terence Parr

Praktisches Beispiel Einfache ANTLR Grammatik zum Parsen der XAML Datei grammar XmlLanguage2; options { output = AST; } // PARSER ---------------------------------- xmldocument : node; node : '<'! ELEMENTNAME attributelist '>'! ( node )* '</'! ELEMENTNAME '>'! '<'! ELEMENTNAME '/>'!; attributelist : attribute*; attribute : ELEMENTNAME '='! LITERAL; // LEXER ----------------------------------- ELEMENTNAME : IDENTIFIER ( '.' IDENTIFIER )?; LITERAL : '\'' ( ~'\'' )* '\''; fragment IDENTIFIER : ( 'a'..'z' 'A'..'Z' '_' ) ( 'a'..'z' 'A'..'Z' '0'..'9' )*; NEWLINE : ('\r'? '\n')+ { $channel = HIDDEN; }; WHITESPACE : ( '\t' ' ' )+ { $channel = HIDDEN; } ;

Praktisches Beispiel Einfache ANTLR Grammatik zum Parsen der XAML Datei grammar XmlLanguage; options { output = AST; } tokens { NODE = 'Node'; ATTRIBUTELIST = 'AttributeList'; ATTRIBUTE = 'Attribute'; CONTENT = 'CONTENT'; } // PARSER ---------------------------------- xmldocument : node; node : '<' start=elementname attributelist '>' ( node )* '</' end=elementname '>' -> ^( NODE [$start] attributelist ^( CONTENT node* ) ) '<' tag=elementname '/>' -> ^( NODE [$tag] ); attributelist : attribute* -> ^( ATTRIBUTELIST attribute* ); attribute : attribname=elementname '=' LITERAL -> ^( ATTRIBUTE [$attribname] LITERAL ); // LEXER ----------------------------------- [ ]

Implementieren einer einfachen Formelsprache mit ANTLR ALLES NUR THEORIE?

Praktisches Beispiel Entwicklung einer Formelsprache zur Erweiterung einer Anwendung Wir unterstützen Logische Verknüpfungen And, Or Vergleichsoperatoren =, <>, <, >, <=, >= Funktionen Iif Zugriff auf Eigenschaften Literale Strings, Boolean, Numeric Beispiel X=5 And ( Y=7 Or Z=3 Or Y=5 )

Wo ist der Baum? X=5 And ( Y=7 Or Z=3 Or Y=5 ) && == X 5 == == == Y 5 Y 7 Z 3

Praktisches Beispiel

Praktisches Beispiel Parsen der Formelsprache mit ANTLR public void ParseBackgroundFormula() { var stream = new ANTLRStringStream(this.BackgroundFormula); var lexer = new ExpressionLanguageLexer(stream); var tokens = new CommonTokenStream(lexer); var parser = new ExpressionLanguageParser(tokens); parser.treeadaptor = new ExpressionLanguageTreeAdaptor(); this.ast = new [] { parser.expression().tree as ExpressionLanguageCommonTree }; }

Microsoft Expression Trees AST IN C#

ExpressionTrees in C# Lambda Expressions vs. Expression Trees Func<int, bool> f = (x) => x==5; Expression<Func<int, bool>> ex = (x) => x == 5;

Expression Trees in C# Generierter Code private static void Main(string[] args) { Func<int, bool> f; Expression<Func<int, bool>> ex; [ ] Compiler bietet Zugriff auf den Syntax Tree zur Laufzeit ex = Expression.Lambda<Func<int, bool>>( Expression.Equal( CS$0$0000 = Expression.Parameter(typeof(int), "x"), Expression.Constant((int) 5, typeof(int)) ), new ParameterExpression[] { CS$0$0000 }); } return;

AST in DLR Sprachspezifisch Source Parser Sprachspezifischer AST Transform DLR AST Transform DLR

ExpressionTrees in C# 2010 2008

Übersetzung in Microsoft Expression Trees FORMELSPRACHE IN ACTION

Formelsprache in Action Generieren des Expression Trees var param = Expression.Parameter(typeof(int), "x"); Expression<Func<int, int>> ex2 = Expression.Lambda<Func<int, int>>( Expression.MakeBinary( ExpressionType.Subtract, param, Expression.Constant(1)), param);

Formelsprache in Action Compilieren des Expression Trees private static Func<Project, object> CompileFormula( ExpressionLanguageCommonTree ast) { var parameter = Expression.Parameter(typeof(Project), "p"); var expression = ProjectList.ConvertToExpressionTree(ast, parameter); var lambda = Expression.Lambda<Func<Project, object>>( Expression.Convert(expression, typeof(object)), parameter); } return lambda.compile();

Formelsprache in Action Ausführen des kompilierten Expression Tree public IEnumerable Projects { get { return from p in Project.DemoData select new { p.projectname, p.budget, p.totalcost, CustomCol = this.customcolumnfunction!=null? this.customcolumnfunction(p) : null, BackgroundColor = this.customcolumnfunction!=null? this.backgroundfunction(p) : null }; } }

Ressourcen zum Thema ANTLR ANTLR http://www.antlr.org/ Buch The Definitive ANTLR Reference auf Amazon

Fragen? R.STROPEK@CUBIDO.AT