Một chương trình là một văn bản nhằm thể hiện tính toán của một kết quả trả lời một câu hỏi về dữ liệu. Ví dụ, một chương trình sắp xếp sẽ lấy một danh sách các giá trị (dữ liệu) và sẽ tính toán một kết quả là một danh sách khác có cùng giá trị, nhưng được sắp xếp theo một số hàm so sánh.
Văn bản này phải được thể hiện chính thức bằng một loại ngôn ngữ được xác định chính xác (hoặc nên), cả về những gì tạo thành văn bản chương trình hợp pháp và làm thế nào một số ý nghĩa tính toán có thể được liên kết với văn bản này. Một định nghĩa chính xác như vậy thường trừu tượng (có thể là toán học) và có thể bỏ qua một số vấn đề cụ thể như giới hạn máy tính.
Nhưng sau đó, ngôn ngữ được thực hiện để các chương trình có thể được thực thi. Lại có nhiều cách để thực hiện như vậy, bằng cách sử dụng một intepreter của văn bản chương trình gốc hoặc biên dịch sang một số mã trung gian (ví dụ mã byte), sau đó có thể diễn giải mã intemediate này hoặc biên dịch thêm vào mã máy. Và có thể có các biến thể khác. Và tất nhiên, có nhiều cách viết trình biên dịch hoặc trình thông dịch, và nhiều máy để chạy chúng.
Hơn nữa, có thể có một số định nghĩa chính thức, và một số triển khai, hy vọng phù hợp.
Lỗi có thể được phân loại trong mối quan hệ cấu trúc của một hoặc cả hai định nghĩa chính thức hoặc / và việc thực hiện. Tuy nhiên, bạn có thể gặp các tình huống lạ khi các lỗi được phân loại theo cách triển khai tham chiếu cũ không còn được sử dụng.
Điều này về cơ bản có nghĩa là phân loại lỗi là một chủ đề không thực sự ổn định . Hơn nữa, một số ngôn ngữ có thể phân biệt một số mức độ lỗi tùy thuộc vào việc có gì đó chắc chắn sai (chương trình thậm chí sẽ không chạy) hoặc liệu bạn có đang làm điều gì đó không được khuyến nghị hay không, nhưng điều đó vẫn sẽ tạo ra một số tính toán, điều đó có thể có ý nghĩa. Điều này thậm chí còn được phản ánh trong các tính năng của các ngôn ngữ lập trình như ngoại lệ, có thể hoặc không thể được phục hồi.
Phân biệt tiêu chuẩn là:
Lỗi cú pháp : văn bản đã cho không phù hợp với cấu trúc của văn bản chương trình, độc lập với ý nghĩa của nó. Điều này chỉ có thể đề cập đến một cú pháp ngôn ngữ chính thức, thường là không có ngữ cảnh. Đôi khi nó có thể đi xa hơn và bao gồm việc kiểm tra một số tính năng cơ bản như khai báo biến (nếu có) hoặc tính nhất quán của loại, mặc dù những điều này cũng có thể được coi là lỗi ngữ nghĩa.
Lỗi ngữ nghĩa hoặc logic : đây là những lỗi có thể được phát hiện khi thực sự chạy chương trình do thực tế là chương trình chạy vào một phép tính không có ý nghĩa ngữ nghĩa, chẳng hạn như chia cho 0 hoặc lập chỉ mục một mảng ngoài giới hạn. Gọi một hàm với số lượng đối số sai hoặc với các đối số sai loại cũng có thể được coi là một lỗi ngữ nghĩa. Trong một số ngôn ngữ, lỗi thực sự có thể được xác định bởi người dùng bằng các ngoại lệ, khi chúng tương ứng với một số ngữ nghĩa cấp cao hơn do người dùng xác định cho một phần của chương trình của mình (mặc dù có các cách sử dụng ngoại lệ khác). Một số lỗi này đôi khi cũng được gọi là lỗi thời gian chạy vì chúng được phát hiện trong thời gian chạy, nhưng chúng không nên bị nhầm lẫn với các lỗi giới hạn phần cứng.
Lỗi giới hạn phần cứng : đây là những lỗi do thực tế là việc triển khai trên một máy thật có những hạn chế. Ví dụ, đây có thể là một số nguyên quá lớn để phù hợp với một từ bộ nhớ hoặc thiếu bộ nhớ đủ để tạo cấu trúc dữ liệu. Chúng cũng thường được phát hiện trong thời gian chạy.
Liên quan đến lỗi ngữ nghĩa và lỗi giới hạn phần cứng, đôi khi có thể phát hiện ra chúng trước khi thực hiện chương trình, với cái được gọi là phân tích ngữ nghĩa tĩnh. Đây thường là trường hợp cho các khai báo hoặc các biến chưa được khởi tạo, hoặc cho các lỗi loại hoặc để chia cho 0 và một số kiểm tra ràng buộc mảng, nhưng nó có thể đi xa hơn nhiều. Phân tích ngữ nghĩa tĩnh cũng rất quan trọng trong trình biên dịch cho nhiều kỹ thuật tối ưu hóa. Thường có một sự tách biệt giữa ngữ nghĩa tĩnh và động. Định nghĩa tốt nhất tôi có thể tưởng tượng là ngữ nghĩa tĩnh liên quan đến các thuộc tính có thể quyết định tại thời điểm biên dịch, không có dữ liệu thực tế. Vì vậy, chia cho số 0 sẽ không phải là một phần của ngữ nghĩa tĩnh nói chung. Điều này nói lên rằng một số lỗi ngữ nghĩa động đôi khi vẫn có thể được phát hiện tại thời điểm biên dịch. Điều tương tự cũng xảy ra đối với các lỗi giới hạn phần cứng.
Nhưng mọi nhà thiết kế ngôn ngữ hoặc người thực hiện đều có quyền phân loại lỗi theo ý muốn , trừ khi bị ràng buộc bởi hợp đồng hoặc giấy phép. Đó cũng có thể là trường hợp cho ví dụ PHP của bạn. Và bất cứ ai cũng có thể phân biệt giữa các lỗi ngữ nghĩa và logic, mặc dù tôi sẽ không biết cách xác định sự khác biệt, trừ khi có thể được nói chi tiết về các lỗi này. Người ta có thể được sử dụng để biểu thị lỗi trong ý định (lỗi logic) và hệ thống sẽ không thể phát hiện được.
Lưu ý rằng có thể có các loại lỗi khác trong một chương trình , thường sẽ không được hệ thống phát hiện. Điều đó bao gồm sự không nhất quán cụ thể của chương trình với đặc điểm kỹ thuật của nó (hoặc cái mà tôi gọi là lỗi trong ý định: người dùng không làm những gì anh ta muốn làm), hoặc có thể lỗi trong chính đặc tả. Cũng có thể có lỗi do giới hạn phần cứng, chẳng hạn như lỗi làm tròn khi làm việc với số thực.