Kotlin — Mới nhưng không lạ !!

Thuyen Phan
ZaloPay Engineering
9 min readJun 26, 2019

Kotlin là gì?

Kotlin là một ngôn ngữ lập trình kiểu tĩnh (static typing), chạy trên máy ảo JVM, được nghiên cứu và phát triển bởi JetBrains.

Nguồn gốc của cái tên Kotlin xuất phát từ hòn đảo Kotlin ở thành phố St. Petersburg, Nga, đây là trụ sở chính của Project Kotlin. Kotlin dần trở nên phổ biến trong một vài năm gần đây nhờ vào cú pháp ngắn gọn và an toàn, đây là một trong những lý do để Kotlin trở thành một trong những ứng viên nặng ký có thể thay thế cho Java.

Tại sao JetBrains lại phát triển Kotlin?

JetBrains là một công ty phát triển phần mềm, chuyên phát triển các công cụ hướng tới nhà phát triển phần mềm, cụ thể là các IDE cho các ngôn ngữ phổ biến hiện nay. JetBrains phát triển ngôn ngữ mới phải chăng là ông lớn này thay thế chiến lược kinh doanh từ phát triển công cụ thành phát triển ngôn ngữ?

Hãy cùng điểm qua một vài điểm:

  • JetBrains là một công ty phát triển IDE, do đó mỗi khi một ngôn ngữ lập trình mới được tạo ra và trở nên phổ biến thì công ty cần phải đầu tư và hỗ trợ cho ngôn ngữ mới này trong IDE của họ.
  • Lập trình viên có thể thay thể bất kỳ IDE nào, bởi một ngôn ngữ có thể được hỗ trợ bởi nhiều IDE, các IDE có tính năng khác nhau và ưu điểm cũng khác nhau, vì thế JetBrains luôn có nguy cơ mất khách hàng.
  • Giả định rằng có một công ty quyết định sử dụng Kotlin trong việc phát triển phần mềm cho họ, thì IDE nào sẽ được chọn? Và câu trả lời là liệu có IDE được hỗ trợ tốt bằng IDE do chính công ty phát triển ngôn ngữ đó tạo ra cơ chứ? Vậy ta có thể kết luận rằng động lực chính đằng sau việc JetBrains phát triển Kotlin đó là nhằm tăng thị phần IDE JetBrains của họ, ngoài ra như đã nói ở trên, nhằm ngăn chặn sự rò rỉ khách hàng chuyển sang đối thủ của họ.

Việc phát triển Kotlin thực chất là chiến lược kinh doanh của JetBrains, với những động lực chính sau:

  • Tăng thị phần IDE của JetBrains, ngăn chặn rò rỉ khách hàng.
  • Giảm chi phí Marketing cho những sản phẩm không phải IDE
  • Dễ dàng Migrate ngôn ngữ trên JVM hiện tại sang ngôn ngữ mới có thể hỗ trợ tốt hơn.

Một số điểm nổi bật của Kotlin

Null Safety

Một trong những lỗi mà lập trình viên hay vấp phải đó là Null Pointer Exception, lỗi này thường gặp ở đa số ngôn ngữ lập trình, trong đó có Java. Nếu không biết thành phần đó có được phép Null hay không thì sẽ dễ xảy ra lỗi không thể lường trước được, điều này rất nguy hiểm. Kotlin giải quyết vấn đề này bằng cách chỉ rõ biến khi khai báo có được phép Null hay không.

Ngoài ra Kotlin còn có thêm một số operator mới cho Null Safety

Lớp và kế thừa

Cũng như Java, khai báo lớp trong Kotlin dùng từ khóa class. Có một điểm khác biệt đó là constructor trong Kotlin khác với Java. Kotlin có thể có một primary constructor hoặc một hoặc nhiều secondary constructor. Primary constructor là một phần của class header, nó được chỉ định phía sau tên của class.

Do primary constructor không thể chứa code, do đó có thể khởi tạo thông qua initializer block, được cài đặt thông qua từ khóa init.

Trong khi đó secondary constructor nằm trong thân class, bắt đầu bằng từ khóa constructor, có thể có tham số và phần thân khởi tạo. Nếu class có primary constructor thì secondary constructor phải gọi hàm khởi tạo chính cho class.

Getter/Setter

Các hàm getter/setter không được định nghĩa thì nó sẽ mặc định được sử dụng.

Backing field

