Top Banner
Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2. November 2015 A. Schramm 2. November 2015 1/39
45

Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

May 14, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

MetaprogrammingConcepts of Programming Languages

Alexander Schramm

Institut für Softwaretechnik und Programmiersprachen

2. November 2015

A. Schramm 2. November 2015 1/39

Page 2: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Table of Contents

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 2/39

Page 3: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 3/39

Page 4: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Motivation

Which issues do we want to tackle?

I Avoid writing boilerplate codeI Write code that shows our intentionI Expand the syntax of languagesI Write type independent code in strongly typed languages

A. Schramm 2. November 2015 4/39

Page 5: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

What is Metaprogramming

Definition: MetaprogrammingMetaprograming describes different ways to generate and manipulate code

Differentations:

I Compile time vs. runtime metaprogrammingI Domain language vs. host language

A. Schramm 2. November 2015 5/39

Page 6: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Differentations of Metaprograms

Compile time MetaprogrammingWays to manipulate or generate code during compilation, e.g: Macros,Templates

Runtime MetaprogrammingWays to manipulate or generate code, while it is executed, e.g: dynamicmethods, Reflections

A. Schramm 2. November 2015 6/39

Page 7: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Differentations of Metaprograms

Domain LanguageThe Programming Language, in which the metaprogram is written

Host LanguageThe Programming Language of the generated code

I Can be different (YACC, Compilers)I Domain language can be a subset of the host language (C++ Templates)I Domain language can be an integral part of the host language (Ruby)

A. Schramm 2. November 2015 7/39

Page 8: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 8/39

Page 9: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Runtime Reflection in Java

What is Reflection?

I Get metadata about an object at runtimeI What is its classI Which methods does it respond to

Example: The Class object

Class<Date> c1 = java.util.Date.class;System.out.println( c1 ); // class java.util.Date

for (Method method : c1.getMethods()){System.out.println(method.getName())

}

A. Schramm 2. November 2015 9/39

Page 10: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Usage of Reflections

Reflection is used by the JUnit test framework to find test methods.

Example: Test case parser

public void parse(Class<?> clazz) {Method[] methods = clazz.getMethods();for (Method m : methods) {

if (m.isAnnotationPresent(Test.class)) {m.invoke(null);

}}

}

A. Schramm 2. November 2015 10/39

Page 11: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Runtime Reflection in Java

The Class object:

I Represents metadata about a class at runtimeI Metadata can be added by annotations (@RunWith(. . . ))

Conclusion:I Not really metaprogramming (no code manipulation happening)I Example of a runtime object model (more in a second)I Bad performance!

A. Schramm 2. November 2015 11/39

Page 12: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 12/39

Page 13: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Runtime Metaprogramming in Ruby

What is Ruby:

I dynamic, interpreted high level languageI has a rich, accessible runtime object modelI depends on metaprogramming techniques

Usage of an object model:

I In most languages most information about structure is lost aftercompilation

I The object model represents this structure at runtimeI Rubys object model can be manipulated

A. Schramm 2. November 2015 13/39

Page 14: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby interpreter

How does the Ruby interpreter work?

I Uses the object model to evaluate codeI Therefore manipulation of the object model manipulates the program

Example: Manipulating code at runtime

class Testdef show; puts "a"; enddef self.redefine

define_method(:show){puts "b"}end

end

t = Test.newt.show # => "a"Test.redefinet.show # => "b"

A. Schramm 2. November 2015 14/39

Page 15: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby Object Model

How is the object model structured?

I Every class/module has a corresponding objectI Every instance of a class has an objectI Methods live in the class of the objectI Many language constructs have an objectI Every object has a class (and most times a singleton class)I What is the class of a class object?

I A class object has the class ClassI Class methods live in the singleton/eigenclass of the class object

A. Schramm 2. November 2015 15/39

Page 16: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby Object Model

How is the object model structured?

I Every class/module has a corresponding objectI Every instance of a class has an objectI Methods live in the class of the objectI Many language constructs have an objectI Every object has a class (and most times a singleton class)I What is the class of a class object?

I A class object has the class ClassI Class methods live in the singleton/eigenclass of the class object

A. Schramm 2. November 2015 15/39

Page 17: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby Object Model

alex Personclass

#Personclass

Object

superclass

#Objectclass

superclass

Class

superclass class Persondef name;end

