สามารถใช้ภาษาแอสเซมบลีสากลสำหรับคอมพิวเตอร์ทุกเครื่องได้หรือไม่


23

ฉันอยากถามคำถามสองสามข้อเกี่ยวกับภาษาแอสเซมบลี ความเข้าใจของฉันคือว่ามันใกล้เคียงกับภาษาเครื่องทำให้เร็วขึ้นและมีประสิทธิภาพมากขึ้น

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

บางคนอาจบอกว่า C เป็นภาษาที่ฉันต้องการ ฉันไม่เคยใช้ C มาก่อน แต่ฉันคิดว่ามันยังคงเป็นภาษาระดับสูงถึงแม้ว่าอาจจะเร็วกว่า Java เช่นกัน ฉันอาจจะผิดที่นี่


10
คุณทำวิจัยอะไร เราคาดหวังให้คุณทำวิจัยก่อนถามเพื่อช่วยให้คุณถามคำถามที่ดีกว่า มีภาษาเขียนมากมายในภาษาแอสเซมบลี
DW

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

15
เริ่มต้นด้วยความเข้าใจว่า / ทำไมไม่มีภาษาที่เรียกว่าแอสเซมบลี
กราฟิลส์

2
ปัญหา "คลาสสิค" อย่างหนึ่งที่มีการพกพา C คือขนาดดั้งเดิมที่แตกต่างกัน (เช่นจำนวนเต็ม) บนฮาร์ดแวร์ที่แตกต่างกันและมีบางคนอ้างถึง
vzn

3
นี่เป็นปัญหาสังคมมากกว่าทางเทคนิค - คุณต้องโน้มน้าวให้ผู้ผลิตซีพียูทั้งหมดเพื่อให้ซีพียูของพวกเขายอมรับภาษาเครื่องเดียวกัน (อันที่จริงแล้ว x86 เกือบจะเป็นแบบนี้โดยบังเอิญ - ปิดสมาร์ทโฟนแล้ว)
user253751

คำตอบ:


45

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

สถาปัตยกรรมที่แตกต่างกันมีชุดคำสั่งต่าง ๆ : ชุดคำสั่งที่อนุญาตแตกต่างกันในแต่ละสถาปัตยกรรม ดังนั้นคุณไม่สามารถหวังว่าจะมีโปรแกรมแอสเซมบลีแบบเขียนครั้งเดียวทำงานได้ทุกที่ ตัวอย่างเช่นชุดคำสั่งที่รองรับโดยโปรเซสเซอร์ x86 นั้นดูแตกต่างจากชุดคำสั่งที่โปรเซสเซอร์ ARM สนับสนุน หากคุณเขียนโปรแกรมชุดประกอบสำหรับโปรเซสเซอร์ x86 มันจะมีคำแนะนำมากมายที่ไม่ได้รับการสนับสนุนบนโปรเซสเซอร์ ARM และในทางกลับกัน

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


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

26
@nTuply ทันทีที่คุณปรับเปลี่ยนภาษาแอสเซมบลีของคุณเพื่อรองรับเครื่องต่าง ๆ มันจะกลายเป็นภาษาระดับสูงพร้อมกับรูปแบบการประกอบแบบน่ากลัว เมื่อคุณตัดสินใจที่จะใช้ภาษาระดับสูงคุณอาจใช้ภาษาที่มีไวยากรณ์เป็นมิตรกว่าเดิมและให้คอมไพเลอร์ทำงานหนัก
David Richerby

15
ไม่ใช่ความคิดที่โง่อย่างสมบูรณ์ที่จะมี "ภาษาแอสเซมบลี" ที่แปลสำหรับเครื่องต่าง ๆ เพราะนั่นคือ "IR" ของ LLVM อย่างไรก็ตามด้วยเหตุผลที่ David ให้ไว้คุณไม่ปกติเขียนแอสเซมบลี LLVM นอกจากนี้เนื่องจาก 99 ครั้งจาก 100 คุณจะทำงานเขียนแย่ลงกว่าเสียงดังกราวแปล C ของคุณเป็น LLVM ภาษาแอสเซมบลีอาจมีประสิทธิภาพมากกว่าภาษาระดับสูง แต่ในความเป็นจริงของโปรแกรมเมอร์ส่วนใหญ่ที่มีเวลาในการปรับให้เหมาะสมโดยทั่วไปจะไม่สามารถเข้าถึงศักยภาพของตนได้
Steve Jessop

