Điều gì đến đầu tiên, trình biên dịch, hoặc nguồn?


17

Tôi tò mò về sự ra đời của trình biên dịch. Làm thế nào để lập trình bắt đầu? Trước tiên, mọi người có xây dựng phần cứng nhận ra một nhóm lệnh nhất định hay mọi người đã xác định ngôn ngữ và sau đó xây dựng phần cứng xung quanh nó? Và trên một lưu ý liên quan, ngôn ngữ lập trình đầu tiên là gì?



1
Một trong những câu hỏi phụ là một câu hỏi theo đúng nghĩa của nó: Ngôn ngữ lập trình đầu tiên được viết cho máy tính là gì? .
Đánh dấu gian hàng

Chắc chắn đây là thứ bạn có thể tra cứu ?
Caleb

@Caleb đọc các bình luận trong câu trả lời của SkyDan ..
David Cowden

2
@Brian Giả định hợp lệ, nhưng hóa ra là sai. Đây hoàn toàn không phải là vấn đề trứng gà, có một câu trả lời rất rõ ràng (gợi ý: phần được bình chọn cao nhất dưới đây là sai). Mã nguồn dài trước trình biên dịch.
Konrad Rudolph

Câu trả lời:


30

Điều này có một câu trả lời rất rõ ràng, thực sự: Mã nguồn xuất hiện đầu tiên - bởi một biên độ lớn.

Trước khi đưa ra các chi tiết kỹ thuật, một chút quan điểm:

Các ngôn ngữ lập trình đầu tiên được tất cả các dịch sang ngôn ngữ máy hoặc lắp ráp bằng tay . Ý tưởng sử dụng một phần mềm để tự động hóa bản dịch này (thông qua trình biên dịch hoặc người đánh giá) luôn xuất hiện sau đó và không còn trực quan nữa.

Hãy xem xét trích dẫn này của bài viết Wikipedia trên FORTRAN để minh họa các trình biên dịch miễn cưỡng phải đối mặt:

Trình biên dịch FORTRAN đầu tiên [được] giao vào tháng 4 năm 1957. Đây là trình biên dịch tối ưu hóa đầu tiên, vì khách hàng không muốn sử dụng ngôn ngữ lập trình cấp cao trừ khi trình biên dịch của nó có thể tạo mã có hiệu năng tương đương với ngôn ngữ lắp ráp được mã hóa bằng tay . [nhấn mạnh của tôi]

=> Vào thời điểm trình biên dịch FORTRAN tung ra thị trường (1957), mọi người đã vui vẻ lập trình cả về ngôn ngữ lắp ráp và FORTRAN.

Trường hợp tương tự đối với LISP (từ Hacker & Painters ):

Steve Russell nói, nhìn xem, tại sao tôi không lập trình eval này, và tôi đã nói với anh ta, ho, ho, bạn đang nhầm lẫn lý thuyết với thực tiễn, eval này là dành cho việc đọc, không phải để tính toán. Nhưng anh ấy đã đi trước và làm điều đó. Đó là, anh ta đã biên soạn eval trong bài báo của tôi thành mã máy 704 của IBM, sửa lỗi và sau đó quảng cáo đây là một trình thông dịch Lisp, điều này chắc chắn là như vậy. Vì vậy, vào thời điểm đó, Lisp về cơ bản là hình thức như ngày nay ... "

Một lần nữa, không chỉ mã nguồn (trong LISP) có trước trình thông dịch, cái sau thậm chí còn không được ẩn trong cái trước.

Nhưng những phát triển này là tương đối muộn. Ngay cả khi không xem xét chương trình đầu tiên liên quan đến Công cụ phân tích của Charles Babbage và Ada Lovelace , vẫn có các ngôn ngữ lập trình trong thế kỷ 20 có trước các trình biên dịch:

Plankalkül của Konrad Zuse và cấu trúc toán học của calcul- compus được giới thiệu bởi Alonzo Church. Cả hai đều là ngôn ngữ lập trình được chỉ định chính thức, nhưng không có trình biên dịch tại thời điểm đó.

Để đưa điều này vào viễn cảnh,-compus có từ những năm 1930 và Plankalkül được phát triển vào khoảng năm 1945. Ngược lại, trình biên dịch FORTRAN đầu tiên xuất hiện vào năm 1957 (nhưng ba năm sau FORTRAN được chỉ định).


Câu trả lời chính xác! Tôi không biết mã được sử dụng để biên dịch bằng tay, nhưng điều đó có ý nghĩa.
ckb

10

Lập trình bắt đầu với việc mọi người viết mã máy trực tiếp vào bộ nhớ, vào thẻ đục lỗ và băng giấy hoặc thậm chí rút ngắn các liên kết trên bảng vá lỗi. Cho dù phần cứng được xây dựng xung quanh nhu cầu của phần mềm hay ngược lại rất khó để nói. Chắc chắn là thiết kế sớm nhất cho một máy tính lập trình hoàn chỉnh , công cụ phân tích của Babbage, chương trình tài liệu đầu tiên của Ada Lovelace .

