SlideShare a Scribd company logo
Война Типов
Сильные vs Слабые
@alkovictor#jeeconf
Виктор Полищук
Программирую
с 1989 года
за деньги
с 2000 года
на Java
c 2002
на Java за деньги
c 2004
@alḳоvίctоr vίctоr-cr vίctоr2@uḳr.nеt
Целевая аудитория
«XML программисты»
«Annotation программисты»
«ООП программисты»
И прочие другие программисты
Халк, Рушить Мифы!!!
Богоизбранность
Миф v1.0-vanilla
Миф v1.1-release
Языки
программирования –
божественное
вмешательство
Миф v1.2g
Если язык хорош – тебе
не понадобится другой
Миф v1.3-final
Если люди познают этот
язык – они будут спасены.
Помоги им спастись.
慧娘?我是慧娘,我是慧娘…
Язык – это инструмент
Решает проблемы
Добавляет проблемы
Имеет баги и костыли
Имеет фичи и свистки
Пишут люди разной квалификации
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 Ruby Simula Smalltalk
Swift Visual Basic Visual DataFlex Vala Zonnon
Type War: Weak vs Strong [JEEConf 2016]
Главное – удобный синтаксис
Миф v2.0.0-RC
Миф v2.0.0-master
Лаконичность – главный
показатель качества
Миф v2.0.0-main
Понятность – главный
показатель качества
Миф v2.0.0-trunk
Минимализм – главный
показатель качества
慧娘?我是慧娘,我是慧娘…
Лаконичность
quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)
Понятность
$ SET SOURCEFORMAT"FREE"
IDENTIFICATION DIVISION.
PROGRAM-ID. MaleSort.
AUTHOR. Michael Coughlan.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
...
Минимализм
>>>>>>>>,[>,]<[[>>>+<<<-]>[<+>-]<+<]>[<<<<<<<<+>>>>>>>>-]<<<<<<<<[[>>+
>+>>+<<<<<-]>>[<<+>>-]<[>+>>+>>+<<<<<-]>[<+>-]>>>>[-<->]+<[>->+<<-[>>-
<<[-]]]>[<+>-]>[<<+>>-]<+<[->-<<[-]<[-]<<[-]<[[>+<-]<]>>[>]<+>>>>]>[-<
<+[-[>+<-]<-[>+<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<]<<[>>+<<-]>[>[>+>
>+<<<-]>[<+>-]>>>>>>[<+<+>>-]<[>+<-]<<<[>+>[<-]<[<]>>[<<+>[-]+>-]>-<<-
]>>[-]+<<<[->>+<<]>>[->-<<<<<[>+<-]<[>+<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]
<<]>[[-]<<<<<<[>>+>>>>>+<<<<<<<-]>>[<<+>>-]>>>>>[-[>>[<<<+>>>-]<[>+<-]
<-[>+<-]>]<<[[>>+<<-]<]]>]<<<<<<-]>[>>>>>>+<<<<<<-]<<[[>>>>>>>+<<<<<<<
-]>[<+>-]<+<]<[[>>>>>>>>+<<<<<<<<-]>>[<+>-]<+<<]>+>[<-<<[>+<-]<[<]>[[<
+>-]>]>>>[<<<<+>>>>-]<<[<+>-]>>]<[-<<+>>]>>>]<<<<<<]>>>>>>>>>>>[.>]
Синтаксис – это просто
(е)BNF
JLS параграф #18 (а так же параграфы #2-4)
Грамматики языков примерно равнозначны
• Haskell ~40+40 правил
• Scala ~30+60 правил
• Java ~100 правил
(e)BNF Пример
<expr> ::= <term> "+" <expr>
| <term>
<term> ::= <factor> "*" <term>
| <factor>
<factor> ::= "(" <expr> ")"
| <const>
<const> ::= integer
Type War: Weak vs Strong [JEEConf 2016]
Язык - Это Компилятор и Типы
Миф v3.000-staging
Миф v3.015-production
Компилятор спасает от ошибок
Он оптимизирует
Типизация облегчает рефакторинг
Это модно и молодежно
Анамнез
Как можно до сих пор использовать X, когда есть *** Y
Люди использующие X должны гореть в аду
Слаботипизированые языки, типа X, должны исчезнуть
ЛОЛ!!! Прикинь на X сделали ..., нет чтобы взять *** Y
Ад, смотри, че пишут на X. На *** Y, я бы за такое убивал
(***) – теплый, ламповый, богоугодно-кошерно-православный, современный, быстрый, безбажный, богатый и популярный
Type War: Weak vs Strong [JEEConf 2016]
Верификация
Static
Dynamic
Верификация
Java
C#
C
JavaScript
PHP
Groovy
Static
Dynamic
Приведение Типа
Strict
Lenient
Приведение Типа
Java
C#
C
JavaScript
PHP
Groovy
Strict
Lenient
Вывод Типов
Implicit
Manifest
Вывод Типов
Haskell
Scheme
JavaScript
Java
Pascal
C
Implicit
Manifest
<TooManyDefinitionsException>
Strong
Weak
Когда Ты Используешь strong Вместо static/manifest
Типовая Безопасность
Well-typed program cannot
“go wrong”
•Arthur John Robin Gorell Milner
Что Же Такое “Типовая Безопасность”
Безопасность памяти
Корректная семантика операций
Java 8 Puzzle
Ожидаемый Результат
String
Формализация систем типов
Формализация систем типов
Context: {<v, T>,…,<v, T>}
Operation: (T, …, T) -> T
Выражения
𝑒 = 𝑥
𝑒 = 𝑒1(𝑒2)
𝑒 = 𝜆𝑥. 𝑒
𝑒 = 𝑙𝑒𝑡 𝑥 = 𝑒1 𝑖𝑛 𝑒2
Типы
mono 𝜏 = 𝛼
mono 𝜏 = 𝐷 𝜏1 … 𝜏 𝑛
poly 𝜎 = 𝜏
poly 𝜎 = ∀𝛼. 𝜎
Контекст
Γ = ϵ
Γ = Γ, 𝑥: 𝜎
Ну, еще немного, и я пойму!
Контекст
Γ = {𝑥1: 𝜎1, … , 𝑥 𝑛: 𝜎 𝑛}
Типизация
Γ ⊢ 𝑒: 𝜎
Формальная система типов
𝑥: 𝜎 ∈ Γ
Γ ⊢ 𝑥: 𝜎
Γ, 𝑥: 𝜏 ⊢ 𝑒: 𝜏′
Γ ⊢ 𝜆𝑥. 𝑒: 𝜏 → 𝜏′
𝑓𝑟𝑒𝑒 𝛼 = 𝛼
Γ ⊢ 𝑒: 𝜎′ 𝜎′ ⊑ 𝜎
Γ ⊢ 𝑒: 𝜎
Γ ⊢ 𝑒0 ∶ 𝜏 → 𝜏′
Γ ⊢ 𝑒1: 𝜏
Γ ⊢ 𝑒0(𝑒1): 𝜏′
Γ ⊢ 𝑒0 ∶ 𝜎 Γ, 𝑥: 𝜎 ⊢ 𝑒1: 𝜏
Γ ⊢ 𝑙𝑒𝑡 𝑥 = 𝑒0 𝑖𝑛 𝑒1 ∶ 𝜏
𝑓𝑟𝑒𝑒 Γ =
𝑥:𝜎∈Γ
𝑓𝑟𝑒𝑒(𝜎)
Γ ⊢ 𝑒: 𝜎 𝛼 ∉ 𝑓𝑟𝑒𝑒(Γ)
Γ ⊢ 𝑒: ∀𝛼. 𝜎
Type War: Weak vs Strong [JEEConf 2016]
Вы Говорите: «Типизированные»?
Куча матана
Корректность может быть доказана
Тесты – это эвристики
Перестановки: JavaScript
Перестановки: Java
Перестановки: Java 8
Перестановки: JavaScript
Перестановки: Scala
Перестановки: Scala
Перестановки: C#
Перестановки: Haskell
Что дальше?
Шах и мат
Quicksort: Coq
Но есть один ньюанс...
Доказываем Корректность
Что дальше в Java?
Project Valhalla
• Value types
• Improved generics
Correctness Proving
• JSR 308: Java Type Annotations
• Functions as first-class citizens
• Dependent types (JSR 308)
Вопросы?

More Related Content

PPTX
"Война типов: сильные против слабых" Виктор Полищук
Fwdays
 
PDF
My talk at YouCon Saratov 2016
Alex Chistyakov
 
PPTX
неприятная правда про язык go
Daniel Podolsky
 
PPTX
Оптицизация: на грани и за
Anton Patrushev
 
PPTX
Ошибки SEO оптимизаторов: текстовые, санкции поисковых систем, внешние ссылки...
SEO-Интеллект
 
PDF
Reactive Thinking in Java
Yakov Fain
 
PPT
Oop java.generics
muqaddas_m
 
ODP
Java - основы языка
Леонид Ставила
 
"Война типов: сильные против слабых" Виктор Полищук
Fwdays
 
My talk at YouCon Saratov 2016
Alex Chistyakov
 
неприятная правда про язык go
Daniel Podolsky
 
Оптицизация: на грани и за
Anton Patrushev
 
Ошибки SEO оптимизаторов: текстовые, санкции поисковых систем, внешние ссылки...
SEO-Интеллект
 
Reactive Thinking in Java
Yakov Fain
 
Oop java.generics
muqaddas_m
 
Java - основы языка
Леонид Ставила
 

More from Victor_Cr (16)

PPTX
Data Wars: The Bloody Enterprise strikes back
Victor_Cr
 
PPTX
Data Wars: The Bloody Enterprise strikes back
Victor_Cr
 
PPTX
Types: Weak/Duck/Optional vs Strong/Strict. Let the War Begin!
Victor_Cr
 
PPTX
Types: Weak/Duck/Optional vs Strong/Strict. Let the War Begin!
Victor_Cr
 
PPTX
Legacy: как победить в гонке (Joker)
Victor_Cr
 
PPTX
Web-application I’ve always dreamt of (Kharkiv)
Victor_Cr
 
PPTX
Web application I have always dreamt of (Lviv)
Victor_Cr
 
PPTX
Web application I have always dreamt of
Victor_Cr
 
PPTX
Legacy projects: how to win the race
Victor_Cr
 
PPTX
Legacy projects: how to win the race
Victor_Cr
 
PPTX
Jboss drools expert (ru)
Victor_Cr
 
PPTX
JEEConf WEB
Victor_Cr
 
PPTX
JEEConf JBoss Drools
Victor_Cr
 
ODP
JBoss Drools
Victor_Cr
 
PPTX
XPDays Ukraine: Legacy
Victor_Cr
 
PPTX
Club of anonimous developers "Refactoring: Legacy code"
Victor_Cr
 
Data Wars: The Bloody Enterprise strikes back
Victor_Cr
 
Data Wars: The Bloody Enterprise strikes back
Victor_Cr
 
Types: Weak/Duck/Optional vs Strong/Strict. Let the War Begin!
Victor_Cr
 
Types: Weak/Duck/Optional vs Strong/Strict. Let the War Begin!
Victor_Cr
 
Legacy: как победить в гонке (Joker)
Victor_Cr
 
Web-application I’ve always dreamt of (Kharkiv)
Victor_Cr
 
Web application I have always dreamt of (Lviv)
Victor_Cr
 
Web application I have always dreamt of
Victor_Cr
 
Legacy projects: how to win the race
Victor_Cr
 
Legacy projects: how to win the race
Victor_Cr
 
Jboss drools expert (ru)
Victor_Cr
 
JEEConf WEB
Victor_Cr
 
JEEConf JBoss Drools
Victor_Cr
 
JBoss Drools
Victor_Cr
 
XPDays Ukraine: Legacy
Victor_Cr
 
Club of anonimous developers "Refactoring: Legacy code"
Victor_Cr
 
Ad

Type War: Weak vs Strong [JEEConf 2016]