250 likes | 468 Views
Interpreters. Study Semantics of Programming Languages through interpreters ( Executable Specifications ). Interpreters. Input : Representation of a program (AST) Output : “Meaning” of the program Interpreter vs Compiler
E N D
Interpreters Study Semantics of Programming Languages through interpreters (Executable Specifications) L8Interp
Interpreters • Input: • Representation of a program (AST) • Output: • “Meaning” of the program • Interpreter vs Compiler Interpreter carries out the meaning of a program, while a compiler transforms a program in one language into a program in a lower-level language preserving the meaning. L8Interp
Simple Expression Language <program> ::= <expression> <expression>::= <number> | <identifier> | <primitive> <operands> <operands> ::= () | (<expression> {,<expression>}*) <primitive> ::= + | - | *| add1 | sub1 E.g., 5 add1(+(3,j)) L8Interp
Informal Semanics • Number same as what Scheme associates with numerals. (internal to the entity) • Symbolic names value bound to it in the environment (external to the entity) • Application expression recursively evaluate operator and operands. primitive operators interpreted by Scheme. L8Interp
Example (Petite Scheme) > (just-scan "add1(+(1,3))") ((literal-string28 "add1" 1) (literal-string28 "(" 1) (literal-string28 "+" 1) (literal-string28 "(" 1) (number 1 1) (literal-string28 "," 1) (number 3 1) (literal-string28 ")" 1) (literal-string28 ")" 1)) L8Interp
Example > (scan&parse "add1(+(1,3))") (a-program (primapp-exp (incr-prim) ((primapp-exp (add-prim) ((lit-exp 1) (lit-exp 3)))))) > (eval-program (scan&parse "add1(+(1,3))")) 5 L8Interp
The Abstract Syntax (define-datatype program program? (a-program (exp expression?))) (define-datatype expression expression? (lit-exp (datum number?)) (var-exp (id symbol?)) (primapp-exp (prim primitive?) (rand (list-of expression?))) ) (define-datatype primitive primitive? (add-prim) (subtract-prim) (mult-prim) (incr-prim) (decr-prim)) L8Interp
The evaluator (define eval-program (lambda (pgm) (cases program pgm (a-program (body) (eval-expression body (init-env)))))) (define eval-expression (lambda (exp env) (cases expression exp (lit-exp (datum) datum) (var-exp (id) (apply-env env id) ) (primapp-exp (prim rands) (let ((args (eval-rands rands env))) (apply-primitive prim args)) ) ))) L8Interp
(cont’d) (define eval-rands (lambda (rands env) (map (lambda (x)(eval-rand x env)) rands))) (define eval-rand (lambda (rand env) (eval-expression rand env))) (define eval-rands (lambda (rands env) (map (lambda (x) (eval-expression x env)) rands))) L8Interp
(cont’d) (define apply-primitive (lambda (prim args) (cases primitive prim (add-prim () (+ (car args) (cadr args)) ) (subtract-prim () (- (car args) (cadr args)) ) (mult-prim () (* (car args) (cadr args)) ) (incr-prim () (+ (car args) 1) ) (decr-prim () (- (car args) 1) ) ))) (define init-env (lambda () (extend-env '(i v x) '(1 5 10) (empty-env)))) . . . Code for environment manipulation . . . L8Interp
Scanner Specification (define the-lexical-spec '((whitespace (whitespace)skip) (comment ("%" (arbno (not #\newline)))skip) (identifier (letter (arbno (or letter digit "_" "-" "?")))symbol) (number (digit (arbno digit))number)) ) L8Interp
Parser Specification (define the-grammar '((program (expression)a-program) (expression (number)lit-exp) (expression (identifier)var-exp) (expression (primitive "(" (separated-list expression ",") ")") primapp-exp) (primitive ("+")add-prim) (primitive ("-") subtract-prim) (primitive ("*") mult-prim) (primitive ("add1")incr-prim) (primitive ("sub1")decr-prim)) ) L8Interp
Example (Dr. Scheme) > (scan&parse "-(v,x)") #(struct:a-program #(struct:primapp-exp #(struct:subtract-prim) ( #(struct:var-exp v) #(struct:var-exp x) ) ) ) > (eval-program (scan&parse "-(v,x)")) -5 • Recall that v = 5 and x = 10 in init-env. L8Interp
Adding conditional • Concrete Syntax <expression> ::= if <expression> then <expression> else <expression> • Abstract Syntax if-exp(test-exp true-exp false-exp) • Addl. Semantic Function (define (true-value? x) (not (zero? x)) ) L8Interp
Addl. Interpreter Clause (if-exp (test-exp true-exp false-exp) (if (true-value? (eval-expression test-exp env)) (eval-expression true-exp env) (eval-expression false-exp env))) • Defined languagevsDefining language • Inductively defined data structure naturally leads to recursively defined function. L8Interp
Scanner Details > (just-scan "if while - Abc Def + # pqr") ((literal-string45 "if" 1) (identifier while 1) (literal-string45 "-" 1) (identifier Abc 2) (identifier Def 3) (literal-string45 "+" 4)) L8Interp
Local Bindings : Issues x = 5 x = 5 y=11 letx = 5 in lety = 6 + x inx + y; • Sub-expressions may be evaluated in different contexts/environments. letx = 5 in letx = 6 + x inx + x; • Inner x shadows outer x in nestedlet-body. x = 5 x = 11 L8Interp
x = 5 x = 5 x = 11 letx = 5 inletx = 6 + x inx + x * x; • Introducing let requires passing relevant environment to the evaluator. • Inner binding overrides the outer one in case of conflict. (Example Expression Value: 110) x = 5 L8Interp
Adding let • Concrete Syntax <expression> ::= let { <identifier> = <expression> } * in<expression> • Abstract Syntax let-exp (ids rands body) L8Interp
Introducing if and let expressions (define-datatype expression expression? . . . (if-exp (test-exp expression?) (true-exp expression?) (false-exp expression?)) (let-exp (ids (list-of symbol?)) (rands (list-of expression?)) (body expression?) ) ) L8Interp
Introducing if and let into the evaluator (define eval-expression (lambda (exp env) (cases expression exp . . . (if-exp (test-exp true-exp false-exp) (if (true-value? (eval-expression test-exp env)) (eval-expression true-exp env) (eval-expression false-exp env)) ) (let-exp (ids rands body) (let ((args (eval-rands rands env))) (eval-expression body(extend-env ids args env)) ) ) (else (eopl:error 'eval-expression "Not here:~s" exp)) ))) L8Interp
Variable-free Arithmetic Expressions syntax (program) semantics structure (Scheme) (Integers, +, *,…) Evaluator Semantics (meaning) Integer CALCULATOR Recapitulation L8Interp
Arithmetic Expressions syntax (program) semantic structure (Scheme) Environment; (Integers, +, *,…) Evaluator Semantics (meaning) Integer CALCULATOR WITH MEMORY L8Interp
Arithmetic Expressions; Procedure Definitions and Calls syntax (program) Environment; (Integers, +, *,…); Addl. Scheme Support semantic structure (Scheme) Evaluator Semantics (meaning) Integer; Procedures PROGRAMMABLE CALCULATOR L8Interp
Polynomial Calculators • To specify/design a programmable polynomial calculator, the object language must contain syntax for creating and manipulating polynomials, and • the meta-language (Scheme) must provide suitable semantic structure • to map variables to polynomials (environment). • to interpret operations on polynomials (using corresponding Scheme code). • Meta-language support is analogous to hardware support. • The semantics of the ADT Polynomials can be specified through algebraic techniques. L8Interp