อะไรคือข้อดี / ข้อเสียของการใช้ C แทนชุดประกอบ? [ปิด]


15

ตอนนี้ฉันกำลังเรียนวิศวกรรมในสาขาโทรคมนาคมและอิเล็กทรอนิกส์และเราได้ย้ายจากแอสเซมเบลอร์ไปที่ C ในการเขียนโปรแกรมไมโครโปรเซสเซอร์ ฉันสงสัยว่านี่เป็นความคิดที่ดี อะไรคือข้อดีและข้อเสียของ C เมื่อเทียบกับการประกอบ?

ข้อดี / ข้อเสียที่ฉันเห็นคือ:

ข้อดี:

  • ฉันสามารถบอกได้ว่าไวยากรณ์ C นั้นง่ายกว่าการเรียนรู้มากกว่า Assembler ไวยากรณ์
  • C ใช้งานง่ายขึ้นสำหรับการสร้างโปรแกรมที่ซับซ้อนมากขึ้น
  • การเรียนรู้ C นั้นมีประสิทธิภาพมากกว่าการเรียนรู้ผู้ประกอบเนื่องจากมีสิ่งที่พัฒนารอบ C มากกว่าผู้ประกอบการ

ข้อเสีย:

  • Assembler เป็นภาษาการเขียนโปรแกรมระดับต่ำกว่า C ดังนั้นมันจึงเป็นสิ่งที่ดีสำหรับการเขียนโปรแกรมโดยตรงกับฮาร์ดแวร์
  • มีความยืดหยุ่นมากยิ่งทำให้คุณทำงานกับหน่วยความจำขัดจังหวะการลงทะเบียนขนาดเล็ก ฯลฯ

17
อืม ... ยินดีต้อนรับสู่ศตวรรษใหม่ คุณจะชอบที่นี่ เรามีไมโครคอนโทรลเลอร์ทำงาน.NET , Java , ลินุกซ์และคนแม้กระทั่งการใช้หลามโปรแกรมPICs
ZJR

@ZJR คุณใช้ Python เพื่อตั้งโปรแกรม PIC ได้อย่างไร PIC ตัวไหน
Detly

2
@detly มันไม่ได้เป็นงูหลามที่เต็มเปี่ยม แต่เป็นเพียงส่วนหนึ่งของคอร์ ตราของงูหลามไวยากรณ์เหนือฟังก์ชั่นการควบคุมถ้าคุณต้องการ pyastraเป็นตัวอย่างแรกที่ฉัน googled back แต่ฉันจำได้ว่าเคยอ่าน docs ของอันที่ต่างออกไป
ZJR

4
ความจริงแล้วด้วยความซับซ้อนของโปรเซสเซอร์ที่ทันสมัยฉันจะแปลกใจหากโปรแกรมเมอร์หลายคนสามารถเขียนแอสเซมเบลอร์ที่แน่นกว่าและมีประสิทธิภาพมากกว่าคอมไพเลอร์ C รุ่นใหม่ที่สามารถสร้างได้ ฉันเกลียดที่จะพยายามที่จะเขียนโปรแกรมสถาปัตยกรรม EPIC CPU ในการประกอบเช่น - เมลจะเป็นขวาที่บ้านกับItanium * 8 ')
ทำเครื่องหมายบูธ

5
@ZJR ศตวรรษใหม่นี้ฟังดูน่าตื่นเต้น! ฉันอยากรู้ว่าในภาษาอะไรคือ. NET runtime, Java VM และ Linux เขียนในสำหรับไมโครคอนโทรลเลอร์เหล่านั้น? เช่นเดียวกับในการเขียนโปรแกรมไมโครคอนโทรลเลอร์ที่เกิดขึ้นจริงในภาษาอะไร? โอ้ ... C หรือผู้ประกอบศตวรรษนี้ด้วย ...

คำตอบ:


17

ต่อไปนี้เป็นคำตอบสแต็คล้นที่อาจช่วยคุณได้ (นี่คือคำตอบที่ได้รับการยอมรับสูงสุด):

ข้อดี

