Tại sao trình biên dịch đầu tiên được viết trước trình thông dịch đầu tiên?


72

Trình biên dịch đầu tiên được viết bởi Grace Hopper vào năm 1952 trong khi trình thông dịch Lisp được viết vào năm 1958 bởi sinh viên John Russell của John McCarth. Viết một trình biên dịch có vẻ như là một vấn đề khó khăn hơn nhiều so với một phiên dịch viên. Nếu đó là như vậy, tại sao trình biên dịch đầu tiên được viết sáu năm trước khi phiên dịch đầu tiên?


67
bởi vì có nhiều nhu cầu về trình biên dịch hơn là một trình thông dịch vào thời điểm đó
ratchet freak

23
Để biên dịch trình thông dịch đầu tiên? : P (chỉ có một phần trong má, một trình thông dịch rất phức tạp (nhiều hơn một trình biên dịch đơn giản) và thật khó chịu khi viết một mã hiệu quả trong mã máy)
Vality

4
Nếu bạn thực hiện các hướng dẫn thực thi CPU của mình làm thông dịch cho chúng, đó là cách tôi thấy nó (tuy nhiên được thực hiện thông qua phần cứng), thì tuyên bố rằng trình thông dịch đầu tiên được viết sau khi trình biên dịch đầu tiên không giữ. Btw, tôi biết điều này không giúp ích cho câu hỏi / câu trả lời. Nó chỉ có nghĩa là một nhận xét thú vị trên một quan điểm khác.
Pedro Henrique A. Oliveira

11
McCarthy đã không viết trình thông dịch LISP. McCarthy đã phát minh ra một chủ nghĩa hình thức toán học. Steve Russell, một trong những sinh viên của MIT AI Lab vào thời điểm đó, nhận ra rằng ông có thể viết một thông dịch viên để thực hiện các chuyến bay ưa thích của McCarthy, và phần còn lại là lịch sử.
John R. Strohm

5
Trên thực tế, tôi nghe nói rằng McCarthy tin rằng LISP là không thể thực hiện được. Chính Russell đã nhận ra rằng chức năng phổ quát của McCarthy từ sổ tay LISP a) một thông dịch viên và b) có thể thực hiện được.
Jörg W Mittag

Câu trả lời:


97

Viết một trình biên dịch có vẻ như là một vấn đề khó khăn hơn nhiều so với một phiên dịch viên.

Điều đó có thể đúng ngày hôm nay, nhưng tôi sẽ lập luận rằng đó không phải là trường hợp khoảng 60 năm trước. Một vài lý do tại sao:

  • Với một trình thông dịch, bạn phải giữ cả nó và chương trình trong bộ nhớ. Trong thời đại mà 1kb bộ nhớ là một thứ xa xỉ lớn, việc giữ cho dung lượng bộ nhớ chạy thấp là chìa khóa. Và phiên dịch đòi hỏi nhiều bộ nhớ hơn một chương trình biên dịch.
  • CPU hiện đại là vô cùng phức tạp với danh mục hướng dẫn khổng lồ. Vì vậy, viết một trình biên dịch tốt thực sự là một thách thức. CPU cũ đơn giản hơn nhiều, do đó, việc biên dịch thậm chí còn đơn giản hơn.
  • Các ngôn ngữ hiện đại phức tạp hơn nhiều so với các ngôn ngữ cũ, vì vậy ngay cả các trình biên dịch cũng phức tạp hơn nhiều. Ngôn ngữ cũ do đó sẽ có trình biên dịch đơn giản hơn.

65
và không có trình biên dịch, bạn phải viết trình thông dịch trong cụm
ratchet freak

34
Trình biên dịch đầu tiên nơi mọi người. (Khi mọi người là thông dịch viên, chúng tôi không cần máy tính). Sau đó, một người nào đó đã xem xét việc viết một trình biên dịch bằng ngôn ngữ được biên dịch (những ngôn ngữ duy nhất họ có, nhưng theo thời gian biên dịch con người của tôi).
ctrl-alt-delor

