Thuật toán, Lập trình, Trình biên dịch
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| algorithm/ˈælɡərɪθəm/ | thuật toán |
| high-level language/haɪ ˈlevl ˈlæŋɡwɪdʒ/ | ngôn ngữ lập trình cấp cao |
| compiler/kəmˈpaɪlə/ | trình biên dịch |
| syntax error/ˈsɪntæks ˈerə/ | lỗi cú pháp |
| logic error/ˈlɒdʒɪk ˈerə/ | lỗi logic |
Một lần xây dựng sạch sẽ vẫn có thể bán sai giá
- Một chương trình cửa hàng dự định áp dụng mức giảm giá 10% lên giá 100, nhưng lại tính số tiền phải trả là giá * 10 / 100.
- Nó tính toán số tiền giảm giá, 10, thay vì giá đã giảm, 90. Mã code có thể biên dịch và chạy thành công dù đang áp dụng sai công thức.
Thuật toán là gì?
- Một thuật toán là một tập hợp các bước hữu hạn, có thứ tự để giải quyết một vấn đề. Công thức nấu ăn là một thuật toán: các bước chính xác, theo đúng thứ tự, dẫn đến kết quả.
- Lập trình là nghệ thuật biến một thuật toán thành mã nguồn mà máy tính có thể thực thi. Đối với các thuật toán hữu hạn được dạy ở đây, mỗi đầu vào hợp lệ phải dẫn đến một kết quả sau một số lượng bước hữu hạn. Một chương trình cũng có thể chạy các dịch vụ liên tục; không phải chương trình nào cũng là phép tính kết thúc.
Ngôn ngữ lập trình
- Máy tính chạy mã máy (dãy 0s và 1s thô) — rất khó để con người viết. Chúng ta viết bằng ngôn ngữ cấp cao như Java: dễ đọc, giống tiếng Anh.
- Mã Java nói làm gì; một trình dịch chuyển đổi nó thành lệnh máy. Khóa học này dạy giải quyết vấn đề thông qua Java.
Trình biên dịch
- Một trình biên dịch như javac chuyển đổi file nguồn Java thành các file class và kiểm tra ngữ pháp, kiểu dữ liệu cũng như tên gọi. Java được biên dịch sang bytecode, sau đó Java Virtual Machine (JVM) sẽ thực thi mã này.
- "Viết một lần, chạy mọi nơi": tệp class có thể chạy trên nhiều nền tảng khác nhau với JVM tương thích và các thư viện cần thiết; các phiên bản tệp class mới hơn đòi hỏi môi trường runtime hỗ trợ chúng. Lỗi biên dịch (bị phát hiện trước khi chạy) khác với lỗi thời gian chạy (bị phát hiện khi đang chạy).
Một thuật toán được mô tả tốt nhất là...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Các bước hữu hạn, có thứ tự kết thúc — đó là thuật toán.
Trình biên dịch Java dịch mã nguồn của bạn thành...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Java biên dịch thành bytecode, mà JVM thực thi.
Một chương trình biên dịch và chạy nhưng đưa ra kết quả sai thì có...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Kết quả sai dù biên dịch sạch = lỗi logic.
Lỗi cú pháp ngăn chặn một chương trình Java không thể biên dịch.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Ngôn ngữ sai → trình biên dịch từ chối xây dựng.
Nếu một chương trình biên dịch không có lỗi, nó được đảm bảo là chính xác.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Trình biên dịch kiểm tra cú pháp, kiểu dữ liệu và tên biến, nhưng không xác định được quy tắc kinh doanh mong muốn hay kết quả đầu ra chính xác.
Mọi ngoại lệ chạy thời (runtime exception) nhất thiết sẽ kết thúc chương trình, ngay cả khi mã xử lý ngoại lệ phù hợp đã bắt được nó.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một ngoại lệ có thể được bắt và xử lý; một ngoại lệ không được bắt có thể làm dừng thực thi.
Phép toán nào sau đây sẽ gây ra ArithmeticException cho biến int có giá trị 0?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Phép chia số nguyên cho không sẽ gây ra lỗi; phép chia số thập phân cho không sẽ tạo ra kết quả theo chuẩn IEEE floating-point.
Các loại lỗi
- Lỗi cú pháp làm gãy ngữ pháp của Java — trình biên dịch từ chối biên dịch. Lỗi thời gian chạy xảy ra trong quá trình thực thi; nếu có ngoại lệ (exception) không được bắt, chương trình có thể bị dừng. Phép chia nguyên với biến bằng không sẽ ném ra ArithmeticException, trong khi phép chia số thực tuân theo quy tắc khác.
- Lỗi logic chạy bình thường nhưng đưa ra kết quả sai. Gỡ lỗi là tìm và sửa cả ba loại lỗi này.
Từ mã nguồn đến chương trình đang chạy
Xem cách mã nguồn Java trở thành chương trình đang chạy.
Một chương trình biên dịch được không đồng nghĩa với việc nó hoàn toàn chính xác. Trình biên dịch bắt được lỗi cú pháp và các lỗi thời điểm biên dịch khác, bao gồm lỗi về kiểu dữ liệu và tên gọi. Lỗi logic — công thức sai, điều kiện sai — có thể biên dịch sạch sẽ và chạy, nhưng tạo ra kết quả sai. Luôn thử nghiệm đầu ra của thuật toán, không chỉ kiểm tra xem nó có biên dịch được hay không.
Match each defect to its category.
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
The categories depend on when and how the defect is detected; successful compilation does not establish the intended result.
Thuật toán tìm số lớn hơn giữa hai số a và b:
- Bước 1: nếu
a > b, đáp án làa. - Bước 2: ngược lại, đáp án là
b. - Hữu hạn, có thứ tự và luôn kết thúc — một thuật toán hợp lệ, sẵn sàng để code trong Java.
Mở rộng suy luận sang trường hợp mới
- Kiểm tra kết quả giảm giá so với các trường hợp đã biết. Với ví dụ này, 100 nên cho kết quả là 90 và 0 nên cho kết quả là 0; hãy bao gồm một đầu vào không tròn dưới chính sách làm tròn được nêu rõ thay vì giả định phép chia nguyên là phép toán thập phân.
- Trình biên dịch còn bắt được lỗi kiểu dữ liệu và tên gọi, không chỉ lỗi dấu câu. Ngược lại, một ngoại lệ có thể được xử lý trong lúc thực thi; việc biên dịch sạch sẽ không đảm bảo kết quả mong muốn hoặc không có sự cố thời gian chạy.
Một thuật toán là tập hợp các bước hữu hạn, có thứ tự giải quyết vấn đề; lập trình biến nó thành code. Java là ngôn ngữ bậc cao mà một trình biên dịch dịch sang bytecode cho JVM. Hãy chú ý lỗi cú pháp, lỗi thời điểm chạy, và lỗi logic — việc编译 sạch sẽ không đảm bảo kết quả đúng.