Trình biên dịch đầu tiên được viết như thế nào?


166

Tôi nghe nói về con gà và quả trứng và bootstrapping. Tôi có một vài câu hỏi.

Điều gì đã viết trình biên dịch đầu tiên đã chuyển đổi một cái gì đó thành các hướng dẫn nhị phân?

Được lắp ráp biên dịch hoặc dịch thành hướng dẫn nhị phân?

... Tôi thấy khó tin rằng họ đã viết một trình biên dịch nhị phân.



@nawfal, đó là một sự khác biệt giữa ngôn ngữ lập trình mới và trình biên dịch đầu tiên, vì vậy không - nó không phải là bản sao

@PauliSudarshanTerho sự khác biệt là gì? Tinh thần của các câu hỏi là như nhau. Bạn không thể viết một ngôn ngữ lập trình, câu hỏi đó lần lượt nói về trình biên dịch đầu tiên.
nawfal

Trong trí tưởng tượng tâm linh của bạn có thể? Trong thực tế, bạn không tìm thấy bất cứ điều gì được đề cập về trình biên dịch đầu tiên trong liên kết đó. Và bạn không nên khuyên bất cứ ai viết một ngôn ngữ mới để bắt đầu lại từ đầu. Và nếu vậy thì tại sao bạn lại muốn ẩn các câu trả lời về cách trình biên dịch đầu tiên được viết nếu nó quan trọng để viết một ngôn ngữ mới?

Tìm hiểu từ tôi - Đây là bản sao: stackoverflow.com/questions/4772768/

Câu trả lời:


133

Hướng dẫn lắp ráp là (nói chung) một ánh xạ trực tiếp tới các opcodes, đó là (nhiều) giá trị byte của mã máy có thể được bộ xử lý giải thích trực tiếp. Hoàn toàn có thể viết chương trình trong opcodes trực tiếp bằng cách tra cứu chúng từ một bảng (ví dụ như chương trình này cho bộ vi xử lý 6039 ) liệt kê chúng với các hướng dẫn lắp ráp phù hợp và xác định địa chỉ bộ nhớ / bù cho các thứ như nhảy.

Các chương trình đầu tiên được thực hiện chính xác theo kiểu này - opcodes viết tay.

Tuy nhiên, hầu hết thời gian đơn giản hơn là sử dụng trình biên dịch để "biên dịch" mã lắp ráp, tự động thực hiện các tra cứu opcode này, cũng như hữu ích trong việc tính toán địa chỉ / bù đắp cho nhãn nhảy, et cetera.

Các nhà lắp ráp đầu tiên được viết bằng tay. Những trình biên dịch đó sau đó có thể được sử dụng để lắp ráp các trình biên dịch phức tạp hơn, sau đó có thể được sử dụng để lắp ráp các trình biên dịch được viết cho các ngôn ngữ cấp cao hơn, v.v. Quá trình này lặp đi lặp lại việc viết các công cụ để đơn giản hóa việc tạo ra bộ công cụ tiếp theo được gọi (như David Rabinowitz đã đề cập trong câu trả lời của mình) bootstrapping .


18
Máy tính đầu tiên của tôi là máy dựa trên Z80, trong đó màn hình ROM tôi phải lắp ráp bộ tải bootstrap để đưa ra những điều cơ bản của hệ điều hành (CP / M) để tôi có thể lắp ráp phần còn lại của hệ điều hành vào hệ điều hành , hoàn thành với trình tải bootstrap dựa trên đĩa. Thời gian vui vẻ. Vì vậy, yeah, bạn có thể lắp ráp bằng tay tốt. Nó chậm và đau đớn và dễ bị lỗi (đó là lý do tại sao chúng tôi tự động hóa mọi thứ) nhưng điều đó là có thể.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI

Các liên kết đầu tiên bị phá vỡ.
Lu-ca

Viết bằng tay. Làm sao? Dây thẻ hay đấm? Tôi đoán họ có bàn phím thập lục phân.

44

Vui lòng đọc về trình biên dịch bootstrappinglịch sử viết trình biên dịch

