it-swarm-vi.com

Làm thế nào đến trình biên dịch là rất đáng tin cậy?

Chúng tôi sử dụng trình biên dịch hàng ngày như thể tính chính xác của chúng là nhất định, nhưng trình biên dịch cũng là chương trình và có khả năng chứa lỗi. Tôi luôn tự hỏi về sự mạnh mẽ không thể sai lầm này. Bạn đã bao giờ gặp phải một lỗi trong trình biên dịch? Nó là gì và làm thế nào bạn nhận ra vấn đề nằm ở chính trình biên dịch?

... và làm thế nào do họ làm cho trình biên dịch trở nên đáng tin cậy như vậy?

67
EpsilonVector

Họ được kiểm tra kỹ lưỡng thông qua việc sử dụng bởi hàng ngàn hoặc thậm chí hàng triệu nhà phát triển theo thời gian.

Ngoài ra, vấn đề cần giải quyết được xác định rõ (bằng một đặc điểm kỹ thuật rất chi tiết). Và bản chất của nhiệm vụ cho vay dễ dàng cho các bài kiểm tra đơn vị/hệ thống. I E. về cơ bản, nó đang dịch đầu vào văn bản theo một định dạng rất cụ thể sang đầu ra ở một loại định dạng khác được xác định rõ (một số loại mã byte hoặc mã máy). Vì vậy, nó rất dễ dàng để tạo và xác minh các trường hợp thử nghiệm.

Hơn nữa, thông thường các lỗi cũng dễ tái tạo: ngoài thông tin phiên bản nền tảng và trình biên dịch chính xác, thông thường tất cả những gì bạn cần là một đoạn mã đầu vào. Chưa kể rằng người dùng trình biên dịch (là chính nhà phát triển) có xu hướng đưa ra các báo cáo lỗi chính xác và chi tiết hơn nhiều so với bất kỳ người dùng máy tính trung bình nào :-)

101
Péter Török

Ngoài tất cả các câu trả lời tuyệt vời cho đến nay:

Bạn có một "thiên vị quan sát". Bạn không quan sát lỗi và do đó bạn cho rằng không có lỗi nào.

Tôi đã từng nghĩ như bạn. Sau đó, tôi bắt đầu viết trình biên dịch chuyên nghiệp, và để tôi nói với bạn, có rất nhiều lỗi trong đó!

Bạn không thấy các lỗi vì bạn viết mã giống như 99,999% của tất cả các mã còn lại mà mọi người viết. Bạn có thể viết mã hoàn toàn bình thường, đơn giản, chính xác rõ ràng gọi các phương thức và chạy các vòng lặp và không làm bất cứ điều gì lạ mắt hoặc kỳ lạ, bởi vì bạn là một nhà phát triển bình thường giải quyết các vấn đề kinh doanh bình thường.

Bạn không thấy bất kỳ lỗi trình biên dịch nào vì các lỗi trình biên dịch không nằm trong các kịch bản mã thông thường đơn giản dễ phân tích; các lỗi nằm trong phân tích mã lạ mà bạn không viết.

Mặt khác, tôi có sự thiên vị quan sát ngược lại. Tôi thấy mã điên cả ngày mỗi ngày, và vì vậy với tôi các trình biên dịch dường như bị đầy lỗi.

Nếu bạn ngồi xuống với đặc tả ngôn ngữ của bất kỳ ngôn ngữ nào và thực hiện bất kỳ triển khai trình biên dịch nào cho ngôn ngữ đó và thực sự cố gắng để xác định xem trình biên dịch có thực hiện chính xác thông số đó hay không, tập trung vào các trường hợp góc tối, bạn sẽ sớm tìm thấy trình biên dịch lỗi khá thường xuyên. Để tôi cho bạn một ví dụ, đây là lỗi trình biên dịch C # tôi tìm thấy đúng năm phút trước.

static void N(ref int x){}
...
N(ref 123);

Trình biên dịch đưa ra ba lỗi.

  • Một đối số ref hoặc out phải là một biến có thể gán.
  • Kết quả phù hợp nhất cho N (ref int x) có đối số không hợp lệ.
  • Thiếu "ref" trong đối số 1.

