Rust là tương lai của cơ sở hạ tầng JavaScript

locale
vi
date
May 27, 2022
slug
rush
status
Published
tags
Tech
summary
Tổng quan về ngôn ngữ Rush
type
Post
Rush là một ngôn ngữ lập trình nhanh, đáng tin tưởng, và tiết kiệm bộ nhớ. Rush được bình chọn là ngôn ngữ lập trình được yêu thích nhất trong sáu năm liên tiếp (khảo sát). Được tạo bởi Mozilla, hiện tại nó được sử dụng tại Facebook, Apple, Amazon, Microsoft, và Google cho những hệ thống cơ sở hạ tầng, mã hoá, và lập trình cấp thấp.
Tại sao Rush hiện đang được sử dụng để thay thế các phần của hệ sinh thái web Javascript như thu nhỏ (Terser), chuyển đổi (Babel), định dạng (Prettier), gói (webpack), linting (ESLint) và hơn thế nữa.

Rush là gì?

Rush giúp các nhà phát triển viết phần mềm nhanh chóng, tiết kiệm bộ nhớ. Đó là một sự thay thế hiện đại cho các ngôn ngữ như C++ hoặc C, tập trung vào sự an toàn của mã và cú pháp ngắn gọn.
Rust khá khác so với JavaScript. JavaScript cố gắng tìm các biến hoặc đối tượng không được sử dụng và tự động xóa chúng khỏi bộ nhớ. Đây được gọi là Thu gom rác. Ngôn ngữ này giúp nhà phát triển suy nghĩ về cách quản lý bộ nhớ thủ công.
Với Rush, các nhà phát triển có nhiều quyền kiểm soát hơn đối với việc cấp phát bộ nhớ, mà không gây khó khăn như C++.
Rust sử dụng một phương pháp quản lý bộ nhớ tương đối độc đáo kết hợp ý tưởng về “quyền sở hữu” bộ nhớ. Về cơ bản, Rust theo dõi những ai có thể đọc và ghi vào bộ nhớ. Nó biết khi nào chương trình đang sử dụng bộ nhớ và ngay lập tức giải phóng bộ nhớ khi nó không còn cần thiết nữa. Nó thực thi các quy tắc bộ nhớ tại thời điểm biên dịch, làm cho nó hầu như không thể có lỗi bộ nhớ thời gian chạy. Bạn không cần phải theo dõi bộ nhớ theo cách thủ công. Trình biên dịch sẽ chăm sóc nó. - Discord

Ứng dụng

Ngoài các công ty đã được đề cập ở trên, Rush cũng đang được sử dụng cho các thư viện nguồn mở phổ biến như:
Rust đã là một nhân tố lực lượng cho đội của chúng tôi và đặt cược vào Rust là một trong những quyết định tốt nhất mà chúng tôi đưa ra. Hơn cả hiệu suất, tính công thái học và sự tập trung vào tính đúng đắn đã giúp chúng tôi khắc phục sự phức tạp của đồng bộ hóa. Chúng tôi có thể mã hóa các bất biến phức tạp về hệ thống của chúng tôi trong type system và nhờ trình biên dịch kiểm tra chúng cho chúng tôi. - Dropbox

Từ Javascript sang Rush

JavaScript là ngôn ngữ lập trình được sử dụng rộng rãi nhất, hoạt động trên mọi thiết bị có trình duyệt web. Trong mười năm qua, một hệ sinh thái khổng lồ đã được xây dựng xung quanh JavaScript.
Webpack: các nhà phát triển muốn nhóm nhiều tệp JavaScript thành một.
Babel: các nhà phát triển muốn viết JavaScript hiện đại trong khi hỗ trợ các trình duyệt cũ hơn.
Terser: các nhà phát triển muốn tạo kích thước tệp nhỏ nhất có thể.
Prettier: các nhà phát triển muốn một trình định dạng mã cố định vừa hoạt động.
ESLint: các nhà phát triển muốn tìm các vấn đề với mã của họ trước khi triển khai.
Hàng triệu dòng mã đã được viết và thậm chí nhiều lỗi đã được sửa để tạo nền tảng cho các ứng dụng web vận chuyển ngày nay. Tất cả các công cụ này đều được viết bằng JavaScript hoặc TypeScript. Điều này đã hoạt động tốt, nhưng chúng tôi đã đạt đến mức tối ưu hóa cao nhất với JS. Điều này đã truyền cảm hứng cho một loại công cụ mới, được thiết kế để cải thiện đáng kể hiệu suất xây dựng web.