/programming/143561/is-there-a-need-to-use-assembly-these-days (สำหรับผู้ใช้ 10K เท่านั้น) หรือเก็บถาวร

  • แอสเซมบลีถูกใช้ในระยะแรกสุดของ bootloader เมื่อซีพียูพลังบนสแต็กไม่พร้อมใช้งานและมันยากที่จะป้องกันไม่ให้คอมไพเลอร์ C พยายามที่จะบันทึกสิ่งต่าง ๆ ลงในสแต็ก กลุ่มของ bootloader ยังคงเขียนใน C เมื่อเริ่มต้นเร็วที่สุดจะทำ
  • แอสเซมบลีใช้ในการเขียนการล็อกแบบ mutex เป็นไปไม่ได้ที่จะให้คอมไพเลอร์ C เปล่งคำแนะนำสิ่งกีดขวางหน่วยความจำในสถานที่ที่ต้องการ
  • กิจวัตรเช่น memset () หรือ memcpy () มักจะทำในการชุมนุม ตัวอย่างเช่นฉันเขียน memset () พร้อมกับวนรอบที่ไม่ได้หมุนซึ่งจะคำนวณที่อยู่สาขาแบบไดนามิกเพื่อข้ามไปที่กึ่งกลางของลูปนั้นสำหรับการวนซ้ำครั้งสุดท้าย รูทีน AC จะสร้างรหัสได้มากขึ้น ในทำนองเดียวกันชุดคำสั่ง CPU มักจะรวมถึงการโหลดสายแคชหรือคำสั่งอื่น ๆ ซึ่งสามารถเพิ่มความเร็ว memcpy () ซึ่งคอมไพเลอร์ C จะไม่ใช้

ข้อเสีย

/programming/2684364/why-arent-programs-written-in-assembly-more-often

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

ตัวอย่าง

โพสต์สุดท้ายด้านล่างเป็นโพสต์สแต็คโอเวอร์โฟลว์สรุปสถานการณ์ซึ่งจะแสดงตัวอย่างชุดประกอบที่เร็วกว่า C (เมื่อดำเนินการฟังก์ชันเดียวกัน)

/programming/577554/when-is-assembler-faster-than-c


20
  • C ง่ายต่อการตั้งโปรแกรมเมื่อเทียบกับชุดประกอบ มีเหตุผลที่ชัดเจนว่าไม่คุ้มค่ากับการ rehashing

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

  • บ่อยครั้งที่โค้ดที่คอมไพเลอร์สร้างขึ้นนั้นดีพอ ๆ กัน (ในแง่ของความเร็วและประสิทธิภาพ) เหมือนกับแอสเซมเบลอร์ที่เขียนด้วยมือ - หากไม่ดีขึ้น

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

  • เมื่อคุณต้องการลดระดับลงคุณสามารถใช้ Assembly มิฉะนั้นคุณสามารถใช้ C

  • คุณสามารถเขียน Assembly ใน C-code ได้ แต่ไม่ใช่ C ใน Assembly-code


6
ฉันจะบอกว่าบางครั้งคุณจะเห็นรหัสเครื่องที่ดีที่สุดของคอมไพเลอร์ C ดีกว่ารหัสแอสเซมบลีที่เขียนด้วยมือของคุณ
ผู้ใช้

@ crucified - นี่เป็นการอ้างสิทธิ์ทั่วไป (และโดยปกติแล้ว) ในช่วงกลางถึงปลายยุค 90 คอมไพเลอร์ใช้การเพิ่มประสิทธิภาพอย่างน่าเชื่อถือและเป็นระบบ - ไม่เพียง แต่เมื่อสังเกตเห็นโอกาส
Steve314

15

โปรแกรม AC สามารถคอมไพล์ไปยังสถาปัตยกรรมไมโครโปรเซสเซอร์ที่แตกต่างกัน


4

เราได้ย้ายจากแอสเซมเบลอร์ไปที่ C ในการเขียนโปรแกรมไมโครโปรเซสเซอร์ ฉันสงสัยว่านี่เป็นความคิดที่ดี

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

ฉันสามารถบอกได้ว่าไวยากรณ์ C นั้นง่ายกว่าการเรียนรู้มากกว่า Assembler ไวยากรณ์

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

C ใช้งานง่ายขึ้นสำหรับการสร้างโปรแกรมที่ซับซ้อนมากขึ้น

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

