6
Hôm nay, điều đó cuối cùng đã xảy ra: Tại hội nghị GOTO, Google đã chính thức trình bày ngôn ngữ lập trình mới của mình, Dart . Bài đăng này cung cấp một cái nhìn tổng quan về Dart và cung cấp một vài nhận xét về cách nó phù hợp với bối cảnh ngôn ngữ lập trình hiện tại.

 

Thông tin về phi tiêu

Bài đăng này dựa trên các nguồn sau đây về Dart:


Phi tiêu trong một nốt nhạc

  • Hiện tại, Dart không phải là một thay thế JavaScript, mà là một Java Java tốt hơn cộng với một GWT thế hệ tiếp theo.
  • Ngôn ngữ này không giống JavaScript và giống như một phiên bản cải tiến của Java: tổng quát hóa, các hàm hạng nhất, các loại tùy chọn (không có lỗi loại, chỉ cảnh báo), getters và setters, không có kiểu nguyên thủy.
  • Nó vẫn là một phần của thế giới HTML5 và bao gồm một thư viện DOM.
  • Có hỗ trợ IDE, thông qua một trình cắm thêm Eclipse.


Tổng quan về ngôn ngữ

Chức năng

    // 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]


Các lớp học

    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;
    }

Các thành viên trong lớp:

  • Phương thức: xem distanceTo (), ở trên
  • Người vận hành
        operator +(other) => new Point(x+other.x, y+other.y);
    
  • Lĩnh vực
        num left, top, width, height;
    
  • Getters, setters
        num get right()           => left + width;
            set right(num value)  => left = value - width;
    
  • Người xây dựng

    • Nhà xây dựng bình thường
          Rectangle(this.left, this.top, this.width, this.height);
      
      Tiền tố này. cho các tham số có nghĩa là chúng sẽ được tự động gán cho các trường. Đây là một trong những tính năng được đề xuất cho các lớp chữ JavaScript.
    • Nhà xây dựng được đặt tên. Không quá tải, bạn cần một cách để phân biệt giữa các hàm tạo thay thế.
          Point.zero() : x = 0, y = 0;
      
    • Các nhà xây dựng nhà máy là một cách để đánh dấu các nhà xây dựng để không có phiên bản nào được tạo ra tự động. Sau đó, bạn có thể trả về các thể hiện được lưu trong bộ nhớ cache hoặc các thể hiện của một lớp con.
            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);
      


Giao diện

    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;
    }


Các lớp học nhà máy cho giao diện.
Một giao diện có thể chỉ định một lớp nhà máy có thể được coi là triển khai mặc định của nó. Người ta có thể khởi tạo một giao diện, nhưng thực sự khởi tạo lớp nhà máy phía sau hậu trường. Các constructor của một giao diện ủy quyền cho các constructor của lớp nhà máy. Tôi không chắc nó khác với lớp trừu tượng như thế nào. Nó dường như phục vụ cho sự yêu thích của các giao diện mà nhiều lập trình viên Java có.

Cô lập

Đồng thời kiểu 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);
      });
    }

Trích dẫn đặc tả ngôn ngữ:

Mã phi tiêu luôn luôn đơn luồng. Không có sự đồng thời trạng thái chia sẻ trong Dart. Đồng thời được hỗ trợ thông qua các thực thể giống như diễn viên được gọi là cô lập . Một cô lập là một đơn vị đồng thời. Nó có bộ nhớ riêng và chủ đề kiểm soát riêng. Cô lập giao tiếp bằng tin nhắn đi qua. Không có nhà nước được chia sẻ giữa các cô lập. Cô lập được tạo ra bằng cách sinh sản.


Generics

Tổng quát hóa (các loại tham số):

    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>);
    }

Dây

  • Ba dấu ngoặc kép cho chuỗi nhiều dòng
        var message = """
        Dear $user!
    
        There has been a problem!
        """;
    
  • $ cho phép nội suy biến:
        var foo = "world";
        print("Hello $foo");
    
  • $ {} cho phép nội suy biểu thức:
        print("Result: ${x + y}");
    


Các tính năng khác


Một vài mẩu tin thú vị:

  • Có một thư viện tiêu chuẩn với các lớp bộ sưu tập (Danh sách, Bộ, Hàng đợi, Bản đồ, v.v.) và API DOM.
  • Bình đẳng được xử lý thông qua toán tử == và ủy quyền cho giao diện so sánh (đối với các giá trị không null).


Chạy phi tiêu

Có một số cách để chạy mã Dart. Trích dẫn tổng quan kỹ thuật :

  • Dịch mã phi tiêu sang JavaScript có thể chạy trong bất kỳ trình duyệt hiện đại nào: Chrome, Safari 5+ và Firefox 4+ (sắp có thêm hỗ trợ trình duyệt).
  • Thực thi mã phi tiêu trực tiếp trong máy ảo ở phía máy chủ.
  • Sử dụng Bảng hiệu để viết, sửa đổi và thực hiện các chương trình Phi tiêu nhỏ trong bất kỳ cửa sổ trình duyệt nào.


Phi tiêu chưa kết thúc

Các tính năng sắp tới:

  • Enums
  • Có thể: API phản chiếu
  • Có thể: khớp mẫu (nghĩ: một công tắc mạnh hơn cho các đối tượng). Hữu ích cho các phân lập để xử lý tin nhắn tốt hơn.
  • Hiện tại, VM VM không được tích hợp trong Chrome nhưng chúng tôi có kế hoạch khám phá tùy chọn này. [Nguồn: blog Google Code ]


Thêm thông tin trên web


Các tính năng và chi tiết


@dalmaer
:

