บรรทัดของโค้ดถูกเรียกใช้งานโดย CPU อย่างไร


11

ฉันพยายามที่จะเข้าใจจริงๆว่าภาษาระดับสูงถูกแปลงเป็นรหัสเครื่องอย่างไรและดำเนินการโดย cpu

ฉันเข้าใจว่ารหัสถูกรวบรวมเป็นรหัสเครื่องซึ่งเป็นรหัสระดับต่ำที่ CPU สามารถใช้ได้ ถ้าฉันมีคำสั่งมอบหมายพูด:

x = x + 5;
y = x - 3;

CPU ดำเนินการทีละบรรทัดหรือไม่? ดังนั้นก่อนจะดำเนินการ x = x + 5; คำสั่งแล้วคำสั่งถัดไปที่ CPU จะดำเนินการคือ y = x- 3; ฉันพยายามเข้าใจขั้นตอนการดำเนินการจริง ๆ และวิธีการที่โค้ดที่ฉันเขียนนั้นถูกใช้งานจริงโดย CPU


คุณอาจต้องการลองทำความเข้าใจกับการออกแบบของหนึ่งในซีพียูโอเพนซอร์ซที่มีการใช้งานแบบกองซ้อนอย่างง่าย ๆ อย่างexcamera.com/sphinx/fpga-j1.htmlซึ่งง่ายกว่าสถาปัตยกรรม 3 แอดเดรส เหมือนในตัวอย่างของคุณ
SK-logic

3
เมื่อฉันเข้าสู่ธุรกิจนี้สิ่งนี้จะมีคำตอบที่เรียบง่ายและชัดเจน ทุกวันนี้ซีพียูมีความซับซ้อนอย่างยิ่งและทำทุกสิ่งเพื่อเพิ่มพลังการประมวลผล
David Thornley

คำตอบ:


12

บรรทัดของรหัสไม่มีส่วนเกี่ยวข้องกับวิธีการที่ CPU ดำเนินการ ฉันขอแนะนำให้อ่านข้อมูลเกี่ยวกับแอสเซมเบลอร์เพราะนั่นจะสอนคุณมากมายเกี่ยวกับวิธีการที่ฮาร์ดแวร์ทำสิ่งต่างๆ คุณยังสามารถรับเอาท์พุทแอสเซมเบลอร์จากคอมไพเลอร์มากมาย

รหัสนั้นอาจรวบรวมเป็นบางอย่างเช่น (ในภาษาชุดประกอบ):

load R1, [x] ; meaning load the data stored at memory location x into register 1
add R1, 5
store [x], R1 ; store the modified value into the memory location x
sub R1, 3
store R1, [y]

อย่างไรก็ตามหากคอมไพเลอร์รู้ว่าตัวแปรไม่ได้ถูกใช้อีกครั้งการดำเนินการจัดเก็บอาจไม่ถูกปล่อยออกมา

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


ทำไมจะไม่ล่ะ? สถาปัตยกรรม 3 ที่อยู่จะมีคำแนะนำเช่นADD Rx, Rx, $5และSUB Ry, Rx, $3(สมมติว่าตัวแปร x และ y ถูกแมปเข้าสู่การลงทะเบียน) คุณกำลังอธิบายวิธีโหลด RISC สำหรับร้านค้า
SK-logic

1
@ SK-logic: ในขณะที่อาจเกิดขึ้นกับบรรทัดของโค้ดที่ง่ายมากในภาษาการเขียนโปรแกรมแบบง่าย ๆ ที่มีชนิดข้อมูลและการดำเนินการที่ CPU เกิดขึ้นให้การสนับสนุนที่ดีพอ แต่ก็ไม่มีกรณีทั่วไป สะดวกสำหรับผู้เชี่ยวชาญ แต่ก่อนอื่นสิ่งสำคัญคือต้องตระหนักถึงคำแนะนำของรหัสเครื่องโดยทั่วไปจะมีการย่อเล็ก ๆ น้อย ๆ กับบรรทัดของรหัสใน lanugage ระดับสูง

@ SK-Logic: ใช้ได้กับตัวอย่างเฉพาะนี้เท่านั้น อย่างไรก็ตามโดยทั่วไป maxpolun ถูกต้อง คำแปลภาษาระดับสูงจะต้องแปลเป็นภาษาระดับต่ำกว่าด้วย "เทปสีแดง" ที่จำเป็นสำหรับการทำสิ่งต่าง ๆ ที่เป็นแนวคิดง่าย ๆ ฉันเดาว่า OP ได้ขอตัวอย่างของการเปลี่ยนแปลงครั้งนี้
Andres F.

1
@ SK-Logic: OP เริ่มคำถามของเขากับ "ฉันพยายามที่จะเข้าใจจริงๆว่าภาษาระดับสูง [... ]"
Andres F.