9
@nTuply นั่นมีอยู่ กระบวนการดำเนินการจากภาษาแอสเซมบลีพิเศษไปยังคำสั่งเครื่องเรียกว่าการรวบรวม
พอลเดรเปอร์

3
@PJTraill ไม่มีเหตุผลใด ๆ ที่จะเขียนคอมไพเลอร์ในแอสเซมเบลอร์ในระบบที่ทันสมัยยกเว้นขั้นตอนการบูตสแตรปครั้งแรก (และส่วนใหญ่แล้วไม่ใช่เวลา) คอมไพเลอร์ที่เขียนด้วยภาษาระดับสูงมีแนวโน้มที่จะรักษาได้จริงอย่างมากมาย เปรียบเทียบภาษาที่คอมไพเลอร์เขียนด้วยภาษา C เร็วกว่า C ได้อย่างไร . วัตถุประสงค์ของคอมไพเลอร์คือการแปลจากภาษาหนึ่ง (ภาษาต้นฉบับ) ไปยังอีกภาษาหนึ่ง (โดยทั่วไปจะเป็นภาษาเครื่องสำหรับสถาปัตยกรรมและระบบปฏิบัติการเฉพาะ) สามารถเขียนเป็นภาษาใดก็ได้
CVn

13

คำจำกัดความของภาษาแอสเซมบลีคือมันเป็นภาษาที่สามารถแปลโดยตรงไปยังรหัสเครื่อง แต่ละรหัสการดำเนินการในภาษาแอสเซมบลีแปลเป็นการดำเนินการเดียวบนคอมพิวเตอร์เป้าหมาย (มันซับซ้อนกว่านั้นเล็กน้อย: แอสเซมเบลอร์บางตัวกำหนด "โหมดการกำหนดแอดเดรส" โดยอัตโนมัติตามอาร์กิวเมนต์ของ op-code แต่ก็ยังมีหลักการคือแอสเซมบลีไลน์หนึ่งบรรทัดแปลเป็นคำสั่งภาษาเครื่องหนึ่ง)

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

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


1
C มักถูกอธิบายว่าเป็น "ภาษาแอสเซมบลีแบบพกพา"
Larry Gritz

2
@ LarryGritz แน่นอน และเมื่อ C ถูกประดิษฐ์ขึ้นมันก็แหวกแนว: มันให้พลังของภาษาแอสเซมบลีมากด้วยการใช้งานที่รวบรวมได้ง่าย แต่ตามคำนิยามมันยังคงเป็นภาษาที่คอมไพล์
Jay

8

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

อย่างไรก็ตามในทางปฏิบัติมีชิปแตกต่างกันสำหรับวัตถุประสงค์ที่แตกต่างกันโดยมีการดำเนินงานและหลักการออกแบบที่แตกต่างกัน (เช่น RISC vs CISC) ที่ให้บริการเป้าหมายที่แตกต่างกันและชุดคำสั่งที่ใช้งานพวกมัน ในที่สุดคำตอบก็เหมือนกับเมื่อถามว่าทำไมมีภาษาการเขียนโปรแกรมที่แตกต่างกันมากมาย : เป้าหมายที่แตกต่างการตัดสินใจออกแบบที่แตกต่างกัน

ที่กล่าวว่าคุณสามารถแนะนำระดับของสิ่งที่เป็นนามธรรมเพื่อเข้าสู่ส่วนต่อประสานที่ใช้ร่วมกัน ตัวอย่างเช่น x86 ได้ถูกกำจัดไปกับระดับชิปในบางเวลา; มีฮาร์ดแวร์เล็กน้อยที่แปลคำสั่ง x86 ให้กับสิ่งที่โปรเซสเซอร์ของคุณใช้งานได้จริง ภาษาอย่าง C จะเป็นอีกขั้นตอนหนึ่งห่างจากฮาร์ดแวร์ (ถ้าเล็กมาก) ไปจนถึงภาษาอย่าง Haskell, Java หรือ Ruby ใช่คอมไพเลอร์เป็นหนึ่งในความสำเร็จที่สำคัญของวิทยาศาสตร์คอมพิวเตอร์เพราะพวกเขาทำให้สามารถแยกความกังวลในรูปแบบนี้ได้


