ตอนนี้ฉันกำลังคิดว่าจะโน้มน้าวตัวเองได้อย่างไรว่าทัวริงเป็นแบบจำลองการคำนวณทั่วไป ฉันยอมรับว่าการปฏิบัติตามมาตรฐานของการทำวิทยานิพนธ์ของทัวริสต์ทัวริงในหนังสือมาตรฐานบางเล่มเช่น Sipser นั้นไม่สมบูรณ์มาก นี่คือภาพร่างของวิธีที่ฉันจะเปลี่ยนจากเครื่องทัวริงไปเป็นภาษาการเขียนโปรแกรมที่เป็นที่รู้จักมากขึ้น
พิจารณาภาษาบล็อกโครงสร้างการเขียนโปรแกรมด้วยif
และwhile
งบด้วยไม่ใช่ recursiveฟังก์ชั่นที่กำหนดไว้และซับรูทีนที่มีชื่อบูลตัวแปรสุ่มและการแสดงออกบูลทั่วไปและกับอาร์เรย์แบบบูเดียวมากมายtape[n]
กับตัวชี้อาร์เรย์จำนวนเต็มn
ที่สามารถเพิ่มขึ้นหรือ decremented, n++
หรือn--
. ตัวชี้n
เป็นศูนย์เริ่มต้นและอาร์เรย์tape
เป็นศูนย์ทั้งหมดเริ่มต้น ดังนั้นภาษาคอมพิวเตอร์นี้อาจเหมือนกับภาษา C หรือ Python แต่มีข้อ จำกัด ในประเภทข้อมูล ที่จริงแล้วมันมีข้อ จำกัด เหลือเกินที่เราไม่มีวิธีใช้ตัวชี้n
ในนิพจน์บูลีน สมมติว่าtape
เป็นเพียงไม่ จำกัด ทางด้านขวาเราสามารถประกาศตัวชี้อันเดอร์โฟลว์ "ข้อผิดพลาดของระบบ" หากn
มีค่าเป็นลบ นอกจากนี้ภาษาของเรายังมีexit
ข้อความที่มีหนึ่งอาร์กิวเมนต์เพื่อส่งคำตอบบูลีน
จุดแรกคือภาษาโปรแกรมนี้เป็นภาษาสเปคที่ดีสำหรับเครื่องทัวริง คุณสามารถเห็นได้อย่างง่ายดายว่ายกเว้นอาร์เรย์เทปโค้ดจะมีสถานะเป็นไปได้มากมาย: สถานะของตัวแปรที่ประกาศทั้งหมดและบรรทัดการดำเนินการปัจจุบันและสแต็กรูทีนย่อยของมัน ส่วนหลังมีสถานะเป็นจำนวน จำกัด เท่านั้นเนื่องจากไม่อนุญาตให้เรียกใช้ฟังก์ชันแบบเรียกซ้ำ คุณสามารถจินตนาการว่า "คอมไพเลอร์" ที่สร้างเครื่องทัวริง "จริง" จากรหัสประเภทนี้ แต่รายละเอียดที่ไม่สำคัญ ประเด็นก็คือเรามีภาษาการเขียนโปรแกรมที่มีไวยากรณ์ค่อนข้างดี แต่มีชนิดข้อมูลดั้งเดิมมาก
ส่วนที่เหลือของการก่อสร้างคือการแปลงเป็นภาษาการเขียนโปรแกรมที่น่าอยู่มากขึ้นด้วยรายการฟังก์ชันไลบรารีและขั้นตอนการคอมไพล์ล่วงหน้า เราสามารถดำเนินการดังนี้:
ด้วยพรีคอมไพเลอร์เราสามารถขยายประเภทข้อมูลบูลีนให้เป็นตัวอักษรสัญลักษณ์ขนาดใหญ่ขึ้น แต่มีขอบเขต จำกัด เช่น ASCII เราสามารถสันนิษฐานได้ว่าtape
ใช้ค่าในตัวอักษรที่ใหญ่กว่านี้ เราสามารถวางเครื่องหมายไว้ที่จุดเริ่มต้นของเทปเพื่อป้องกันไม่ให้ตัวชี้ไม่ไหลและตัวทำเครื่องหมายที่เคลื่อนที่ได้ในตอนท้ายของเทปเพื่อป้องกันไม่ให้ TM เล่นสเก็ตจนถึงอินฟินิตี้บนเทปโดยไม่ตั้งใจ เราสามารถใช้การดำเนินการไบนารีโดยพลการระหว่างสัญลักษณ์และการแปลงเป็นบูลีนif
และwhile
คำสั่ง (จริง ๆ แล้วif
สามารถนำไปใช้ได้ด้วยwhile
เช่นกันหากไม่พร้อมใช้งาน)
kkiik
เรากำหนดหนึ่งเทปเป็น "หน่วยความจำ" ที่มีสัญลักษณ์เป็นสัญลักษณ์และอีกเทปหนึ่งเป็น "register" หรือ "ตัวแปร" ที่มีค่าเป็นจำนวนเต็ม เราเก็บจำนวนเต็มในเลขฐานสองเล็ก ๆ น้อย ๆ พร้อมเครื่องหมายบอกเลิก อันดับแรกเราใช้สำเนาของการลงทะเบียนและการลดลงของเลขฐานสองของการลงทะเบียน เมื่อรวมกับการเพิ่มและการลดลงของตัวชี้หน่วยความจำเราสามารถใช้การเข้าถึงแบบสุ่มเพื่อค้นหาหน่วยความจำสัญลักษณ์ นอกจากนี้เรายังสามารถเขียนฟังก์ชันเพื่อคำนวณการบวกเลขฐานสองและการคูณจำนวนเต็ม มันไม่ยากที่จะเขียนฟังก์ชั่นการบวกแบบไบนารีด้วยการดำเนินการระดับบิตและฟังก์ชั่นการคูณด้วย 2 ด้วยการเลื่อนซ้าย (หรือการเปลี่ยนแปลงที่ถูกต้องจริง ๆ เนื่องจากมันเป็น endian น้อย) ด้วยคำสั่งพื้นฐานเหล่านี้เราสามารถเขียนฟังก์ชันเพื่อคูณสองรีจิสเตอร์โดยใช้อัลกอริทึมการคูณแบบยาว
เราสามารถจัดระเบียบเทปหน่วยความจำจากอาร์เรย์สัญลักษณ์หนึ่งมิติsymbol[n]
เป็นแถวสัญลักษณ์สองมิติโดยใช้สูตรที่symbol[x,y]
n = (x+y)*(x+y) + y
ตอนนี้เราสามารถใช้แต่ละแถวของหน่วยความจำในการแสดงความจำนวนเต็มไม่ได้ลงนามในไบนารีที่มีสัญลักษณ์การเลิกจ้างที่จะได้รับหนึ่งมิติ random-access, memory[x]
หน่วยความจำจำนวนเต็มมูลค่า เราสามารถใช้การอ่านจากหน่วยความจำไปยังการลงทะเบียนจำนวนเต็มและการเขียนจากการลงทะเบียนไปยังหน่วยความจำ ขณะนี้คุณลักษณะหลายอย่างสามารถใช้งานได้กับฟังก์ชั่น: เลขคณิตเครื่องหมายและจุดลอยตัวสตริงสัญลักษณ์ ฯลฯ
สิ่งอำนวยความสะดวกพื้นฐานอย่างน้อยหนึ่งแห่งเท่านั้นที่ต้องใช้พรีคอมไพเลอร์อย่างเคร่งครัดนั่นคือฟังก์ชั่นวนซ้ำ สามารถทำได้ด้วยเทคนิคที่ใช้กันอย่างแพร่หลายในการใช้ภาษาตีความ เรากำหนดสตริงชื่อฟังก์ชันแต่ละระดับสูงและเรียกซ้ำและเราจัดระเบียบรหัสระดับต่ำลงในwhile
ลูปขนาดใหญ่หนึ่งที่เก็บสแต็กการโทรด้วยพารามิเตอร์ปกติ: จุดโทรฟังก์ชันที่เรียกและรายการอาร์กิวเมนต์
ณ จุดนี้การก่อสร้างมีคุณสมบัติเพียงพอของภาษาการเขียนโปรแกรมระดับสูงที่การทำงานต่อไปเป็นหัวข้อของภาษาโปรแกรมและคอมไพเลอร์มากกว่าทฤษฎี CS นอกจากนี้ยังง่ายต่อการเขียนเครื่องจำลองทัวริงในภาษาที่พัฒนานี้ มันไม่ง่ายอย่างแน่นอน แต่เป็นมาตรฐานในการเขียนคอมไพเลอร์สำหรับภาษา แน่นอนว่าคุณต้องการคอมไพเลอร์ด้านนอกเพื่อสร้าง outer TM จากรหัสในภาษา C-like หรือ Python-like นี้ แต่สามารถทำได้ในภาษาคอมพิวเตอร์ใด ๆ
โปรดทราบว่าการดำเนินการร่างภาพนี้ไม่เพียง แต่สนับสนุนการทำวิทยานิพนธ์ทัวริสต์ของโบสถ์ของนักตรรกวิทยาสำหรับคลาสฟังก์ชั่นแบบเรียกซ้ำ แต่ยังรวมถึงการขยายวิทยานิพนธ์ กล่าวอีกนัยหนึ่งมันมีค่าใช้จ่ายพหุนาม ในความเป็นจริงถ้าเราได้รับเครื่อง RAM หรือ (ต้นไม้โปรดของฉัน) เป็น tree-tape TM สิ่งนี้สามารถลดค่าใช้จ่ายให้เป็นค่าใช้จ่าย polylogarithmic สำหรับการคำนวณแบบอนุกรมกับหน่วยความจำ RAM