Các nhà lắp ráp đầu tiên được viết bằng mã máy?


41

Tôi đang đọc cuốn sách Các yếu tố của hệ thống máy tính: Xây dựng một máy tính hiện đại từ các nguyên tắc đầu tiên , trong đó có các dự án bao gồm việc xây dựng một máy tính từ các cổng boolean cho đến các ứng dụng cấp cao (theo thứ tự đó). Dự án hiện tại tôi đang thực hiện là viết một trình biên dịch bằng ngôn ngữ cấp cao mà tôi chọn, để dịch từ mã lắp ráp Hack sang mã máy Hack (Hack là tên của nền tảng phần cứng được xây dựng trong các chương trước). Mặc dù phần cứng đã được xây dựng trong một trình giả lập, tôi đã cố gắng giả vờ rằng tôi thực sự xây dựng từng cấp độ chỉ sử dụng các công cụ có sẵn cho tôi tại thời điểm đó trong quy trình thực.

Điều đó nói rằng, nó làm tôi suy nghĩ. Sử dụng ngôn ngữ cấp cao để viết trình biên dịch chương trình của tôi chắc chắn rất tiện lợi, nhưng đối với trình biên dịch chương trình đầu tiên từng được viết (tức là trong lịch sử), có cần phải viết bằng mã máy không, vì đó có phải là tất cả những gì tồn tại vào thời điểm đó không?

Và một câu hỏi tương quan ... ngày hôm nay thì sao? Nếu một kiến ​​trúc CPU hoàn toàn mới xuất hiện, với một tập lệnh hoàn toàn mới và một cú pháp lắp ráp hoàn toàn mới, trình biên dịch sẽ được xây dựng như thế nào? Tôi giả sử bạn vẫn có thể sử dụng ngôn ngữ cấp cao hiện có để tạo nhị phân cho chương trình biên dịch chương trình, vì nếu bạn biết cú pháp của cả ngôn ngữ lắp ráp và ngôn ngữ máy cho nền tảng mới của mình, thì nhiệm vụ viết trình biên dịch chương trình thực sự chỉ là một Nhiệm vụ phân tích văn bản và vốn không liên quan đến nền tảng đó (nghĩa là cần phải viết bằng ngôn ngữ máy của nền tảng đó) ... đó là lý do tôi có thể "gian lận" trong khi viết trình biên dịch Hack của mình vào năm 2012 và sử dụng một số từ trước ngôn ngữ cấp cao để giúp tôi ra.


17
Bạn luôn có thể viết một trình biên dịch chéo và sử dụng nó để tạo mã cho phần cứng mới hiện nay.
Kerrek SB

@PersonalNexus Cảm ơn vì điều đó, snafu chỉnh sửa về phần tôi.
yannis

1
@YannisRizos Không có vấn đề gì, xảy ra với những người giỏi nhất của chúng tôi :)
PersonalNexus

8
Có thể là trình biên dịch đầu tiên có thể đã được viết bằng cách lắp ráp trên một tờ giấy. Chuyển đổi thành mã máy sau đó có thể đã được thực hiện trên giấy và ghi vào một số loại ROM có công tắc, mỗi lần một từ.
mouviciel

Máy tính đầu tiên của tôi là ZX81, với RAM 1KB, vì vậy các chương trình mã máy (được thừa nhận ngắn gọn) của tôi trên thực tế được dịch bằng tay.
dùng281377

Câu trả lời:


36

đối với trình biên dịch đầu tiên từng được viết (tức là trong lịch sử), nó sẽ không cần phải được viết bằng mã máy

Không cần thiết. Tất nhiên, phiên bản đầu tiên v0.00 của trình biên dịch phải được viết bằng mã máy, nhưng nó sẽ không đủ mạnh để được gọi là trình biên dịch. Nó sẽ không hỗ trợ thậm chí một nửa các tính năng của trình biên dịch "thực", nhưng nó sẽ đủ để viết phiên bản tiếp theo của chính nó. Sau đó, bạn có thể viết lại v0.00 trong tập hợp con của ngôn ngữ hợp ngữ, gọi nó là v0.01, sử dụng nó để xây dựng bộ tính năng tiếp theo của trình biên dịch v0.02, sau đó sử dụng v0.02 để xây dựng v0.03 và cứ như vậy, cho đến khi bạn tới v1.00. Kết quả là, chỉ có phiên bản đầu tiên sẽ có mã máy; phiên bản đầu tiên được phát hành sẽ có ngôn ngữ lắp ráp.

