Alan Perlis หมายถึงอะไรเกี่ยวกับวิธีการเขียนโปรแกรมที่ปราศจากข้อผิดพลาด [ปิด]


29

มีใบเสนอราคาโดยAlan J. Perlisที่พูดว่า:

มีสองวิธีในการเขียนโปรแกรมที่ปราศจากข้อผิดพลาด เฉพาะอันที่สามเท่านั้น

ฉันเพิ่งได้ยินคำพูดนี้จากเพื่อนของฉันและไม่สามารถเข้าใจความหมายที่ลึกกว่านั้น

Perlis พูดถึงอะไรที่นี่?


1
คุณตระหนักถึงความผิดพลาดในเรื่องล้อเลียนนี้เช่นกันเนื่องจากเป็นไปได้ที่จะเขียนโปรแกรมที่ไม่ใช่เรื่องผิดพลาดซึ่งปราศจากข้อผิดพลาด

1
ประเภทของคำถามนี้ขณะนี้ถูกกล่าวถึงในเว็บไซต์เมตาการสนทนาของเรา

1
การอ่านที่แนะนำ: อภิปราย $ {blog}
gnat

คำตอบ:


41

หมายความว่าไม่มีโปรแกรมที่ปราศจากข้อผิดพลาด คำพูดที่ลึกซึ้งเกี่ยวกับวิธีการหลีกเลี่ยงข้อผิดพลาดที่มีข้อผิดพลาดนั้นเป็นเรื่องล้อเลียน


3
Alan Perlis มีคำพูดอย่างแน่นอน
Frank Shearar

2
มันเป็น "ล้อเลียน" ที่มีความสำคัญในความหมายของคำพูดนี้
Adam Harte

60

ไม่มีวิธีที่สาม

ไม่มีวิธีเขียนโปรแกรมที่ปราศจากข้อผิดพลาด



14

ในฐานะที่เป็นคำตอบอื่น ๆ อีกมากมายได้ชี้แล้วออกมีวิธีการเขียนโปรแกรมปราศจากข้อผิดพลาดใด

แต่สิ่งที่ฉันอยากจะชี้ให้เห็นก็คือธรรมชาติของเมตาที่มีศักยภาพของคำพูด มันเป็นข้อผิดพลาดนอกขอบเขต ในคำสั่งแรกเขากำหนดจักรวาลหรือ "รายการ" มีเพียงสองความเป็นไปได้หรือองค์ประกอบ แต่ในคำแถลงที่สองเขาอ้างถึงบุคคลที่สาม ซึ่งไร้สาระ! ผิดกฎหมายแม้แต่! องค์ประกอบที่สามที่กำหนดขอบเขตองค์ประกอบที่สองเป็นข้อผิดพลาด

ลึกซึ้งอย่างแท้จริงในการอ้างว่าสามารถที่จะแสดงให้เห็นถึงสาระสำคัญมากที่จะอ้างอิง


มีวิธีการพิสูจน์ว่าโปรแกรมทำงานตามที่ระบุไว้ ที่ใช้เช่นสำหรับโรงงานนิวเคลียร์ ...

1
@ Thorbjørn Ravn Andersen ตามที่ระบุไม่ได้หมายความว่าปราศจากข้อผิดพลาด
CaffGeek

5

ซึ่งหมายความว่าโปรแกรมที่ไม่น่ารำคาญทั้งหมดจะมีข้อบกพร่อง มันเป็นวิธีที่ตลกที่จะบอกว่าไม่มีวิธีเขียนโปรแกรมที่ปราศจากข้อผิดพลาด


5

เป็นไปได้ที่จะเขียนโปรแกรมที่ปราศจากข้อผิดพลาดแม้กระทั่งโปรแกรมที่ไม่น่ารำคาญและยังพิสูจน์ว่าถูกต้อง พิจารณาตัวอย่างภาษาเช่น Coq, Epigram หรือ Agda ที่ทำสิ่งนี้

