SlideShare a Scribd company logo
1 of 23
An Introduction
    to PyPy


          KiwiPyCon 2009

   Michael Hudson micahel@gmail.com
             Canonical Ltd.
What you’re in for
in the next 25 mins
  • Quick intro and motivation
  • Quick overview of architecture and current
    status
  • Introduction to features unique to PyPy,
    including the JIT
  • A little talk about what the future holds
What is PyPy?
• PyPy is:
 • An implementation of Python in Python
 • A very flexible compiler framework (with
    some features that are especially useful for
    implementing interpreters)
 • An open source project (MIT license)
• PyPy was partly EU-funded from 2005-2007
What we’ve got
• We can produce a binary that looks very
  much like CPython to the user
• Some, but not all, extension modules
  supported – socket, mmap, termios, …
• Can produce binary for CLR/.NET (watch
  out IronPython! :-) and JVM (ditto Jython…)
• Can also produce binaries with more
  features (stackless, JIT, …)
Motivation
• PyPy grew out of a desire to modify/extend
  the implementation of Python, for example to:
 • Increase performance (JIT compilation,
    better garbage collectors)
 • Ease porting (to new platforms like the
    JVM or CLI or to low memory situations)
 • Add expressiveness (stackless-style
    coroutines, logic programming)
Problems with
  CPython
• CPython is a fine implementation of Python
  but:
 • It’s written in C, which makes porting to,
    for example, the CLI hard
 • While psyco and stackless exist, they are
    very hard to maintain as Python evolves
 • Some implementation decisions are very
    hard to change (e.g. refcounting)
PyPy’s Big Idea
• Take a description of the Python
  programming language
• Analyze this description:
 • Decide whether to include stackless-like
    features or a JIT
 • Decide which GC to use
 • Decide the target platform
• Translate to a lower-level, efficient form
The PyPy platform
          Specification of the Python language

           Translation/Compiler Framework


    Python               Python             Python for an
running on JVM           with JIT          embedded device

       Python with                  Python just the way
  transactional memory                  you like it
How do you specify
the Python language?
   • The way we did it was to write an
     interpreter for Python in RPython – a subset
     of Python that is amenable to analysis
   • This allowed us to write unit tests for our
     specification/implementation that run on top
     of CPython
   • Can also test entire specification/
     implementation in same way
The Translation/
Compiler Framework
   • The compiler framework takes as input live
     Python objects (as opposed to source code)
   • It abstractly interprets the bytecode of
     functions to produce flow graphs
   • Further layers of abstract interpretation
     perform more analysis and gradually reduce
     the level of abstraction
   • Finally C or other source code is generated
If you have a
  hammer…
• We’d written this compiler framework, with
  only one expected non-trivial input (our
  Python interpreter)
• We realized that it would be suitable for
  implementations of other dynamically-typed
  programming languages
• Now have implementations of Prolog,
  JavaScript and Scheme (to varying extents)
The L×O×P problem
  This leads to one of PyPy’s meta-goals,
  ameliorating the so-called L×O×P problem:
  given
    • L dynamic languages
    • O target platforms
    • P implementation decisions
  we don’t want to have to write L×O×P different
  interpreters by hand.
The L×O×P problem
  • PyPy aims to reduce this to an L+O+P
    problem:
    • Implement L language front-ends
    • Write backends for O platforms
    • Take P implementation decisions
  • Then let the magic of PyPy™ tie it all
    together :-)
The exciting bit –
     the JIT
 • Most recent work has been on the second
   incarnation of the JIT
  • First incarnation sort of worked, but was
     completely crazy
  • It transformed the control flow graph of
     an interpreter into that of a compiler
 • Second attempt based on the idea of a
   “tracing JIT” like TraceMonkey or V8
The exciting bit –
     the JIT
 • It finds “traces” – frequently executed
   sequences of bytecode – in the program
 • Once a trace has been identified, it is
   interpreted in “tracing mode” where a
   record is kept of the low level operations
   that would be executed interpreting the
   bytecode
 • This is then compiled to machine code and
   executed
Status – Interpreter
  • PyPy’s Python interpreter supports 2.5.2 by
    default
  • 2.6 should be easy enough
  • No Py3K yet :-) (will be work, but not too
    insanely hard)
  • The “__pypy__” module includes a variety
    of mysterious and exciting things, depending
    on options supplied
Status – compiled
   interpreter
 • When compiled to (standalone) C with all
   the optimizations turned on, our interpreter
   varies from a little faster to about twice as
   slow than CPython
 • Can also build interpreters with threading
   and with stackless features