Ý tưởng là viết một trình biên dịch rất đơn giản trực tiếp bằng mã máy, sử dụng nó để viết một trình biên dịch phức tạp hơn, sử dụng trình biên dịch thứ hai để xây dựng trình biên dịch thứ ba và cứ thế cho đến khi bạn có thể có một trình biên dịch đầy đủ tính năng.


36

Trứng gà đi trước. Câu trả lời cho hầu hết các vấn đề "gà và trứng" là như nhau: tiến hóa. Một số người gặp khó khăn khi tin vào sự tiến hóa sinh học, nhưng sự không tin không phải là một đối số (google argumentum ad ignorantiam).

Để trả lời trực tiếp câu hỏi của bạn: trình biên dịch đầu tiên được viết (bởi một người) bằng ngôn ngữ hợp ngữ - một chương trình được gọi là trình biên dịch sẽ dịch ngôn ngữ lắp ráp thành nhị phân; đây là một quá trình đơn giản hơn nhiều so với biên dịch vì ngôn ngữ hợp ngữ chỉ là một dạng biểu tượng của ngôn ngữ máy sử dụng tên opcode thay vì số, biểu thị địa chỉ bằng các ký hiệu, v.v. Nhiều trình biên dịch tiếp theo cũng được viết bằng ngôn ngữ lắp ráp. Nhưng trình biên dịch C đầu tiên là một trình biên dịch B được sửa đổi, được viết bằng B . Trình biên dịch B đầu tiên được viết bằng TMG . Trình biên dịch TMG được sử dụng để biên dịch trình biên dịch B được viết bằng ngôn ngữ lắp ráp PDP-7.


24

Woz nói trong một trong những cuộc nói chuyện công khai của anh ấy rằng khi anh ấy bắt đầu, anh ấy không đủ khả năng biên dịch nên anh ấy đã biên dịch thành nhị phân bằng tay trên giấy. Nếu bạn muốn thấy thứ gì đó còn hoang dã hơn, hãy đọc về các điều kiện theo đó Bill Gates và Paul Allen đã viết BASIC cho Altair 8800.

Về việc "viết một máy tính ở dạng nhị phân" - lùi một bước để trở thành một lập trình viên và suy nghĩ về những gì các máy tính ban đầu là. Thứ cấp cao chưa tồn tại - bạn nghĩ về mọi thứ ở cấp độ thấp bởi vì đó là tất cả. Bạn có phần cứng có thể thực hiện logic và số học cơ bản mà bạn thao tác thông qua mã máy (chỉ là phần tổng hợp - Amber giải thích tại sao phần này không khó thực hiện bằng tay) và bạn muốn phần cứng này thực hiện một số kỳ tích toán học nhất định. Bạn không lo lắng về hệ điều hành không tồn tại, bạn chỉ cho phần cứng (lắp ráp) cách thao tác với các số bạn cung cấp cho nó. Đó là một máy tính lớn. Máy tính ngày nay được chế tạo một cách trừu tượng tại một thời điểm.

Nếu bạn muốn phá vỡ rào cản khiến máy tính luôn có cảm giác như ma thuật, tôi thật sự khuyên bạn nên đọc CODE của Charles Petzold và / hoặc Các yếu tố của hệ thống máy tính . Chỉ cần có kiến ​​thức cơ bản về lập trình, những cuốn sách tuyệt vời có thể truy cập này sẽ giúp bạn hiểu máy tính từ trên xuống dưới. Rõ ràng, người ta không thể có được một comp. khoa học. hoặc bằng EE chỉ sau 2 cuốn sách, nhưng tôi có thể nói như một lập trình viên tự học đã bỏ lỡ khóa đào tạo chính thức: những cuốn sách này làm rung chuyển thế giới của tôi!


2
Viết trình thông dịch Altair BASIC sau khi thực hiện bán hàng? Mã hóa bootstrapper trên chuyến bay đến Albuquerque? Nghe có vẻ vô lý. Và vui vẻ.
Ehtesh Choudhury

