Изменения

Перейти к: навигация, поиск

ECMAScript и все-все-все

4904 байта добавлено, 12:19, 10 октября 2016
м
Нет описания правки
</slideshow>
== ECMAScript - ECMAScript — ассемблер будущего,<br /> бэкенд, фронтенд и все-все-все @@ %% ==
''(Об эволюции и фичах JavaScript)''
* Начинал лет в 11 с C/C++ (Turbo C / C++Builder)
* Потом открыл для себя Linux, свободный софт...софт…
*: ''главное читать логи :)''
* ...LAMP …LAMP (Perl/PHP), HTML и JS
* Теперь полюбил серверный JS (nodejs)
<s>JavaScript</s>ECMAScript
* '''От Java только часть названия'''
* Скриптота! (динамический язык)
* Объект/массив/скаляр (JSON)
* Прототипы, замыкания, колбэки, нет многопоточности
* ES - ES — язык. А ещё есть окружение (DOM, BOM)
* Куча новых фич (ES2015-2016-2017)
* Браузерный - Браузерный — Chrome (V8), Firefox (SpiderMonkey) и даже IE (ChakraCore)* Серверный - Серверный — node.js (V8)
== Скриптота vs типизация @@ %% ==
* Популярных динамических языков много
*: {{gray|''можно пытаться это отрицать, но таки удобно''}}
* Статические... Статические… хде они? Java? (C# не в счёт, винда)
* Компилируемые новые есть: D, Rust, Go, Vala, Swift
*: {{gray|''но кто на них пишет-то?''}}
== Все хотят одного @@ ==
* Типизация - Типизация — не необходимость, как раньше, а лишь один из способов проверки
*: что ещё можно проверять?
*: Rust = borrow checker
*: функциональщина = "purity" «purity» checker
* При этом
*: auto уже даже в C++
*: тайпчекер (частично) уже даже в PHP (+ Hack)
== Проверки - Проверки — хорошо, но @@ %% ==
http://demotivators.to/media/posters/327/414874_paranojya.jpg
* Нейтральный C-подобный синтаксис
* Быстрый!* Событийная машина*: {{gray|(как вычислительно, так и для I/O)}}*: Событийная машина node.js — не пустой звук! {{gray|(1M соединений на одном сервере)}}* Есть тайпчекеры*: Всегда нужен в браузерах {{gray|TypeScript, Dart...(а веб нынче даже 1С)}}* Круто развиваетсяМощное сообщество и развитие* Удобный пакетный менеджер npm* Есть тайпчекеры: TypeScript, Dart…
== Синтаксис @@ %% ==
</source>
* projects - projects — переменная? Фигвам. Метод без аргументов.)
== Go @@ ==
}
</source>
 
== Синтаксис JS @@ %% ==
 
Имхо вполне нейтральненько.
 
{{gray|(неприятных рефлексов вызывать не должен)}}
 
== История JS @@ ==
 
* 1995—2004: дремучий лес с партизанами
* 2004—2008: появление AJAX
* 2008+: шустрота и современный период
 
== Дремучий период @@ ==
 
1995—1997
* Создание и начальная стандартизация
* DOM ещё нет, только «DOM level 0»
*: document.forms, document.images
 
1998
* DOM level 1 (DHTML)
* document.getElementById, все элементы — объекты
 
2000
* DOM level 2
* События и более-менее современный вид объектов
* pre-AJAX: JSONP, невидимый iframe
 
== Появление AJAX @@ ==
 
2004
* Firefox 1.0
* XmlHttpRequest
* Gmail, впервые упомянут термин «AJAX»
* {{gray|Начало конца дремучего периода JS, как языка для всплывающих баннеров}}
 
Совместимость браузеров ещё плохая, так что
* 2006 — jQuery
 
== Современное развитие @@ ==
 
* 2008 — Google V8
* 2009 — IE8 (M$ очнулся)
* 2009 — node.js (2011 — v0.6)
* 2011 — начало работы над ES6
* 2012 — Angular 1.0
* 2013 — React
* 2015 — ES6 принят
 
== Производительность @@ ==
 
На ЛОРе до сих пор шутят, что «Java тормозит», а что ж тогда JS?
* А ничего — он быстрый.
* Но он же интерпретируемый?
*: НЕТ! '''Интерпретируемых''' языков уже вообще нет.
*: <s>Ну, разве что bash…</s>
 
== Вычислительный [https://blog.famzah.net/2016/02/09/cpp-vs-python-vs-perl-vs-php-performance-benchmark-2016/ бенчмарк] @@ ==
 
* C++ (g++ 5.3.1) -O2 = 1.124s
* java8 = 1.428s
* PyPy (tracing jit) = 1.72s
* '''node.js = 2s'''
* java7 = ~2.5s
* PHP 7 = 6.7s
* Python 3.5 = 19s, 2.7 = 21s
* Perl = 25s
* '''PHP 5.6 = 69s''' :)))))
 
== Почему V8 такой быстрый? @@ ==
 
Потому, что 4-слойный JIT!
* {{gray|Как уже сказано, интерпретируемых языков нет.}}
* 1 слой - LLInt, интерпретатор байткода (быстрый старт)
* 2 слой - Baseline JIT
* 3 слой - DFG (Data Flow Graph) JIT
* 4 слой - <s>LLVM</s> [https://webkit.org/blog/5852/introducing-the-b3-jit-compiler/ B3]
 
https://webkit.org/blog-files/ftl-jit/four_tier_performance.png
 
== Ключевые слова о том, как это всё устроено @@ ==
 
* Какой бывает JIT?
*: method-based jit (JVM)
*: tracing jit (PyPy, TraceMonkey)
* Девиртуализация
* Ускорение поиска в хеше (Lua)
* OSR (On-Stack Replace)
 
== Отступление: PyPy @@ %% ==
 
Трассирующий JIT-компилятор для Python, очень медленный
 
Рисует множество Мандельброта при сборке
 
http://gyazo.com/2c32601f8747c5e93becc08270fa5127.png
 
== LLVM @@ ==
 
[[Файл:LLVM Logo.svg|200px|right]]
LLVM (http://llvm.org), ранее "Low Level Virtual Machine"
* Набор библиотек для построения компиляторов/интерпретаторов
* Модульный
*: исходник &rarr; фронтенд (ЯП) &rarr; LLVM IR (SSA)
*: IR &rarr; оптимизатор LLVM &rarr; IR
*: IR &rarr; бэкенд &rarr; машинный код
* А также сами компиляторы (в первую очередь C/C++/ObjC: Clang)
* {{gray|На LLVM сделаны компилятор шейдеров Radeon и OpenCL}}
 
http://www.aosabook.org/images/llvm/LLVMCompiler1.png
 
== V8 JIT @@ ==
 
[https://webkit.org/blog/3362/introducing-the-webkit-ftl-jit/ FTL JIT]
* Первый раз функции запускаются в LLInt
* 6 вызовов либо 100 повторов строки
*: {{green|&rarr; OSR в Baseline JIT}}
* 66 вызовов либо 1000*C повторов строки
*: {{green|&rarr; OSR в DFG JIT}}
*: C ~ 1, больше для больших функций
* Нарушение type guard в DFG
*: {{red|&rarr; OSR обратно в Baseline JIT}}
* 6666 вызовов либо 100000*C повторов строки
*: {{green|&rarr; OSR в LLVM/B3 JIT}}
[[Категория:VitaliPrivate]]

Навигация