การเรียนรู้ C นั้นมีประสิทธิภาพมากกว่าการเรียนรู้ผู้ประกอบเนื่องจากมีสิ่งที่พัฒนารอบ C มากกว่าผู้ประกอบการ

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

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

และยังมีอีกหลายแง่มุมที่ "สร้างสรรค์" สิ่งที่สำคัญมากคือเวลาการบำรุงรักษาและโดยเฉพาะเวลาที่ใช้ในการแก้ไขข้อบกพร่องที่เกิดจากการบำรุงรักษา C นั้นง่ายต่อการบำรุงรักษามากกว่าแอสเซมเบลอร์

Assembler เป็นภาษาการเขียนโปรแกรมระดับต่ำกว่า C ดังนั้นมันจึงเป็นสิ่งที่ดีสำหรับการเขียนโปรแกรมโดยตรงกับฮาร์ดแวร์

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

มีความยืดหยุ่นมากยิ่งทำให้คุณทำงานกับหน่วยความจำขัดจังหวะการลงทะเบียนขนาดเล็ก ฯลฯ

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


ในที่สุดคุณจำเป็นต้องรู้ทั้งสองภาษาในการเขียนโปรแกรม MCU โดยเน้นที่ C


ภาษา C ทั้งหมดซับซ้อนกว่าภาษาเครื่อง arcane มากกว่าบางภาษาอย่างไร เมื่อทำทั้งสองอย่างแล้วฉันคิดว่า C ที่ไม่มีห้องสมุดมีความซับซ้อนน้อยกว่ามาก หากคุณอ้างถึง C Standard Library คุณต้องมีอะไรเช่นนั้นในแอสเซมเบลอร์เพื่อทำสิ่งที่มีประโยชน์ C อาจเป็นภาษาที่ใหญ่และกว้างขึ้น แต่คุณไม่จำเป็นต้องรู้รายละเอียดในระดับเดียวกัน a = b[i] + c;มีความซับซ้อนน้อยกว่าคำแนะนำในการโหลดb[i](ซึ่งต้องใช้การคำนวณ) และการcลงทะเบียน (ซึ่งต้องทำให้พร้อมใช้งาน) เพิ่มและจัดเก็บ
David Thornley

1
@DavidThornley ยิ่งคุณเรียนรู้เกี่ยวกับ C มากเท่าไหร่คุณก็ยิ่งรู้ว่ามันซับซ้อนแค่ไหน คุณรู้หรือไม่ว่าหลายร้อยกรณีของพฤติกรรมที่ไม่ได้กำหนด / ไม่ระบุ / ระบุโดยนัย? คุณรู้รายละเอียดกฎการส่งเสริมประเภทโดยนัยทั้งหมด (การส่งเสริมการขายจำนวนเต็มการแปลงทางคณิตศาสตร์ปกติ) หรือไม่ กฎและไวยากรณ์เฉพาะเกี่ยวกับตัวระบุชนิดทั้งหมดหรือไม่ ทุกรูปแบบที่หลากหลายของอาร์เรย์แบบคงที่ / ไดนามิกหลายมิติรวมถึงตัวชี้อาร์เรย์ (เพื่อไม่ให้สับสนกับตัวชี้ไปยังองค์ประกอบที่ 1 ของอาร์เรย์) คุณสมบัติทั้งหมดของ C99 และ C11? และอื่น ๆ

1
@Lundin: สิ่งที่สำคัญเกี่ยวกับ C คือคุณสามารถถามคำถามเหล่านั้นทั้งหมดและค้นหาคำตอบที่เป็นรูปธรรม คอมไพเลอร์ที่สอดคล้องกับมาตรฐานจำเป็นต้องมีเอกสารวิธีที่พวกเขาปฏิบัติตามพฤติกรรมที่กำหนดไว้ในการนำไปปฏิบัติ 62 (ไม่ใช่ "หลายร้อย") ความเรียบง่ายที่แท้จริงของแอสเซมบลีทำให้เป็นเรื่องนำเสนอด้วยตัวคุณเองอาหารกลางวันซึ่งจะช่วยลดความซับซ้อนที่ C จัดการลงบนโค้ดของคุณเอง ฉันสามารถโต้แย้งการโต้เถียงของคุณโดยถามว่ามีการเขียนไลบรารี่พอยท์ไลบรารี่จำนวนเท่าไรในสถาปัตยกรรมใด ๆ
Blrfl