Tôi đã phát triển bootstrapping của trình biên dịch ngôn ngữ mẫu bằng thủ thuật này. Phiên bản ban đầu của tôi là sử dụng các printfcâu lệnh, nhưng phiên bản đầu tiên tôi sử dụng trong công ty của mình là sử dụng bộ xử lý mẫu mà nó đang xử lý. Giai đoạn bootstrapping kéo dài chưa đầy bốn giờ: ngay khi bộ xử lý của tôi có thể tạo ra đầu ra hầu như không hữu ích, tôi đã viết lại bằng ngôn ngữ của chính nó, biên dịch và ném đi phiên bản không có templated.


4
Bạn vẫn còn có tất cả các giai đoạn? Tôi rất thích nhìn thấy chúng, và so sánh chúng với nhau. Chỉ để cảm nhận về quá trình bạn đã trải qua.
Marjan Venema

3
@MarjanVenema Không, tôi không còn sử dụng chúng nữa - Tôi đã xây dựng nó vào năm 1998 và tiếp tục sử dụng nó cho đến năm 2005, khi tôi phát hiện ra StringTemplate . Tôi đã ghi đè lên giai đoạn trước với giai đoạn tiếp theo khi tôi đang làm việc với phiên bản có thể sử dụng ban đầu. Chu kỳ phát triển của tôi bao gồm mã hóa công cụ mới, chạy trình tạo mã để tự xây dựng trong một thư mục riêng, chạy diffngược lại trình tạo mã hiện tại để thấy rằng phần mã được tạo không thay đổi theo cách không mong muốn, thay thế mã tại chỗ và chạy nó một lần nữa để kết thúc chu kỳ.
dasblinkenlight

Đáng tiếc nhưng có thể hiểu được :) Cảm ơn bạn đã mô tả những gì bạn đã làm (và cho liên kết).
Marjan Venema

3
Tôi nghĩ bạn cần phải giữ một số loại chuỗi bootstrapping. Mã máy => ASM giới hạn => ASM đầy đủ => Một số ngôn ngữ. Mặt khác, nếu bạn mất nhị phân bất kỳ bước nào trên đường đi, bạn sẽ bị vặn. (Hoặc bạn có thể có một C cross-biên soạn phiên bản, vì thực tế không phải tất cả những chương trình biên dịch C sẽ biến mất ngay lập tức.)
EDA-qa mort-ora-y

3
"Các tính năng" duy nhất mà trình biên dịch cần phải là trình biên dịch "thực" là để lắp ráp.
Miles Rout

23

Theo Wikipedia, ngôn ngữ lắp ráp / lắp ráp đầu tiên từng được triển khai cho IBM 701 bởi Nathaniel Rochester . (Các ngày là một chút không chắc chắn từ các bài viết Wikipedia. Nó nói rằng Rochester gia nhập IBM vào năm 1948, nhưng một tiểu bang trang Wikipedia rằng 701 đã được công bố công khai vào năm 1952. Và trang này IBM bang rằng "[a] ctual thiết kế bắt đầu vào ngày 1, 1951 và được hoàn thành một năm sau đó " .)

Tuy nhiên, "Trình biên dịch và trình nạp" của David Salomon (ở trang 7) rằng EDSAC cũng có trình biên dịch:

"Một trong những máy tính được lưu trữ chương trình đầu tiên là EDSAC (Máy tính tự động lưu trữ trễ điện tử) được phát triển tại Đại học Cambridge vào năm 1949 bởi Maurice Wilkes và W. Renwick. Ngay từ những ngày đầu tiên, EDSAC đã có một trình biên dịch, được gọi là Đơn đặt hàng ban đầu. trong một bộ nhớ chỉ đọc được hình thành từ một bộ chọn điện thoại quay và nó chấp nhận các hướng dẫn tượng trưng. Mỗi hướng dẫn bao gồm một ký tự ghi nhớ, một địa chỉ thập phân và trường thứ ba là một chữ cái. Trường thứ ba gây ra một trong 12 Các hằng số được lập trình viên cài sẵn sẽ được thêm vào địa chỉ tại thời điểm lắp ráp. " (Tài liệu tham khảo được bỏ qua ... xem bản gốc.)

Giả sử chúng tôi chấp nhận rằng "Đơn đặt hàng ban đầu" được ưu tiên, chúng tôi có bằng chứng rõ ràng rằng trình biên dịch đầu tiên được triển khai trong mã máy.

Mẫu này (viết các bộ lắp ráp ban đầu bằng mã máy) sẽ là chuẩn mực vào những năm 1950. Tuy nhiên, theo Wikipedia , "[a] ssemblers là công cụ ngôn ngữ đầu tiên tự khởi động". Xem thêm phần này giải thích cách mã máy được viết của trình biên dịch chương trình gốc được sử dụng để khởi động trình biên dịch chương trình nâng cao hơn được mã hóa bằng ngôn ngữ hợp ngữ.

Ngày nay, trình biên dịch và trình biên dịch được viết bằng các ngôn ngữ cấp cao hơn và trình biên dịch hoặc trình biên dịch cho kiến ​​trúc máy mới thường được phát triển trên một kiến ​​trúc khác và được biên dịch chéo.

.

Trang Wikipedia này về trình biên dịch và trình biên dịch bootstrapping đáng để đọc ... nếu tất cả điều này gây trở ngại cho bạn.


Upvote cho thực sự trả lời thay vì chỉ đoán. Đây là đọc thực sự thú vị!
JacquesB

14

Tôi đoán rằng các trình biên dịch đầu tiên được viết bằng mã máy, vì như bạn nói, không có gì khác có sẵn trước đó.

Tuy nhiên, ngày nay, khi một kiến ​​trúc CPU hoàn toàn mới xuất hiện, chúng tôi sử dụng cái được gọi là Cross-Compiler , một trình biên dịch tạo mã máy không phải cho kiến ​​trúc mà nó đang chạy, mà cho một kiến ​​trúc khác.

(Như một vấn đề thực tế, như tôi chắc chắn bạn sẽ tìm thấy sau này trong cuốn sách bạn đang đọc, hoàn toàn không có gì làm cho trình biên dịch vốn phù hợp hơn để tạo mã máy cho kiến ​​trúc mà nó đang chạy hơn bất kỳ kiến trúc khác. Đây chỉ là vấn đề mà kiến ​​trúc mà bạn, với tư cách là người tạo ra trình biên dịch, sẽ nhắm mục tiêu.)

Vì vậy, ngày nay thậm chí có thể (ít nhất là về mặt lý thuyết) để tạo ra một kiến ​​trúc hoàn toàn mới và có các trình biên dịch ngôn ngữ cấp cao vốn chạy trên nó (được biên dịch trên các kiến ​​trúc khác bằng trình biên dịch chéo) trước khi bạn thậm chí có trình biên dịch cho kiến ​​trúc đó.


12

Lúc đầu, "lắp ráp" được viết trên giấy và sau đó "biên dịch" thủ công lên thẻ đục lỗ.

Cha tôi đã làm việc với ZRA1 (xin lỗi, trang chỉ tồn tại bằng tiếng Đức, nhưng bản dịch Google vẫn ổn đến mức bạn thực sự có thể nhận được các sự kiện quan trọng nhất: D).
Cách thức hoạt động là viết mã của bạn ra giấy bằng một ngôn ngữ lắp ráp và thư ký sẽ thực sự phiên âm sang thẻ đục lỗ, sau đó chuyển chúng cho nhà điều hành và kết quả sẽ được trao lại vào sáng hôm sau.

Tất cả điều này về cơ bản là trước khi các lập trình viên có thể nhập dữ liệu qua bàn phím và xem nó trên màn hình.