6
"ถ้าเป็นชิ้นเล็ก ๆ " - มีโปรแกรมเมอร์สองชนิดอยู่ที่นั่น ผู้ที่พิจารณาภาษา C ระดับต่ำเนื่องจากการดำเนินการขั้นพื้นฐานมีลักษณะคล้ายกับสิ่งต่าง ๆ ที่ปรากฏในชุดคำสั่ง CPU และผู้ที่พิจารณาภาษา C ระดับสูงเพราะไม่ใช่ชุดคำสั่งเดียวกันกับเครื่อง
Steve Jessop

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

7

คุณพูดถึงวลี "เขียนครั้งเดียวทำงานที่ใดก็ได้" โดยไม่สังเกตเห็นความสำคัญของมัน นั่นคือสโลแกนการตลาดสำหรับSun Microsystemsว่าในเชิงพาณิชย์คิดค้นแนวคิดของการที่"เครื่องเสมือน"และ"bytecodes"สำหรับ Java แม้ว่าอาจจะเป็นความคิดที่อาจจะเกิดขึ้นในภาคการศึกษาที่ 1 เซนต์. ไมโครซอฟท์ได้คัดลอกความคิดในภายหลังสำหรับ. Net หลังจากพวกเขาถูกฟ้องร้องโดย Sun ในข้อหาละเมิดสิทธิ์การใช้งาน Java Java bytecodes เป็นการนำแนวคิดของ cross-machine assembly หรือภาษาเครื่องไปใช้ พวกเขาจะใช้สำหรับภาษาอื่น ๆ กว่า Java และในทางทฤษฎีสามารถใช้ในการรวบรวมภาษาใด ๆ หลังจากหลายปีของการเพิ่มประสิทธิภาพขั้นสูงมาก Java ได้เข้าใกล้ประสิทธิภาพในการรวบรวมภาษาที่แสดงเป้าหมายของเทคโนโลยีเครื่องเสมือนแพลตฟอร์มซึ่งไม่เชื่อเรื่องพระเจ้าที่มีประสิทธิภาพสูงสามารถทำได้โดยทั่วไป

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


8
Sun ไม่ได้ประดิษฐ์เครื่องเสมือนหรือรหัสไบต์พวกเขาไม่ได้เป็นกลุ่มแรกที่ทำเงินได้ ค้นหารหัส p
jmoreno

@jmoreno: เขาอาจต้องการค้นหา Smalltalk ด้วย
Bob Jarvis - Reinstate Monica

บทความไม่ได้อ้างสิทธิ์ sun ประดิษฐ์เครื่องเสมือน / รหัสไบต์ มีประวัติอื่น ๆ ที่ไม่ได้อ้างถึง แต่พูดพาดพิงถึง btw อีกเทคโนโลยีสำคัญที่เกี่ยวข้องมากที่นี่: ลูกค้า Google ของ Google (คุณสมบัติโครเมี่ยม)
vzn

5

เหตุผลระดับสูง

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

แต่แขวนบนชิปมาตรฐานแทนที่การออกแบบที่กำหนดเองมากมาย? ไม่มีไมโครโปรเซสเซอร์เดียวที่สมบูรณ์แบบที่สมบูรณ์แบบสำหรับทุกแอปพลิเคชัน แอพพลิเคชั่นบางตัวจำเป็นต้องลดการใช้พลังงาน แต่ไม่จำเป็นต้องรวดเร็ว คนอื่น ๆ ต้องเร็ว แต่ไม่จำเป็นต้องง่ายต่อการเขียนโปรแกรมคนอื่น ๆ ต้องมีต้นทุนต่ำ ฯลฯ

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

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

รายละเอียดฮาร์ดแวร์

อาจเป็นการตัดสินใจออกแบบที่ใหญ่ที่สุดในชุดคำสั่งคือขนาดของคำเช่นจำนวนตัวประมวลผลที่สามารถจัดการได้ "ตามธรรมชาติ" ตัวประมวลผล 8 บิตจัดการกับตัวเลขตั้งแต่ 0-255 ในขณะที่ตัวประมวลผล 32 บิตจัดการกับตัวเลขตั้งแต่ 0 ถึง 4,294,967,295 รหัสที่ออกแบบมาสำหรับหนึ่งจะต้องมีการคิดใหม่อย่างสมบูรณ์สำหรับอีก

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