Status – backends
 • We currently have three complete backends:
  • C/POSIX (like CPython)
  • CLI (like IronPython)
  • JVM (like Jython)
Status – the JIT
• Usefulness of the JIT varies from program to
  program
  • Good examples are up to ten times faster
    than CPython
  • Bad ones still twice as slow
• Supports ia32, amd64 on the way
• Can also generate CLI bytecodes (which will
  then be JITted by Mono or the CLR)
Extra: sandboxing
 • Something completely different!
 • You can build PyPy’s Python interpreter in a
   way that can use limited CPU, memory and
   system calls
   • Works by running modified interpreter as
     a subprocess of a trusted “monitor”
   • All system calls in the interpreter are
     replaced with code to request the
     monitor perform the call
Future Work?
• JIT JIT JIT: making it make more practical:
 • speed up more programs by more
 • cap memory usage
• Easier platform integration
 • Particularly for JVM and CLI backends
• Implementations of other dynamic languages
  (which will get a JIT essentially for free)?
• Experiment with removing the GIL??
About the Project
 • Open source, of course (MIT license)
 • Read documentation:
      http://codespeak.net/pypy/

 • Project has a somewhat academic focus
   compared to most open source – lots of
   papers to read!
 • Come hang out in #pypy on freenode, post
   to pypy-dev@codespeak.net
Thanks for listening!




           Any Questions?

More Related Content

What's hot

Stack data structure
Stack data structureStack data structure
Stack data structure
Tech_MX
 
Inline function
Inline functionInline function
Inline function
Tech_MX
 

What's hot (20)

LINUX:Control statements in shell programming
LINUX:Control statements in shell programmingLINUX:Control statements in shell programming
LINUX:Control statements in shell programming
 
Python
PythonPython
Python
 
Python programming
Python programmingPython programming
Python programming
 
File Handling in C++
File Handling in C++File Handling in C++
File Handling in C++
 
Lesson 03 python statement, indentation and comments
Lesson 03   python statement, indentation and commentsLesson 03   python statement, indentation and comments
Lesson 03 python statement, indentation and comments
 
Command line-arguments-in-java-tutorial
Command line-arguments-in-java-tutorialCommand line-arguments-in-java-tutorial
Command line-arguments-in-java-tutorial
 
Python GUI
Python GUIPython GUI
Python GUI
 
Stack data structure
Stack data structureStack data structure
Stack data structure
 
Programming in ansi C by Balaguruswami
Programming in ansi C by BalaguruswamiProgramming in ansi C by Balaguruswami
Programming in ansi C by Balaguruswami
 
Binary Search Tree in Data Structure
Binary Search Tree in Data StructureBinary Search Tree in Data Structure
Binary Search Tree in Data Structure
 
Quick sort-Data Structure
Quick sort-Data StructureQuick sort-Data Structure
Quick sort-Data Structure
 
Graph in Data Structure
Graph in Data StructureGraph in Data Structure
Graph in Data Structure
 
Event Sourcing with Cassandra (from Cassandra Japan Meetup in Tokyo March 2016)
Event Sourcing with Cassandra (from Cassandra Japan Meetup in Tokyo March 2016)Event Sourcing with Cassandra (from Cassandra Japan Meetup in Tokyo March 2016)
Event Sourcing with Cassandra (from Cassandra Japan Meetup in Tokyo March 2016)
 
Algorithm: Quick-Sort
Algorithm: Quick-SortAlgorithm: Quick-Sort
Algorithm: Quick-Sort
 
Nested loops
Nested loopsNested loops
Nested loops
 
Divide and conquer
Divide and conquerDivide and conquer
Divide and conquer
 
Python Loops Tutorial | Python For Loop | While Loop Python | Python Training...
Python Loops Tutorial | Python For Loop | While Loop Python | Python Training...Python Loops Tutorial | Python For Loop | While Loop Python | Python Training...
Python Loops Tutorial | Python For Loop | While Loop Python | Python Training...
 
BinarySearchTree-bddicken
BinarySearchTree-bddickenBinarySearchTree-bddicken
BinarySearchTree-bddicken
 
Inline function
Inline functionInline function
Inline function
 
Divide And Conquer.pptx
Divide And Conquer.pptxDivide And Conquer.pptx
Divide And Conquer.pptx
 

Viewers also liked

a quick Introduction to PyPy
a quick Introduction to PyPya quick Introduction to PyPy
a quick Introduction to PyPy
Kai Aras
 
Adam_Mcconnell_SPR11_v3
Adam_Mcconnell_SPR11_v3Adam_Mcconnell_SPR11_v3
Adam_Mcconnell_SPR11_v3
Adam McConnell
 