Rõ ràng thông báo lỗi đầu tiên là chính xác và thông báo lỗi thứ ba là một lỗi. Thuật toán tạo lỗi đang cố gắng tìm ra lý do tại sao đối số đầu tiên không hợp lệ, nó nhìn vào nó, thấy rằng đó là một hằng số và không quay lại mã nguồn để kiểm tra xem nó có được đánh dấu là "ref" hay không; thay vào đó, nó giả định rằng không ai đủ ngu ngốc để đánh dấu một hằng số là ref và quyết định rằng ref phải bị thiếu.

Không rõ thông báo lỗi thứ ba chính xác là gì, nhưng đây không phải là thông báo. Trong thực tế, không rõ liệu thông báo lỗi giây có đúng hay không. Nên giải quyết quá tải không thành công, hay "ref 123" nên được coi là đối số ref của loại đúng? Bây giờ tôi sẽ phải suy nghĩ một chút và nói chuyện với nhóm xử lý để chúng tôi có thể xác định hành vi chính xác là gì.

Bạn chưa bao giờ thấy lỗi này bởi vì có lẽ bạn sẽ không bao giờ làm điều gì ngớ ngẩn đến mức cố gắng vượt qua 123 bằng ref. Và nếu bạn đã làm như vậy, có lẽ bạn sẽ không nhận thấy rằng thông báo lỗi thứ ba là vô nghĩa, vì thông báo đầu tiên là chính xác và đủ để chẩn đoán vấn đề. Nhưng tôi cố gắng làm những thứ như vậy, vì tôi đang cố gắng để phá vỡ trình biên dịch. Nếu bạn đã thử, bạn cũng sẽ thấy các lỗi.

66
Eric Lippert

Bạn đang đùa tôi à Trình biên dịch có lỗi quá, tải thực sự.

GCC có lẽ là trình biên dịch mã nguồn mở nổi tiếng nhất hành tinh và hãy xem cơ sở dữ liệu lỗi của nó: http://gcc.gnu.org/ormszilla/ormslist.cgi?product=gcc&component=c%2B% 2B & độ phân giải = ---

Giữa GCC 3.2 và GCC 3.2.3 hãy xem có bao nhiêu lỗi đã được sửa: http://gcc.gnu.org/gcc-3.2/changes.html

Đối với những người khác như Visual C++, tôi thậm chí không muốn bắt đầu.

Làm thế nào để bạn làm cho trình biên dịch đáng tin cậy? Để bắt đầu, họ có tải và tải các bài kiểm tra đơn vị. Và toàn bộ hành tinh sử dụng chúng để không có người thử nghiệm.

Nghiêm túc mà nói, các nhà phát triển trình biên dịch mà tôi muốn tin là những lập trình viên ưu việt và trong khi họ không thể sai lầm thì họ lại đóng gói rất nhiều.

54
Fanatic23

Tôi đã gặp hai hoặc ba trong ngày của tôi. Cách thực sự duy nhất để phát hiện một là nhìn vào mã hội.

Mặc dù trình biên dịch có độ tin cậy cao vì lý do các áp phích khác đã chỉ ra, tôi nghĩ độ tin cậy của trình biên dịch thường là một đánh giá tự hoàn thành. Các lập trình viên có xu hướng xem trình biên dịch là tiêu chuẩn. Khi có sự cố xảy ra, bạn cho rằng đó là lỗi của mình (vì 99,999% thời gian là như vậy) và thay đổi mã của bạn để khắc phục sự cố trình biên dịch thay vì cách khác. Ví dụ, mã bị lỗi trong cài đặt tối ưu hóa cao chắc chắn là lỗi trình biên dịch, nhưng hầu hết mọi người chỉ đặt nó thấp hơn một chút và tiếp tục mà không báo cáo lỗi.

21
Karl Bielefeldt

Trình biên dịch có một số thuộc tính dẫn đến tính chính xác của chúng:

  • Tên miền rất nổi tiếng, và được nghiên cứu. Vấn đề được xác định rõ, và các giải pháp được cung cấp được xác định rõ.
  • Kiểm tra tự động là đủ để chứng minh trình biên dịch hoạt động chính xác
  • Trình biên dịch có các bài kiểm tra đơn vị, rộng rãi, công khai, tự động và rộng rãi, đã được tích lũy theo thời gian để bao phủ nhiều không gian lỗi hơn so với hầu hết các chương trình khác
  • Trình biên dịch có một số lượng rất lớn nhãn cầu xem kết quả của họ
15
blueberryfields

Chúng tôi sử dụng trình biên dịch hàng ngày