end

alex = Person.new

A. Schramm 2. November 2015 16/39

Page 18: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby Object Model

alex

Person

nameclass#Person

class

Object

superclass

#Objectclass

superclass

Class

superclass

class Persondef name;end

def self.class_methodend

end

alex = Person.new

A. Schramm 2. November 2015 17/39

Page 19: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby Object Model

alex

Person

nameclass

#Person

class_methodclass

Object

superclass

#Objectclass

superclass

Class

superclass

class Persondef name;end

def self.class_methodend

end

alex = Person.new

class << alexdef singleton_methodend

end

A. Schramm 2. November 2015 18/39

Page 20: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

The Ruby Object Model

alex

Person

name

class

#Person

class_methodclass

Object

superclass

#Objectclass

superclass

Class

#Alex

singleton_method

superclass

superclass

class Persondef name;end

def self.class_methodend

end

alex = Person.newclass << alex

def singleton_methodend

end

A. Schramm 2. November 2015 19/39

Page 21: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Method Lookup

alex

Person

name

class

#Person

class_methodclass

Object

superclass

#Objectclass

superclass

Class

#Alex

singleton_method

superclass

superclass

1. Call obj.method

2. Go one step right

3. Use method if defined, else goone up

4. Repeat step 3 until the methodis found

5. Callobj.method_missing('method')

A. Schramm 2. November 2015 20/39

Page 22: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Method Missing example

One could use method_missing('method') to implement methods.JBuilder does this for Json generation:

Example: Using JBuilder

json.firstName "John"json.lastName "Smith"json.age 25json.children(@children) do |child|

json.name child.nameend

A. Schramm 2. November 2015 21/39

Page 23: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Further Usages

What else can be done?

I Define classes at runtime: newClass = Class.new do ... end

I Alias methodsI Remove methodsI Evaluate strings as codeI Hook into runtime events: included, method_added, inherited,

. . .

A. Schramm 2. November 2015 22/39

Page 24: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 23/39

Page 25: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

I Templates are a compile time mechanism to define type independentcode

I How: Definition of a Template, which will generate a method withappropriate types when the template is used

Example: C++ Template

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

A. Schramm 2. November 2015 24/39

Page 26: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

What will be generated?

I max(1,2)

I int max(int a, int b)

I max("a","b")

I string max(string a, string b)

I max(1,"a")

I No such function Error

A. Schramm 2. November 2015 25/39

Page 27: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

What will be generated?

I max(1,2)I int max(int a, int b)

I max("a","b")

I string max(string a, string b)

I max(1,"a")

I No such function Error

A. Schramm 2. November 2015 25/39

Page 28: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

What will be generated?

I max(1,2)I int max(int a, int b)

I max("a","b")

I string max(string a, string b)

I max(1,"a")

I No such function Error

A. Schramm 2. November 2015 25/39

Page 29: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

What will be generated?

I max(1,2)I int max(int a, int b)

I max("a","b")I string max(string a, string b)

I max(1,"a")

I No such function Error

A. Schramm 2. November 2015 25/39

Page 30: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

What will be generated?

I max(1,2)I int max(int a, int b)

I max("a","b")I string max(string a, string b)

I max(1,"a")

I No such function Error

A. Schramm 2. November 2015 25/39

Page 31: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

template <typename T>T max(T x, T y){

if (x < y)return y;

elsereturn x;

}

What will be generated?

I max(1,2)I int max(int a, int b)

I max("a","b")I string max(string a, string b)

I max(1,"a")I No such function Error

A. Schramm 2. November 2015 25/39

Page 32: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

C++ Templates

I Templates are actually a turing complete, functional languageI Everything is immutableI Therefore no loopsI But: Recursion with template specialization

Example: Template specialization

template <unsigned n, bool done = (n < 2)>struct fibonacci {static unsigned const value =

fibonacci<n-1>::value +fibonacci<n-2>::value;

}template <unsigned n>struct fibonacci<n, true> {

static unsigned const value = n;}

A. Schramm 2. November 2015 26/39

Page 33: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Template Specialization

Template specialization can be used for more:

I Generic implementation for most types, but specialised for specific typesI Vector template as array of the typeI But not for booleans, because of space (16-32 bit)

I Partial specialization vs. full specialization

Example: Template specialisation for performance

template <typename T>class vector{T* vec_data;

}

