Ai đã tạo (các) ý tưởng của các cấu trúc vòng lặp đầu tiên?


53
while (1) {
      if (1+1==2) {
             print "Yes, you paid attention in Preschool!";
      } else {
             print "Wait... I thought 1+1=2";
      }
 }

Là một nhà phát triển, tất cả chúng ta phải sử dụng các vòng lặp rất thường xuyên. Chúng ta biết rằng. Điều tôi đã tự hỏi là, ai nghĩ ra ý tưởng có vòng lặp? Ngôn ngữ nào giới thiệu vòng lặp? Cấu trúc vòng lặp đầu tiên là gì? Đó có phải là một whilevòng lặp? Một forvòng lặp? Vân vân?


22
Charles Babbage và Ada Lovelace, rất có thể.
mcfinnigan

28
Nó được phát minh trong hướng dẫn gội đầu, xả, bôi, lặp lại. :-)
Guy Sirton

13
@GuySirton, Đừng ngớ ngẩn, đó là đệ quy.
mowwwalker

18
@ user838584 - nếu là đệ quy, mỗi lần repeatsẽ gọi một lần khác repeat- bạn sẽ không bao giờ kết thúc. Tôi nghĩ có thể phụ nữ đọc hướng dẫn gội đầu theo cách đó, nhưng đàn ông đọc nó như lặp đi lặp lại, và chỉ cần vài phút để gội đầu.
Steve314

3
Một máy tính không có vòng lặp là một máy tính.
starblue

Câu trả lời:


102

Như mouvicielEmilio Garavaglia đã lưu ý, khái niệm này có trước khi tính toán. Tuy nhiên, ví dụ đầu tiên của vòng lặp phần mềm là vòng lặp Ada Lovelace được sử dụng để tính các số Bernoulli , như được mô tả trong Chú giải G về bản dịch Phác thảo của Công cụ phân tích được phát minh bởi Charles Babbage , bởi LF Menabrea . Khả năng lặp của Công cụ phân tích được Menabrea ghi nhận sớm:

Điều này được hiểu, chúng ta, khi bắt đầu một loạt các hoạt động mà chúng ta muốn thực hiện, đặt kim C trên bộ phận 2, kim B trên bộ phận 5 và kim A trên bộ phận 9. Chúng ta hãy cho phép búa của mặt số C để tấn công; nó sẽ tấn công hai lần, đồng thời kim B sẽ vượt qua hai bộ phận. Sau đó sẽ chỉ ra số 7, thành công số 5 trong cột của sự khác biệt đầu tiên. Nếu bây giờ chúng ta cho phép búa của mặt số B tấn công lần lượt, nó sẽ tấn công bảy lần, trong thời gian đó kim A sẽ tiến lên bảy sư đoàn; những cái này được thêm vào số chín đã được đánh dấu bởi nó sẽ cho số 16, là số vuông liên tiếp đến 9. Nếu bây giờ chúng tôi đề xuất các thao tác này, bắt đầu bằng kim C, luôn luôn được để lại trên phân chia 2,

Cơ chế lặp của Công cụ phân tích được kế thừa trực tiếp từ máy dệt cơ của Joseph Marie Jacquard (1801), như được ghi chú trong hồi ký của Menabrea:

Bây giờ nó sẽ được hỏi làm thế nào máy có thể tự nó, và không cần phải nhờ đến bàn tay của con người, giả định các bố trí liên tiếp phù hợp với các hoạt động. Giải pháp cho vấn đề này đã được lấy từ bộ máy của Jacquard, được sử dụng để sản xuất các sản phẩm thổ cẩm, theo cách sau: -

