JavaScript so với Python

0
96

Trong phần này, bạn sẽ so sánh Python và JavaScript từ góc nhìn của Pythonista. Sẽ có một số khái niệm mới ở phía trước, nhưng bạn cũng sẽ khám phá ra một vài điểm tương đồng giữa hai ngôn ngữ.

Trường hợp sử dụng

Python là một ngôn ngữ lập trình thông dịch có mục đích chung , đa mô hình, cấp cao, đa nền tảng, có thư viện tiêu chuẩn phong phú và cú pháp dễ tiếp cận.

Do đó, nó được sử dụng trong nhiều lĩnh vực, bao gồm giáo dục khoa học máy tính, viết kịch bản và tự động hóa , tạo mẫu, thử nghiệm phần mềm , phát triển web , lập trình thiết bị nhúng và máy tính khoa học . Mặc dù có thể thực hiện được, nhưng có thể bạn sẽ không chọn Python làm công nghệ chính để phát triển trò chơi điện tử hoặc ứng dụng di động.

Mặt khác, JavaScript chỉ có nguồn gốc như một ngôn ngữ kịch bản phía máy khách để làm cho các tài liệu HTML tương tác hơn một chút. Nó có chủ đích đơn giản và có một trọng tâm duy nhất: thêm hành vi vào giao diện người dùng. Điều này vẫn đúng ngày nay mặc dù khả năng của nó đã được cải thiện. Với Javascript, bạn có thể xây dựng không chỉ các ứng dụng web mà còn cả các chương trình máy tính để bàn và ứng dụng di động. Môi trường thời gian chạy được thiết kế riêng cho phép bạn thực thi JavaScript trên máy chủ hoặc thậm chí trên các thiết bị IoT.

Triết học

Python nhấn mạnh khả năng đọc và khả năng bảo trì của mã với cái giá là tính biểu cảm của nó. Rốt cuộc, bạn thậm chí không thể định dạng mã của mình quá nhiều mà không phá vỡ nó. Bạn cũng sẽ không tìm thấy các toán tử bí truyền như bạn làm trong C ++ hoặc Perl vì hầu hết các toán tử Python là các từ tiếng Anh. Một số người nói đùa rằng Python là mã giả thực thi được nhờ vào cú pháp đơn giản của nó.

Như bạn sẽ tìm hiểu ở phần sau, JavaScript cung cấp tính linh hoạt hơn nhiều nhưng cũng có nhiều cách gây rắc rối hơn. Ví dụ: không có cách nào đúng để tạo các kiểu dữ liệu tùy chỉnh trong JavaScript. Bên cạnh đó, ngôn ngữ cần duy trì khả năng tương thích ngược với các trình duyệt cũ hơn ngay cả khi cú pháp mới khắc phục sự cố.

Phiên bản

Cho đến gần đây, bạn sẽ tìm thấy hai phiên bản Python phần lớn không tương thích có sẵn để tải xuống trên trang web chính thức của nó . Sự phân chia này giữa Python 2.7 và Python 3.x gây nhầm lẫn cho người mới bắt đầu và là một yếu tố chính làm chậm việc áp dụng nhánh phát triển mới nhất.

Vào tháng 1 năm 2020, sau nhiều năm trì hoãn thời hạn, hỗ trợ cho Python 2.7 cuối cùng đã bị loại bỏ. Tuy nhiên, mặc dù thiếu các bản cập nhật bảo mật và cảnh báo do một số cơ quan chính phủ đưa ra, vẫn còn rất nhiều dự án vẫn chưa được di chuyển:

Brendan Eich đã tạo ra JavaScript vào năm 1995, nhưng ECMAScript mà chúng ta biết ngày nay đã được chuẩn hóa hai năm sau đó. Kể từ đó, chỉ có một số ít các bản phát hành, trông có vẻ trì trệ so với nhiều phiên bản Python mới được phát hành mỗi năm trong cùng khoảng thời gian.

Lưu ý khoảng cách giữa ES3 và ES5, kéo dài cả thập kỷ! Do xung đột chính trị và bất đồng trong ủy ban kỹ thuật, ES4 không bao giờ đến được với trình duyệt web, nhưng nó đã được Macromedia (sau này là Adobe) sử dụng làm cơ sở cho ActionScript.

Lần đại tu lớn đầu tiên đối với JavaScript diễn ra vào năm 2015 với sự ra đời của ES6, còn được gọi là ES2015 hoặc ECMAScript Harmony . Nó mang lại nhiều cấu trúc cú pháp mới, làm cho ngôn ngữ trở nên thuần thục, an toàn và thuận tiện hơn cho lập trình viên. Nó cũng đánh dấu một bước ngoặt trong lịch trình phát hành ECMAScript, hiện hứa hẹn sẽ có một phiên bản mới mỗi năm.

