0 # install nodejs # install git git clone - - PowerPoint PPT Presentation

0
SMART_READER_LITE
LIVE PREVIEW

0 # install nodejs # install git git clone - - PowerPoint PPT Presentation

Control Flow . . 0 # install nodejs # install git git clone https://github.com/loveencounterflow/CONTROLFLOW.git cd CONTROLFLOW npm install ./coffee try-catch-3.coffee Control Flow: The way we move through the elements that make up the


slide-1
SLIDE 1

Control Flow . .

# install nodejs # install git git clone https://github.com/loveencounterflow/CONTROLFLOW.git cd CONTROLFLOW npm install ./coffee try-catch-3.coffee

slide-2
SLIDE 2

Control Flow: The way we move through the elements that make up the program and cause things to happen

crunching numbers flipping switches and painting pong on to the screen

slide-3
SLIDE 3

Control Flow

history

. .

1

slide-4
SLIDE 4

this is a program that was written hard-wired

  • n an ibm 444

(a programmable accounting calculator)

slide-5
SLIDE 5
slide-6
SLIDE 6

this is a scientist in the late 1950s / early 1960s doing neurological / psychological research

slide-7
SLIDE 7
slide-8
SLIDE 8

this is what a program library looks like when you’re using plugboards (as one Texan company still does—in 2013, no less!)

slide-9
SLIDE 9
slide-10
SLIDE 10

in 1945, John von Neumann came up with the idea that programs themselves can be represented as data; this became implemented by 1948 it thereby became possible to program by entering seri of numbers that represented machine code

slide-11
SLIDE 11

in the 1950s, Grace Hopper (1906–1992) had the idea to collect such programs in ‘libraries’ and to ‘call functions’ (like you ‘call a book’ in a real-world library) this led to a-0, the world’s rst compiler, which later became Arith-Matic and Math-Matic. next, she came up with the idea to write programs in quasi-natural language she developed the rst eloquent programming language in history, Flow-Matic, between 1953 and 1959; this would later become Cobol here is a Flow-Matic code snippet:

slide-12
SLIDE 12

# sample.flow-matic # A sample (slightly edited): .................................................................................... (0) input inventory file-a price file-b;

  • utput priced-inv file-c unpriced-inv file-d;

hsp d. .................................................................................... (1) compare product-no (a) with product-no (b); if greater go to operation 10; if equal go to operation 5;

  • therwise

go to operation 2. .................................................................................... (2) transfer a to d. (3) write-item d. (4) jump to operation 8. .................................................................................... (5) transfer a to c. (6) move unit-price (b) to unit-price (c). (7) write-item c. (8) read-item a; if end of data go to operation 14. (9) jump to operation 1. .................................................................................... (10) read item b; if end of data go to operation 12. (11) jump to operation 1. .................................................................................... (12) set operation 9 to go to operation 2. # Holy Cow! Metaprogramming! (13) jump to operation 2. .................................................................................... (14) test product-no (b) against zzzzzzzzzzzz; if equal go to operation 16;

  • therwise go to operation 15.

(15) rewind b. .................................................................................... (16) close-out files c; d. (17)

  • stop. (end)
slide-13
SLIDE 13
  • ne can immediately see the huge step forward

that Hopper had made code execution happens from top to bottom with explicitly labelled GOTOs ...which is conceptually simple, but doesn’t scale well already in 1968, Dijkstra wrote his famous GOTO considered harmful

slide-14
SLIDE 14

‘simple’ doesn’t always equal ‘readable’ when branching, most of the time the condition comes before the conclusion:

if a < 0 then print "negative"

but sometimes we seem to be happier with the inversion of that (‘postx i’, possibly introduced by Perl):

print "negative" if a < 0

slide-15
SLIDE 15

forth has maybe the most ‘logical’ control ow

(among higher languages)

every line is read strictly from le to right; everything is either a data item or a postx operator

(except r ‘word’ definition, which a bracketing operator)

: FLOOR5 DUP 6 < IF DROP 5 ELSE 1 - THEN ;

but ... who is using a stack-based language these days?

(LISP (is not (all too) (popular, either)))

slide-16
SLIDE 16

