SlideShare une entreprise Scribd logo
1  sur  80
Télécharger pour lire hors ligne
#dartlang
Вячеслав Егоров
Что за…
#dartlang
производительность
JavaScript
Мы работали над
V8...
#dartlang
Мы работали над
V8...
сложность трюков
встроенных в V8
производительность
JavaScript
#dartlang
Мы работали над
V8...
уровень счастья
компиляторщиков
производительность
JavaScript
#dartlang
Быстрый код - это
статический код.
#dartlang
JS VM потеет: пытается
узреть статическое в
динамическом
#dartlang
JS программисты потеют:
пытаются ублажить VM
для скорости
#dartlang
Авторы JS VM тоже
потеют
#dartlang
Не потеет только сам JS
#dartlang
o = {
l1: -1, l2: 1,
l3: "something"
};
arr = [];
arr[o.ll+o.l2]=o.l3;
arr.length // => 0 ???
#dartlang
o = {
l1: -1, l2: 1,
l3: "something"
};
arr = [];
arr[o.ll+o.l2]=o.l3;
arr.NaN // => “something”
#dartlang
Удивительно для VM =
Удивительно
программисту
#dartlang
THREE.QuadEdgeMesh = function(mesh) {
function HalfEdge(/* ... */) {
/* ... */
}
/* ... */
this.addFace = function () { };
};
#dartlang
THREE.QuadEdgeMesh = function(mesh) {
function HalfEdge(/* ... */) {
/* ... */
}
/* ... */
this.addFace = function () { };
};
Медленно :-(
#dartlang
function HalfEdge(/* ... */) { }
THREE.QuadEdgeMesh = function(mesh) { };
Three.QuadEdgeMesh.prototype.addFace = ...
Быстро :-)
#dartlang
А почему?
#dartlang
Теперь
о Dart
#dartlang
Простой
выразительный
язык
#dartlang
Платформа
#dartlang
● VM
○ быcтрый edit-refresh
○ отладчик
○ server-side
● Анализатор
● Редактор
● Библиотеки
● Фреймворки
#dartlang
foo() {
return 42;
}
#dartlang
textWidth() {
return 42;
}
#dartlang
textWidth(text) {
return text.split(‘n’)
.map((ln) => ln.length)
.reduce(max);
}
#dartlang
textWidth(text) =>
text.split(‘n’)
.map((ln) => ln.length)
.reduce(max);
#dartlang
textWidth(text) =>
text.split(‘n’)
.map((ln) => ln.length)
.reduce(max);
#dartlang
textWidth(text) =>
text.split(‘n’)
.map((ln) => ln.length)
.reduce(max);
#dartlang
fileWidth(url) =>
HttpRequest.getString(url)
.then(textWidth);
#dartlang
fileWidth(url) =>
HttpRequest.getString(url)
.then(textWidth);
#dartlang
fileWidth(url) =>
HttpRequest.getString(url)
.then(textWidth);
#dartlang
var w = fileWidth(SOME_URL);
if (w >= 80) {
print("Your file has width $w.");
}
#dartlang
var w = fileWidth(SOME_URL);
if (w >= 80) {
print("Your file has width $w.");
}
#dartlang
var w = fileWidth(SOME_URL);
if (w >= 80) {
print("Your file has width $w.");
}
#dartlang
var w = fileWidth(SOME_URL);
if (w >= 80) {
print("Your file has width $w.");
}
Exception: Class '_Future' has no instance method '>='.
#dartlang
var w = fileWidth(SOME_URL);
if (w >= 80) {
print("Your file has width $w.");
}
$ dartanalyzer codefest2014.dart
[hint] There is no such operator '>=' in 'Future'
(codefest2014.dart, line 17, col 9)
#dartlang
fileWidth(SOME_URL).then((w) {
if (w >= 80)
print("Your file has width $w.");
});
#dartlang
Опциональная типизация:
● гибкость динамики
● удобство статики
+ Предсказуемая семантика
#dartlang
Future<num> fileWidth(String url) => ...
#dartlang
Предсказуемая семантика
● ранние ошибки
● меньше удивительного
#dartlang
var self = this;
for (var i = 0; i < self.arr.length; i++) {
var listener = (function (i) {
return function (evt) {
self.handleEventAt(i);
};
})(i);
}
#dartlang
for (var i = 0; i < arr.length; i++) {
var listener = (e) => handleEventAt(i);
}
#dartlang
for (var i = 0; i < arr.length; i++) {
var listener = (e) => handleEventAt(i);
}
#dartlang
for (var i = 0; i < arr.length; i++) {
var listener = (e) => handleEventAt(i);
}
#dartlang
Разработка веб-приложений?
#dartlang
#dartlang
<counters-list>
</counters-list>
#dartlang
<width-counter></width-counter>
<width-counter></width-counter>
<width-counter></width-counter>
<width-counter></width-counter>
#dartlang
AngularDart
#dartlang
MODEL VIEW
WHATEVER
#dartlang
MODEL VIEW
WHATEVER
Dart
objects
DOM
#dartlang
#dartlang
$ cat pubspec.yaml
name: CodeFest2014
description: A CodeFest2014 sample
dependencies:
browser: any
angular: any
$ pub get
Downloading angular 0.9.10...
#dartlang
Библиотеки
#dartlang
import '../lib1.dart';
import 'dart:math' show max;
import 'package:js/js.dart' as js;
#dartlang
● dart:math
● dart:async
● dart:isolate
● dart:typed_data
● dart:html
● dart:io
● dart:mirrors
● …
#dartlang
import 'package:angular/angular.dart';
#dartlang
class WidthCounter {
var url, width = "n/a";
count() =>
fileWidth(url)
.then((v) => width = v)
.catchError((e) => width = "n/a");
}
#dartlang
Классы:
● объекты “заморожены”
● одиночное наследование
● любой класс это интерфейс
● mixins
● generics
#dartlang
@NgComponent(
selector: 'width-counter',
template: …,
publishAs: 'ctrl'
)
class WidthCounter {
#dartlang
<div>
<input type="text"
ng-model="ctrl.url"
ng-change="ctrl.count()">
is <b>{{ctrl.width}}</b> columns
wide.
</div>
#dartlang
@NgComponent(
selector: 'counters-list',
template: """
<width-counter ng-repeat="_ in ctrl.counters">
</width-counter>
<i class="fa fa-plus-square"
ng-click="ctrl.addCounter()"></i>
<i class="fa fa-minus-square"
ng-click="ctrl.removeCounter()"></i>
"""
)
class CountersList {
#dartlang
main() {
ngBootstrap(
module: new Module()
..type(WidthCounter)
..type(CountersList));
}
#dartlang
main() {
ngBootstrap(
module: new Module()
..type(WidthCounter)
..type(CountersList));
}
#dartlang
Injector ngBootstrap({
Module module: null,
List<Module> modules: null,
dom.Element element: null,
String selector: '[ng-app]'})
#dartlang
main() {
ngBootstrap(
module: new Module()
..type(WidthCounter)
..type(CountersList));
}
#dartlang
main() {
var m = new Module();
m.type(WidthCounter);
m.type(CounterList);
ngBootstrap(module: m);
}
#dartlang
#dartlang
#dartlang
class Border {
var width, color, style;
Border({this.width: 1,
this.color: "black",
this.style: "solid"});
get css => "${width}px $style $color";
}
#dartlang
class Border {
var width, color, style;
Border({this.width: 1,
this.color: "black",
this.style: "solid"});
get css => "${width}px $style $color";
}
#dartlang
class Border {
var width, color, style;
Border({this.width: 1,
this.color: "black",
this.style: "solid"});
get css => "${width}px $style $color";
}
#dartlang
class Border {
var width, color, style;
Border({this.width: 1,
this.color: "black",
this.style: "solid"});
get css => "${width}px $style $color";
}
#dartlang
addCounter() {
counters.add(new Border(
color: 'hsla(${rnd.nextInt(360)}, ’
’75%, 50%, 0.5)'));
}
#dartlang
<width-counter ng-repeat="border in ctrl.counters"
with-border="border">
</width-counter>
#dartlang
<width-counter ng-repeat="border in ctrl.counters"
with-border="border">
</width-counter>
#dartlang
@NgDirective(selector: '[with-border]')
class WithBorderDirective {
dom.Element el;
WithBorderDirective(this.el);
@NgOneWay('with-border')
set border (Border val) {
el.style.border = val.css;
}
}
#dartlang
@NgDirective(selector: '[with-border]')
class WithBorderDirective {
dom.Element el;
WithBorderDirective(this.el);
@NgOneWay('with-border')
set border (Border val) {
el.style.border = val.css;
}
}
#dartlang
@NgDirective(selector: '[with-border]')
class WithBorderDirective {
dom.Element el;
WithBorderDirective(this.el);
@NgOneWay('with-border')
set border (Border val) {
el.style.border = val.css;
}
}
#dartlang
class Border extends Object
with Exportable {
@export var width,
color,
style;
}
border.toJSON()
#dartlang
Dart компилируется в
JavaScript с помощью dart2js
#dartlang
Dart - для современного веба
● Платформа, готовая к использованию
● dartlang.org
● Компилируется в JavaScript

Contenu connexe

Similaire à CodeFest 2014. Егоров В. — Что за… Dart?

Js templating stepan_reznikov
Js templating stepan_reznikovJs templating stepan_reznikov
Js templating stepan_reznikovyaevents
 
Степан Резников "Шаблонизация на клиенте"
Степан Резников "Шаблонизация на клиенте"Степан Резников "Шаблонизация на клиенте"
Степан Резников "Шаблонизация на клиенте"Yandex
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Anton Arhipov
 
Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014Yandex
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Как мы документируем программные интерфейсы. Алексей Миронов
Как мы документируем программные интерфейсы. Алексей МироновКак мы документируем программные интерфейсы. Алексей Миронов
Как мы документируем программные интерфейсы. Алексей МироновYandex
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Oleg Chirukhin
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)Ontico
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 

Similaire à CodeFest 2014. Егоров В. — Что за… Dart? (20)

Js templating stepan_reznikov
Js templating stepan_reznikovJs templating stepan_reznikov
Js templating stepan_reznikov
 
Степан Резников "Шаблонизация на клиенте"
Степан Резников "Шаблонизация на клиенте"Степан Резников "Шаблонизация на клиенте"
Степан Резников "Шаблонизация на клиенте"
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)
 
Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014Как мы документируем программные интерфейсы. YaC 2014
Как мы документируем программные интерфейсы. YaC 2014
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Как мы документируем программные интерфейсы. Алексей Миронов
Как мы документируем программные интерфейсы. Алексей МироновКак мы документируем программные интерфейсы. Алексей Миронов
Как мы документируем программные интерфейсы. Алексей Миронов
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Code Style (in russian)
Code Style (in russian)Code Style (in russian)
Code Style (in russian)
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 

Plus de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Plus de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

CodeFest 2014. Егоров В. — Что за… Dart?