Tốc độ nhanh như vậy có nghĩa là bạn không thể cho rằng phiên bản ngôn ngữ mới nhất đã được tất cả các trình duyệt web lớn áp dụng vì cần có thời gian để tung ra các bản cập nhật. Đó là lý do tại sao chuyển tiếp và polyfills chiếm ưu thế. Ngày nay, hầu hết mọi trình duyệt web hiện đại đều có thể hỗ trợ ES5, là mục tiêu mặc định cho các trình chuyển đổi.

Thời gian chạy

Để chạy một chương trình Python, trước tiên bạn cần tải xuống, cài đặt và có thể định cấu hình trình thông dịch của nó cho nền tảng của bạn. Một số hệ điều hành cung cấp trình thông dịch sẵn có, nhưng nó có thể không phải là phiên bản bạn đang muốn sử dụng. Có các triển khai Python thay thế, bao gồm CPython , PyPy , Jython , IronPython hoặc Stackless Python . Bạn cũng có thể chọn từ nhiều bản phân phối Python , chẳng hạn như Anaconda , đi kèm với các gói của bên thứ ba được cài đặt sẵn.

JavaScript thì khác. Không có chương trình độc lập nào để tải xuống. Thay vào đó, mọi trình duyệt web lớn đều có một số loại công cụ JavaScript và một API, cùng nhau tạo nên môi trường thời gian chạy. Trong phần trước, bạn đã tìm hiểu về Node.js, cho phép chạy mã JavaScript bên ngoài trình duyệt. Bạn cũng biết về khả năng nhúng JavaScript vào các ngôn ngữ lập trình khác.

Hệ sinh thái

Một hệ sinh thái ngôn ngữ bao gồm môi trường thời gian chạy, khuôn khổ, thư viện, công cụ và phương ngữ cũng như các phương pháp hay nhất và các quy tắc bất thành văn của nó. Sự kết hợp nào bạn chọn sẽ phụ thuộc vào trường hợp sử dụng cụ thể của bạn.

Ngày xưa, bạn không cần nhiều hơn một trình soạn thảo mã tốt để viết JavaScript. Bạn sẽ tải xuống một số thư viện như jQuery , Underscore.js hoặc Backbone.js hoặc dựa vào Mạng phân phối nội dung (CDN) để cung cấp chúng cho khách hàng của bạn. Ngày nay, số lượng câu hỏi bạn cần trả lời và các công cụ bạn cần có để bắt đầu xây dựng ngay cả một trang web đơn giản nhất cũng có thể khiến bạn nản lòng.

Quá trình xây dựng cho một ứng dụng giao diện người dùng cũng phức tạp như đối với một ứng dụng phụ, nếu không muốn nói là hơn thế. Dự án web của bạn trải qua quá trình linting, chuyển đổi, polyfilling, nhóm, thu nhỏ và hơn thế nữa. Rất tiếc, ngay cả các biểu định kiểu CSS cũng không còn đủ nữa và cần phải được biên dịch từ một ngôn ngữ mở rộng bởi bộ xử lý trước như Sass hoặc Less .

Để giảm bớt điều đó, một số khung công tác cung cấp các tiện ích thiết lập cấu trúc dự án mặc định, tạo tệp cấu hình và tải xuống các phụ thuộc cho bạn. Ví dụ: bạn có thể tạo một ứng dụng React mới bằng lệnh ngắn này, miễn là bạn đã có Node.js mới nhất trên máy tính của mình:

$ npx create-react-app todo

Tại thời điểm viết bài, lệnh này mất vài phút để hoàn thành và cài đặt một con số khổng lồ 166 MB trong 1.815 gói! So sánh điều này với việc bắt đầu một dự án Django bằng Python, tức thì:

$ django-admin startproject blog

Hệ sinh thái JavaScript hiện đại là rất lớn và không ngừng phát triển, điều này khiến chúng ta không thể đưa ra một cái nhìn tổng quan toàn diện về các yếu tố của nó. Bạn sẽ gặp rất nhiều công cụ nước ngoài khi học JavaScript. Tuy nhiên, các khái niệm đằng sau một số chúng nghe có vẻ quen thuộc. Đây là cách bạn có thể ánh xạ chúng trở lại Python:

Danh sách này không đầy đủ. Bên cạnh đó, một số công cụ được đề cập ở trên có khả năng chồng chéo, vì vậy thật khó để đưa ra so sánh giữa táo và táo trong từng loại.