... và làm thế nào để họ làm cho trình biên dịch đáng tin cậy như vậy?

Họ không. Chúng tôi làm. Bởi vì mọi người sử dụng chúng mọi lúc, lỗi được tìm thấy nhanh chóng.

Đây là một trò chơi số. Bởi vì trình biên dịch được sử dụng rất phổ biến, rất có khả năng bất kỳ lỗi nào sẽ được kích hoạt bởi ai đó, nhưng vì có số lượng người dùng lớn như vậy, nên rất có thể không chắc đó ai đó sẽ là bạn cụ thể.

Vì vậy, nó phụ thuộc vào quan điểm của bạn: trên tất cả người dùng, trình biên dịch bị lỗi. Nhưng rất có khả năng người khác sẽ biên dịch một đoạn mã tương tự trước khi bạn thực hiện, vì vậy nếu một lỗi, họ sẽ đánh chúng chứ không phải bạn, vì vậy từ cá nhân quan điểm, có vẻ như lỗi không bao giờ có.

Tất nhiên, trên hết, bạn có thể thêm tất cả các câu trả lời khác ở đây: trình biên dịch được nghiên cứu kỹ, hiểu rõ. Có một huyền thoại rằng họ rất khó viết, điều đó có nghĩa là chỉ những lập trình viên rất thông minh, rất giỏi mới thực sự cố gắng viết một bài, và hết sức cẩn thận khi họ làm. Chúng thường dễ kiểm tra, và dễ kiểm tra căng thẳng hoặc kiểm tra fuzz. Người dùng trình biên dịch có xu hướng trở thành chuyên gia lập trình, dẫn đến các báo cáo lỗi chất lượng cao. Và theo một cách khác: người viết trình biên dịch có xu hướng là người dùng trình biên dịch của riêng họ.

14
Jörg W Mittag

Ngoài tất cả các câu trả lời đã có, tôi muốn thêm:

Tôi tin rất nhiều lần, những người bán hàng đang ăn thức ăn cho chó của họ. Có nghĩa là, họ đang viết các trình biên dịch trong chính họ.

12
DevSolo

Tôi thường xuyên gặp phải lỗi biên dịch.

Bạn có thể tìm thấy chúng ở các góc tối hơn, nơi có ít người thử hơn. Ví dụ: để tìm lỗi trong GCC, bạn nên thử:

  • Xây dựng một trình biên dịch chéo. Bạn sẽ tìm thấy theo nghĩa đen hàng chục lỗi trong cấu hình và xây dựng tập lệnh của GCC. Một số kết quả trong các lỗi xây dựng trong quá trình biên dịch GCC và các kết quả khác sẽ dẫn đến lỗi trình biên dịch chéo để xây dựng các tệp thực thi làm việc.
  • Xây dựng một phiên bản Itanium của GCC bằng cách sử dụng profile-bootstrap. Vài lần cuối cùng tôi đã thử điều này trên GCC 4.4 và 4.5, nó đã thất bại trong việc tạo ra một trình xử lý ngoại lệ C++ hoạt động. Bản dựng không được tối ưu hóa hoạt động tốt. Không ai có vẻ quan tâm đến việc sửa lỗi tôi đã báo cáo và tôi đã từ bỏ việc tự sửa nó sau khi cố gắng tìm hiểu những gì đã phá vỡ trong thông số bộ nhớ asm GCC.
  • Hãy thử xây dựng GCJ làm việc của riêng bạn từ những thứ mới nhất mà không theo một kịch bản xây dựng phân phối. Tao thách mày.
8
Zan Lynx

Nhiều lý do:

  • Người viết trình biên dịch "ăn thức ăn cho chó của họ".
  • Trình biên dịch dựa trên các nguyên tắc được hiểu rõ của CS.
  • Trình biên dịch được xây dựng theo một thông số rõ ràng.
  • Trình biên dịch nhận đã kiểm tra.
  • Trình biên dịch là không phải lúc nào cũng rất đáng tin cậy.
6
Kramii