functions and macros in Hopper’s a-0, subroutine calls could either remain in their original location on tape (incurring a time penalty)

  • r be inlined

(incurring a space penalty) this is the origin of functions and macros

T EXcomes to mind, a programming language that does everything the inline/expanding way

today, the options for control ow have multiplied

slide-17
SLIDE 17

Control Flow

intro

. .

2

slide-18
SLIDE 18
slide-19
SLIDE 19
slide-20
SLIDE 20

contiguous

slide-21
SLIDE 21

contiguous & beyond CTYR (call, throw, yield, return) are basic constructs that break out of contiguous mode

like subtraction and division break out of natural-number and integer-number mode

call may be non-blocking, which leads to asynchronous mode; throw gives you exceptional mode; yield gives you iteration; return goes back to ... anywhere! Kansas maybe!

slide-22
SLIDE 22

Control Flow

exceptions

. .

3

slide-23
SLIDE 23

exceptional

contractual

each language function(ality) has a usage contract when that contract gets violated, an ‘exception is thrown’; execution / control ow then recursively ‘falls back’ to caller

exceptions contract

(1) exceptions are thrown i there is a breach of contract (2) exceptions carry a ‘routing slip’ (a stacktrace) with all the le names, function names, and line numbers they fell through (3) you can catch them within a catch clause

slide-24
SLIDE 24

exceptional

contractual, handled

example:

# try-catch-stacktrace.coffee f = -> try Rg = g() catch Rx # note: imagine `Rx = catch` or `catch as Rx` here ... g = -> return h() h = -> throw Rh

slide-25
SLIDE 25

exceptional

contractual f and h don’t know about each other

but if f catches an exception, it may have come from h so while f just wanted to talk to g suddenly it’s being talked to by h this can be hard to grasp

slide-26
SLIDE 26

exceptional

handled

control ow in Python’s exception handling constructs can be dicult:

# exception-clauses.py try: do_1a() do_1b() # only executed if `do_1a` was OK except Exception_class_2a as error_2a: # only up to one `except` clause gets executed; do_2a() # although these get executed *before* `finally`, any exception # raised will only get effective *after* `finally` has finished except Exception_class_2b as error_2b: # (without raising an exception) do_2b() else: # only if `do_1x` was OK; used to avoid catching exceptions do_3() # from other sources than `do_1x` finally: # executed after `do_3`; exceptions will be re-raised do_4()

slide-27
SLIDE 27

(this slide originally about why i never use Python’s for / in / else) #1 when googling ‘python else clause for in statement’: conceptual stackoverow.com

—I’ve noticed the following code is legal in Python. My question is why? Is there a specic reason?

n = 5 while n != 0: print n n -= 1 else: print "what the..."

—Wow, I never even knew about this. —That’s because most people avoid this construct. :) I believe Guido mentioned during the Py3k process that, at the very least, the choice of the word else for this use had been a remarkably bad idea, and that they wouldn’t be doing any more of these.

slide-28
SLIDE 28

exceptional

broken

example:

# try-catch-no-stacktrace.coffee f = -> f() f()

in JavaScript the exceptions contract is broken here because of missing stacktrace which can be very annoying to debug

slide-29
SLIDE 29

exceptional

broken

Java and some frameworks are dreaded for their long stacktrac; conversely, some exceptions in JavaScript do not have stacktrac at all exceedingly long stacktraces missing stacktraces incomplete stacktraces (resulting from asynchronous calls) falsely positive and negative exceptions and exceptions you can’t catch in a catch clause may be regarded as broken exceptions

slide-30
SLIDE 30

exceptional

contractual / handled / asynchronous & slightly broken

example:

# try-catch-0.coffee f = -> log g() g = -> return h() h = -> return k() k = -> return d[ 'x' ] f()

slide-31
SLIDE 31

asynchronous / coöperative ... and ... handling exceptions ...? exceptions thrown by asynchronous code can not be handled in a try / catch clause in NodeJS, you can use process.on 'uncaughtException' and that’s what i do in coeenode-stacktrace:

# This is *so* 1990s VBA! process.on 'uncaughtException', ( error ) => @log_stacktrace error

slide-32
SLIDE 32

source maps