3
Khi tôi học ở trường đại học, họ vẫn có những khối giấy được sử dụng để viết mã máy. Bạn viết chương trình bên phải, có các cột bên trái để dịch hướng dẫn sang hệ thập lục phân. Và một cột cho địa chỉ hiện tại. Những người lắp ráp đầu tiên thực sự là con người.
Florian F

9

Thật khó để chắc chắn về rất lắp ráp đầu tiên (khó có thể thậm chí xác định những gì đó là). Cách đây nhiều năm, khi tôi viết một vài bộ lắp ráp cho các máy thiếu bộ lắp ráp, tôi vẫn viết mã bằng ngôn ngữ lắp ráp. Sau đó, sau khi tôi có một phần mã hoàn thành hợp lý, tôi đã dịch nó thành mã máy bằng tay. Tuy nhiên, đó vẫn là hai giai đoạn hoàn toàn riêng biệt - khi tôi đang viết mã, tôi hoàn toàn không làm việc hoặc suy nghĩ ở cấp độ mã máy.

Tôi nên nói thêm rằng trong một vài trường hợp, tôi đã tiến thêm một bước: Tôi đã viết hầu hết mã bằng ngôn ngữ hợp ngữ mà tôi thấy đơn giản hơn để sử dụng, sau đó viết một hạt nhân nhỏ (ít nhiều chúng ta gọi là máy ảo) để giải thích rằng trên bộ xử lý đích. Đó là tốc độ cực kỳ chậm (đặc biệt là trên bộ xử lý 1 MHz, 8 bit), nhưng điều đó không quan trọng lắm, vì nó thường chỉ chạy một lần (hoặc nhiều nhất, một vài lần).


8

Bạn không cần một trình biên dịch để lắp ráp mã ngôn ngữ lắp ráp thành mã máy. Giống như bạn không cần một trình soạn thảo để viết mã ngôn ngữ lắp ráp.

Một viễn cảnh lịch sử

Các trình lắp ráp đầu tiên có thể được viết bằng ngôn ngữ lắp ráp và sau đó được lắp ráp bằng tay thành mã máy. Ngay cả khi bộ xử lý không có 'ngôn ngữ lắp ráp' chính thức thì các lập trình viên có thể đã thực hiện hầu hết công việc lập trình bằng cách sử dụng một số loại mã giả trước khi dịch mã đó thành hướng dẫn máy.

Ngay cả trong những ngày đầu tiên của máy tính , các lập trình viên đã viết các chương trình theo một loại ký hiệu tượng trưng và dịch chúng thành mã máy trước khi đưa nó vào máy tính của họ. Trong trường hợp của Augusta Ada King, cô sẽ cần phải dịch chúng thành các thẻ đục lỗ cho Công cụ phân tích của Babbage , nhưng than ôi nó không bao giờ được chế tạo.

Kinh nghiệm cá nhân

Máy tính đầu tiên tôi sở hữu là một chiếc máy tính xách tay Sinclair ZX81 (Timex 1000 tại Mỹ). Mặt sau của hướng dẫn sử dụng có tất cả thông tin bạn cần để dịch ngôn ngữ lắp ráp Z80 sang mã máy (thậm chí bao gồm tất cả các chế độ chỉ mục kỳ lạ mà Z80 có).

Tôi sẽ viết ra một chương trình (trên giấy) bằng ngôn ngữ lắp ráp và chạy nhanh qua mã. Khi tôi vui vì chương trình của mình không có lỗi, tôi sẽ tìm từng hướng dẫn ở mặt sau của hướng dẫn, dịch nó thành mã máy và viết mã máy xuống giấy. Cuối cùng, tôi sẽ nhập tất cả các hướng dẫn mã máy vào ZX81 của mình trước khi lưu nó vào băng và cố gắng chạy nó.

Nếu nó không hoạt động, tôi sẽ kiểm tra lại cách lắp ráp tay của mình và nếu có bản dịch sai, tôi sẽ vá các byte được tải từ băng trước khi lưu lại và thử lại để chạy chương trình.

