Khác biệt giữa các ngôn ngữ lập trình, và framework với thư viện

Bài viết này nằm trong khóa Kiến thức nền tảng về CNTT, xây dựng từ đầu những kiến thức CNTT thực tế tối thiểu mà bạn cần để lập trình và vibe coding.
Python và JavaScript chỉ khác nhau ở cách viết, việc bạn làm thì như nhau. Các sơ đồ sẽ giúp bạn phân biệt được thư viện với framework qua chiều của lệnh gọi.

Bài viết này bàn về khác biệt giữa các ngôn ngữ lập trình, và framework với thư viện.

Bạn sẽ phân biệt được một cái tên như React hay Next.js là ngôn ngữ, hay là thứ được viết bằng một ngôn ngữ.

Bài nói về Python và JavaScript, cùng bốn cái tên: React, Next.js, Django và Flutter.

Mọi cái tên trong sách nhập môn đều thuộc một trong ba loại
Ngôn ngữThư việnFrameworkPythonJavaScriptReactNext.jsDjangoQuy tắc để bạn tựviết từng dòngĐược gọi từmã của bạnBạn viết mã vàonhững chỗ định sẵnCó đi kèm vớimôi trường chạyChiều gọi có phảitừ bạn ra ngoàiChiều gọi có phảitừ ngoài vào bạn
Hàng trên là cách gọi, hàng giữa là ví dụ tiêu biểu, hàng dưới là quan hệ của nó với mã của bạn. Cột ngoài cùng bên phải là thứ cần kiểm tra khi bạn gặp cái tên đó.

Ngôn ngữ lập trình là gì — cú pháp khác nhau, nhưng nội dung viết thì giống

Ngôn ngữ lập trình (programming language: bộ từ vựng và quy tắc viết dùng để viết mã nguồn) đi kèm với một môi trường chạy.

Thứ khác nhau là cú pháp (syntax: quy tắc về việc viết một câu lệnh bằng ký hiệu nào và theo trật tự từ nào).

