Trình biên dịch và thông dịch viên có thể có lỗi không, và chúng ta (với tư cách là người dùng) có thể làm gì để đối phó với chúng? [đóng cửa]


28

Nếu công việc của một trình biên dịch về cơ bản là dịch mã nguồn thành mã cấp độ máy, thì có thể có bất kỳ trục trặc nào trong trình biên dịch, tức là "bản dịch" bị lỗi không?

Điều tương tự cũng xảy ra với một trình thông dịch: đôi khi nó có thể không xuất nội dung được yêu cầu không?

Tôi chưa nghe thấy bất kỳ lỗi nào trong trình biên dịch / trình thông dịch, nhưng chúng có tồn tại không?


6
trong quá trình phát triển, chúng chắc chắn sẽ tồn tại, chỉ cần nhìn vào bugtracker trên bất kỳ trình biên dịch mã nguồn mở nào
ratchet freak

7
Tôi chưa nghe thấy bất kỳ lỗi nào trong trình biên dịch / trình thông dịch, nhưng chúng có tồn tại không? Tôi tìm thấy danh sách gửi thư cho các lỗi trong trình biên dịch gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
Đây không phải là một câu hỏi thực sự tốt, nó chỉ hỏi một cái gì đó là lẽ thường.

12
Không có ý kiến ​​hay câu trả lời nào cho đến nay có khả năng gặp phải lỗi trình biên dịch. Trước tiên hãy chắc chắn loại trừ lỗi trong mã của bạn.
Dan Pichelman

6
Câu trả lời ngắn gọn: chắc chắn. Trong khi các IDE và trình biên dịch thường được thực hiện trong một inch cuộc sống của chúng trước khi chúng nhìn thấy thế giới bên ngoài, luôn có một trường hợp góc ở đâu đó mà một nhà phát triển quá thông minh sẽ tìm thấy.
KeithS

Câu trả lời:


51

Vâng

Bạn có xu hướng tìm thấy chúng nhiều hơn trong các ngôn ngữ đang được tích cực phát triển hơn so với những ngôn ngữ tương đối trưởng thành (và do đó không thấy nhiều thay đổi trên cơ sở thường xuyên). Đây có lẽ là lý do tại sao hầu hết các ngôn ngữ được phát hành ở các 'giai đoạn' ổn định khác nhau. Bản dựng hàng đêm ít có khả năng ổn định hơn nhiều so với một ứng cử viên phát hành , bản thân nó ít có khả năng ổn định hơn so với phiên bản được phát hành đầy đủ và được sử dụng tích cực.

May mắn thay, hầu hết các ngôn ngữ này (đặc biệt là các ngôn ngữ là nguồn mở) sẽ có hệ thống theo dõi lỗi công khai mà bạn có thể gửi báo cáo.

Theo kinh nghiệm của riêng tôi, tôi gặp phải một lỗi khá mơ hồ nhưng nghiêm trọng trong Scala trên Windows . Tôi đã gửi những phát hiện của mình cho trình theo dõi lỗi và vấn đề đã được khắc phục khá nhanh. Trong trường hợp đó, các nhà phát triển ngôn ngữ đủ thông minh để đưa một ghi chú hữu ích vào đầu ra nhật ký lỗi, cho thấy rằng những gì tôi gặp phải trên thực tế là lỗi trình biên dịch và cho biết nơi gửi báo cáo.


Hy vọng bạn không phiền; Tôi đã thêm một đoạn mới (đang chờ phê duyệt) mà tôi nghĩ có thể có liên quan. Trình biên dịch không chỉ có thể chứa lỗi mà còn có thể chứa mã độc.
Andy

@Andy có vẻ như một trong những người điều hành đã từ chối nó như một điều gì đó nên là một nhận xét hoặc câu trả lời riêng biệt.
KChaloux

Không chỉ là "có", mà là "địa ngục có!" :-)
Hellion

C vừa trưởng thành vừa tích cực phát triển. C ++ cũng vậy. Java cũng vậy. vv ..
djechlin

100

Theo cách nói của giáo dân:

Tất cả các chương trình có thể có lỗi.

Trình biên dịch là chương trình.