Đối với ngôn ngữ lập trình đầu tiên, tôi đã lập luận rằng đó là ngôn ngữ máy của công cụ phân tích của Babbage (từ câu hỏi Ngôn ngữ lập trình đầu tiên được viết cho máy tính là gì? )

Để trả lời câu hỏi trong tiêu đề câu hỏi của bạn, vì ngôn ngữ hợp ngữmã nguồn và các ngôn ngữ lắp ráp trước các ngôn ngữ cấp cao có thể được biên dịch thành trình biên dịch, mã nguồn xuất hiện đầu tiên.

Ngoài ra, một trình biên dịch chưa bao giờ là cần thiết , chỉ cần thuận tiện.

Hoàn toàn có thể ghi phần mềm trực tiếp vào bộ nhớ nếu bạn đã ghi nhớ các bảng mã op phù hợp . Trên thực tế, một số máy tính ban đầu yêu cầu người dùng bấm mã bootstrap trên bàn phím hex bảng mặt trước để khởi động chúng, nhưng bạn có thể nhấn vào bất kỳ mã nào bạn thích và nó sẽ được chạy.

Phải thừa nhận rằng như CPU của trở nên phức tạp hơn, điều này trở nên khó khăn hơn, nhưng đơn giản tập lệnh như 6809 hay Z80 (bỏ qua tất cả các phương thức được lập chỉ mục lạ) là tương đối dễ dàng để chương trình thậm chí không có một lắp ráp , chứ chưa nói đến một trình biên dịch từ một ngôn ngữ cấp cao.

Nếu công cụ phân tích của Babbage đã từng được chế tạo, tôi chắc chắn rằng đã có một steam steam Mel , viết các chương trình tối ưu hóa trực tiếp lên thẻ máy dệt.


1
Bạn đã thực sự đọc định nghĩa về mã nguồn tại liên kết wikipedia mà bạn đã đăng chưa? Như đã nói ở trên, mã máy không phải là mã nguồn. Và mã máy! = Lắp ráp. Mã máy đã ở đó đầu tiên.
Chiếm

@MarkBooth Tôi nghĩ MIPS và AVR thậm chí còn đơn giản hơn ..
David Cowden

4
@occulus - Ngôn ngữ lắp ráp không phải là mã nguồn theo cách nào ? Ngôn ngữ hội đồng ánh xạ một hướng dẫn ngôn ngữ lắp ráp thành một mã máy và có thể được lắp ráp một cách tầm thường trong đầu bạn, nếu bạn biết các bảng mã op của mình. Thành thật mà nói, trẻ em những ngày này ... * 8 ')
Mark booth

1
Đối với tôi, ngôn ngữ lắp rápmovl $0, -20(%rbp), trong khi mã máyC745EC00000000, và đó là ngôn ngữ sau (tốt, giống như nó) lần đầu tiên được nhập hoặc đọc thủ công từ băng giấy. Về việc liệu mã máy có được tính là mã nguồn hay không , tôi có xu hướng nói "bất cứ điều gì làm nổi thuyền của bạn". Nếu bạn bật nó bằng tay, thì ừ, tôi sẽ nói nó có giá trị.
John Bode

@JohnBode - Ồ tôi đồng ý, nhưng với sự tương ứng 1: 1 giữa hướng dẫn lắp ráp và hướng dẫn mã máy, lắp ráp chỉ là vấn đề dịch cơ học (lắp ráp), logic là giống hệt nhau. Quá trình biên dịch hàm ý nhiều phức tạp hơn nhiều: nhiều bản dịch (mặc dù Occam là ngôn ngữ cấp cao và nhiều câu lệnh Occam ánh xạ 1: 1 vào các hướng dẫn của Transputer do kiến trúc MISC của nó . * 8 ').
Đánh dấu gian hàng

6

Trình biên dịch là lần đầu tiên . Nó được viết trực tiếp bằng mã máy, vì nguồn không thể được biên dịch nếu không có trình biên dịch.

Các bài viết trên Wikipedia như thế này về Ngôn ngữ máy tính có thể trả lời hầu hết các câu hỏi. Nếu không, chỉ cần chọn một trong những cuốn sách của Tanenbaum, như Tổ chức máy tính có cấu trúc , có thể trả lời nhiều câu hỏi hơn bạn có thể hỏi :)

Tôi không thể nói bất cứ điều gì cụ thể hơn, vì câu hỏi của bạn quá rộng.


