จำนวนขั้นต่ำทางทฤษฎีของการลงทะเบียนสำหรับคอมพิวเตอร์ที่ทันสมัย?


10

ฉันลงเรียนหลักสูตรคอมไพเลอร์ในการศึกษาระดับปริญญาตรีของฉันซึ่งเราเขียนคอมไพเลอร์ที่คอมไพล์โปรแกรมต้นฉบับในภาษาจาวาของเล่นเหมือนภาษาแอสเซมบลีของเล่น (ซึ่งเรามีล่าม) ในโครงการเราได้ตั้งสมมติฐานบางอย่างเกี่ยวกับเครื่องเป้าหมายที่เกี่ยวข้องอย่างใกล้ชิดกับโปรแกรมดั้งเดิมที่ใช้งานจริง

  • สแต็กรันไทม์ติดตามโดยการลงทะเบียนสแต็คพอยน์เตอร์ ("SP") เฉพาะ
  • ฮีปสำหรับการจัดสรรอ็อบเจ็กต์แบบไดนามิกที่ติดตามโดยตัวชี้ฮีพเฉพาะ ("HP") ลงทะเบียน
  • การลงทะเบียนตัวนับโปรแกรมเฉพาะ ("PC")
  • เครื่องเป้าหมายมี 16 รีจิสเตอร์
  • การดำเนินการกับข้อมูล (ตรงข้ามกับเช่นการข้าม) เป็นการดำเนินการลงทะเบียนเพื่อลงทะเบียน

เมื่อเราไปถึงหน่วยการใช้การจัดสรรการลงทะเบียนเพื่อทำให้เกิดประโยชน์สูงสุดมันทำให้ฉันประหลาดใจ: จำนวนการลงทะเบียนขั้นต่ำทางทฤษฎีสำหรับเครื่องดังกล่าวคืออะไร? คุณสามารถเห็นได้จากสมมติฐานของเราที่เราใช้การลงทะเบียนห้ารายการ (SP, HP, PC, และอีกสองสำหรับใช้เป็นที่เก็บข้อมูลสำหรับการทำงานแบบไบนารี) ในคอมไพเลอร์ของเรา ในขณะที่การเพิ่มประสิทธิภาพเช่นการจัดสรรการลงทะเบียนสามารถใช้ประโยชน์จากการลงทะเบียนมากขึ้นแต่มีวิธีที่จะได้รับน้อยลงในขณะที่ยังคงโครงสร้างเช่นสแต็คและกอง? ฉันคิดว่ามีการลงทะเบียนที่อยู่ (การลงทะเบียนเพื่อดำเนินการลงทะเบียน) เราต้องการอย่างน้อยสองทะเบียน แต่เราต้องการมากกว่าสอง?


"ตัวชี้ฮีป" ดูเหมือนเป็นแนวคิดแปลก ๆ เนื่องจากตรงกันข้ามกับสแต็คฮีปไม่ใช่ LIFO และไม่ลดความหมายของการพุช / ป๊อป คุณควรเห็นการจัดสรรหน่วยความจำแบบไดนามิกเป็นการเรียกรูทีน malloc / free
Yves Daoust

คำตอบ:


14

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

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

ความเป็นไปได้อีกอย่างคือการใช้เครื่องนับ เครื่องสองตัวคือทัวริงสมบูรณ์นั่นคือมันสามารถคำนวณสิ่งที่เครื่องทัวริงสามารถทำได้ ครั้งนี้จะมีการอธิบายอย่างในบทความวิกิพีเดียเครื่องเคาน์เตอร์


ขอบคุณสำหรับการตอบกลับ! อย่างไรก็ตามบทความเกี่ยวกับเครื่องสแต็คระบุว่าเครื่องสามารถเข้าถึงหน่วยความจำโดยตรง (เพื่อดำเนินการกับองค์ประกอบสแต็คบนสุดและผลักผลลัพธ์กลับมา) ดังนั้นการโกงจึงยังคงใช่ไหม? สำหรับเครื่องนับฉันอ่านบทความนั้น ฉันยังได้อ่านหลักฐานที่คล้ายกันของ TC ของ 2-CM แต่ทั้งคู่เกี่ยวข้องกับการจัดเก็บ RAM ทั้งหมดในการลงทะเบียนสองครั้งซึ่งดูเหมือนจะเป็นการโกงฉัน
BlueBomber

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

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