Ergo, trình biên dịch có thể có lỗi.


55
Đáng lo ngại hơn: Trình gỡ lỗi là chương trình. Do đó, trình gỡ lỗi có lỗi.
Daniel Gratzer

19
@jozefg: Vậy làm thế nào để bạn gỡ lỗi trình gỡ lỗi? Ai theo dõi những người theo dõi?
Thất vọngWithFormsDesigner

16
@FrustratedWithFormsDesigner Người theo dõi, duh.
Jimmy Hoffa

9
@JoelFan Vì tôi đã viết "có thể có", ngoại lệ đó được đề cập. Nếu bạn nói "có", bạn phải xác định rằng bạn chỉ đề cập đến các chương trình không tầm thường. Bằng cách nói "có thể có", bạn không cần phải làm vậy.
Tulains Córdova

8
Các chương trình "Hello world" có thể có lỗi nếu nó tuân thủ trình biên dịch lỗi.
wtsang02



4

Tất nhiên, vì trình biên dịch là phần mềm.

Vào năm 2005, tôi đã có một đoạn mã bị lỗi trong một phần mềm cực kỳ quan trọng mà tôi đã viết cho một công ty lớn. Vì chi phí của công ty là hàng triệu đô la để cải chính, nên tất nhiên họ đã mở một cuộc điều tra lớn.

Rất may (theo quan điểm của tôi), vấn đề hóa ra là vấn đề biên dịch trong Delphi. Trong khối thử cuối cùng, giá trị trả về của hàm đã bị hủy và dẫn đến kết quả hoàn toàn ngẫu nhiên trở lại cho người gọi. Điều này đã được ghi nhận và thừa nhận bởi Borland.

.NET nổi tiếng là có hàng trăm rò rỉ bộ nhớ khác nhau, đặc biệt là trong các lần triển khai đầu tiên.

Tôi sẽ tranh luận rằng không có thứ gọi là phần mềm không có lỗi. Trình biên dịch cũng không ngoại lệ. Mặc dù vậy, chúng được kiểm tra kỹ lưỡng hơn hầu hết các phần mềm kinh doanh và được sử dụng bởi những người thông minh, quan trọng, hay tranh cãi, vì vậy, hồ sơ theo dõi của họ thực sự, về tổng thể, là khá tốt.


Có phần mềm "chính thức xác minh". Nó được chứng minh về mặt toán học để làm việc. Đôi khi ngay cả mã chính thức được xác minh có lỗi. Việc triển khai quicksort của IIRC Java đã được xác minh chính thức, nhưng điều đó không giải thích cho việc tràn.
David Plumpton

1
Phần mềm là gì? C'mon :)
Rocklan

2

Không chỉ lỗi, mà còn cố tình phần mềm độc hại.

Các trojan "đăng nhập" được Brian Kernighan triển khai cho trình biên dịch Unix C ban đầu là phần nổi tiếng nhất trong số này; bài viết http://cm.bell-labs.com/who/ken/trust.html có một số nền tảng về điều này.


1
Có rõ ràng rằng điều đó đã thực sự được thực hiện?
Keith Thompson

Đây là một chủ đề khá thú vị, nhưng hoàn toàn không liên quan đến câu hỏi này.

@delnan Tôi không đồng ý; cốt lõi của câu hỏi dường như là "tôi có thể tin tưởng bao nhiêu vào trình biên dịch của mình?"
Andy

1

Tất nhiên, giống như bất kỳ trình biên dịch phần mềm nào cũng có lỗi, ví dụ như danh sách lỗi gcc có ở đây


0

Vâng.

Ngoài ra, không chỉ với trình biên dịch, mà còn với Trình thông dịch / trình gỡ lỗi và bất kỳ công cụ phần mềm bên thứ 3 nào.

Chúng tôi hiện đang sử dụng một số phần mềm của bên thứ 3 và đã gặp phải một số vấn đề. Đôi khi họ cảm ơn chúng tôi, vì đã tìm và báo cáo lỗi. :)