1
@Lundin: 62 คือจำนวนของพฤติกรรมที่กำหนดโดยคอมไพเลอร์ที่ระบุไว้ในส่วนที่ 4 ของคู่มือ GCC ปล่อยให้สิ่งที่ไลบรารีกำหนดไว้ทำสำหรับการเปรียบเทียบแอปเปิ้ลกับแอปเปิ้ลเนื่องจากไม่มีไลบรารีมาตรฐานสำหรับการประกอบ ความต้องการเอกสารเป็นประโยคแรกของ§J.3 GCC และคอมไพเลอร์เชิงพาณิชย์จำนวนหนึ่งที่ฉันซื้อหรือใช้เนื่องจาก C89 ได้รับการให้สัตยาบัน (Intel, Sun, IBM, Portland Group Group) ดังนั้น "สุดยอด" ของคุณที่ไม่ต้องกังวลใจ เมื่อพูดถึงมาตรฐานแล้วแอสเซมบลี x86 ที่เขียนด้วยไวยากรณ์ของ Intel บนแอสเซมเบลอร์ที่มีไวยากรณ์ AT&T เป็นอย่างไรบ้างสำหรับคุณ
Blrfl

1
@Lundin: รถของฉันยอดเยี่ยมขอบคุณ พวงมาลัย, คันเร่ง, เบรค, คลัตช์และก้านไฟเลี้ยวล้วนอยู่ในสถานที่มาตรฐาน, มีพฤติกรรมมาตรฐานและส่วนควบคุมอื่น ๆ ล้วนทำเครื่องหมายอย่างชัดเจนด้วยสัญลักษณ์มาตรฐาน ISO ทุกสิ่งที่กำหนดไว้ในการนำไปใช้เช่นระบบความบันเทิง, HVAC, ระบบนำทาง, ระบบควบคุมความเร็วคงที่ ฯลฯ ได้รับการบันทึกไว้ในหนังสือที่มีไขมันในช่องเก็บของ การชุมนุมเป็นเหมือนพลีมั ธ ปี 1973 ของฉัน: มีไม่มากนัก แต่ในรูปแบบดิบ ๆ มันไม่ได้อยู่ใกล้แค่ไหนเท่าที่ฉันสามารถขับรถได้ การชุมนุมเป็นวิธีเดียวกัน ความซับซ้อนมาในสิ่งที่คุณเพิ่มเข้าไป
Blrfl

1

ขึ้นอยู่กับว่าคุณต้องใช้งานสมองกลฝังตัว C จะผลิตโปรแกรมขนาดใหญ่และช้า ซึ่งจะเพิ่มต้นทุนอย่างเห็นได้ชัดของส่วนนั้นของผลิตภัณฑ์ มันอาจจะเป็นมหาสมุทรที่ลดลงสำหรับผลิตภัณฑ์โดยรวมหรืออาจเปลี่ยนแปลงผลิตภัณฑ์อย่างรุนแรง ใช่บางคนอาจบอกว่าความพยายามในการพัฒนาและบำรุงรักษาซอฟต์แวร์มีราคาถูกลงอีกครั้งซึ่งอาจเป็นเรื่องจริงหรือเท็จหากสิ่งนั้นฝังอยู่ลึกและเล็งส่วนที่ใช้พลังงานต่ำขนาดเล็กและราคาไม่แพงคุณไม่ได้พูดถึงโค้ดจำนวนมาก รหัสนั้นส่วนใหญ่จะเป็นรหัสเฉพาะของผู้ขายรายนั้นหรือชิปที่เฉพาะเจาะจงดังนั้นการอยู่ใน C จึงไม่มีประโยชน์ในการพกพาคุณจำเป็นต้องเขียนแต่ละเป้าหมายใหม่ ด้วยชุด cortex-m จาก ARM ตอนนี้เราเริ่มที่จะสามารถแข่งขันกับ C asm ได้แล้วไม่ใช่ว่าคนที่ใช้ C หรือภาษาระดับสูงอื่น ๆ ในผลิตภัณฑ์สมองกลฝังตัวของพวกเขา