1
@ SK-logic บริบทคือ "ถ้าฉันมีคำสั่งกำหนดว่า: [ข้อมูลโค้ด] ซีพียูดำเนินการทีละบรรทัดหรือไม่?" - ดูเหมือนว่าฉันต้องการที่จะเป็นซอร์สโค้ดในภาษาที่ไม่ใช่แอสเซมเบลอร์ โดยทั่วไปแล้วฉันไม่เห็นตัวบ่งชี้ความเข้าใจว่ารหัสเครื่องในระดับต่ำเป็นอย่างไรและคำพูดบางส่วน (เช่นการพูดถึงบรรทัด) แสดงถึงความเข้าใจผิดบางประการ นั่นไม่ใช่เรื่องที่เป็นไปไม่ได้อย่างที่คุณบอกทุกคนมีความยินดีที่ถูกโยนหัวครั้งแรกที่ไมโครคอนโทรลเลอร์บางตัว (เช่นฉันและคนอื่น ๆ ) บางทีแฟรงกี้ควรชี้แจง

2

มันขึ้นอยู่กับ.

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

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

ข้อมูลการควบคุม 6600 เป็นเครื่องแรกที่ฉันรู้ว่าทำสิ่งนี้ การเพิ่มจำนวนเต็ม 300 nsec การอ้างอิงหน่วยความจำ (อ่านหรือเขียน) ใช้ 1,000 nsec คูณและหารใช้เวลานานมาก คำสั่งทั้งหมดประมาณสิบคำสั่งสามารถดำเนินการแบบขนานขึ้นอยู่กับหน่วยการทำงานที่ต้องการ คอมไพเลอร์ CDC 6600 FORTRAN นั้นดีมากในการตั้งเวลาทั้งหมดนี้


ในกรณีนี้อินพุตของคำสั่งถัดไปขึ้นอยู่กับผลการเรียนการสอนแรกดังนั้นจึงต้อง ดำเนินการตามลำดับ
SK-logic

@ SK-logic: ไม่มาก อินพุตของบรรทัดที่สองขึ้นอยู่กับผลลัพธ์ของด้านขวามือของบรรทัดแรก แต่ขึ้นอยู่กับสิ่งที่เราเห็นในโค้ดตัวอย่างดั้งเดิมเท่านั้น แต่อาจไม่ขึ้นอยู่กับการจัดเก็บในหน่วยความจำของผลลัพธ์ของ บรรทัดแรก หาก x ได้รับการประกาศว่ามีความผันผวน (ใน C / C ++) คอมไพเลอร์จะต้องเก็บผลลัพธ์ก่อนและจากนั้นโหลดใหม่จากหน่วยความจำก่อนที่จะเริ่มคำนวณค่าใหม่ของ y เนื่องจาก "volatile" หมายถึงบางสิ่ง (ตัวจัดการขัดจังหวะพูด) สามารถเข้ามาและปะทะ x ระหว่างสองบรรทัด
John R. Strohm

ฉันคิดว่า x และ y เป็นรีจิสเตอร์ (และรหัสอยู่ในภาษา pseudoassembly 3-address แทนที่จะเป็น C) ในกรณีนี้ทั้งสองคำสั่งจะเรียงลำดับอย่างหลีกเลี่ยงไม่ได้ มิฉะนั้น OP ต้องถามคำถามสองข้อขึ้นไปแทนที่จะเป็นคำถามนี้
SK-logic

ฉันสงสัยว่าตัวประมวลผลจะพยายาม "คาดเดา" ค่าของxมันคืออะไร? วิธีนี้มันได้ดำเนินการรหัสและเก็บไว้ในแคช
Kolob Canyon

แม้ว่าพวกเขาจะลงทะเบียนขึ้นอยู่กับเครื่องคุณไม่สามารถสันนิษฐานได้ว่าคำสั่งดำเนินการตามลำดับอย่างสมบูรณ์ 6600 มีการจัดตารางเวลาตรรกะ ("สกอร์บอร์ด") ที่จะบังคับซีแมนทิกส์ตามลำดับบนพื้นฐานของการสมมติว่าโปรแกรมเมอร์ต้องการทำสิ่งที่ชัดเจน เครื่องจักรในภายหลังละเว้นฮาร์ดแวร์นั้นแทนที่จะพึ่งพาคอมไพเลอร์เพื่อกำหนดเวลาคำแนะนำอย่างระมัดระวัง โปรแกรมเมอร์ของมนุษย์ที่ทำการเขียนโปรแกรมภาษาแอสเซมบลีบนสัตว์เหล่านั้นเป็นของพวกเขาเอง
John R. Strohm

1

ไม่ไม่มีการแมปแบบหนึ่งต่อหนึ่งระหว่างบรรทัดรหัส / คำแนะนำในภาษาระดับสูงและระดับล่าง ในความเป็นจริงทั้งสองบรรทัดข้างต้นได้รับการแปลเป็นคำสั่งเครื่องหลายรหัสเช่น

  1. โหลดค่าจากที่อยู่หน่วยความจำที่แน่นอนลงในการลงทะเบียน
  2. ปรับเปลี่ยนค่า
  3. เขียนกลับไปที่หน่วยความจำ

รายละเอียดที่แท้จริงของคำแนะนำเหล่านี้จะแตกต่างกันไปตามแพลตฟอร์ม

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


0

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

โดยทั่วไปคำถามของคุณจะเน้นไปที่ 2 ด้านที่แตกต่างกัน

1) รหัสแปลเป็นรหัสเครื่องอย่างไร

2) เมื่อคำนวณรหัสโดยใช้การขนาน

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

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

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