Изменения

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

5171 байт добавлено, 13:37, 10 октября 2016
м
Нет описания правки
</source>
* Ой-ой-ойой…* Классов нет, есть процессы. Но сетевой, ага!
== OCaml O_O @@ ==
* Firefox 1.0
* XmlHttpRequest
* Первое SPA — Gmail, впервые упомянут термин «AJAX»
* {{gray|Начало конца дремучего периода JS, как языка для всплывающих баннеров}}
Потому, что 4-слойный JIT!
* {{gray|Как уже сказано, интерпретируемых языков нет.}}
* 1 слой - слой — LLInt, интерпретатор байткода (быстрый старт)* 2 слой - слой — Baseline JIT* 3 слой - слой — DFG (Data Flow Graph) JIT*: {{gray|здесь появляется типизация}}* 4 слой слой — [https://webkit.org/blog/3362/introducing- the-webkit-ftl-jit/ FTL JIT] (<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
== LLVM @@ ==
LLVM (http://llvm.org), ранее "Low «Low Level Virtual Machine"Machine»
* Набор библиотек для построения компиляторов/интерпретаторов
* Модульный
== V8 JIT @@ ==
[https://webkit.org/blog/3362/introducing-the-webkit-ftl-jit/ FTL JIT]
* Первый раз функции запускаются в LLInt
* 6 вызовов либо 100 повторов строки
*: {{green|&rarr; OSR в Baseline JIT}}
* C* 66 вызовов либо 1000*C *1000 повторов строки
*: {{green|&rarr; OSR в DFG JIT}}
*: C ~ 1, больше для больших функций
* Нарушение type guard в DFG
*: {{red|&rarr; OSR обратно в Baseline JIT}}
* C* 6666 вызовов либо 100000*C *100000 повторов строки
*: {{green|&rarr; OSR в LLVM/B3 JIT}}
 
== Производительность @@ ==
 
* Итого, V8 — «смешанный» JIT
* В Firefox — [https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/Tracing_JIT тоже всё шустро]
* Чакра Наделлы тоже очень похожа на V8
* Постоянная битва :) https://arewefastyet.com/
* {{red|Но язык - ещё не всё!}} Ещё есть:
*: В браузере — {{green|DOM}} (медленный в старых Firefox при формально быстром JS)
*: На сервере — {{green|ввод/вывод}}
 
== I/O bound, а не CPU bound @@ ==
 
* Типичные веб- и бизнес- приложения {{mag|сетевые}}
*: ''«получить из одного места (базы, кэша) и переложить в другое / отдать клиенту»''
*: {{gray|nb: все наши веб-фреймворки ни фига не делают :)}}
*: {{gray|nb: иначе PHP-сайтики были бы неюзабельны}}
* Иногда — '''очень сетевые''' (C10K / C1M)
*: чисто русский термин «хайлоад»
*: 10gbit ethernet уже среди нас
 
<big>&rArr; ?..</big>
 
== Событийные машины! @@ %% ==
 
{{gray|("event loop")}}
 
== Как вообще обрабатываются соединения клиентов? @@ ==
 
{{green|Все писали сетевой сервер на C? :)}}
 
{{red|Обычный ('''блокирующий''') ввод/вывод:}}
* forking: socket(), accept(), fork(), дочерний процесс работает с клиентом
* threading: socket(), accept(), создаём поток, дочерний работает с клиентом
* prefork / thread pool: создаём N процессов/потоков заранее
* Потоки и процессы — объекты ОС
*: {{gray|разница, по сути, только в наличии/отсутствии изоляции памяти}}
*: Переключение контекста CPU — тяжёлая операция
*: 100 потоков — уже тяжело
*: ''«Проблема C10K» (обработать 10000 соединений на 1 сервере)''
 
== Событийная машина @@ ==
 
{{green|Неблокирующий ввод/вывод:}}
* socket()
* select() / poll() / epoll / kqueue
*: говорим ОС: «разбуди, когда в любом из сокетов что-то произойдёт»
*: сокет пока один (слушающий)
* новое соединение => добавляем в select и спим дальше
* кто-то прислал запрос => читаем, быстро обрабатываем, отвечаем, спим дальше
* '''всё в один поток''' {{gray|(или в несколько по числу ядер CPU)}}
 
== Так работает Nginx… @@ %% ==
 
…и весь современный Web (фронтенды)
 
[[Файл:Nginx-logo.png]]
 
{{gray|(плюс zero-copy и раздача статики через sendfile())}}
 
== А если пойти дальше? @@ ==
 
Кроме HTTP-запросов клиентов ещё есть:
* СУБД/кэши
* Файлы
* REST сервисы
* Websocket’ы
* Сетевые серверы (IMAP?)
 
Почему бы всё это не обрабатывать в одном цикле?
 
{{mag|&rArr; Это и будет «событийная машина»}}
 
== Событийные машины @@ ==
 
Почти везде опциональная сущность:
* Python: [https://twistedmatrix.com/ Twisted]
*: более-менее популярен
* Java: [http://vertx.io/ Vert.x], [https://github.com/webbit/webbit Webbit]
*: {{gray|мало кто использует, ынтырпрайз же, а тут хипстота какая-то}}
*: в JEE потоки во все поля
*: да, внутри wildfly тоже event loop — но только для
* PHP: [https://github.com/kakserpom/phpdaemon kak.serpom.po.yaitsam/phpdaemon]
*: {{gray|почти никто не использует}}
* Механизмы разные в разных ОС &rArr; '''libevent''', '''libev'''
 
== Событийная машина node.js @@ ==
 
* Отличительная черта: '''вообще нет блокирующего I/O'''
*: {{gray|тут-то колбэки JS и становятся преимуществом}}
* Реально работает: [https://habrahabr.ru/post/123154/ тест 1M соединений на 1 сервере]
* Кроме {{green|node.js}} такое есть только в {{mag|Erlang}}
*: и, кстати, успешно переваривает 1M соединений, причём '''на продакшне''' (у WhatsApp)
*: {{gray|но... erlang. и медленный он по сравнению с V8}}
[[Категория:VitaliPrivate]]