Rust VS Go, nhà phát triển nên chọn ngôn ngữ nào vào năm 2023?

Nguồn: InfoQ

Vào năm 2023, chúng ta có hàng nghìn lý do để học Rust.

Vào ngày 7 tháng 8, Rust Foundation đã công bố kết quả của Báo cáo khảo sát Rust năm 2022. Báo cáo cho thấy tỷ lệ chấp nhận Rust tiếp tục tăng. Hơn 90% số người tham gia khảo sát cho biết họ là người dùng Rust; Rust được sử dụng cho phần lớn công việc viết mã trong năm 2016, tăng đáng kể 51,8% so với năm trước.

Không còn nghi ngờ gì nữa, Rust đang ngày càng trở thành tâm điểm của các nhà phát triển với hiệu suất đồng thời và an toàn bộ nhớ tuyệt vời. Tuy nhiên, cũng khó có thể bỏ qua Go, một tay chơi tương đối "gạo cội" từng được bình chọn là ngôn ngữ lập trình của năm.

Ra đời năm 2009, ngôn ngữ Go đã thu hút sự chú ý lớn kể từ mô hình đồng thời độc đáo và lợi thế hiệu suất mạnh mẽ. Điều đáng chú ý là, giống như ngôn ngữ Rust, người tạo ra ngôn ngữ Go cũng "ghét cay ghét đắng" C++, và Go cũng là ngôn ngữ thống trị của cloud native.

Trong cuộc khảo sát nhà phát triển Stack Overflow 2022, trong số 70.000 câu trả lời cho câu hỏi "ngôn ngữ lập trình khiến người ta yêu và ghét", các lập trình viên rõ ràng thích Rust hơn, 86% trong số họ cho biết họ thích Rust và 64% cho biết họ thích Go. Trước tình trạng hot của Rust, một số nhà phát triển đã tự hỏi linh hồn mình: Liệu Go có còn đáng để học vào năm 2023?

Rust VS Go, nhà phát triển nên chọn ngôn ngữ nào vào năm 2023?

Rust VS Go, nhà phát triển nên chọn ngôn ngữ nào vào năm 2023?

Ngoài ra, trong hai ngày vừa qua, việc chọn Rust hay Go cũng trở thành chủ đề nóng trên Hacker News:

Rust VS Go, nhà phát triển nên chọn ngôn ngữ nào vào năm 2023?

Một cư dân mạng ủng hộ Rust cho biết: "Tôi cũng đã băn khoăn với lựa chọn này trong một thời gian dài. Cuối cùng thì Rust đã thắng. Đầu tiên, tôi cảm thấy Rust gần với những thứ của thời Pascal trước hơn và bạn có thể kiểm soát mọi thứ ; thứ hai, nếu wasm và các công nghệ liên quan bùng phát mạnh, Rust sẽ là lựa chọn an toàn hơn; khi đó, chúng ta đã có Python để phát triển nhanh chóng, vì vậy sẽ hợp lý khi chọn thứ gì đó cực đoan hơn một chút và Go phần nào ở mức trung bình. Cuối cùng, Rust nên được sử dụng cho Core và cấu hình cao, vì vậy nó khó có thể bị loại bỏ."

Một nhà phát triển khác không đồng ý cho biết: "Tôi đã phát triển Go được gần mười năm, nhưng gần đây tôi cũng đã thử dùng Rust. Tôi nghĩ rằng hiện tại có một số ưu tiên bắt buộc và gây hiểu lầm cho Rust, từ kinh nghiệm của tôi trong Từ kinh nghiệm ở nhiều công ty khởi nghiệp khác nhau, bao gồm cả tôi hiện tại, Go cho đến nay là lựa chọn tốt nhất để phát triển phụ trợ! Lưu ý, hiệu suất, chức năng hay cách khác...hai ngôn ngữ này rất, rất giống nhau!"

Tôi phải nói rằng cả Go và Rust chắc chắn là những ngôn ngữ lập trình xuất sắc. Chúng hiện đại, mạnh mẽ, linh hoạt và mang lại hiệu suất tuyệt vời. Nhưng thực sự không có ý nghĩa gì khi so sánh trực tiếp Go và Rust, ai tốt hơn, bởi vì mỗi ngôn ngữ lập trình đại diện cho một loạt các đánh đổi sâu sắc đằng sau nó. Các ngôn ngữ khác nhau sẽ được tối ưu hóa cho các nhu cầu khác nhau, vì vậy khi chọn một ngôn ngữ, chúng ta cũng nên cân nhắc xem mình muốn sử dụng ngôn ngữ đó để giải quyết vấn đề gì. Vì vậy, chúng tôi sẽ bắt đầu từ các kịch bản áp dụng của ngôn ngữ Go và Rust, đồng thời thảo luận về "cách thức" thiết kế của Go và Rust.

Mặc dù Rust và Go khác nhau rất nhiều về cú pháp và phong cách, nhưng cả hai đều là những công cụ hạng nhất để xây dựng phần mềm. Hãy bắt đầu phân tích cụ thể dưới đây.

Đi so với Rust: Điểm tương đồng

Rust và Go có rất nhiều điểm chung, đó là lý do tại sao mọi người thường so sánh cả hai. Họ có những mục tiêu chung nào?