Hai loài sợi thường được phân biệt trong các chất liệu dệt; một là sợi dọc hoặc sợi dọc, sợi kia là sợi ngang hoặc sợi ngang, được truyền tải bởi dụng cụ gọi là tàu con thoi và băng qua sợi dọc hoặc sợi dọc. Khi một công cụ gấm được yêu cầu, đến lượt nó là cần thiết để ngăn chặn một số chủ đề nhất định vượt qua âm thanh giả, và điều này theo một kế tiếp được xác định bởi bản chất của thiết kế sẽ được sao chép. Trước đây, quá trình này kéo dài và khó khăn, và điều cần thiết là người thợ, bằng cách tham dự vào thiết kế mà anh ta sẽ sao chép, nên tự mình điều chỉnh các chuyển động mà các luồng cần thực hiện. Từ đó phát sinh mức giá cao của mô tả chất liệu này, đặc biệt là nếu các sợi có nhiều màu khác nhau được đưa vào vải. Để đơn giản hóa sản xuất này, Jacquard đã nghĩ ra kế hoạch kết nối từng nhóm chủ đề sẽ hành động cùng nhau, với một đòn bẩy riêng biệt thuộc về nhóm đó. Tất cả các đòn bẩy này chấm dứt trong các thanh, được kết hợp với nhau trong một bó, thường có dạng song song với một đế hình chữ nhật. Các thanh có dạng hình trụ, và được ngăn cách với nhau theo các khoảng nhỏ. Do đó, quá trình nâng cao các luồng được giải quyết bằng cách di chuyển các đòn bẩy khác nhau theo thứ tự cần thiết. Để thực hiện điều này, một tấm bảng hình chữ nhật được lấy, có kích thước lớn hơn một phần so với một phần của bó đòn bẩy. Nếu tờ này được áp dụng cho đế của bó và một chuyển động tiến lên sau đó được truyền đến bảng, cái sau này sẽ di chuyển cùng với tất cả các thanh của bó, và do đó, các chủ đề được kết nối với mỗi trong số họ. Nhưng nếu bảng, thay vì đơn giản, bị xuyên thủng bằng các lỗ tương ứng với các cực của đòn bẩy đáp ứng nó, thì, vì mỗi đòn bẩy sẽ đi qua bảng trong quá trình chuyển động của cái sau, tất cả chúng sẽ vẫn ở trong chúng nơi. Do đó, chúng tôi thấy rằng thật dễ dàng để xác định vị trí của các lỗ trên bảng, rằng, tại bất kỳ thời điểm nào, sẽ có một số đòn bẩy nhất định, và do đó là các lô chỉ, được nâng lên, trong khi phần còn lại vẫn ở nơi chúng là. Giả sử quy trình này được lặp lại liên tục theo một luật được chỉ định bởi mẫu sẽ được thực thi, chúng tôi nhận thấy rằng mẫu này có thể được sao chép trên công cụ. Đối với mục đích này, chúng tôi chỉ cần soạn một loạt các thẻ theo luật pháp yêu cầu, và sắp xếp chúng theo thứ tự phù hợp cái khác; sau đó, bằng cách làm cho chúng vượt qua một chùm đa giác được kết nối với nhau để biến một mặt mới cho mỗi cú đánh của tàu con thoi, mặt đó sẽ được đặt song song với chính nó chống lại bó đòn bẩy, hoạt động nâng cao chủ đề sẽ được thực hiện thường xuyên. Do đó, chúng ta thấy rằng các mô gấm có thể được sản xuất với độ chính xác và nhanh chóng trước đây rất khó thu được.

Máy dệt của Jacquard là một ứng dụng rất sớm của một vòng lặp trong bối cảnh đặt hàng máy để tạo ra đầu ra lặp lại :

Ý tưởng đằng sau máy dệt Jacquard là một hệ thống thẻ đục lỗ và móc. Các thẻ được làm rất dày và có các lỗ hình chữ nhật được đục lỗ trong đó. Các móc và kim được sử dụng trong dệt được hướng dẫn bởi các lỗ trên bìa cứng. Khi các móc tiếp xúc với thẻ, chúng được giữ cố định trừ khi nó gặp phải một trong các lỗ đục lỗ. Sau đó, móc đã có thể đi qua lỗ bằng kim chèn một sợi khác, do đó tạo thành mẫu mong muốn. Các mẫu phức tạp đã đạt được bằng cách sắp xếp nhiều thẻ lần lượt từng thẻ và / hoặc được sử dụng nhiều lần.

Máy dệt của Jacquard cũng được công nhận là một hình thức rất sớm của một chương trình được lưu trữ :