Đôi khi không có sự tương đồng trực tiếp giữa Python và JavaScript. Ví dụ: trong khi bạn có thể quen với việc tạo môi trường ảo riêng biệt cho các dự án Python của mình, Node.js xử lý điều đó bằng cách cài đặt các phần phụ thuộc vào một thư mục cục bộ.

Ngược lại, các dự án JavaScript có thể yêu cầu các công cụ bổ sung dành riêng cho phát triển front-end. Một trong những công cụ như vậy là Babel , công cụ này chuyển mã của bạn theo nhiều plugin khác nhau được nhóm thành các cài đặt trước. Nó có thể xử lý các tính năng ECMAScript thử nghiệm cũng như TypeScript và thậm chí cả cú pháp mở rộng JSX của React .

Một loại công cụ khác là gói mô-đun , có vai trò là hợp nhất nhiều tệp nguồn độc lập thành một tệp mà trình duyệt web có thể dễ dàng sử dụng.

Trong quá trình phát triển, bạn muốn chia nhỏ mã của mình thành các mô-đun có thể sử dụng lại, có thể kiểm tra và độc lập . Điều đó hợp lý đối với một lập trình viên Python có kinh nghiệm. Thật không may, JavaScript ban đầu không hỗ trợ mô đun. Bạn vẫn cần sử dụng một công cụ riêng cho việc đó, mặc dù yêu cầu này đang thay đổi. Các lựa chọn phổ biến cho các gói mô-đun là webpack , Parcel và Browserify , cũng có thể xử lý các tài sản tĩnh.

Sau đó, bạn có các công cụ tự động hóa xây dựng như Grunt và gulp . Chúng gần giống với Fabric và Ansible trong Python, mặc dù chúng được sử dụng cục bộ. Những công cụ này tự động hóa các tác vụ nhàm chán như sao chép tệp hoặc chạy trình chuyển tiếp.

Trong một ứng dụng trang đơn (SPA) quy mô lớn với nhiều phần tử giao diện người dùng tương tác, bạn có thể cần một thư viện chuyên biệt như Redux hoặc MobX để quản lý trạng thái . Các thư viện này không bị ràng buộc với bất kỳ khung giao diện người dùng cụ thể nào nhưng có thể được kết nối nhanh chóng.

Như bạn có thể thấy, tìm hiểu hệ sinh thái JavaScript là một hành trình vô tận.

Mô hình bộ nhớ

Cả hai ngôn ngữ đều tận dụng khả năng quản lý bộ nhớ heap tự động để loại bỏ lỗi của con người và giảm tải nhận thức. Tuy nhiên, điều này không hoàn toàn giải phóng bạn khỏi nguy cơ bị rò rỉ bộ nhớ và nó làm tăng thêm một số chi phí hiệu suất.

Lưu ý: Rò rỉ bộ nhớ xảy ra khi một phần bộ nhớ không còn cần thiết vẫn bị chiếm dụng không cần thiết và không có cách nào để phân bổ nó vì nó không còn có thể truy cập được từ mã của bạn. Nguồn rò rỉ bộ nhớ phổ biến trong JavaScript là các biến toàn cục và các bao đóng chứa các tham chiếu mạnh đến các đối tượng không còn tồn tại.

Việc triển khai CPython chính thống sử dụng việc đếm tham chiếu cũng như thu thập rác không xác định (GC) để xử lý các chu trình tham chiếu. Đôi khi, bạn có thể bị buộc phải phân bổ và lấy lại bộ nhớ theo cách thủ công khi bạn tham gia viết mô-đun mở rộng C tùy chỉnh .

Trong JavaScript, việc triển khai quản lý bộ nhớ thực tế cũng được để lại cho công cụ và phiên bản cụ thể của bạn vì nó không phải là một phần của đặc tả ngôn ngữ. Chiến lược cơ bản để thu gom rác thường là thuật toán đánh dấu và quét , nhưng có nhiều kỹ thuật tối ưu hóa khác nhau.

Ví dụ, heap có thể được tổ chức thành các thế hệ tách biệt các vật thể tồn tại trong thời gian ngắn với các vật thể tồn tại lâu dài. Quá trình thu gom rác có thể chạy đồng thời để giảm tải luồng thực thi chính. Thực hiện một cách tiếp cận gia tăng có thể giúp tránh đưa chương trình dừng lại hoàn toàn trong khi bộ nhớ được dọn dẹp.

Khóa học PYTHON (IPD2020) cho người mới bắt đầu