Building an Interpreter from scratch

Building an Interpreter from scratch

English | MP4 | AVC 1280×720 | AAC 44KHz 2ch | 18 lectures (2h 59m) | 936 MB

Semantics of programming languages

How programming languages work under the hood? What’s the difference between compiler and interpreter? What is a virtual machine, and JIT-compiler? And what about the difference between functional and imperative programming?

There are so many questions when it comes to implementing a programming language!

The problem with “compiler classes” in school is they usually are presented as some “hardcore rocket science” which is only for advanced engineers.

Moreover, classic compiler books start from the least significant topic, such as Lexical analysis, going right away deep down to the theoretical aspects of formal grammars. And by the time of implementing a first Tokenizer module, students simply lose an interest to the topic, not having a chance to actually start implementing a programing language itself. And all this is spread to a whole semester of messing with tokenizers and BNF grammars, without understanding an actual semantics of programming languages.

I believe we should be able to build and understand a full programming language semantics, end-to-end, in 4-6 hours — with a content going straight to the point, showed in live coding session as pair-programming, and described in a comprehensible way.

In the Essentials of Interpretations class we focus specifically on runtime semantics, and build a interpreter for a programming language very similar to JavaScript or Python.

Implementing a programing language would also make your practical usage level of other programming languages more professional.

Who this class is for?

This class is for any curious engineer, who would like to gain skills of building complex systems (and building a programming language is really a pretty advanced engineering task!), and obtain a transferable knowledge for building such systems.

If you are interested specifically in compilers, interpreters, and source code transformation tools, then this class is also for you.

The only pre-requisite for this class is basic data structures and algorithms: trees, lists, traversal.

What is used for implementation?

Since we build a language very similar in semantics to JavaScript or Python (the two most popular programming languages today) we use specifically JavaScript — its elegant multi-paradigm structure which combines functional programming, class-based, and prototype-based OOP fits ideal for that.

Many engineers are familiar with JavaScript so it should be easier to start coding right away. However in implementation we don’t rely on too specific to JS constructs, and the code from the course is easily portable to TypeScript, Python, Java, C++, Rust, and any other language of your taste.

Note: we want our students to actually follow, understand and implement every detail of the interpreter themselves, instead of just copy-pasting from final solution. The full source code for the language is available in video lectures, showing and guiding how to structure specific modules.

What’s specific in this class?

The main features of these lectures are:

Concise and straight to the point. Each lecture is self-sufficient, concise, and describes information directly related to the topic, not distracting on unrelated materials or talks.

Animated presentation combined with live-editing notes. This makes understanding of the topics easier, and shows how (and when at time) the object structures are connected. Static slides simply don’t work for a complex content.

Live coding session end-to-end with assignments. The full source code, starting from scratch, and up to the very end is presented in the video lectures class. In the course we implement a full AST interpreter for our programming language.

What you’ll learn

  • Build a programing language from scratch
  • Interpreters and Compilers
  • AOT, JIT-compilers and Transpilers
  • AST-interpreters and Virtual Machines
  • Bytecode, LLVM, Stack-machines
  • First-class functions, Lambdas and Closures
  • Call-stack and Activation Records
  • OOP: Classes, Instances and Prototypes
  • Modules and Abstractions
Table of Contents

Compilers crash course
1 Parsers, ASTs, Interpreters and Compilers
2 AST Interpreters and Virtual Machines
3 Compilers AOT, JIT, Transpiler

Interpreters Basic expressions and Variables
4 Eva programming language
5 Self-evaluating expressions
6 Variables and Environments
7 Blocks expression groups and Nested Scopes
8 Control flow If and While expressions
9 Back to parsers S-expression to AST

Functions and Functional programming
10 Built-in and Native functions
11 User-defined functions, Activation Records and Closures
12 Lambda functions and Functional programming
13 Call-stack and Recursive calls
14 Syntactic sugar Switch, For, Inc, Dec operators

Object-oriented programming
15 Object-oriented Eva Classes
16 Class inheritance and Super calls
17 Code isolation Modules and Imports
18 Final executable and specification

Homepage