Nếu động lực đằng sau sự phát triển của máy tính toán được thảo luận cho đến nay đã phát sinh từ tính toán số, thì động lực dẫn đến hình thức 'chương trình lưu trữ' sớm nhất là đến từ một nguồn rất khác: ngành dệt may. Chúng tôi đã thấy trước đó rằng một trong những khía cạnh cơ bản của hệ thống tính toán là khái niệm biểu diễn thông tin và mặc dù chúng tôi chưa thực hiện một cách rõ ràng, việc áp dụng ý tưởng này có thể được nhận thấy trong tất cả các đồ tạo tác mà chúng tôi đã kiểm tra cho đến nay: trong sự phát triển của các biểu diễn bằng văn bản cho các giá trị số và các vĩ tuyến cơ học xuất hiện từ các giá trị này. Do đó, sự liên kết của các viên sỏi trên khung bàn tính, vị trí của các thang di chuyển trên quy tắc trượt và cấu hình của các bánh răng bị kẹt trên các thiết bị của Schickard, Pascal và Leibniz, là tất cả các ví dụ về các kỹ thuật biểu diễn tìm cách đơn giản hóa các quy trình phức tạp làm cơ sở cho các nhiệm vụ số học. Tuy nhiên, có các loại thông tin và các đại diện của chúng, ngoài số lượng mà các quy trình tính toán có thể được thực hiện. Công nghệ dệt được phát triển bởi Joseph-Marie Jacquard vào năm 1801 minh họa một ví dụ về loại này.

Charles Babbage cũng điều chỉnh quy trình lưu trữ của Jacquard vào Công cụ phân tích , sự hiện diện hay vắng mặt của lỗ đã truyền một lệnh tắt đơn giản cho máy:

Công cụ phân tích có nhiều tính năng cần thiết được tìm thấy trong máy tính kỹ thuật số hiện đại. Nó được lập trình bằng cách sử dụng thẻ đục lỗ, một ý tưởng mượn từ máy dệt Jacquard được sử dụng để dệt các mẫu phức tạp trong hàng dệt may. Công cụ có 'Cửa hàng' nơi có thể giữ số và kết quả trung gian và 'Mill' riêng biệt nơi xử lý số học được thực hiện. Nó có một tiết mục nội bộ của bốn chức năng số học và có thể thực hiện phép nhân và chia trực tiếp. Nó cũng có khả năng cho các chức năng mà chúng ta có các tên hiện đại: phân nhánh có điều kiện, lặp (lặp), lập trình vi mô, xử lý song song, lặp, chốt, bỏ phiếu và tạo xung, trong số những thứ khác, mặc dù Babbage không sử dụng các thuật ngữ này. Nó có nhiều kết quả đầu ra bao gồm bản in cứng, thẻ đục lỗ,

Các nhánh có điều kiện của Công cụ phân tích kết hợp với các vòng cơ học và quy trình lưu trữ lấy cảm hứng từ Jacquard rất giống với ví dụ của bạn, đặc biệt là nếu chúng tôi thêm máy in của Babbage vào hỗn hợp, cho các print "...";bộ phận.

Rõ ràng là các vòng cơ học có trước máy dệt của Jacquard, thiết bị đầu tiên được biết đến hoạt động theo kiểu vòng lặpcơ chế Antikythera (100 BCE), và nếu chúng ta nhìn xa hơn vào lịch sử (và mạo hiểm một cách khủng khiếp về chủ đề), thì đồng hồ có lẽ là cơ chế lâu đời nhất của con người trong đó sự hiểu biết về các vòng lặp là hiển nhiên, dĩ nhiên sau đó là mô hình lặp lại của quỹ đạo của mặt trời và các sao khác.

Tuy nhiên, tôi nghĩ rằng trong bối cảnh điện toán (và không tính toán hay bất cứ điều gì khác), thuật toán tính toán số Bernoulli của Công cụ phân tích và Ada có thể được ghi nhận để giới thiệu các vòng lặp, chia sẻ ít nhất một số tín dụng với máy dệt của Jacquard, đã điều chỉnh trực tiếp khái niệm từ nó


3
Trước khung dệt của Jacquard, bạn có thể tìm thấy các vòng cơ học trong các caramon, chẳng hạn như vòng ở Bruges, nơi chuông được điều khiển bởi vòng quay của hình trụ .
mouviciel