Họ thường rất giỏi ở mức -O0. Trong thực tế nếu chúng tôi nghi ngờ một lỗi trình biên dịch, chúng tôi so sánh -O0 với bất kỳ mức độ nào chúng tôi đang cố gắng sử dụng. Mức tối ưu hóa cao hơn đi với rủi ro lớn hơn. Một số thậm chí còn cố tình như vậy, và được dán nhãn như vậy trong tài liệu. Tôi đã gặp rất nhiều (ít nhất một trăm trong thời gian của tôi), nhưng gần đây chúng đang trở nên hiếm hơn. Tuy nhiên, trong việc theo đuổi các con số cụ thể tốt (hoặc các tiêu chuẩn khác quan trọng đối với tiếp thị), sự cám dỗ để đẩy các giới hạn là rất lớn. Chúng tôi đã gặp vấn đề vài năm trước khi một nhà cung cấp (không được đặt tên) quyết định vi phạm mặc định dấu ngoặc đơn - tập hợp hơn một số tùy chọn biên dịch được dán nhãn rõ ràng đặc biệt.

Thật khó để chẩn đoán lỗi trình biên dịch so với tham chiếu bộ nhớ đi lạc, biên dịch lại với các tùy chọn khác nhau có thể chỉ đơn giản là xáo trộn vị trí tương đối của các đối tượng dữ liệu trong bộ nhớ, vì vậy bạn không biết đó là Heisenorms của mã nguồn hay lỗi của bạn trình biên dịch. Ngoài ra, nhiều tối ưu hóa thực hiện các thay đổi hợp pháp theo thứ tự các thao tác hoặc thậm chí đơn giản hóa đại số cho đại số của bạn và chúng sẽ có các thuộc tính khác nhau đối với làm tròn điểm nổi và dưới/tràn. Thật khó để giải quyết các hiệu ứng này từ các lỗi THỰC SỰ. Lý do điểm nổi lõi cứng là khó khăn vì lý do này, bởi vì lỗi và độ nhạy số thường không dễ dàng để giải quyết.

5
Omega Centauri

Lỗi trình biên dịch không phải là hiếm. Trường hợp phổ biến nhất là trình biên dịch báo lỗi về mã cần được chấp nhận hoặc để trình biên dịch chấp nhận mã cần bị từ chối.

5
kevin cline

Bạn đã bao giờ gặp phải một lỗi trong trình biên dịch? Nó là gì và làm thế nào bạn nhận ra vấn đề nằm ở chính trình biên dịch?

Ừ!

Hai kỷ niệm đáng nhớ nhất là hai lần đầu tiên tôi từng chạy qua. Cả hai đều nằm trong trình biên dịch Lightspeed C cho máy Mac 680x0 vào khoảng 1985-7.

Cái đầu tiên là trong một số trường hợp, toán tử postrrement số nguyên không làm gì cả - nói cách khác, trong một đoạn mã cụ thể, "i ++" đơn giản là không làm gì với "i". Tôi đang kéo tóc ra cho đến khi tôi nhìn vào một sự tháo gỡ. Sau đó, tôi chỉ thực hiện tăng theo một cách khác và gửi báo cáo lỗi.

Thứ hai là một chút phức tạp hơn, và thực sự là một "tính năng" bị coi là sai lầm. Những máy Mac đời đầu có một hệ thống phức tạp để thực hiện các hoạt động đĩa cấp thấp. Vì một số lý do mà tôi chưa bao giờ hiểu - có lẽ phải làm với việc tạo các tệp thực thi nhỏ hơn - thay vì trình biên dịch chỉ tạo các hướng dẫn hoạt động của đĩa tại chỗ trong mã đối tượng, trình biên dịch Lightspeed sẽ gọi một hàm bên trong, khi chạy tạo ra hoạt động của đĩa hướng dẫn trên ngăn xếp và nhảy ở đó.

Điều đó đã làm việc rất tốt trên 68000 CPU, nhưng khi bạn chạy cùng một mã trên CPU 68020, nó thường sẽ làm những điều kỳ lạ. Hóa ra, một tính năng mới của 68020 là bộ đệm lệnh lệnh 256 byte nguyên thủy. Đây là những ngày đầu với bộ nhớ CPU, nó không có khái niệm bộ đệm bị "bẩn" và cần phải được nạp lại; Tôi đoán các nhà thiết kế CPU tại Motorola đã không nghĩ về mã tự sửa đổi. Vì vậy, nếu bạn đã thực hiện hai thao tác đĩa đủ gần nhau trong chuỗi thực thi của mình và thời gian chạy Lightspeed đã xây dựng các hướng dẫn thực tế tại cùng một vị trí trên ngăn xếp, CPU sẽ nhầm tưởng rằng nó có bộ đệm bộ đệm hướng dẫn và chạy hoạt động đĩa đầu tiên hai lần.

