Trong phần đầu tiên của loạt bài này, tôi đã nói về lịch sử của Golang, mục đích và lợi ích chính của nó. Hôm nay, tôi sẽ đi sâu hơn vào kiến ​​trúc của Golang, tìm hiểu tại sao nó tốt hơn các ngôn ngữ lập trình khác và khiến cho nó thành xu thế Golang

xu thế Golang

 

Chúng ta hãy nói về kiến ​​trúc trong xu thế Golang

Nếu cho rằng xu thế Golang là của tương lai, tôi cảm thấy cần phải chứng minh rằng Go có những lợi thế kiến ​​trúc không thể phủ nhận so với những ngôn ngữ tiền nhiệm.

Lần trước tôi đã nói về chuyển đổi ngữ cảnh, và tôi cần quay lại điểm này để tập trung hơn một chút vào nó. Có ba lý do chính để chuyển đổi ngữ cảnh:

  • Kernel cần lưu nội dung của processor register cho process hiện tại. Sau này, kernel phải khôi phục các giá trị cho một process khác. Do việc chuyển đổi có thể xảy ra bất cứ lúc nào trong quá trình thực thi process, nên hệ điều hành phải lưu trữ nội dung của tất cả các register này, vì nó không biết register nào sẽ được sử dụng vào lần tới.
  • Kernel của hệ điều hành phải xóa địa chỉ ảo của bộ xử lý.
  • Tiêu thụ tài nguyên máy tính bằng cách chuyển ngữ cảnh. Giới hạn tiêu thụ được cố định bởi phần cứng và phụ thuộc vào khối lượng công việc mà bộ xử lý thực hiện.

Ba lý do này đã khiến các kỹ sư phát triển các thread sử dụng cùng một không gian bộ nhớ trái ngược với các process. Vì các thread trao đổi address space, chúng dễ dàng tạo, chuyển đổi và sắp xếp hơn các process. Tuy nhiên, các thread vẫn tiêu tốn rất nhiều tài nguyên máy tính khi chuyển ngữ cảnh. Đây là cách các nhà phát triển Golang nghĩ ra Goroutines.

xu thế Golang

Chúng ta hãy nói về Goroutines

Các tác vụ được thực hiện đồng thời trong Golang được gọi là chương trình con, hay còn gọi là Goroutines. Ngoài ra, có một biến hệ thống $GOMAXPROCS, bằng với số lõi của bộ xử lý theo mặc định. Mục đích của nó là xác định có bao nhiêu quá trình sẽ được bắt đầu bởi Go scheduler. Nếu một Goroutine chiếm toàn bộ thời gian của process, thì $GOMAXPROCS = 1. Các Goroutine khác sẽ đợi cho đến khi process đơn này kết thúc.

xu thế Golang

Ví dụ, một chu kỳ “for” là infinite, vì nó không bị gián đoạn bởi các hoạt động input / output hoặc các trường hợp chờ đợi tài nguyên có sẵn. Khi bạn thay đổi chu kỳ thành `time.Wait` trong call process, process này được giải phóng và có thể thực thi một Goroutine khác.

Chúng ta hãy nói về Goroutines và Streams trong xu thế Golang

Goroutines cực kỳ nhẹ so với các stream. Chúng chỉ chiếm một vài kilobyte trong stack. Stack có thể phát triển và thu hẹp tùy thuộc vào nhu cầu của ứng dụng. Khi chúng ta sử dụng các thread, kích thước của stack phải được đặt càng lớn càng tốt. Kích thước này không thay đổi trong quá trình thực thi ứng dụng vì nó là hằng số. Chúng ta phải dự trữ một lượng lớn bộ nhớ cho stack của mỗi thread vì trong quá trình thực thi chương trình, rất khó để phát hiện ra cần bao nhiêu dung lượng. Số lượng thread đang chạy càng nhiều – bộ nhớ càng ít.

Chương trình có thể chỉ có một stream, bao gồm hàng ngàn Goroutines. Bộ xử lý có thể chuyển đổi giữa các Goroutines rất dễ dàng, vì chúng hoạt động trong một thread của hệ điều hành duy nhất. Nếu một trong những Goroutines trên stream này đang chờ input của người dùng, hệ điều hành sẽ tạo một stream mới và tất cả các Goroutines từ stream cũ sẽ chuyển sang stream mới. Do đó, hệ điều hành có thể tạo ra một số lượng nhỏ các thread, ảnh hưởng đến hiệu quả và tốc độ của chương trình.

xu thế Golang

Chúng ta hãy nói đến Golang với các ngôn ngữ khác

Ưu điểm lớn nhất của các ngôn ngữ như C và C ++ so với Java, Python, C# là tốc độ và hiệu suất của chúng. Ngôn ngữ C và C++ có thể compilable và không interpretable được.

