ความแข็งในการคำนวณของโปรแกรมคอมพิวเตอร์ "ของจริง"


10

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

อย่างไรก็ตามฉันไม่แน่ใจว่าสิ่งนี้มีผลกับโปรแกรมในโลกแห่งความเป็นจริงเช่นระบบปฏิบัติการ โปรแกรมประเภทนี้ต้องการความสมบูรณ์แบบของทัวริงอย่างสมบูรณ์หรือไม่? มีรูปแบบการคำนวณที่ง่ายขึ้น (เช่น PR) ซึ่งสามารถเขียนแอปพลิเคชันเหล่านี้ได้หรือไม่? ถ้าเป็นเช่นนั้นสิ่งนี้จะช่วยให้การตัดสินใจถูกต้องของโปรแกรม?


คุณไม่สามารถตรวจสอบคุณสมบัติสากลที่ไม่สำคัญ (เช่นมีบางสิ่งสำหรับอินพุตทั้งหมด) ของโมเดลที่อ่อนแอกว่าเช่นคุณไม่สามารถตรวจสอบว่า TM ที่คำนวณได้ของ polytime สองตัวกำลังคำนวณฟังก์ชั่นเดียวกันได้หรือไม่ ในทางกลับกันหากโดเมนของอินพุตถูก จำกัด ขอบเขตคุณสามารถตรวจสอบคุณสมบัติบางอย่างในบางรุ่นได้เช่นโปรแกรมจะไม่ทำงานผิดพลาดกับอินพุตที่มีขนาดน้อยกว่า 1,000 อย่างน้อยในทฤษฎี (ในทางปฏิบัติมันอาจเป็นเรื่องยาก)
Kaveh

คำตอบ:


14

แน่นอนคุณสามารถเขียนโปรแกรมที่จับข้อบกพร่อง - มีชุมชนขนาดใหญ่และใช้งานอยู่ของผู้ที่เขียนโปรแกรมให้ทำอย่างนั้น อย่างไรก็ตามสิ่งที่ทฤษฎีบทของไรซ์ป้องกันไม่ให้คุณทำคือการเขียนบั๊กที่มีทั้งเสียงและสมบูรณ์ (เช่นจับบั๊กทั้งหมดของคลาสบางคลาสโดยไม่มีผลบวกปลอม)

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

while P do 
   C

สำหรับวนซ้ำพร้อมค่าคงตัวซ้ำใหญ่:

for i = 0 to BIGNUM do 
  if P then 
    C
  else
    break

ตอนนี้โปรแกรมนี้ไม่จำเป็นต้องมีความแข็งแรงเต็มรูปแบบของการเรียกซ้ำแบบดั้งเดิม (เนื่องจาก for-loop สามารถขยายมาโครไปเป็นคำสั่ง if-then-else ขนาดใหญ่ซ้อนกันได้) แต่ในกรณีที่ใช้งานได้จริงส่วนใหญ่มันจะทำงานเหมือนเดิม โปรดทราบว่ามันช่วยในการตัดสินใจทางทฤษฎี - โปรแกรมมีทั้งหมดดังนั้นคุณสามารถตอบคำถามโดยเรียกใช้โปรแกรมและดูว่าเกิดอะไรขึ้น นี่ไม่ใช่สิ่งที่เราต้องการจริง ๆ ซึ่งก็คือการได้คำตอบที่เร็วกว่าการรันโปรแกรม - การเลิกใช้งานจริงนั้นไม่ได้ช่วยในการวิเคราะห์โปรแกรมในทางปฏิบัติเนื่องจากข้อผิดพลาดเกิดขึ้นเนื่องจากข้อผิดพลาดในตรรกะของโปรแกรมจริง ไม่ได้แตะต้องเลย

ε0


คุณหมายถึงอะไรโดย "โปรแกรมนี้ไม่ซ้ำแบบดั้งเดิม"
Ryan Williams

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

คุณสามารถขยายวงออกไปในระดับมหภาคทำให้คุณมีโปรแกรมการแยกสาขา (เช่นมีองค์ประกอบแบบ if-then-else และเรียงตามลำดับเท่านั้น)
Neel Krishnaswami