Một lần nữa, nhận ra rằng đã có một số hoạt động đào bới xung quanh với một trình dịch ngược và rất nhiều bước đơn trong một trình gỡ lỗi cấp thấp. Cách giải quyết của tôi là tiền tố mọi hoạt động của đĩa với một lệnh gọi đến một hàm đã thực hiện 256 lệnh "NOP", làm ngập (và do đó xóa) bộ đệm của lệnh.

Trong 25 năm kể từ đó, tôi đã thấy ngày càng ít lỗi trình biên dịch hơn theo thời gian. Tôi nghĩ rằng có một vài lý do cho việc đó:

  • Có một bộ kiểm tra xác nhận ngày càng tăng cho trình biên dịch.
  • Các trình biên dịch hiện đại thường được chia thành hai hoặc nhiều phần, một trong số đó tạo mã độc lập với nền tảng (ví dụ: LLVM nhắm mục tiêu những gì bạn có thể coi là CPU tưởng tượng) và phần khác chuyển nó thành hướng dẫn cho phần cứng đích thực tế của bạn. Trong các trình biên dịch đa nền tảng, phần đầu tiên được sử dụng ở mọi nơi, do đó, nó nhận được rất nhiều thử nghiệm trong thế giới thực.
4
Bob Murphy

Tìm thấy một lỗi phát sáng trong Turbo Pascal 5,5 năm trước. Một lỗi xuất hiện trong cả phiên bản (5.0) trước đó và phiên bản (6.0) tiếp theo của trình biên dịch. Và một thứ đáng lẽ phải dễ kiểm tra, vì nó hoàn toàn không phải là một cornercase (chỉ là một cuộc gọi không được sử dụng phổ biến).

Nói chung, chắc chắn các nhà xây dựng trình biên dịch thương mại (chứ không phải các dự án sở thích) sẽ có QA và quy trình thử nghiệm rất rộng rãi. Họ biết trình biên dịch của họ là các dự án hàng đầu của họ và các lỗ hổng đó sẽ trông rất tệ đối với họ, tệ hơn là họ nhìn vào các công ty khác sản xuất hầu hết các sản phẩm khác. Các nhà phát triển phần mềm là một nhóm không thể tha thứ, các nhà cung cấp công cụ của chúng tôi làm chúng tôi thất vọng, chúng tôi sẽ tìm kiếm các giải pháp thay thế thay vì chờ đợi sửa chữa từ nhà cung cấp và chúng tôi rất có thể truyền đạt thực tế đó cho các đồng nghiệp của mình, những người có thể theo dõi chúng tôi thí dụ. Trong nhiều ngành công nghiệp khác không phải như vậy, do đó, tổn thất tiềm tàng đối với nhà sản xuất trình biên dịch do lỗi nghiêm trọng lớn hơn nhiều so với nhà sản xuất phần mềm chỉnh sửa video.

4
jwenting

Đúng, tôi đã gặp một lỗi trong trình biên dịch ASP.NET chỉ ngày hôm qua:

Khi bạn sử dụng các mô hình được gõ mạnh trong các khung nhìn, sẽ có giới hạn về số lượng mẫu tham số có thể chứa. Rõ ràng là nó không thể lấy nhiều hơn 4 tham số mẫu, do đó cả hai ví dụ dưới đây làm cho trình biên dịch xử lý quá nhiều:

ViewUserControl<System.Tuple<type1, type2, type3, type4, type5>>

Sẽ không biên dịch như vậy nhưng sẽ nếu type5 bị xóa.

ViewUserControl<System.Tuple<MyModel, System.Func<type1, type2, type3, type4>>>

Sẽ biên dịch nếu type4 bị xóa.

Lưu ý rằng System.Tuple có quá nhiều tải và có thể mất tới 16 tham số (tôi biết là điên rồ).

3
user8685

Lỗi trình biên dịch xảy ra, nhưng bạn có xu hướng tìm thấy chúng ở các góc lẻ ...

Có một lỗi kỳ lạ trong trình biên dịch VAX VMS C của Tập đoàn Thiết bị Kỹ thuật số vào những năm 1990

(Tôi đang đeo hành tây trên thắt lưng, cũng như thời trang lúc đó)

Dấu chấm phẩy ngoại lai ở bất cứ đâu trước vòng lặp for sẽ được biên dịch thành phần thân của vòng lặp for.