มีความแตกต่างที่สำคัญอื่น ๆ ระหว่างชุดคำสั่ง คำแนะนำส่วนใหญ่แบ่งออกเป็นสี่ประเภท:

  • การคำนวณ (เลขคณิตและตรรกะ)
  • การควบคุมการไหล
  • การถ่ายโอนข้อมูล
  • การกำหนดค่าโปรเซสเซอร์

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

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

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

ข้อสรุป

เหตุผลที่เป็นไปไม่ได้ที่จะมีภาษาแอสเซมบลีสากลคือการแปลงรหัสแอสเซมบลีจากชุดคำสั่งหนึ่งเป็นอีกชุดหนึ่งอย่างถูกต้องหนึ่งจะต้องออกแบบรหัสทั้งหมดซ้ำอีกครั้ง


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

4

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


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

@slebetman - gcc อนุญาตให้คุณใส่ตัวแปรลงในทะเบียนโดยไม่ต้องหันไปประกอบ
Jirka Hanika

@JirkaHanika: คุณกำลังพูดถึงการลงทะเบียน CPU หรือการลงทะเบียนฮาร์ดแวร์วัตถุประสงค์พิเศษที่ได้รับคำสั่งพิเศษหรือไม่? ฉันสงสัยว่าคนฆ่าคนหมายถึงคนหลัง
PJTraill

"รหัสทั้งหมด" - "GCC ทำได้ดีกว่า" = "คุณใช้แอสเซมเบลอร์" ใช่คุณสามารถเข้าถึงการลงทะเบียนโดยไม่มีการแทรกแอสเซมเบลอร์
Evil

@PJTraill - ความคิดเห็นของ Slebetman นั้นยอดเยี่ยมโดยทั่วไปและอาจรวมอยู่ในคำตอบ แต่ทั้งสองตัวอย่างของเขา (การลงทะเบียนการเข้าถึงและแผนผังแหล่ง Linux) มีแนวโน้มที่จะป้อนข้อมูลความเข้าใจผิดที่พบบ่อยมากกว่าที่พวกเขาจะเป็นตัวอย่างที่ยอดเยี่ยมของสิ่งที่เราไม่สามารถทำได้ใน C กับส่วนขยาย gcc สิ่งเหล่านั้นควรถูกแทนที่หรือละเว้น (หากมีคำสั่ง HW ให้ทำบางสิ่งบางอย่างในวันนี้คุณจะมีส่วนขยาย gcc ที่สอดคล้องกันหนึ่งปีนับจากนี้ไม่เสมอไป แต่บ่อยครั้งมากตัวอย่างอายุ)
Jirka Hanika

3

Microsoft คิดค้นMSILเป็นภาษาแอสเซมบลีระดับกลาง โปรแกรมจะคอมไพล์จาก C # หรือ VB.Net เป็น MSIL ณ รันไทม์, MSIL ถูกคอมไพล์ไปยังรหัสเครื่องสำหรับเครื่องที่รันโดยใช้คอมไพเลอร์JIT ไฟล์ที่มี MSIL เป็นไฟล์. EXE พร้อมกับคำแนะนำเล็กน้อยที่จุดเริ่มต้นใน X86 เพื่อเริ่มโปรแกรม ในโปรเซสเซอร์ ARM คุณจะต้องพิมพ์คำว่าโมโนด้านหน้าชื่อโปรแกรมเพื่อเรียกใช้


"ภาษาแอสเซมบลีระดับกลาง" และ "เครื่องเสมือน" แตกต่างกันอย่างไร
Bob Jarvis - Reinstate Monica

@BobJarvis: หนึ่งรหัสในขณะที่อื่น ๆ เป็นล่าม คุณควรถามว่าอะไรคือความแตกต่างระหว่างแอสเซมบลีระดับกลางและ bytecode
8174 slebetman

