Lỗi biên dịch là gì

0

Bạn chưa đăng nhập, vui lòng đăng nhập để thêm câu trả lời.

Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng [?]

1.     Vì sao phải tuân thủ đúng quy trình phát triển phần mềm? Khi bắt đầu giải quyết một bài toán trên máy tính hay thiết kết một phần mềm dù rất nhỏ thì cá nhân hay nhóm lập trình cần tuân thủ  đúng các bước trong quy trình phát triển phần mềm sau: 1.     Xác định yêu cầu [Specify the problem] 2.     Phân tích yêu cầu [Analysis the problem] 3.     Thiết kế giải thuật [Design the algorithm] 4.     Hiện thực giải thuật [Implement the algorimth] 5.     Kiểm thử và kiểm chứng [Test and Verify the program] 6.     Bảo trì và cập nhật phần mềm [Maintain and update the program] Việc tuân thủ các bước trong quy trình này sẽ giúp ta hạn chế các lỗi lớn trong lập trình và giúp ta giải giải quyết các bài toán phức tạp, các chương trình lớn một cách chính xác và đúng với yêu cầu hơn. Bạn cần tránh việc đọc qua loa yêu cầu xong bắt đầu code theo ý nghĩ trong đầu, nghĩ đến đâu code đến đó mà chưa nắm rõ các yêu cầu , cũng như chưa xác định được cách thức cụ thể để giải quyết bài toán hay không biết giải pháp của mình có khả thi hay không. Với thói quen lập trình này này bạn chỉ có thể viết được các chương trình đơn giản và là một rào cản rất lớn để bạn có thể viết được các chương trình có độ khó và phức tạp cao. Ngay cả khi bạn là một lập trình viên có nhiều năm kinh nghiệm, hiếm khi chương trình bạn chay ngay từ lần thử nghiệm đầu tiên. Hãy luôn nhớ rằng “ Nếu chương trình có thể sai, thì nó sẽ sai” , định luật Murphy dường như rất đúng trong  lập trình. Trong thực tế  lỗi phần mềm rất thường xảy ra. Thuật ngữ Bugs đề cập các lỗi các lập trình viên gặp phải trong quá trình sửa lỗi chương trình hay gọi là “debugging”. Khi trình biên dịch tìm ra lỗi, máy tính sẽ hiển thị các thông báo chỉ ra cụ thể lỗi mắc phải hoặc nguyên nhân có thể gây ra lỗi. Nhưng không phải lúc nào  lỗi cũng dễ dàng phát hiện ra và đôi khi các thông báo lỗi gây hiểu lầm cho lập trình viên. Khi bạn có kinh nghiệm bạn sẽ trở nên giỏi hơn trong việc định vị lỗi và sữa chữa lỗi.

2.     Hiểu rõ hơn về Bugs

Lỗi [Bugs] được phân thành ba loại chính là: ·        Lỗi cú pháp [syntax errors] ·        Lỗi thực thi [run-time errors] ·        Lỗi luận lý [logic errors] Độ khó để tìm ra lỗi cũng tăng dần theo thứ tự liệt kê các loại lỗi ở trên. Nghĩa là lỗi cú pháp sẽ dễ dàng phát hiện nhất và lỗi luận lý sẽ khó phát hiện nhất. Sau đây chúng ta sẽ phân tích sâu vào nguyên nhân, nguyên tắc để tránh lỗi cũng như một số lỗi thường gặp như là một kinh nghiệm để chúng ta chuẩn đoán lỗi nhanh và chính xác hơn.

3.     Lỗi cú pháp [syntax errors]

Lỗi cú pháp được phát hiện bởi trình biên dịch khi biên dịch chương trình. Nếu một câu lệnh mắc lỗi cú pháp, nó sẽ không được biên dịch và chương trình của bạn sẽ không được thực thi. Để tránh lỗi cú pháp bạn cần nắm vững các cú pháp đã được quy định trong Ngôn ngữ lập trình mà bạn sử dụng; Đọc kỹ các thông báo lỗi của trình biên dịch; Trong đa số các trường hợp nên bắt đầu sửa lỗi từ thông báo đầu tiên và biên dịch lại sau mỗi lần sửa xong một lỗi cú pháp vì trình biên dịch thường thông báo hàng loạt lỗi phát sinh từ một lỗi gốc. Xét đoạn code trong ví dụ sau:

