Câu 1Khi mới chỉ lưu mã nguồn, file đó nằm ở bộ phận nào?
Chương trình là gì — quan hệ với CPU, bộ nhớ và lưu trữ
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.
Chương trình là một chuỗi lệnh, khi bạn chạy nó thì nó được nạp vào bộ nhớ và CPU thực hiện từng lệnh một. Các sơ đồ cho thấy vì sao chỉ lưu thì chưa chạy, bắt đầu từ việc 3 bộ phận chia việc ra sao.
Bài viết này nói về những gì xảy ra bên trong máy tính khi một chương trình chạy.
Lưu file và chạy file là hai sự việc khác nhau bên trong máy tính.
Khác biệt đó giải thích được bằng việc 3 bộ phận CPU, bộ nhớ và lưu trữ đảm nhiệm những gì.
- Chương trình là một chuỗi lệnh, chạy nó là đi từ trên xuống từng dòng một
- Cách CPU, bộ nhớ và lưu trữ chia việc, và thứ gì mất đi khi tắt nguồn
- Vì sao chỉ lưu thì chưa chạy — phần được ghi chỉ đi tới lưu trữ
- Câu "hãy chạy" trong hướng dẫn trao gì cho môi trường chạy
Chương trình là một dãy lệnh, chạy nó là đi theo thứ tự từ trên xuống
Chương trình (program) là các lệnh bạn muốn máy tính thực hiện, xếp theo đúng thứ tự thực hiện.
Phần chữ mà con người đọc được là mã nguồn (source code), còn việc thực hiện từng lệnh một từ trên xuống là chạy (run / execute).
3 dòng xếp bên trái sơ đồ là nội dung của app.js, và CPU lúc nào cũng chỉ nhận 1 dòng.
Dòng chỉ ghi nhớ giá trị thì không đưa gì lên màn hình.
Khi dòng thứ 3 xong thì lượt chạy kết thúc, giá trị nhớ giữa chừng cũng không còn lại.
Nếu một lệnh giữa chừng không thực hiện được thì lượt chạy kết thúc ngay ở đó.
Trong 3 dòng sau, cái tên gokei ở giữa không được viết ở đâu cả.
console.log("In ra tổng");
gokei();
console.log("Đã xong");
"Dừng vì lỗi" nghĩa là lượt chạy kết thúc trước khi tới dòng cuối.
Dòng đầu vẫn hiện lên màn hình, dòng giữa cho ra dòng chữ báo lỗi, còn dòng cuối kết thúc mà không được đọc.
Chương trình là chuỗi lệnh thực hiện từ trên xuống
Chương trình là những việc bạn muốn máy làm, viết ra theo thứ tự.
Chạy là thực hiện chuỗi đó từng lệnh một từ trên xuống, và nếu một dòng giữa chừng không thực hiện được thì các dòng sau nó kết thúc mà không được đọc.
CPU, bộ nhớ và lưu trữ đảm nhiệm những gì
"Máy tính" trong sơ đồ trước gồm 3 bộ phận có vai trò khác nhau.
Bộ phận thực hiện từng lệnh một là CPU (Central Processing Unit), bộ phận chỉ chứa nội dung trong lúc đang chạy là bộ nhớ (memory), còn bộ phận giữ lại kể cả khi tắt nguồn là lưu trữ (storage).
1 file nằm trong lưu trữ trở thành một chuỗi lệnh bên trong bộ nhớ, và CPU chỉ nhận 1 lệnh trong số đó.
Giá trị giữa chừng của phép tính cũng nằm trong bộ nhớ, còn file trong lưu trữ thì không bị thay đổi trong lúc chạy.
3 bộ phận này được chia trong 1 máy tính như sau.
- File app.js đã lưu
- Vẫn còn nguyên kể cả khi tắt nguồn
- Nội dung app.js đã được nạp vào
- Các giá trị nhớ giữa chừng như 150 và 200
- Tắt nguồn là mất sạch
- Chỉ nhận đúng 1 lệnh đang thực hiện
- Các lệnh đã xong thì không còn giữ nữa
Thứ di chuyển chỉ là nội dung; bản thân app.js trong lưu trữ vẫn nằm nguyên đó.
Thứ vào bộ nhớ chỉ là cái đang chạy lúc này và các giá trị giữa chừng của nó.
Ranh giới này cũng xuất hiện trong cách đọc các cảnh báo máy tính đưa ra.
"Thiếu bộ nhớ" là chuyện của bộ nhớ, nên xóa file thường không làm nó tăng lên.
"Thiếu dung lượng trống" là chuyện của lưu trữ, cái này xóa file thì tăng lên.
Chỗ để cất và chỗ để chạy là hai chỗ khác nhau
Chỗ cất các file là lưu trữ, chỗ đặt thứ đang chạy lúc này là bộ nhớ, còn thứ thực hiện từng lệnh một là CPU.
Thứ đã ghi vào lưu trữ vẫn còn khi tắt nguồn, còn thứ nằm trong bộ nhớ thì mất đi.
Vì sao chỉ lưu file thì chưa chạy
Lưu là ghi các ký tự của mã nguồn vào lưu trữ.
Nơi được ghi vào là bên trong thư mục my-app, ứng dụng đặt chỗ bạn đang làm.
- app.js — mã nguồn bạn đã lưu
- Lưu lại lần nữa thì nội dung file này thay đổi
- File ảnh và tài liệu
- Các file không chạy cũng nằm nguyên ở đó
CPU không bao giờ tự đi đọc file đặt ở đây.
Ở trạng thái mới chỉ lưu, chưa một lệnh nào được thực hiện.
| Thao tác | Lưu trữ | Bộ nhớ | Màn hình |
|---|---|---|---|
| Chỉ lưu | app.js được ghi vào | Không có gì vào | Không hiện gì |
| Lưu rồi chạy | app.js vẫn nguyên | Được nạp vào và bắt đầu chạy | Hiện ra 350 |
Hàng chỉ lưu dừng lại ở lưu trữ, và vì không có gì vào bộ nhớ nên CPU không nhận được lệnh nào.
Màn hình không có gì xảy ra vì bạn chưa ra lệnh chạy.
Khi bạn chạy lại, nội dung cũ trong bộ nhớ bị bỏ đi và file mới được nạp vào.
Nội dung bạn sửa chạy đúng vào lúc lần nạp lại đó xảy ra.
Đây là lý do hướng dẫn viết "hãy chạy lại".
Lưu không phải là đã có hiệu lực
Lưu chỉ đi tới bước ghi các ký tự vào lưu trữ.
Chương trình đang chạy vẫn đi tiếp với nội dung ở thời điểm nó được nạp, nên dù bạn sửa file thì kết quả trên màn hình cũng không đổi cho tới khi bạn chạy lại.
"Hãy chạy" nghĩa là trao file cho môi trường chạy
Thứ nạp file vào bộ nhớ và đưa lệnh tới CPU là môi trường chạy (runtime, phần mềm đọc mã nguồn và cho CPU thực hiện các lệnh).
Câu "hãy chạy" trong hướng dẫn nghĩa là trao file cho môi trường chạy này.
Thứ bạn tự gõ chỉ là 1 dòng ngoài cùng bên trái.
1 dòng đó xuất hiện trong hướng dẫn dưới dạng thế này.
# Chạy mã nguồn JavaScript (Node.js)
node app.js
# Chạy mã nguồn Python
python app.py
1 dòng này là câu lệnh (command, chỉ thị bằng chữ để nói cho phần mềm biết phải làm gì).
Đầu câu là tên môi trường chạy, phía sau là tên file mã nguồn, giữa hai phần ngăn nhau bằng dấu cách.
- node — đọc mã nguồn JavaScript
- python — đọc mã nguồn Python
- app.js — tên file mã nguồn bạn đã lưu
- Môi trường chạy nạp file này từ lưu trữ
- Đôi khi người ta viết một tên ngắn đã quy ước thay cho tên file
Nhìn đầu câu là biết cần môi trường chạy nào, nhìn phía sau là biết file nào được nạp.
Màn hình để gõ 1 dòng này thì bài "Môi trường phát triển là gì" trong khóa học này sẽ nói tới.
Dù ngôn ngữ có đổi, cách đọc vẫn thế: đầu câu là phần mềm nhận, phía sau là thứ bạn trao cho nó.
Còn một chỗ nữa mà câu chữ trong hướng dẫn khác nhau.
Sau khi bạn ra lệnh chạy, cách kết thúc chia làm 2.
Nhánh dưới là loại chương trình mà hướng dẫn bảo bạn cứ để nó chạy tiếp.
Cũng có môi trường chạy tự nạp lại mỗi lần bạn lưu.
Kể cả khi đó, màn hình chỉ đổi sau khi file mới đã được nạp.
Ra lệnh chạy nghĩa là trao đi một file
"Hãy chạy" nghĩa là hãy trao file cho phần mềm gọi là môi trường chạy.
Cách trao là 1 dòng như node app.js, và có loại chạy tới dòng cuối rồi kết thúc, có loại không kết thúc cho tới khi bạn dừng.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2"Chạy một chương trình" nghĩa là máy tính làm gì?
Câu 3Trong câu lệnh node app.js, chữ node ở đầu chỉ cái gì?