0
1Introduction à CeylonStéphane ÉpardaudRed Hat
2Plan d´attaque• Ceylon, cest quoi?• Pourquoi• Petit tour• Démo• La communauté• Statut2
3À propos de Stéphane Épardaud• Projets Open-Source–RESTEasy, Ceylon–jax-doclets, modules Play!, Stamps.js• Contributeur C...
4Origines de Ceylon• Lancé et dirigé par Gavin King• Résoudre les frustrations de Java4
5Qu´est-ce que Ceylon ! • Ceylon est–puissant, lisible, prédictible• Ceylon a–une plate-forme, modularité, outillage5
6Introductionà Ceylon
7Une bête classe• Ça vous rappelle quelque-chose ?7class Rectangle() {    Integer width = 0;    Integer height = 0;       ...
8Une vraie classe Ceylon• Pas (trop) de surprise8shared class Rectangle(width, height) {    shared Integer width;    share...
9Où est mon constructeur ?• Dans le corps de la classe9shared class Rectangle(width, height) {    shared Integer width;   ...
10Premières différences• Règles d´accès plus simple–Pas de `protected`, `package`, `private`–`shared` = quasi-public, sino...
11Attributs• Immuable par défaut11class CircleFromMarseille() {    Integer scale = 1;    variable Integer radius := 2;    ...
12Attributs• Sauf si marqué variable• Affecté avec :=12class CircleFromMarseille() {    Integer scale = 1;    variable Int...
13Attributs• Getter/setter sans le syndrôme du canal carpien13class CircleFromMarseille() {    Integer scale = 1;    varia...
14Héritage14shared class Point(x, y) {    shared Integer x;    shared Integer y;}shared class Point3D(x, y, z)        exte...
15Abstractions• Méthodes, attributs et classes peuvent êtreredéfinies–factory pattern• On ne peut pas redéfinir sauf si–`d...
16Abstractions (exemple)16abstract class Shape() {    shared formal Integer area();    // magic: this is toString()    sha...
17Surcharge• Pas de surcharge–WTF!?*• La surcharge, c´est mal* : Heing !?17
18La surcharge, ça sert pour• Les paramètres optionnels–Ceylon les supporte–Même le passage par nom• Pour travailler sur d...
19Paramètres optionnelsPassage par nom19class Rectangle(Integer width = 2,                 Integer height = width * 2) {  ...
20Switch par type20void workWithRectangle(Rectangle rect) {}void workWithCircle(Circle circle) {}void workWithShape(Shape ...
21Non aux répétitions21interface Figure3D {    shared formal Float area;    shared formal Float depth;    shared formal Fl...
22Interfaces avec implémentations22interface Figure3D {    shared formal Float area;    shared formal Float depth;    shar...
23Héritage multiple?! Arg…23• Pas d´état (initialisation)–Pas de problème deprécédence–Une seule superclasse• Redéfinir mé...
24Ceylon est très régulierInteger attribute = 1;Integer attribute2 { return 2; }void method() {}interface Interface {}clas...
25Structure hiérarchique25Table table = Table {    title = "Squares";    rows = 5;    border = Border {        padding = 2...
26Preuve mathématique formelle dusystème de type et d´effet
27Sémantique 1/15427
28STOP!Hammer Time…
29Types typiques29    Integer n = 10.times(2);     // no primitive types    String[] s = {"foo", "bar"}; // inference    N...
30À mort les NPEs30
31Typez en sécurité31    // optional?    Cube? cubeOrNoCube() { return null; }    Cube? cube = cubeOrNoCube();        prin...
32Un peu de sucre ?32    // default value    Cube cube2 = cubeOrNoCube() ? Cube(3.0);    // nullsafe access    Float? area...
33Operations sur les listes33Integer[] numbers = {1,2,3};// slicesInteger[] subList = numbers[1..2];Integer[] rest = numbe...
34(un peu de) Typage
35Type union• Pour stoquer une valeur parmi une liste detypes• `TypeA|TypeB`• On doit vérifier le vrai type avant de s´en ...
36Exemple de type union36class Apple() {    shared void eat() {}}class Garbage() {    shared void throwAway() {}}void unio...
37Type intersection37interface Food {    shared formal void eat(); }interface Drink {    shared formal void drink(); }clas...
38Beaucoup d´autres fonctionalités• Paramètres de types• Singletons et classesanonymes• Introductions• Références d´attrib...
39Modularité• Intégré au langage• Et dans les outils39
40Herd● Notre dépôt de modules « nouvellegénération »● Sur http://modules.ceylon-lang.org− Déjà dispo, et utilisable par l...
41Des mots…et démo !Avec de vrais morceaux d´IDE*Peut contenir des traces de Herd
42Communauté●Complètement ouverte●Des gens de JBoss/RedHat●Et de (très) actifs contributeurs−Gary, Andrew, David (Serli), ...
43Un projet sympa• Des gens sympas :)• Les meilleurs outils–github, ant, Eclipse, HTML5, Awestruct, Java,JavaScript, OpenS...
44Vers l´infini…• Cinq étapes pour atteindre 1.0• Quelques fonctionalités attendront 1.1• M1 (finie)–Au minimum toutes les...
45…et au delà !• M3–Fonctionsanonymes–Modules IO, math–Héritage mixin• M4–Classesimbriquées–Alias de types45• M5 (Ceylon 1...
46Où nous trouver?• Notre site : http://ceylon-lang.org–Blog, introduction, tour, référence, spec, API,téléchargements–Her...
47Q&R• Questions ! Réponses ?• http://ceylon-lang.org47
Upcoming SlideShare
Loading in...5
×

Soirée Ceylon avec Stéphane Epardaud

320

Published on

Stéphane Epardaut nous présentera le langage Ceylon :
Ceylon est un nouveau langage de programmation pour la machine virtuelle Java. Nous sommes fans de Java et de son écosysteme, cependant nous pensons que le langage Java et ses libraires conçus il y a 15 ans sont désuets face aux challenges actuels.
Cette introduction à Ceylon vous montrera les fonctionnalités de Ceylon ainsi que les derniers progrès fait sur le compilateur, l’IDE et la communauté autour de Ceylon.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
320
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Soirée Ceylon avec Stéphane Epardaud"

  1. 1. 1Introduction à CeylonStéphane ÉpardaudRed Hat
  2. 2. 2Plan d´attaque• Ceylon, cest quoi?• Pourquoi• Petit tour• Démo• La communauté• Statut2
  3. 3. 3À propos de Stéphane Épardaud• Projets Open-Source–RESTEasy, Ceylon–jax-doclets, modules Play!, Stamps.js• Contributeur Ceylon depuis…–13 mai 2011 (un mois après Ceylon sur SlashDot)–compilo, ceylondoc, Herd• Équipe Riviera JUG• http://stephane.epardaud.fr3
  4. 4. 4Origines de Ceylon• Lancé et dirigé par Gavin King• Résoudre les frustrations de Java4
  5. 5. 5Qu´est-ce que Ceylon ! • Ceylon est–puissant, lisible, prédictible• Ceylon a–une plate-forme, modularité, outillage5
  6. 6. 6Introductionà Ceylon
  7. 7. 7Une bête classe• Ça vous rappelle quelque-chose ?7class Rectangle() {    Integer width = 0;    Integer height = 0;        Integer area() {        return width * height;    }}
  8. 8. 8Une vraie classe Ceylon• Pas (trop) de surprise8shared class Rectangle(width, height) {    shared Integer width;    shared Integer height;        shared Integer area() {        return width * height;    }}
  9. 9. 9Où est mon constructeur ?• Dans le corps de la classe9shared class Rectangle(width, height) {    shared Integer width;    shared Integer height;    // it is here!    if (width == 0 || height == 0) {        throw;    }        shared Integer area() {        return width * height;    }}
  10. 10. 10Premières différences• Règles d´accès plus simple–Pas de `protected`, `package`, `private`–`shared` = quasi-public, sinon scope-privé10
  11. 11. 11Attributs• Immuable par défaut11class CircleFromMarseille() {    Integer scale = 1;    variable Integer radius := 2;    radius++;    Integer diameter {        return diameter * 2;    }    assign diameter {        radius := diameter / 2;     }}
  12. 12. 12Attributs• Sauf si marqué variable• Affecté avec :=12class CircleFromMarseille() {    Integer scale = 1;    variable Integer radius := 2;    radius++;    Integer diameter {        return radius * 2;    }    assign diameter {        radius := diameter / 2;     }}
  13. 13. 13Attributs• Getter/setter sans le syndrôme du canal carpien13class CircleFromMarseille() {    Integer scale = 1;    variable Integer radius := 2;    radius++;    Integer diameter {        return radius * 2;    }    assign diameter {        radius := diameter / 2;     }}
  14. 14. 14Héritage14shared class Point(x, y) {    shared Integer x;    shared Integer y;}shared class Point3D(x, y, z)        extends Point(x, y) {    shared Integer z;}
  15. 15. 15Abstractions• Méthodes, attributs et classes peuvent êtreredéfinies–factory pattern• On ne peut pas redéfinir sauf si–`default`: peut être redéfini, avec impl par défaut–`formal`: doit être redéfini, sans impl par défaut• `@Override` en Java => `actual` en Ceylon–Pas optionnel15
  16. 16. 16Abstractions (exemple)16abstract class Shape() {    shared formal Integer area();    // magic: this is toString()    shared actual default String string {        return "Abstract area: " area.string " m2";    }}class Square(Integer width) extends Shape() {    shared actual Integer area() {         return width * width;    }    shared actual String string  =         "Square area: " area.string " m2";}
  17. 17. 17Surcharge• Pas de surcharge–WTF!?*• La surcharge, c´est mal* : Heing !?17
  18. 18. 18La surcharge, ça sert pour• Les paramètres optionnels–Ceylon les supporte–Même le passage par nom• Pour travailler sur des (sous-)types différents–Pas solide si un nouveau sous-type estintroduit–Ceylon supporte les types unions et lesswitch par type18
  19. 19. 19Paramètres optionnelsPassage par nom19class Rectangle(Integer width = 2,                 Integer height = width * 2) {    shared Integer area() {        return width * height;    }}void makeRectangle() {    Rectangle rectangle = Rectangle();    Rectangle biggerRectangle = Rectangle {        height = 4;        width = 3;    };}
  20. 20. 20Switch par type20void workWithRectangle(Rectangle rect) {}void workWithCircle(Circle circle) {}void workWithShape(Shape shape) {}shared void supportsSubTyping(Shape fig) {    switch(fig)    case(is Rectangle) {        workWithRectangle(fig);    }    case(is Circle) {        workWithCircle(fig);    }    else {        workWithShape(fig);    }}
  21. 21. 21Non aux répétitions21interface Figure3D {    shared formal Float area;    shared formal Float depth;    shared formal Float volume;}class Cube(Float width) satisfies Figure3D {    shared actual Float area = width * width;    shared actual Float depth = width;    shared actual Float volume = area * depth;}class Cylinder(Integer radius, depth)       satisfies Figure3D {    shared actual Float area = 3.14 * radius ** 2;    shared actual Float depth;    shared actual Float volume = area * depth;}
  22. 22. 22Interfaces avec implémentations22interface Figure3D {    shared formal Float area;    shared formal Float depth;    shared Float volume {        return area * depth;    }}class Cube(Float width) satisfies Figure3D {    shared actual Float area = width * width;    shared actual Float depth = width;}class Cylinder(Integer radius, depth)   satisfies Figure3D {    shared actual Float area = 3.14 * radius ** 2;    shared actual Float depth;}
  23. 23. 23Héritage multiple?! Arg…23• Pas d´état (initialisation)–Pas de problème deprécédence–Une seule superclasse• Redéfinir méthode en casdambigüité
  24. 24. 24Ceylon est très régulierInteger attribute = 1;Integer attribute2 { return 2; }void method() {}interface Interface {}class Class(Integer x){    Integer attribute = x;    Integer attribute2 { return x; }    class InnerClass() {}    interface InnerInterface {}        void method(Integer y){        Integer attribute;        Integer attribute2 { return y; }        class LocalClass() {}        interface LocalInterface {}        void innerMethod() {}    }}
  25. 25. 25Structure hiérarchique25Table table = Table {    title = "Squares";    rows = 5;    border = Border {        padding = 2;        weight = 1;    };    Column {        heading = "x";        width = 10;        String content(Integer row) {            return row.string;        }    },    Column {        heading = "x*2";        width = 12;        String content(Integer row) {            return (row*2).string;        }    }};
  26. 26. 26Preuve mathématique formelle dusystème de type et d´effet
  27. 27. 27Sémantique 1/15427
  28. 28. 28STOP!Hammer Time…
  29. 29. 29Types typiques29    Integer n = 10.times(2);     // no primitive types    String[] s = {"foo", "bar"}; // inference    Number[] r = 1..2;           // intervals    // inference    function makeCube(Float width) {         return Cube(width);    }    value cube2 = makeCube(3.0);
  30. 30. 30À mort les NPEs30
  31. 31. 31Typez en sécurité31    // optional?    Cube? cubeOrNoCube() { return null; }    Cube? cube = cubeOrNoCube();        print(cube.area.string); // compile error        if (exists cube) {        print(cube.area.string);    } else {        print("Got no cube");    }
  32. 32. 32Un peu de sucre ?32    // default value    Cube cube2 = cubeOrNoCube() ? Cube(3.0);    // nullsafe access    Float? area = cube?.area;    // nullsafe array access    Cube[]? maybeList = cubeList();    Cube? c = maybeList?[2];
  33. 33. 33Operations sur les listes33Integer[] numbers = {1,2,3};// slicesInteger[] subList = numbers[1..2];Integer[] rest = numbers[1...];// map/spreadInteger[] successors = numbers[].successor;
  34. 34. 34(un peu de) Typage
  35. 35. 35Type union• Pour stoquer une valeur parmi une liste detypes• `TypeA|TypeB`• On doit vérifier le vrai type avant de s´en servir• `Type?` est un alias pour `Type|Nothing`35
  36. 36. 36Exemple de type union36class Apple() {    shared void eat() {}}class Garbage() {    shared void throwAway() {}}void unions() {    Sequence<Apple|Garbage> boxes = { Apple(), Garbage() };    for (Apple|Garbage box in boxes) {        print(box.string);        if (is Apple box) {            apple.eat();        } else if (is Garbage box) {            box.throwAway();        }    }}
  37. 37. 37Type intersection37interface Food {    shared formal void eat(); }interface Drink {    shared formal void drink(); }class Guinness() satisfies Food & Drink {    shared actual void drink() {}    shared actual void eat() {}}void intersections() {    Food & Drink specialStuff = Guinness();    specialStuff.drink();    specialStuff.eat();}
  38. 38. 38Beaucoup d´autres fonctionalités• Paramètres de types• Singletons et classesanonymes• Introductions• Références d´attribut et deméthode38• Clôtures• Application partielle• Annotations• Alias de types• Meta-modèle• Interception
  39. 39. 39Modularité• Intégré au langage• Et dans les outils39
  40. 40. 40Herd● Notre dépôt de modules « nouvellegénération »● Sur http://modules.ceylon-lang.org− Déjà dispo, et utilisable par lesoutils● Interface intuitive et jolie à la Github− Collaboratif● Logiciel Libre− Dépôts privés encouragés
  41. 41. 41Des mots…et démo !Avec de vrais morceaux d´IDE*Peut contenir des traces de Herd
  42. 42. 42Communauté●Complètement ouverte●Des gens de JBoss/RedHat●Et de (très) actifs contributeurs−Gary, Andrew, David (Serli), Ross, Tomáš, Sergej,Flavio…●Et vous !42
  43. 43. 43Un projet sympa• Des gens sympas :)• Les meilleurs outils–github, ant, Eclipse, HTML5, Awestruct, Java,JavaScript, OpenShift, Play!• De nombreux sous-projets–spec, typechecker, Java compiler, JavaScriptcompiler, Eclipse IDE, Web IDE, Herd,module system, ceylondoc, Ant/Mavenplugins43
  44. 44. 44Vers l´infini…• Cinq étapes pour atteindre 1.0• Quelques fonctionalités attendront 1.1• M1 (finie)–Au minimum toutes les fonctionalités de Java–Tous les outils (y-compris l´IDE)• M2 (finie)–Interoperabilité avec Java–Types énumérés–Méthodes d´ordre supérieur44
  45. 45. 45…et au delà !• M3–Fonctionsanonymes–Modules IO, math–Héritage mixin• M4–Classesimbriquées–Alias de types45• M5 (Ceylon 1.0)–Annotations–Génériques réifiés–Metamodèle–Interception
  46. 46. 46Où nous trouver?• Notre site : http://ceylon-lang.org–Blog, introduction, tour, référence, spec, API,téléchargements–Herd : http://modules.ceylon-lang.org• Dépôt [sic] de source–http://github.com/ceylon• Listes de développeurs, utilisateurs–Google groups : ceylon-dev, ceylon-users• Google+ : http://ceylon-lang.org/+• Twitter : @ceylonlang46
  47. 47. 47Q&R• Questions ! Réponses ?• http://ceylon-lang.org47
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×