feat(tazjin/presentations): bootstrap tvix-eval-2023 presentation

I spent way too much time fighting LaTeX to do roughly what I want
here again, but all the alternatives are even worse.

Change-Id: Ibe12a4ce175ceb73e9d6e276613dcd4827dd76c4
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9150
Autosubmit: tazjin <tazjin@tvl.su>
Reviewed-by: Mark Shevchenko <markshevchenko@gmail.com>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2023-08-24 01:19:38 +03:00 committed by clbot
parent 88c3e2b4a0
commit eb0b33db72
6 changed files with 288 additions and 0 deletions

View file

@ -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.

View file

@ -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));
}

View file

@ -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>");
// ...
}

View file

@ -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/
'';
}

View file

@ -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 и его чатей"
}
]
}

View file

@ -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}