UglifyJS 2, now with live source map demo https://github.com/mishoo/UglifyJS2 http://lisperator.net/uglifyjs/#demo e Breakpoint Ep 3: e Sourcemap Speacular with Paul Irh and Addy Osmani http://www.youtube.com/watch?feature=player_detailpage&v=HijZNR6kc9A Mozia Source Maps NodeJS module https://github.com/mozilla/source-map Colorized CoeeScript stack traces https://github.com/xenomuta/coee-trace

slide-33
SLIDE 33

Control Flow

  • rder of evaluation / inline control ow

. .

4

slide-34
SLIDE 34

exceptions as a tool inline expression control ow—can’t be so dicult!!?

d[ key ] = g( x * 2, y + 1 )

Q: in what order are the sub-exprsions evaluated? A: it depends!

# order-of-evaluation

slide-35
SLIDE 35
slide-36
SLIDE 36

exceptions as a tool Q: but do that bit of a difference matter at all? A: it depends!

# launch

slide-37
SLIDE 37

clearly, it would be nice to have a good way to picture control ow but all that exists is of marginal popularity

(uml ‘Activity Diagrams’ are ... Flowcharts!)

vualized control flow doomed like 3d detops & graphical programming languag?

slide-38
SLIDE 38

Control Flow

... back to the beginning

. .

5

slide-39
SLIDE 39
slide-40
SLIDE 40
  • utsourced / packaged

blocking

code in function runs to completion it is completed when return is encountered

iterative

code runs until yield is encountered

yield can return a value

function may resume; state is preserved in closure

deferred

a function f is called that returns ‘immediately’ it may cause an action g to run in parallel an event e may become available at the earliest on the next turn

slide-41
SLIDE 41

parallel / preëmptive

forked

code runs in other process on same machine

remote

code runs on another cpu

threaded / dreaded

several instances of the same process run in the same shared memory

slide-42
SLIDE 42

Control Flow

folded asynchronous code

. .

6

slide-43
SLIDE 43

asynchronous / coöperative

http://ejohn.org/blog/how-javascript-timers-work

# intervals.coffee

callbacks

pass in callback function when calling an async method return value of async method most of the time throwaway value most of NodeJS api works like this

evented

calling async method returns an Event Emitter to which listeners may be bound; JS Promises/A+ builds on this see https://github.com/kriskowal/q

folded

code looks like it’s synchronous—but it’s not!

slide-44
SLIDE 44

asynchronous folded code discovered this is @ http://pogoscript.org & https://github.com/jiangmiao/toee-script:

read_file '/tmp/whatever.txt', ( error, text ) -> throw error if error? log "here is the text:", text log "the file is being read; results to be announced shortly"

becomes:

log "going to read file" text = read_file! '/tmp/whatever.txt' log "here is the text:", text

  • r even:

log "going to read file" try text = read_file! '/tmp/whatever.txt' catch error throw error log text

slide-45
SLIDE 45

asynchronous folded code discovered this is @ http://pogoscript.org & https://github.com/jiangmiao/toee-script:

read_file '/tmp/whatever.txt', ( error, text ) -> throw error if error? log "here is the text:", text log "the file is being read; results to be announced shortly"

becomes:

log "going to read file" text = read_file! '/tmp/whatever.txt' log "here is the text:", text

  • r even:

log "going to read file" try text = read_file! '/tmp/whatever.txt' catch error throw error log text

slide-46
SLIDE 46

asynchronous folded code

  • bservations:

it do look tempting! but what if you wanted to have code executed right aer the call?? how do they do it? well, maybe that’s part of the problem...

slide-47
SLIDE 47

Lo and Behold. Just look at it.

# async-folded-toffee.toffee # async-folded-toffee.js # async-folded-pogo.pogo # async-folded-pogo.js # async-folded-try-catch-pogo.pogo # async-folded-try-catch-pogo.js

slide-48
SLIDE 48

The End. . .

7

slide-49
SLIDE 49

kthxbye https://github.com/loveencounterow/CONTROLFLOW

slide-50
SLIDE 50

extras . .

8

slide-51
SLIDE 51

JavaScript Hoisting # hoisting.js JavaScript Timers # intervals.coffee