1
Trên thực tế .... Gần đây tôi đã đọc rằng Máy tính hướng dẫn Apollo được sử dụng trong các chuyến bay trên mặt trăng của thập niên 60 có một trình thông dịch: mục wiki "... trình thông dịch đã cung cấp nhiều hướng dẫn hơn AGC vốn hỗ trợ ..." Tôi cho rằng "thông dịch viên" này giống như trình thông dịch "Sweet 16" được nhúng trong các máy tính Apple II cũ hơn là một cái gì đó như LISP.
Calphool

6
@ratchetfreak Và nó đã được. Như là trình biên dịch đầu tiên.
RBarryYoung

3
@richard: Khi mọi người là thông dịch viên / máy tính, chức danh công việc của họ được gọi là "máy tính". Vì vậy, khi mọi người là thông dịch viên, họ là máy tính, theo nghĩa đen. Dự án Manhattan sử dụng hàng ngàn "máy tính" (chức danh công việc thực tế, nghiêm túc) mà các nhà vật lý hạt nhân đã gửi các tính toán của họ qua thư để được thực thi. Trên thực tế, dự án cũng sử dụng các nhà toán học đã phá vỡ các tính toán từ các kỹ sư đã xây dựng các tính toán từ lý thuyết của các nhà vật lý để gửi "máy tính".
slebetman

42

Điểm cơ bản là môi trường phần cứng máy tính của những năm 1950 đã khiến nó chỉ có một trình biên dịch là khả thi khi xử lý theo định hướng hàng loạt các máy tính hồi đó.

Vào thời điểm đó, giao diện người dùng tốt hơn chủ yếu giới hạn ở thẻ đục lỗ và máy in teletype . Năm 1961, hệ thống SAGE trở thành màn hình Cathode-Ray Tube (CRT) đầu tiên trên máy tính. Vì vậy, bản chất tương tác của một thông dịch viên là không thích hợp hoặc tự nhiên cho đến sau này.

Nhiều máy tính trong những năm 1950 đã sử dụng các công tắc bảng mặt trước để tải hướng dẫn, và đầu ra chỉ đơn giản là các dãy đèn / đèn LED, và những người có sở thích thậm chí đã sử dụng các công tắc & đèn LED bảng mặt trước vào những năm 1970. Có lẽ bạn đã quen thuộc với Altair 8800 khét tiếng .

Những hạn chế phần cứng khác cũng làm cho phiên dịch viên không khả thi. Có rất ít bộ nhớ chính (ví dụ RAM) trong các máy tính vào những năm 1950. Trước khi mạch tích hợp bán dẫn (không xuất hiện cho đến năm 1958), bộ nhớ bị giới hạn ở bộ nhớ lõi từ hoặc bộ nhớ dòng trễ được đo bằng bit hoặc từ , không có tiền tố. Kết hợp với sự chậm chạp của bộ nhớ lưu trữ thứ cấp (ví dụ như đĩa hoặc băng), nó sẽ bị coi là lãng phí, nếu không có khả năng sử dụng nhiều bộ nhớ cho trình thông dịch, ngay cả trước khi chương trình được giải thích được tải.

Giới hạn bộ nhớ vẫn là một yếu tố chính khi nhóm trưởng của John Backus tại IBM tạo ra trình biên dịch FORTRAN vào năm 1954-57. Trình biên dịch sáng tạo này chỉ thành công vì nó là trình biên dịch tối ưu hóa .

Hầu hết các máy tính trong năm 1950 hầu như không có bất kỳ hệ điều hành, chúng ta hãy tính năng hiện đại một mình như liên kết động và quản lý bộ nhớ ảo, vì vậy ý tưởng của một thông dịch viên đã quá cực đoan và không thực tế lúc bấy giờ.

Phụ lục

Ngôn ngữ của những năm 1950 là nguyên thủy. Họ chỉ bao gồm một nhỏ số ít các hoạt động, thường bị ảnh hưởng bằng cách hướng dẫn các phần cứng cơ bản hoặc định nghĩa vấn đề sử dụng nhắm mục tiêu của họ.

