Mobile App Development 2022W Lecture 20
Video
Video from the lecture given on March 30, 2022 is now available:
Video is also available through Brightspace (Resources->Zoom Meetings (Recordings, etc.)->Cloud Recordings tab). Note that here you'll also see chat messages.
Notes
Lecture 20 ---------- Lanugage runtimes Operating System (P) | Applications -------------------------------------- Hardware (CPU/RAM/Devices) P = runs with full privileges Applications written is languages like C, C++ run directly on the hardware - compile to machine code specific to the CPU of the system So, like the operating system, applications in C and C++ run "directly" on the hardware - CPU runs in a special mode that limits access to hardware (user mode) - when running the OS, CPU runs in supervisor mode (full access) But...most languages we program in today don't work like this | bytecode or source code OS (P)| Native App | Language runtime ---------------------------------------- Hardware (CPU/RAM/Devices) Java: compiled to bytecode, run (JIT compiled & run) in a Java Virtual Machine Python: compiled to bytecode or run directly in python VM JavaScript: just-in-time compiled to machine code by JavaScript VM Traditionally, we had either compiled or interpreted languages - compiled ones were converted to machine code once, machine code was then run - interpreted were "interpreted" line by line, running appropriate code as needed Interpreted is much much slower, but there's no slow compile step - allows for fast development - also can require modest resources (RAM-wise) bytecode: compiled from source, but not machine code - easier to process code optimization: make code run faster/take up less space But nowadays, we have just-in-time compiled languages - source or bytecode => machine code as needed In fact, code may be compiled multiple times - fast compile to get things running quickly, but code isn't optimized - slower compile for frequently run code (takes longer to optimize code, but result runs faster) The simplest translation of source to machine code is mostly looking things up in a table - A => B - but this is far from the most efficient way of doing things Most sophisticated JIT runtimes are now for JavaScript - borrow heavily from Java runtimes (JVM's) - which borrowed heavily from LISP runtimes JavaScript runtimes got so good they ended up on the server - node.js, Deno Note that PHP & Python also use some amount to just-in-time compilation - but in general language runtimes are slower than JavaScript ones The speed difference is mostly due to effort spent in making a better runtime - JIT runtimes are very complex - and depend heavily on language semantics Python is notorious for having a slow runtime (CPython) - but there's alternatives like PyPy (that aren't completely compatible) So how can Python be used for machine learning? - they call libraries written in C/C++ (e.g. NumPy) - and they do most of the work Julia is an alternative to Python with a very fast runtime - but can be slow to start up For complex apps, dev time in higher level languages is much less, and resulting code can be comparably fast, depending on the app If you look up comparisons of programming languages, you'll see that C and C++ are near the top, but other languages show up - Fortran - Julia - Lua And other languages can be surprisingly competitive, depending on the runtime Basically, avoid using C and C++ unless you have to - but choose the right language for the task - consider performance, but in practice other factors are more important generally (security, platform integration, libraries)