SWC

SWC, được tạo vào năm 2017, là một nền tảng dựa trên Rust có thể mở rộng cho thế hệ tiếp theo của các công cụ dành cho nhà phát triển nhanh. Nó được sử dụng bởi các công cụ như Next.js, Parcel và Deno, cũng như các công ty như Vercel, ByteDance, Tencent, Shopify, v.v.
SWC có thể được sử dụng để biên dịch, rút gọn, đóng gói và hơn thế nữa - và được thiết kế để mở rộng. Đó là thứ bạn có thể gọi để thực hiện chuyển đổi mã (tích hợp sẵn hoặc tùy chỉnh). Việc chạy các biến đổi đó xảy ra thông qua các công cụ cấp cao hơn như Next.js.

Deno

Deno, được tạo ra vào năm 2018, là một thời gian chạy đơn giản, hiện đại và an toàn cho JavaScript và TypeScript sử dụng V8 và được xây dựng bằng Rust. Đó là một nỗ lực để thay thế Node.js, được viết bởi những người sáng tạo ban đầu của Node.js. Mặc dù nó được tạo vào năm 2018, nhưng nó vẫn chưa đạt phiên bản 1.0 cho đến tháng 5 năm 2020.
Trình tạo tài liệu, trình định dạng mã và trình tạo tài liệu của Deno được xây dựng bằng SWC.

esbuild

esbuild, được tạo vào tháng 1 năm 2020, là một trình gói và trình thu nhỏ JavaScript nhanh hơn 10-100 lần so với các công cụ hiện có, được viết bằng Go.
Tôi đang cố gắng tạo một công cụ xây dựng A) hoạt động tốt cho một vị trí cụ thể của các trường hợp sử dụng (gói JavaScript, TypeScript và có thể là CSS) và B) đặt lại kỳ vọng của cộng đồng về ý nghĩa của nó đối với một công cụ xây dựng JavaScript nhanh. Theo quan điểm của tôi, các công cụ hiện tại của chúng tôi quá chậm. - Evan, Người tạo ra esbuild (Nguồn)
Xây dựng công cụ JavaScript với các ngôn ngữ lập trình hệ thống, như Go và Rust, khá thích hợp cho đến khi esbuild được phát hành. Theo ý kiến của tôi, esbuild đã khơi dậy mối quan tâm rộng rãi hơn trong việc cố gắng làm cho các công cụ dành cho nhà phát triển nhanh hơn. Evan đã chọn sử dụng Go:
Phiên bản Rust có thể được tạo ra để hoạt động với tốc độ tương đương với đủ nỗ lực. Nhưng ở cấp độ cao, Go thú vị hơn nhiều khi làm việc cùng. Đây là một dự án phụ và tôi rất vui khi làm việc với nó. - Evan, Người tạo ra esbuild (Nguồn)
Một số người cho rằng Rust có thể hoạt động tốt hơn, nhưng cả hai đều có thể đạt được mục tiêu ban đầu của Evan là ảnh hưởng đến cộng đồng:
Ngay cả khi chỉ cần tối ưu hóa cơ bản, Rust đã có thể hoạt động tốt hơn phiên bản Go siêu điều chỉnh bằng tay. Đây là một minh chứng to lớn cho thấy việc viết các chương trình hiệu quả với Rust dễ dàng như thế nào so với việc đào sâu chúng ta phải làm với Go. - Discord

Rome

Rome, được tạo ra vào tháng 8 năm 2020, là một trình liên kết, trình biên dịch, gói, trình chạy thử nghiệm và hơn thế nữa, dành cho JavaScript, TypeScript, HTML, JSON, Markdown và CSS. Họ nhằm mục đích thay thế và thống nhất toàn bộ chuỗi công cụ phát triển giao diện người dùng. Nó được tạo ra bởi Sebastian , người cũng đã tạo ra Babel.
Tại sao phải viết lại mọi thứ?
Thực hiện các sửa đổi cần thiết đối với Babel để cho phép nó trở thành cơ sở đáng tin cậy cho các công cụ khác sẽ yêu cầu thay đổi hoàn toàn mọi thứ. Kiến trúc bị ràng buộc với các lựa chọn thiết kế ban đầu mà tôi đã thực hiện vào năm 2014 khi tôi tìm hiểu về trình phân tích cú pháp, AST và trình biên dịch. - Sebastian ( Nguồn )
Rome hiện được viết bằng TypeScript và chạy trên Node.js. Nhưng họ hiện đang làm việc để viết lại trong Rust bằng cách sử dụng trình phân tích cú pháp RSLint và hệ thống khách truy cập của riêng họ cho truyền qua AST.

