Bài viết này có thể đã dựa quá nhiều vào những nguồn thông tin có mối liên hệ mật thiết với chủ thể, dẫn đến khả năng nội dung trong bài khó kiểm chứng được và thiếu trung lập. (February 2018) |
Thiết kế bởi | JetBrains |
---|---|
Nhà phát triển | JetBrains và cộng đồng mã nguồn mở |
Xuất hiện lần đầu | 2011 |
Phiên bản ổn định | 1.3.11
/ 6 tháng 12 năm 2018[1] |
Kiểm tra kiểu | tĩnh, suy luận |
Nền tảng | Xuất ra máy ảo Java bytecode và mã nguồn Java |
Hệ điều hành | Bất cứ trình thông dịch JVM hay Java |
Giấy phép | Apache 2 |
Phần mở rộng tên tập tin | .kt, .kts |
Trang mạng | kotlinlang |
Ảnh hưởng từ | |
C#, Gosu, Groovy, Java, ML, Python, Scala |
Kotlin là một ngôn ngữ lập trình kiểu tĩnh chạy trên máy ảo Java (JVM) và có thể được biên dịch sang mã nguồn Java hay sử dụng cơ sở hạ tầng trình biên dịch LLVM. Nó được tài trợ và phát triển bởi JetBrains. Mặc dù cú pháp không tương thích với Java, nhưng bản thực hiện JVM của thư viện chuẩn Kotlin được thiết kế để tương tác với mã Java và dựa vào mã Java từ Java Class Library có sẵn, ví dụ như collections framework.[2] Kotlin sử dụng suy luận kiểu một cách tích cực để xác định kiểu của giá trị và biểu thức vốn không được nêu rõ. Điều này giúp giảm tính dài dòng của ngôn ngữ so với Java, vốn thường đòi hỏi toàn bộ đặc kiểu một cách dư thừa mãi đến phiên bản 10. Mã Kotlin có thể chạy trên JVM đến phiên bản Java 11 mới nhất.
Kể từ Android Studio 3.0 (phát hành vào tháng 10 năm 2017), Kotlin được Google hỗ trợ đầy đủ để sử dụng cho việc lập trình ứng dụng cho hệ điều hành Android của họ,[3] và được nhúng trực tiếp vào trong gói cài đặt của IDE đó để thay thế cho trình biên dịch Java tiêu chuẩn. Trình biên dịch Android Kotlin cho phép người dùng chọn lựa giữa hướng đến mã bytecode tương thích với Java 6, hay Java 8.[4]
Vào tháng 7 năm 2011, JetBrains đã giới thiệu Project Kotlin, là một ngôn ngữ mới cho JVM đã được phát triển trong một năm.[5] Lãnh đạo JetBrains Dmitry Jemerov nói rằng hầu hết các ngôn ngữ không có những tính năng mà họ tìm kiếm, ngoại trừ Scala. Tuy nhiên, ông chỉ ra rằng thời gian biên dịch quá chậm của Scala là một nhược điểm rõ ràng.[5] Một trong những mục tiêu được nhắc đến của Kotlin là biên dịch nhanh như Java. Vào tháng 2 năm 2012, JetBrains mở nguồn dự án theo giấy phép Apache 2.[6]
Tên của nó đến từ đảo Kotlin, gần St. Petersburg. Andrey Breslav đề cập rằng nhóm quyết định chọn tên hòn đảo đó giống như Java được đặt theo tên đảo Java của Indonesia[7] (mặc dù ngôn ngữ lập trình Java có lẽ được đặt theo tên một loại cà phê[8]).
JetBrains hy vọng rằng ngôn ngữ mới sẽ thúc đẩy doanh số IntelliJ IDEA.[9]
Kotlin v1.0 được phát hành vào ngày 15 tháng 2 năm 2016.[10] Đây được coi là phiên bản chính thức ổn định đầu tiên và JetBrains đã cam kết tương thích ngược dài hạn kể từ phiên bản này.
Tại hội nghị Google I/O 2017, Google công bố hỗ trợ hạng nhất (first-class support) cho Kotlin trên Android.[3]
Kotlin v1.2 được phát hành vào ngày 28 tháng 11 năm 2017.[11] Tính năng chia sẻ mã nguồn giữa nền tảng JVM và Javascript mới được thêm vào bản phát hành này.
Kotlin v1.3 được phát hành vào ngày 29 tháng 10 năm 2018, với các coroutine API cho lập trình bất đồng bộ.
Trưởng nhóm phát triển Andrey Breslav nói rằng Kotlin được thiết kế để trở thành một ngôn ngữ hướng đối tượng công nghiệp mạnh mẽ, và là một "ngôn ngữ tốt hơn" Java, nhưng vẫn có thể tương thích hoàn toàn với mã Java, cho phép các công ty thực hiện chuyển đổi dần từ Java sang Kotlin.[12]
Dấu chấm phẩy là tùy chọn để kết thúc câu lệnh; trong hầu hết trường hợp thì một newline là đủ cho trình biên dịch hiểu rằng câu lệnh đã kết thúc.[13]
Cách khai báo biến Kotlin và danh sách tham số có kiểu dữ liệu theo sau tên biến (với một dấu hai chấm phân cách), tương tự như Pascal.
Biến trong Kotlin có thể bất biến (immutable), bằng cách khai báo với từ khóa val, hoặc biến đổi (mutable), bằng cách khai báo với từ khóa var.[14]
Các thành viên của lớp mặc định được công khai (public), và chính các lớp đó theo mặc định là "final", nghĩa là việc tạo một lớp dẫn xuất bị vô hiệu hóa trừ khi lớp cơ sở được khai báo với từ khóa open.
Ngoài lớp và phương thức (được gọi là hàm thành viên trong Kotlin) của lập trình hướng đối tượng, Kotlin cũng hỗ trợ lập trình thủ tục với việc sử dụng hàm.[15]
Kotlin nới lỏng các giới hạn của Java vốn chỉ cho phép phương thức và biến tĩnh (static) chỉ tồn tại trong thân hàm. Đối tượng và hàm tĩnh có thể được định nghĩa ở mức cao nhất (top level) của gói (package) mà không cần một mức của lớp dư thừa. Để tương thích với Java, Kotlin cung cấp chú thích JvmName
để đặc tả một tên lớp được sử dụng khi gói được xem từ một dự án Java. Ví dụ như @file:JvmName("JavaClassName")
.
Cũng như trong C và C++, điểm vào chính (entry point) của một chương trình Kotlin là một hàm tên "main", được truyền vào một mảng chứa bất cứ đối số dòng lệnh nào. Nội suy chuỗi kiểu Perl và Unix shell cũng được hỗ trợ, cũng như suy luận kiểu.
// Hello, World! example
fun main(args: Array<String>) {
val scope = "World"
println("Hello, $scope!")
}
Tương tự như C#, Kotlin cho phép người dùng thêm các phương thức vào bất cứ lớp nào mà không cần phải tạo một lớp dẫn xuất từ lớp đó với các phương thức mới. Thay vào đó, Kotlin bổ sung khái niệm phương thức mở rộng (extension method) để cho phép bất cứ hàm nào có thể được "gắn" vào danh sách phương thức công khai (public) của bất cứ lớp nào mà không cần phải được chính thức khai báo bên trong lớp đó. Nói cách khác, phương thức mở rộng là một phương thức trợ giúp có quyền truy xuất tới các cả các giao diện công khai của lớp đó vốn có thể dùng để tạo nên giao diện công khai (public interface) mới cho lớp, và phương thức đó sẽ xuất hiện chính xác như một phương thức của lớp, xuất hiện như một phần của thanh tra hoàn tất mã (code completion inspection) của phương thức lớp. Ví dụ như:
package MyStringExtensions
fun String.lastChar(): Char = get(length - 1)
>>> println("Kotlin".lastChar())
Bằng cách đặt mã trên ở mức cao nhất của gói, lớp String (chuỗi) được mở rộng để thêm vào phương thức lastChar vốn không được bao gồm trong định nghĩa ban đầu của lớp String.
// Overloading '+' operator using an extension method
operator fun Point.plus(other: Point): Point {
return Point(x + other.x, y + other.y)
}
>>> val p1 = Point(10, 20)
>>> val p2 = Point(30, 40)
>>> println(p1 + p2)
Point(x=40, y=60)
Kotlin cho phép các hàm cục bộ (local function) có thể được định nghĩa bên trong các hàm hoặc phương thức khác, gọi là hàm lồng nhau (nested function).
class User(val id: Int, val name: String, val address: String)
fun saveUserToDb(user: User) {
fun validate(user: User, value: String, fieldName: String) {
if (value.isEmpty()) {
throw IllegalArgumentException("Can't save user ${user.id}: empty $fieldName")
}
}
validate(user, user.name, "Name")
validate(user, user.address, "Address")
// Save user to the database
...
}
Anko là một thư viện được tạo riêng cho Kotlin để giúp xây dựng các ứng dụng giao diện người dùng cho Android.[16]
fun Activity.showAreYouSureAlert(process: () -> Unit) {
alert(
title = "Are you sure?",
message = "Are you really sure?")
{
positiveButton("Yes") { process() }
negativeButton("No") { cancel() }
}
}
$ kotlinc-jvm
type:help for help; :quit for quit
>>> 2+2
4
>>> println("Hello, World!")
Hello, World!
>>>
Today, at the Google I/O keynote, the Android team announced first-class support for Kotlin.
Kotlin lets you choose between generating Java 6 and Java 8 compatible bytecode. More optimal byte code may be generated for higher versions of the platform.
we expect Kotlin to drive the sales of IntelliJ IDEA