Viewers also liked (6)

a quick Introduction to PyPy
a quick Introduction to PyPya quick Introduction to PyPy
a quick Introduction to PyPy
 
PyPy
PyPyPyPy
PyPy
 
Adam_Mcconnell_SPR11_v3
Adam_Mcconnell_SPR11_v3Adam_Mcconnell_SPR11_v3
Adam_Mcconnell_SPR11_v3
 
Question 7
Question 7 Question 7
Question 7
 
The 3 Models in the NGINX Microservices Reference Architecture
The 3 Models in the NGINX Microservices Reference ArchitectureThe 3 Models in the NGINX Microservices Reference Architecture
The 3 Models in the NGINX Microservices Reference Architecture
 
REST vs. Messaging For Microservices
REST vs. Messaging For MicroservicesREST vs. Messaging For Microservices
REST vs. Messaging For Microservices
 

Similar to An Introduction to PyPy

Python quick guide1
Python quick guide1Python quick guide1
Python quick guide1
Kanchilug
 
Python and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthroughPython and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthrough
gabriellekuruvilla
 

Similar to An Introduction to PyPy (20)

Introduction to Python Programming
Introduction to Python ProgrammingIntroduction to Python Programming
Introduction to Python Programming
 
Introduction to Python Programing
Introduction to Python ProgramingIntroduction to Python Programing
Introduction to Python Programing
 
Introduction to Python Programming Basics
Introduction  to  Python  Programming BasicsIntroduction  to  Python  Programming Basics
Introduction to Python Programming Basics
 
IPT 2.pptx
IPT 2.pptxIPT 2.pptx
IPT 2.pptx
 
Python quick guide1
Python quick guide1Python quick guide1
Python quick guide1
 
Introduction to Python Unit -1 Part .pdf
Introduction to Python Unit -1 Part .pdfIntroduction to Python Unit -1 Part .pdf
Introduction to Python Unit -1 Part .pdf
 
Python programming language introduction unit
Python programming language introduction unitPython programming language introduction unit
Python programming language introduction unit
 
PyCon2022 - Building Python Extensions
PyCon2022 - Building Python ExtensionsPyCon2022 - Building Python Extensions
PyCon2022 - Building Python Extensions
 
1-ppt-python.ppt
1-ppt-python.ppt1-ppt-python.ppt
1-ppt-python.ppt
 
Four Python Pains
Four Python PainsFour Python Pains
Four Python Pains
 
Python Programming1.ppt
Python Programming1.pptPython Programming1.ppt
Python Programming1.ppt
 
Python for students step by step guidance
Python for students step by step guidancePython for students step by step guidance
Python for students step by step guidance
 
PYTHON FEATURES.pptx
PYTHON FEATURES.pptxPYTHON FEATURES.pptx
PYTHON FEATURES.pptx
 
4_Introduction to Python Programming.pptx
4_Introduction to Python Programming.pptx4_Introduction to Python Programming.pptx
4_Introduction to Python Programming.pptx
 
Pythonic doesn't mean slow!
Pythonic doesn't mean slow!Pythonic doesn't mean slow!
Pythonic doesn't mean slow!
 
Pyconsg2014 pyston
Pyconsg2014 pystonPyconsg2014 pyston
Pyconsg2014 pyston
 
Number of Computer Languages = 3
Number of Computer Languages = 3Number of Computer Languages = 3
Number of Computer Languages = 3
 
DSA Day 2 PPT.pdf
DSA Day 2 PPT.pdfDSA Day 2 PPT.pdf
DSA Day 2 PPT.pdf
 
Python programming 2nd
Python programming 2ndPython programming 2nd
Python programming 2nd
 
Python and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthroughPython and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthrough
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