NAPI

Sự tích hợp của Rust với Node.js tốt hơn so với các ngôn ngữ cấp thấp khác.
napi-rs cho phép bạn xây dựng các tiện ích bổ sung Node.js được biên dịch trước với Rust. Nó cung cấp một giải pháp tiện ích để biên dịch chéo và xuất bản các tệp nhị phân gốc lên NPM mà không cần node-gyphoặc postinstalltập lệnh.
Bạn có thể xây dựng một mô-đun Rust có thể được gọi trực tiếp từ Node.js mà không cần tạo một tiến trình con như esbuild.

Rust + WebAssembly

WebAssembly  WASM )  là một ngôn ngữ cấp thấp di động mà Rust có thể biên dịch sang. Nó chạy trong trình duyệt, có thể tương tác với JavaScript và được hỗ trợ trong tất cả các trình duyệt hiện đại chính.
WASM chắc chắn nhanh hơn rất nhiều so với JS, nhưng không phải là tốc độ gốc. Trong các thử nghiệm của chúng tôi, Parcel chạy chậm hơn 10-20 lần khi được biên dịch sang WASM so với các tệp nhị phân gốc. - Devon Govett
Mặc dù WASM chưa phải là giải pháp hoàn hảo nhưng nó có thể giúp các nhà phát triển tạo trải nghiệm web cực kỳ nhanh chóng. Nhóm Rust cam kết thực hiện WASM chất lượng cao và tiên tiến. Đối với các nhà phát triển, điều này có nghĩa là bạn có thể có những lợi thế về hiệu suất của Rust (so với Go) trong khi vẫn biên dịch cho web (sử dụng WASM).
Một số thư viện và khuôn khổ ban đầu trong không gian này:
Các khuôn khổ web dựa trên Rust này được biên dịch sang WASM không cố gắng thay thế JavaScript, nhưng hoạt động cùng với nó. Mặc dù chúng tôi chưa có ở đó, nhưng thật thú vị khi thấy Rust đến sau web trên cả hai mặt: làm cho công cụ JavaScript hiện tại nhanh hơn và các ý tưởng tương lai để biên dịch sang WASM .
Nó Rust tất cả các cách xuống.

Tại sao không Rush?

Rust có một đường cong học tập dốc. Đó là mức độ trừu tượng thấp hơn so với những gì mà hầu hết các nhà phát triển web thường làm.
Khi bạn đang sử dụng mã gốc (thông qua Rust, Go, Zig hoặc các ngôn ngữ cấp thấp khác), các thuật toán và cấu trúc dữ liệu quan trọng hơn sự lựa chọn ngôn ngữ. Nó không phải là một viên đạn bạc.
Rust khiến bạn nghĩ về các kích thước mã của bạn rất quan trọng đối với lập trình hệ thống. Nó khiến bạn nghĩ về cách bộ nhớ được chia sẻ hoặc sao chép. Nó khiến bạn nghĩ về các trường hợp góc có thực nhưng không chắc và đảm bảo rằng chúng được xử lý. Nó giúp bạn viết mã cực kỳ hiệu quả theo mọi cách có thể. - Tom MacWright ( Nguồn )
Hơn nữa, việc sử dụng Rust trong cộng đồng web vẫn còn rất thích hợp. Nó chưa đạt được sự chấp nhận quan trọng. Mặc dù việc học Rust cho công cụ JavaScript sẽ là một rào cản đối với việc gia nhập, nhưng thú vị là các nhà phát triển muốn có một công cụ nhanh hơn khó đóng góp hơn . Phần mềm nhanh thắng .
Hiện tại, thật khó để tìm một thư viện hoặc khuôn khổ Rust cho các dịch vụ yêu thích của bạn (những thứ như làm việc với xác thực, cơ sở dữ liệu, thanh toán, v.v.). Tôi nghĩ rằng một khi Rust và WASM đạt được sự chấp nhận quan trọng, điều này sẽ tự giải quyết. Nhưng vẫn chưa. Chúng tôi cần các công cụ JavaScript hiện có để giúp chúng tôi thu hẹp khoảng cách và từng bước áp dụng các cải tiến hiệu suất .