66 người được liệt kê là chủ sở hữu / người cam kết cho Dart. Thánh đội lớn! http://code.google.com.vn/p/dart/people/list

@pmuellr
:

Có vẻ như Dart cho phép typedefs cho các chức năng, điều này rất tốt để xác định chữ ký gọi lại.


Lưỡi trong má

@mrspeaker :

Tôi sẽ cung cấp cho nó điều này, Dart chắc chắn giải quyết vấn đề JavaScript không liên quan gì đến Java.

@jashkenas
:

Lớp trình biên dịch yêu thích của tôi: Hack.java

@maccman
:

Nguồn của phi tiêu chứa viên ngọc nhỏ này:
static bool isVm () {return 1234567890123456789% 2> 0; }


Làm thế nào để Dart phù hợp với bối cảnh ngôn ngữ lập trình hiện tại?

Tự do diễn giải một tweet của @pilif:

  • Nếu bạn thích Java và không thể khiến mình thích JavaScript, bạn hãy lập trình Dart.
  • Nếu bạn thích Ruby và không thể khiến mình thích JavaScript, bạn hãy lập trình CoffeeScript.
  • Nếu bạn thích JavaScript, bạn lập trình JavaScript.

Bạn nhận được gì so với Java?

  • Hiện tại, Dart gần giống như GWT (điều này không phải là một điều xấu): Chạy một cách tự nhiên trên một máy ảo trên máy chủ, được biên dịch thành JavaScript trên máy khách.
  • Dựa trên IDE IDE trên Eclipse có ý nghĩa, bởi vì bạn nhận được rất nhiều chức năng (như hỗ trợ Git) miễn phí và vì nó quen thuộc với các lập trình viên Java.
  • Dart có vẻ như là một bản nâng cấp của Java, giống như một phiên bản đã được dọn sạch. Nó thậm chí còn mang một số isms Java âm, chẳng hạn như các trường tự động trở thành một phần của phạm vi cục bộ.

Bạn nhận được gì so với JavaScript?

  • Các tính năng sát thủ chính của phi tiêu: các loại tùy chọn, đồng thời giống như diễn viên thông qua các phân lập . Tuy nhiên, bạn có thể thực hiện rất nhiều thông qua suy luận kiểu trong JavaScript, các chữ theo lớp sẽ đến với ECMAScript.next [2] và nhân viên web đang trở nên tinh vi hơn mọi lúc. Phi tiêu bỏ qua một số quirks của JavaScript, nhưng sau đó một lần nữa, ECMAScript.next cũng vậy.
  • Theo nhiều cách, Dart cảm thấy kém linh hoạt hơn JavaScript. Ví dụ, các đối tượng JavaScript là một tính năng rất mạnh mẽ. Phi tiêu tĩnh hơn và chỉ có các lớp.
  • Phi tiêu dường như có công cụ tốt, nhưng nó dựa trên Eclipse. Ngược lại, nhiều IDE JavaScript hiện đang được phát triển dựa trên các công nghệ web. Viết một IDE cho một ngôn ngữ trong chính ngôn ngữ này có nhiều lợi thế.
  • Hiện tại, Dart thậm chí không nhanh hơn JavaScript trên V8. Có lẽ, điều đó sẽ thay đổi trong tương lai. Nhưng điều này cho thấy JavaScript đã trở nên nhanh như thế nào và nó không cần các kiểu tĩnh để đạt được điều đó.
  • Không phải là một thay thế JavaScript? Trích dẫn từ buổi nói chuyện:

    Chúng tôi không nhắm mục tiêu JavaScript, nhưng các nền tảng di động bị phân mảnh.

    Tôi không chắc điều đó có nghĩa là gì. Câu hỏi đặt ra là: Liệu Dart sẽ nhắm mục tiêu các nền tảng này bằng cách biên dịch sang JavaScript hay bằng cách biên dịch sang môi trường di động gốc?
  • Google có thể đã nhận được kết quả tương tự bằng cách hỗ trợ ECMAScript.next [2] (cộng với có thể một số tính năng nâng cao, chưa được tiêu chuẩn hóa) và Traceur [3].

Hiện tại, chúng ta có một ngôn ngữ sạch nhưng khá đơn giản mà không có bất kỳ tính năng nổi bật nào. Ví dụ, thậm chí không có nhiều kế thừa thông qua một cái gì đó như đặc điểm được hỗ trợ. Cú pháp của Dart là đa dạng kiểu C quen thuộc nhưng chung chung (Java, JavaScript, C #). Miễn là Chrome không đi kèm với máy ảo Dart tích hợp, Dart cảm thấy giống như một sự thay thế Java và một GWT thế hệ tiếp theo. Có lẽ nó nên giữ nguyên như vậy và Google nên sử dụng Dart gốc trên máy chủ và Android (để tránh những rắc rối về bản quyền) và tiếp tục luôn biên dịch nó thành JavaScript trên các trình duyệt web. Điều đó sẽ ngăn chặn sự phân mảnh khó chịu trong ngôn ngữ bản địa phía khách hàng. Con trỏ dự kiến ​​theo hướng đó là Google chưa cam kết tích hợp máy ảo Dart vào Chrome và nói rằng Dart không nhắm mục tiêu JavaScript.

Nếu bạn muốn xem một ngôn ngữ thật sự sáng tạo, hãy nhìn vào Newspeak : cú pháp tao nhã của nó được dựa trên ngôn ngữ Smalltalk nổi tiếng và nó có ý tưởng tươi mới về mô đun và IDE. Gilad Bracha, một trong những người tạo ra nó, là một phần của đội ngũ phi tiêu, đó là lý do tại sao tôi mong đợi nhiều hơn từ ngôn ngữ đó.

|