Từ kinh nghiệm, tôi có thể nói với bạn rằng việc gỡ lỗi mã của bạn sẽ dễ dàng hơn nhiều nếu nó được viết bằng ngôn ngữ lắp ráp so với mã máy - do đó sự phổ biến của trình phân tách. Ngay cả khi bạn không có trình biên dịch, việc lắp ráp bằng tay ít xảy ra lỗi hơn là cố gắng viết mã máy trực tiếp, mặc dù tôi đoán một Lập trình viên thực sự như Mel có thể không đồng ý. *số 8')


5

Không có sự khác biệt sau đó hoặc bây giờ. Bạn muốn phát minh ra một ngôn ngữ lập trình mới, bạn chọn một trong những ngôn ngữ có sẵn cho bạn ngày hôm nay để làm trình biên dịch đầu tiên. trong một khoảng thời gian, nếu đó là mục tiêu của dự án, bạn tạo một trình biên dịch bằng ngôn ngữ đó và sau đó nó có thể tự lưu trữ.

Nếu tất cả những gì bạn có là bút chì và giấy và một số công tắc hoặc thẻ đục lỗ như giao diện người dùng của bạn với bộ hướng dẫn mới đầu tiên hoặc tiếp theo, bạn đã sử dụng một hoặc tất cả các mục có sẵn cho bạn. Bạn rất có thể đã viết một ngôn ngữ lắp ráp, trên giấy, và sau đó sử dụng một trình biên dịch, bạn, để chuyển đổi nó thành mã máy, có thể bằng bát phân, sau đó tại một thời điểm nào đó đã đi vào giao diện với máy.

Khi một bộ hướng dẫn hoàn toàn mới được phát minh ngày hôm nay, không khác nhau, tùy thuộc vào công ty / cá nhân, thực tiễn, v.v., rất có khả năng kỹ sư phần cứng có thể lập trình trong verilog hoặc vhdl, viết một vài chương trình thử nghiệm đầu tiên bằng mã máy (có thể ở dạng hex hoặc nhị phân). tùy thuộc vào các nhóm phần mềm tiến bộ, họ có thể rất nhanh hoặc không trong một thời gian rất dài chuyển sang ngôn ngữ lắp ráp và sau đó là trình biên dịch.

Các máy tính đầu tiên không phải là máy đa năng mà bạn có thể sử dụng để tạo các trình biên dịch và trình biên dịch từ đó. Bạn đã lập trình chúng bằng cách di chuyển một số dây giữa đầu ra của alu trước sang đầu vào của tiếp theo. Cuối cùng, bạn đã có một bộ xử lý đa năng để bạn có thể viết một trình biên dịch lắp ráp, tự lắp ráp nó, đưa nó vào dưới dạng mã máy, sau đó sử dụng nó để phân tích ebcdic, ascii, v.v. và sau đó tự lưu trữ. lưu trữ nhị phân vào một số phương tiện mà sau này bạn có thể đọc / tải mà không phải tiếp tục chuyển công tắc sang mã máy cấp liệu tay.

Hãy nghĩ về thẻ đục lỗ và băng giấy. Thay vì lật công tắc, bạn chắc chắn có thể tạo ra một cỗ máy cơ khí hoàn toàn, một thiết bị tiết kiệm lao động, tạo ra phương tiện mà máy tính sẽ đọc. Thay vì phải nhập các bit mã máy bằng các công tắc như bàn thờ, thay vào đó bạn có thể nạp băng giấy hoặc thẻ đục lỗ (sử dụng thứ gì đó cơ học, không phải bộ xử lý, đã cung cấp bộ nhớ hoặc bộ xử lý, HOẶC sử dụng bộ tải khởi động viết mã máy nhỏ). Đây không phải là một ý tưởng tồi bởi vì bạn có thể tạo ra thứ gì đó, được điều khiển bởi máy tính cũng có thể sản xuất một cách cơ học băng giấy hoặc thẻ đục lỗ, sau đó đưa chúng trở lại. Hai nguồn thẻ đục lỗ, thiết bị tiết kiệm lao động cơ học không dựa trên máy tính và máy tính điều khiển. cả hai đều tạo ra "nhị phân" cho máy tính.