template <>class vector <bool>{unsigned int* vec_data;

}

A. Schramm 2. November 2015 27/39

Page 34: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 28/39

Page 35: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Haskell Templates

What is Haskell?

I Statically typed, purely functional languageI Template mechanism similar to C++I Access to the abstract syntax tree (AST)

How can we use that?

I Write constructs which imitate language level syntaxI Write domain specific languagesI Extend the languageI Adapt the language to a problem domain

A. Schramm 2. November 2015 29/39

Page 36: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Haskell Templates

Example: Typesafe println macrointToString :: Integer -> String

data Format = Int | Str | Lit String

parse :: String -> [Format]parse "" = []parse ('%' : 'i' : rest) = Int : parse restparse ('%' : 's' : rest) = Str : parse restparse (c:str) = Lit c : parse rest

gen :: [Format] -> Exp -> Expgen [] acc = accgen (Int : xs) acc = [| \n -> $(gen xs [| $acc ++ intToString n |]) |]gen (Str : xs) acc = [| \s -> $(gen xs [| $acc ++ s |]) |]gen (Lit s : xs) acc = gen xs [| $acc ++ $(stringE s) |]

sprintf :: String -> Expsprintf str = gen (parse str) [| "" |]

-- $(sprintf "Error: %s on line %d") msg line generates:-- (\s_0 -> \n_1 -> "" ++ "Error: " ++ s_0 ++ " on line " ++ intToString

n_1) msg line↪→

A. Schramm 2. November 2015 30/39

Page 37: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 31/39

Page 38: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Lisp

The Lisp programming language

I One of the oldest programming languages still in useI Many implementations: Clojure, Common Lisp, Scheme . . .I Very simple, straightforward syntax: S-Expressions

An S-Expression is either

I an atom (a identifier) orI in the form (a b) where a and b are S-ExpressionsI The first member of the list is treated as a method call, the rest as its

arguments

Example: Lisp Syntax

(list 1 2 (list 3 4))(+ 3 4 5)(set x (list 3 4))

A. Schramm 2. November 2015 32/39

Page 39: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Macros

What are macros

I Construct and manipulate the ASTI They look very similar to normal methodsI They are actually called exactly like normal methods

Code as data

I Lets look at the valid Lisp program (+ 2 3 4)

I It’s a call to the + method with the argument 2, 3 and 4I At the same time it’s a list of the 4 atoms +, 2, 3 and 4I Data can be manipulated, code is data, therefore code can be

manipulated

A. Schramm 2. November 2015 33/39

Page 40: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Write Macros

Example: How to write a Macro

(defmacro unless (condition x y)`(if (not ~condition) ~x ~y)

)

I Arguments passed to a macro are not evaluatedI Allow evaluation with ~(+ 2 3)

I Macros should return valid Lisp codeI Generate unevaluated lists with '(a b c)I Unevaluated list except macros `(a b c)

A. Schramm 2. November 2015 34/39

Page 41: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Use Macros

Example: How to use a macro

(unless (> a b) (set x a) (set x b))

I Macros are called just as normal functionsI Good for newcommers to Lisp: no knowledge of macros needed

A. Schramm 2. November 2015 35/39

Page 42: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Usecases of Macros

What can macros be used for?

I Extend the language with constructs that look like language levelconstructs

I Write domain specific languagesI Adapt the language to a specific problemI Write more readable codeI Write more concise code

A. Schramm 2. November 2015 36/39

Page 43: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Outline

Introduction

Runtime Reflection in Java

Runtime Metaprogramming in Ruby

C++ Templates

Haskell Templates

Lisp Macros

Conclusion

A. Schramm 2. November 2015 37/39

Page 44: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Conclusion

More Metaprogramming:

I Groovy language with runtime and compile time metaprogramming onthe JVM

I Macros in ScalaI Macros in Elixir, a Ruby like, functional language

When to use Metaprogramming?

I Depends on the languageI Metaprogramming can lead to bad and good codeI Always evaluate all approaches to solve a problem

A. Schramm 2. November 2015 38/39

Page 45: Metaprogramming - Concepts of Programming Languages · Metaprogramming Concepts of Programming Languages Alexander Schramm Institut für Softwaretechnik und Programmiersprachen 2.

Conclusion

Questions?

A. Schramm 2. November 2015 39/39