Steve Yegge đã viết một bài đăng blog tuyệt vời rằng, phần nào gián tiếp, giải quyết điều này.
Điểm lớn # 1: trình biên dịch bao gồm khá nhiều khía cạnh của khoa học máy tính. Chúng là một khóa học cấp cao hơn bởi vì bạn cần biết tất cả những điều khác bạn học trong chương trình khoa học máy tính chỉ để bắt đầu. Cấu trúc dữ liệu, tìm kiếm và sắp xếp, hiệu suất tiệm cận, tô màu đồ thị? Tất cả đều ở đó.
Có một lý do Knuth đã làm việc với "Nghệ thuật lập trình máy tính" hoành tráng (và không bao giờ kết thúc) của mình trong nhiều thập kỷ, mặc dù nó bắt đầu như (chỉ) một cuốn sách giáo khoa biên dịch. Cũng giống như cách Carl Sagan nói "Nếu bạn muốn tạo ra một chiếc bánh táo từ đầu, trước tiên bạn phải phát minh ra vũ trụ", nếu bạn muốn viết một trình biên dịch, trước tiên bạn phải đối phó với gần như mọi khía cạnh của khoa học máy tính.
Điều đó có nghĩa là nếu trình biên dịch tự lưu trữ, thì nó khá chắc chắn để có thể làm những gì tôi cần, bất kể tôi đang làm gì. Ngược lại, nếu bạn không viết trình biên dịch bằng ngôn ngữ của mình, rất có thể nó sẽ bỏ lỡ điều gì đó thực sự quan trọng đối với ai đó, bởi vì những người thực hiện ngôn ngữ không bao giờ phải viết một chương trình đòi hỏi họ phải suy nghĩ về tất cả những vấn đề đó.
Điểm lớn thứ 2: từ 30.000 feet, một số vấn đề đáng ngạc nhiên trông giống như trình biên dịch.
Trình biên dịch lấy một luồng các ký hiệu, tìm ra cấu trúc của chúng theo một số quy tắc được xác định trước theo miền cụ thể và chuyển đổi chúng thành một luồng ký hiệu khác. Nghe có vẻ khá chung chung phải không? À vâng.
Cho dù bạn có thuộc nhóm Visual C ++ hay không, bạn sẽ rất thường xuyên thấy mình cần phải làm một cái gì đó trông giống như một phần của trình biên dịch. Tôi làm điều đó theo nghĩa đen mỗi ngày.
Không giống như hầu hết các ngành nghề khác, lập trình viên không chỉ sử dụng các công cụ, mà xây dựng các công cụ của riêng họ. Một lập trình viên không thể (do thiếu kỹ năng hoặc thiếu công cụ có thể sử dụng để xây dựng các công cụ khác) công cụ viết sẽ mãi mãi bị vô hiệu hóa, giới hạn trong các công cụ mà người khác cung cấp.
Nếu một ngôn ngữ "không phù hợp để tạo" các chương trình có thể lấy một luồng ký hiệu, áp dụng quy tắc cho chúng và biến nó thành một luồng ký hiệu khác, thì âm thanh đó có vẻ là một ngôn ngữ khá hạn chế và không phải là ngôn ngữ hữu ích với tôi.
(May mắn thay, tôi không nghĩ rằng có nhiều ngôn ngữ lập trình không phù hợp với việc chuyển đổi các biểu tượng. C có lẽ là một trong những ngôn ngữ tồi tệ nhất được sử dụng ngày nay, tuy nhiên trình biên dịch C thường tự lưu trữ, do đó không bao giờ dừng bất kỳ ai.)
Một lý do thứ ba tôi sẽ kết thúc, từ kinh nghiệm cá nhân, không được đề cập bởi Yegge (vì anh ta không viết về "tại sao tự lưu trữ"): nó loại bỏ các lỗi. Khi bạn đang viết một trình biên dịch, điều đó có nghĩa là mỗi khi bạn xây dựng nó (không chỉ mỗi lần bạn chạy nó), bạn phụ thuộc vào nó để làm việc và hoạt động chính xác với một cơ sở mã có kích thước phù hợp (chính trình biên dịch).
Tháng này tôi đã sử dụng một trình biên dịch không tự lưu trữ tương đối mới và nổi tiếng (bạn có thể đoán được cái nào) và tôi không thể đi 2 ngày mà không làm hỏng việc. Tôi tự hỏi bao nhiêu nhà thiết kế thực sự phải sử dụng nó.