6
@mouviciel Tôi thấy tiếng chuông quái dị của bạn và tôi nuôi bạn một cơ chế Antikythera. ; P
yannis

2
+1 cho câu trả lời bách khoa của bạn, bao gồm máy tính 2000 năm!
mouviciel

2
câu trả lời đẹp này làm tôi yêu thích câu hỏi. Nó không chỉ trả lời câu hỏi mà còn là một ví dụ về "cách trả lời câu hỏi". Làm tốt lắm, thưa ông.
Chani

Đã chấp nhận câu trả lời này bởi vì nó vừa mang tính kết luận, bách khoa, vừa đơn giản tuyệt vời!
Năng động

50

Vòng lặp tính toán trước. Bạn có thể tìm thấy chúng trong ký hiệu âm nhạc ngay từ khi ca tụng Gregorian:

lặp lại dấu hiệu


2
Đây có thể là một câu trả lời tuyệt vời nếu thêm một chút chi tiết được thêm vào nó. Tuy nhiên, công việc tuyệt vời.
Năng động

Vui lòng cung cấp thêm tài liệu tham khảo (ngày sớm nhất, ký hiệu âm nhạc sớm nhất để xây dựng các cấu trúc vòng lặp / lặp lại)
Skippy Fastol

@SkippyFastol Đó là trong bài viết đó: vi.wikipedia.org/wiki/Repeat_sign#Other_notation
cwallenpoole

32

Khái niệm "làm lại" bằng cách nào đó "nguyên thủy" đối với nhận thức của con người. Bạn có thể nói điều này với một đứa trẻ vừa mới xây dựng một sự hiểu biết tối thiểu về ngôn ngữ tự nhiên.

Trong các hệ thống rời rạc, các vòng lặp được tìm thấy trong tất cả các máy trạng thái hữu hạn khi bạn thừa nhận bạn có thể đạt đến trạng thái mà bạn đã từng có trước đây .

Vòng lặp đơn giản nhất là chu kỳ giữa hai trạng thái (đồng hồ). Cho rằng bất kỳ số lượng trạng thái cao hơn nào cũng có thể xuất phát từ số đếm từ nó, mọi máy phức tạp hơn được đặt trên một "bộ đếm" được tăng lên bởi một đồng hồ có thể thực hiện "nhảy" trên các cờ nhất định đại diện cho các hoạt động kết hợp nhất định. Đây là cốt lõi của máy Von Neumann mà mọi máy tính dựa trên bộ vi xử lý đều dựa trên.

Trong mã máy, một bước nhảy được mã hóa JP-Z-nnnn(trong đó Z là cờ ypu whatefer dựa trên điều kiện của bạn). Trong ngôn ngữ cấp cao hơn, dịch này gần như ngay lập tức vào

if(z) goto x;

Một vòng lặp không có gì khác hơn là một gotonhãn x đặt trước lệnh goto.

Mỗi công thức khác (ví, làm, trong khi, vv) chỉ là "đường cú pháp" để tốt hơn thuần hóa các hoang dã goto trong các trường hợp rất phổ biến của lặp đi lặp lại cho đến khi có chuyện xảy ra


4

Khái niệm về vòng lặp là một trong những điều giúp phân biệt một máy tính toàn diện với một máy tính đơn giản. Nếu một hệ thống không hỗ trợ vòng lặp thì nó không hoàn chỉnh và do đó không phải là máy tính.

Thiết kế hoàn chỉnh Turing đầu tiên là Công cụ phân tích của Babbage , do đó, nó phải có một khái niệm về vòng lặp. Tuy nhiên, có những hệ thống có vòng lặp nhưng không hoàn thành Turing (vì chúng bỏ sót thứ gì khác). Mặc dù vậy, công việc của Babbage có lẽ là một điểm khởi đầu tốt.


6
Tính toán lambda không có vòng lặp (và không có điều kiện hoặc bước nhảy), nhưng nó đã hoàn tất. Đệ quy cũng mạnh mẽ như lặp đi lặp lại.

3
bạn có thể viết lại bất kỳ vòng lặp nào thành một hàm đệ quy và loại bỏ các vòng lặp
ratchet freak

