CTO của Azure: "Đã đến lúc ngừng bắt đầu các dự án mới bằng C/C++"
(twitter.com/markrussinovich)- Nếu thực sự cần một ngôn ngữ không có GC, hãy dùng Rust
- Vì mục tiêu bảo mật và độ tin cậy
- Ngành công nghiệp nên tuyên bố C/C++ là các ngôn ngữ đã lỗi thời
55 bình luận
Những người trước giờ vẫn ca ngợi và dùng Rust cũng nói rằng, cứ đụng đến
asynclà tụt hứng ngay. Thậm chí còn có ý kiến rằng chẳng lẽ với Rust thì đừng nên làm thư viện luôn sao (quá phức tạp, quá kén, quá khó). Những lời than phiền như vậy cũng đang xuất hiện.Cũng có người hạ thấp ông ấy dù còn chẳng biết Mark Russinovich là ai... ông là tác giả của bộ công cụ Sysinternals và cuốn sách Windows Internals... là người đã reverse engineering Windows để làm công cụ rồi sau đó trở thành Microsoft Fellow...
Bài viết châm biếm vấn đề của những người cuồng Rust bằng một video ngắn
https://twitter.com/cmuratori/status/1367627549816152064?lang=en
Rust thậm chí còn chưa có cả đặc tả chính thức nữa ....
C++ có spec chính thức "tồn tại", nhưng mọi implementation (gcc, clang, ...) đều chưa hoàn chỉnh.
Đây là một lập luận khá phổ biến, nhưng từ góc độ của người đã đọc khá nhiều đặc tả và cũng đã triển khai nhiều lần, tôi thật sự không rõ bản thân việc có hay không có đặc tả rốt cuộc có ý nghĩa gì.
"Đặc tả" có nhiều chiến lược khác nhau. Có cách mô tả xoay quanh hành vi bề ngoài, và cũng có cách mô tả hoạt động nội bộ; ngoài ra còn có sự khác biệt giữa việc dùng ngôn ngữ tự nhiên hay dùng cách mà máy có thể đọc được như giả mã hoặc định nghĩa toán học. Những thứ như tài liệu tham chiếu của Python hay Rust là các đặc tả mô tả hành vi bề ngoài bằng ngôn ngữ tự nhiên. Cách tiếp cận thường thấy trong các tiêu chuẩn ISO là đặc tả mô tả hoạt động nội bộ bằng ngôn ngữ tự nhiên, nhưng không có gì đảm bảo hoạt động nội bộ đó thực sự khớp với cách tiếp cận của các triển khai ngoài đời; thay vào đó, nó được định nghĩa theo kiểu nếu một triển khai giả định được xây dựng theo hoạt động nội bộ đó và một triển khai thực tế có hành vi bề ngoài giống nhau, tức là observationally equivalent, thì được xem là phù hợp với tiêu chuẩn. ECMAScript tuy được mô tả bằng ngôn ngữ tự nhiên, nhưng cấu trúc thực tế gần như ở mức viết giả mã bằng ngôn ngữ tự nhiên; cũng có những trường hợp như WebAssembly, nơi hoạt động nội bộ được cung cấp cả dưới dạng đặc tả ngôn ngữ tự nhiên lẫn định nghĩa toán học.
Từ phía người triển khai, các đặc tả bằng ngôn ngữ tự nhiên nói chung cũng na ná nhau cả. Vì đặc tả ngôn ngữ tự nhiên phải được tạo ra tách biệt với triển khai thực tế, nên đương nhiên cũng có trường hợp hai bên bị lệch nhau, và việc mắc lỗi cũng xảy ra khá thường xuyên. Việc mô tả hành vi bề ngoài dễ triển khai hơn hay mô tả hoạt động nội bộ dễ triển khai hơn thì còn tùy tình huống; nhưng xét từ góc độ ngôn ngữ lập trình, không hề có lý do bắt buộc phải chọn hẳn một bên nào. Theo nghĩa đó, Rust đã có đặc tả rồi, và đúng là đặc tả đó cung cấp đủ thông tin để các triển khai thay thế khác có thể xuất hiện.
Nếu bạn muốn chỉ dựa vào việc có trở thành tiêu chuẩn ISO hay chưa để đánh giá độ trưởng thành của một tiêu chuẩn, thì xin báo cho bạn biết là tôi đã phát hiện khoảng 100 lỗi trong tiêu chuẩn ISO/IEC 18181-1 JPEG XL (và vì thế mà bản sửa đổi thứ hai đang bị trì hoãn)...
Trên Hacker News cũng đã có hơn 800 bình luận.. bên này cũng đang rất nóng...
https://news.ycombinator.com/item?id=32905885
Xin cảm ơn vì những chia sẻ.
Mặt khác... tôi từng đọc một bài viết nói rằng khi cố gắng diễn giải phản ứng của một người lúc thứ họ yêu thích bị công kích, ta nên cảnh giác với việc quy tất cả cho tính cách của người đó, và tôi nghĩ đó là một lời đáng suy ngẫm, vì trong tình huống thực tế, thật khó để giữ được một tâm thế như vậy.
Có một bình luận trên Twitter khá ấn tượng.
Mọi người cuối cùng vẫn viết mã Rust theo cách "unsafe". - lược bỏ - Rust chưa bao giờ được tạo ra để thay thế những thứ đó.
Nhân đây, tôi đính kèm một liên kết để biết Mark Russinovich là ai.
https://en.m.wikipedia.org/wiki/Mark_Russinovich
Nói thêm một câu nữa. Những người cứ dùng C++ rồi liên tục gây lỗi và tạo bug, lại bảo “ôi cái này không dùng được, thử chuyển sang Rust đang hot dạo này xem.. nghe nói không cần phải để ý lỗi bộ nhớ nữa mà..”. Những người như vậy vẫn như nhau thôi. Với Rust họ cũng sẽ tạo ra những bug tương tự... Rồi lại sẽ có nhiều người nghĩ tiếp “thế học ngôn ngữ nào tiếp theo để thử đây?”. Những người còn chưa từng làm cho ra hồn cả việc dereference con trỏ trong C++ lại đang tung hô Rust đấy.
Những người kiểu đó sẽ phớt lờ hết mấy thứ như quyền sở hữu, reference, borrowing mà Rust lấy làm thế mạnh, vì ngay từ lúc biên dịch chúng đã báo lỗi và gây đau đầu, rồi cứ trộn
unsafevào để dùng bừa như thể đó là C++.Đằng nào cũng chết thì sao còn sống?
Lập luận này gần như cũng cùng một mức như thế.
Cảm giác như đang thấy lập luận rằng đằng nào người hay gây tai nạn cũng không thắt dây an toàn và còn phớt lờ đèn tín hiệu, nên dây an toàn và đèn tín hiệu cũng chẳng có nhiều ý nghĩa. Người giỏi thì làm gì cũng giỏi, người kém thì làm gì cũng kém — có thể đưa ra lập luận như vậy, nhưng nếu đi theo logic đó thì sẽ không thể bàn luận về tính hữu ích của công cụ nữa.
Vấn đề là ngôn ngữ này quá khó sử dụng, nhưng đúng là nói cũng có lý.
Khi nào có visual rust thì tôi mới công nhận -. - cười
Có vẻ C/C++ giờ thật sự đang đi vào vị thế như tiếng Latin. Nếu là vì mục đích học thuật thì ai cũng nên học, nhưng để thành thạo thì gần như là bất khả thi, và vì là một hệ thống cũ nên nếu xét theo hiện tại cũng có khá nhiều điểm thiếu hợp lý...
Thật thú vị khi người ta vẫn dùng tốt các ngôn ngữ mà mọi thứ đều là
unsafe, nhưng lại tuyệt đối phản đối các ngôn ngữ chỉ cho phép dùngunsafemột cách hạn chế.Tôi cho rằng đó là một dạng hội chứng Stockholm
Tinh thần của C
Theo ý kiến cá nhân của tôi thì có vẻ ngay từ điểm số 1 đã sai rồi haha vì con người vốn dĩ sinh ra đã dễ mắc lỗi..
Với cả C++, nếu tích cực dùng smart pointer và memory pool thì cũng ổn mà..
Tôi nghĩ thực ra không có nhiều lúc phải trực tiếp xử lý con trỏ như người ta tưởng.
Tôi cho rằng code thread-safe rốt cuộc vẫn là năng lực của chính lập trình viên.
Dù dùng ngôn ngữ nào đi nữa, nếu tay nghề không tốt,
thì cuối cùng vẫn sẽ xuất hiện kiểu code an toàn nhưng hiệu năng kém, hoặc code nguy hiểm.
Giao khả năng của lập trình viên cho việc lái ô tô hay điều khiển máy bay thì đáng sợ quá mà....
Mã thread-safe suy cho cùng là năng lực của chính lập trình viên <- Tôi cho rằng cách nghĩ này nguy hiểm, vì memory / thread safety không chỉ dừng ở mức chương trình bị sập hay chậm đi mà còn có thể phát triển thành lỗ hổng bảo mật, nên tôi nghĩ không thể giao việc này cho năng lực của một cá nhân. Đã có nhiều phương pháp khác nhau được nghiên cứu để ngăn chặn điều này từ trước, và khi chúng trưởng thành thì đã ra đời những ngôn ngữ như Rust cùng các công cụ khác; tôi cho rằng hiện nay phần mềm đã có ảnh hưởng quá lớn đến đời sống hằng ngày để có thể không sử dụng chúng rồi quy trách nhiệm cho từng cá nhân.
Con người thì đã là con người nên khó tránh khỏi sai sót, và dù là lập trình viên thông minh đến đâu cũng vẫn sẽ mắc lỗi. Bug bộ nhớ rốt cuộc cũng xuất phát từ sai lầm mà ra...
Dạo này tôi cũng nghĩ rằng thay vì trông chờ mọi người tự làm cho thật tốt, có lẽ cách tiếp cận tốt hơn là ngay từ đầu tạo ra một môi trường mà việc mắc lỗi trở nên khó hơn.
Nếu ở công ty tôi mà muốn dùng Rust thì phải cấm dùng
unsafe. Phải có những quy tắc như vậy thì mới có thể thử tin vào tính an toàn được ngôn ngữ hỗ trợ ở cấp độ ngôn ngữ. Nhưng chuyện này có hợp lý không?Tất nhiên, ở những công ty sử dụng Rust hẳn sẽ có sự đồng thuận rằng nếu không thật sự cần thiết thì không nên dùng
unsafe. Hơn thế nữa, tôi khuyên bạn nên thử tự viết bằng Rust... Có lẽ bạn phải trực tiếp dùng thử thì mới biết thực sự sẽ có bao nhiêu trường hợp cần đếnunsafe, đúng không?Ngay cả trong các thư viện nổi tiếng như tokio cũng đầy rẫy
unsafe.Có vẻ có khá nhiều bình luận nhìn theo kiểu hoặc là phải là All, còn không thì chẳng có chút giá trị nào cả.
Có ưu điểm là có thể phân biệt và cô lập rõ ràng giữa
unsafe/safe, và nếu một người vốn sẽ gây ra 100 lỗi bộ nhớ thì có thể giảm xuống còn 10 lần; nhưng rồi lại có cách tiếp cận rằng dù sao vẫn cóunsafe/ dù vậy lỗi bộ nhớ vẫn xảy ra => vì thế nên chẳng tốt hơn C++ ở điểm nào. Tôi không rõ liệu đó có phải là một nhận định thực tế hay không 😅Xét theo số lượng bình luận thì đúng là vậy nhưng.....
Có vẻ đúng hơn là: có một người theo kiểu ý kiến "all or nothing" đã viết rất nhiều bình luận...
Tôi cũng đồng ý với bình luận này. Càng nhìn một đối tượng theo kiểu nhị nguyên thì rốt cuộc chỉ tự mình chịu thiệt thôi.
Trong công việc thực tế, người ta thường cân nhắc ưu nhược điểm rồi cuối cùng chọn thứ mang lại lợi ích lớn nhất. Xét theo đặc thù của ngành, nếu không phải là bắt buộc phải dùng C/C++ ngay lúc này thì lợi ích có được khi dùng Rust là khá lớn, nên tôi nghĩ phạm vi Rust được sử dụng đang dần mở rộng.
Những người chuyển sang Rust đâu phải ngốc, chắc là vì sau khi dùng Rust họ thấy về tổng thể có điểm gì đó tốt hơn C++ nên mới tiếp tục dùng thôi haha
Không có gì... Mọi thứ
Giờ có lẽ không còn nhiều người không đồng ý rằng Rust là Next C++. Ngay cả kernel Linux cũng đã chấp nhận nó như một ngôn ngữ chính thức.
Tuy vậy, việc Rust có thực sự là một ngôn ngữ dễ dùng hay không thì vẫn hơi đáng nghi... Nhờ vào phân tích tĩnh được thực hiện để ngăn chặn trước các vấn đề về an toàn bộ nhớ, thời gian biên dịch khá đau đớn, và vì các semantics như ownership khá khó nên nó đòi hỏi phải học nhiều hơn hẳn so với các ngôn ngữ đa dụng như Python hay Java.
Thời gian biên dịch có lẽ bản thân LLVM mới là vấn đề lớn. Facebook đang nỗ lực cải thiện instruction selection của LLVM, nên tình hình rồi sẽ khá hơn.
Tìm hiểu ra thì đúng là như vậy thật. Tôi cứ nghĩ phần kiểm tra kiểu liên quan đến ownership mới tốn nhiều thời gian, nhưng hóa ra backend LLVM mới là phần lớn..
Khi
rustmới ra mắt, tôi đã rất quan tâm và có học thử một chút... nhưng thấy mụcunsafelà bỏ ngay. Tôi hoàn toàn không thấy có lý do hợp lý nào để phải học rồi dùng cái này. Dù sao thì chương trình chỉ cần hơi phức tạp một chút là cũng phải dùngunsafethôi. Mà như vậy thì sự an toàn màrusthay tự hào cũng bay mất rồi. Dùng cái này để làm gì?Trong Rust, có thể xem như
unsafechỉ cần khi lập trình mức thấp, còn khi viết ứng dụng thông thường thì hầu như không có dịp phải dùng đến.Ngoài ra, ngay cả khi phát sinh vấn đề về bộ nhớ bên trong khối
unsafe, ngôn ngữ cũng bảo đảm rằng phần gây ra vấn đề nằm trong chính khốiunsafe, nên cũng có ưu điểm là giúp việc gỡ lỗi trở nên dễ hơn.Nếu thấy có
unsaferồi hỏi "Sao lại dùng cái này?" thì ngay từ đầu chẳng phải là không nên dùng C/C++ sao?C++ vẫn đang tiếp tục tiến hóa, và nếu đã dùng
unsafethì thà cứ dùng luôn C++ còn hơn, nên tôi không cảm thấy thật sự cần thiết phải học rồi sử dụng Rust.Không phải mọi lập trình Rust đều cần
unsafe.Những thao tác bộ nhớ tinh vi đến mức cần
unsafethường được tách ra ở phía phát triển thư viện, nên ở phía phát triển ứng dụng — nơi có lẽ nhu cầu lớn nhất — tôi nghĩ gần như sẽ không có chuyện phải dùngunsafe.Đúng là C++ vẫn đang tiếp tục tiến hóa, nhưng gánh nặng di sản để giữ tương thích ngược thì quá đau đớn. Nếu chỉ vì một
unsafemà bạn đã thấy khó chịu, thì có lẽ bạn sẽ còn không hài lòng với mọi tính năng của C++ đâu hahaVì thế nên
unsafekhông được khuyến nghị.Dùng
safethì vẫn an toàn hơn C/C++ vốn về cơ bản mọi thứ đều nhưunsafe.https://people.mpi-sws.org/~dreyer/papers/rustbelt/paper.pdf
Nếu không có cơ chế mơ hồ là
unsafe, thì Rust có lẽ có thể trở thành một lựa chọn thay thế thực sự cho C++.Tôi chỉ ước FFI thân thiện hơn một chút.. Tôi nhớ đã từng cố trao đổi các cấu trúc phức hợp với thư viện bên ngoài thông qua FFI, và đó là một trải nghiệm vô cùng đau khổ.
Ngay cả
rust to rustcòn không dễ nữa..https://github.com/rodrimati1992/abi_stable_crates
Xét trong bối cảnh MS đang tích cực hỗ trợ Rust, đây có vẻ là một phát biểu rất tự nhiên.
Đến cả Torvalds cứng đầu như vậy cũng đã chấp nhận Rust, nên tôi không thấy cần phải cứ tiếp tục dùng một ngôn ngữ mà ngày càng ít người học.
Lỗi liên quan đến bộ nhớ không bao giờ tự nhiên biến mất chỉ vì dùng Rust. Những người tạo ra lỗi thì dù đưa cho họ ngôn ngữ nào cũng sẽ sản xuất ra lỗi hàng loạt. C++ vẫn đang được dùng hiệu quả và ổn thỏa mà chẳng có vấn đề gì, chứ bỏ là bỏ cái gì. Đúng là đã buột miệng đưa ra một phát ngôn gây bão như thể sắp nổ ra chiến tranh vậy.
Nói rằng C/C++ đang được sử dụng hiệu quả và ổn thỏa, không có vấn đề gì thì cũng khó, vì trong lịch sử đã có vô số lỗi liên quan đến bộ nhớ bùng phát từ C/C++, và có lẽ ngay lúc này vẫn đang phát sinh ở đâu đó. (Dù nhờ vậy mà nhiều nhà nghiên cứu PL/SE cũng có cái để sống)
Theo nội dung công bố của Microsoft, 70% lỗi bảo mật là lỗi liên quan đến bộ nhớ (https://zdnet.com/article/…)
Nội dung khảo sát từ dự án Chromium cũng tương tự (https://www.chromium.org/Home/chromium-security/memory-safety/): gần 70% cũng là lỗi liên quan đến bộ nhớ.
Tôi nhớ là đã từng đọc đâu đó một bài viết trước đây nói rằng phần lớn lỗi của kernel Windows là các lỗi liên quan đến bộ nhớ, và ở những phần đang được phát triển bằng Rust thì các lỗi đó đã giảm đi một cách đáng kể..
Vì ngay từ khi ra đời, ngôn ngữ này đã được thiết kế để tích cực khuyến khích
readonly, nên có lẽ khó mà phủ nhận rằng đây là một thiết kế ngôn ngữ an toàn hơn C++. Tuy nhiên, vì thế mà xuất hiện khái niệm quyền sở hữu nghe rất lạ lẫm, khiến việc lập trình trở nên khó hơn.Ngoài ra còn có lợi thế về hiệu năng: về mặt thống kê, mã Rust viết khá sơ sài vẫn chạy nhanh hơn mã C++ được thiết kế rất tốt.
Có vẻ ông ấy đã nói một câu dễ gây tranh cãi rồi đấy. haha
Cá nhân tôi thấy C++ vì đã quá lâu đời nên bị ràng buộc bởi khả năng tương thích ngược, khiến việc phát triển theo hướng hiện đại diễn ra chậm chạp.
Thêm nữa, do vừa phải giữ tương thích ngược triệt để vừa phải đưa các yếu tố hiện đại vào, nên có quá nhiều cách để làm cùng một việc, và tôi nghĩ điều đó lại trở thành rào cản gia nhập lớn hơn với người mới.
Tôi cũng nghĩ giờ Rust tốt hơn C++. Thời phải đỏ mắt đi tìm các lỗi liên quan đến quản lý bộ nhớ giờ nên chấm dứt thôi.
Đúng vậy.. nếu là một dự án phát triển bắt đầu từ con số 0 thì thực sự không có lý do gì phải chọn C++ cả..
Chuẩn luôn
Dù muốn dùng Rust thì cũng chỉ dùng bổ trợ, còn trong công việc thì vẫn chưa có dịp dùng đến. Vì vậy cũng khó mà quen hẳn, mà chỉ cần bỏ tay một thời gian là lại quên mất... Rõ ràng là thích nên cũng muốn dùng lắm mà... hehe
Toàn mấy người chưa từng tự tay viết lấy một memory pool để tối ưu hiệu quả sử dụng heap mà cứ ra rả Rust suốt, đúng là buồn cười ha. Azure CTO thì dĩ nhiên chẳng phải loại ý kiến đủ đại diện cho tiêu chuẩn của cả ngành, mà kể cả bó hẹp trong Microsoft cũng tuyệt đối không phải là ý kiến đại diện cho lập trường của Microsoft; cùng lắm chỉ là tự dưng nổi hứng rồi đem suy nghĩ chủ quan của mình ra nói mà thôi... Mấy người còn chẳng làm C++ cho ra hồn thì liệu sang Rust có làm cho ra hồn được không? Đúng là đầy rẫy những kẻ chỉ giỏi chém gió.
Ngay từ cách nói chuyện, bạn đã bộc lộ sự thô lỗ một cách không che giấu. Cố lên nhé.