Type War: Weak vs Strong [JEEConf 2016]

63
Война Типов Сильные vs Слабые @alkovicto r #jeeconf

Transcript of Type War: Weak vs Strong [JEEConf 2016]

Page 1: Type War: Weak vs Strong [JEEConf 2016]

Война ТиповСильные vs

Слабые

@alkovictor#jeeconf

Page 2: Type War: Weak vs Strong [JEEConf 2016]

Виктор ПолищукПр

огра

ммир

уюс 1989 года

за деньги с 2000 года

на Java c 2002

на Java за деньги c 2004

@alḳоvίctоr vίctоr-cr vίctоr2@uḳr.nеt

Page 3: Type War: Weak vs Strong [JEEConf 2016]

Целевая аудитория

«XML программисты»

«Annotation программисты»

«ООП программисты»

И прочие другие программисты

Page 4: Type War: Weak vs Strong [JEEConf 2016]

Халк, Рушить Мифы!!!

Page 5: Type War: Weak vs Strong [JEEConf 2016]

БогоизбранностьМиф v1.0-vanilla

Page 6: Type War: Weak vs Strong [JEEConf 2016]

Миф v1.1-release

Языки программирования – божественное вмешательство

Page 7: Type War: Weak vs Strong [JEEConf 2016]

Миф v1.2g

Если язык хорош – тебе не понадобится другой

Page 8: Type War: Weak vs Strong [JEEConf 2016]

Миф v1.3-final

Если люди познают этот язык – они будут спасены.Помоги им спастись.

Page 9: Type War: Weak vs Strong [JEEConf 2016]

慧娘?我是慧娘,我是慧娘…

Page 10: Type War: Weak vs Strong [JEEConf 2016]

Язык – это инструментРешает проблемы

Добавляет проблемы

Имеет баги и костыли

Имеет фичи и свистки

Пишут люди разной квалификации

Page 11: Type War: Weak vs Strong [JEEConf 2016]

Over 9000 языков

Ada Активный Оберон

Action Script C++ C++/CLI

ColdFusion D Delphi Dylan Eiffel

Groovy haXe Io Java JavaScript

Компонентный Паскаль MC# Модула-3 Оберон-2 Objective-

C

Object Pascal Perl Pike PHP Python

Page 12: Type War: Weak vs Strong [JEEConf 2016]
Page 13: Type War: Weak vs Strong [JEEConf 2016]

Главное – удобный синтаксисМиф v2.0.0-RC

Page 14: Type War: Weak vs Strong [JEEConf 2016]

Миф v2.0.0-master

Лаконичность – главный показатель качества

Page 15: Type War: Weak vs Strong [JEEConf 2016]

Миф v2.0.0-main

Понятность – главный показатель качества

Page 16: Type War: Weak vs Strong [JEEConf 2016]

Миф v2.0.0-trunk

Минимализм – главный показатель качества

Page 17: Type War: Weak vs Strong [JEEConf 2016]

慧娘?我是慧娘,我是慧娘…

Page 18: Type War: Weak vs Strong [JEEConf 2016]

Лаконичностьquicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)

Page 19: Type War: Weak vs Strong [JEEConf 2016]

Понятность$ SET SOURCEFORMAT"FREE"IDENTIFICATION DIVISION.PROGRAM-ID. MaleSort.AUTHOR. Michael Coughlan.ENVIRONMENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL....

Page 20: Type War: Weak vs Strong [JEEConf 2016]

