SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Язык программирования
Xtend
• Язык общего назначения
Xtend
• Язык общего назначения
• Транслируется в Java 5
Xtend
• Язык общего назначения
• Транслируется в Java 5
• ООП + немного ФП
Xtend
• Язык общего назначения
• Транслируется в Java 5
• ООП + немного ФП
• Простота изучения (намного проще
Scala), схожесть с Java
Xtend
• Язык общего назначения
• Транслируется в Java 5
• ООП + немного ФП
• Простота изучения (намного проще
Scala), схожесть с Java
• Библиотека – тонкая прослойка над
Java (≈100 классов) + Guava
Языки JVM
Yeti
Erjang
Frege
Языки JVM
Yeti
Erjang
Frege
Языки JVM
Yeti
Frege
Языки JVM
Языки JVM
Языки JVM
Кол-во вопросов на SO
457101
17592
6564 5612
1748
1143
82
23
14
9 8 7 6
3
1
10
100
1000
10000
100000
1000000
Java Scala Groovy Clojure JRuby Jython Xtend Kotlin Mirah Gosu Fantom Ceylon Yeti X10
Опрос
No ; and ()
class Main {
def static void main(String[] args) {
println(5.toString)
}
}
Translation to Java
import org.eclipse.xtext.xbase.lib.InputOutput;
@SuppressWarnings("all")
public class Main {
public static void main(final String[] args) {
String _string = Integer.valueOf(5).toString();
InputOutput.<String>println(_string);
}
}
val, var and type inference
val n = 5
for (i : 1..n) {
var str = i.toString
println(str)
str = ...
}
val, var and type inference
val int n = 5
for (int i : 1..n) {
var String str = i.toString
println(str)
str = ...
}
Type inference
val list = new ArrayList
list.add(1)
list.add("text")
list.add(true)
println(list)
Type inference
val list = new ArrayList
list.add(1)
list.add("text")
list.add(true)
println(list)
Какой тип у ArrayList?
Type inference
val list = new ArrayList<Serializable>
list.add(1)
list.add("text")
list.add(true)
println(list)
Type inference
val list = new ArrayList<Comparable<?>>
list.add(1)
list.add("text")
list.add(true)
println(list)
Everything is an expression
def static readData() {
val data = try {
fileContentsToString('data.txt')
} catch (IOException e) {
"dummy data"
}
println(data)
data
}
switch
def String describe(Object x) {
switch x {
Integer case x > 0 : "Positive integer"
String : "String"
List<?> case x.empty : "Empty list"
List<?> : "Non-empty list"
default : x.class.simpleName
}
}
Классы
@Data
class Person {
val String firstName
val String lastName
val int age
def void sayHello() {
println('''Hello, my name is «firstName» «lastName»''')
}
}
Классы
@Data
@SuppressWarnings("all")
public class Person {
private final String _firstName;
public String getFirstName() {
this._firstName;
}
private final String _lastName;
public String getLastName() {
return this._lastName;
}
private final int _age;
public int getAge() {
return this._age;
}
public void sayHello() { ... }
public Person(final String firstName, final String lastName, final int age) { ... }
@Override
public int hashCode() { ... }
@Override
public boolean equals(final Object obj) { ... }
@Override
public String toString() { ... }
}
Классы
class Task implements Runnable {
@Property val String name
@Property var int timeout
new(String name, int timeout) {
this._name = name
this._timeout = timeout
}
new(String name) {
this(name, 600)
}
override run() {
println('''Running task "«name»"''')
...
}
}
Операторы
Xtend Java
a == b Objects.equals(a, b)
a === b a == b
a -> b Pair.of(a, b)
a ** b Math.pow(a, b)
a .. b new IntegerRange(a, b)
a ..< b new ExclusiveRange(a, b, true)
a >.. b new ExclusiveRange(a, b, false)
a ?: b if (a != null) a else b
a?.doStuff if (a != null) a.doStuff()
extension-методы
"text".toFirstUpper
extension-методы
"text".toFirstUpper
import org.eclipse.xtext.xbase.lib.StringExtensions;
…
StringExtensions.toFirstUpper("text");
Стандартные extension-методы
ObjectExtensions
ByteExtensions
ShortExtensions
IntegerExtensions
LongExtensions
FloatExtensions
BooleanExtensions
DoubleExtensions
CharacterExtensions
BigIntegerExtensions
BigDecimalExtensions
IterableExtensions
MapExtensions
ListExtensions
CollectionExtensions
FunctionExtensions
ProcedureExtensions
ComparableExtensions
Внешние extension-методы
import java.io.File
import com.google.common.io.Files;
class Main {
def static void main(String[] args) {
val file = new File('''C:jdk1.7.0_25README.html''')
val bytes = Files::toByteArray(file)
...
}
}
Внешние extension-методы
import java.io.File
import static extension com.google.common.io.Files.*;
class Main {
def static void main(String[] args) {
val file = new File('''C:jdk1.7.0_25README.html''')
val bytes = file.toByteArray
...
}
}
Локальные extension-методы
class Main {
def static void main(String[] args) {
val f = 5.factorial
println(f)
}
def static int factorial(int n) {
if (n == 1) 1 else n * factorial(n - 1)
}
}
Extension providers
class EntityRepository {
var extension EntityManager entityManager
def void doSmth() {
val person = new Person("John", "Doe")
person.persist
}
}
Lambdas
val Comparator<String> c =
[a,b | Integer::compare(a.length, b.length)]
Lambdas
val Comparator<String> c =
[a,b | Integer::compare(a.length, b.length)]
final Comparator<String> _function = new Comparator<String>() {
public int compare(final String a, final String b) {
int _length = a.length();
int _length_1 = b.length();
int _compare = Integer.compare(_length, _length_1);
return _compare;
}
};
final Comparator<String> c = _function;
Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map([p | p.firstName])
// John, Jane, David
Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map([it.firstName])
// John, Jane, David
Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map([firstName])
// John, Jane, David
Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map[firstName]
// John, Jane, David
Lambdas
val persons = #[
new Person("John", "Doe", true),
new Person("Jane", "Roe", false),
new Person("David", "McFly", true)
]
val women = persons.filter[female]
// Jane Roe
Задача
Найти человека с
самой длинной фамилией
Решение #0
var Person person = null;
for (p : persons) {
if (person == null || p.lastName.length > person.lastName.length) {
person = p
}
}
Решение #0
var Person person = null;
for (p : persons) {
if (person == null || p.lastName.length > person.lastName.length) {
person = p
}
}
Решение #1
val person = persons.sortBy[lastName.length].last
Решение #2
import static extension java.util.Collections.*
val person = persons.max[ p1, p2 |
p1.lastName.length - p2.lastName.length
]
Решение #3
val person = persons.reduce[ pWithLongestLastName, p |
if (pWithLongestLastName.lastName.length > p.lastName.length)
pWithLongestLastName
else
p
]
Решение #4
val person = persons.maxBy[lastName.length]
Multiple dispatch
GameObject
Spaceship Asteroid
Multiple dispatch
def static void main(String[] args) {
val GameObject asteroid = new Asteroid
val GameObject spaceship = new Spaceship
collide(asteroid, spaceship)
}
def static void collide(Asteroid x, Asteroid y) {
println('астероид сталкивается с астероидом')
}
def static void collide(Asteroid x, Spaceship y) {
println('астероид сталкивается с космическим кораблем')
}
def static void collide(Spaceship x, Asteroid y) {
println('космический корабль сталкивается с астероидом')
}
def static void collide(Spaceship x, Spaceship y) {
println('космический корабль сталкивается с космическим кораблем')
}
Multiple dispatch
def static void main(String[] args) {
val GameObject asteroid = new Asteroid
val GameObject spaceship = new Spaceship
collide(asteroid, spaceship) // Ошибка компиляции
}
def static void collide(Asteroid x, Asteroid y) {
println('астероид сталкивается с астероидом')
}
def static void collide(Asteroid x, Spaceship y) {
println('астероид сталкивается с космическим кораблем')
}
def static void collide(Spaceship x, Asteroid y) {
println('космический корабль сталкивается с астероидом')
}
def static void collide(Spaceship x, Spaceship y) {
println('космический корабль сталкивается с космическим кораблем')
}
Multiple dispatch
def static void main(String[] args) {
val GameObject asteroid = new Asteroid
val GameObject spaceship = new Spaceship
collide(asteroid, spaceship) // OK
}
def static dispatch void collide(Asteroid x, Asteroid y) {
println('астероид сталкивается с астероидом')
}
def static dispatch void collide(Asteroid x, Spaceship y) {
println('астероид сталкивается с космическим кораблем')
}
def static dispatch void collide(Spaceship x, Asteroid y) {
println('космический корабль сталкивается с астероидом')
}
def static dispatch void collide(Spaceship x, Spaceship y) {
println('космический корабль сталкивается с космическим кораблем')
}
Multiple dispatch
protected static void _collide(final Asteroid x, final Asteroid y) {
InputOutput.<String>println("астероид сталкивается с астероидом");
}
protected static void _collide(final Asteroid x, final Spaceship y) {
InputOutput.<String>println("астероид сталкивается с космическим кораблем");
}
protected static void _collide(final Spaceship x, final Asteroid y) {
InputOutput.<String>println("космический корабль сталкивается с астероидом");
}
protected static void _collide(final Spaceship x, final Spaceship y) {
InputOutput.<String>println("космический корабль сталкивается с космическим кораблем");
}
public static void collide(final GameObject x, final GameObject y) {
if (x instanceof Asteroid && y instanceof Asteroid) {
_collide((Asteroid)x, (Asteroid)y);
return;
} else if (x instanceof Asteroid && y instanceof Spaceship) {
_collide((Asteroid)x, (Spaceship)y);
return;
} else if (x instanceof Spaceship && y instanceof Asteroid) {
_collide((Spaceship)x, (Asteroid)y);
return;
} else if (x instanceof Spaceship && y instanceof Spaceship) {
_collide((Spaceship)x, (Spaceship)y);
return;
} else {
throw new IllegalArgumentException("Unhandled parameter types: " +
Arrays.<Object>asList(x, y).toString());
}
}
Template expressions
val name = "James"
println("Hello " + name + "!")
Template expressions
val name = "James"
println('''Hello «name»!''')
Template expressions
val name = "James"
println('''Hello «name»!''')
final String name = "James";
StringConcatenation _builder = new StringConcatenation();
_builder.append("Hello ");
_builder.append(name, "");
_builder.append("!");
InputOutput.<String>println(_builder.toString());
Template expressions
def static html(String text, String image) {
'''
<!DOCTYPE html>
<html>
<body>
<p>«text»</p>
<img src='«image»'
width='«getWidth(image)»'
height='«getHeight(image)»'/>
</body>
</html>
'''
}
Active annotations
class Tweets {
List<String> allTweets = TweetReader::allTweets
...
}
Active annotations
class Tweets {
@Lazy List<String> allTweets = TweetReader::allTweets
...
}
Active annotations
@Target(ElementType::FIELD)
annotation Lazy {
}
Active annotations
@Target(ElementType::FIELD)
@Active(typeof(LazyProcessor))
annotation Lazy {
}
Active annotations
@Target(ElementType::FIELD)
@Active(typeof(LazyProcessor))
annotation Lazy {
}
class LazyProcessor extends AbstractFieldProcessor {
override doTransform(MutableFieldDeclaration field, extension TransformationContext context) {
if (field.type.primitive)
field.addError("Fields with primitives are not supported by @Lazy")
if (field.initializer == null)
field.addError("A lazy field must have an initializer.")
field.declaringType.addMethod('_init' + field.simpleName) [
visibility = Visibility::PRIVATE
returnType = field.type
body = field.initializer
]
field.declaringType.addMethod('get' + field.simpleName.toFirstUpper) [
returnType = field.type
body = ['''
if («field.simpleName»==null)
«field.simpleName» = _init«field.simpleName»();
return «field.simpleName»;
''']
]
}
}
Заключение
• Xtend – довольно сырой язык
Заключение
• Xtend – довольно сырой язык
– Есть баги
– Проблемы с производительностью
– Очень маленькое сообщество
Заключение
• Xtend – довольно сырой язык
– Есть баги
– Проблемы с производительностью
– Очень маленькое сообщество
• Неплохая поддержка IDE
Заключение
• Xtend – довольно сырой язык
– Есть баги
– Проблемы с производительностью
– Очень маленькое сообщество
• Неплохая поддержка IDE
• Язык не является убийцей Java, он является
убийцей её синтаксиса 