บางทีมันอาจจะชัดเจนกว่าที่จะพูดอะไรบางอย่างเช่น "โปรแกรมนี้ไม่จำเป็นต้องมีความแข็งแรงเต็มรูปแบบของการเรียกซ้ำแบบดั้งเดิม"
สูงสุด

@ Max: ยอมรับคำแนะนำแล้ว!
Neel Krishnaswami

5

เมื่อคุณถามเกี่ยวกับความถูกต้องของโปรแกรมของโปรแกรมในโลกแห่งความเป็นจริงเช่นระบบปฏิบัติการคุณอาจสนใจโครงการ seL4 ( วารสาร , pdf , การประชุม )

ทีมงานของ NICTA ใช้ microkernel รุ่นที่สามจำนวน 8700 สายของ C และ 600 สายของแอสเซมเบลอร์ตามข้อกำหนดนามธรรมใน Haskell พวกเขาจัดหาหลักฐานที่เป็นทางการและตรวจสอบด้วยเครื่องจักร (ใน Isabelle / HOL) ว่าการปฏิบัติตามข้อกำหนดอย่างเคร่งครัด ดังนั้นการพิสูจน์ว่าโปรแกรมของพวกเขาปราศจากข้อผิดพลาด

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


โปรดทราบว่ารหัสที่ได้รับการรับรองยังคงมีความเสี่ยงต่อความผิดพลาดในสเปคของมันดังนั้นคุณสามารถพูดได้ว่ารหัสนั้นไม่มีข้อบกพร่องเทียบกับสเปค
nponeccop

@nponeccop เป็นความจริงแน่นอน แต่เมื่อคุณเริ่มสงสัยสเปคคุณก็เริ่มที่จะเบลอสายคุณสมบัติข้อบกพร่องที่น่าอับอายจริงๆ ในการเรียกบางสิ่งบางอย่างว่า 'บั๊ก' คุณจะต้องมีสเปคโดยปริยายในใจการจับสัญชาตญาณที่อยู่เบื้องหลังสเปคนั้นเริ่มที่จะขุดลึกลงไปจนกระทั่งคุณตั้งคำถามกับรากฐานของปรัชญาคณิตศาสตร์ (ในรูปแบบของ Brouwer vs. Hilbert) .
Artem Kaznatcheev

โดย 'สเปค' ฉันหมายถึงสเปคอย่างเป็นทางการเช่นทฤษฎีบทอย่างเป็นทางการที่คุณพิสูจน์ คุณอาจยังคงทำผิดพลาดในการเปลี่ยนข้อกำหนดเกี่ยวกับใจของคุณเป็นทฤษฎีบท สิ่งเดียวที่คุณได้รับจากการรับรองคือการลด codebase ที่เชื่อถือได้ของคุณ (คุณควรเชื่อถือทฤษฎีบทของคุณไม่ใช่รหัสหรือหลักฐานของคุณ) และความสอดคล้องของรหัสของคุณกับ theorems ของคุณ
nponeccop

นี่คือคำพูดจากเว็บไซต์ seL4: 'รหัส C ของไมโครเคอร์เนล seL4 ใช้พฤติกรรมที่อธิบายไว้ในสเปคที่เป็นนามธรรมอย่างถูกต้องและไม่มีอะไรเพิ่มเติม'
nponeccop

2

คำถามที่คุณถามนั้นแตกต่างกันมาก

อย่างไรก็ตามฉันไม่แน่ใจว่าสิ่งนี้มีผลกับโปรแกรมในโลกแห่งความเป็นจริงเช่นระบบปฏิบัติการ โปรแกรมประเภทนี้ต้องการความสมบูรณ์แบบของทัวริงอย่างสมบูรณ์หรือไม่?