An Introduction to PyPy

  • 1. An Introduction to PyPy KiwiPyCon 2009 Michael Hudson micahel@gmail.com Canonical Ltd.
  • 2. What you’re in for in the next 25 mins • Quick intro and motivation • Quick overview of architecture and current status • Introduction to features unique to PyPy, including the JIT • A little talk about what the future holds
  • 3. What is PyPy? • PyPy is: • An implementation of Python in Python • A very flexible compiler framework (with some features that are especially useful for implementing interpreters) • An open source project (MIT license) • PyPy was partly EU-funded from 2005-2007
  • 4. What we’ve got • We can produce a binary that looks very much like CPython to the user • Some, but not all, extension modules supported – socket, mmap, termios, … • Can produce binary for CLR/.NET (watch out IronPython! :-) and JVM (ditto Jython…) • Can also produce binaries with more features (stackless, JIT, …)
  • 5. Motivation • PyPy grew out of a desire to modify/extend the implementation of Python, for example to: • Increase performance (JIT compilation, better garbage collectors) • Ease porting (to new platforms like the JVM or CLI or to low memory situations) • Add expressiveness (stackless-style coroutines, logic programming)
  • 6. Problems with CPython • CPython is a fine implementation of Python but: • It’s written in C, which makes porting to, for example, the CLI hard • While psyco and stackless exist, they are very hard to maintain as Python evolves • Some implementation decisions are very hard to change (e.g. refcounting)
  • 7. PyPy’s Big Idea • Take a description of the Python programming language • Analyze this description: • Decide whether to include stackless-like features or a JIT • Decide which GC to use • Decide the target platform • Translate to a lower-level, efficient form
  • 8. The PyPy platform Specification of the Python language Translation/Compiler Framework Python Python Python for an running on JVM with JIT embedded device Python with Python just the way transactional memory you like it
  • 9. How do you specify the Python language? • The way we did it was to write an interpreter for Python in RPython – a subset of Python that is amenable to analysis • This allowed us to write unit tests for our specification/implementation that run on top of CPython • Can also test entire specification/ implementation in same way
  • 10. The Translation/ Compiler Framework • The compiler framework takes as input live Python objects (as opposed to source code) • It abstractly interprets the bytecode of functions to produce flow graphs • Further layers of abstract interpretation perform more analysis and gradually reduce the level of abstraction • Finally C or other source code is generated
  • 11. If you have a hammer… • We’d written this compiler framework, with only one expected non-trivial input (our Python interpreter) • We realized that it would be suitable for implementations of other dynamically-typed programming languages • Now have implementations of Prolog, JavaScript and Scheme (to varying extents)
  • 12. The L×O×P problem This leads to one of PyPy’s meta-goals, ameliorating the so-called L×O×P problem: given • L dynamic languages • O target platforms • P implementation decisions we don’t want to have to write L×O×P different interpreters by hand.
  • 13. The L×O×P problem • PyPy aims to reduce this to an L+O+P problem: • Implement L language front-ends • Write backends for O platforms • Take P implementation decisions • Then let the magic of PyPy™ tie it all together :-)
  • 14. The exciting bit – the JIT • Most recent work has been on the second incarnation of the JIT • First incarnation sort of worked, but was completely crazy • It transformed the control flow graph of an interpreter into that of a compiler • Second attempt based on the idea of a “tracing JIT” like TraceMonkey or V8
  • 15. The exciting bit – the JIT • It finds “traces” – frequently executed sequences of bytecode – in the program • Once a trace has been identified, it is interpreted in “tracing mode” where a record is kept of the low level operations that would be executed interpreting the bytecode • This is then compiled to machine code and executed
  • 16. Status – Interpreter • PyPy’s Python interpreter supports 2.5.2 by default • 2.6 should be easy enough • No Py3K yet :-) (will be work, but not too insanely hard) • The “__pypy__” module includes a variety of mysterious and exciting things, depending on options supplied
  • 17. Status – compiled interpreter • When compiled to (standalone) C with all the optimizations turned on, our interpreter varies from a little faster to about twice as slow than CPython • Can also build interpreters with threading and with stackless features
  • 18. Status – backends • We currently have three complete backends: • C/POSIX (like CPython) • CLI (like IronPython) • JVM (like Jython)
  • 19. Status – the JIT • Usefulness of the JIT varies from program to program • Good examples are up to ten times faster than CPython • Bad ones still twice as slow • Supports ia32, amd64 on the way • Can also generate CLI bytecodes (which will then be JITted by Mono or the CLR)
  • 20. Extra: sandboxing • Something completely different! • You can build PyPy’s Python interpreter in a way that can use limited CPU, memory and system calls • Works by running modified interpreter as a subprocess of a trusted “monitor” • All system calls in the interpreter are replaced with code to request the monitor perform the call
  • 21. Future Work? • JIT JIT JIT: making it make more practical: • speed up more programs by more • cap memory usage • Easier platform integration • Particularly for JVM and CLI backends • Implementations of other dynamic languages (which will get a JIT essentially for free)? • Experiment with removing the GIL??
  • 22. About the Project • Open source, of course (MIT license) • Read documentation: http://codespeak.net/pypy/ • Project has a somewhat academic focus compared to most open source – lots of papers to read! • Come hang out in #pypy on freenode, post to pypy-dev@codespeak.net
  • 23. Thanks for listening! Any Questions?

Editor's Notes

  1. Have you got a big terminal and a pygame demo ready to go?