Vào thời điểm đó, máy tính hiếm khi là máy tính có mục đích chung theo nghĩa mà chúng ta nghĩ về máy tính ngày nay. Rằng họ có thể lập trình lại mà không cần phải xây dựng lại được coi là một khái niệm mang tính cách mạng - trước đây người ta đã sử dụng máy điện cơ (thường là máy tính) để tính toán hoặc tính toán câu trả lời (phần lớn các ứng dụng trong những năm 1950 có bản chất là số).

Theo quan điểm của Khoa học máy tính, các trình biên dịch và thông dịch viên đều là các dịch giả và có độ phức tạp gần bằng nhau để thực hiện.


Có phải máy tính đã sử dụng teletypes trước khi chia sẻ thời gian? Tôi đã dự kiến ​​họ sẽ sử dụng máy in dòng hoặc ống chỉ để băng. Mặt khác, 1 - 8 giây, máy tính sẽ phải đợi sau mỗi dòng văn bản sẽ đại diện cho 1 - 8 giây mà máy tính có thể có - nhưng không - làm điều gì đó hữu ích.
supercat

2
@supercat - vâng, teletypes đã được sử dụng, nhưng chúng còn lâu mới "tương tác". Máy tính đầu tiên tôi lập trình có bộ nhớ gồm 18 từ - 1K trong số đó. Bản thân bộ nhớ là một cái trống quay , vì vậy khi bạn bật máy tính lên, bạn phải đợi cho đến khi bộ nhớ tăng tốc. Nó có một kiểu điện thoại được đính kèm và bạn có thể A) đọc một ký tự được gõ từ bàn phím hoặc đọc bằng đầu đọc băng giấy (từ quan điểm của cả hai máy tính đều giống nhau), B) viết một ký tự cho "máy in "Của teletype. Ah, ngày tuyệt vời - ngày tuyệt vời ..! LÀ YÊU CẦU GRUEL CỦA TÔI?!?!? :-)
Bob Jarvis

@BobJarvis: Năm đó sẽ là năm nào?
supercat

1
@supercat - 1973 - nhưng máy tính được đề cập (EDP-18, theo Sản phẩm Dữ liệu Giáo dục) thậm chí còn khá cũ. Tuy nhiên, đó là những gì chúng tôi đã có (và có bất kỳ máy tính nào gây rối ở trường trung học vào đầu những năm 70 là không bình thường) vì vậy chúng tôi nghĩ rằng nó khá tuyệt vời. :-)
Bob Jarvis

2
Đây là một câu trả lời tốt hơn và đầy đủ hơn so với câu trả lời được chấp nhận.
Jim Garrison

12

Các ngôn ngữ lập trình đầu tiên khá đơn giản (ví dụ không có đệ quy) và gần với kiến ​​trúc máy đơn giản. Bản dịch sau đó là một quá trình đơn giản .

Trình biên dịch đơn giản hơn là một chương trình so với trình thông dịch sẽ phải kết hợp cả dữ liệu để thực hiện chương trình và các bảng để diễn giải mã nguồn. Và trình thông dịch sẽ chiếm nhiều không gian hơn , cho chính mã nguồn chương trình và cho các bảng biểu tượng.

Bộ nhớ có thể rất khan hiếm (vì cả lý do chi phí và kiến ​​trúc) mà trình biên dịch có thể là các chương trình độc lập ghi đè lên hệ điều hành (tôi đã sử dụng một trong số này). Hệ điều hành phải được tải lại sau khi biên dịch để chạy chương trình đã biên dịch. ... Điều đó làm rõ rằng việc chạy một trình thông dịch cho công việc thực sự đơn giản không phải là một lựa chọn .