การอภิปราย C vs ASM อย่างมืออาชีพมักเขียนลงใน C เสมอและใช้ ASM เพื่อให้คุณสามารถพิสูจน์ได้ และคุณสามารถพิสูจน์ได้ ในโลกที่ฝังตัวมีประสิทธิภาพและขนาด

คุณต้องรวมเป้าหมายในการสนทนานี้ แม้ว่าหลายคนใช้ C กับ Microchip (ภาพเก่าไม่ใช่ pic32 ซึ่งเป็น mips) แต่ก็มีชุดคำสั่งที่น่ากลัวสำหรับคอมไพเลอร์ชุดการศึกษาที่น่าสนใจและคอมไพเลอร์ที่ไม่เป็นมิตร msp430, avr, arm, thumb, mips ทั้งหมดนี้เหมาะสำหรับคอมไพเลอร์ 8051 ก็ไม่ดีเช่นกัน

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

บรรทัดล่างสุดอีกครั้งใช้ / เรียนรู้ / สอนทั้ง C และ asm เริ่มต้นด้วย C และใช้ asm ที่คุณสามารถปรับได้


ข้อโต้แย้งเหล่านี้ฟังดูเชยสำหรับฉัน หากคุณกำลังใช้คอมไพเลอร์สมัยใหม่ที่ถูกเขียนขึ้นในช่วง 10 ปีที่ผ่านมาฉันเชื่อว่าคุณจะมีเวลายากในการเขียนโปรแกรมแอสเซมเบลอร์ที่มีประสิทธิภาพมากกว่าโปรแกรม C นอกจากว่าคุณกำลังใช้สถาปัตยกรรมไดโนเสาร์อายุ 30 ปีเช่น PIC หรือ 8051 คุณจะมีโปรแกรมช้าไม่ว่าคุณจะทำอะไร ...

มันค่อนข้างง่ายที่จะแก้ไขการชุมนุมที่ช้าซึ่งสร้างขึ้นโดย gcc และ llvm ที่ทันสมัยที่สุด 4.x gcc สร้างรหัสที่ช้ากว่าและมีประสิทธิภาพน้อยกว่าซีรีย์ 3.x (สำหรับเป้าหมายบางอย่างอย่างน้อยสิ่งที่ฉันได้ประเมินไว้คือ ARM) ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะขจัดความคิดที่ว่าคอมไพเลอร์ทำงานได้ดีกว่ามนุษย์เพราะมันไม่ใช่ และแม้ว่ามันจะทำเมื่อมนุษย์รู้ว่าสิ่งที่พวกเขาทำ "รู้เครื่องมือของคุณ" หากคุณต้องการใช้อย่างมีประสิทธิภาพ เริ่มต้นด้วย C และใช้ ASM เมื่อจำเป็นหากคุณสามารถพิสูจน์ได้ว่า ...
old_timer

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

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

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

1

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

สำหรับ C การประนีประนอมนั้นไม่ได้หายไปมากนัก แต่มันก็สังเกตเห็นได้น้อยกว่ามาก - คุณสามารถเขียน / ดูแลรักษา C ที่ง่ายต่อการปรับให้เหมาะสม

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

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


-3
  1. ค่อนข้างดีสำหรับประสิทธิภาพการเขียนโปรแกรม
  2. ง่ายต่อการโปรแกรมโดยใช้ภาษา c แทนที่จะใช้ชุดประกอบ
  3. ภาษา C สามารถค่อนข้างเร็วกว่าภาษาแอสเซมบลี
  4. เป็นไปได้ที่จะเขียนชุดประกอบในรหัส C แต่ไม่สามารถใช้รหัส C ในชุดประกอบ

3
ข้อดีเท่านั้น ....
Kiran Sapkale

3
นี่เป็นเพียงส่วนใหญ่รุ่น reworded ของอะไรคือข้อดี / ข้อเสียของการใช้ C มากกว่าการชุมนุม? ; คุณไม่ได้เพิ่มอะไรใหม่ในการอภิปรายที่นี่
Martijn Pieters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.