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:
parent
88c3e2b4a0
commit
eb0b33db72
6 changed files with 288 additions and 0 deletions
12
users/tazjin/presentations/tvix-eval-2023/README.md
Normal file
12
users/tazjin/presentations/tvix-eval-2023/README.md
Normal 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.
|
|
@ -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));
|
||||
}
|
|
@ -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>");
|
||||
// ...
|
||||
}
|
54
users/tazjin/presentations/tvix-eval-2023/default.nix
Normal file
54
users/tazjin/presentations/tvix-eval-2023/default.nix
Normal 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/
|
||||
'';
|
||||
}
|
49
users/tazjin/presentations/tvix-eval-2023/presentation.pdfpc
Normal file
49
users/tazjin/presentations/tvix-eval-2023/presentation.pdfpc
Normal 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 и его чатей"
|
||||
}
|
||||
]
|
||||
}
|
148
users/tazjin/presentations/tvix-eval-2023/presentation.tex
Normal file
148
users/tazjin/presentations/tvix-eval-2023/presentation.tex
Normal 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}
|
Loading…
Reference in a new issue