2
@Shurane: ha! Những điểm đó cũng có liên quan nhưng với tôi thật khó hiểu về cách họ tạo ra trình thông dịch BASIC và cách nhóm nhồi nhét nó vào không gian nhỏ bé là một điều tuyệt vời và khả năng lập trình / tin tặc đáng kinh ngạc.
Dinah

10

Điều gì đã viết trình biên dịch đầu tiên đã chuyển đổi một cái gì đó thành các hướng dẫn nhị phân?

Một con người đã làm. Đọc về hệ thống A-0 :

Năm 1952, Grace Hopper hoàn thành trình biên dịch đầu tiên của mình cho Sperry, được gọi là A-0. Hệ thống A-0 là một tập hợp các hướng dẫn có thể dịch mã toán học tượng trưng sang ngôn ngữ máy. Khi sản xuất A-0, cô ấy đã lấy tất cả các chương trình con mà cô ấy đã thu thập trong nhiều năm và dán chúng vào băng. Mỗi thói quen được cung cấp một số cuộc gọi để máy có thể tìm thấy nó trên băng. "Tất cả những gì tôi phải làm là viết ra một tập hợp các số cuộc gọi, để máy tính tìm thấy chúng trên băng, mang chúng đến và thực hiện các bổ sung. Đây là trình biên dịch đầu tiên," như mô tả của Grace.


1
Liên kết dường như là 404 ngay bây giờ, trong mọi trường hợp, "Grace" ở trên là Grace Hopper.
Volker Stolz

2
Tôi đã nghe nói rằng Hopper đã viết trình biên dịch đầu tiên, nhưng phần mô tả ở trên làm cho nó nghe giống như một trình liên kết hơn là trình biên dịch. Tuy nhiên, câu chuyện hay. Thật đáng kinh ngạc khi nghĩ rằng đã có lúc các nhà khoa học máy tính hoài nghi về ý tưởng của trình biên dịch ...
Mark E. Haase

1
@mehaase đây là lý do tại sao nó được gọi là "trình biên dịch". nó tạo ra một tập hợp các thói quen, mỗi trong số đó (có khả năng) được viết bằng ngôn ngữ máy trực tiếp.
Elazar

@ MarkE.Haase Những người mà Hopper nhắc đến ở đây là các kỹ sư và nhà khoa học ứng dụng sử dụng máy tính để thực hiện các nhiệm vụ tính toán cụ thể; họ không phải là "nhà khoa học máy tính". Có một số ít các nhà điều khiển học vào khoảng năm 1952, nhưng tôi nghi ngờ rằng cô ấy đã nói chuyện với bất kỳ ai trong số đó.
Jim Balter

9

Các chương trình đầu tiên được viết bằng mã máy (không phải ngôn ngữ lắp ráp) - các số thực được cắm vào bộ nhớ máy tính bằng các công tắc. Chúng ta đã đi một chặng đường dài ...

Đôi khi điều này vẫn xảy ra ở một mức độ nhỏ - để vá các đoạn mã nhỏ hoặc tạo thunks. Tôi nhớ lại việc bấm số vào các chuỗi Cơ bản sau đó được thực hiện dưới dạng các chương trình con nhỏ, nhanh trên kính hiển vi ban đầu. Tôi cũng nhớ bật tắt các công tắc trên bảng mặt trước của PDP-11 để nhập chương trình bộ nạp khởi động vào bộ nhớ của nó cho một khóa học đại học.

Các chương trình này đôi khi sẽ được sử dụng để xử lý các tệp văn bản để tạo các chương trình khác và ngôn ngữ lập trình voila đã được tạo.


Câu hỏi là về trình biên dịch đầu tiên, không phải các chương trình đầu tiên nói chung, mặc dù các chương trình đôi khi là trình biên dịch; lịch sử của hai người không giống nhau. (Tương tự: câu trả lời cho câu hỏi khi nào những con vật đầu tiên xuất hiện trên Trái đất không phải là câu trả lời cho câu hỏi khi nào những con mèo đầu tiên xuất hiện trên Trái đất, mặc dù mèo là động vật.)
Jim Balter
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.