ลังเลปัญหากล่าวว่ามันเป็นไปไม่ได้ที่จะทำเช่นนี้สำหรับโปรแกรมทั่วไป


ย้อนกลับไปที่ทีมของ Don Good ที่ UT Austin และทำงานในช่วงทศวรรษ 1970 และ 1980 ด้วย Gypsy Verification Environment พวกเขาแสดงให้เห็นว่ารหัสที่ปราศจากข้อผิดพลาดนั้นเป็นไปได้โดยการส่งมอบ Message Flow Modulator ที่ปราศจากข้อผิดพลาดให้กับกองทัพเรือ ชุดทดสอบการยอมรับได้รับการพัฒนาโดยกลุ่มที่แตกต่างอย่างสิ้นเชิง เมื่อ MFM เห็นชุดการทดสอบการยอมรับเป็นครั้งแรกที่การทดสอบการยอมรับมันผ่านไปโดยไม่มีการเบี่ยงเบนไม่มีการยกเว้นหรือ "ใช่ แต่"
John R. Strohm

3

สิ่งนี้ทำให้ฉันนึกถึงเสื้อเนิร์ดที่ฉันเห็น: มีคน 10 ประเภทในโลกนี้ ผู้ที่รู้เลขฐานสองและผู้ที่ไม่รู้จัก

นอกจากนี้ยังอาจเล่นกับความจริงที่ว่าบางครั้งรายการมีการจัดทำดัชนี 0 $ var = array ('First', 'Second', 'Third'); และคุณสามารถเข้าถึงรายการนี้ได้เช่น: $ var [0] = 'First' $ var [1] = 'ที่สอง' $ var [2] = 'Third'

ดังนั้นดัชนีอาเรย์ตัวอักษร 2 ชี้ไปที่ดัชนี "สาม"


... และผู้ที่เริ่มต้นสร้างดัชนีที่ศูนย์

2

สิ่งนี้มีการอธิบายในคำอื่น ๆ แต่ไม่ชัดเจนเท่าที่ฉันคิดว่ามันควรจะเป็น หมายความว่าคุณจะลองทั้งสองวิธีพวกเขาจะมีข้อผิดพลาดและสุดท้ายคุณจะแก้ไขข้อบกพร่องของคุณและมีโปรแกรมที่ปราศจากข้อผิดพลาด เปรียบเทียบกับข้อความอ้างอิงอื่น:

วิธีเดียวสำหรับข้อผิดพลาดที่จะเกิดขึ้นในโปรแกรมคือการวางโดยผู้เขียน ไม่ทราบกลไกอื่น ๆ โปรแกรมไม่สามารถรับข้อบกพร่องด้วยการนั่งรอบ ๆ กับโปรแกรมบั๊กกี้อื่น ๆ - โรงงานฮาร์ลาน