Thành thật mà nói, sự đơn giản cần có của trình biên dịch là trình biên dịch không tốt lắm (tối ưu hóa mã vẫn còn ở giai đoạn sơ khai, khi được xem xét ở tất cả). Mã máy viết tay, ít nhất là cho đến cuối những năm sáu mươi ở một số nơi, danh tiếng là hiệu quả hơn đáng kể so với mã trình biên dịch tạo ra. Thậm chí còn có một khái niệm về tỷ lệ mở rộng mã , so sánh kích thước của mã được biên dịch với công việc của một lập trình viên rất giỏi. Nó thường lớn hơn 1 đối với hầu hết các trình biên dịch (tất cả?), Có nghĩa là các chương trình chậm hơn và quan trọng hơn là các chương trình lớn hơn cần nhiều bộ nhớ hơn. Đây vẫn là một vấn đề trong những năm sáu mươi.

Sự quan tâm của trình biên dịch là sự dễ dàng trong lập trình, đặc biệt đối với người dùng không phải là chuyên gia điện toán, chẳng hạn như các nhà khoa học trong các lĩnh vực khác nhau. Sự quan tâm này không phải là hiệu suất mã. Tuy nhiên, thời gian lập trình viên sau đó được coi là một tài nguyên giá rẻ. Chi phí là vào thời gian máy tính, cho đến năm 1975-1980, khi chi phí chuyển từ phần cứng sang phần mềm. Điều đó có nghĩa là ngay cả trình biên dịch cũng không được thực hiện nghiêm túc bởi một số chuyên gia .

Chi phí rất cao cho thời gian sử dụng máy tính là một lý do khác khiến người phiên dịch bị loại , đến mức chính ý tưởng đó sẽ gây cười cho hầu hết mọi người.

Trường hợp của Lisp rất đặc biệt, bởi vì đây là một ngôn ngữ cực kỳ đơn giản khiến nó khả thi (và máy tính đã trở nên lớn hơn một chút trong 58). Quan trọng hơn, trình thông dịch Lisp là một bằng chứng về khái niệm liên quan đến khả năng tự xác định của Lisp ( tính tuần hoàn ), độc lập với bất kỳ vấn đề nào về khả năng sử dụng.

Sự thành công của Lisp chủ yếu là do sự tự xác định này đã khiến nó trở thành một thử nghiệm tuyệt vời để nghiên cứu các cấu trúc lập trình và thiết kế các ngôn ngữ mới (và cũng vì sự thuận tiện cho tính toán biểu tượng).


3
Ôi, sao mà táo bạo thế .
Pharap

@Pharap Đó có phải là phong cách không phù hợp? Mục đích của tôi là làm cho thông tin chính dễ tìm thấy hơn, đồng thời cho phép một phong cách tự do hơn là liệt kê các sự kiện đơn giản. Tôi phải thú nhận rằng nó không thực sự có vẻ rất hiệu quả trên trang SE này.
babou

@ nặc danh downvoter Downvot mà không có bình luận giải thích cho thấy ai đó có thể ngu ngốc. Tuy nhiên, nó không nói ai.
babou

4

Tôi không đồng ý với tiền đề của câu hỏi.

Trình biên dịch đầu tiên của Đô đốc Hopper (A-0) giống như một trình liên kết hoặc ngôn ngữ macro. Cô lưu trữ các chương trình con trên một băng (mỗi người được gán một số) và các chương trình của cô sẽ được viết dưới dạng một danh sách các chương trình con và đối số. Trình biên dịch sẽ sao chép các chương trình con được yêu cầu từ băng và sắp xếp lại chúng thành một chương trình hoàn chỉnh.

Cô ấy đã sử dụng từ "biên dịch" theo cùng một nghĩa là người ta biên soạn một tuyển tập các bài thơ: thu thập các mục khác nhau lại thành một tập.

Trình biên dịch đầu tiên đó không có trình biên dịch hoặc trình phân tích cú pháp, theo như tôi có thể nói, điều này làm cho nó trở thành tổ tiên xa của một trình biên dịch hiện đại. Sau đó, cô đã tạo ra một trình biên dịch khác (B-0, còn gọi là FLOW-MATIC) với mục tiêu là một cú pháp giống tiếng Anh hơn, nhưng nó đã không được hoàn thành cho đến năm 1958 hoặc 1959 - cùng thời gian với trình thông dịch Lisp.

