diff options
6 files changed, 288 insertions, 0 deletions
diff --git a/users/tazjin/presentations/tvix-eval-2023/README.md b/users/tazjin/presentations/tvix-eval-2023/README.md new file mode 100644 index 000000000000..ef8c9c6421d4 --- /dev/null +++ b/users/tazjin/presentations/tvix-eval-2023/README.md @@ -0,0 +1,12 @@ +These are the slides for a talk at the Moscow Rust User Group / +ProgMSK on 2023-09-07. + +After building, the presentation can be launched with `pdfpc` +(available in `nixpkgs`), like this: + +``` +pdfpc --windowed=both result/presentation.pdf -R presentation.pdfpc +``` + +I keep the JSON file formatted using `jq . presentation.pdfpc | sponge +presentation.pdfpc` for easier diffs. diff --git a/users/tazjin/presentations/tvix-eval-2023/cppnix-example-lexer.cpp b/users/tazjin/presentations/tvix-eval-2023/cppnix-example-lexer.cpp new file mode 100644 index 000000000000..7c52bce8b6d2 --- /dev/null +++ b/users/tazjin/presentations/tvix-eval-2023/cppnix-example-lexer.cpp @@ -0,0 +1,13 @@ +attrpath + : attrpath '.' attr { + $$ = $1; $1->push_back(AttrName(data->symbols.create($3))); + } + | attrpath '.' string_attr + { $$ = $1; + ExprString * str = dynamic_cast<ExprString *>($3); + if (str) { + $$->push_back(AttrName(data->symbols.create(str->s))); + delete str; + } else + $$->push_back(AttrName($3)); + } diff --git a/users/tazjin/presentations/tvix-eval-2023/cppnix-example-smuggling.cpp b/users/tazjin/presentations/tvix-eval-2023/cppnix-example-smuggling.cpp new file mode 100644 index 000000000000..ee0ab4ab4117 --- /dev/null +++ b/users/tazjin/presentations/tvix-eval-2023/cppnix-example-smuggling.cpp @@ -0,0 +1,12 @@ +struct Env { + Value * values[0]; + // ... some more fields +}; + +// .... + +if (env->type == Env::HasWithExpr) { + Value * v = allocValue(); + evalAttrs(*env->up, (Expr *) env->values[0], *v, noPos, "<borked>"); + // ... +} diff --git a/users/tazjin/presentations/tvix-eval-2023/default.nix b/users/tazjin/presentations/tvix-eval-2023/default.nix new file mode 100644 index 000000000000..6b3076895097 --- /dev/null +++ b/users/tazjin/presentations/tvix-eval-2023/default.nix @@ -0,0 +1,54 @@ +{ depot, pkgs, ... }: + +let + inherit (pkgs) fontconfig texlive stdenv imagemagick; + + tex = texlive.combine { + inherit (texlive) + babel + babel-russian + beamer + beamertheme-metropolis + etoolbox + euenc + extsizes + fontspec + listings + xetex + minted + ms + pgfopts + scheme-basic + translator; + }; + +in +stdenv.mkDerivation { + name = "progmsk-tvix-eval"; + src = ./.; + + nativeBuildInputs = [ tex imagemagick fontconfig ]; + + FONTCONFIG_FILE = pkgs.makeFontsConf { + fontDirectories = with pkgs; [ jetbrains-mono fira fira-code fira-mono ]; + }; + + buildPhase = '' + # LaTeX needs a cache folder in /home/ ... + mkdir home + export HOME=$PWD/home + + # webp images can't be included directly, need to convert to PNG + convert ${depot.tvix.website}/tvix-logo.webp tvix-logo.png + + # As usual, TeX needs to be run twice ... + ${tex}/bin/xelatex presentation.tex + ${tex}/bin/xelatex presentation.tex + ''; + + installPhase = '' + mkdir -p $out + cp presentation.pdf $out/ + cp $src/presentation.pdfpc $out/ + ''; +} diff --git a/users/tazjin/presentations/tvix-eval-2023/presentation.pdfpc b/users/tazjin/presentations/tvix-eval-2023/presentation.pdfpc new file mode 100644 index 000000000000..458624ff2d3f --- /dev/null +++ b/users/tazjin/presentations/tvix-eval-2023/presentation.pdfpc @@ -0,0 +1,49 @@ +{ + "pdfpcFormat": 2, + "disableMarkdown": false, + "noteFontSize": 20, + "pages": [ + { + "idx": 0, + "label": "1", + "overlay": 0, + "note": "Ничего особенного, просто кто я?\nЧто такое ТВЛ?" + }, + { + "idx": 2, + "label": "3", + "overlay": 0, + "note": "Ленив: надо создать объекты, которые репрезентируют отложенное вычисление.\nОрганично: много фичей работают только случайно, без документации, через рандомное поведение. Нам придется в принципе заниматься reverse-engineering, и типа diff-driven-development.\nМонорепо: Большинство всего Nix-кода есть в nixpkgs, значит что мы можем его использовать в качестве ултимативного интеграционного теста." + }, + { + "idx": 3, + "label": "4", + "overlay": 0, + "note": "Видем тут кусок лексера C++ Никса. Такой код там обычный. Лексер создает структуры, которые используется в рантайм, а вообще нет разделение забот" + }, + { + "idx": 4, + "label": "5", + "overlay": 0, + "note": "Еще кусок. В стракте Env есть массив поинтеров типа Value, но на самом деле, там добавляют поинтеры других типов, например Expr, потому что это было 'удобный' способ передать эти данные. Рассказ про первый попыток твикса - форк." + }, + { + "idx": 5, + "label": "6", + "overlay": 0, + "note": "Мы решили переписать Nix. Пришлось разберется с вопромос, на каком языке. Нам ответ был очевидный: на Rust. Мы хотели строго и хорошо типизированный язык, современные фичи и так далее. Не буду вам тут Rust продать - вы уже знаете. Нам еще помогло, что кто-то уже написал хороший парсер Nix на Rust" + }, + { + "idx": 6, + "label": "7", + "overlay": 0, + "note": "Шведский парень с юзернэймом, который нельзя произносить, написал rnix пару лет назад. Очень удобный, быстрый парсер с хорошей репрезентацией AST Никса. К сожалению, он умер в 2021 и сам никогда не видел, к чему привел его проект. Мы очень благодарны ему за его работу, и я просто хотел упомянуть его здесь." + }, + { + "idx": 7, + "label": "8", + "overlay": 0, + "note": "Существующий парсер, не только потому что нам лень, но тоже, потому что в коммюнити разработываются много тулинга с помощью этого парсера. Значит, у нас единный кодбейз для этого.\nБайткод - объязнить.\nобяъзнить tvix и его чатей" + } + ] +} diff --git a/users/tazjin/presentations/tvix-eval-2023/presentation.tex b/users/tazjin/presentations/tvix-eval-2023/presentation.tex new file mode 100644 index 000000000000..5b6d21cbfc27 --- /dev/null +++ b/users/tazjin/presentations/tvix-eval-2023/presentation.tex @@ -0,0 +1,148 @@ +\documentclass[12pt]{beamer} + +\usepackage[utf8]{inputenc} +\usepackage[main=russian,english]{babel} +\usepackage{fontspec} +\usepackage{listings} + +\setmainfont{JetBrains Mono} +\setsansfont{JetBrains Mono} + +\usetheme{metropolis} +\newenvironment{code}{\ttfamily}{\par} +\title{tvix-eval \\ компилятор и рантайм для Nix, на Rust} + +\titlegraphic{\vspace{4.8cm}\flushright\includegraphics[width=6cm,keepaspectratio=true]{tvix-logo.png}} + +\date{2023-09-07} +\author{Винсент Амбо} +\institute{TVL} + +\begin{document} + %% Slide 0 (title): + \begin{frame} + \begin{center} + \titlepage + \end{center} + \end{frame} + + %% Slide 1: + \begin{frame}{\textbf{Т}he \textbf{V}irus \textbf{L}ounge} + \begin{itemize} + \item Онлайн-комьюнити, занимающееся тулингом для монорепо + \item основной фокус на Nix + \item Nix не только для сборки пакетов + \item Хотелось решение, чтобы использовать Nix везде + \end{itemize} + \end{frame} + + %% Slide 2: + \begin{frame}{Особенности языка Nix} + \begin{itemize} + \item Ленивый язык. Вычислять все сразу нельзя. + \item Язык развивался органично. + \item Большинство кода на Nix --- в одном месте: \begin{code}nixpkgs\end{code} + \end{itemize} + \end{frame} + + %% Slide 3: + \begin{frame}{Текущая имплементация: C++ Nix} + \lstinputlisting[ + language=c++, + basicstyle={\scriptsize} + ]{cppnix-example-lexer.cpp} + \end{frame} + + %% Slide 4: + \begin{frame}{Текущая имплементация: C++ Nix} + \lstinputlisting[ + language=c++, + basicstyle={\scriptsize} + ]{cppnix-example-smuggling.cpp} + \end{frame} + + %% Slide 5: + \section{``Давайте перепишем Nix!''} + + %% Slide 6: + \section*{Спасибо, jD91mZM2!\\\normalsize{автор ``rnix-parser'', 2002-2021}} + + %% Slide 7: + \begin{frame}{tvix-eval, - (язык) Nix, на Rust} + \begin{itemize} + \item написано с существующим парсером + \item bytecode-интерпретатор, вместо tree-walk + \item должен работать не только для остальных частей tvix + \end{itemize} + \end{frame} + + %% Slide 8: + \begin{frame}{tvix-eval, основные части} + \begin{enumerate} + \item собственный байткод и компилятор + \end{enumerate} + \end{frame} + + %% показать opcode.rs, быстро показать compiler/mod.rs + + %% Slide 9: + \begin{frame}{tvix-eval, основные части} + \begin{enumerate} + \item собственный байткод и компилятор + \item представление значений языка в рантайме + \end{enumerate} + \end{frame} + + %% показать Value + + %% Slide 10: + \begin{frame}{tvix-eval, основные части} + \begin{enumerate} + \item собственный байткод и компилятор + \item представление значении языка в рантайме + \item ... и сам рантайм! + \end{enumerate} + \end{frame} + + %% показать VM + + \section{``Подожди, написать рантайм же не так просто?''} + + %% объяснить проблему со стеком и решение, показать диаграмму + + \section{``А откуда знаешь, что это все правильно работает?''} + + %% показать как тесты работают + %% объяснить дебагинг, Твиксболт и тд + + %% Slide 10: + \begin{frame}{tvix-eval, в браузере} + \begin{itemize} + \item удивительно легко делать + \item но есть сложности в \begin{code}std::\end{code} + % показать пример + \end{itemize} + \end{frame} + + %% Slide 11: + \begin{frame}{А что дальше?} + В tvix-eval есть еще кое-какие интересные проблемы. Может ты их + решишь? + \end{frame} + + \begin{frame}{Спасибо!} + Ссылки: + \begin{itemize} + \item tvix.dev + \item tvl.fyi + \item tvixbolt.tvl.su + \end{itemize} + + % TODO: QR code or something for these links + + \vspace{3cm} + \begin{center} + t.me/tazjin | tazjin@tvl.su + \end{center} + \end{frame} +\end{document} |