1
ฉันพบคำถามแปลก ๆ เพราะมันยากที่จะวางแนวความคิดในโลกแห่งความเป็นจริงเช่นตัวประมวลผลลงทะเบียนเข้าถึงหน่วยความจำ ฯลฯ แต่คุณต้องการสิ่งที่ตรึงไว้เพื่อที่จะพิสูจน์อะไรได้ ผลลัพธ์สุดท้ายก็คือสิ่งที่คุณพิสูจน์ได้นั้นพิสูจน์ได้ง่าย แต่มันก็ขึ้นอยู่กับว่าคุณจะทำให้คำถามเป็นอย่างไร (ความคิดเชิงทฤษฎีของคุณเกี่ยวกับ "ตัวประมวลผล", "ลงทะเบียน", "หน่วยความจำ" เป็นต้น)
Andrej Bauer

1
หนังสือรวบรวมไม่อนุญาตให้เราพิสูจน์ได้มากอย่างน้อยก็ไม่ได้อยู่ในความหมายทางคณิตศาสตร์ของคำว่า "พิสูจน์" คุณต้องไปอีกขั้นในการทำฮาร์ดแวร์ให้เป็นรูปเป็นร่างเพื่อให้ได้สิ่งที่จะพิสูจน์ได้ อย่างไรก็ตามเราแยกขนและฉันก็ให้คำตอบที่ดีที่สุดแก่คุณ
Andrej Bauer

1

สถาปัตยกรรม PIC ซึ่งได้รับการแนะนำโดย General Instruments ในปี 1970 และยังคงใช้อยู่ในปัจจุบันมีการลงทะเบียนต่อไปนี้:

W register (not addressible)
01    Timer/Counter
02    Program Counter
03    Status
04    File-Select Register
05-07 One register for each I/O port
08-1F General-purpose registers/"memory"

คำสั่งทั่วไปจะอ่านการลงทะเบียนทำการคำนวณโดยใช้ค่า read และ W แล้วเก็บผลลัพธ์ของการคำนวณเป็น W หรือลงทะเบียนที่ถูกอ่าน การคำนวณที่พร้อมใช้งานอย่างใดอย่างหนึ่งให้ผลลัพธ์ "การอ่านค่าละเว้น W"; อีกอย่างคือ "ใช้ W โดยไม่สนใจค่าที่อ่าน" รูปแบบบิตที่สอดคล้องกับ "read XX จากนั้นนำ W โดยไม่สนใจค่าที่อ่านและเก็บผลลัพธ์เป็น W" ถูกใช้สำหรับ NOP เช่นเดียวกับคำสั่งพิเศษที่หลากหลาย

เพื่อให้การคำนวณที่อยู่หน่วยประมวลผลของโปรเซสเซอร์จะคอยดูคำแนะนำที่เข้ารหัสที่อยู่ 00 และแทนที่เนื้อหาของ File Select Register สำหรับที่อยู่

แม้ว่าจะต้องป้อนค่าทั้งหมดผ่านการลงทะเบียน W อาจเป็นคอขวดสถาปัตยกรรม PIC มีชุดการทำงานที่ใหญ่กว่าสถาปัตยกรรมอื่น ๆ ที่ใช้คำแนะนำความยาวเท่ากัน เกี่ยวกับ PIC16C54 (ยังคงทำในวันนี้และคล้ายกับคำสั่ง PICs ปี 1970) มีความยาว 12 บิต ในส่วนอื่น ๆ ของ 16Cxx หรือ 16Fxx คำแนะนำมีความยาว 14 บิตและสามารถเข้าถึงพื้นที่ที่อยู่ 128 ไบต์ได้โดยตรง หากชุดการทำงานของโปรแกรมเหมาะสมกับชุดการทำงานของชุดคำสั่งคำสั่งเช่น "total + = value" โดยที่ "total" และ "value" เป็นประเภทunsigned charจะรวบรวมไปที่:

movf  value,w
addwf total,f

ในบางสิ่งบางอย่างเช่น ARM แม้ว่าจะมีรีจิสเตอร์ไว้แล้วพร้อมกับที่อยู่พื้นฐานของตัวแปรหนึ่งตัวรหัสก็จะเป็นดังนี้:

ldr    r0,[r7+value]
ldr    r1,[r7+total]
add    r1,r1,r0
str    r1,[r7+total]

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

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