20
Cũng có thể lập luận rằng nguồn là đầu tiên, bởi vì đối với "máy tính" đầu tiên, nguồn tương đương với nhị phân (tức là chúng được lập trình trực tiếp bằng ngôn ngữ có thể đọc được bằng máy).
Joachim Sauer

5
@Joachim Theo định nghĩa, mã nguồn là văn bản có thể đọc được do trình biên dịch dịch thành mã máy. Do đó, bản thân mã máy không phải là mã nguồn.
SkyDan

11
Trình biên dịch là lần đầu tiên, nhưng nó đã được thực hiện trong các mạng thần kinh sinh học.
Den

8
Tại sao điều này được bình chọn cao như vậy? Nó sai. Mã nguồn trong các ngôn ngữ cấp cao (đáng chú ý là calcul-tính toán, Plankalkül và LISP) có trước cả trình biên dịch và trình thông dịch. Điều này thậm chí không tính đến các chương trình bán chính thức mà Ada Lovelace đã viết.
Konrad Rudolph

4
@SkyDan Định nghĩa của bạn là gì? Tôi biết không có định nghĩa hợp lý nào cho câu trả lời của bạn là chính xác (cả hai cho trình biên dịch mã hóa và mã nguồn của James trong một ngôn ngữ cấp cao - hãy nói một cách cấp thấp).
Konrad Rudolph

4

Các trình thông dịch tồn tại trước các trình biên dịch để mã nguồn tồn tại trước các trình biên dịch.

Có một số bài viết rất thú vị về lịch sử điện toán ở đây . Mã nguồn cho trình biên dịch FORTRAN II được cho là có sẵn, nhưng các liên kết đó đã bị hỏng.

Bài viết này , từ năm 1954, mô tả trình thông dịch Whirlwhind.


1

Câu hỏi này rất quan trọng đối với việc giải thích ngữ nghĩa của chúng tôi về 'mã nguồn'. Nếu chúng ta định nghĩa nó là 'hướng dẫn máy tính dựa trên văn bản được biên dịch', thì có lẽ trình biên dịch đã xuất hiện trước.

Tôi có xu hướng đi cùng với một cái gì đó có thẩm quyền hơn, chẳng hạn như bài viết "Tại sao phân tích và thao tác mã nguồn sẽ luôn luôn quan trọng" được trình bày tại Hội nghị làm việc quốc tế lần thứ mười về phân tích và thao tác mã nguồn

Định nghĩa 1 (Mã nguồn): Với mục đích rõ ràng, "mã nguồn" được dùng để có nghĩa là bất kỳ mô tả thực thi đầy đủ nào của một hệ thống phần mềm. Do đó, nó được hiểu là bao gồm mã máy, ngôn ngữ cấp rất cao và biểu diễn đồ họa thực thi của các hệ thống.

Và tôi nghĩ rằng câu trả lời của bạn tiềm ẩn trong định nghĩa đó - mã nguồn chắc chắn xuất hiện đầu tiên.


Có lẽ, một trình biên dịch đã xuất hiện đầu tiên - chỉ khi bạn xác định được dịch được biên dịch bởi vì được dịch bởi một công cụ tự động, chứ không phải là dịch sang mã máy bằng tay.
Konrad Rudolph

Giấy rất thú vị. Tôi thích định nghĩa về mã nguồn - mặc dù nó khiến câu hỏi của tôi trở thành một câu hỏi không thực sự ..
David Cowden

@KonradRudolph không phải là đơn vị thực hiện việc biên dịch, cho dù đó là sự can thiệp của máy móc, con người hay thần thánh, được gọi là 'trình biên dịch'?
Kirk Broadhurst

0

Các thuật toán được sắp xếp ra giấy, sau đó alus được nối dây vật lý / cơ học (dây di chuyển). để thay đổi chương trình, bạn di chuyển dây và chạy lại.

Sau đó, ngôn ngữ lắp ráp được sắp xếp ra giấy, dịch sang mã máy bằng tay, sau đó sử dụng các công tắc, vv để đưa nó vào ram. Hoặc thẻ đục lỗ, vv Cuối cùng, bạn có thể tạo một trình biên dịch chương trình, sau đó bạn có thể lập trình trong phần lắp ráp không phải mã máy, sau đó bạn có thể tạo một trình biên dịch. Cuối cùng, bạn có thể bootstrap trình biên dịch đó. Và tạo ngôn ngữ mới và trình biên dịch mới, v.v.

Ngôn ngữ đầu tiên không phải là ngôn ngữ, sau này ngôn ngữ đầu tiên là ngôn ngữ lắp ráp. đối với mọi bộ xử lý, ngôn ngữ đầu tiên là ngôn ngữ lắp ráp (xuất phát từ mã máy). Tập lệnh được thiết kế trước sau đó là phần cứng để thực hiện nó sau đó là trình biên dịch, sau đó là trình biên dịch.

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.