Ở trên ta thấy sự xuất hiện của biến field trong getter/setter, field sẽ được tự động generate cho property nếu một trong các hàm setter/getter tham chiếu đến nó, nếu không property sẽ không có field.Vậy tại sao phải thông qua field mà không phải lấy trực tiếp từ property, điều này là do khi access đến một property, ví dụ:

Điều này thực chất là hàm getter và setter của property name được gọi chứ không phải access trực tiếp, bởi vậy trong các hàm getter/setter tự định nghĩa nếu sử dụng các property trực tiếp Kotlin sẽ gọi lại chính hàm getter đó, dẫn đến StackOverflow.

Không có toán tử ba ngôi (a ? b : c)

Trong Kotlin if là một expression, nó có thể trả về giá trị, do đó sẽ không còn toán tử 3 ngôi.

String Templates

Chuỗi có thể có template expressions, giá trị của một biến có thể chuyển thành chuỗi thay vì phải ép kiểu trực tiếp. Template Expression bắt đầu bằng ký hiệu $.

Gọi Java code từ Kotlin

Kotlin được thiết kế có thể tương tác với Java, Java code có thể được gọi từ Kotlin theo cách thông thường, phần này sẽ nói về một số cách gọi code Java từ Kotlin.

Những method nào của Java không có parameter nào và có tên method bắt đầu bằng từ get hoặc set, sẽ được coi như là property trong Kotlin.

Một số keyword trong Kotlin có thể là tên hợp lệ trong Java, ví dụ trong Kotlin có những từ khóa in, is, object,… tuy nhiên trong Java có thể sử dụng những keyword đó làm tên hàm, tên biến, khi đó trong Kotlin bằng cách thêm dấu nháy vào method đó, ta có thể sử dụng chúng.

Nếu một phương thức trong Java trả về kiểu void, thì khi phương thức đó được gọi trong Kotlin nó sẽ trả về Unit. Tham khảo thêm tại đây

Gọi Kotlin code từ Java

Kotlin có thể được gọi từ Java một cách dễ dàng, JetBrains nói rằng Kotlin tương thích 100 với Java, sau đây là một vài thay đổi khi Java gọi code của Kotlin.Properties Một Properties của một class trong Kotlin sẽ được compile thành các thành phần như sau trong Java:

  • Một hàm getter với tên được suy ra từ property và thêm tiền tố get.
  • Hàm setter tương tự, tuy nhiên chỉ được sinh ra với property có kiểu var.
  • Một field với access modifier là private có tên trùng với tên của property, tuy nhiên chỉ áp dụng cho property có backing field.

Instance Field

Nếu muốn xác định một property trong Kotlin là một field trong Java, cần đánh dấu property này với annotation @JvmField. Field này sẽ có cùng access modifier với property. Tuy nhiên để có thể đánh dấu bằng@JvmField thì property phải có backing field, visibility modifier không phải private, không khai báo với từ khóa open, override, hoặc const.

Static Field

Property trong Kotlin được khai báo trong một object hoặc companion object sẽ có static backing field hoặc trong ten object hoặc trong class mà chứa companion object. Thông thường những field này là private nhưng ta có thể phơi ra bằng cách:

  • Sử dụng Annotation @JvmField
  • Sử dụng từ khóa lateinit
  • Sử dụng từ khóa const Sử dụng @JvmField làm cho Field có cùng visibility modifier với property.

Property được đánh dấu bằng const ở trong class cũng như ở top-level sẽ được chuyển thành static field trong Java

Tham khảo thêm tại đây

Kotlin/Native

Các ứng dụng Java trước khi chạy cần phải thông qua JVM để thông dịch thành mã máy mới có thể chạy được, điều này làm cho các ứng dụng Java thường có tốc độ chậm hơn các ứng dụng native. Do đó LLVM là một trình biên dịch giúp biên dịch mã của từng ngôn ngữ ra mã máy giúp cho các ứng dụng dựa trên JVM có thể chạy như ứng dụng Native. Và Kotlin được xây dựng trên LLVM, điều này có nghĩa là ta có thể code Kotlin và build ra mã máy.Tham khảo thêm tại đây.

Kotlin/Coroutines

