Статьи

«Дарт» от Google


Сегодня это наконец произошло: на конференции GOTO Google
официально представила свой новый язык программирования,
Dart . Этот пост дает обзор Dart и дает несколько комментариев о том, как он вписывается в текущую языковую среду программирования.

 

Информация о Дарт

Этот пост основан на следующих источниках на Dart:

Дротик в двух словах

  • В настоящее время Dart — это не замена JavaScript, а «лучшая Java» плюс GWT следующего поколения.
  • Язык меньше похож на JavaScript и больше похож на улучшенную версию Java: улучшенные обобщенные типы, первоклассные функции, необязательные типы (без ошибок типов, только предупреждения), методы получения и установки, без примитивных типов.
  • Он по-прежнему является частью мира HTML5 и включает в себя библиотеку DOM.
  • Есть поддержка IDE через плагин Eclipse.

Обзор языка

функции

    // named function
    void sayGreeting(String salutation, String name) {
      final greeting = '$salutation $name';
      print(greeting);
    }
    
    // function with statement body
    window.on.click.add((event) {
      print('You clicked the window.');
    })
    
    // function with expression body
    var items = [1, 2, 3, 4, 5];
    var odd = items.filter((i) => i % 2 == 1);
    print(odd); // [1, 3, 5]

Классы

    class Point {
      Point(this.x, this.y);
      distanceTo(Point other) {
        var dx = x - other.x;
        var dy = y - other.y;
        return Math.sqrt(dx * dx + dy * dy);
      }
      var x, y;
    }

Члены класса:

  • Методы: см. DistanceTo (), выше
  • операторы
        operator +(other) => new Point(x+other.x, y+other.y);
    
  • поля
        num left, top, width, height;
    
  • Добытчики, сеттеры
        num get right()           => left + width;
            set right(num value)  => left = value - width;
    
  • Конструкторы
    • Нормальные конструкторы
          Rectangle(this.left, this.top, this.width, this.height);
      

      Префикс этого к параметрам означает, что они будут автоматически назначены полям. Это была одна из предложенных функций для литералов класса JavaScript.

    • Именованные конструкторы. Без перегрузки вам нужен способ различать альтернативные конструкторы.
          Point.zero() : x = 0, y = 0;
      
    • Фабричные конструкторы — это способ пометить конструкторы, чтобы экземпляр не создавался автоматически. Затем вы можете вернуть кэшированные экземпляры или экземпляры подклассов.
            factory Symbol(String name) {
              if (_cache.containsKey(name)) {
                return _cache[name];
              } else {
                const symbol = new Symbol._internal(name);
                _cache[name] = symbol;
                return symbol;
              }
            }
      
            Symbol._internal(this.name);
      

Интерфейсы

    interface Shape {
      num perimeter();
    }
    class Rectangle implements Shape {
      final num height, width; 
      Rectangle(num this.height, num this.width); 
      num perimeter() => 2*height + 2*width;
    }


Фабричные классы для интерфейсов.
Интерфейс может указывать фабричный класс, который можно рассматривать как реализацию по умолчанию. Можно создать экземпляр интерфейса, но на самом деле создать экземпляр фабричного класса за кулисами. Конструкторы интерфейса делегируют конструкторам класса фабрики. Я не уверен, чем это отличается от абстрактного класса. Кажется, это удовлетворяет любовь к интерфейсам, которые есть у многих Java-программистов.

изоляты

Параллельность в стиле Erlang:

    // Receive messages
    class Printer extends Isolate {
      main() {
        port.receive((message, replyTo) {
          if (message == null) port.close();
          else print(message);
        });
      }
    }

    // Send messages
    main() {
      new Printer().spawn().then((port) {
        for (var message in ['Hello', 'from', 'other', 'isolate']) {
          port.send(message);  
        }
        port.send(null);
      });
    }

Цитирование спецификации языка:


Код дротика всегда однопоточный.
В Dart нет параллелизма с общим состоянием. Параллельность поддерживается через
актер -как объекты , называемые
изолят . Изолят — это единица параллелизма. У него своя память и своя нить контроля. Изоляты общаются путем передачи сообщений. Ни одно государство никогда не разделяется между изолятами. Изоляты создаются нерестом.

Дженерики

Reified дженерики (параметризованные типы):

    main() {
      print(new List<String>() is List<Object>);
      print(new List<Object>() is List<String>);
      print(new List<String>() is List<int>);
      print(new List<String>() is List);
      print(new List() is List<String>);
    }

Струны

  • Тройные кавычки для многострочных строк
        var message = """
        Dear $user!
    
        There has been a problem!
        """;
    
  • $ для переменной интерполяции:
        var foo = "world";
        print("Hello $foo");
    
  • $ {} для интерполяции выражений:
        print("Result: ${x + y}");
    

Разные особенности

Несколько интересных моментов:

  • Существует стандартная библиотека с классами коллекций (List, Set, Queue, Map и т. Д.) И DOM API.
  • Равенство обрабатывается с помощью оператора == и делегируется в интерфейс Comparable (для ненулевых значений).

Бегущий Дартс