5
Bài viết trên wikipedia về các vòng lặp mô tả đệ quy như một cách thể hiện một vòng lặp, thay vì một khái niệm hoàn toàn không liên quan. vi.wikipedia.org/wiki/Program_loop#Loops Đối với CPU không có vòng lặp, chúng có các công cụ cần thiết để thực hiện chúng (nhảy đến một địa chỉ bộ nhớ tùy ý)
GordonM

8
Chính xác, đệ quy có thể được sử dụng để thể hiện các vòng lặp. Đó một khái niệm khá khác biệt, mặc dù chúng là đẳng cấu với nhau. Một cốc cà phê không phải là một chiếc bánh rán chỉ vì các nhà nghiên cứu hàng đầu bị cáo buộc nhầm lẫn chúng.

4
Đúng, nhưng bất kỳ hệ thống hoàn chỉnh nào cũng phải có cách thể hiện khái niệm thực hiện cùng một chuỗi nhiều lần, cơ chế có thể được đệ quy hoặc nhảy lùi trong danh sách hướng dẫn hoặc bất cứ điều gì khác đạt được hiệu quả tương tự. Nếu một hệ thống không cung cấp bất kỳ cách lặp lại một bộ hướng dẫn nào (ngoài việc lặp lại một cách vật lý các hướng dẫn trong danh sách) thì nó không thể hoàn thành Turing. Công cụ phân tích đã hoàn thành Turing, do đó, nó phải thực hiện việc lặp ở dạng này hay dạng khác.
GordonM

3

Giả sử bạn có nghĩa là ngôn ngữ lập trình máy tính văn bản hiện đại.

Algol60 có "CHO", "DO", "UNTIL" và "WHILE", vì vậy đó là trước năm 1960.

Các Bảo tàng Computing Retro có một vài ngôn ngữ trước năm 1960.

Kvikkalkul , ngôn ngữ từ thập niên 50 để lập trình phụ hạt nhân Thụy Điển chỉ có GOTO. (Tuy nhiên, Kvikkalkul gần như chắc chắn là một trò lừa bịp từ những năm 90, không phải là một ngôn ngữ lịch sử thực sự.)

Plankalkül của Konrad Zuse là sớm nhất tôi có thể tìm thấy. Nó có cấu trúc "für".


Plankalkül về cơ bản không được công bố cho đến thời gian gần đây, và Kvikkalkul từ lâu đã được đồn đại là một trò lừa bịp. Trong ánh sáng đó, tín dụng có lẽ phải đến John Backus và nhóm FORTRAN , người có trình biên dịch đang chạy trong lĩnh vực này vào năm 1957, với DOcác vòng lặp.
Ross Patterson

2

Công việc của cả Liebniz và Newton đều chứa các thuật toán với các cấu trúc vòng lặp. Liebniz đã chế tạo một máy tính cơ học và suy đoán (như Lovelace đã làm nhiều năm sau đó) về một cỗ máy để thực hiện phân tích tinh vi hơn. Ghi chú của ông về những ý tưởng này còn sơ sài, nhưng chúng mô tả logic được đặt ra với các vòng lặp.

Tuy nhiên, ý tưởng về các chuỗi lặp lại và đếm các vòng lặp được kiểm soát, cũng như những gì chúng ta sẽ gọi trong khi các vòng lặp được thảo luận trong công việc của người đàn ông được đặt tên là thuật toán: Muhammad ibn Musa al-Khwarizmi từ Thế kỷ thứ chín. Cuốn sách thứ hai của ông, al-Kitab al-mukhtasar fi hisab al-jabr wa'l-muqabala (Tiếng Ả Rập, tiếng Ba Lan, tiếng Ba Lan .

Tất nhiên, al-Khwarizmi, một phần, dựa vào người Hy Lạp cổ đại. Tại một số điểm, chúng tôi có thể quay lại phiên bản súc rửa, lặp lại, lặp lại của Adam và Eva.

Để biết thêm về Al-Khwārizmī và công việc của anh ấy, xem:

http://www-groups.dcs.st-andrews.ac.uk/history/Mathicalians/Al-Khwarizmi.html

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.