Tại sao Go lại là ngôn ngữ mà bạn không thể bỏ qua?

Trong vài năm qua, đã có sự xuất hiện và nổi dậy kinh hoàng của một ngôn ngữ lập trình mới, đó chính là Go - ngôn ngữ được tạo ra bởi các nhà phát triển Google. Và quả thực sau một thời gian tìm hiểu nó, bạn sẽ hiểu được vì sao Go là một ngôn ngữ mới không thể bỏ qua.

Các nhà sản xuất phần cứng đang thêm ngày càng nhiều các lõi vào bộ xử lý để làm tăng hiệu năng cho các thiết bị công nghệ. Tất cả các trung tâm dữ liệu đang chạy trên các bộ xử lý đó và số lượng các lõi (cores) được thiết lập trong các thiết bị dự kiến vẫn tiếp tục gia tăng trong tương lai. Hơn nữa, nhiều ứng dụng hiện tại sử dụng kiếu kiến trúc phần mềm Micro-services để có thể duy trì kết nối cơ sở dữ liệu hay duy trì bộ nhớ case. Các module trong phần mềm này được chia thành các service rất nhỏ, mỗi service sẽ được đặt trên một server riêng giúp cho việc nâng cấp hay định dạng lại ứng dụng trở nên dễ dàng hơn.

Điều đó đồng nghĩa với việc các phần mềm được phát triển cũng như các ngôn ngữ lập trình nên hỗ trợ tính đồng thời một cách dễ dàng cũng như có thể tương thích được với các thiết bị với số lượng cores ngày một tăng lên.

Vì sao Go sẽ trở thành ngôn ngữ của lập trình trong tương lai?

Những hầu hết các ngôn ngữ lập trình hiện đại và phổ biến như Java, Python hiện tại chỉ xuất phát từ môi trường luồng đơn của những năm 90s. Điều đó cũng đồng nghĩa với việc tạo một ứng dụng đa luồng với các ngôn ngữ này trở nên khó khăn.

Điển hình như việc tạo luồng mới trong Java không hề hiệu quả về bộ nhớ. Vì mỗi luồng sẽ ngốn hết khoảng 1 MB dung lượng của bộ nhớ heap và cuối cùng nếu bạn sử dụng đến hàng ngàn luồng (threads) nó cũng đồng nghĩa với áp lực lớn lên bộ nhớ head và khiến thiết bị sập nguồn vì không đủ bộ nhớ. Việc kết nối giữa 2 hay nhiều luồng cũng rất khó khăn.

Go và Goroutines

Mặt khác, Go được chính thức phát hành vào năm 2009 khi mà các bộ xử lý đa lõi đã xuất hiện, vậy nên Go cũng được xây dựng với tính năng hỗ trợ việc đa nhiệm. Và Goroutines đã xuất hiện để thay thế cho các luồng, với mỗi Goroutines chỉ tiêu tốn gần 2KB từ bộ nhớ heap. Hiển nhiên với Goroutines, bạn có thể sử dụng hàng triệu luồng cùng 1 lúc mà không có bất cứ vấn đề gì với bộ nhớ.

Tính năng của Goroutines:

  • Goroutines có các … (Goroutines have growable segmented stacks). Điều đó đồng nghĩa với việc chúng sẽ chỉ sử dụng nhiều bộ nhớ hơn khi cần thiết.
  • Goroutines có thời gian khởi động nhanh hơn so với các threads.
  • Goroutines có thể kết nối một cách an toàn giữa chúng nhờ vào các build-in primitives
  • Goroutines cho phép người sử dụng tránh phải resort to mutex locking khi chia sẻ cấu trúc dữ liệu.
  • Ngoài ra một Goroutines có thể chạy trên nhiều luồng.

Với tất cả các đặc tính trên, Go trở thành một ngôn ngữ rất mạnh trong việc xử lý đồng thời các dòng code giống như Java, C hay C++ trong khi vẫn giữ được tính đa nhiệm và có được những dòng code đẹp như Erlang.