Một trong những đặc điểm nổi bật nhất của Kotlin đó là Coroutines, vậy Coroutines là gì? Trong lập trình đa luồng, ta thường tiếp xúc với khái niệm thread, một trong những đặc điểm quan trọng của thread đó là thread sinh ra ở mức OS, điều này gây tiêu tốn tài nguyên, nhất là khi cần handle nhiều request khiến ta phải tạo ra rất nhiều thread. Đã có rất nhiều giải pháp để giải quyết sự nặng nề của thread, ví dụ như mô hình Actor hay Akka trong Scala. Đỉnh điểm là sự ra đời của ngôn ngữ lập trình Golang và khái niệm goroutines và Kotlin cũng đưa ra khái niệm coroutines giúp chạy song song nhiều coroutines với chi phí rẻ. Coroutines được gọi là light-weight threads, sở dĩ light-weight hơn so với thread là vì thread được quản lý bởi OS, do đó cần nhiều resource từ OS để quản lý. Trong khi đó Coroutines được quản lý bởi User.

Kotlin DSL

DSL (domain-specific language) là một khái niệm khá đơn giản, nó cho chúng ta hiểu được ngữ cảnh áp dụng của đối tượng, áp dụng một cấu trúc DSL vào việc xây dựng API trong một ngữ cảnh nhất định làm cho API rõ ràng và dễ sử dụng, gần gũi với ngôn ngữ tự nhiên.

Kotlin có cung cấp khả năng tạo DSL, đây là một khả năng rất hay của Kotlin, nó giúp tạo cú pháp DSL rõ ràng, tránh sử dụng nhiều ký hiệu. DSL phát huy hiệu quả khi dùng để config cấu hình, giao diện. Tạo DSL trong Kotlin sử dụng một số chức năng của Kotlin như Higher order function, Lambda with receivers, Extension functions. Các chức năng trên được tổng hợp tại đâyđây và cách tạo DSL ở đây.

Kết luận

Trên đây là một vài đặc điểm cơ bản của Kotlin, dù không thiếu các ngôn ngữ biên dịch sang bytecode và chạy trên JVM, nhưng có một vài yếu tố làm Kotlin trở nên đặc biệt. Như đã nói ban đầu, Kotlin như là một ứng cử viên để thay thế cho Java, với khả năng tương tác rất tốt giữa Java và Kotlin. Hẳn các ông lớn đang lo lắng vì hệ thống phát triển dựa trên Java quá nhiều, hệ sinh thái Java là quá lớn để có thể thay thế. Tuy nhiên trong thực tế code Java và Kotlin có thể tồn tại song song trong cùng dự án, khi dự án kết hợp Kotlin và java được biên dịch, ta sẽ không thể biết phần nào của dự án được viết bằng Java, phần nào được viết bằng Kotlin.

  • Một trong những ưu điểm của Kotlin là tính gọn nhẹ và dễ học, nếu bạn là một lập trình viên Java, các kỹ năng trong việc code Java có thể vẫn được áp dụng trong dự án Kotlin, do đó không cần mất quá nhiều thời gian với ngôn ngữ này.
  • IDE hỗ trợ tốt, không hiển nhiên mà JetBrains đứng ra để phát triển một ngôn ngữ mới. Đối với lập trình viên Android thì hiển nhiên Android Studio sẽ hỗ trợ Kotlin vì Kotlin được phát triển bởi JetBrains và IntelliJ là nền tảng của Android Studio.
  • Code ngắn gọn hơn là một trong những ưu điểm của Kotlin so với Java, code ngắn hơn sẽ giúp trong sáng hơn và ít lỗi hơn.

Ngoài những ưu điểm trên, Kotlin cũng có những nhược điểm như:

  • Thêm thời gian chạy runtime, điều này làm cho kích thước tệp tin tăng lên.
  • Với một người mới bắt đầu học lập trình thì code của Kotlin không hẳn là dễ đọc.
  • Cộng đồng nhỏ, vì Kotlin là một ngôn ngữ mới ra đời, nên cộng đồng hỗ trợ còn khá nhỏ.

Mặc dù Kotlin có một số tính năng hoàn toàn mới chẳng hạn như một type system được thiết kế để ngăn chặn các bug như null pointer exception, nhưng quan trọng là nó có thể làm việc với Java, tận dụng những thứ sẵn có từ Java để có thể phát triển. Việc phát triển Kotlin là một trong những chiến lược kinh doanh của JetBrains, Kotlin được phát triển phần nào mang đến sức mạnh cho IntelliJ IDE, điều này thu hút các lập trình viên Java dễ dàng tiếp cận và học thêm ngôn ngữ mới một cách dễ dàng.

Bài viết khá dài, hy vọng qua bài viết có thể giúp bạn có cái nhìn tổng quan hơn về Kotlin, hẹn gặp lại ở các bài viết tiếp theo…

Originally published at http://github.com.

--

--