Tương lai của công cụ JavaScript

Tôi tin rằng Rust là tương lai của công cụ JavaScript. Next.js 12 bắt đầu quá trình chuyển đổi của chúng tôi để thay thế hoàn toàn Babel (chuyển đổi) và Terser (thu nhỏ) bằng SWC và Rust. Tại sao?
  • Khả năng mở rộng: SWC có thể được sử dụng như một Crate bên trong Next.js mà không cần phải phân nhánh thư viện hoặc các ràng buộc thiết kế giải pháp khác.
  • Hiệu suất: Chúng tôi có thể đạt được Làm mới nhanh hơn ~ 3 lần và các bản dựng nhanh hơn ~ 5 lần trong Next.js bằng cách chuyển sang SWC, với nhiều chỗ hơn cho việc tối ưu hóa vẫn đang được tiến hành.
  • WebAssembly: Sự hỗ trợ của Rust cho WASM là điều cần thiết để hỗ trợ tất cả các nền tảng có thể có và phát triển Next.js ở khắp mọi nơi.
  • Cộng đồng: Cộng đồng và hệ sinh thái Rust thật tuyệt vời và đang ngày càng phát triển.
Không chỉ Next.js áp dụng SWC mà còn:
  • Deno’s linter, trình định dạng mã và trình tạo tài liệu của Deno được xây dựng bằng SWC.
  • dprint, được xây dựng trên SWC, là một định dạng mã nhanh hơn 30 lần so với Prettier.
  • Parcel đã cải thiện hiệu suất xây dựng tổng thể lên đến 10 lần so với SWC.
Bưu kiện sử dụng SWC giống như một thư viện. Trước khi chúng tôi sử dụng trình phân tích cú pháp của Babel và các biến đổi tùy chỉnh được viết bằng JS. Bây giờ, chúng tôi sử dụng trình phân tích cú pháp của SWC và các biến đổi tùy chỉnh trong Rust . Điều này bao gồm triển khai lưu trữ toàn bộ phạm vi, thu thập phụ thuộc và hơn thế nữa. Nó có phạm vi tương tự như cách Deno xây dựng trên SWC. - Devon Govett
Đó là những ngày đầu đối với Rust - một số phần quan trọng vẫn đang được tìm hiểu:
  • Plugin: Viết plugin trong Rust không dễ tiếp cận đối với nhiều nhà phát triển JavaScript. Đồng thời, việc để lộ hệ thống plugin trong JavaScript có thể làm giảm hiệu suất. Một giải pháp dứt điểm vẫn chưa xuất hiện. Lý tưởng nhất là trong tương lai kết hợp cả JavaScript và Rust. Nếu bạn muốn viết một plugin bằng JavaScript, bạn có thể cân bằng tốc độ. Cần thêm hiệu suất? Sử dụng API plugin Rust.
  • Gói: Một lĩnh vực phát triển thú vị là swcpack, đó là sự thay thế của SWC cho Webpack. Nó vẫn đang được phát triển nhưng có thể rất hứa hẹn.
  • WebAssembly: Như đã đề cập ở trên, triển vọng viết Rust và biên dịch sang WASM rất hấp dẫn, nhưng vẫn còn nhiều việc phải làm.
Bất chấp điều đó, tôi tin rằng Rust sẽ tiếp tục có tác động lớn đến hệ sinh thái JavaScript trong 1-2 năm tới và trong tương lai. Hãy tưởng tượng một thế giới mà tất cả các công cụ xây dựng được sử dụng trong Next.js đều được viết bằng Rust, mang lại cho bạn hiệu suất tối ưu. Sau đó, Next.js có thể được phân phối dưới dạng tệp nhị phân tĩnh mà bạn tải xuống từ NPM.
Đó là thế giới mà tôi muốn sống (và phát triển).
Link bài gốc của Lee Robinson

© Alan Phan 2020 - 2022