ใช้เวลาน้อยมากสำหรับแบบจำลองการคำนวณที่จะทำให้ทัวริงสมบูรณ์ ตัวอย่างเช่นรุ่นต่างๆที่มีเคาน์เตอร์สามารถจำลองเครื่องทัวริงได้ หากคุณเชื่อว่าซอฟต์แวร์ของคุณต้องการตัวนับมากกว่าสองตัวที่คุณสามารถจัดการได้เองคุณกำลังใช้ภาษาทัวริงที่สมบูรณ์ แม้ว่าจำนวนเต็มของเครื่องจะ จำกัด apriori แต่โครงสร้างข้อมูลที่จัดสรรฮีปมักจะไม่ใช่ หากซอฟต์แวร์ของคุณต้องการรายการต้นไม้และข้อมูลที่จัดสรรแบบไดนามิกอื่น ๆ คุณกำลังใช้ภาษาทัวริงที่สมบูรณ์

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

สิ่งสำคัญคือต้องตระหนักว่าเราไม่ต้องการตรวจสอบคุณสมบัติโดยพลการของซอฟต์แวร์ของเรา การตรวจสอบคุณสมบัติที่เจาะจงและแคบมาก (ไม่มีบัฟเฟอร์มากเกินไปไม่มีข้อผิดพลาดแบบไม่มีตัวชี้ไม่มีการวนซ้ำไม่สิ้นสุด ฯลฯ ) ปรับปรุงคุณภาพและการใช้งานของซอฟต์แวร์อย่างมาก ในทางทฤษฎีแล้วปัญหาดังกล่าวก็ยังไม่สามารถตัดสินใจได้ ในทางปฏิบัติการมุ่งเน้นไปที่คุณสมบัติเฉพาะช่วยให้เราสามารถค้นพบโครงสร้างในโปรแกรมของเราที่เรามักจะใช้ประโยชน์จากการแก้ปัญหา

โดยเฉพาะอย่างยิ่งคุณสามารถแก้ไขคำถามเดิมของคุณเป็น

มีซอฟต์แวร์นามธรรมที่ฉันสามารถวิเคราะห์ได้อย่างมีประสิทธิภาพในโมเดลที่ไม่ใช่ทัวริงใช่หรือไม่

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

มีแอพพลิเคชั่นที่ผู้คนใส่ใจเกี่ยวกับคุณสมบัติที่ซับซ้อนของฮาร์ดแวร์หรือซอฟต์แวร์ของพวกเขา บริษัท ฮาร์ดแวร์ต้องการให้ชิปของตนใช้อัลกอริธึมทางคณิตศาสตร์อย่างถูกต้อง บริษัท ยานยนต์และ บริษัท avionic ต้องการซอฟต์แวร์ที่ถูกต้อง ถ้ามันสำคัญขนาดนั้นคุณก็ควรใช้มนุษย์ที่ได้รับการฝึกฝนมาแล้ว


ฉันคิดว่าคุณได้ตอบคำถามตรงข้ามนั่นคือมันเป็นไปได้หรือไม่ที่ word-processor จะทัวริงสมบูรณ์ ด้วยการจัดการที่เหมาะสมของการลงทะเบียนมันเป็น อย่างไรก็ตามมันเป็นไปได้ที่จะกำหนดกฎของการลงทะเบียนเพื่อเอาชนะทัวริงสมบูรณ์ คำถามของฉันคือคุณสามารถตั้งโปรแกรมได้จริงในข้อ จำกัด ที่แคบเหล่านี้
David Harris

ฉันกำลังตอบคำถามว่าการเขียนระบบปฏิบัติการและแอพพลิเคชั่นซอฟต์แวร์อื่น ๆ ต้องใช้ภาษาโปรแกรมทัวริงที่สมบูรณ์หรือไม่ หากคุณต้องการตัวนับจำนวนมากหรือโครงสร้างข้อมูลที่ไม่ได้ จำกัด คุณจะต้องใช้ภาษาโปรแกรมทัวริงที่สมบูรณ์
วีเจย์ D

@Vijay: ไม่นี่ไม่ใช่เรื่องจริง มีทฤษฎีประเภทมากมาย (เช่น Agda และ Coq) ซึ่งทั้งสองแสดงออกอย่างมากและไม่อนุญาตให้มีการเรียกซ้ำแบบไม่ จำกัด
Neel Krishnaswami

@Neel: เพื่อชี้แจงฉันแค่พูดถึงทัวริงครบถ้วน เป็นไปไม่ได้ที่จะจำลองเครื่องทัวริงในทฤษฎีเหล่านี้หรือไม่?
วีเจย์ D

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