(อีกวิธีหนึ่งคุณสามารถอ่านสิ่งนี้ได้ตามที่ปิแอร์พูด (ซึ่งฉันคิดว่ายืดออกได้) (วิธีที่สามซึ่งไม่มีอยู่ในโดเมนใช้งานได้) อย่างที่ฉันพูดมันยืดออก แต่จริง


1

นี่เป็นคำพูดเดียวกับที่พ่อของฉันใช้บอกฉันเมื่อฉันแก้ตัว คำพูดมีแนวโน้มที่จะเป็นเช่น: "มี 3 ด้านของเรื่องราวด้านของคุณด้านของคุณและด้านขวา / จริง / ถูกต้อง"

การใส่สิ่งนี้เข้ากับบริบทของการพัฒนา (และเป็นผู้ทดสอบซอฟต์แวร์โดยศ.) ฉันจะบอกว่าเนื่องจากมีหลายวิธีในการเขียนโค้ดบางอย่างที่ควรใช้กับ "มีการเข้ารหัส 3 ด้านรหัสของคุณรหัสของพวกเขาและ รหัสการปรับโครงสร้างใหม่ "

ฉันคิดว่าเป็นเพราะโปรแกรมเมอร์ / นักพัฒนามักจะ refactor เมื่อผลิตภัณฑ์มีเสถียรภาพซึ่งส่วนใหญ่สายเกินไป แต่ส่วนใหญ่ refactor ทำเพื่อปรับปรุงสิ่งที่คุณและเพื่อนไม่ได้ทำในครั้งแรก

หวังว่านี่จะช่วยได้


1

ฉันคิดว่าในทางเทคนิคแล้วคุณสามารถเขียนโปรแกรมที่ไม่ใช่ข้อผิดพลาดได้ฟรี แต่เนื่องจากปัญหา Halting มันเป็นไปไม่ได้ที่จะพิสูจน์ว่ามันปราศจากข้อผิดพลาด ดังนั้นเราต้องทำงานภายใต้สมมติฐานที่ว่าทุกโปรแกรมมีข้อบกพร่องเนื่องจากไม่สามารถพิสูจน์ได้เป็นอย่างอื่น

http://en.wikipedia.org/wiki/Halting_problem

อัปเดต: คุณสามารถพิสูจน์ได้ว่าอัลกอริทึมเฉพาะจะส่งคืนคำตอบที่ถูกต้อง แต่นั่นไม่ใช่สิ่งเดียวกับการพิสูจน์ว่ามันถูกต้องทั้งหมด http://en.wikipedia.org/wiki/Correctness_(computer_science )

อย่างไรก็ตามประเด็นของฉันคือการอ้างถึงความจริงที่ว่าต้องถือว่าโปรแกรมมีข้อบกพร่องเสมอและพยายามอธิบายว่าทำไมเป็นกรณี http://en.wikipedia.org/wiki/Software_bug#Bug_management


1
ดังที่โทนี่มอร์ริสกล่าวว่าเป็นไปได้ที่จะพิสูจน์ว่าโปรแกรมใดโปรแกรมหนึ่งนั้นถูกต้อง ไม่สามารถเขียนโปรแกรมที่สามารถพิสูจน์ได้โดยทั่วไปว่าโปรแกรมใด ๆที่ถูกต้องนั้นถูกต้อง
Max Strini

-1

ในฐานะที่เป็นข้อมูลเชิงลึกเพิ่มเติม "สองวิธี" อาจเป็นการอ้างอิงถึงคำพูดของTony Hoare :

มีสองวิธีในการสร้างการออกแบบซอฟต์แวร์: วิธีหนึ่งคือทำให้ง่ายจนไม่มีข้อบกพร่องที่เห็นได้ชัดและวิธีอื่นคือทำให้มันซับซ้อนจนไม่มีข้อบกพร่องที่เห็นได้ชัด วิธีแรกยากกว่ามาก มันต้องการทักษะเดียวกันความทุ่มเทความเข้าใจและแม้แต่แรงบันดาลใจในการค้นพบกฎทางกายภาพที่เรียบง่ายซึ่งรองรับปรากฏการณ์ที่ซับซ้อนของธรรมชาติ

ลองคิดดูสักหน่อยแล้วคุณจะเห็นว่าเขาพูดในสิ่งเดียวกัน: ถ้าชิ้นส่วนซอฟต์แวร์ของคุณไม่ไร้สาระก็มีข้อบกพร่อง (แต่ทำให้ซับซ้อนพอและไม่เป็นข้อบกพร่องที่เห็นได้ชัด )


นี่ไม่ตอบคำถามที่ถาม
gnat

@gnat ฉันไม่เห็นว่ามันไม่ได้ - มันอยู่ที่นั่นในวรรคสอง บางทีถ้อยคำไม่ชัดเจน แต่เมื่อฉันพูดว่า "พูดในสิ่งเดียวกัน" ฉันหมายถึง "พูดในสิ่งเดียวกันกับ Alan Perlis" นั่นคือคำพูดของ Perlis น่าจะเป็นการล้อเลียนเรื่องตลกของ Hoare
Doval
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.