Cùng vai tròPythonJavaScript
Đặt tên cho một giá trịa = 3let a = 3;
Rẽ nhánh theo điều kiệnif a > 2:if (a > 2) {
In ra màn hìnhprint(a)console.log(a)

Python đánh dấu một khối bằng dấu : ở cuối dòng và phần thụt lề, còn JavaScript đánh dấu bằng ; và { }.

Trong bốn dòng sau, ba dòng trên viết theo kiểu JavaScript, dòng cuối viết theo kiểu Python.

let a = 3;
let b = 4;
console.log(a + b);
console.log(len([a, b]))

Sau khi dòng thứ ba in ra 7, nó dừng lại ở dòng cuối.

Dù bạn muốn làm cùng một việc, viết khác kiểu thì môi trường chạy không đọc được.

Ngôn ngữ khác nhau ở cách viết, còn việc làm thì giống nhau

Ngôn ngữ lập trình là bộ quy tắc về ký hiệu và trật tự từ khi bạn viết mã.

Đặt tên cho giá trị, rẽ nhánh theo điều kiện và lặp lại là những cơ chế ngôn ngữ nào cũng có, chỉ khác ở cách viết và ở môi trường chạy đọc chúng.

Thư viện và framework — lệnh gọi chạy theo hai chiều ngược nhau

Thư viện (library) và framework (framework) đều là tập hợp các chương trình người khác viết, bạn dùng chúng để tự viết ít đi.

Việc chỉ định một chức năng của chương trình khác theo tên rồi cho nó chạy gọi là gọi (call).

Khác biệt giữa hai thứ này là chiều của lệnh gọi đó.

Chỗ cần nhìnThư việnFramework
Từ tiếng Anhlibraryframework
Bên trong có gìCác chương trình có một chức năng cụ thểLuồng xử lý của cả ứng dụng
Quan hệ với mã của bạnBạn gọi nó từ mã của mìnhBạn viết thêm vào những chỗ định sẵn
Chiều của lệnh gọiMã của bạn → thư việnFramework → mã của bạn
Thứ quyết định luồngMã của bạnFramework
Chiều của lệnh gọi phụ thuộc vào bên nào nằm ngoài
Khi bạn dùng thư viện
  • Thứ môi trường chạy cho chạy là mã của bạn (app.js)
Mã của bạn (app.js)
  • Quyết định luồng của cả chương trình
  • Gọi thư viện ở những chỗ cần
Thư viện
  • Chỉ chạy khi được gọi
  • Xong thì quay lại mã của bạn
Khi bạn dùng framework
  • Thứ môi trường chạy cho chạy là framework
Framework
  • Luồng của cả ứng dụng đã được viết sẵn
  • Gọi mã của bạn ở những chỗ định sẵn
Mã của bạn (trong các file định sẵn)
  • Chỉ chạy khi được gọi
  • Chỗ viết và tên gọi đều đã được định sẵn
Khung trên là khi bạn dùng thư viện, khung dưới là khi bạn dùng framework. Bên nào nằm ngoài thì quyết định luồng tổng thể, còn bên trong chỉ chạy khi được gọi.

Ở khung dưới, bên trong và bên ngoài đổi chỗ cho nhau, và framework gọi mã của bạn.

Bên nào nằm ngoài thì quyết định luồng tổng thể.

Gọi một thư viện thì chỉ mất một dòng, thay vì hàng chục dòng bạn phải tự viết.

Chỉ khác nhau ở chỗ ai đã viết phần xử lý đó.

Với thư viện phải cài trước khi gọi, nếu bạn gọi mà chưa cài thì chương trình dừng với lỗi.

Các tài liệu hướng dẫn cũng gọi chúng là "package" hay "module", và bài "Quản lý package là gì" sẽ bàn về cơ chế đó.

Framework cho ứng dụng web mang sẵn luồng từ lúc nhận request cho tới lúc trả về response.

Phạm vi framework đảm nhận trong một ứng dụng web
Phạm vi framework đảm nhận
  • Nhận request đến từ trình duyệt
  • Nhìn URL rồi tìm phần xử lý tương ứng
  • Dựng response từ kết quả nhận lại rồi trả về
Chỗ bạn viết mã của mình
  • Chỉ chạy khi được gọi
  • Đọc ghi cơ sở dữ liệu rồi tạo ra kết quả
  • Trả kết quả đã tạo về cho framework
Khung ngoài là phần framework đảm nhận, từ lúc nhận request tới lúc dựng response. Chỉ khung bên trong mới là chỗ bạn viết mã của mình.

Ba việc ở bên ngoài do framework làm, nên bạn không viết chúng.

Lý do dùng framework là để khỏi phải tự viết phần bên ngoài.

Mã của bạn chỉ chạy ở bước thứ ba, còn trước và sau đó là việc của framework.

URL nào chạy phần nào cũng chỉ là thứ bạn ghi sẵn ở một chỗ định sẵn.

Bên gọi, hay bên được gọi

Thư viện và framework đều là chương trình người khác viết, khác nhau ở chỗ bên nào nằm ngoài.

Thư viện được gọi từ bên trong mã của bạn, còn framework gọi mã của bạn từ bên ngoài và quyết định luồng tổng thể.

React, Next.js, Django và Flutter là gì — xếp các tên vào ba loại

Bạn đọc những cái tên xuất hiện trong khóa học bằng cách xếp mỗi cái vào ngôn ngữ, thư viện hay framework.

Next.js không phải ngôn ngữ; nó là một framework được viết bằng JavaScript.

Framework và thư viện, đặt bên trong ngôn ngữ của chúng
Thứ viết bằng JavaScript
  • Mã cho các màn hình chạy trong trình duyệt
  • Mã phía server chạy trên node
Next.js (framework)
  • Tách file trang theo từng URL
  • Viết được cả phần xử lý phía server
  • Dựng màn hình bằng React
React (thư viện)
  • Dựng các bộ phận của màn hình
  • Gọi được mà không cần dùng Next.js
Thứ viết bằng Python
  • Mã cho phân tích dữ liệu và tự động hóa
  • Mã cho phần xử lý phía server
Django (framework)
  • Gắn URL với phần xử lý
  • Đọc ghi cơ sở dữ liệu
  • Cơ chế đăng nhập
Thứ viết bằng Dart
  • Mã cho ứng dụng điện thoại
Flutter (framework)
  • Màn hình và hành vi của ứng dụng điện thoại
  • Từ một bộ mã ra cả iPhone lẫn Android
Bên ngoài là ngôn ngữ, bên trong là những framework và thư viện bạn viết bằng ngôn ngữ đó. Thứ nằm bên trong thì viết theo cú pháp của ngôn ngữ bên ngoài.

React là thư viện dựng các bộ phận của màn hình, còn Next.js là framework dùng chính React đó và mang thêm cả phần xử lý phía server.

Flutter là framework để làm ứng dụng điện thoại, và bạn viết nó bằng một ngôn ngữ tên là Dart.

Việc từ một bộ mã làm ra được ứng dụng chạy trên nhiều hệ điều hành gọi là đa nền tảng (cross-platform).

Không cái tên nào trong đó là ngôn ngữ; mỗi cái là thứ bạn dùng kết hợp với mã của mình.

Cùng cái tên Next.js xuất hiện ở cả phía thiết bị lẫn phía server.

Đó là vì phạm vi nó đảm nhận thay đổi tùy theo nó chỉ dựng màn hình hay mang thêm cả phần xử lý phía server.

Ngay cả từ ứng dụng điện thoại làm bằng Flutter, nơi nó nối tới vẫn là cùng một server công khai.

Cái tên là ngôn ngữ, hay là thứ viết bằng ngôn ngữ

Next.js, React, Django và Flutter đều không phải ngôn ngữ; mỗi cái được viết bằng một ngôn ngữ nào đó.

Tra xem bạn viết nó bằng ngôn ngữ gì thì biết nó có phải bản thân ngôn ngữ hay không; tra chiều của lệnh gọi thì biết nó là thư viện hay framework.

Học ngôn ngữ nào trước — quyết theo việc thứ bạn muốn làm có cần màn hình trong trình duyệt hay không

Ngôn ngữ mà trình duyệt đọc được là JavaScript, nên phía màn hình (frontend) là JavaScript.

Phía xử lý (backend) chạy trên server, nên bạn viết bằng ngôn ngữ nào cũng được.

Từ thứ bạn muốn làm, tới ngôn ngữ đầu tiên, rồi tới những cái tên xuất hiện sau đó
Thứ muốn làmCần màn hình chạytrong trình duyệtCần màn hình chạytrên điện thoạiKhông cần màn hìnhtổng hợp, tự độngJavaScriptDart, v.v.PythonReactNext.jsFlutterDjangopandas
Một ô ở trên tách thành ba, và mỗi nhánh dẫn tới một ngôn ngữ bên dưới. Hàng dưới cùng là những framework và thư viện mà bạn sẽ thấy tên sau khi chọn ngôn ngữ đó.

Nếu bạn cần màn hình trong trình duyệt, phần đó nhất định là JavaScript.

Nếu không cần màn hình, hãy bắt đầu với Python, ngôn ngữ có nhiều thư viện bên ngoài cho phân tích dữ liệu và tự động hóa.

Các framework và thư viện ở hàng dưới cùng xuất hiện sau khi bạn chọn ngôn ngữ; chúng không phải thứ chọn trước.

Bắt đầu từ bên nào thì các cơ chế bạn học được cũng như nhau.

Hai lối đi cuối cùng gặp nhau ở cùng một chỗ.

Bắt đầu từ ngôn ngữ nào thì bạn cũng học được cùng những cơ chế đó
Nếu bạn bắt đầuvới PythonNếu bạn bắt đầuvới JavaScripta = 3if / whilelet a = 3;if / whileĐặt tên giá trịrẽ theo điều kiệnlặp lại
Hai lối đi bên trái và bên phải gộp lại thành một ở bên dưới. Bạn học hai cách viết riêng biệt, nhưng những cơ chế bạn đi tới thì chung nhau.

Thứ bạn học lại chỉ là cách viết và tên các thư viện dùng trong ngôn ngữ đó.

Hãy chọn một cái gần với thứ bạn muốn làm, rồi đi tiếp với nó.

Quyết được thứ muốn làm thì quyết được ngôn ngữ

Bạn quyết được ngôn ngữ theo thứ mình muốn làm, chứ không theo sở thích.

Nếu cần một màn hình chạy trong trình duyệt thì phần đó là JavaScript, còn nếu không cần thì bạn bắt đầu được với Python, và tới ngôn ngữ thứ hai, thứ bạn học lại chỉ là cách viết và tên các thư viện.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Next.js mà bạn gặp trong sách nhập môn là ngôn ngữ, thư viện, hay framework?

Câu 2Phát biểu nào về khác biệt giữa thư viện và framework là đúng?

Câu 3Vì sao mã phía màn hình của ứng dụng web được viết bằng JavaScript?