Пишем клиент без JavaScript

Dashukevich Vladimir

{
Тема: Пишем клиент без JavaScript,
Докладчик: Дашукевич Владимир,
Компания: XBSoftware,
Сообщество: 4frontby
}

JavaScript плох

Май 1995

JavaScript

Чем же JavaScript плох

Слишком гибкий

Как вы создаете объекты?

				function Person(name, age, job){
				    this.name = name;
				    this.age = age;
				    this.print = function(){
				    	  return name + " " + age;
					  };
				};
				var i = new Person("vlad", 26, "programmer")
			
				function createPerson(name, age, job){
					  var o = new Object();
				    o.name = name;
				    o.age = age;
				    o.print = function(){
				    	  return name + " " + age;
					  };
				};
				var i = createPerson("vlad", 26, "programmer")
			
				function Person(){};
				Person.prototype = {
				    name: "Vlad",
				    age: 26,
				    print: function(){
				    	  return name + " " + age;
					  }
				};
				var i = new Person();
			
				function Person(){
				    return {
				    	  name: "Vlad",
				    	  age: 26,
				    	  print: function(){
				    	  	  return name + " " + age;
					  	  }
					  };
				};
				var i = Person();
			

Как вы наследуете классы в JS?

				function extend(o){
				    function f(){}
				    f.prototype = o;
				    return new f();
				};
				var person = new Person();
				var anotherPerson = extend(person);
			
				function extendClass(Child, Parent){
					var f = function () { };
    				f.prototype = Parent.prototype;
    				var f = new F();
   				 
    				for (var prop in Child.prototype)
    					f[prop] = Child.prototype[prop];
    				Child.prototype = f;
    				Child.prototype.super = Parent.prototype;
				};
			
				var person = new Person();
				var anotherPerson = Object.create(person, {
					name: {
						value: "Vladimir"
					}
				});
			

Композиция лучше наследования

				var summary = data.map(convertArray)
						.filter(filterArray)
						.map(take("temperature"))
						.reduce(averageForArray, {})
			

Пример

				function Person(name, age, job){
				    this.name = name;
				    this.age = age;
				    this.job = job;
				    this.print = function(){
				    	  return name + " " + age + " " + job;
					  };
				};
			

Пример

				var person = new Person("Vladimir", 26, "Empty");
				//... code ...
				person.type = "type1";
			

Пример

				var person = new Person("Vladimir", 26, "Empty");
				//... code ...
				person.type = "type1";
				//... code ...
				person.hair = "black";
			

Пример

				var add = function(a, b){
				    return a + b;
				};
			

Пример

				var add = function(a, b){
				    return a + b;
				};
				var sum = add(3, 4);
			

Пример

				var add = function(a, b){
				    return a + b;
				};
				var sum = add(3, 4);
				var concat = add("Hello ", "World");
			

Решение

ECMAScript 2015

Почему ECMAScript 2015 (babel)?

Классы

				class View {
			  		constructor(options) {
			  		  this.model = options.model;
    			      this.template = options.template;
			  		}
			  		render() {
			  		  return _.template(this.template, this.model.toObject());
				  }
				}
			

Наследование

				class LogView extends View {
			  		render() {
			  		  var compiled = super.render();
    			      console.log(compiled);
			  		}
				}
			

Другие ограничения

				var person = {
			  		name: "vova"
			  	};
    			Object.seal(person);
    			//Object.freeze(person);
			  	person.age = 20;    // Error!
			

Другие ограничения

				var proxy = new Proxy({ name: "vova" }, {
			  		get: function(target, property) {
			  		  if (property in target) {
    				    return target[property];
			  		  } else {
					    throw new ReferenceError("Property does not exist.");
					  }
					}
				});
			

CoffeeScript

Почему CoffeeScript?

Операторы

CoffeeScript JavaScript
is ===
isnt !==
not !
and &&
or ||
true, yes, on true
false, no, off false

Пример

				launch() if ignition is on
			
				if (ignition === true) {
			  		launch();
				}
			

Пример

				linearSearch = (searchName) -> alert(name) 
					for name in names when name is searchName
			

Dart

Почему Dart?

Пример

				class Point {
			  		num x;
			  	    num y;
				}

				void main(List<String> arguments) {
			  		var point = new Point();
				}
			

Пример

				abstract class Cache<T> {
			  		T getByKey(String key);
			  		setByKey(String key, T value);
				}
			

TypeScript

Почему TypeScript?

Пример

				interface Person {
			  		firstname: string;
			  		lastname: string;
				}

				function greeter(p : Person) {
			  		return "Hello, " + p.firstname + " " + p.lastname;
				}
			

DefinitelyTyped

Flow

Почему Flow?

Итоги

JavaScript не Java, C, C++

Почему Java, C, C++?

Как можно это сделать?

Писать нативные расширения?

В чем подвох?

Перевести C в JS

Low Level Virtual Machine

LLVM состоит из:

Для перевода нам нужно

Bullet

Где он используется?

ammo.js

Demo

Компиляция в Javacript

Компиляторы в JS

Cheerp

Пример

				HTMLElement* body=document.get_body();
			  	HTMLElement* newElement=document.createElement("h1");
			  	newElement->set_textContent("Hello World");
				body->appendChild(newElement);
			

Итоги

Медленный

JavaScript быстрый для:

Непредсказуемый

				var a = 42;
			  	var b = "a string";
			  	var z = a + b;//z = "42a string"
			  	 
			  	eval("z = z.substr(1, 2)");//z = "2a"
			  	 
			  	[1, "str", true, {three: 3}].forEach(function(item){
			  		  if (typeof item === typeof z) console.log(item);
		  		});
			

Решения

NaCl и PNaCl

Почему NaCl и PNaCl?

Что нужно сделать:

Demo

asmjs

Почему asmjs?

Пример

				function MyAsmModule(stdlib, foreign, heap){
			  		"use asm";
			  	    //your perfect code
			  	    return {
			  	      export: f1
			  	    };
				}
			

Пример

				function MyAsmModule(stdlib, foreign, heap){
			  		"use asm";
			  	    //your perfect code
			  	    return {
			  	      export: f1
			  	    };
				}
			

Пример

				function MyAsmModule(stdlib, foreign, heap){
			  		"use asm";
			  	    //your perfect code
			  	    return {
			  	      export: f1
			  	    };
				}
			

Пример

				function MyAsmModule(stdlib, foreign, heap){
			  		"use asm";
			  	    //your perfect code
			  	    return {
			  	      export: f1
			  	    };
				}
			

Как писать на asmjs?

Что может C/С++?

Что не может asmjs?

Что было сконвертированно в JS

Demo

WebAssembly

Почему WebAssembly?

One more thing...

Каждый инструмент решает свою задачу

Вопросы?

Facebook: dashukevich.vova
Twitter: life__777