1
+1 cho nhận xét "trình biên dịch, bạn". Thật dễ dàng để gắn liền với một định nghĩa của một từ (tức là chương trình hợp ngữ = phần mềm) nhưng nhận xét của bạn thực sự đặt lại quan điểm rõ ràng ... rằng "quy trình lắp ráp" chỉ là một hệ thống / thói quen, một cách dễ dàng có thể được thực hiện bởi một người lắp ráp.
The11

1
Ngoài ra, mọi người cứ bị mắc kẹt với ý tưởng này rằng các máy tính đời đầu có các bộ hướng dẫn. Những máy tính ban đầu là những phụ nữ có kỹ năng toán học tốt với bút chì và giấy, và đó là những gì họ được gọi là máy tính. sau đó những người phụ nữ đó (hoặc một người cụ thể) đã lập trình cho kẻ điên bằng cách kết nối dây không sử dụng một bộ hướng dẫn. Lập trình với một bộ hướng dẫn cũng được thực hiện tốt. Có, rất dễ bị cuốn vào việc sử dụng một từ hoặc thuật ngữ như trình biên dịch hoặc máy tính hoặc sớm.
old_timer

4

Có một hoặc hai trường hợp trong sở thú máy tính của Brook, nơi anh ta nói một cái gì đó như "mnemonics là phát minh của chúng tôi, nhà thiết kế chỉ đơn giản sử dụng opcode số hoặc nhân vật có mã là opcode", vì vậy có những máy móc thậm chí không có Hợp ngữ.

Nhập chương trình kết thúc gỡ lỗi ở bảng điều khiển phía trước (đối với những người chưa thực hiện, đó là cách để thiết lập bộ nhớ, bạn đặt một số công tắc đến địa chỉ, một số khác thành giá trị và nhấn nút hoặc nút khác để đọc giá trị) là phổ biến sau này Một số bộ đếm thời gian cũ khoe rằng họ vẫn có thể nhập mã khởi động cho các máy họ đã sử dụng rộng rãi.

Khó khăn trong việc viết mã máy trực tiếp và đọc chương trình từ kết xuất bộ nhớ phụ thuộc khá nhiều vào ngôn ngữ máy, một số trong số chúng tương đối dễ (phần khó nhất là theo dõi địa chỉ), x86 là một trong những điều tồi tệ hơn.


Pdp-11 thậm chí không có nút bấm sang trọng. Bạn có thể thay đổi bộ nhớ bằng cách nhập địa chỉ nhị phân trên 8 công tắc bật tắt và, giá trị trên 16 công tắc bật tắt sau đó nhấn nút. Tôi thực sự thấy ai đó sửa một chương trình lặp theo cách này!
James Anderson

2

Tôi đã chế tạo một máy tính vào năm 1975. Nó rất tiên tiến so với Altair hiện đại của nó, bởi vì nó có 'rom màn hình' cho phép tôi nhập các chương trình bằng cách nhập mã máy trong hex và xem mã này trên màn hình video, như với Altair mỗi lệnh máy phải được nhập một chút tại một thời điểm bằng cách sử dụng một hàng công tắc.

Vì vậy, có, trong những ngày đầu của máy tính và sau đó một lần nữa trong những ngày đầu của máy tính cá nhân, người ta đã viết các ứng dụng bằng mã máy.


2

Một giai thoại:

Khi tôi học ngôn ngữ lắp ráp, trên Apple] [, có một chương trình được bao gồm trong ROM được gọi là trình biên dịch vi mô. Nó đã dịch ngay lập tức hướng dẫn lắp ráp sang byte, khi bạn nhập chúng. Điều này có nghĩa là không có nhãn - nếu bạn muốn nhảy hoặc tải, bạn phải tự tính toán bù đắp. Nó dễ dàng hơn nhiều so với việc tìm kiếm các bố cục hướng dẫn và nhập các giá trị hex.

Không còn nghi ngờ gì nữa, các trình biên dịch thực sự được viết đầu tiên bằng cách sử dụng trình biên dịch vi mô hoặc một số môi trường không hoàn chỉnh khác.

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.