Do đó, tôi nghĩ rằng bản thân câu hỏi là một chút sai lầm. Dường như các trình biên dịch và phiên dịch cùng phát triển gần như chính xác cùng một lúc, không còn nghi ngờ gì nữa do việc chia sẻ các ý tưởng sẽ có nhiều nhà khoa học suy nghĩ theo cùng một dòng trong những ngày đó.

Một câu trả lời tốt hơn với các trích dẫn ở đây: https://stackoverflow.com/a/7719098/122763 .


3

Phần khác của phương trình là các trình biên dịch là một bước trừu tượng trên một trình biên dịch. Đầu tiên chúng tôi có mã máy cứng. "Chúng tôi" là người lắp ráp. Mỗi bước nhảy và bù, v.v ... được tính toán bằng tay thành hex (hoặc bát phân) và sau đó đục lỗ vào băng giấy hoặc thẻ. Vì vậy, khi các nhà lắp ráp xuất hiện, đó là một công cụ tiết kiệm thời gian rất lớn. Bước tiếp theo là các nhà lắp ráp vĩ mô. Điều đó đã cho khả năng viết một macro sẽ mở rộng thành một bộ hướng dẫn máy. Vì vậy, Fortran và Cobol là một bước tiến lớn. Việc thiếu tài nguyên (lưu trữ, bộ nhớ và chu kỳ cpu) có nghĩa là các phiên dịch viên mục đích chung phải chờ công nghệ phát triển. Hầu hết các trình thông dịch ban đầu là các công cụ mã byte (như Java hoặc CLR ngày nay, nhưng với khả năng ít hơn nhiều). UCSD Pascal là một ngôn ngữ rất phổ biến (và nhanh chóng). MS Basic là một công cụ mã byte dưới mui xe.

Về mặt chi phí hướng dẫn, nó hoàn toàn phụ thuộc vào bộ xử lý nào đang được chạy. Ngành công nghiệp đã trải qua một cuộc khủng hoảng RISC vs CISC lớn trong một thời gian. Cá nhân tôi đã viết trình biên dịch cho IBM, Data General, Motorola, Intel (khi họ xuất hiện), TI và một số người khác. Có một sự khác biệt khá đáng kể trong các tập lệnh, thanh ghi, v.v. sẽ ảnh hưởng đến những gì được yêu cầu để "diễn giải" mã p.

Để tham khảo thời gian, tôi bắt đầu lập trình trong công ty điện thoại vào khoảng năm 1972.


2

Nếu bạn không giữ mọi thứ trong bộ nhớ, mã được biên dịch sẽ nhanh hơn nhiều. Đừng quên rằng, trong những thời điểm này, các hàm được nối với mã được biên dịch. Nếu bạn không biên dịch, bạn không biết bạn sẽ cần những chức năng nào. Vì vậy, bạn đang gọi các chức năng từ ... Ồ, không phải từ đĩa, chúng tôi đang ở trong 50 mối quan hệ đầu tiên, nhưng từ thẻ! Trong thời gian chạy!

Tất nhiên, có thể tìm thấy một cách giải quyết, nhưng chúng chưa được tìm thấy, vì các ngôn ngữ rất đơn giản và không quá xa mã máy. Và biên dịch là dễ dàng và đủ.


1

Trước khi trình biên dịch đầu tiên được viết, mọi người đã viết mã trình biên dịch mã, đó là một tiến bộ rất lớn so với mã nhị phân đơn giản. Vào thời điểm đó, có một lập luận mạnh mẽ rằng mã được biên dịch bởi trình biên dịch sẽ kém hiệu quả hơn mã trình biên dịch - tại thời điểm đó, mối quan hệ của (chi phí máy tính) với (chi phí lập trình viên) khác nhiều so với ngày nay. Vì vậy, đã có sức đề kháng mạnh mẽ chống lại trình biên dịch từ quan điểm đó.