Một số trong số họ cũng có một số rò rỉ bộ nhớ, dẫn đến sụp đổ. Câu hỏi quan trọng ở đây có thể là, làm thế nào để xác định xem công cụ của bên thứ 3 hoặc trình biên dịch có lỗi để ứng dụng của bạn hoạt động chính xác không?


Câu hỏi quan trọng của bạn sau đó sẽ dẫn trở lại vấn đề Ngừng
wtsang02

0

Trình biên dịch là một chương trình đọc một chương trình được viết bằng một ngôn ngữ (ngôn ngữ nguồn) và dịch nó sang một chương trình tương đương khác bằng ngôn ngữ khác (ngôn ngữ đích), chủ yếu là ngôn ngữ máy.

Có các giai đoạn khác nhau của trình biên dịch thông qua đó mã ngôn ngữ nguồn của bạn được quét theo từng dòng. Có một bảng biểu tượng theo dõi tất cả các Từ khóa được quét trong mã ngôn ngữ nguồn.

Giai đoạn 1: Trình phân tích từ vựng - đọc tất cả các ký tự trong chương trình nguồn và hình thành sự phân tách logic của các mã thông báo (int, char, float, if-other, for, while, v.v.)

Giai đoạn 2: Phân tích cú pháp - phân tích cấu trúc của dòng mã thông báo. Phân tích cú pháp phân cấp các biểu thức bao gồm hậu tố / tiền tố, v.v. (a = b + c * d)

Giai đoạn 3: Trình phân tích ngữ nghĩa - Kiểm tra loại mã thông báo (số nguyên thành số thực, số dư, v.v.) và nhiều thứ như ưu tiên toán tử, v.v.

Giai đoạn 4: Trình tạo mã trung gian - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

Giai đoạn 5: Tối ưu hóa mã - Phân tích khác nhau (luồng điều khiển, luồng dữ liệu, biến đổi)
tạo ra: Mã dự phòng, propogation hằng, mã chết một phần, biểu thức con chung, mã bất biến vòng lặp

Giai đoạn 6: Tạo mã - Tạo mã mục tiêu (Chủ yếu là ngôn ngữ hội) đưa các giá trị vào các thanh ghi

Tất cả các giai đoạn này không có gì ngoài các chương trình được viết tốt và có thể có N số lỗ hổng trong đó ..


-1

Tất nhiên, trình biên dịch chỉ là chương trình và tác giả của chúng cũng là kẻ ngốc :). Ngay cả đặc tả ngôn ngữ có thể có một lỗi. Thí dụ: c # + foreach + lambda .

Hoặc trong Python, lỗi trong trình thông dịch: Biên dịch trình thông dịch lỗi ast ast .

Chà, nếu bạn muốn xem xét các lỗi trong trình biên dịch / interpeter -> hãy xem php. Có một lỗi nổi tiếng với tràn số nguyên. Sửa chữa đầu tiên bắt đầu từ if (size > INT_MAX) return NULL;. Tiếp tục câu chuyện .


Trình biên dịch không phải là kẻ ngốc. Vì trình biên dịch khá phức tạp, rào cản để vào trường cũng cao hơn đáng kể. Vì vậy, chúng ta có thể mong đợi những người viết chúng sẽ không phạm sai lầm như những người bình thường.
jszpilewski

Foreach / lambda không phải là một lỗi, nó đi đến một quyết định thiết kế cụ thể và lương tâm được đưa ra trước khi lambdas được thêm vào.
Andy

@Andy, như tôi biết, không ai biết quyết định này sẽ gây ra vấn đề gì. Tại sao không lỗi?
Viktor Lova

@jszpilewski bạn có thấy nụ cười sau văn bản đó không?
Viktor Lova

1
Tôi khuyên bạn nên đọc lại OP, vì câu hỏi của anh ấy không phải là về việc liệu các thông số kỹ thuật có thể có lỗi hay không, đó là về việc liệu MÁY TÍNH có thể có lỗi hay không. Do trình biên dịch C # khớp với đặc tả, trình biên dịch không có lỗi. Tôi cũng đề nghị bạn đọc lại trích dẫn Wikipedia của riêng bạn "Lỗi phần mềm là lỗi, lỗi, lỗi hoặc lỗi trong chương trình máy tính"
Andy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.