Ta nhận được các thông báo lỗi sau từ Visual C++ 2010:


Đoạn code trong ví dụ chỉ tồn tại một lỗi tại dòng code số 1 nhưng ta thấy trình biên dịch báo đến bốn lỗi. Trong Visual C++ ta có thể xem lỗi trong cửa sổ Output hoặc Error List. Thông thường ta lần vết từ thông báo lỗi đầu tiên và số thứ tự của dòng code để chẩn đoán nơi tồn tại lỗi và biên dịch lại mỗi khi sửa xong để tiếp tục tìm lỗi khác. Có vô số lỗi cú pháp mà lập trình viên thường mắc phải. Nếu là người mới học lập trình thì bạn nên cố gắng hết sức có thể để tránh những lỗi cú pháp liệt kê dưới đây:
  Chẩn đoán thông thường Thông báo Cách sữa lỗi
1 Thiếu dấu ‘;’ kết thúc câu lệnh Expected a ‘;’
Missing ‘;’ before identifier
Thêm dấu ‘;’ trước câu lệnh chứa identifier ‘…’
2 Chưa khai báo kiểu dữ liệu ‘…’ : undeclared identifier Khai báo dữ liệu
3 Khai báo dữ liệu nhiều lần '…' : redefinition; multiple initialization
 
Dùng tên khác hoặc xóa đi
4 Dùng hàm / thành viên không có tồn tại trong struct / class 'm' : is not a member of 's'
 
Thêm ‘m’ vào ‘s’
Hoặc xóa ‘m’
5 Các cặp ‘[‘ và ‘]’ không tương ứng Syntax Error: ’]’ expected Thêm hoặc xóa bớt cho tương ứng
6 Phép gán không tương đồng về kiểu dữ liệu, không thể gán '=' : cannot convert from 'type1' to 'type2'
 
Làm cho 2 vế của phép gán tương đồng hoặc có thể gán được
7 Hàm có kiểu trả về thiếu câu lệnh return ‘…’ must return a value Thêm câu lệnh return cuối hàm
8 Số lượng đối số truyền cho hàm khác với định nghĩa hàm ‘…’: Function does not take n argument Truyền số đối số cho hàm đúng như đã định nghĩa hàm
9 Kiểu của đối số truyền vào hàm không đúng '…' : cannot convert parameter n from ' ‘type 1' to 'type 2' Chỉnh sưa kiểu ‘type1’ cho giống với ‘type2’ đã định nghĩa trong hàm
...      

Câu trả lời là “ Có”. Một số lỗi cú pháp tồn tại trong chương trình nhưng trình biên dịch không báo lỗi hoặc bỏ qua hoặc chỉ cảnh báo [Warning] và vẫn thực thi chương trình.Thông thường, các lỗi này thường sẽ gây lỗi cấp cao hơn như lỗi run-time hay lỗi logic hoặc gây mất mát dữ liệu. Ví dụ một số lỗi cú pháp mà trình biên dịch không báo lỗi như sau: ·        Sử dụng  ‘;’ sau các cấu trúc điều khiển, cấu trúc lặp, làm mất hiệu lực của các cấu trúc:   if [a == 0]; {        c = d; }   for [int i = 0; i < 3; i ++];   {        printf ["Hello! "]; }   Nếu a khác 0 thì phép gán c = d vẫn thực hiện. Câu lệnh in chỉ được thực hiện 1 lần thay vì 3 lần như mong muốn. ·        Sử dụng nhầm phép so sánh ‘=’ thay vì ‘= =’: if [a = b] {      C ; }      b luôn bằng a, c sẽ không được thực thi nếu b khác 0. Điều này gây nên lỗi logic.   ·        Sử dụng nhầm phép so sánh ‘=!’ thay vì ‘!=’: if [a =! b] {      c; }      a được gán bằng với not[b]. . Điều này gây nên lỗi logic. ·        Sử dụng thiếu chặt chẽ trong phép toán luận lý:                                                      if [0 < a < 5]                              {                                        c;                                                      }                                   c luôn được thực thi vì if luôn đúng [0

Chủ Đề