f(){...}
;
g(){...}

void test(){
  int i;
  for ( i=0; i < 10; i++){
     puts("hello");
  }
}

Trên trình biên dịch trong câu hỏi, vòng lặp chỉ thực hiện một lần.

nó thấy

f(){...}
g(){...}

void test(){
  int i;
  for ( i=0; i < 10; i++) ;  /* empty statement for fun */

  {
     puts("hello");
  }
}

Điều đó làm tôi mất rất nhiều thời gian.

Phiên bản cũ hơn của trình biên dịch PIC C mà chúng tôi (đã từng) tạo ra cho sinh viên có kinh nghiệm làm việc không thể tạo mã sử dụng ngắt ưu tiên cao một cách chính xác. Bạn đã phải chờ 2-3 năm và nâng cấp.

Trình biên dịch MSVC 6 có một lỗi tiện lợi trong trình liên kết, nó sẽ bị lỗi phân đoạn và chết theo thời gian mà không có lý do. Một bản dựng sạch thường đã sửa nó (nhưng thở dài không phải lúc nào cũng vậy).

3
Tim Williscroft

Khi hành vi của phần mềm của bạn khác khi được biên dịch với -O0 và với -O2, thì bạn đã tìm thấy lỗi trình biên dịch.

Khi hành vi của phần mềm của bạn chỉ khác với những gì bạn mong đợi, thì rất có thể lỗi đó nằm trong mã của bạn.

2
mouviciel

Trong một số miền, chẳng hạn như phần mềm điện tử hàng không, có các yêu cầu chứng nhận cực kỳ cao, về mã và phần cứng, cũng như trên trình biên dịch. Về phần cuối cùng này, có một dự án nhằm tạo ra một trình biên dịch C được xác minh chính thức, được gọi là Compcert . Về lý thuyết, loại trình biên dịch này đáng tin cậy như chúng đến.

2
Axel

Tôi đã thấy một số lỗi trình biên dịch, đã báo cáo một vài lỗi (cụ thể là trong F #).

Điều đó nói rằng, tôi nghĩ rằng lỗi trình biên dịch rất hiếm vì những người viết trình biên dịch nói chung rất thoải mái với các khái niệm khắt khe của khoa học máy tính khiến họ thực sự ý thức về ý nghĩa toán học của mã.

Hầu hết trong số họ có lẽ rất quen thuộc với những thứ như tính toán lambda, xác minh chính thức, ngữ nghĩa biểu thị, v.v. - những thứ mà một lập trình viên trung bình như tôi chỉ có thể hiểu được.

Ngoài ra, thường có một ánh xạ khá đơn giản từ đầu vào đến đầu ra trong trình biên dịch, vì vậy việc gỡ lỗi một ngôn ngữ lập trình có lẽ dễ dàng hơn nhiều so với gỡ lỗi, giả sử, một công cụ blog.

2
Rei Miyasaka

Tôi đã tìm thấy một lỗi trong trình biên dịch C # cách đây không lâu, bạn có thể thấy Eric Lippert (người trong nhóm thiết kế C #) đã tìm ra lỗi đó là gì ở đây .

Ngoài các câu trả lời đã được đưa ra, tôi muốn thêm một vài điều nữa. Trình thiết kế trình biên dịch thường là những lập trình viên cực kỳ giỏi. Trình biên dịch rất quan trọng: hầu hết các chương trình được thực hiện bằng trình biên dịch, do đó, trình biên dịch bắt buộc phải có chất lượng cao. Do đó, vì lợi ích tốt nhất của các công ty sản xuất trình biên dịch để đặt những người giỏi nhất của họ vào đó (hoặc ít nhất, những người rất giỏi: những người giỏi nhất có thể không thích thiết kế trình biên dịch). Microsoft rất muốn các trình biên dịch C và C++ của họ hoạt động bình thường hoặc phần còn lại của công ty không thể thực hiện công việc của họ.

Ngoài ra, nếu bạn đang xây dựng một trình biên dịch thực sự phức tạp, bạn không thể hack nó cùng nhau. Logic đằng sau trình biên dịch rất phức tạp và dễ chính thức hóa. Do đó, các chương trình này thường sẽ được xây dựng theo cách rất 'mạnh mẽ' và chung chung, có xu hướng dẫn đến ít lỗi hơn.

2
Alex ten Brink