From 268e7adac7e2bd87371d86a0f4c124814d583829 Mon Sep 17 00:00:00 2001 From: Noe De Santo <noe.desanto@epfl.ch> Date: Tue, 19 Oct 2021 19:59:57 +0200 Subject: [PATCH] Add labs 4-6 handouts --- labs/labs06_material/presentation.md | 109 +++++++++++++ labs/labs06_material/report-template.pdf | Bin 0 -> 32076 bytes labs/labs06_material/report-template.tar.gz | Bin 0 -> 11847 bytes labs/labs_04.md | 149 +++++++++++++++++ labs/labs_05.md | 170 ++++++++++++++++++++ labs/labs_06.md | 110 +++++++++++++ 6 files changed, 538 insertions(+) create mode 100644 labs/labs06_material/presentation.md create mode 100644 labs/labs06_material/report-template.pdf create mode 100644 labs/labs06_material/report-template.tar.gz create mode 100644 labs/labs_04.md create mode 100644 labs/labs_05.md create mode 100644 labs/labs_06.md diff --git a/labs/labs06_material/presentation.md b/labs/labs06_material/presentation.md new file mode 100644 index 0000000..c0cc05a --- /dev/null +++ b/labs/labs06_material/presentation.md @@ -0,0 +1,109 @@ +## Compiler Extension Presentation Instructions + +Background presentations will take place in week 14. We strongly +recommend that you pre-record your presentation. **[You should upload +your talk on SwitchTube](https://tube.switch.ch/channels/c1d660a4)** +(the precise channel will be linked here soon). However, if you prefer, +you can also live stream your presentation, but in that case you are +responsible if the presentation does not reach your audience due to +network quality issues. + +**The presentation should be 10 minutes long.** + +**Q&A session of 5-10 minutes** will follow right after the +presentation. Please make sure at least one of you is available for the +entire 20 minute slot. + +**We would like each member of the group to be part of the +presentation.** + +Shortly after, you will receive feedback from us regarding the content +of your presentation, as well as some general feedback on the form. + +### Presentation content + +Your presentation should summarize your project. In particular, we\'d +expect to see + +- a basic overview of the features you added to the compiler/language +- some (short) programs highlighting the use of these features, with a + description of how your extended compiler behaves on them +- possibly some theoretical background you had to learn about to + implement the extension +- an overview of the changes you made to each compiler phase and/or + which phases you added + +### Presentation style + +Here are some useful resources on how to prepare and give talks: + +- [How To Speak by Patrick + Winston](https://www.youtube.com/watch?v=Unzc731iCUY) +- [How to give a great research talk by Simon Peyton + Jones](https://www.microsoft.com/en-us/research/academic-program/give-great-research-talk/) + +Please do not use Viktor\'s videos as a model for the presentation, but +instead incorporate as many points of the talk of [Patrick +Winston](https://en.wikipedia.org/wiki/Patrick_Winston) as you believe +apply to your presentation. It is an amazing and entertaining talk, +despite (or because) it is meta-circular: he does as he says. Note: +breaking physical objects or referring to supernatural beings in your +video is not required. Use your own judgement and strike a balance in +being comfortable with what and how you are saying things and trying out +these pieces of advice. + +### Instructions for video (recording or streaming) + +We suggest that the speaker\'s video shows up when the speaker starts to +speak, so that the audience can relate and identify the speaker. +Afterwards, the video can be turned off and should come back on for +questions and answers. Optionally, a small video can stay on throughout +the presentation. The main content of the presentation should be a +window showing the material being presented, for example as a PDF to +which you can point to and/or annotate it. If the hardware allows you, +you can also use a tablet to simulate a blackboard presentation where +you write down everything you present, or use a combination or simple +slides and a strategy of what you will write on them. + +**Video upload:** [please upload your video to this +channel](https://tube.switch.ch/channels/c1d660a4) (login with EPFL +credentials) + +### Viktor\'s recording setup + +For your information and not as a requirement, Viktor\'s lectures are +prepared using this hardware and software setup on Ubuntu 20 OS: + +- slides prepared using the \`beamer\` latex package +- slides annotated using \`xournal\` PDF annotator in full screen mode + on display size 1920x1080 +- recording using Zoom, with the following options: + - screen sharing PDF annotator (\`xournal\`), **without** option + to optimize for full-screen viewing + - local recording, with option **Optimize for 3rd party video + editor** +- wacom cintiq pro display as external monitor for annotating PDF\'s + using pen +- video segments are cut and assembled using ffmpeg, which works very + fast: + - cut like this: + +```{=html} +<!-- --> +``` + fmpeg -i zoom_0.mp4 -ss 00:00:00 -to 00:02:03.00 -c copy mysegment01.mp4 + + * concatenate like this: + + ffmpeg -f concat -i segmentlist.txt -c copy mycombinedvideo.mp4 + +where segmentlist.txt is a file containing one line per each file to +include: + + file 'mysegment01.mp4' + file 'mysegment02.mp4' + file 'mysegment03.mp4' + +Alternatively, you can also use \`obs\` open source software. For +recording, under advanced options, you may wish to choose a 1 second key +frame interval to make cutting the video with ffmpeg work well. diff --git a/labs/labs06_material/report-template.pdf b/labs/labs06_material/report-template.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4d859b01e0dd78f2ac48af34659a62896ebbcd4 GIT binary patch literal 32076 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 JLQxX+{{U;|@`L~Y literal 0 HcmV?d00001 diff --git a/labs/labs06_material/report-template.tar.gz b/labs/labs06_material/report-template.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..4585d7888e45ec24cbac6cc7020e7954bf3fa6b7 GIT binary patch literal 11847 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 B)%ySd literal 0 HcmV?d00001 diff --git a/labs/labs_04.md b/labs/labs_04.md new file mode 100644 index 0000000..f71596c --- /dev/null +++ b/labs/labs_04.md @@ -0,0 +1,149 @@ +# Lab 04: Type Checker + +Parsing concludes the syntactical analysis of Amy programs. Having +successfully constructed an abstract syntax tree for an input program, +compilers typically run one or multiple phases containing checks of a +more semantical nature. Virtually all high-level programming languages +enjoy some form of name analysis, whose purpose is to disambiguate +symbol references throughout the program. Some languages go further and +perform a series of additional checks whose goal is to rule out runtime +errors statically (i.e., during compilation, or in other words, without +executing the program). While the exact rules for those checks vary from +language to language, this part of compilation is typically summarized +as \"type checking\". Amy, being a statically-typed language, requires +both name and type analysis. + +## Prelude: From Nominal to Symbolic Trees + +Recall that during parsing we created (abstract syntax) trees of the +*nominal* sort: Names of variables, functions and data types were simply +stored as strings. However, two names used in the program could be the +same, but not refer to one and the same \"thing\" at runtime. During +name analysis we translate from nominal trees to symbolic ones, to make +it clear whether two names refer to one and the same underlying entity. +That is, we explicitly replace strings by fresh identifiers which will +prevent us from mixing up definitions of the same name, or referring to +things that have not been defined. Amy\'s name analyzer is provided to +you as part of this lab\'s skeleton, but you should read the [dedicated +name analyzer page](name analyzer) to understand how it works. + +## Introduction to Type Checking + +The purpose of this lab is to implement a type checker for Amy. Our type +checking rules will prevent certain errors based on the kind or shape of +values that the program is manipulating. For instance, we should prevent +an integer from being added to a boolean value. + +Type checking is the last stage of the compiler frontend. Every program +that reaches the end of this stage without an error is correct (as far +as the compiler is concerned), and every program that does not is wrong. +After type checking we are finally ready to interpret the program or +compile it to binary code! + +Typing rules for Amy are presented in detail in the +[Amy specification](amy_specification.md). Make sure to check correct +typing for all expressions and patterns. + +## Implementation + +The current assignment focuses on the file `TypeChecker.scala`. As +usual, the skeleton and helper methods are given to you, and you will +have to complete the missing parts. In particular, you will write a +compiler phase that checks whether the expressions in a given program +are well-typed and report errors otherwise. + +To this end you will implement a simplified form of the Hindley-Milner +(HM) type-inference algorithm that you\'ll hear about during the +lectures. Note that while not advertised as a feature to users of Amy, +behind the scenes we will perform type inference. It is usually +straightforward to adapt an algorithm for type inference to type +checking, since one can add the user-provided type annotations to the +set of constraints. This is what you will do with HM in this lab. + +Compared to the presentation of HM type inference in class your type +checker can be simplified in another way: Since Amy does not feature +higher-order functions or polymorphic data types, types in Amy are +always *simple* in the sense that they are not composed of arbitrary +other types. That is, a type is either a base type (one of `Int`, `Bool` +and `String`) or it is an ADT, which has a proper name (e.g. `List` or +`Option` from the standard library). In the latter case, all the types +in the constructor of the ADT are immediately known. For instance, the +standard library\'s `List` is really a list of integers, so we know that +the `Cons` constructor takes an `Int` and another `List`. + +As a result, your algorithm will never have to deal with complex +constraints over type constructors (such as the function arrow +`A => B`). Instead, your constraints will always be of the form +`T1 = T2` where `T1` and `T2` are either *simple* types or type +variables. This is most important during unification, which otherwise +would have to deal with complex types separately. + +Your task now is to a) complete the `genConstraints` method which will +traverse a given expression and collect all the necessary typing +constraints, and b) implement the *unification* algorithm as +`solveConstraints`. + +Familiarize yourself with the `Constraint` and `TypeVariable` data +structures in `TypeChecker.scala` and then start by implementing +`genConstraints`. The structure of this method will in many cases be +analogous to the AST traversal you wrote for the name analyzer. Note +that `genConstraints` also takes an *expected type*. For instance, in +case of addition the expected type of both operands should be `Int`. For +other constructs, such as pattern `match`es it is not inherently clear +what should be the type of each `case` body. In this case you can create +and pass a fresh type variable. + +Once you have a working implementation of both `genConstraints` and +`solveConstraints` you can copy over your previous work on the +interpreter and run the programs produced by your frontend! Don\'t +forget that to debug your compiler\'s behavior you can also use the +reference compiler with the `--interpret` flag and then compare the +output. + +## Skeleton + +As usual, you can find the skeleton for this lab in a new branch of your +group\'s repository. After merging it with your existing work, the +structure of your project `src` directory should be as follows: + + src/amyc + ├── Main.scala (updated) + │ + ├── analyzer (new) + │ ├── SymbolTable.scala + │ ├── NameAnalyzer.scala + │ └── TypeChecker.scala + │ + ├── ast + │ ├── Identifier.scala + │ ├── Printer.scala + │ └── TreeModule.scala + │ + ├── interpreter + │ └── Interpreter.scala + │ + ├── lib + │ ├── scallion_3.0.6.jar + │ └── silex_3.0.6.jar + │ + ├── parsing + │ ├── Parser.scala + │ ├── Lexer.scala + │ └── Tokens.scala + │ + └── utils + ├── AmycFatalError.scala + ├── Context.scala + ├── Document.scala + ├── Pipeline.scala + ├── Position.scala + ├── Reporter.scala + └── UniqueCounter.scala + +## Deliverables + +You are given **3 weeks** for this assignment. + +Deadline: **TBD**. + +Submission: one team member submits a zip file submission-groupNumber.zip to the [moodle submission page](). diff --git a/labs/labs_05.md b/labs/labs_05.md new file mode 100644 index 0000000..6da60e8 --- /dev/null +++ b/labs/labs_05.md @@ -0,0 +1,170 @@ +# Lab 05: Code Generation + +## Introduction + +Welcome to the last common assignment for the Amy compiler. At this +point, we are finally done with the frontend: we have translated source +programs to ASTs and have checked that all correctness conditions hold +for our program. We are ready to generate code for our program. In our +case the target language will be *WebAssembly*. + +WebAssembly is \"a new portable, size- and load-time-efficient format +suitable for compilation to the web\" (<http://webassembly.org>). +WebAssembly is designed to be called from JavaScript in browsers and +lends itself to highly-performant execution. + +For simplicity, we will not use a browser, but execute the resulting +WebAssembly bytecode directly using `nodejs` which is essentially a +standalone distribution of the Chrome browser\'s JavaScript engine. When +you run your complete compiler (or the reference compiler) with no +options on program `p`, it will generate four different files under the +`wasmout` directory: + +- `p.wat` is the wasm output of the compiler in text format. You can + use this representation to debug your generated code. +- `p.wasm` is the binary output of the compiler. This is what `nodejs` + will use. To translate to the binary format, we use the `wat2wasm` + tool provided by the WebAssembly developers. For your convenience we + have included it in the `bin` directory of the skeleton. Note that + this tool performs a purely mechanical translation and thus its + output (for instance, `p.wasm`) corresponds to a binary + representation of `p.wat`. +- `p.js` is a JavaScript wrapper which we will run with nodejs and + serve as an entrypoint into your generated binary. + +To run the program, simply type `nodejs wasmout/p.js` + +### Installing nodejs + +- You can find directions for your favorite operating system + [here](https://nodejs.org/en/). You should have nodejs 12 or later + (run `nodejs --version` to make sure). +- Once you have installed nodejs, run `npm install deasync` from the + directory you plan to run `amyc` in, i.e. the toplevel directory of + the compiler. +- Make sure the `wat2wasm` executable is visible, i.e. it is in the + system path or you are at the toplevel of the `amyc` directory. + +## WebAssembly and Amy + +Look at [this +presentation](http://lara.epfl.ch/~gschmid/clp20/codegen.pdf) for the +main concepts of how to translate Amy programs to WebAssembly. + +You can find the annotated compiler output to the concat example +[here](http://lara.epfl.ch/~gschmid/clp20/concat.wat). + +## The assignment code + +### Overview + +The code for the assignment is divided into two directories: `wasm` for +the modeling of the WebAssembly framework, and `codegen` for +Amy-specific code generation. There is a lot of code here, but your task +is only to implement code generation for Amy expressions within +`codegen/CodeGen.scala`. + +- `wasm/Instructions.scala` provides types that describe a subset of + WebAssembly instructions. It also provides a type `Code` to describe + sequences of instructions. You can chain multiple instructions or + `Code` objects together to generate a longer `Code` with the `<:>` + operator. +- `wasm/Function.scala` describes a wasm function. + - `LocalsHandler` is an object which will create fresh indexes for + local variables as needed. + - A `Function` contains a field called `isMain` which is used to + denote a main function without a return value, which will be + handled differently when printing, and will be exported to + JavaScript. + - The only way to create a `Function` is using `Function.apply`. + Its last argument is a function from a `LocalsHandler` to + `Code`. The reason for this unusual choice is to make sure the + Function object is instantiated with the number of local + variables that will be requested from the LocalsHandler. To see + how it is used, you can look in `codegen/Utils.scala` (but you + won\'t have to use it directly). +- `wasm/Module.scala` and `wasm/ModulePrinter.scala` describe a wasm + module, which you can think of as a set of functions and the + corresponding module headers. +- `codegen/Utils.scala` contains a few utility functions (which you + should use!) and implementations of the built-in functions of Amy. + Use the built-ins as examples. +- `codegen/CodeGen.scala` is the focus of the assignment. It contains + code to translate Amy modules, functions and expressions to wasm + code. It is a pipeline and returns a wasm Module. +- `codegen/CodePrinter.scala` is a Pipeline which will print output + files from the wasm module. + +### The cgExpr function + +The focus of this assignment is the `cgExpr` function, which takes an +expression and generates a `Code` object. It also takes two additional +arguments: (1) a `LocalsHandler` which you can use to get a new slot for +a local when you encounter a local variable or you need a temporary +variable for your computation. (2) a map `locals` from `Identifiers` to +locals slots, i.e. indices, in the wasm world. For example, if `locals` +contains a pair `i -> 4`, we know that `get_local 4` in wasm will push +the value of i to the stack. Notice how `locals` is instantiated with +the function parameters in `cgFunction`. + +## Skeleton + +As usual, you can find the skeleton for this lab in a new branch of your +group\'s repository. After merging it with your existing work, the +structure of your project `src` directory should be as follows: + + src/amyc + ├── Main.scala (updated) + │ + ├── analyzer + │ ├── SymbolTable.scala + │ ├── NameAnalyzer.scala + │ └── TypeChecker.scala + │ + ├── ast + │ ├── Identifier.scala + │ ├── Printer.scala + │ └── TreeModule.scala + │ + ├── bin + │ └── ... + │ + ├── codegen (new) + │ ├── CodeGen.scala + │ ├── CodePrinter.scala + │ └── Utils.scala + │ + ├── interpreter + │ └── Interpreter.scala + │ + ├── lib + │ ├── scallion_3.0.6.jar + │ └── silex_3.0.6.jar + │ + ├── parsing + │ ├── Parser.scala + │ ├── Lexer.scala + │ └── Tokens.scala + │ + ├── utils + │ ├── AmycFatalError.scala + │ ├── Context.scala + │ ├── Document.scala + │ ├── Pipeline.scala + │ ├── Position.scala + │ ├── Reporter.scala + │ └── UniqueCounter.scala + │ + └── wasm (new) + ├── Function.scala + ├── Instructions.scala + ├── ModulePrinter.scala + └── Module.scala + +## Deliverables + +You are given **4 weeks** for this assignment. + +Deadline: **TBD**. + +Submission: one team member submits a zip file submission-groupNumber.zip to the [moodle submission page](). diff --git a/labs/labs_06.md b/labs/labs_06.md new file mode 100644 index 0000000..edd768f --- /dev/null +++ b/labs/labs_06.md @@ -0,0 +1,110 @@ +# Labs 06: Compiler extension project + +You have now written a compiler for Amy, a simple functional language. +The final lab project is to design and implement a new functionality of +your own choice on top of the compiler you built so far. In preparation +for this, you should aim to learn about the problem domain by searching +the appropriate literature. The project includes: + +- designing and implementing the new functionality +- documenting the results in a written report document + +This project has several deadlines, detailed below. Please note that the +first of them (choosing the topic) is already coming up on Sunday! + +## Selecting a Project Topic + +**Deadline: TBD** + +In the following document, we list several project ideas, but you should +also feel free to submit your own by email. All groups will rank the +projects in order of preference, and we will then do our best to assign +the preferred projects to as many groups as possible. Because not all +projects are equally difficult, we annotated each of them with the +expected workload. The suggested projects cover a wide range of +complexity, and we will evaluate your submissions with that complexity +in mind. For instance, for a project marked with `(1)` (relatively low +complexity) we will be expecting a polished, well-tested and +well-documented extension, whereas projects on the other end (`(3)`) may +be more prototypical. For all submissions, however, we require that you +deliver code that compiles and a set of example input files that +demonstrate the new functionality. + +[Project ideas](labs06_material/extensions.pdf) + +To announce your preferences, [please fill out this form by Sunday at +the latest](). You\'ll have to +provide **the names of the top exactly 5** projects you would like to +work on, in order of descending preference. We will do our best to +assign you the project you are most interested in. + +## Project Orientation + +**Deadline: TBD** + +We will try to inform you about the project assignment as soon as +possible. To give you a chance to validate your understanding of the +project and what\'s expected of you, we will offer dedicated slots +during the project sessions next week. Before you join, you should think +about the following questions + +- What are the features you will add to the compiler/language? +- What would be some (short) programs highlighting the use of these + features? +- What changes might be required in each compiler phase and/or what + new phases would you add? (Very roughly) + +**TODO: define slots** + +## Project Presentation + +You will present your idea during the lab sessions on the last regular +week of the semester (Dec 16th/22nd/23rd). We\'ll announce the concrete +schedule of presentations at a later point. [Instructions on what and +how to present your project can be found here.](labs06_material/presentation.md) + +## Project Implementation and Report + +**Deadline: Jan 7th 2021 23h00** + +Your implementation and a report are due on this date, and both will be +delivered using Git. You will develop your project on top of your +implementation of Amy. Please push all development on a new branch +`lab06`, ideally building on top of the codegen lab (branch `lab05`). +**TODO: define submission method** + +Your repository should contain: + +- Your implementation, which must, to be graded at all, compile and be + able to run non-trivial examples. +- A subdirectory `extension-examples/` which includes some examples + that demonstrate your compiler extension in action. +- A subdirectory `report/` which includes a PDF summarizing your + extension. + +**If you did not manage to complete your planned features, or they are +partially implemented, make this clear in your report!** + +You are encouraged to use the following (LaTeX) template for your +report: + +- [LaTeX sources](labs06_material/report-template.tar.gz) + +A PDF version of the template with the required section is available +here: + +- [PDF Example](labs06_material/report-template.pdf) + +Although you are not required to use the above template, your report +must contain at least the sections described in it with the appropriate +information. Note that writing this report will take some time, and you +should not do it in the last minute. The final report is an important +part of the compiler project. If you have questions about the template +or the contents of the report, make sure you ask them early. + +A common question is \"how long should the report be?\". There\'s no +definitive answer to that. Considering that the report will contain code +examples and a technical description of your implementation, it would be +surprising if it were shorter than 3 pages. Please try to stay within 6 +pages. A concise, but well-written report is preferable to a long, but +poorly-written one. -- GitLab