Есть несколько способов запуска кода Dart. Цитирование
технического обзора :

  • Переведите код Dart в JavaScript, который может работать в любом современном браузере: Chrome, Safari 5+ и Firefox 4+ (в ближайшее время появится дополнительная поддержка браузера).
  • Выполните код Dart непосредственно в виртуальной машине на стороне сервера.
  • Используйте Dartboard для написания, изменения и запуска небольших программ Dart в любом окне браузера.

Дротик еще не закончен

Предстоящие функции:

  • Перечисления
  • Возможно: API отражения
  • Возможно: сопоставление с образцом (подумайте: более мощный переключатель для объектов). Полезно для изолятов, чтобы лучше обрабатывать сообщения.
  • «В настоящее время Dart VM не интегрирована в Chrome, но мы планируем изучить эту возможность». [источник: блог Google Code ]

Больше информации в сети

Особенности и детали


@dalmaer
:


66 человек указаны в качестве владельцев / коммиттеров для Dart.
Святая большая команда!
http://code.google.com/p/dart/people/list


@pmuellr
:


Похоже, Dart позволяет использовать typedef для функций, что должно быть хорошо для определения сигнатур обратного вызова.

Язык в щеке

@mrspeaker :


Я дам это, Дарт, безусловно, решает проблему JavaScript, не имеющего ничего общего с Java.


@jashkenas
:


Мой любимый класс компилятора Dart:
Hack.java


@maccman
:


Источник

Дартса содержит этот маленький драгоценный камень:
static bool isVm () {return 1234567890123456789% 2> 0; }

Как Дарт вписывается в текущий ландшафт языков программирования?

Свободно перефразируя
твит @pilif:

  • Если вы любите Java и не можете заставить себя любить JavaScript, вы программируете Dart.
  • Если вам нравится Ruby и вы не можете заставить себя любить JavaScript, вы программируете CoffeeScript.
  • Если вам нравится JavaScript, вы программируете JavaScript.

Что вы получаете по сравнению с Java?

  • В настоящее время Dart почти похож на GWT (что не так уж и плохо): он работает «на родном» уровне на виртуальной машине на сервере, скомпилирован в JavaScript на клиенте.
  • Использование Dart IDE в Eclipse имеет смысл, поскольку вы получаете множество функций (таких как поддержка Git) бесплатно и потому, что они знакомы Java-программистам.
  • Дарт кажется обновлением Java, как очищенная версия. Он даже переносит некоторые негативные Java-измы, например, поля автоматически становятся частью локальной области видимости.

Что вы получаете по сравнению с JavaScript?

  • Основные возможности Dart killer: необязательные типы, актерский параллелизм через изоляты . Тем не менее, вы можете многое сделать с помощью вывода типов в JavaScript, литералы классов попадут в ECMAScript.next [2], и веб-работники становятся все более изощренными. Дарт отказывается от некоторых странностей JavaScript, но опять же, как и ECMAScript.next.
  • Во многих отношениях Дарт чувствует себя менее универсальным, чем JavaScript. Например, литералы объектов JavaScript являются очень мощной функцией. Дарт более статичен и имеет только классы.
  • Дарт, кажется, имеет приличный инструментарий, но он основан на Eclipse. Напротив, многие JavaScript IDE, которые в настоящее время находятся в разработке, основаны на веб-технологиях. Написание IDE для языка на самом языке имеет много преимуществ.
  • На данный момент Dart даже не быстрее, чем JavaScript на V8. Предположительно, это изменится в будущем. Но это говорит о том, насколько быстрым стал JavaScript и что ему не нужны статические типы для этого.
  • Не замена JavaScript? Цитата из разговора:


    Мы нацелены не на JavaScript, а на фрагментированные мобильные платформы.

    Я не уверен, что это значит. Вопрос в том, будет ли Dart ориентироваться на эти платформы путем компиляции в JavaScript или компиляции в нативную мобильную среду?

  • Google мог бы получить те же результаты, поддерживая ECMAScript.next [2] (плюс, возможно, некоторые расширенные, еще не стандартизированные функции) и Traceur [3].

Как сейчас, у нас есть чистый, но довольно простой язык без каких-либо выдающихся функций. Например, не поддерживается даже множественное наследование через что-то вроде признаков. Синтаксис Dart имеет знакомое, но общее разнообразие в стиле C (Java, JavaScript, C #). Пока Chrome не поставляется со встроенной виртуальной машиной Dart, Dart больше похож на замену Java и GWT следующего поколения. Возможно, так и должно быть, и Google должен использовать нативный Dart на серверах и Android (чтобы избежать проблем с авторским правом) и продолжать всегда компилировать его в JavaScript в веб-браузерах. Это предотвратит неприятную фрагментацию на клиентских языках. Ориентировочными указателями в этом направлении является то, что Google пока не берет на себя обязательство интегрировать Dart VM в Chrome и заявляет, что Dart не ориентирован на JavaScript.Это заметное изменение в тоне по сравнению с документом с открытым анти-JavaScript, который был опубликован в прошлом году [1].

Если вы хотите увидеть действительно инновационный язык, взгляните на Newspeak : его элегантный синтаксис основан на известном языке Smalltalk, и у него есть свежие новые идеи относительно модульности и IDE. Гилад Брача, один из его создателей, является частью команды Dart, поэтому я ожидал большего от этого языка.