Nhưng trình biên dịch là rất hiệu quả hơn nhiều so với phiên dịch viên. Nếu bạn đã đề nghị viết một thông dịch viên vào thời điểm đó, mọi người sẽ nghĩ bạn bị điên. Bạn có thể tưởng tượng việc mua một máy tính triệu đô và sau đó lãng phí 90% sức mạnh của nó để giải thích mã không?


Tôi không biết nhiều về máy tính của những năm 1950, nhưng ít nhất là đối với các máy von Neumann đơn giản của những thập kỷ sau, chi phí phiên dịch sẽ là hai đến năm hướng dẫn (có thể là bốn đến mười chu kỳ) cho mỗi hướng dẫn được giải thích: Giải mã, nhảy gián tiếp, có thể giải mã lập luận bổ sung. Nếu bạn đặt tập lệnh phiên dịch đủ mức cao (để bạn thực thi một số lệnh máy cho mỗi lệnh phiên dịch) thì điều này sẽ ít hơn 90% và thậm chí có thể chấp nhận được. Xem thêm: Forth.

3
Trước khi trình biên dịch đầu tiên được viết, phần lớn các chương trình thực sự được viết bằng mã máy thực tế, không phải ngôn ngữ lắp ráp (mnemonics op-code).
mctylr

2
@delnan Những hệ thống này chạy với đồng hồ tính bằng kiloHertz, do đó, việc lãng phí hiệu suất giảm 3-5 lần có thể là sự khác biệt giữa chương trình hoàn thành thành công trước khi hệ thống bị lỗi do lỗi phần cứng (ví dụ như ống chân không bị thổi). Lỗi phần cứng là một sự cố xảy ra hàng ngày trong những năm 1950 nếu tôi nhớ lại chính xác.
mctylr

delnan: Chỉ cho tôi một thông dịch viên có thể phiên dịch với năm chi phí hướng dẫn. Và Forth không phải là một ngôn ngữ được giải thích, nó là một ngôn ngữ gớm ghiếc :-). Xin lỗi, tôi có nghĩa là một ngôn ngữ luồng. Một cái gì đó như BASIC cần những ánh mắt chỉ dẫn để diễn giải một câu.
gnasher729

@gnasher: Vào năm 1974, tôi đã xây dựng một trình thông dịch BASIC hiệu suất cao cho Keronix (ahem, Data General Nova) sử dụng mã P theo định hướng byte để mã hóa câu lệnh BASIC. Phải mất khoảng 25-50 hướng dẫn máy để "diễn giải" một pCode, 10 trong số chúng cho chính byte tìm nạp. (Tôi đã thực hiện một mã thông báo dựa trên một lần trở lại vào năm 1969 mà mất nhiều hơn vì nó phải có hiệu lực phân tích lại các biểu thức). Nhưng nó không phải là "ánh mắt".
Ira Baxter

1

Trước khi một chương trình lặp có thể được diễn giải, nó phải được lưu trữ trong một phương tiện có thể được đọc nhiều lần. Trong hầu hết các trường hợp, phương tiện phù hợp duy nhất sẽ là RAM. Vì mã thường sẽ được nhập vào thẻ đục lỗ - đối với các ngôn ngữ có thể đọc được của con người - dường như hầu như trống rỗng, một số loại xử lý phải được thực hiện theo mã trước khi được lưu trữ trong RAM. Trong nhiều trường hợp, xử lý văn bản thẻ đục lỗ thành một hình thức phù hợp để thực thi trực tiếp bởi bộ xử lý không thực sự khó khăn hơn việc xử lý nó thành một hình thức có thể được xử lý hiệu quả thông qua trình thông dịch.