Go cung cấp các cấu trúc như hash table (dictionary), loại output, variable-length arrays, giao diện và method cho bất kỳ custom type nào. Trong kiến ​​trúc của nó, chúng ta có thể thấy tất cả các cấu trúc cú pháp và ngữ nghĩa, như trong các ngôn ngữ lập trình giống như C. Nó được biên dịch dễ dàng và nhanh chóng.

Mặt khác, Java sử dụng máy ảo Java (JVM) khi xây dựng các ứng dụng. Dự án(code có thể hiểu được với con người) được chuyển đổi thành bytecode, có thể được sử dụng bởi JVM hoặc một máy ảo khác. Trong thời gian chạy, JVM diễn giải các bytecode này và chuyển đổi chúng thành các tệp nhị phân mà bộ xử lý có thể làm việc cùng. Đây là lý do tại sao các ngôn ngữ sử dụng JVM có độ trễ dài trong thời gian khởi chạy ứng dụng. Điều này ảnh hưởng đến khả năng mở rộng ứng dụng trên máy chủ và thường dẫn đến tình trạng quá tải. Các ứng dụng trên Go có thể được biên dịch nhanh chóng vì chúng không yêu cầu JVM, do đó chạy ngay sau khi khởi động.

C và C++ không được thực thi trên các máy ảo. Do đó, khi chúng được biên dịch thành một dự án sẵn sàng, chúng ta loại trừ một bước nữa, giúp cải thiện đáng kể hiệu suất của các ngôn ngữ này. Trình biên dịch C và C++ trực tiếp chuyển đổi code thành các tệp nhị phân. Tuy nhiên, các ngôn ngữ này yêu cầu các lập trình viên phải liên tục ghi nhớ về việc xóa các biến và giải phóng bộ nhớ, trong khi Java, Python, C# có chức năng garbage collector đảm nhiệm việc này. Go cũng sử dụng trình garbage collector để giải phóng bộ nhớ. Do đó, nó mang các ứng dụng tốt nhất của các ngôn ngữ tiền nhiệm trong kiến ​​trúc của nó.

xu thế Golang

Xu thế Golang chắc chắn đang trở nên phổ biến những ngày này. Vì vậy, chúng ta có thể để nói về các vấn đề của nó. Ngoài các vấn đề phổ biến của tất cả các ngôn ngữ có thể biên dịch, Go có các vấn đề riêng với optimizer, heap, stack, type system, và multitasking model. Có những cách cụ thể, đôi khi rất rõ ràng để giải quyết và phá vỡ chúng. Nếu bạn quan tâm đến các vấn đề của Golang, bạn có thể tìm kiếm thông tin cần thiết thông qua các thư viện Go như http://go-lang.cat-v.org/pure-go-libs và https://golang.org/pkg / .

Go có cú pháp gọn gàng và sạch sẽ, dễ hiểu ngay cả đối với các lập trình viên ngôn ngữ khác. Do đó, code của nó dễ dàng được duy trì và sửa đổi bởi các kỹ sư với các kỹ năng hoàn toàn khác nhau. Bạn sẽ không tìm thấy các class ở Golang, vì mỗi mục được chia thành các package. Tuy nhiên, có các cấu trúc trong ngôn ngữ này, cho phép viết các custom constructor cho các nhu cầu đặc biệt của bạn.

Go gần như hiệu quả như C / C++, giữ cho code syntax đơn giản như Ruby, Python và các ngôn ngữ khác. Không giống như Swift,  của Golang rất ổn định. Nó vẫn giữ nguyên kể từ khi phát hành công khai lần đầu tiên vào năm 2012.

Nhiều công ty cấp doanh nghiệp, như Intel, IBM, Adobe, sử dụng ngôn ngữ này để phát triển phần mềm. QArea cũng nằm trong số đó. Một danh sách chi tiết hơn về các công ty sử dụng Golang có thể được tìm thấy tại https://github.com/golang/go/wiki/GoUsers .

Tổng hợp lại

Xu thế Golang khiến cho nó “đặc biệt” với các ngôn ngữ khác. Nó còn trẻ nhưng mạnh mẽ đến mức có thể mang đến sự tham gia của các chuyên viên máy tính ngay từ đầu. Goroutines đã tạo sự cạnh tranh về lập trình trên tất cả các cấp độ khác như web backend. Các ứng dụng được viết trên Go có hiệu suất cao. Golang rất hiệu quả như C / C++, xử lý các hoạt động song song như Java và có khả năng đọc code dễ dàng như Python, Perl và Erlang.

Go được thiết kế để tạo ra các hệ thống tải cao sử dụng kiến ​​trúc của các hệ thống đa bộ xử lý ở mức 100%. Đây là lý do tại sao nhiều công ty chuyển qua Golang từ các ngôn ngữ khác và thiết kế phần mềm hiệu quả.

Xu thế Golang chính là xu thế của tương lai.