Статический анализатор для языка ECMA Script 4 Власов В. А. Мат.-мех. Ф-т.
Языки ECMA Script 4 JavaScript 2 (Mozilla) ActionScript 3 (Adobe) class Greeter implements Greetings { public function hello() { print(hello, world) } public function goodmorning() { print(goodmorning, world) }
ECMA: Variables var x = 10 const PI = var x: Shape var x: Shape = new Shape
ECMA: Functions Как статические функции. function hello() { print(hello, world) } hello() Как методы классов public class Greeter { public function hello() { print(hello, world) } Анонимные функции function (x: Integer, y: Integer) : Integer { return x + y }
ECMA: Classes, Interfaces interface Greetings { function hello() function goodmorning() } class Greeter implements Greetings { public function hello() { print(hello, world) } public function goodmorning() { print(goodmorning, world) } var greeter : Greetings = new Greeter() greeter.hello()
ECMA: Прототипы У каждого объекта есть прототип Прототип подкласс класса dynamic class Object class A { prototype var x : int = 10 } var a1 = new A; var a2 = new A; trace(a1.x); trace(a2.prototype.x); var p1: Object; p1.prototype = a1; trace(p1.x); trace(p1.prototype.x); class A { prototype var f = function() { trace("A.f") } // prototype function g() { trace("A.g") } // не разрешено }
ECMA: Dynamic Расширение экземпляра класса с добавлением дополнительных полей dynamic class A { var x : String; var y; } var a : A = new A print(a.x) // null print(a.y) // undefined print(a.z) // undefined a.y = 10 a.z = 20 print(a.y) // 10 print(a.z) // 20
ECMA: Анонимные классы class A { var x function A() { this.x = 10 } function m() { trace(this.x) } } var a = new A() var o = { x : 20 } o.m = a.m o.m() // traces 10
ECMA: Class Members Fields class A { var __x : Integer ; } Methods class A { public function sum(x, y) : integer { return x + y; } Property Emulation class A { var __x : Integer ; public function get x() { return __x; } public function set x(v) { __x = v; }
ECMA: Packages package actors { public class Greeter { public function hello() { print(hello, world) } import actors.Greeter var greeter : Greeter = new Greeter greeter.hello()
ECMA: Namespaces package actors { public namespace English public namespace French public class BilingualGreeter { English function hello() { print("hello, world") } French function hello() { print("bonjour, le monde") } import actors.* var greeter : BilingualGreeter = new BilingualGreeter use namespace English greeter.hello() greeter.French::hello()
Статический анализ Слаботипизированный язык. Проверка типов только во время исполнения. Функциональные переменные.
Решение Ecplipse plug-in: Parser Частичные интерпретатор Find Usages Проверка типов (статический анализ) Refactoring tool: Inline Variable Introduce Variable Rename