Sự khác biệt giữa mã được giải thích và biên dịch có lẽ là một hư cấu, như được nhấn mạnh bởi nhận xét của Raphael :
the claim seems to be trivially wrong without further assumptions: if there is
an interpreter, I can always bundle interpreter and code in one executable ...
Thực tế là mã luôn được diễn giải, bằng phần mềm, bằng phần cứng hoặc kết hợp cả hai và quá trình biên dịch không thể biết nó sẽ là gì.
Những gì bạn cho là biên dịch là một quá trình dịch từ một ngôn ngữ (cho nguồn) sang ngôn ngữ khác (cho mục tiêu). Và, người phiên dịch cho thường khác với người phiên dịch cho .STST
Chương trình được biên dịch được dịch từ một dạng cú pháp sang một dạng cú pháp khác , như vậy, với ngữ nghĩa dự định của các ngôn ngữ và , và có cùng một hành vi tính toán, cho đến một vài điều mà bạn thường cố gắng thay đổi, có thể để tối ưu hóa, chẳng hạn như độ phức tạp hoặc hiệu quả đơn giản (thời gian, không gian, bề mặt, mức tiêu thụ năng lượng). Tôi đang cố gắng không nói về sự tương đương chức năng, vì nó sẽ đòi hỏi các định nghĩa chính xác.PSPTSTPSPT
Một số trình biên dịch đã thực sự được sử dụng đơn giản để giảm kích thước của mã, chứ không phải để "cải thiện" việc thực thi. Đây là trường hợp ngôn ngữ được sử dụng trong hệ thống Plato (mặc dù họ không gọi nó là biên dịch).
Bạn có thể xem xét mã của bạn được biên soạn đầy đủ nếu, sau quá trình biên dịch, bạn không còn cần người phiên dịch cho . Ít nhất, đó là cách duy nhất tôi có thể đọc câu hỏi của bạn, với tư cách là một kỹ thuật thay vì câu hỏi lý thuyết (vì về mặt lý thuyết, tôi luôn có thể xây dựng lại trình thông dịch).S
Một điều có thể gây ra vấn đề, afaik, là siêu vòng tròn . Đó là khi một chương trình sẽ thao tác các cấu trúc cú pháp bằng ngôn ngữ nguồn của chính nó , tạo ra đoạn chương trình mà sau đó được đặt vào trong như thể chúng là một phần của chương trình gốc. Vì bạn có thể tạo ra các đoạn chương trình tùy ý bằng ngôn ngữ là kết quả của việc tính toán tùy ý thao túng các đoạn cú pháp vô nghĩa, tôi đoán bạn có thể làm cho nó gần như không thể (từ quan điểm kỹ thuật) để biên dịch chương trình sang ngôn ngữ , do đó nó bây giờ tạo ra mảnh vỡ của . Do đó, trình thông dịch cho sẽ là cần thiết, hoặc ít nhất là trình biên dịch từ đếnSSTTSST để biên dịch nhanh chóng các đoạn được tạo trong (xem thêm tài liệu này ).S
Nhưng tôi không chắc làm thế nào điều này có thể được chính thức hóa đúng cách (và không có thời gian ngay bây giờ cho nó). Và không thể là một từ lớn cho một vấn đề không được chính thức hóa.
Nhận xét xa hơn
Đã thêm sau 36 giờ. Bạn có thể muốn bỏ qua phần tiếp theo rất dài này.
Nhiều ý kiến cho câu hỏi này cho thấy hai quan điểm của vấn đề: một quan điểm lý thuyết xem nó là vô nghĩa, và một quan điểm kỹ thuật không may là không dễ dàng được chính thức hóa.
Có nhiều cách để xem xét diễn giải và biên dịch, và tôi sẽ cố gắng phác thảo một vài cách. Tôi sẽ cố gắng để trở thành không chính thức như tôi có thể quản lý
Sơ đồ bia mộ
Một trong những hình thức chính thức sớm (đầu những năm 1960 đến cuối năm 1990) là sơ đồ T hoặc
Tombstone . Các sơ đồ này được trình bày trong các yếu tố đồ họa có thể kết hợp, ngôn ngữ triển khai của trình thông dịch hoặc trình biên dịch, ngôn ngữ nguồn được giải thích hoặc biên dịch và ngôn ngữ đích trong trường hợp trình biên dịch. Phiên bản phức tạp hơn có thể thêm thuộc tính. Các biểu diễn đồ họa này có thể được xem như là tiên đề, quy tắc suy luận, có thể sử dụng để tạo ra bộ xử lý cơ học từ một bằng chứng về sự tồn tại của chúng từ các tiên đề, à la Curry-Howard (mặc dù tôi không chắc điều đó đã được thực hiện vào những năm sáu mươi :).
Đánh giá một phần
Một quan điểm thú vị khác là mô hình đánh giá một phần . Tôi đang xem một chương trình đơn giản như là một kiểu triển khai chức năng tính toán một câu trả lời cho một số dữ liệu đầu vào. Sau đó, một thông dịch viên
cho ngôn ngữ là một chương trình mà phải mất một chương trình
viết bằng và dữ liệu cho chương trình đó, và tính toán kết quả theo ngữ nghĩa của . Đánh giá một phần là một kỹ thuật để chuyên một chương trình của hai đối số và , khi chỉ có một đối số, nói , được biết đến. Mục đích là để đánh giá nhanh hơn khi cuối cùng bạn nhận được đối số thứ haiISSpSSdSa1a2a1a2 . Điều này đặc biệt hữu ích nếu thay đổi thường xuyên hơn vì chi phí đánh giá một phần với có thể được khấu hao trên tất cả các tính toán trong đó chỉ có thay đổi.a2a1a1a2
Đây là một tình huống thường gặp trong thiết kế thuật toán (thường là chủ đề của nhận xét đầu tiên về SE-CS), khi một phần tĩnh hơn của dữ liệu được xử lý trước, do đó chi phí xử lý trước có thể được khấu hao trên tất cả các ứng dụng của thuật toán với nhiều phần khác nhau của dữ liệu đầu vào.
Đây cũng chính là tình huống của các trình thông dịch, vì đối số đầu tiên là chương trình được thực thi và thường được thực thi nhiều lần với các dữ liệu khác nhau (hoặc có các nhánh con được thực thi nhiều lần với các dữ liệu khác nhau). Do đó, nó trở thành một ý tưởng tự nhiên để chuyên gia phiên dịch để đánh giá nhanh hơn một chương trình nhất định bằng cách đánh giá một phần nó trên chương trình này như là đối số đầu tiên. Đây có thể được coi là một cách biên dịch chương trình, và đã có công việc nghiên cứu quan trọng về việc biên dịch bằng cách đánh giá một phần trình thông dịch về đối số (chương trình) đầu tiên của nó.
Định lý Smn
Điểm hay của phương pháp đánh giá một phần là nó có nguồn gốc từ lý thuyết (mặc dù lý thuyết có thể là kẻ nói dối), đáng chú ý là trong
định lý Smn của Kleene . Tôi đang cố gắng trình bày trực quan về nó, hy vọng nó sẽ không làm đảo lộn các nhà lý thuyết thuần túy.
Đưa ra một số thứ tự của các hàm đệ quy, bạn có thể xem là phần cứng của mình, do đó, với số
(đọc mã đối tượng ) của chương trình là hàm được xác định bởi (nghĩa là được tính bởi mã đối tượng trên phần cứng của bạn).φφpφpp
Ở dạng đơn giản nhất, định lý được nêu trong wikipedia như sau (tối đa một thay đổi nhỏ trong ký hiệu):
Cho một số thứ tự của Gôdel của các hàm đệ quy, có một hàm đệ quy nguyên thủy của hai đối số có thuộc tính sau: với mỗi số Gôdel của một hàm tính toán một phần với hai đối số, các biểu thức và được xác định cho cùng một tổ hợp số tự nhiên và và giá trị của chúng bằng nhau cho bất kỳ kết hợp nào như vậy. Nói cách khác, các hàm bằng nhau mở rộng sau đây giữ cho mọi :
φσqfφσ(q,x)(y)f(x,y)xyxφσ(q,x)≃λy.φq(x,y).
Bây giờ, lấy làm trình thông dịch , làm mã nguồn của chương trình và làm dữ liệu cho chương trình đó, chúng ta có thể viết:
qISxpSydφσ(IS,pS)≃λd.φIS(pS,d).
φIS có thể được xem như thực hiện các dịch
trên phần cứng, tức là, như một hộp đen sẵn sàng để giải thích các chương trình viết bằng ngôn ngữ .ISS
Hàm có thể được xem là một hàm chuyên về trình thông dịch cho chương trình , như trong đánh giá một phần. Do đó, số có thể được nhìn thấy có mã đối tượng là phiên bản được biên dịch của chương trình .σISPSσ(IS,pS)pS
Vì vậy, hàm có thể được xem như là một hàm lấy đối số mã nguồn của chương trình
được viết bằng ngôn ngữ và trả về phiên bản mã đối tượng cho chương trình đó Vì vậy, là cái thường được gọi là trình biên dịch.CS=λqS.σ((IS,qS)qSSCS
Một số kết luận
Tuy nhiên, như tôi đã nói: "lý thuyết có thể là kẻ nói dối", hoặc thực sự có vẻ là một. Vấn đề là chúng ta không biết gì về hàm . Thực tế có rất nhiều hàm như vậy, và tôi đoán là bằng chứng của định lý có thể sử dụng một định nghĩa rất đơn giản cho nó, có thể không tốt hơn, theo quan điểm kỹ thuật, hơn là giải pháp do Raphael đề xuất: chỉ đơn giản là bó mã nguồn với trình thông dịch . Điều này luôn có thể được thực hiện, để chúng ta có thể nói: biên dịch luôn luôn có thể.q S I SσqSIS
Chính thức hóa một khái niệm hạn chế hơn về trình biên dịch sẽ đòi hỏi một cách tiếp cận lý thuyết tinh tế hơn. Tôi không biết những gì có thể đã được thực hiện theo hướng đó. Các công việc rất thực tế được thực hiện trên đánh giá một phần là thực tế hơn từ quan điểm kỹ thuật. Và tất nhiên còn có các kỹ thuật khác để viết trình biên dịch, bao gồm trích xuất các chương trình từ bằng chứng về đặc điểm kỹ thuật của chúng, được phát triển trong bối cảnh của lý thuyết loại, dựa trên sự đồng hình của Curry-Howard (nhưng tôi đang vượt ra khỏi phạm vi năng lực của mình) .
Mục đích của tôi ở đây là để cho thấy rằng nhận xét của Raphael không phải là "điên rồ", nhưng một lời nhắc nhở lành mạnh rằng mọi thứ không rõ ràng, và thậm chí không đơn giản. Nói rằng điều gì đó là không thể là một tuyên bố mạnh mẽ đòi hỏi phải có định nghĩa chính xác và bằng chứng, nếu chỉ để có một sự hiểu biết chính xác về cách thức và lý do tại sao nó là không thể . Nhưng xây dựng một chính thức hóa thích hợp để thể hiện một bằng chứng như vậy có thể khá khó khăn.
Điều này cho biết, ngay cả khi một tính năng cụ thể không thể biên dịch được, theo nghĩa được hiểu bởi các kỹ sư, các kỹ thuật biên dịch tiêu chuẩn luôn có thể được áp dụng cho các phần của chương trình không sử dụng tính năng đó, như được nhận xét bởi câu trả lời của Gilles.
Để làm theo nhận xét quan trọng của Gilles rằng, tùy thuộc vào ngôn ngữ, một số điều có thể được thực hiện vào thời gian biên dịch, trong khi những việc khác phải được thực hiện vào thời gian chạy, do đó cần có mã cụ thể, chúng ta có thể thấy rằng khái niệm biên dịch thực sự là không xác định, và có lẽ không thể xác định theo bất kỳ cách nào thỏa đáng. Quá trình biên dịch chỉ là một quá trình tối ưu hóa, như tôi đã cố gắng hiển thị trong phần đánh giá một phần, khi tôi so sánh nó với tiền xử lý dữ liệu tĩnh trong một số thuật toán.
Là một quá trình tối ưu hóa phức tạp, khái niệm biên dịch thực sự thuộc về một sự liên tục. Tùy thuộc vào đặc tính của ngôn ngữ hoặc chương trình, một số thông tin có thể có sẵn tĩnh và cho phép tối ưu hóa tốt hơn. Những thứ khác phải được hoãn lại để chạy. Khi mọi thứ trở nên thực sự tồi tệ, mọi thứ phải được thực hiện vào thời gian chạy ít nhất là đối với một số phần của chương trình và gói mã nguồn với trình thông dịch là tất cả những gì bạn có thể làm. Vì vậy, gói này chỉ là kết thúc thấp của liên tục biên dịch này. Phần lớn các nghiên cứu về trình biên dịch là về việc tìm cách thực hiện tĩnh những gì đã từng được thực hiện một cách linh hoạt. Bộ sưu tập rác thời gian biên dịch có vẻ là một ví dụ tốt.
Lưu ý rằng nói rằng quá trình biên dịch nên tạo mã máy là không có ích. Đó là chính xác những gì gói có thể làm như trình thông dịch là mã máy (tốt, điều có thể phức tạp hơn một chút với biên dịch chéo).