├── noc.png ├── ru.gif ├── ru ├── plan9.png ├── inferno.png ├── pagebg.png ├── titlebg.png ├── acme-alef.png ├── acme-limbo.png ├── strangego.pdf ├── unclesam.png ├── acme-libthread.png ├── newsqueak-2017.png ├── beamerouterthemegcr2019.sty ├── beamerthemegcr2019.sty ├── beamercolorthemegcr2019.sty ├── beamerinnerthemegcr2019.sty ├── strangego.bib └── strangego.tex ├── FUNDING.yml ├── .gitignore ├── README.md └── UNLICENSE /noc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/noc.png -------------------------------------------------------------------------------- /ru.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru.gif -------------------------------------------------------------------------------- /ru/plan9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/plan9.png -------------------------------------------------------------------------------- /ru/inferno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/inferno.png -------------------------------------------------------------------------------- /ru/pagebg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/pagebg.png -------------------------------------------------------------------------------- /ru/titlebg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/titlebg.png -------------------------------------------------------------------------------- /ru/acme-alef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/acme-alef.png -------------------------------------------------------------------------------- /ru/acme-limbo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/acme-limbo.png -------------------------------------------------------------------------------- /ru/strangego.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/strangego.pdf -------------------------------------------------------------------------------- /ru/unclesam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/unclesam.png -------------------------------------------------------------------------------- /ru/acme-libthread.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/acme-libthread.png -------------------------------------------------------------------------------- /ru/newsqueak-2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/schors/gcr2019strangego/HEAD/ru/newsqueak-2017.png -------------------------------------------------------------------------------- /FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: schors 2 | custom: ["https://www.paypal.me/schors", "http://yasobe.ru/na/schors"] 3 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *\~ 2 | *.swp 3 | *.aux 4 | *.bbl 5 | *.bcf 6 | *.blg 7 | *.log 8 | *.nav 9 | *.out 10 | *.xml 11 | *.snm 12 | *.toc 13 | *.vrb 14 | 15 | -------------------------------------------------------------------------------- /ru/beamerouterthemegcr2019.sty: -------------------------------------------------------------------------------- 1 | \mode 2 | 3 | % Frame title 4 | \defbeamertemplate*{frametitle}{gcr2019}[1][] 5 | { 6 | %\vskip1cm 7 | \vskip0.25cm 8 | \begin{beamercolorbox}[wd=\paperwidth,leftskip=0.5cm]{frametitle} 9 | \usebeamerfont{frametitle}% 10 | \insertframetitle 11 | \end{beamercolorbox} 12 | \vskip-0.25cm 13 | } 14 | 15 | \mode 16 | -------------------------------------------------------------------------------- /ru/beamerthemegcr2019.sty: -------------------------------------------------------------------------------- 1 | \mode 2 | 3 | % Requirement 4 | \RequirePackage{tikz} 5 | 6 | % Settings 7 | \useinnertheme{gcr2019} 8 | \useoutertheme{gcr2019} 9 | \usecolortheme{gcr2019} 10 | 11 | \setbeamertemplate{navigation symbols}{} 12 | \setbeamertemplate{blocks}[rounded][shadow=true] 13 | \setbeamertemplate{footline}{\vspace{0.5cm}} 14 | \setbeamersize{text margin left=0.5cm,text margin right=0.3cm} 15 | 16 | \mode 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Презентация "Почему Golang такой странный" 2 | ========================================== 3 | 4 | GolangConf 2019 в Москве 5 | ------------------------ 6 | 7 | * Презентация сделана на LaTeX 8 | * Есть единый шаблон для конференции GolangConf 2019 9 | 10 | [Скомпилированная презентация на русском](ru/strangego.pdf) 11 | ![](ru.gif) 12 | 13 | Donate 14 | ------ 15 | 16 | * PayPal https://www.paypal.me/schors 17 | * Yandex.Money http://yasobe.ru/na/schors 18 | * BTC: 18YFeAV12ktBxv9hy4wSiSCUXXAh5VR7gE 19 | * LTC: LVXP51M8MrzaEQi6eBEGWpTSwckybqHU5s 20 | * ETH: 0xba53cebd99157bf412a6bb91165e7dff29abd0a2 21 | 22 | --- 23 | [![UNLICENSE](noc.png)](UNLICENSE) 24 | -------------------------------------------------------------------------------- /ru/beamercolorthemegcr2019.sty: -------------------------------------------------------------------------------- 1 | \mode 2 | 3 | % Settings 4 | \AtBeginDocument{\setromanfont{Times New Roman}} 5 | \AtBeginDocument{\setsansfont{Arial}} 6 | \AtBeginDocument{\setmonofont{Courier New}} 7 | \setbeamercolor*{title page header}{fg=white} 8 | \setbeamerfont*{title}{size*={32pt}{1},family=\sffamily} 9 | \setbeamercolor*{author}{fg=white} 10 | \setbeamerfont*{author}{size*={18pt}{1},family=\sffamily} 11 | \setbeamercolor*{frametitle}{fg=black} 12 | \setbeamerfont*{frametitle}{size*={22pt}{1},family=\sffamily} 13 | \definecolor{text}{HTML}{595959} 14 | \setbeamercolor{normal text}{fg=text} 15 | \setbeamerfont{normal text}{size*={16pt}{18},family=\sffamily} 16 | \AtBeginDocument{\usebeamerfont{normal text}} 17 | 18 | \mode 19 | 20 | -------------------------------------------------------------------------------- /ru/beamerinnerthemegcr2019.sty: -------------------------------------------------------------------------------- 1 | \mode 2 | 3 | \setbeamertemplate{background}{ 4 | \begin{tikzpicture} 5 | \ifnum\thepage=1\relax% 6 | \node[anchor=south west,inner sep=0] at (0,0) {\includegraphics[width=\the\paperwidth, height=\the\paperheight]{titlebg.png}}; 7 | \fi 8 | \ifnum\thepage>1\relax% 9 | \node[anchor=south west,inner sep=0] at (0,0) {\includegraphics[width=\the\paperwidth, height=\the\paperheight]{pagebg.png}}; 10 | \node[anchor=south west] at(0.2cm,0.2cm) {\color{text}\tiny\insertframenumber}; 11 | \fi 12 | \end{tikzpicture} 13 | } 14 | 15 | % Title page 16 | \defbeamertemplate*{title page}{gcr2019}[1][] 17 | { 18 | \vskip1cm% 19 | \begin{beamercolorbox}[leftskip=0.5cm,left,#1]{title page header} 20 | \usebeamerfont{title}\inserttitle\par% 21 | \end{beamercolorbox}% 22 | \vskip0.75cm% 23 | \begin{beamercolorbox}[leftskip=0.5cm,left,#1]{author} 24 | \usebeamerfont{author}\insertauthor% 25 | \end{beamercolorbox} 26 | \vspace{9cm} 27 | } 28 | 29 | \mode 30 | 31 | -------------------------------------------------------------------------------- /UNLICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /ru/strangego.bib: -------------------------------------------------------------------------------- 1 | @online{plan9, 2 | title = "Plan9 from Bell Labs", 3 | url = "http://9p.io/", 4 | keywords= "plan9" 5 | } 6 | 7 | @online{preface2e, 8 | author = "Doug McIlroy", 9 | title = "Plan9. Preface to the Second (1995) Edition", 10 | year = "1995", 11 | month = "3", 12 | url = "http://9p.io/sys/man/preface.html", 13 | keywords= "plan9" 14 | } 15 | 16 | @online{plan9-fi, 17 | title = "Standalone term/cpu/auth/file servers", 18 | url = "http://www.plan9.fi/cpu.txt", 19 | keywords= "plan9" 20 | } 21 | 22 | @online{9front, 23 | title = "A fork of Plan 9 from Bell Labs by the People's Front of Cat -V", 24 | url = "http://9front.org/", 25 | keywords= "plan9" 26 | } 27 | 28 | @online{plan9-alef, 29 | title = "building Alef language", 30 | url = "http://mail.9fans.net/pipermail/9fans/2019-September/037921.html", 31 | keywords= "plan9,alef" 32 | } 33 | 34 | @online{libthread, 35 | title = "Plan9 THREAD(2)", 36 | url = "http://man.cat-v.org/plan_9/2/thread", 37 | keywords= "plan9,libthread" 38 | } 39 | 40 | @online{inferno, 41 | title = "Inferno OS", 42 | url = "http://www.vitanuova.com/inferno/", 43 | keywords= "inferno" 44 | } 45 | 46 | @online{inferno-gc, 47 | title = "Very Concurrent Mark and Sweep Garbage Collection without Fine-Grain Synchronization", 48 | url = "http://doc.cat-v.org/inferno/concurrent_gc/", 49 | keywords= "inferno" 50 | } 51 | 52 | @online{limbo-add, 53 | title = "Addendum to The Limbo Programming Language", 54 | url = "http://www.vitanuova.com/inferno/papers/addendum.pdf", 55 | keywords= "inferno,limbo" 56 | } 57 | 58 | @online{limbo-ch, 59 | title = "System and Interface Changes to Inferno", 60 | url = "http://doc.cat-v.org/inferno/4th_edition/release_notes/changes", 61 | keywords= "inferno,limbo" 62 | } 63 | 64 | @online{limbo-ru, 65 | title = "OS Inferno: Programming Limbo (RU)", 66 | url = "https://powerman.name/Inferno/Limbo.html", 67 | keywords= "inferno,limbo" 68 | } 69 | 70 | @online{limbo-exm, 71 | title = "Examples for the Limbo Programming Language", 72 | url = "https://github.com/henesy/limbobyexample", 73 | keywords= "inferno,limbo" 74 | } 75 | 76 | @online{hoare-csp, 77 | author = "Tony Hoare", 78 | title = "Communicating Sequential Processes (CSP)", 79 | date = "1978-05-18", 80 | url = "http://www.usingcsp.com/", 81 | keywords= "common" 82 | } 83 | 84 | @online{newsqueak-2007, 85 | author = "Rob Pike", 86 | title = "Concurrency/message passing Newsqueak", 87 | year = "2007", 88 | month = "3", 89 | url = "https://youtu.be/hB05UFqOtFA", 90 | keywords= "common" 91 | } 92 | 93 | @online{go-2009, 94 | title = "go/go/refs/tags/weekly.2009-11-06", 95 | date = "2009-11-06", 96 | url = "https://go.googlesource.com/go/+/refs/tags/weekly.2009-11-06", 97 | keywords= "common" 98 | } 99 | 100 | @online{rcs-csp, 101 | title = "Bell Labs and CSP Threads", 102 | url = "https://swtch.com/~rsc/thread/", 103 | keywords= "common" 104 | } 105 | 106 | @online{Unixse-2003, 107 | title = "Interview with Dennis Ritchie (2003)", 108 | year = "2003", 109 | month = "2", 110 | url = "https://anders.unix.se/2015/10/26/interview-with-dennis-ritchie-2003/", 111 | keywords= "common" 112 | } 113 | 114 | @online{thume-20190714, 115 | author = "Tristan Hume", 116 | title = "Models of Generics and Metaprogramming: Go, Rust, Swift, D and More", 117 | date = "2019-07-14", 118 | url = "http://thume.ca/2019/07/14/a-tour-of-metaprogramming-models-for-generics/", 119 | keywords= "common,en" 120 | } 121 | 122 | @online{habr-461321, 123 | author = "Тристан Хьюм", 124 | title = "Модели дженериков и метапрограммирования: Go, Rust, Swift, D и другие", 125 | date = "2019-07-25", 126 | url = "https://habr.com/ru/company/mailru/blog/461321/", 127 | keywords= "common,ru" 128 | } 129 | 130 | @online{goblog-wg, 131 | author = "Ian Lance Taylor", 132 | title = "Why Generics?", 133 | date = "2019-07-31", 134 | url = "https://blog.golang.org/why-generics", 135 | keywords= "common,en" 136 | } 137 | 138 | @online{habr-462811, 139 | author = "Ян Ланс Тейлор", 140 | title = "Зачем нужны дженерики в Go?", 141 | date = "2019-08-07", 142 | url = "https://habr.com/ru/company/mailru/blog/462811/", 143 | keywords= "common,ru" 144 | } 145 | 146 | @online{go-asm, 147 | title = "A Quick Guide to Go's Assembler", 148 | url = "https://golang.org/doc/asm", 149 | keywords= "asm" 150 | } 151 | 152 | @online{plan9-asm, 153 | title = "A Manual for the Plan 9 assembler", 154 | url = "https://9p.io/sys/doc/asm.html", 155 | keywords= "asm" 156 | } 157 | 158 | @online{pike-goasm, 159 | author = "Rob Pike", 160 | title = "The Design of the Go Assembler", 161 | url = "https://youtu.be/KINIAgRpkDA", 162 | keywords= "asm" 163 | } 164 | 165 | @online{av, 166 | author = "Александр Венедюхин", 167 | title = "Шифр <<Кузнечик>> на Go", 168 | date = "2019-02-18", 169 | url = "https://dxdt.ru/2019/02/18/8702/", 170 | keywords= "asm" 171 | } 172 | 173 | @online{cfecdsa, 174 | title = "Cloudflare CIRCL", 175 | date = "2019-06-20", 176 | url = "https://blog.cloudflare.com/introducing-circl/", 177 | keywords= "asm" 178 | } 179 | 180 | @online{ishar, 181 | author = "Iskander Sharipov", 182 | title = "Go assembly language complementary reference", 183 | date = "2017-09-20", 184 | url = "https://quasilyte.dev/blog/post/go-asm-complementary-reference/", 185 | keywords= "asm" 186 | } 187 | 188 | -------------------------------------------------------------------------------- /ru/strangego.tex: -------------------------------------------------------------------------------- 1 | % !TeX TS-program = xelatex 2 | 3 | \documentclass[aspectratio=169]{beamer} 4 | 5 | \usepackage{xltxtra} 6 | \usepackage[main=russian,english]{babel} 7 | \defaultfontfeatures{Mapping=tex-text} 8 | \usepackage{listings} 9 | 10 | \usepackage[backend=biber,bibstyle=numeric,citestyle=numeric-comp,sorting=none,defernumbers=true,date=long]{biblatex} 11 | \addbibresource{strangego.bib} 12 | 13 | \makeatletter 14 | \let\old@lstKV@SwitchCases\lstKV@SwitchCases 15 | \def\lstKV@SwitchCases#1#2#3{} 16 | \makeatother 17 | \usepackage{lstlinebgrd} 18 | \makeatletter 19 | \let\lstKV@SwitchCases\old@lstKV@SwitchCases 20 | 21 | \lst@Key{numbers}{none}{% 22 | \def\lst@PlaceNumber{\lst@linebgrd}% 23 | \lstKV@SwitchCases{#1}% 24 | {none:\\% 25 | left:\def\lst@PlaceNumber{\llap{\normalfont 26 | \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}\lst@linebgrd}\\% 27 | right:\def\lst@PlaceNumber{\rlap{\normalfont 28 | \kern\linewidth \kern\lst@numbersep 29 | \lst@numberstyle{\thelstnumber}}\lst@linebgrd}% 30 | }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}} 31 | \makeatother 32 | 33 | \setmainfont{Arial} 34 | %\setromanfont{Times New Roman} 35 | %\setsansfont{Arial} 36 | %\setmonofont{Courier New} 37 | 38 | \title{Почему Golang такой странный} 39 | \author{Филипп Кулин (Дремучий лес)} 40 | 41 | \usetheme{gcr2019} 42 | 43 | \setbeamercolor{itemize item}{fg=text} 44 | \setbeamercolor{itemize subitem}{fg=text} 45 | \setbeamercolor{alerted text}{fg=text} 46 | \setbeamertemplate{itemize items}{\textbullet} 47 | \setbeamerfont*{itemize/enumerate subbody}{parent=itemize/enumerate body} 48 | \setbeamerfont*{itemize/enumerate subsubbody}{parent=itemize/enumerate subbody} 49 | \setbeamerfont{alerted text}{series=\bfseries} 50 | 51 | \definecolor{acmebg}{HTML}{FFFFEF} 52 | \definecolor{acmeh}{HTML}{EFFFFF} 53 | \definecolor{acmec}{HTML}{8C8ACE} 54 | \definecolor{acmel}{HTML}{52AAAD} 55 | \definecolor{acmel1}{HTML}{EFEF9C} 56 | \definecolor{acmel2}{HTML}{9CEFEF} 57 | \lstset{ 58 | columns=flexible, 59 | keepspaces=true, 60 | showstringspaces=false, 61 | showtabs=false, 62 | tabsize=4, 63 | frame=single, 64 | basicstyle=\fontsize{10pt}{12}\bf\ttfamily\color{black}, 65 | %basicstyle=\bf\tiny\ttfamily\color{black}, 66 | backgroundcolor=\color{acmebg}, 67 | commentstyle=\color{black}, 68 | keywordstyle=\color{black}, 69 | stringstyle=\color{red}, 70 | rulecolor=\color{acmel}, 71 | framerule=1pt 72 | %moredelim=**[is][\only<+>{\colorbox{acmel1}{#1}}]{@}{@}, 73 | } 74 | 75 | \setbeamerfont{bibliography item}{size*={8pt}{1}} 76 | %\setbeamerfont{bibliography entry author}{size*={8pt}{1}} 77 | %\setbeamerfont{bibliography entry title}{size*={8pt}{1}} 78 | %\setbeamerfont{bibliography entry location}{size*={8pt}{1}} 79 | %\setbeamerfont{bibliography entry note}{size*={8pt}{1}} 80 | %\setbeamercolor{bibliography entry author}{fg=text, bg=} 81 | %\setbeamercolor{bibliography entry title}{fg=text, bg=} 82 | %\setbeamercolor{bibliography entry location}{fg=blue, bg=} 83 | %\setbeamercolor{bibliography entry note}{fg=text, bg=} 84 | %\setbeamertemplate{bibliography entry article}{} 85 | %\setbeamertemplate{bibliography entry title}{} 86 | %\setbeamertemplate{bibliography entry location}{} 87 | %\setbeamertemplate{bibliography entry note}{} 88 | %\setbeamertemplate{bibliography item}[text] 89 | 90 | % for biblatex 91 | \setbeamertemplate{bibliography item}{\insertbiblabel} 92 | \renewcommand*{\bibfont}{\fontsize{8}{1}\selectfont} 93 | \DeclareFieldFormat{url}{\color{blue}\url{#1}} 94 | 95 | 96 | \newcommand{\clbox}[2]{% 97 | \hspace*{-\fboxsep}\colorbox{#1}{#2}\hspace*{-\fboxsep}% 98 | } 99 | 100 | \makeatletter 101 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 102 | % 103 | % \btIfInRange{number}{range list}{TRUE}{FALSE} 104 | % 105 | % Test in int number is element of a (comma separated) list of ranges 106 | % (such as: {1,3-5,7,10-12,14}) and processes or respectively 107 | 108 | \newcount\bt@rangea 109 | \newcount\bt@rangeb 110 | 111 | \newcommand\btIfInRange[2]{% 112 | \global\let\bt@inrange\@secondoftwo% 113 | \edef\bt@rangelist{#2}% 114 | \foreach \range in \bt@rangelist {% 115 | \afterassignment\bt@getrangeb% 116 | \bt@rangea=0\range\relax% 117 | \pgfmathtruncatemacro\result{ ( #1 >= \bt@rangea) && (#1 <= \bt@rangeb) }% 118 | \ifnum\result=1\relax% 119 | \breakforeach% 120 | \global\let\bt@inrange\@firstoftwo% 121 | \fi% 122 | }% 123 | \bt@inrange% 124 | } 125 | \newcommand\bt@getrangeb{% 126 | \@ifnextchar\relax% 127 | {\bt@rangeb=\bt@rangea}% 128 | {\@getrangeb}% 129 | } 130 | \def\@getrangeb-#1\relax{% 131 | \ifx\relax#1\relax% 132 | \bt@rangeb=100000% \maxdimen is too large for pgfmath 133 | \else% 134 | \bt@rangeb=#1\relax% 135 | \fi% 136 | } 137 | 138 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 139 | % 140 | % \btLstHL{range list} 141 | % 142 | % TODO BUG: \btLstHL commands can not yet be accumulated if more than one overlay spec match. 143 | % 144 | \newcommand<>{\btLstHL}[1]{% 145 | \only#2{\btIfInRange{\value{lstnumber}}{#1}{\color{acmel1}\def\lst@linebgrdcmd{\color@block}}{\def\lst@linebgrdcmd####1####2####3{}}}% 146 | }% 147 | \makeatother 148 | 149 | \begin{document} 150 | 151 | \begin{frame} 152 | \titlepage 153 | \end{frame} 154 | 155 | \begin{frame}{Откиньтесь на спинку кресла} 156 | \begin{itemize} 157 | \item Эта презентация сделана с помощью \LaTeX 158 | \item Я расскажу красивую лёгкую сказку 159 | \item Но в ней будет много несложного кода 160 | \item Весь код проверялся на компиляцию и работу 161 | \end{itemize} 162 | \end{frame} 163 | 164 | \begin{frame}{Go действительно странный} 165 | \begin{itemize} 166 | \item<1-> Вот эти странные "\texttt{:=}" и "\texttt{=}" 167 | \item<1-> Нет дженериков 168 | \item<1-> Нет класcического ООП, изобретено что-то свое 169 | \item<1-> Каналы какие-то 170 | \item<1-> Необычный язык ассемблера 171 | \end{itemize} 172 | \onslide<2-> \textbf{Зачем всё это было изобретать в 2007 году?} 173 | \end{frame} 174 | 175 | \begin{frame}{Рождённый старым} 176 | \textbf{История Go началась задолго до 2007 года} 177 | \end{frame} 178 | 179 | \begin{frame}{В самом начале} 180 | \begin{itemize} 181 | \item<1-> 1970-1975. Томпсон и Ритчи создают UNIX и C 182 | \item<1-> В 80-е бурно развиваются компьютерные сети 183 | \item<1-> К концу 80-х некоторые считают, что UNIX морально устарел \\ 184 | %\small\textit{подскажите, как я могу передать вам файл сейчас?} 185 | \end{itemize} 186 | \onslide<2-> ``Not only is Unix dead, it's starting to smell really bad'' 187 | \onslide<3-> \rightline{{\rm --- Роб Пайк, около 1991}} 188 | \end{frame} 189 | 190 | \begin{frame}{Plan9 from Bell Labs} 191 | \begin{columns}[T,onlytextwidth] 192 | \begin{column}{0.44\textwidth} 193 | \begin{itemize} 194 | \item 1989г --- прототип 195 | \item 1992г --- релиз 196 | \item Создан UTF-8 197 | \item Всё --- файл, procfs 198 | \item Протокол 9P 199 | \item Make mainframe great again 200 | \item Несколько платформ 201 | \end{itemize} 202 | %\small{Основные разработчики:\\\emph{Кен Томпсон, Деннис Ритчи, Роб Пайк}} 203 | \end{column} 204 | \begin{column}{0.56\textwidth} 205 | \includegraphics[width=\textwidth]{plan9.png} 206 | \end{column} 207 | \end{columns} 208 | \end{frame} 209 | 210 | \begin{frame}[label=cc]{Plan9. Кросскомпиляция} 211 | % http://doc.cat-v.org/plan_9/2nd_edition/papers/comp 212 | \begin{itemize} 213 | \item Компиляторы: 2c, 8c, 8al, 8g, 6a, 6c... 214 | \item Компоновщики: 2l, 8l, 6l... 215 | \item Первый символ обозначает архитектуру "O" 216 | \item Компилятор создает объектный файл \texttt{file.} 217 | \item Объектный файл --- псевдо-ассемблер 218 | \item Компоновщик присваивает инструкции 219 | \item \texttt{\% 6c -o test.6 test.c; 6l -o 6.test test.6} 220 | \item Или вот так: \texttt{\% objtype=amd64 mk} 221 | \end{itemize} 222 | \end{frame} 223 | 224 | \begin{frame}{Архитектуры Plan9 (современные)} 225 | \begin{columns}[T,onlytextwidth] 226 | \begin{column}{0.5\textwidth} 227 | \begin{itemize} 228 | \item \textbf{k}: SPARC 229 | \item \textbf{x}: AT\&T DSP3210 230 | \item \textbf{v}: be MIPS 3000 231 | \item \textbf{q}: PowerPC 232 | \item \textbf{0}: le MIPS 3000 233 | \end{itemize} 234 | \end{column} 235 | \begin{column}{0.5\textwidth} 236 | \begin{itemize} 237 | \item \textbf{1}: Motorola 68000 238 | \item \textbf{2}: Motorola 68040 239 | \item \textbf{5}: le ARM 240 | \item \textbf{6}: AMD64 241 | \item \textbf{7}: ARM64 242 | \item \textbf{8}: i386 243 | \end{itemize} 244 | \end{column} 245 | \end{columns} 246 | \end{frame} 247 | 248 | \begin{frame}{Редактор Acme} 249 | \begin{columns}[T,onlytextwidth] 250 | \begin{column}{0.44\textwidth} 251 | \begin{itemize} 252 | \item Для разработчиков 253 | \item Автор --- \emph{Роб Пайк} 254 | \item Написан на Alef 255 | \item Alef = Acme 256 | \item 30 лет с нами 257 | \end{itemize} 258 | \end{column} 259 | \begin{column}{0.56\textwidth} 260 | \includegraphics[width=\textwidth]{acme-alef.png} 261 | \end{column} 262 | \end{columns} 263 | \end{frame} 264 | 265 | \begin{frame}{За несколько лет до этого...} 266 | \begin{itemize} 267 | \item 1978 --- \emph{Тони Хоар}. Взаимодействие последовательных процессов 268 | \item 1982+ --- \emph{Роб Пайк}. Blit, mps, mux 269 | \item 1985 --- \emph{Лука Карделли} и \emph{Роб Пайк}. Язык Squeak 270 | \item 1988 --- \emph{Роб Пайк}. Язык Newsqueak. Игрушечные окошки 271 | \item 1989-2002 --- \emph{Роб Пайк}. Окна 8½, rio 272 | \item 1989-1995 --- \emph{Фил Винтерботтом}. Язык Alef на основе Newsqueak 273 | \end{itemize} 274 | \end{frame} 275 | 276 | \begin{frame}{Язык Alef} 277 | \begin{itemize} 278 | \item Нет сборщика мусора 279 | \item Частично написан на самом себе (рантайм) 280 | \item Компилятор создаёт стандартные объекты 281 | \item Параллельное и конкурентное программирование 282 | \item Последняя версия --- 1995 год 283 | \end{itemize} 284 | \end{frame} 285 | 286 | \begin{frame}[fragile]{Alef. Каналы} 287 | \begin{columns}[T,onlytextwidth] 288 | \begin{column}{0.48\textwidth} 289 | \begin{lstlisting}[linebackgroundcolor={\btLstHL{5,11,14}}] 290 | #include 291 | 292 | void receive(chan(byte*) c) { 293 | byte *s; 294 | s = <-c; 295 | print("%s\n", s); 296 | terminate(nil); 297 | } 298 | 299 | void main(void) { 300 | chan(byte*) c; 301 | alloc c; 302 | proc receive(c); 303 | c <-= "hello world"; 304 | terminate(nil); 305 | } \end{lstlisting} 306 | \end{column} 307 | \begin{column}{0.48\textwidth} 308 | \begin{itemize} 309 | \item Синхронные 310 | \item Асинхронные 311 | \item Всё, как мы любим 312 | \item И между процессами 313 | \item И между корутинами 314 | \end{itemize} 315 | \end{column} 316 | \end{columns} 317 | \end{frame} 318 | 319 | \begin{frame}[fragile]{Alef. Параллелизм} 320 | \begin{columns}[T,onlytextwidth] 321 | \begin{column}{0.48\textwidth} 322 | \begin{lstlisting}[linebackgroundcolor={\btLstHL{8,9,11,14}}] 323 | chan(int) a0, a1; 324 | 325 | void produce(chan(int) j, int c); 326 | 327 | void main(void) { 328 | int i; 329 | alloc a0, a1; 330 | proc produce(a0, '0'); 331 | proc produce(a1, '1'); 332 | for(i = 0; i < 10; i++) 333 | par { 334 | a0 <-= i; 335 | a1 <-= i; 336 | } 337 | } \end{lstlisting} 338 | \end{column} 339 | \begin{column}{0.5\textwidth} 340 | \texttt{proc}: запуск процесса \\ 341 | \texttt{par}: параллельный запуск 342 | \end{column} 343 | \end{columns} 344 | \end{frame} 345 | 346 | \begin{frame}[fragile]{Alef. Хороший пример "par"} 347 | \begin{lstlisting}[linebackgroundcolor={\btLstHL{7,9,10}}] 348 | active = malloc(BUFSIZE); 349 | passive = malloc(BUFSIZE); 350 | 351 | n = decode(fd, active, BUFSIZE); /* first block */ 352 | while(active != nil) { 353 | par { 354 | display(active, n); 355 | 356 | if(decode(fd, passive, BUFSIZE) <= 0) 357 | passive = nil; 358 | } 359 | (active, passive) = (passive, active); 360 | } \end{lstlisting} 361 | \end{frame} 362 | 363 | \begin{frame}[fragile]{Alef. Конкурентность} 364 | \begin{lstlisting}[linewidth=0.75\textwidth,xleftmargin=0.05\textwidth,linebackgroundcolor={\btLstHL{7,9,16}}] 365 | void produce(chan(int) c); 366 | 367 | void main(void) { 368 | int a,i; 369 | chan (int) c1, c2; 370 | alloc c1, c2; 371 | task produce(c1),produce(c2); 372 | for(i = 0; i < 10 ; i++) 373 | alt { 374 | case a =<-c1: 375 | print("1 -> %d\n",a); 376 | break; 377 | case a =<-c2: 378 | print("2 -> %d\n",a); 379 | break; 380 | }; 381 | } \end{lstlisting} 382 | \end{frame} 383 | 384 | \begin{frame}{Alef. Планировщик} 385 | \begin{itemize} 386 | \item<1-> Процессы (\texttt{proc}): 387 | \begin{itemize} 388 | \item планируются системой 389 | \item синхронизируются \textcolor{blue}{rendezvous(2)} 390 | \end{itemize} 391 | \item<2-> Корутины (\texttt{task}): 392 | \begin{itemize} 393 | \item переключаются: \texttt{QLock.lock, Rendez.sleep, alt, <-=, <-} 394 | \end{itemize} 395 | \item<3-> Коммуникация через каналы 396 | \end{itemize} 397 | \end{frame} 398 | 399 | \begin{frame}[fragile]{Alef. Возврат функций} 400 | \begin{lstlisting}[basicstyle=\fontsize{14pt}{12}\bf\ttfamily\color{black},linebackgroundcolor={\btLstHL{4,8}}] 401 | int i,j; 402 | float f; 403 | 404 | tuple(int, int, float) test(int c) { 405 | return (c, c+1, (float)c/(float)(c+1)); 406 | } 407 | 408 | (i, j, f) = test(1);\end{lstlisting} 409 | \end{frame} 410 | 411 | \begin{frame}[fragile]{Alef. Обработка ошибок} 412 | \begin{columns}[T,onlytextwidth] 413 | \begin{column}{0.38\textwidth} 414 | \begin{lstlisting}[basicstyle=\fontsize{14pt}{12}\bf\ttfamily\color{black},linebackgroundcolor={\btLstHL{3,6,11}}] 415 | alloc p; 416 | 417 | rescue { 418 | unalloc p; 419 | return nil; 420 | } 421 | 422 | ... 423 | 424 | if(error) 425 | raise; 426 | return p; \end{lstlisting} 427 | \end{column} 428 | \begin{column}{0.58\textwidth} 429 | \begin{itemize} 430 | \item Блок в контексте функции 431 | \item Явный вызов 432 | \item Закрытие файлов, unalloc 433 | \end{itemize} 434 | \end{column} 435 | \end{columns} 436 | \end{frame} 437 | 438 | \begin{frame}[fragile]{Alef. Полиморфный тип данных} 439 | \begin{columns}[T,onlytextwidth] 440 | \begin{column}{0.48\textwidth} 441 | Равнозначная структура: 442 | \begin{lstlisting}[linebackgroundcolor={% 443 | \btLstHL<1>{3-4}% 444 | \btLstHL<2->{}% 445 | }] 446 | aggr Polytype 447 | { 448 | void* ptr; 449 | int tag; 450 | }; \end{lstlisting} 451 | \end{column} 452 | \begin{column}{0.48\textwidth} 453 | Особенности: 454 | \begin{lstlisting}[linebackgroundcolor={% 455 | \btLstHL<1>{}% 456 | \btLstHL<2>{1}% 457 | \btLstHL<3>{6-8}% 458 | \btLstHL<4>{9}% 459 | \btLstHL<5>{10} 460 | }] 461 | typedef Interface; 462 | 463 | Interface a, b, c, d; 464 | int i; 465 | 466 | a = (alloc Interface)10; 467 | b = (alloc Interface)"Hello"; 468 | d = (alloc Interface)i; 469 | c = a; /* copy pointer */ 470 | d := b; /* copy value */ \end{lstlisting} 471 | \end{column} 472 | \end{columns} 473 | \end{frame} 474 | 475 | \begin{frame}{Alef. Программирование} 476 | \begin{itemize} 477 | \item На Alef не очень хорошая документация 478 | \item Руководство неплохое, но не полное 479 | \item Чтобы начать писать, нужно буквально два вечера 480 | \end{itemize} 481 | \end{frame} 482 | 483 | \begin{frame}[fragile]{Alef. Необычный ООП} 484 | \begin{columns}[T,onlytextwidth] 485 | \begin{column}{0.58\textwidth} 486 | \begin{lstlisting}[linebackgroundcolor={% 487 | \btLstHL<1>{1,5}% 488 | \btLstHL<2>{2,7}% 489 | \btLstHL<3>{3,8-9,12-13}% 490 | \btLstHL<4>{6,15}% 491 | \btLstHL<5>{7,9}% 492 | \btLstHL<6>{8,13}% 493 | }] 494 | adt Point { 495 | int x,y; 496 | void set(*Point,int,int); 497 | }; 498 | adt Circle { 499 | Point; 500 | extern int radius; 501 | void set(*Circle,int,int,int); 502 | intern int tst(*Circle); 503 | }; 504 | ... 505 | void 506 | Circle.set(Circle *c, int x, int y, int r) 507 | { 508 | c->Point.set(x,y); 509 | c->radius = r; 510 | } \end{lstlisting} 511 | \end{column} 512 | \begin{column}{0.38\textwidth} 513 | \begin{lstlisting}[linebackgroundcolor={% 514 | \btLstHL<1->{}% 515 | \btLstHL<6>{3}% 516 | }] 517 | ... 518 | Circle c; 519 | c.set(5,4,3); \end{lstlisting} 520 | \begin{itemize} 521 | \item<1-|alert@+>Абстрактный тип 522 | \item<2-|alert@+>Поля 523 | \item<3-|alert@+>Методы 524 | \item<4-|alert@+>Встраивание 525 | \item<5-|alert@+>Скрытие 526 | \item<6-|alert@+>Передача ссылки 527 | \end{itemize} 528 | \end{column} 529 | \end{columns} 530 | \end{frame} 531 | 532 | \begin{frame}[fragile]{Alef. Дженерики} 533 | \begin{itemize} 534 | \item<1-|alert@+> Абстрактный тип с параметром 535 | \item<2-|alert@2-3> Полиморфный тип и приведение типов 536 | \end{itemize} 537 | \begin{columns}[T,onlytextwidth] 538 | \begin{column}{0.46\textwidth} 539 | \begin{lstlisting}[linebackgroundcolor={% 540 | \btLstHL<1>{1}% 541 | \btLstHL<2>{7,11}% 542 | \btLstHL<3>{8,12}% 543 | \btLstHL<4>{7}% 544 | \btLstHL<5>{7}% 545 | }] 546 | adt Stack[T] { 547 | extern int tos; 548 | T data[100]; 549 | void push(*Stack, T); 550 | }; 551 | 552 | Stack[int] bound; 553 | Stack unbound; 554 | 555 | /* type casting */ 556 | bound.f(3); 557 | unbound.f((alloc T)3);\end{lstlisting} 558 | \end{column} 559 | \begin{column}{0.50\textwidth} 560 | \begin{lstlisting}[linebackgroundcolor={% 561 | \btLstHL<1->{}% 562 | \btLstHL<4>{3}% 563 | \btLstHL<5>{4,5}% 564 | }] 565 | int i, j, k; 566 | 567 | i := bound.data[bound.tos]; 568 | j = bound.data[bound.tos]; 569 | k = bound.data[bound.tos]; /* err */\end{lstlisting} 570 | \begin{itemize} 571 | \item<4-|alert@4> "\texttt{:=}": без освобождения 572 | \item<5-|alert@5> "\texttt{=}": с освобождением 573 | \end{itemize} 574 | \end{column} 575 | \end{columns} 576 | \end{frame} 577 | 578 | \begin{frame}[fragile]{Alef. Biobuf} 579 | \begin{lstlisting}[basicstyle=\fontsize{14pt}{12}\bf\ttfamily\color{black}] 580 | #include 581 | #include 582 | 583 | Biobuf stdout; 584 | 585 | void 586 | main(void) 587 | { 588 | stdout.init(1, OWRITE); 589 | stdout.print("hello world!\n"); 590 | } \end{lstlisting} 591 | \end{frame} 592 | 593 | \begin{frame}{Заброшен и забыт} 594 | \begin{itemize} 595 | \item 1995г --- Plan9 2-nd edition 596 | \item 1995г --- Windows'95 597 | \item 1995г --- Java 598 | \item Bell Labs бросается создавать конкурента Java 599 | \item Plan9 заброшен 600 | \item Alef прекращает существование 601 | \begin{itemize} 602 | \item Нет сборщика мусора 603 | \item Трудно поддерживать 604 | \item По слухам, дженерики трудно реализовать со сборщиком мусора 605 | \end{itemize} 606 | \end{itemize} 607 | \end{frame} 608 | 609 | \begin{frame}{Inferno} 610 | \begin{columns}[T,onlytextwidth] 611 | \begin{column}{0.44\textwidth} 612 | \begin{flushright} 613 | {\small\emph{Земную жизнь пройдя до половины,\\ 614 | Я очутился в сумрачном лесу,\\ 615 | Утратив правый путь во тьме долины.\\ 616 | }} 617 | \end{flushright} 618 | \begin{itemize} 619 | \item 1996 --- версия 1.0 620 | \item Наследник Plan9 621 | \item Новый 9P --- Styx 622 | \item Регистровая Dis VM 623 | \end{itemize} 624 | \end{column} 625 | \begin{column}{0.54\textwidth} 626 | \includegraphics[width=\textwidth]{inferno.png} 627 | \end{column} 628 | \end{columns} 629 | \end{frame} 630 | 631 | \begin{frame}{Редактор Acme} 632 | \begin{columns}[T,onlytextwidth] 633 | \begin{column}{0.42\textwidth} 634 | \begin{itemize} 635 | \item Для разработчиков 636 | \item Автор --- \emph{Роб Пайк} 637 | \item Переписан на Limbo 638 | \item 30 лет с нами 639 | \end{itemize} 640 | \end{column} 641 | \begin{column}{0.54\textwidth} 642 | \includegraphics[width=\textwidth]{acme-limbo.png} 643 | \end{column} 644 | \end{columns} 645 | \end{frame} 646 | 647 | \begin{frame}{Limbo} 648 | \begin{itemize} 649 | \item "JIT-ed Newsqueak" \emph{(Роб Пайк, 2007)} % https://youtu.be/hB05UFqOtFA 650 | \item Сборщик мусора, реализованный в виртуальной машине 651 | \item Планировщик --- виртуальная машина 652 | \item Результат --- байткод для виртуальной машины 653 | \item Только вытесняющие процессы 654 | \item Идеология модулей 655 | \item В последнем релизе появились дженерики 656 | \end{itemize} 657 | %http://www.vitanuova.com/inferno/papers/addendum.pdf 658 | %https://github.com/henesy/limbobyexample 659 | %http://doc.cat-v.org/inferno/4th_edition/release_notes/changes 660 | \end{frame} 661 | 662 | \begin{frame}{Limbo. Некоторые замечания} 663 | \begin{itemize} 664 | \item Крайне мало документации 665 | \item Некоторый функционал ограничен 666 | \item Использовался в промышленных продуктах 667 | \item Имеет много сохранившегося кода 668 | \item Работать с кодом Limbo непривычно и сложно 669 | \item Go --- прямой потомок Limbo? Посмотрим 670 | \end{itemize} 671 | \end{frame} 672 | 673 | \begin{frame}[fragile]{Limbo. Hello, World!} 674 | \begin{lstlisting} 675 | implement Hello; 676 | 677 | include "sys.m"; 678 | sys: Sys; 679 | include "draw.m"; 680 | 681 | Hello: module 682 | { 683 | init: fn(ctxt: ref Draw->Context, argv: list of string); 684 | }; 685 | 686 | init(ctxt: ref Draw->Context, argv: list of string) 687 | { 688 | sys = load Sys Sys->PATH; 689 | sys->print("Hello World\n"); 690 | } \end{lstlisting} 691 | \end{frame} 692 | 693 | \begin{frame}[fragile]{Limbo. Примеры синтаксиса} 694 | %:=, функции с многими, обратная запись не int x, а x int 695 | %дженерики (2004), нет включения, слайсы, строки, буфер 696 | % https://powerman.name/Inferno/Limbo.html 697 | \begin{lstlisting}[basicstyle=\fontsize{12pt}{12}\bf\ttfamily\color{black},linebackgroundcolor={% 698 | \btLstHL<1>{1}% 699 | \btLstHL<2>{2-3}% 700 | \btLstHL<3>{5,6}% 701 | \btLstHL<4>{8,9}% 702 | \btLstHL<5>{11}% 703 | }] 704 | i, j: int; 705 | k := 1; # int 706 | b := byte 2; # byte 707 | 708 | s: string; # длина в символах 709 | s1 := s[0:]; # срез 710 | 711 | a: array of int; 712 | a = array[10] of int; 713 | 714 | myfunc: fn(i, k: int, s: string) : (list of string, int); 715 | \end{lstlisting} 716 | \end{frame} 717 | 718 | \begin{frame}[fragile]{Limbo. Дженерики} 719 | %http://doc.cat-v.org/inferno/4th_edition/release_notes/changes 720 | \begin{lstlisting}[basicstyle=\fontsize{12pt}{12}\bf\ttfamily\color{black},linebackgroundcolor={% 721 | \btLstHL{1,9}% 722 | }] 723 | reverse[T](l: list of T): list of T 724 | { 725 | rl: list of T; 726 | for(; l != nil; l = tl l) 727 | rl = hd l :: rl; 728 | return rl; 729 | } 730 | 731 | Tree: adt[T] { 732 | v: T; 733 | l, r: cyclic ref Tree[T]; 734 | }; \end{lstlisting} 735 | \end{frame} 736 | 737 | \begin{frame}[fragile]{Limbo. Bufio} 738 | \begin{lstlisting}[basicstyle=\fontsize{12pt}{12}\bf\ttfamily\color{black},linebackgroundcolor={% 739 | \btLstHL{6,7}% 740 | }] 741 | init(nil: ref Draw->Context, nil: list of string) 742 | { 743 | sys := load Sys Sys->PATH; 744 | bufio = load Bufio Bufio->PATH; 745 | 746 | bout = bufio->fopen(sys->fildes(1), Bufio->OWRITE); 747 | bout.puts("Hello World\n"); 748 | 749 | bout.flush(); 750 | } \end{lstlisting} 751 | \end{frame} 752 | 753 | \begin{frame}{Резкий разворот} 754 | %Alef всё, нужно на чем-то писать Acme, libthread 755 | \begin{itemize} 756 | \item Inferno не <<взлетел>> и продан Vita Nuova 757 | \item Lucent делает новый релиз Plan9 в 2000 году 758 | %\item На чем-то надо было писать редактор Acme 759 | \item Библиотека libthread на замену Alef 760 | \end{itemize} 761 | \end{frame} 762 | 763 | \begin{frame}{Редактор Acme} 764 | \begin{columns}[T,onlytextwidth] 765 | \begin{column}{0.4\textwidth} 766 | \begin{itemize} 767 | \item Для разработчиков 768 | \item Автор --- \emph{Роб Пайк} 769 | \item C и libthread 770 | \item 30 лет с нами 771 | \end{itemize} 772 | \end{column} 773 | \begin{column}{0.6\textwidth} 774 | \includegraphics[width=\textwidth]{acme-libthread.png} 775 | \end{column} 776 | \end{columns} 777 | \end{frame} 778 | 779 | \begin{frame}{libthread} 780 | % http://man.cat-v.org/plan_9/2/thread 781 | \begin{itemize} 782 | \item Написана на C 783 | \item Работает и с процессами, и с корутинами 784 | \item Корутины переключаются: \texttt{yield, proccreate, procexec, procexecl, threadexits, alt, send, recv (и основанными на send и recv), qlock, rlock, wlock, rsleep} 785 | \item Коммуникация через каналы 786 | \end{itemize} 787 | \end{frame} 788 | 789 | \begin{frame}[fragile]{libbio. Подсчет рун} 790 | \begin{lstlisting}[basicstyle=\fontsize{14pt}{12}\bf\ttfamily\color{black},linebackgroundcolor={% 791 | \btLstHL{3,6-7}% 792 | }] 793 | uvlong runecount(Biobuf *f, char *filename) { 794 | uvlong n; 795 | Rune r; 796 | n = 0; 797 | 798 | while((r = Bgetrune(f)) != (Rune)Beof) 799 | n++; 800 | 801 | print("%10ulld %s\n", n, filename); 802 | 803 | return n; 804 | } \end{lstlisting} 805 | \end{frame} 806 | 807 | \begin{frame} 808 | \center\textbf{Наши дни} 809 | \end{frame} 810 | 811 | \begin{frame}[t]{Вселенная Plan9} 812 | Конкурентное программирование на примере Newsqueak 813 | \begin{columns}[T,onlytextwidth] 814 | \begin{column}{0.46\textwidth} 815 | \begin{itemize} 816 | \item Март 2007 года. Google 817 | \item Newsqueak из 1988 818 | \item В сентябре 2007... 819 | \end{itemize} 820 | \end{column} 821 | \begin{column}{0.52\textwidth} 822 | \includegraphics[width=0.82\textwidth]{newsqueak-2017.png}\\ 823 | \textcolor{blue}{\href{https://youtu.be/hB05UFqOtFA}{https://youtu.be/hB05UFqOtFA}} 824 | \end{column} 825 | \end{columns} 826 | \end{frame} 827 | 828 | \begin{frame}{Редактор Acme} 829 | \begin{columns}[T,onlytextwidth] 830 | \begin{column}{0.42\textwidth} 831 | \begin{itemize} 832 | \item Для разработчиков 833 | \item Автор --- ??? 834 | \item Переписать на Go 835 | \item 30 лет с нами 836 | \end{itemize} 837 | \end{column} 838 | \begin{column}{0.54\textwidth} 839 | \includegraphics[width=0.82\textwidth]{unclesam.png} 840 | \end{column} 841 | \end{columns} 842 | \end{frame} 843 | 844 | \begin{frame}{Go} 845 | % https://go.googlesource.com/go/+/refs/tags/weekly.2009-11-06 846 | \begin{itemize} 847 | \item Сентябрь 2007 года --- начало разработки 848 | \item Первые версии собирались только на Plan9 849 | \item Из Go, пока он был на C, <<торчали уши>> Plan9 850 | \item Отказался от процессов и дженериков 851 | \item Взял ООП, каналы, корутины и кросскомпиляцию 852 | \item Авторы Go всё знают и хорошо подумали 853 | \item Если что-то не ясно в Go --- поищите в его истории 854 | \item Отличный пример --- Go-ассемблер 855 | \end{itemize} 856 | \end{frame} 857 | 858 | \begin{frame}{Использования Go-ассемблера} 859 | Только если вы \textbf{отлично} представляете, что делаете\\~\\ 860 | \begin{itemize} 861 | \item Cloudflare CIRCL 862 | \begin{itemize} 863 | \item \textcolor{blue}{\href{https://blog.cloudflare.com/introducing-circl}{blog.cloudflare.com/introducing-circl/}} 864 | \end{itemize} 865 | \item Шифр <<Кузнечик>> на языке Go 866 | \begin{itemize} 867 | \item \textcolor{blue}{\href{https://dxdt.ru/2019/02/18/8702/}{dxdt.ru/2019/02/18/8702/}} 868 | \item Прямое использование AVX 869 | \end{itemize} 870 | \end{itemize} 871 | \end{frame} 872 | 873 | \againframe{cc} 874 | 875 | \begin{frame}{Язык ассемблера Go} 876 | % https://youtu.be/KINIAgRpkDA 877 | % https://golang.org/doc/asm 878 | % https://9p.io/sys/doc/asm.html 879 | \begin{itemize} 880 | \item Официальный сайт отсылает к Plan9 881 | \item Это все же не совсем Plan9-ассемблер 882 | \item Псевдо-ассемблер 883 | \item Пайк про Go-ассемблер: \textcolor{blue}{\href{https://youtu.be/KINIAgRpkDA}{youtu.be/KINIAgRpkDA}} 884 | \item Полезные таблицы: \textcolor{blue}{\href{https://quasilyte.dev/blog/post/go-asm-complementary-reference/}{quasilyte.dev/blog/post/go-asm-complementary-reference/}} 885 | \item Понимание принципов компиляции в Plan9 помогло 886 | \end{itemize} 887 | \end{frame} 888 | 889 | \begin{frame}{Вопросы} 890 | \center Авторы Go всё знают и хорошо подумали\\Если что-то не ясно в Go --- поищите в его истории 891 | \vskip2cm 892 | \center{schors@gmail.com} 893 | \end{frame} 894 | 895 | \nocite{*} 896 | \setbeamertemplate{frametitle continuation}{} 897 | 898 | \begin{frame}[t]{Ссылки. Plan9} 899 | \printbibliography[keyword={plan9},notkeyword={en}] 900 | \end{frame} 901 | 902 | \begin{frame}[t]{Ссылки. Inferno} 903 | \printbibliography[keyword={inferno},notkeyword={en}] 904 | \end{frame} 905 | 906 | \begin{frame}[t]{Ссылки. Разное} 907 | \printbibliography[keyword={common},notkeyword={en}] 908 | \end{frame} 909 | 910 | \begin{frame}[t]{Ссылки. Ассемблер} 911 | \printbibliography[keyword={asm},notkeyword={en}] 912 | \end{frame} 913 | \end{document} 914 | 915 | 916 | --------------------------------------------------------------------------------