Lưu ý rằng mục tiêu của các trình biên dịch ban đầu không phải là tạo ra tệp ngôn ngữ lắp ráp hoặc mã đối tượng trên đĩa, mà là để kết thúc mã trong RAM đã sẵn sàng để thực thi. Điều này thực sự dễ dàng đáng ngạc nhiên khi không có hệ điều hành nào cản trở. Một trình biên dịch có thể tạo mã bắt đầu từ một đầu của bộ nhớ và phân bổ các biến và các mục tiêu nhánh bắt đầu từ đầu kia. Nếu một câu lệnh được đánh dấu bằng nhãn "1234", trình biên dịch sẽ lưu trữ trong biến có tên là "1234" một lệnh để chuyển đến địa chỉ tạo mã hiện tại, tạo biến đó nếu nó không tồn tại. Một câu lệnh "goto 1234" sẽ tạo ra một biến "1234" nếu nó không tồn tại, và sau đó nhảy đến biến đó [hy vọng sẽ có một bước nhảy đến vị trí thích hợp được lưu trữ trong đó trước khi câu lệnh đó thực thi].gotomột nhãn chưa được xác định, vì nó biết khi nào gotobiên dịch nơi nó sẽ nhảy - đến một biến. Đó có thể không phải là cách hiệu quả nhất để tạo mã, nhưng nó phù hợp với kích thước của các chương trình mà máy tính dự kiến ​​sẽ xử lý.


1
Đĩa? Ừm ... không. Băng. Băng lớn, chậm, cuộn-to-reel. Và rất nhiều trong số họ. Tôi nhớ đã đi đến một bài giảng được đưa ra bởi Grace Murray Hopper (đôi khi thú vị với tôi vì tôi là một chuyên gia phân tích hệ thống VÀ một người trung gian trong phân đội ROTC của Hải quân trong khuôn viên trường, và CAPT Hopper là một sĩ quan hải quân phục vụ). Cô ấy liên quan đến một câu chuyện trong đó, cô ấy nói, cô ấy nảy ra ý tưởng viết những phần không sử dụng của một chương trình vào băng - cô ấy gọi nó là "sử dụng lưu trữ phụ trợ". "Nhưng", cô nói, "ý tưởng đã không bắt kịp cho đến khi IBM làm điều tương tự và gọi nó là Bộ nhớ ảo". CAPT Hopper thực sự không thích IBM ... :-)
Bob Jarvis

@BobJarvis: Tôi đã không xem xét khía cạnh đó, nhưng thiết kế một lượt chung tương tự sẽ được sử dụng để biên dịch mã sẵn sàng chạy vào RAM có thể hoạt động tốt với ổ băng từ; đầu ra từ trình biên dịch sẽ chuyển sang băng, sau đó băng sẽ được tua lại và đọc vào các địa chỉ bộ nhớ tuần tự và chạy trực tiếp, mà không cần phải có bất kỳ phần nào của trình biên dịch trong bộ nhớ cùng một lúc.
supercat

0

Bởi vì thông dịch viên cần trình biên dịch để làm việc.

Tuyên bố trên không thực sự đúng. Nói đúng ra, bạn có thể tạo một trình thông dịch mà không bao giờ sử dụng hoặc tương tác với trình biên dịch. Nhưng kết quả của việc này sẽ không giống với những gì tôi nghĩ bạn muốn nói.

Theo nghĩa chặt chẽ, trình biên dịch và phiên dịch làm những việc hoàn toàn khác nhau. Trình biên dịch đọc văn bản từ một số nguồn và chuyển đổi nó thành một số định dạng khác: ngôn ngữ lắp ráp, mã máy, ngôn ngữ cấp cao khác, cấu trúc dữ liệu hoặc bất cứ thứ gì khác. Một thông dịch viên, trong khi đó, có một cấu trúc dữ liệu thuộc loại nào đó và thực hiện các hướng dẫn dựa trên nó.

Ngày nay, cái mà chúng ta nghĩ là "trình biên dịch" thực sự là một trình biên dịch đã được ghép nối với một trình tạo mã : một chương trình lấy dữ liệu từ một số nguồn và xuất mã theo một số định dạng dựa trên những gì nó nhìn thấy. Đó là cách sử dụng khá trực quan cho trình biên dịch và đó là một trong những điều đầu tiên trình biên dịch được tạo ra. Nhưng nếu bạn nhìn nó theo một cách khác, điều này có vẻ rất giống với những gì một phiên dịch viên làm. Nó luôn xuất mã thay vì thực hiện các hoạt động chung hơn, nhưng nguyên tắc là như nhau.