ดูเหมือนจะไม่ตอบคำถาม ตราบใดที่แต่ละเครื่องคอมไพล์ / แอสเซมเบลอร์ MSIL แตกต่างกันไม่มีอะไรที่เป็นสากลเกี่ยวกับมันและจุดประสงค์ของการคอมไพล์ดังกล่าวคือการพอร์ตของฟังก์ชันการทำงานทั่วไปและไม่ใช้ประโยชน์จากชุดคำสั่งเฉพาะ a) เหตุผลในการใช้แอสเซมเบลอร์
PJTraill

3

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

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

จากนั้นมีคำถามเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนด ความเร็วของ C และภาษาแอสเซมบลีส่วนใหญ่มาจากพฤติกรรมที่ไม่ได้กำหนด หากคุณยอมรับพฤติกรรมที่ไม่ได้กำหนดซึ่งเกิดขึ้นจริงคุณจะต้องจัดการกับมันเป็นกรณีพิเศษ (เช่น: สถาปัตยกรรมและแฮ็คเฉพาะบริบท)


0

บางทีสิ่งที่คุณกำลังมองหาคือสัญกรณ์เครื่องกลึงสากลซึ่งทุกคนเห็นด้วยกับสัญลักษณ์สำหรับคำสั่ง ( https://en.wikipedia.org/wiki/Universal_Turing_machine )

'แอสเซมเบลอร์' ที่แปลภาษาที่ยอมรับได้สำหรับรหัสเครื่องจักรเฉพาะของผู้จัดจำหน่ายและสร้างสำหรับสิ่งต่าง ๆ ที่เราเรียกว่าคอมพิวเตอร์

ในศิลปะการเขียนโปรแกรมคอมพิวเตอร์มีตัวอย่างของสิ่งที่อาจมีลักษณะเช่นนี้

แต่ลองพิจารณาคำถาม "ทำไมภาษาสากลที่ไม่มีขายในท้องตลาดที่สามารถใช้ได้กับคอมพิวเตอร์ทุกเครื่อง" ฉันขอแนะนำให้อิทธิพลที่มีอิทธิพลมากที่สุดคือ (1) ความสะดวกสบายไม่ใช่ภาษาแอสเซมบลีทุกตัวที่ใช้ง่ายที่สุด (2) เศรษฐศาสตร์การจัดหาความไม่ลงรอยกันระหว่างเครื่องจักรของแบรนด์ต่าง ๆ และผู้ขายเป็นกลยุทธ์ทางธุรกิจเช่นเดียวกับผลลัพธ์ของทรัพยากรที่ จำกัด (เวลา / เงิน) ในการออกแบบเครื่องจักร


คำถามกำลังถามเกี่ยวกับภาษาแอสเซมบลีที่สามารถใช้ในการเขียนโปรแกรมคอมพิวเตอร์เครื่องใดก็ได้ไม่ใช่ภาษาแอสเซมบลีที่เป็นสากลในแง่ของ "Universal Turing machine"
David Richerby

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

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

1
ผู้แสดงความคิดเห็นสนใจที่จะเสนอวิทยาการคอมพิวเตอร์ใด ๆ นี่คือหลังจากทุกฟอรั่มวิทยาศาสตร์คอมพิวเตอร์
คริส

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

0

สมมติฐาน: การรวบรวมและการเพิ่มประสิทธิภาพภาษาระดับสูง L1 เป็นภาษาระดับล่าง L0 ง่ายกว่าการรวบรวมและเพิ่มประสิทธิภาพภาษาระดับสูง L2 (สูงกว่า L1) ถึง L0; ง่ายขึ้นในแง่ที่ว่าคุณสามารถสร้างรหัสที่ปรับให้เหมาะสมยิ่งขึ้นเมื่อรวบรวม L1 ถึง L0 มากกว่า L2 ถึง L0

ฉันคิดว่าข้อสันนิษฐานนั้นน่าจะถูกต้องนั่นคือเหตุผลว่าทำไมคอมไพเลอร์ส่วนใหญ่ใช้ภาษาระดับกลางระดับต่ำ (IR / LLVM)

ถ้านี่เป็นความจริงมากกว่าใช้ภาษาระดับต่ำ L0 และเขียนคอมไพเลอร์เพื่อแปล L0 เป็นภาษาระดับต่ำอื่น ๆ ตัวอย่างเช่นใช้ชุดคำสั่ง MIPS และรวบรวมเป็น x86, arm, power, ...

-Taoufik


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