Weitere ähnliche Inhalte

Was ist angesagt?

Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Kotlin для Android
Kotlin для AndroidKotlin для Android
Kotlin для AndroidKirill Rozov
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Evgeny Borisov
 
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo JonathanAndrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathanguest092df8
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011ilyubin
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Yandex
 

Was ist angesagt? (19)

Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Kotlin на практике
Kotlin на практикеKotlin на практике
Kotlin на практике
 
Jquery
JqueryJquery
Jquery
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Kotlin для Android
Kotlin для AndroidKotlin для Android
Kotlin для Android
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
 
Andrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo JonathanAndrew Shitov Rakudo Jonathan
Andrew Shitov Rakudo Jonathan
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Yii development
Yii developmentYii development
Yii development
 
Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 

Andere mochten auch

Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Sven Efftinge
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with XtendSven Efftinge
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendSven Efftinge
 
Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With XtextSven Efftinge
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With XtendSven Efftinge
 

Andere mochten auch (6)

Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with Xtend
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With Xtend
 

Ähnlich wie Xtend

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...Provectus
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмRuslan Balkin
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаAnton Arhipov
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 

Ähnlich wie Xtend (20)

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Kotlin
KotlinKotlin
Kotlin
 
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Scala
ScalaScala
Scala
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
Scala for android
Scala for androidScala for android
Scala for android
 