Nếu chúng ta nhìn nó từ phía bên kia, một thông dịch viên cần lấy dữ liệu từ đâu đó . Đây chỉ là dữ liệu, vì vậy bạn có thể xây dựng nó theo cùng cách bạn xây dựng bất kỳ loại dữ liệu nào khác. Vì chúng ta đang nói về giải thích, có vẻ tự nhiên rằng bạn có thể xây dựng dữ liệu của mình dựa trên các hướng dẫn trong tệp văn bản. Nhưng để làm điều đó, bạn cần một cái gì đó để đọc trong văn bản và tạo cấu trúc dữ liệu của bạn và đó là trình biên dịch . Nó được nối với trình thông dịch thay vì trình tạo mã, nhưng nó là trình biên dịch hoàn toàn giống nhau.

Đó là lý do tại sao trình biên dịch được viết đầu tiên. Ý tưởng diễn giải các cấu trúc dữ liệu không phải là mới ngay cả khi các trình biên dịch được hình thành, nhưng các trình biên dịch là "liên kết bị thiếu" cho phép các lập trình viên xây dựng các cấu trúc đó ra khỏi văn bản.


Trình thông dịch cơ bản ban đầu cho Apple] [là, từ những gì tôi hiểu, được dịch thủ công thành mã máy và không bao giờ tồn tại ở định dạng mã nguồn có thể đọc được bằng máy. Tôi không chắc chắn "trình biên dịch" mà bạn muốn nói đã được sử dụng để sản xuất nó.
supercat

@supercat: Tôi không biết trình thông dịch cơ bản mà bạn đề cập đã được tạo ra như thế nào, nhưng tôi không nói về trình biên dịch được sử dụng để sản xuất trình thông dịch. Tôi đang nói về các trình biên dịch là một phần của thông dịch viên. Là một phần của mã, Apple] [Trình thông dịch BASIC cần một số cách để đọc trong tệp văn bản chứa mã BASIC và tạo cây cú pháp từ văn bản đó, sau đó nó thực thi. Mã thực hiện điều này là một trình biên dịch; nó không tạo mã máy, nhưng nó vẫn thực hiện các tác vụ đọc mã và dịch nó sang dạng khác.
Chiếc thìa ngon nhất

Các trình thông dịch BASIC của máy vi tính điển hình không tạo ra bất cứ thứ gì thậm chí từ xa giống như một cây cú pháp. Tôi không quen thuộc với trình thông dịch Apple BASIC ban đầu (được gọi là "số nguyên BASIC") nhưng trình thông dịch BASIC do Microsoft triển khai cho Apple ("Applesoft BASIC"), Commodore và nhiều công ty khác lưu trữ văn bản chương trình như - ngoại trừ hai điều : (1) mỗi dòng được đi trước bởi số dòng 16 bit và địa chỉ 16 bit của dòng tiếp theo và theo sau là một byte 0; (2) mỗi từ khóa đã được thay thế bằng một byte duy nhất có tập bit cao. Ngoài ra, các biểu thức đã được phân tích cú pháp ...
supercat

... theo từng nhân vật, từ trái sang phải; một câu lệnh như A = 1234 "sẽ chuyển đổi các chữ số 1, 2, 3 và 4 thành số dấu phẩy động trong thời gian chạy.
supercat

@supercat: Nghe có vẻ gần với mã byte hơn là cây cú pháp, vì vậy, tôi có lỗi về điều đó. Nhưng điểm chính vẫn đứng: mã giả vẫn phải được xây dựng từ văn bản và mã thực hiện điều này là một trình biên dịch.
Chiếc thìa ngon nhất

-1

Một yếu tố khác: Khi các trình biên dịch đầu tiên được viết, chi phí thời gian của máy cao hơn rất nhiều so với bây giờ. Thông dịch viên sử dụng nhiều thời gian máy hơn.

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.