Go có thể chạy trực tiếp trên các hệ điều hành khác biệt

Lợi thế của việc sử dụng C, C++ so với các ngôn ngữ khác như Java/Python chính là hiệu suất của chúng. C/C++ không được code trên máy ảo và loại bỏ được bước chuyển đổi thành nhị phân, giúp tăng hiệu suất cho việc code. Nhưng việc giải phóng và phân bổ các biến trong các ngôn ngữ đó lại vô cùng phiền hà. Hầu hết các ngôn ngữ lập trình xử lý phân bổ và loại bỏ các đối tượng bằng thuật toán Garbage Collector hay Reference Counting.

Go có thể coi chính là sự kết hợp giữa 2 ưu điểm trên. Cũng giống như C++, Go là ngôn ngữ được biên dịch trực tiếp, xuất ra mã máy nên nó có thể chạy ngay trên các hệ điều hành mà không cần phải cài đặt gì thêm. Mặt khác, Go cũng sử dụng Garbage Collection để phân bổ hay loại bỏ các đối tượng. Vậy nên không còn nữa các câu lệnh malloc() và free() trong Go nữa.

Code trong Go dễ bảo trì

Go có cú pháp code rất gọn gàng và “sạch đẹp”. Điều này là dễ hiểu khi nó được phát triển bởi các lập trình viên của Google và Google có code-base rất lớn và hàng ngàn các nhà lập trình lại cùng làm việc trên cùng một cơ sở mã đó, vậy nên Go phải đảm bảo được việc dòng code của người này không làm ảnh hưởng đến một/nhiều người khác.

Cũng bởi vậy, Go đã bỏ đi các tính năng của các ngôn ngữ OOP hiện đại. Không còn các classes mà Go chỉ được chia thành các gói, và Go cũng chỉ có các structs thay vì các classes.

Không hỗ trợ thừa kế, điều này giúp cho các đoạn code trong Go dễ dàng để chỉnh sửa. Nếu như trong Java/Python, nếu class A kế thừa class B và bạn thực hiện 1 số thay đổi trong B, điều đó có thể tạo ra một số thay đổi phụ trong các class kế thừa B như A. Bằng cách loại bỏ tính kế thừa, Go cũng giúp các coder dễ hiểu các đoạn mã hơn.

Go cũng được biết đến với tính 4 KHÔNG: No constructors - No annotations - No generics - No exceptions.

Những thay đổi trên làm cho Go trở nên khác biệt với các ngôn ngữ lập trình khác. Nó giúp cho các dòng code của bạn trở nên “sạch” hơn và rõ ràng hơn nhiều.

Biểu đồ trên cho thấy Go gần như hiệu quả như C/C++, trong khi cú pháp mã vẫn đơn giản như Ruby, Python hay một số ngôn ngữ khác. Ngoài ra cú pháp của Go cũng rất ổn định, nó vẫn được giữ nguyên kể từ lần phát hành công khai đầu tiên với phiên bản 1.0 vào năm 2012.

Lý do cuối cùng: Go được “chống lưng” bởi Google

Đây tất nhiên không phải là một lợi thế về kỹ thuật hay lập trình đối với các coder. Tuy nhiên, Go được thiết kế ra và hỗ trợ bởi Google. Người khổng lồ Google sở hữu một trong những cơ sở hạ tầng điện toán đám mây lớn nhất trên thế giới và nó vẫn đang được mở rộng với quy mô lớn. Google tạo ra Go để có thể giải quyết một phần bài toán về tính mở rộng phạm vi cũng như hiệu quả, và đó cũng trở thành những điều mà bạn nhận được với ngôn ngữ này.

Vậy nên cũng dễ hiểu khi Go được sử dụng bởi các công ty lớn như Adobe, BBC, IBM hay Intel.

1 Likes