PHP basic
PHP basicPHP basic
PHP basic
 
Thread
ThreadThread
Thread
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Bytecode
BytecodeBytecode
Bytecode
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
JPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчикаJPoint 2015 - Javassist на службе Java-разработчика
JPoint 2015 - Javassist на службе Java-разработчика
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 

Mehr von Zheka Kozlov

Модули в Java
Модули в JavaМодули в Java
Модули в JavaZheka Kozlov
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиZheka Kozlov
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модулиZheka Kozlov
 
Введение в Scalaz
Введение в ScalazВведение в Scalaz
Введение в ScalazZheka Kozlov
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в AkkaZheka Kozlov
 
Сервис MobiBarC
Сервис MobiBarCСервис MobiBarC
Сервис MobiBarCZheka Kozlov
 
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13Zheka Kozlov
 

Mehr von Zheka Kozlov (8)

Модули в Java
Модули в JavaМодули в Java
Модули в Java
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
Введение в Scalaz
Введение в ScalazВведение в Scalaz
Введение в Scalaz
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
 
Сервис MobiBarC
Сервис MobiBarCСервис MobiBarC
Сервис MobiBarC
 
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
 

Xtend

  • 2. Xtend • Язык общего назначения
  • 3. Xtend • Язык общего назначения • Транслируется в Java 5
  • 4. Xtend • Язык общего назначения • Транслируется в Java 5 • ООП + немного ФП
  • 5. Xtend • Язык общего назначения • Транслируется в Java 5 • ООП + немного ФП • Простота изучения (намного проще Scala), схожесть с Java
  • 6. Xtend • Язык общего назначения • Транслируется в Java 5 • ООП + немного ФП • Простота изучения (намного проще Scala), схожесть с Java • Библиотека – тонкая прослойка над Java (≈100 классов) + Guava
  • 13. Кол-во вопросов на SO 457101 17592 6564 5612 1748 1143 82 23 14 9 8 7 6 3 1 10 100 1000 10000 100000 1000000 Java Scala Groovy Clojure JRuby Jython Xtend Kotlin Mirah Gosu Fantom Ceylon Yeti X10
  • 15. No ; and () class Main { def static void main(String[] args) { println(5.toString) } }
  • 16. Translation to Java import org.eclipse.xtext.xbase.lib.InputOutput; @SuppressWarnings("all") public class Main { public static void main(final String[] args) { String _string = Integer.valueOf(5).toString(); InputOutput.<String>println(_string); } }
  • 17. val, var and type inference val n = 5 for (i : 1..n) { var str = i.toString println(str) str = ... }
  • 18. val, var and type inference val int n = 5 for (int i : 1..n) { var String str = i.toString println(str) str = ... }
  • 19. Type inference val list = new ArrayList list.add(1) list.add("text") list.add(true) println(list)
  • 20. Type inference val list = new ArrayList list.add(1) list.add("text") list.add(true) println(list) Какой тип у ArrayList?
  • 21. Type inference val list = new ArrayList<Serializable> list.add(1) list.add("text") list.add(true) println(list)
  • 22. Type inference val list = new ArrayList<Comparable<?>> list.add(1) list.add("text") list.add(true) println(list)
  • 23. Everything is an expression def static readData() { val data = try { fileContentsToString('data.txt') } catch (IOException e) { "dummy data" } println(data) data }
  • 24. switch def String describe(Object x) { switch x { Integer case x > 0 : "Positive integer" String : "String" List<?> case x.empty : "Empty list" List<?> : "Non-empty list" default : x.class.simpleName } }
  • 25. Классы @Data class Person { val String firstName val String lastName val int age def void sayHello() { println('''Hello, my name is «firstName» «lastName»''') } }
  • 26. Классы @Data @SuppressWarnings("all") public class Person { private final String _firstName; public String getFirstName() { this._firstName; } private final String _lastName; public String getLastName() { return this._lastName; } private final int _age; public int getAge() { return this._age; } public void sayHello() { ... } public Person(final String firstName, final String lastName, final int age) { ... } @Override public int hashCode() { ... } @Override public boolean equals(final Object obj) { ... } @Override public String toString() { ... } }
  • 27. Классы class Task implements Runnable { @Property val String name @Property var int timeout new(String name, int timeout) { this._name = name this._timeout = timeout } new(String name) { this(name, 600) } override run() { println('''Running task "«name»"''') ... } }
  • 28. Операторы Xtend Java a == b Objects.equals(a, b) a === b a == b a -> b Pair.of(a, b) a ** b Math.pow(a, b) a .. b new IntegerRange(a, b) a ..< b new ExclusiveRange(a, b, true) a >.. b new ExclusiveRange(a, b, false) a ?: b if (a != null) a else b a?.doStuff if (a != null) a.doStuff()
  • 32. Внешние extension-методы import java.io.File import com.google.common.io.Files; class Main { def static void main(String[] args) { val file = new File('''C:jdk1.7.0_25README.html''') val bytes = Files::toByteArray(file) ... } }
  • 33. Внешние extension-методы import java.io.File import static extension com.google.common.io.Files.*; class Main { def static void main(String[] args) { val file = new File('''C:jdk1.7.0_25README.html''') val bytes = file.toByteArray ... } }
  • 34. Локальные extension-методы class Main { def static void main(String[] args) { val f = 5.factorial println(f) } def static int factorial(int n) { if (n == 1) 1 else n * factorial(n - 1) } }
  • 35. Extension providers class EntityRepository { var extension EntityManager entityManager def void doSmth() { val person = new Person("John", "Doe") person.persist } }
  • 36. Lambdas val Comparator<String> c = [a,b | Integer::compare(a.length, b.length)]
  • 37. Lambdas val Comparator<String> c = [a,b | Integer::compare(a.length, b.length)] final Comparator<String> _function = new Comparator<String>() { public int compare(final String a, final String b) { int _length = a.length(); int _length_1 = b.length(); int _compare = Integer.compare(_length, _length_1); return _compare; } }; final Comparator<String> c = _function;
  • 38. Lambdas val persons = #[ new Person("John", "Doe"), new Person("Jane", "Roe"), new Person("David", "McFly") ] val names = persons.map([p | p.firstName]) // John, Jane, David
  • 39. Lambdas val persons = #[ new Person("John", "Doe"), new Person("Jane", "Roe"), new Person("David", "McFly") ] val names = persons.map([it.firstName]) // John, Jane, David
  • 40. Lambdas val persons = #[ new Person("John", "Doe"), new Person("Jane", "Roe"), new Person("David", "McFly") ] val names = persons.map([firstName]) // John, Jane, David
  • 41. Lambdas val persons = #[ new Person("John", "Doe"), new Person("Jane", "Roe"), new Person("David", "McFly") ] val names = persons.map[firstName] // John, Jane, David
  • 42. Lambdas val persons = #[ new Person("John", "Doe", true), new Person("Jane", "Roe", false), new Person("David", "McFly", true) ] val women = persons.filter[female] // Jane Roe
  • 44. Решение #0 var Person person = null; for (p : persons) { if (person == null || p.lastName.length > person.lastName.length) { person = p } }
  • 45. Решение #0 var Person person = null; for (p : persons) { if (person == null || p.lastName.length > person.lastName.length) { person = p } }
  • 46. Решение #1 val person = persons.sortBy[lastName.length].last
  • 47. Решение #2 import static extension java.util.Collections.* val person = persons.max[ p1, p2 | p1.lastName.length - p2.lastName.length ]
  • 48. Решение #3 val person = persons.reduce[ pWithLongestLastName, p | if (pWithLongestLastName.lastName.length > p.lastName.length) pWithLongestLastName else p ]
  • 49. Решение #4 val person = persons.maxBy[lastName.length]
  • 51. Multiple dispatch def static void main(String[] args) { val GameObject asteroid = new Asteroid val GameObject spaceship = new Spaceship collide(asteroid, spaceship) } def static void collide(Asteroid x, Asteroid y) { println('астероид сталкивается с астероидом') } def static void collide(Asteroid x, Spaceship y) { println('астероид сталкивается с космическим кораблем') } def static void collide(Spaceship x, Asteroid y) { println('космический корабль сталкивается с астероидом') } def static void collide(Spaceship x, Spaceship y) { println('космический корабль сталкивается с космическим кораблем') }
  • 52. Multiple dispatch def static void main(String[] args) { val GameObject asteroid = new Asteroid val GameObject spaceship = new Spaceship collide(asteroid, spaceship) // Ошибка компиляции } def static void collide(Asteroid x, Asteroid y) { println('астероид сталкивается с астероидом') } def static void collide(Asteroid x, Spaceship y) { println('астероид сталкивается с космическим кораблем') } def static void collide(Spaceship x, Asteroid y) { println('космический корабль сталкивается с астероидом') } def static void collide(Spaceship x, Spaceship y) { println('космический корабль сталкивается с космическим кораблем') }
  • 53. Multiple dispatch def static void main(String[] args) { val GameObject asteroid = new Asteroid val GameObject spaceship = new Spaceship collide(asteroid, spaceship) // OK } def static dispatch void collide(Asteroid x, Asteroid y) { println('астероид сталкивается с астероидом') } def static dispatch void collide(Asteroid x, Spaceship y) { println('астероид сталкивается с космическим кораблем') } def static dispatch void collide(Spaceship x, Asteroid y) { println('космический корабль сталкивается с астероидом') } def static dispatch void collide(Spaceship x, Spaceship y) { println('космический корабль сталкивается с космическим кораблем') }
  • 54. Multiple dispatch protected static void _collide(final Asteroid x, final Asteroid y) { InputOutput.<String>println("астероид сталкивается с астероидом"); } protected static void _collide(final Asteroid x, final Spaceship y) { InputOutput.<String>println("астероид сталкивается с космическим кораблем"); } protected static void _collide(final Spaceship x, final Asteroid y) { InputOutput.<String>println("космический корабль сталкивается с астероидом"); } protected static void _collide(final Spaceship x, final Spaceship y) { InputOutput.<String>println("космический корабль сталкивается с космическим кораблем"); } public static void collide(final GameObject x, final GameObject y) { if (x instanceof Asteroid && y instanceof Asteroid) { _collide((Asteroid)x, (Asteroid)y); return; } else if (x instanceof Asteroid && y instanceof Spaceship) { _collide((Asteroid)x, (Spaceship)y); return; } else if (x instanceof Spaceship && y instanceof Asteroid) { _collide((Spaceship)x, (Asteroid)y); return; } else if (x instanceof Spaceship && y instanceof Spaceship) { _collide((Spaceship)x, (Spaceship)y); return; } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(x, y).toString()); } }
  • 55. Template expressions val name = "James" println("Hello " + name + "!")
  • 56. Template expressions val name = "James" println('''Hello «name»!''')
  • 57. Template expressions val name = "James" println('''Hello «name»!''') final String name = "James"; StringConcatenation _builder = new StringConcatenation(); _builder.append("Hello "); _builder.append(name, ""); _builder.append("!"); InputOutput.<String>println(_builder.toString());
  • 58. Template expressions def static html(String text, String image) { ''' <!DOCTYPE html> <html> <body> <p>«text»</p> <img src='«image»' width='«getWidth(image)»' height='«getHeight(image)»'/> </body> </html> ''' }
  • 59. Active annotations class Tweets { List<String> allTweets = TweetReader::allTweets ... }
  • 60. Active annotations class Tweets { @Lazy List<String> allTweets = TweetReader::allTweets ... }
  • 63. Active annotations @Target(ElementType::FIELD) @Active(typeof(LazyProcessor)) annotation Lazy { } class LazyProcessor extends AbstractFieldProcessor { override doTransform(MutableFieldDeclaration field, extension TransformationContext context) { if (field.type.primitive) field.addError("Fields with primitives are not supported by @Lazy") if (field.initializer == null) field.addError("A lazy field must have an initializer.") field.declaringType.addMethod('_init' + field.simpleName) [ visibility = Visibility::PRIVATE returnType = field.type body = field.initializer ] field.declaringType.addMethod('get' + field.simpleName.toFirstUpper) [ returnType = field.type body = [''' if («field.simpleName»==null) «field.simpleName» = _init«field.simpleName»(); return «field.simpleName»; '''] ] } }
  • 64. Заключение • Xtend – довольно сырой язык
  • 65. Заключение • Xtend – довольно сырой язык – Есть баги – Проблемы с производительностью – Очень маленькое сообщество
  • 66. Заключение • Xtend – довольно сырой язык – Есть баги – Проблемы с производительностью – Очень маленькое сообщество • Неплохая поддержка IDE
  • 67. Заключение • Xtend – довольно сырой язык – Есть баги – Проблемы с производительностью – Очень маленькое сообщество • Неплохая поддержка IDE • Язык не является убийцей Java, он является убийцей её синтаксиса 