Rust là ngôn ngữ lập trình đa mô hình được nhập tĩnh ở mức độ thấp, tập trung nhiều hơn vào tính an toàn và hiệu suất.

—Gints Dreimanis

Và:

Go là ngôn ngữ lập trình nguồn mở giúp dễ dàng xây dựng phần mềm đơn giản, đáng tin cậy và hiệu quả.

—golang.org

An toàn bộ nhớ

Cả Go và Rust đều nằm trong số ngôn ngữ lập trình hiện đại chú trọng đến sự an toàn của bộ nhớ. Qua nhiều thập kỷ phát triển của các ngôn ngữ cũ hơn như C và C++, rõ ràng một trong những nguyên nhân cốt lõi gây ra lỗi và lỗi là do truy cập bộ nhớ không an toàn/không chính xác.

Vì vậy, Rust và Go mỗi người đưa ra các giải pháp khác nhau, nhưng mục tiêu của cả hai là thông minh hơn và an toàn hơn về mặt quản lý bộ nhớ, đồng thời giúp các nhà phát triển viết các chương trình chính xác với hiệu suất tuyệt vời.

Thực thi nhanh, gọn

Cả hai đều là ngôn ngữ được biên dịch, có nghĩa là chương trình có thể được dịch trực tiếp sang mã máy thực thi, do đó chương trình có thể được triển khai dưới dạng một tệp nhị phân duy nhất. Không giống như các ngôn ngữ được thông dịch như Python và Ruby, chúng tôi không cần gửi trình thông dịch và nhiều thư viện/phụ thuộc với chương trình. Là sự phản ánh trực tiếp sức mạnh cốt lõi này, các chương trình Rust and Go có xu hướng chạy nhanh hơn các ngôn ngữ thông dịch.

Ngôn ngữ mục đích chung

Cả Rust và Go đều là những ngôn ngữ lập trình đa năng mạnh mẽ và có thể mở rộng mà bạn có thể sử dụng để phát triển tất cả các loại phần mềm hiện đại—từ ứng dụng web đến vi dịch vụ phân tán, bộ vi điều khiển nhúng, ứng dụng di động, v.v. **Cả hai đều có thư viện tiêu chuẩn xuất sắc và hệ sinh thái bên thứ ba phát triển mạnh, cộng với hỗ trợ thương mại mạnh mẽ và cơ sở người dùng lớn. ** Cả hai đã tồn tại trong nhiều năm và sẽ tiếp tục phát triển mạnh trong những năm tới. Học Go hoặc Rust sẽ là một sự đầu tư thời gian và năng lượng rất hợp lý trong những ngày này.

Phong cách lập trình thực dụng

