Introducon - Columbia Universityaho/cs4115_Spring-2009/lectures/09-04-29_FIRE.pdfIntroducon Friendly...

Preview:

Citation preview

Introduc)on

TristanNaumann

SaharHasan

SteveHehl

BrianLu

Introduc)on

FriendlyInterac)veRecursionEducator(FIRE)•  Recursionisoneofthemostdifficulttopicsfornoviceprogrammerstounderstand

•  Teachthroughinterac)vevisualiza)on:usersseetheprogressionofrecursivecallsandthepropaga)onofresultsbacktotheoriginalcall

•  Simplesyntax:more)melearningrecursion,less)medebuggingcode

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Keywordssignifyingthebeginningoftherecursivefunc)ondefini)on

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Returndatatype

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Func)onname

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Comma‐delimitedparameterlist

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Indentedblockofbasecasesoftheform:{condi)on}returnVal

Syntax

AnexampleusingtheFibonaccinumbers:

define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)

Indentedblockoftheimplicitlyreturnedrecursivecase:{}recursiveCall

Syntax

Othersyntac)calfeatures•  Watchblock:comma‐delimitedlistofvariableswhosevaluestheuserwishestotrack

•  Explicitcondi)onals(if/else)andloops(for,while)

•  Built‐infunc)onsforlists•  Printstatementsandcomments

Syntax

Whitespacing•  FIREusesPython‐basedwhitespaceindenta)onforblockdelimi)nginsteadofcurlybraces

•  Indenta)onfollowscertainstatementsandsignifiesthebeginningofablock

•  Dedenta)onsignifiestheendofablock

Syntax

Advantages•  Makescodemorereadable

•  Easiertowritebecausededentsareautoma)callymatchedtoindentsfortheuser

Disadvantages

•  Hardertoimplementbecauseindenta)onlevelsmustbetrackedusingastackasopposedtosimplydetec)ngmatchingbraces

Syntax

Stackimplementa)onnotesfromPython•  Foreachline,compareindenta)onleveltotopofstack(ini)allycontainsonepushed0)–  Ifequal,donothing–  Iflarger,pushontostackandissueINDENT–  Ifsmaller,popallnumbersonstackthatarelargerandissueDEDENTforeach

•  OnEOF,issueremainingDEDENTS

Output

Screenshotofarecursivecallstep

Output

Screenshotofareturnvaluepropaga)ngback

SystemArchitecture

Overview

ANTLRInputStream Lexer WSFilter Common

TokenStream

ParserString

Template Fire.java Javacompiler

Fire.classJVM

Errorchecking+scoping

Characters Tokens

Parsed

GUIpackage Backend Frontend

Userfile

SystemArchitecture

Overview

ANTLRInputStream Lexer WSFilter Common

TokenStream

ParserString

Template Fire.java Javacompiler

Fire.classJVM

Errorchecking+scoping

Characters Tokens

Parsed

GUIpackage Backend Frontend

Userfile

SystemArchitecture

Overview

ANTLRInputStream Lexer WSFilter Common

TokenStream

ParserString

Template Fire.java Javacompiler

Fire.classJVM

Errorchecking+scoping

Characters Tokens

Parsed

GUIpackage Backend Frontend

Userfile

SystemArchitecture

Overview

ANTLRInputStream Lexer WSFilter Common

TokenStream

ParserString

Template Fire.java Javacompiler

Fire.classJVM

Errorchecking+scoping

Characters Tokens

Parsed

GUIpackage Backend Frontend

Userfile

SystemArchitecture

Overview

ANTLRInputStream Lexer WSFilter Common

TokenStream

ParserString

Template Fire.java Javacompiler

Fire.classJVM

Errorchecking+scoping

Characters Tokens

Parsed

GUIpackage Backend Frontend

Userfile

SystemArchitecture

Developmenttools•  EclipseGanymede+Subeclipse

•  ANTLRv3+StringTemplate3.2

•  JavaSE6+SwingManagementtools

•  GoogleCode•  GoogleDocs

Tes)ng

Mul)‐stagetes)ngapproach•  Unittes)ngwhitespacing•  Unittes)nggrammarproduc)onrules

•  Usertes)ngfullexamples

Tes)ng

Whitespacetes)ngSource(fibonacci.fire) Tokenstreamoutput

define recursive int fibonacci (int n): <DEFINE> <WS> <RECURSIVE> <WS> <TINT> <WS> <NAME> <WS> <LPAREN> <TINT> <WS> <NAME> <RPAREN> <COLON> <NEWLINE>

base: <INDENT> <BASE> <COLON> <NEWLINE>

{n == 0} 0 <INDENT> <LCURLY> <NAME> <WS> <EQ> <WS> <INT> <RCURLY> <WS> <INT> <NEWLINE>

{n == 1} 1 <LCURLY> <NAME> <WS> <EQ> <WS> <INT> <RCURLY> <WS> <INT> <NEWLINE>

recursive: <DEDENT> <RECURSIVE> <COLON> <NEWLINE>

{ } fibonacci(n–1) + fibonacci(n–2) <INDENT> <LCURLY> <WS> <RCURLY> <WS> <NAME> <LPAREN> <NAME> <MINUS> <INT> <RPAREN> <WS> <PLUS> <WS> <NAME> <LPAREN> <NAME> <MINUS> <INT> <RPAREN> <NEWLINE>

<DEDENT> <DEDENT>

Tes)ng

Grammarproduc)ontes)ng

Outputresultofcomparison

Equivalent(PASS) Notequivalent(FAIL)

Tester:TranslateprogramtoJavaandcomparetotargetcode

Inputs

FIREProgram Javatargetcode

Conclusion

Lessonslearned•  User‐friendlylanguagesarehardertowriteandtest

•  Pythonasareferencelanguage:noteverythingtranslateswelltoJava

Futureimprovements

•  Supportforcorecusion•  Mul)pletypesofoutput

Conclusion

Keybenefits•  Supportsmanycommonrecursionsofmul)pletypes

•  Shallowlearningcurve;codeisbotheasytowriteandunderstand

•  Automatedinstrumenta)onofthecodeandvisualoutput

Recommended