Минимализм>>>>>>>>,[>,]<[[>>>+<<<-]>[<+>-]<+<]>[<<<<<<<<+>>>>>>>>-]<<<<<<<<[[>>+>+>>+<<<<<-]>>[<<+>>-]<[>+>>+>>+<<<<<-]>[<+>-]>>>>[-<->]+<[>->+<<-[>>-<<[-]]]>[<+>-]>[<<+>>-]<+<[->-<<[-]<[-]<<[-]<[[>+<-]<]>>[>]<+>>>>]>[-<<+[-[>+<-]<-[>+<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<]<<[>>+<<-]>[>[>+>>+<<<-]>[<+>-]>>>>>>[<+<+>>-]<[>+<-]<<<[>+>[<-]<[<]>>[<<+>[-]+>-]>-<<-]>>[-]+<<<[->>+<<]>>[->-<<<<<[>+<-]<[>+<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<]>[[-]<<<<<<[>>+>>>>>+<<<<<<<-]>>[<<+>>-]>>>>>[-[>>[<<<+>>>-]<[>+<-]<-[>+<-]>]<<[[>>+<<-]<]]>]<<<<<<-]>[>>>>>>+<<<<<<-]<<[[>>>>>>>+<<<<<<<-]>[<+>-]<+<]<[[>>>>>>>>+<<<<<<<<-]>>[<+>-]<+<<]>+>[<-<<[>+<-]<[<]>[[<+>-]>]>>>[<<<<+>>>>-]<<[<+>-]>>]<[-<<+>>]>>>]<<<<<<]>>>>>>>>>>>[.>]

Page 21: Type War: Weak vs Strong [JEEConf 2016]

Синтаксис – это просто

(е)BNF

• Haskell ~40+40 правил• Scala ~30+60 правил• Java ~100 правил

JLS параграф #18 (а так же параграфы #2-4)

Грамматики языков примерно равнозначны

Page 22: Type War: Weak vs Strong [JEEConf 2016]

(e)BNF Пример <expr> ::= <term> "+" <expr> | <term>

<term> ::= <factor> "*" <term> | <factor>

<factor> ::= "(" <expr> ")" | <const>

<const> ::= integer

Page 23: Type War: Weak vs Strong [JEEConf 2016]
Page 24: Type War: Weak vs Strong [JEEConf 2016]

Язык - Это Компилятор и ТипыМиф v3.000-staging

Page 25: Type War: Weak vs Strong [JEEConf 2016]

Миф v3.015-production

Компилятор спасает от ошибок

Он оптимизирует

Типизация облегчает рефакторинг

Это модно и молодежно

Page 26: Type War: Weak vs Strong [JEEConf 2016]

АнамнезКак можно до сих пор использовать X, когда есть *** Y

Люди использующие X должны гореть в аду

Слаботипизированые языки, типа X, должны исчезнуть

ЛОЛ!!! Прикинь на X сделали ..., нет чтобы взять *** Y

Ад, смотри, че пишут на X. На *** Y, я бы за такое убивал

(***) – теплый, ламповый, богоугодно-кошерно-православный, современный, быстрый, безбажный, богатый и популярный

Page 27: Type War: Weak vs Strong [JEEConf 2016]
Page 28: Type War: Weak vs Strong [JEEConf 2016]

Верификация

StaticDynamic

Page 29: Type War: Weak vs Strong [JEEConf 2016]

Верификация

JavaC#C

JavaScriptPHPGroovyStatic

Dynamic

Page 30: Type War: Weak vs Strong [JEEConf 2016]

Приведение Типа

StrictLenient

Page 31: Type War: Weak vs Strong [JEEConf 2016]

Приведение Типа

JavaC#C

JavaScriptPHPGroovyStrict

Lenient

Page 32: Type War: Weak vs Strong [JEEConf 2016]

Вывод Типов

ImplicitManifest

Page 33: Type War: Weak vs Strong [JEEConf 2016]

Вывод Типов

HaskellSchemeJavaScript

JavaPascalCImplicit

Manifest

Page 34: Type War: Weak vs Strong [JEEConf 2016]

<TooManyDefinitionsException>

StrongWeak

Page 35: Type War: Weak vs Strong [JEEConf 2016]

Когда Ты Используешь strong Вместо static/manifest

Page 36: Type War: Weak vs Strong [JEEConf 2016]

Типовая Безопасность

Well-typed program cannot “go wrong”•Arthur John Robin Gorell Milner

Page 37: Type War: Weak vs Strong [JEEConf 2016]

Что Же Такое “Типовая Безопасность”

Безопасность памяти

Корректная семантика операций

Page 38: Type War: Weak vs Strong [JEEConf 2016]

Java 8 Puzzle

Page 39: Type War: Weak vs Strong [JEEConf 2016]

Ожидаемый Результат

String

Page 40: Type War: Weak vs Strong [JEEConf 2016]

Формализация систем типов

Page 41: Type War: Weak vs Strong [JEEConf 2016]

Формализация систем типов

Context: {<v, T>,…,<v, T>}

Operation: (T, …, T) -> T

Page 42: Type War: Weak vs Strong [JEEConf 2016]

Выражения

𝑒=𝑥𝑒=𝑒1(𝑒2)𝑒=𝜆𝑥 .𝑒𝑒=𝑙𝑒𝑡 𝑥=𝑒1𝑖𝑛𝑒2

Page 43: Type War: Weak vs Strong [JEEConf 2016]

Типы

mono

mono

poly

poly

Page 44: Type War: Weak vs Strong [JEEConf 2016]

Контекст

Γ=ϵΓ=Γ ,𝑥 :𝜎

Page 45: Type War: Weak vs Strong [JEEConf 2016]

Ну, еще немного, и я пойму!

Page 46: Type War: Weak vs Strong [JEEConf 2016]

Контекст

Γ={𝑥1:𝜎1 ,…,𝑥𝑛 :𝜎 𝑛 }

Page 47: Type War: Weak vs Strong [JEEConf 2016]

Типизация

Γ⊢𝑒 :𝜎

Page 48: Type War: Weak vs Strong [JEEConf 2016]

Формальная система типов

Page 49: Type War: Weak vs Strong [JEEConf 2016]

А, ну теперь-то все понятно! Спасибо!

Page 50: Type War: Weak vs Strong [JEEConf 2016]

Вы Говорите: «Типизированные»?

Куча матана

Корректность может быть доказана

Тесты – это эвристики

Page 51: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: JavaScript

Page 52: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: Java

Page 53: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: Java 8

Page 54: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: JavaScript

Page 55: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: Scala

Page 56: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: Scala

Page 57: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: C#

Page 58: Type War: Weak vs Strong [JEEConf 2016]

Перестановки: Haskell

Page 59: Type War: Weak vs Strong [JEEConf 2016]

Что дальше?Шах и мат

Page 60: Type War: Weak vs Strong [JEEConf 2016]

Quicksort: Coq

Но есть один ньюанс...

Page 61: Type War: Weak vs Strong [JEEConf 2016]

Доказываем Корректность

Page 62: Type War: Weak vs Strong [JEEConf 2016]

Что дальше в Java?

Project Valhalla• Value types• Improved generics

Correctness Proving• JSR 308: Java Type Annotations• Functions as first-class citizens• Dependent types (JSR 308)

Page 63: Type War: Weak vs Strong [JEEConf 2016]

Вопросы?