Snek: Baby Python Keith Packard Principal Engineer Sifive [email protected] @Keith X11

Snek: Baby Python Keith Packard Principal Engineer Sifive Keithp@Keithp.Com @Keith X11

Snek: Baby Python Keith Packard Principal Engineer SiFive [email protected] @keith_x11 Lego Robotics Class ● 10 students ages 10-12 – 3-4 years of Lego-based instruction already ● 1-2 TAs ages 13-18 – Former students ● 2 teac ers ! 2 adult "olunteers ● 3 languages – Logo on Macintos wit Lego control panel – Robolab on Lego RCX – 'ne( on Arduino and Sne(board ● Coo%erati"e )n"ironment #y First Lego Computer ● A%%le ][ ,-.02!0 ● Flo%%y Dis( ● Plug-in controller bo3 ● Lego4 so many Lego ● Logo Language Logo Code forever [ talkto 1 onfor 10 sleep 10 ] Arduino ● 8-bit Atmega 328 ● C++ language ● IDE on deskto% Arduino Code Fireworks ● 1uemilanove ● '2I-based L)1 driver ● 26# undreds of L)1s 2roject Goals ● 2ython-inspired synta34 9AS5C- inspired scale ● Run on a Duemilano"e ● 'mall enoug to e3%lore in a fe$ ours 'ne( ● Small 'oC – ATmega 3282 – RISC-: – ARM Cortex-# ● 2yt on-com%atible ● 51) on des(to% – sne(de – mu 'nek Line 9ug while True: talkto(M1) setright() on() while read(A1) > 0.35: pass off() talkto(M3) setleft() on() while read(A1) < 0.35: pass off() Circuit 2yt on ● 9ased on Micro Pyt on ● Larger language (objects, etc) text data bss dec hex filename 64440 48 21080 85568 14e40 snek.elf 246912 964 7124 255000 3e418 circuit-python.elf ● More so% isticated G25; usage Circuit Pyt on )3ample import time import board from digitalio import DigitalInOut, Direction, Pull led = DigitalInOut(board.D13) led.direction = Direction.OUTPUT switch = DigitalInOut(board.D2) switch.direction = Direction.INPUT switch.pull = Pull.UP while True: if switch.value: led.value = False else: led.value = True time.sleep(0.01) # debounce delay 'nek )3ample talkto(M1) while True: if read(A1): on() else off() mu < a Python 51) ● An ID) for writing Pyt on4 written in Pyt on= ● 'u%%ort for #icroPyt on devices ● Easily extended to su%%ort Sne( ● #erge Request %ending u%stream Editing 'nek with Mu Editing 'nek with 'nekde Language 5mplementations ● Direct inter%retation – 9A'5C4 LI'2 – Source code is t e executable ● 9ytecode – 2yt on4 'ne(4 2erl4 Ruby4 ?a"ascri%t4 ?a"a4 @ – Com%iler out%ut runs on a virtual mac ine ● Com%iled – Rust4 C4 Fortran – Com%iler out%ut runs directly on t e C2A Snek 5mplementation Compiler Virtual Machine HW Support Memory Manager 'nek :alues ● 32-bit 5))) Boat ● Tu%leCListC1ictionary ● 'tring ● Com%iled Function ● 9uiltin Function ● True4 False4 Done NaN-o-Rama sign exponent(8-bit) fraction (23-bit) 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =0.15625 31 23 0 ● )3%onent == 03ff → DaD – 16 million NaNs! sign exponent(8-bit) value (21-bit) tag 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 =string@8 31 23 2 0 Code(aizen +CC 9G 3=0 , tt%s:CCcreati"ecommons=orgClicensesCby/3=00* 'nek Compiler ● LL,1) table-driven parser using Lola ● Iand-written le3er ● ;ld-sc ool direct code generation ● About 1500 lines of code Lola ● Parser generator (written in Pyt on0 ● 'mall %arser – Lola: 3600 code ! 1200 data – Bison: 4400 code + 6000 data formal : NAME @{ snek_parse_formals[snek_parse_nformal++] = snek_token_val.id; }@ opt-named-p ; while-stat : @{ /* push 0 - top_off */ value_push_offset(snek_code_current()); }@ WHILE expr COLON @{ snek_code_add_op_offset(snek_op_branch_false, 0); /* push 1 - while_off */ value_push_offset(snek_compile_prev); }@ suite @{ /* push 2 - loop_end_off */ snek_code_add_op_offset(snek_op_branch, 0); value_push_offset(snek_compile_prev); /* push 3 - while_else_stat_off */ value_push_offset(snek_code_current()); }@ while-else-stat @{ patch_loop:; snek_offset_t while_else_stat_off = value_pop().offset; snek_offset_t loop_end_off = value_pop().offset; snek_offset_t while_off = value_pop().offset; snek_offset_t top_off = value_pop().offset; snek_code_patch_branch(while_off, while_else_stat_off); snek_code_patch_branch(loop_end_off, top_off); snek_code_patch_forward(while_off, loop_end_off, snek_forward_continue, top_off); snek_code_patch_forward(while_off, loop_end_off, snek_forward_break, snek_code_current()); }@ ; 'nek :# ● 'tack wit Accumulator ● 61 o%codes – 39 expression operators (+, -, =, …0 – Python-s%ecific operators like “slice” ● Don-recursive im%lementation – C stac( stays wit in kno$n bounds 'nek Bytecode 0: line 1 3: int ^ 10 5: range_start 1 0 i > for i in range(10): 11: range_step 36 0 i + print("hello %d" % i) 17: line 2 + 20: id ^ ( 60) print 23: string ^ hello %d 26: id ( 85) i 29: mod ^ 30: call 1 position 0 named 33: branch 11 'nek #emory Manager ● #ark & '$ee% Garbage Collector – uses only one ea% ● Com%acting – smooshes allocated ob7ects all together ● 5ncremental – frees unused ob7ects in c un(s ● 9ounded Recursion – Knite stack usage during collect Memory #anagement Tricky Pyt on Bits ● Le3ical $ ite s%ace – differs between R)2L and Kles – error recovery is tric(y ● Function 2arameters – named vs %ositional – re>uired vs o%tional ● ;%timiFing dictionaries ● ' ared constants >>> a = (1,2,3) >>> b = (1,2,3) >>> a is b False >>> (1,2,3) is (1,2,3) True 'nekBoard ● 1rives Lego Po$er Functions motors ● Runs Snek and CircuitPyt on ● Cro$d Su%%ly cam%aign starting soon/ https://www.crowdsupply.com/keith-packard/snekboard Demo .

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    30 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us