Không phải là ngôn ngữ quá chức năng (chẳng hạn như Scala hoặc Elixir), cũng không phải là ngôn ngữ hướng đối tượng hoàn toàn (chẳng hạn như Java và C#). Ngược lại, mặc dù cả Go và Rust đều có chức năng của lập trình hướng đối tượng và hàm, nhưng chúng luôn nhấn mạnh định hướng thực dụng-tức là giải quyết vấn đề theo cách phù hợp nhất chứ không bắt mọi người phải sử dụng một phương pháp cụ thể thông qua "hệ tư tưởng".cách làm việc. **Nhưng nếu bạn thực sự thích phong cách lập trình chức năng, thì có nhiều tùy chọn công cụ liên quan hơn ở phía Rust, đây là một trong những lợi thế của Rust over Go. **

Chúng ta chắc chắn có thể tranh luận về những gì tạo nên một ngôn ngữ "hướng đối tượng" thực sự. Nhưng công bằng mà nói, phong cách lập trình hướng đối tượng mà người dùng C++, Java hoặc C# mong đợi không thực sự tồn tại trong Go hoặc Rust.

—Jack Mott

Phát triển lớn

Cả Rust và Go đều cung cấp nhiều tính năng hữu ích cho lập trình quy mô lớn, vì vậy chúng có thể thích ứng với nhu cầu trong thế giới thực của các nhóm phát triển lớn và cơ sở mã lớn. **Ví dụ, các lập trình viên C đã tranh luận trong nhiều năm về việc đặt dấu ngoặc đơn ở đâu, và mã nên được thụt lề bằng tab hay dấu cách; nhưng Rust và Go đã sử dụng các công cụ định dạng tiêu chuẩn (Go có gofmt, Rust là Rustfmt) giải quyết hoàn toàn những vấn đề này các vấn đề. Chúng tự động viết lại mã của bạn bằng một kiểu phù hợp.

Không phải định dạng cụ thể này là tinh tế, nhưng các lập trình viên **Rust and Go thực dụng hơn và muốn chọn một tiêu chuẩn triển khai thống nhất. **

phong cách của gofmt có thể không phải ai cũng thích, nhưng gofmt có thứ dành cho tất cả mọi người.

—Rob Pike

Một lợi thế lớn khác của hai ngôn ngữ này được phản ánh trong build pipeline. Cả hai đều có các công cụ quản lý phụ thuộc và xây dựng tiêu chuẩn tuyệt vời, tích hợp sẵn và hoạt động hiệu quả. Điều này có nghĩa là các lập trình viên không phải đối mặt với các hệ thống xây dựng phức tạp của bên thứ ba, họ cũng không cần phải học một hệ thống mới cứ sau vài năm.

Tôi đã sử dụng Java và Ruby từ rất sớm trong sự nghiệp của mình, vì vậy việc viết mã Go và Rust luôn khiến tôi hơi sợ hãi và nằm ngoài tầm kiểm soát. Nhưng khi tôi vào Google và thấy một dịch vụ được viết bằng Go, tôi thực sự cảm thấy nhẹ nhõm vì tôi thấy nó dễ dàng xây dựng và vận hành.

Điều tương tự cũng xảy ra với Rust. Mặc dù tôi chỉ thực hiện nghiên cứu về các dự án quy mô nhỏ, nhưng tôi có thể thấy sự dễ sử dụng của nó. Tôi ước những hệ thống xây dựng có thể định cấu hình vô hạn đó sẽ chỉ còn là quá khứ, giờ đây các ngôn ngữ mới đi kèm với các công cụ xây dựng chuyên dụng của riêng chúng hoạt động vượt trội, điều đó không tốt sao?

—Sam Rose

**Rỉ sét hay Đi? **

Sau khi nói về rất nhiều vấn đề và thực tế là cả hai ngôn ngữ đều được thiết kế rất tốt và mạnh mẽ, liệu cuộc thi này có đạt được kết quả gì không? Hoặc, vì cả hai đều là những lựa chọn tuyệt vời, tại sao mọi người vẫn phẫn nộ trên mạng xã hội, viết những bài bình luận dài trên blog nói rằng "Rust là dành cho những kẻ ngốc" hoặc "Go hoàn toàn không phải là ngôn ngữ lập trình".

Tất nhiên, một số người chỉ muốn trút bầu tâm sự, nhưng điều này rõ ràng không giúp giải quyết vấn đề thực tế. Ít nhất là khi nói đến việc sử dụng ngôn ngữ nào trong một dự án, hoặc sử dụng ngôn ngữ nào để thâm nhập vào thế giới lập trình, thì những tiếng nói to rõ ràng không giúp đưa ra lựa chọn đúng đắn.

Hãy quay trở lại cuộc thảo luận của người lớn và xem Rust và Go có điểm mạnh và điểm yếu như thế nào dưới sự phân tích hợp lý.

Đi so với Rust: Hiệu suất

Như đã đề cập trước đó, các chương trình do Go và Rust tạo ra đều nhanh vì chúng được biên dịch thành mã máy gốc mà không cần thông qua trình thông dịch hoặc máy ảo. Nhưng Hiệu suất của Rust vẫn tốt hơn, thậm chí có thể so sánh với C và C++, vốn được coi là tiêu chuẩn hiệu suất của ngành. Và không giống như những ngôn ngữ lỗi thời này, Rust cũng cung cấp các cơ chế an toàn bộ nhớ và an toàn đồng thời, trong khi hầu như không ảnh hưởng đến tốc độ thực thi. Rust cũng cho phép các nhà phát triển xây dựng các bản tóm tắt phức tạp mà không phải chịu một hình phạt hiệu suất nào trong thời gian chạy.

Ngược lại, Mặc dù hiệu suất của các chương trình Go cũng tốt, nhưng trọng tâm thiết kế chủ yếu là tốc độ phát triển (bao gồm cả biên dịch), thay vì mức độ thực thi. Các lập trình viên Go thích mã rõ ràng và dễ đọc, vì vậy tốc độ chạy chậm hơn một chút.

Trình biên dịch Go cũng không tốn nhiều thời gian để tạo mã máy hiệu quả nhất, nó quan tâm nhiều hơn đến việc biên dịch một lượng lớn mã một cách nhanh chóng. **Vì vậy, trong các điểm chuẩn thời gian chạy, chương trình Rust thường áp đảo chương trình Go. **

Hiệu suất thời gian chạy của Rust cũng rất nhất quán và có thể dự đoán được vì nó không sử dụng bộ sưu tập rác. Trình thu gom rác của Go rất hiệu quả và được tối ưu hóa để giữ thời gian tạm dừng càng ngắn càng tốt (thời gian tạm dừng sẽ ngắn hơn sau mỗi lần phát hành Go). Nhưng dù sao đi nữa, việc thu gom rác luôn gây ra một số điều không thể đoán trước trong cách ứng xử của chương trình và điều này có thể nghiêm trọng hoặc thậm chí hoàn toàn không thể chấp nhận được đối với một số ứng dụng nhất định (chẳng hạn như hệ thống nhúng).

Vì mục tiêu của Rust là cung cấp cho lập trình viên quyền kiểm soát hoàn toàn đối với phần cứng bên dưới, **Các chương trình Rust có thể được tối ưu hóa sâu để đạt hiệu suất lý thuyết tối đa của máy. **Điều này làm cho Rust trở thành lựa chọn tốt nhất cho một số trường hợp sử dụng nhất định trong đó tốc độ thực thi vượt trội hơn tất cả những thứ khác, chẳng hạn như lập trình trò chơi, nhân hệ điều hành, thành phần trình duyệt web và hệ thống điều khiển thời gian thực.

  • Sự đơn giản

Một ngôn ngữ lập trình mạnh đến đâu không quan trọng nếu nó quá khó học và khiến hầu hết mọi người không muốn học. Go dường như được thiết kế có chủ ý để phân biệt với các ngôn ngữ có độ phức tạp ngày càng tăng như C++: **Nó có rất ít cú pháp, rất ít từ khóa và thậm chí không có nhiều chức năng. **

Điều này có nghĩa là ngôn ngữ Go rất dễ học và bạn có thể viết nhiều chương trình khác nhau bằng nó sau khi hiểu một chút.

Cờ vây rất dễ học. Tôi đã nghe nhắc đến điều này rất nhiều trước đây, nhưng sau khi sử dụng, tôi vẫn ngạc nhiên về tốc độ cải thiện năng suất của nó. Nhờ có ngôn ngữ Go, tài liệu và công cụ liên quan, tôi đã viết mã thú vị và có thể chuyển giao chỉ trong hai ngày.

—Ấn tượng ban đầu của lập trình viên Rust về cờ vây

Điểm mấu chốt ở đây là ba từ "đơn giản". Tất nhiên, đơn giản không có nghĩa là dễ dàng. Nhưng một ngôn ngữ nhỏ và đơn giản chắc chắn sẽ dễ học hơn một ngôn ngữ lớn và phức tạp. Không có nhiều cách để đạt được một hiệu ứng, vì vậy mã Go chất lượng cao hầu như luôn trông giống nhau. Điều này có một lợi ích khác: chúng ta có thể nhanh chóng hiểu được một dịch vụ mà chúng ta không quen thuộc đang làm gì.

Rust VS Go, nhà phát triển nên chọn ngôn ngữ nào vào năm 2023?

**Bản thể luận cốt lõi của Go nhỏ, nhưng thư viện tiêu chuẩn rất mạnh. ** Tức là, ngoài cú pháp Go, đường cong học tập của chúng ta cũng phải tính đến phần này của thư viện chuẩn.

Mặt khác, chuyển chức năng từ ngôn ngữ sang thư viện chuẩn nghĩa là mọi người chỉ cần tập trung học những thư viện liên quan đến nhu cầu phát triển hiện tại. **Go cũng được thiết kế với sự cân nhắc đầy đủ về nhu cầu phát triển phần mềm quy mô lớn và có thể hỗ trợ mạnh mẽ các nhóm phát triển và cơ sở mã lớn. **Trong loại tình huống này, các nhà phát triển mới phải có khả năng bắt đầu nhanh chóng. Để đạt được mục tiêu này, cộng đồng Go luôn ưu tiên sự đơn giản, rõ ràng, linh hoạt và trực tiếp của các chương trình.

Sử dụng ngôn ngữ GO, các nhà phát triển cơ sở thường dễ dàng làm việc hiệu quả hơn, nhưng các nhà phát triển trung cấp khó đưa ra các khái niệm trừu tượng phức tạp hơn và do đó gây ra sự cố. Vì đặc điểm này, Rust có xu hướng kém hấp dẫn hơn Go trong thế giới phát triển phần mềm doanh nghiệp.

— Cu li Cro

  • Chức năng

Rust hỗ trợ độ phức tạp cao hơn một số ngôn ngữ lập trình khác nên phạm vi triển khai tương ứng cũng lớn hơn.

— Devathon

**Rust được thiết kế đặc biệt để bao gồm nhiều tính năng mạnh mẽ và hữu ích giúp lập trình viên làm được nhiều việc hơn với ít mã hơn. **Ví dụ: hàm match của Rust giúp bạn có thể nhanh chóng viết logic linh hoạt và biểu cảm:

Rust VS Go, nhà phát triển nên chọn ngôn ngữ nào vào năm 2023?

Nhưng cũng vì Rust có rất nhiều cân nhắc về thiết kế nên nó khó học hơn, đặc biệt là trong giai đoạn đầu. Nhưng không sao, C++ hay Java có rất nhiều thứ để học, và nó thậm chí không cung cấp các tính năng nâng cao của Rust như an toàn bộ nhớ. Vì vậy, thực sự không hợp lý khi chỉ trích âm thanh quá phức tạp của Rust: nó được thiết kế để nhấn mạnh biểu thức và chức năng phong phú, chúng ta không thể ngờ rằng nó lại đơn giản và thuần túy như vậy trong khi vẫn tận dụng được các lợi ích. Vì vậy, tất nhiên Rust có đường cong học tập của riêng mình. Nhưng chỉ cần vượt qua khó khăn này, phía trước sẽ có một con đường suôn sẻ.

Nếu bạn đã sẵn sàng tìm hiểu cú pháp và ngữ nghĩa phức tạp hơn (và yêu cầu cao hơn về khả năng đọc mã) để đổi lấy mức hiệu suất cao nhất, thì Rust thậm chí có thể sánh ngang với C++ và D. —Dave Cheney

**Mặc dù Rust và Go mượn một số tính năng của nhau (chẳng hạn như thuốc generic), công bằng mà nói thì các tính năng của Rust vẫn vượt trội và các tính năng của Go tương đối thiếu. **

  • Đồng thời

Hầu hết các ngôn ngữ đều cung cấp một số hình thức hỗ trợ cho lập trình đồng thời (tức là thực hiện nhiều thao tác cùng lúc), nhưng Go được thiết kế cho điều này ngay từ đầu. **Go không sử dụng các luồng của hệ điều hành, nhưng cung cấp một giải pháp thay thế gọn nhẹ: goroutines. **Mỗi goroutine là một chức năng Go thực thi độc lập mà bộ lập lịch Go ánh xạ tới một trong các luồng hệ điều hành được kiểm soát. Nghĩa là, bộ lập lịch có thể quản lý một số lượng lớn goroutine đồng thời rất hiệu quả, trong khi chỉ sử dụng một số luồng hệ điều hành hạn chế.

Do đó, chúng ta có thể chạy hàng triệu goroutine đồng thời trong một chương trình mà không lo gây ra các vấn đề nghiêm trọng về hiệu suất. Do đó, **Go là một giải pháp hoàn chỉnh cho các tình huống ứng dụng đồng thời quy mô lớn như máy chủ web và vi dịch vụ. **

Go cũng cung cấp các kênh cho goroutines, đây là cách nhanh chóng, an toàn và hiệu quả để giao tiếp và chia sẻ dữ liệu. Trình độ thiết kế đồng thời của Go thực sự rất cao và trải nghiệm sử dụng khá thoải mái và dễ chịu.

Nói chung, việc thiết kế các chương trình đồng thời là rất khó khăn và việc xây dựng các chương trình đồng thời chính xác và đáng tin cậy bằng bất kỳ ngôn ngữ nào cũng không hề dễ dàng. Tuy nhiên, vì yêu cầu này đã được xem xét khi bắt đầu dự án, nên cơ chế lập trình đồng thời trong Go đã được thực hiện đơn giản nhất có thể và được tích hợp tốt.

Go giúp việc xây dựng một ứng dụng được giải cấu trúc cẩn thận trở nên dễ dàng hơn. Ứng dụng này có thể được triển khai dưới dạng một tập hợp các vi dịch vụ và tận dụng tối đa khả năng tương tranh. Không phải là không thể trong Rust, nó khó thực hiện hơn. Theo một nghĩa nào đó, Rust phù hợp hơn với những lập trình viên không được phép có lỗ hổng bảo mật do sự cố bộ nhớ; nhưng tương ứng, khi họ thực hiện một số tác vụ tương đối đơn giản đối với các ngôn ngữ khác (bao gồm cả GO), họ thích phải trả tiền hơn nỗ lực nhiều hơn. —Sonya Koptyev

Ngược lại, cơ chế đồng thời trong Rust mới cập bến và chưa được ổn định, vì vậy mọi người có thể tiếp tục chú ý đến hướng phát triển tích cực này. Điều này cũng có lợi.Ví dụ, thư viện rayon của Rust cung cấp một phương pháp rất thanh lịch và gọn nhẹ có thể chuyển đổi các phép tính tuần tự thành các phép tính song song.

Sẽ thật tuyệt nếu có một cú pháp gọn nhẹ để tạo ra các goroutine và sử dụng các kênh. Đây là biểu hiện trực tiếp về sức mạnh của ngữ pháp và nhiều chi tiết nhỏ khác nhau cũng giúp trải nghiệm lập trình đồng thời của Go tốt hơn nhiều so với các ngôn ngữ khác.

—Ấn tượng ban đầu của lập trình viên Rust về cờ vây

Mặc dù có thể không dễ triển khai các chương trình đồng thời trong Rust nhưng vẫn hoàn toàn có thể thực hiện được và** những chương trình này cũng được hưởng lợi từ các đảm bảo an toàn bộ nhớ được thiết kế cẩn thận của Rust. **Lấy lớp Mutex của thư viện chuẩn làm ví dụ: trong Go, chúng ta có thể quên lấy mutex trước khi truy cập một thứ gì đó; nhưng trong Rust, không cần phải lo lắng về điều đó.

Go tập trung vào đồng thời là một trong những khái niệm cốt lõi. Điều này không có nghĩa là chúng ta không thể đạt được các hiệu ứng đồng thời tương tự như Go trong Rust, nhưng khó khăn trong việc triển khai phần nào là một bài kiểm tra đối với các lập trình viên. Go tập trung vào đồng thời là một trong những khái niệm cốt lõi của nó. Điều này không có nghĩa là chúng ta không thể đạt được các hiệu ứng đồng thời tương tự như Go trong Rust, nhưng khó khăn trong việc triển khai phần nào là một bài kiểm tra đối với các lập trình viên.

——Dave Cheney

  • sự an toàn

Như đã đề cập trước đó, cả Go và Rust đều có những cách riêng để ngăn chặn các lỗi lập trình phổ biến khác nhau, đặc biệt là các vấn đề liên quan đến quản lý bộ nhớ. Nhưng **Rust còn đi xa hơn, có thể nói rằng hãng không tiếc công sức để đảm bảo rằng mọi người không mắc phải những lỗi bảo mật không mong muốn. **

Trình biên dịch của Rust nghiêm ngặt đến mức nó kiểm tra mọi biến chúng ta sử dụng, mọi địa chỉ bộ nhớ mà chúng ta tham chiếu đến. Nó tránh các điều kiện chạy đua dữ liệu tiềm ẩn và cũng thông báo cho bạn về hành vi không xác định. Trong thế giới của Rust, các vấn đề về an toàn bộ nhớ và tương tranh hầu như không thể phát sinh.

— Tại sao chọn Rust?

Điều đó nói lên rằng, trải nghiệm lập trình trong Rust khác với hầu hết mọi ngôn ngữ khác và có thể khá khó khăn khi lần đầu tiên được giới thiệu. Nhưng trong mắt nhiều nhà phát triển, nỗ lực này rõ ràng là đáng đồng tiền bát gạo.

Đối với tôi, ưu điểm lớn nhất của Rust là trình biên dịch đã trở thành trợ thủ đắc lực của tôi, nó sẽ không bỏ sót bất kỳ lỗi nào được phát hiện (thiệt tình, đôi khi nó giống như một phép màu đối với tôi vậy).

—Grzegorz Nosek

Nhiều ngôn ngữ, kể cả Go, cũng cung cấp các công cụ giúp lập trình viên tránh mắc lỗi, nhưng Rust đã đưa tác dụng này lên một tầm cao mới. Nhiều chương trình không chính xác thậm chí không biên dịch được.

Trong Rust, các cơ sở thư viện khác nhau giúp lập trình viên ngăn ngừa lỗi của người dùng. Rust cho phép chúng tôi chỉ định một phần dữ liệu và sau đó đảm bảo rằng nó không thuộc về hoặc bị can thiệp bởi bất kỳ thứ gì khác. Tôi không thể nghĩ ra một ngôn ngữ nào đã cung cấp nhiều công cụ như vậy để ngăn chặn việc vô tình lạm dụng trước đây, điều này thật tuyệt vời. — Hoa hồng Sam

"Chiến đấu với người kiểm tra mượn" là điều bắt buộc đối với những người mới đến Rust, nhưng phần lớn, người kiểm tra không thực sự là kẻ thù. Các vấn đề mà nó tìm thấy thực sự là các lỗi thực sự (hoặc ít nhất là các lỗi tiềm ẩn) trong mã. Điều này có thể buộc chúng tôi phải tái cấu trúc cơ bản các chương trình của mình để tránh những vấn đề như vậy - Nếu bạn thực sự đặt tính đúng đắn và độ tin cậy làm ưu tiên hàng đầu, thì yêu cầu khắt khe này rõ ràng là một điều tốt.

Ở một góc độ khác, liệu một ngôn ngữ mới không làm thay đổi phương pháp lập trình có thể gọi là ngôn ngữ mới hay không? Và khi sử dụng các ngôn ngữ khác, Rust dạy chúng ta cách suy nghĩ an toàn, điều này cũng quan trọng không kém.

Nếu mọi người chọn Rust, thì thường là do thiết kế được đảm bảo mà nó cung cấp: sự an toàn về con trỏ null/dòng dữ liệu, hành vi thời gian chạy có thể dự đoán được và kiểm soát hoàn toàn phần cứng. Nếu điều này không hợp lý với bạn, thì thực sự không cần sử dụng Rust. Rốt cuộc, có một cái giá đằng sau những lợi ích này: rất khó để bắt đầu. Bạn phải từ bỏ những thói quen xấu và nắm vững những khái niệm mới. Ban đầu, mọi người sẽ bị tra tấn đến chết bởi người kiểm tra khoản vay.

— Matthew Endler

Khó khăn thực sự khi bắt đầu với mô hình lập trình Rust có thể phụ thuộc vào những ngôn ngữ khác mà bạn đã sử dụng trước đây. Các lập trình viên Python hoặc Ruby có thể thấy Rust quá hạn chế, nhưng những người khác có thể thấy các ràng buộc rõ ràng và rõ ràng là tốt.

Nếu bạn là một lập trình viên C hoặc C++ và đã dành nhiều tuần để tìm kiếm các lỗi về an toàn bộ nhớ trong ngôn ngữ này, thì bạn sẽ thích Rust. Vì vậy, "chiến đấu với trình kiểm tra mượn" trở thành "điều này vẫn có thể thực hiện được với trình biên dịch chứ? Tuyệt!"

— Grzegorz Nosek

  • Tăng quy mô

Các chương trình máy chủ ngày nay chứa hàng chục triệu dòng mã, được viết bởi hàng trăm lập trình viên và được cập nhật hầu như mỗi ngày. Về mặt thiết kế và phát triển, Go hoàn toàn tính đến nhu cầu nâng cao hiệu quả công việc trong một môi trường như vậy. Các cân nhắc thiết kế cho Go bao gồm quản lý phụ thuộc nghiêm ngặt, khả năng thích ứng của kiến trúc phần mềm khi hệ thống phát triển và độ bền xuyên qua các ranh giới thành phần. — Rob Pike

Khi bạn đang giải quyết vấn đề một mình hoặc trong một nhóm nhỏ, việc bạn chọn ngôn ngữ đơn giản hay ngôn ngữ phong phú hoàn toàn là vấn đề sở thích cá nhân. Tuy nhiên, với việc mở rộng quy mô phần mềm, độ phức tạp và mở rộng nhóm, sự khác biệt giữa hai ngôn ngữ bắt đầu thực sự xuất hiện.

Đối với các ứng dụng lớn và hệ thống phân tán, tốc độ thực thi mã thường ít quan trọng hơn tốc độ phát triển: một ngôn ngữ như Go cố ý nhấn mạnh thiết kế tinh gọn có thể rút ngắn thời gian thích ứng của các nhà phát triển mới và cho phép họ tham gia nhanh hơn Để đóng góp cho các cơ sở mã lớn.

Sử dụng ngôn ngữ GO, các nhà phát triển cơ sở thường dễ dàng làm việc hiệu quả hơn, nhưng các nhà phát triển trung cấp khó đưa ra các khái niệm trừu tượng phức tạp hơn và do đó gây ra sự cố. Vì đặc điểm này, Rust có xu hướng kém hấp dẫn hơn Go trong thế giới phát triển phần mềm doanh nghiệp.

— Cu li Cro

Sự rõ ràng và dễ đọc luôn quan trọng hơn sự sang trọng khi phát triển phần mềm quy mô lớn. **Những hạn chế của Go thực sự làm cho nó dễ thích ứng hơn với nhu cầu của các doanh nghiệp và tổ chức lớn hơn so với các ngôn ngữ phức tạp và mạnh mẽ hơn như Rust. **

Rust so với Go: Sự khác biệt

Mặc dù cả Rust và Go đều là ngôn ngữ hiện đại phổ biến và được sử dụng rộng rãi, nhưng chúng không thực sự là đối thủ cạnh tranh vì chúng nhắm mục tiêu đến các trường hợp sử dụng hoàn toàn khác nhau**.

Toàn bộ cách tiếp cận lập trình trong Go hoàn toàn khác với Rust và những tính năng này đặc biệt phù hợp với một số người, nhưng mặt khác hoàn toàn có thể khiến người khác khó chịu. Điều này có ý nghĩa, bởi vì nếu Rust và Go về cơ bản đều giải quyết cùng một vấn đề theo những cách cơ bản giống nhau, thì tại sao chúng ta lại cần hai ngôn ngữ riêng biệt?

Vì vậy, chúng ta có thể bắt đầu với các cách tiếp cận của Rust và Go và giải thích bản chất tương ứng của chúng không? Hãy thử nó ra với nhau.

  • thu gom rác thải

“Thu gom rác hay không thu gom rác” luôn là một câu hỏi không có câu trả lời chính xác. Nói chung, thu gom rác và quản lý bộ nhớ tự động có thể giúp chúng tôi phát triển các chương trình đáng tin cậy và hiệu quả một cách nhanh chóng và dễ dàng. Vì vậy, đối với một số nhà phát triển, đây là những tính năng cần thiết.

Những người khác lập luận rằng bộ sưu tập rác, với chi phí hoạt động và tạm dừng toàn cầu, có thể dẫn đến hành vi thời gian chạy không thể đoán trước và gây ra độ trễ không thể chấp nhận được. Tất nhiên có sự thật cho tuyên bố này.

Go và Rust là hai ngôn ngữ rất khác nhau. Mặc dù cả hai có thể được mô tả đơn giản là ngôn ngữ hệ thống hoặc ngôn ngữ thay thế cho C, nhưng mục tiêu và kịch bản ứng dụng, phong cách thiết kế ngôn ngữ và ưu tiên chức năng của chúng thực sự rất khác nhau. Thu gom rác là một điểm khác biệt cốt lõi lớn. Thu gom rác trong Go làm cho ngôn ngữ đơn giản hơn, nhỏ hơn và dễ hiểu hơn. Rust không có bộ sưu tập rác, điều này làm cho nó cực kỳ nhanh (điều này đặc biệt phù hợp với các nhà phát triển không chỉ yêu cầu thông lượng cao mà còn độ trễ thấp), đồng thời nhận ra một loạt chức năng và kiểu lập trình mà Go hoàn toàn không thể làm được ( Tại ít nhất mà không làm giảm hiệu suất).

— PingCAP

  • gần với phần cứng

Lịch sử lập trình máy tính có thể nói là một quá trình phát triển trừu tượng ngày càng phức tạp. Nó cho phép các lập trình viên giải quyết các vấn đề mà không cần quan tâm quá nhiều đến cách thức hoạt động thực sự của phần cứng bên dưới. Thiết kế này làm cho các chương trình dễ viết hơn và di động hơn. Nhưng đối với các chương trình khác, quyền truy cập vào phần cứng và kiểm soát chính xác cách chương trình thực thi là quan trọng hơn.

**Mục tiêu của Rust là cho phép các lập trình viên "gần với phần cứng" và giành lại nhiều quyền kiểm soát hơn; trong khi Go trừu tượng hóa các chi tiết kiến trúc, cho phép các lập trình viên tiếp cận gần hơn với vấn đề. **

Cả hai ngôn ngữ đều có những lĩnh vực ứng dụng khác nhau. Go rất giỏi trong việc viết các dịch vụ siêu nhỏ và các tác vụ "DevOps" điển hình, nhưng nó không phải là ngôn ngữ lập trình hệ thống. Rust mạnh hơn trong các tác vụ nhấn mạnh tính đồng thời, an toàn và/hoặc hiệu suất, đồng thời có đường cong học tập dốc hơn so với Go.

— Matthew Endler

  • Hiệu suất đầu tiên

Trên thực tế, đối với hầu hết các chương trình, hiệu suất không quan trọng bằng khả năng đọc mã. Nhưng nếu một số dự án thực sự đặt hiệu suất lên hàng đầu, thì có nhiều sự đánh đổi về mặt thiết kế trong **Rust sẽ giúp bạn đẩy tốc độ thực thi mã của mình đến giới hạn tối đa. **

Ngược lại, Go quan tâm nhiều hơn đến tính đơn giản của mã và thậm chí sẵn sàng hy sinh một số hiệu suất thời gian chạy cho nó. Nhưng tốc độ xây dựng của Go là vô song, điều này thậm chí còn quan trọng hơn đối với các dự án viết mã quy mô lớn.

Rust hoạt động nhanh hơn Go. Trong các điểm chuẩn, Rust thực sự nhanh hơn, trong một số trường hợp theo một mức độ lớn. Nhưng trước khi bạn chọn Rust, hãy hiểu rõ: Go không thua xa trong hầu hết các điểm chuẩn và nó vẫn duy trì lợi thế về hiệu suất so với các ngôn ngữ như Java, C#, Java và Python.

Nếu bạn cần hiệu suất cao nhất, bạn có thể chọn bất kỳ ngôn ngữ nào trong hai ngôn ngữ này và hiệu suất tốc độ sẽ không bao giờ làm bạn thất vọng. Ngoài ra, nếu bạn đang xây dựng một dịch vụ web xử lý tải cường độ cao và yêu cầu chia tỷ lệ dọc/ngang linh hoạt, thì cả hai ngôn ngữ cũng có thể đáp ứng nhu cầu của bạn.

— Andrew Lader

  • Chính xác

Mặt khác, nếu bạn không buộc chương trình không bao giờ sai, sự đánh đổi sẽ khác. Hầu hết mã không được thiết kế để sử dụng lâu dài, nhưng một số chương trình chạy trong sản xuất trong nhiều năm. Đối mặt với những thực tế này, có thể đáng để đầu tư thêm một chút thời gian vào việc phát triển và đảm bảo rằng chương trình hoạt động chính xác và đáng tin cậy mà không phải chịu gánh nặng bảo trì lớn trong tương lai.

Cả Go và Rust đều giúp bạn viết đúng chương trình, nhưng theo những cách khác nhau: **Go cung cấp một khung thử nghiệm tích hợp tuyệt vời, trong khi Rust tập trung vào việc loại bỏ các lỗi thời gian chạy thông qua trình kiểm tra mượn. **

Quan điểm của tôi là: code ngày mai phải ra mắt thì dùng Go, code phải chạy ổn định trong 5 năm tới thì chọn Rust.

— Grzegorz Nosek

Mặc dù cả Go và Rust đều đủ tốt cho các dự án phát triển nghiêm túc, nhưng tốt nhất bạn nên hiểu đầy đủ các tính năng và ưu điểm khác nhau của chúng. Tóm lại, người khác nghĩ gì không quan trọng: **Chỉ bạn mới có thể quyết định ngôn ngữ lập trình nào phù hợp hơn với nhu cầu của nhóm và dự án của bạn. **

Nếu bạn muốn tăng tốc độ phát triển, giả sử bạn có nhiều dịch vụ khác nhau để viết, hoặc bản thân nhóm phát triển lớn, thì ngôn ngữ Go chắc chắn là câu trả lời phù hợp. Go đặc biệt chú ý đến thiết kế đồng thời và rất muốn phát hiện hành vi truy cập bộ nhớ không an toàn (Rust cũng vậy), nhưng không bắt buộc bạn phải quản lý từng chi tiết riêng lẻ.

Go nhanh và mạnh, nhưng về cốt lõi, nó giúp các nhà phát triển thoát khỏi lối mòn và tập trung vào sự đơn giản và thống nhất. Mặt khác, nếu bạn cần siết chặt từng chút khoảng không hiệu suất, thì Rust là lựa chọn lý tưởng.

—Andrew Lader

Kết luận Tôi hy vọng bài viết này có thể giúp bạn hiểu được những điểm nổi bật tương ứng của Rust and Go. Nếu có thể, bạn nên trải nghiệm hai ngôn ngữ này một chút, vì chúng rất hữu ích trong bất kỳ con đường kỹ thuật nào, ngay cả đối với những người đam mê lập trình nghiệp dư.

Nhưng nếu bạn chỉ dành thời gian học một ngôn ngữ một cách nghiêm túc, vui lòng đảm bảo về kiến thức chuyên môn và khuynh hướng tương ứng của Go và Rust trước khi đưa ra lựa chọn.

Tất nhiên, kiến thức về ngôn ngữ lập trình chỉ là một phần nhỏ tạo nên thành công của một kỹ sư phần mềm. Ngoài lập trình, các kỹ sư phải thành thạo thiết kế, kỹ thuật, kiến trúc, giao tiếp và cộng tác. Miễn là mọi người có thể làm tốt những điều sau đây, bất kể bạn chọn ngôn ngữ lập trình nào, bạn sẽ trở thành một bậc thầy công nghệ phần mềm xuất sắc.

Xem bản gốc
  • Phần thưởng
  • Bình luận
  • Chia sẻ
Bình luận
Không có bình luận