เป้าหมายการรวบรวมคืออะไร?


17

ฉันได้ยินคำนี้เรื่อย ๆ และการค้นหาของ Google ทั้งหมดนำฉันไปสู่บทความเกี่ยวกับคอมไพเลอร์ ฉันแค่อยากจะเข้าใจความหมายของเป้าหมายการรวบรวมคำว่า: |

ปรับปรุง: เพื่อให้บริบท: ฉันได้ยินมันบอกว่าการชุมนุมของเว็บเป็นเป้าหมายที่รวบรวมสำหรับภาษาอื่น ๆ เช่น C, C ++, สนิม ฯลฯ


ฉันแนะนำให้คุณอ่านบทความเกี่ยวกับคอมไพเลอร์

4
บทความเกี่ยวกับคอมไพเลอร์ถือว่าคุณรู้เรื่องนี้แล้ว มันเป็นคำถามที่สมเหตุสมผล
Karl Bielefeldt

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

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

@DocBrown ฉันเคยได้ยินมาในหลาย ๆ บริบท แต่ส่วนใหญ่เมื่อเร็ว ๆ นี้ในบริบทของการชุมนุมทางเว็บเป็นเป้าหมายในการรวบรวมสำหรับภาษาอื่น ๆ
ScionOfBytes

คำตอบ:


17

โดยพื้นฐานแล้วคอมไพเลอร์คือผู้แปลที่รับอินพุตในภาษาหนึ่งและให้ผลผลิตในอีกภาษาหนึ่ง ตัวอย่างเช่นคอมไพเลอร์ของ Eiffel Software รับอินพุตภาษาไอเฟลและสร้าง C. GCC สำหรับ Intel อ่านอินพุตภาษา C และสร้างชุดประกอบ x86 แอสเซมเบลอร์ GAS สำหรับ Intel ใช้แอสเซมบลี x86 และสร้างรหัสวัตถุ x86 ทั้งสามสิ่งนี้เป็นคอมไพเลอร์ทางเทคนิค

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

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

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

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


2
ในฐานะที่เป็นหมายเหตุด้านอาจมีมูลค่าการกล่าวถึงว่าคำนี้ยังใช้ในรูปแบบทั่วไปมากขึ้นในบริบทของการสร้างระบบ - เป้าหมายคือการส่งออกจากขั้นตอนการสร้างใด ๆ ที่ไม่จำเป็นต้องมีการรวบรวม (เช่น กำลังสร้างโปรแกรมติดตั้ง)
BartoszKP

2
คอมไพเลอร์เป็นนักแปลไม่ใช่ตัวกรอง

1
@Birfl อย่างชัดเจน "tr" หมายถึงแปลไม่ใช่ตัวกรอง ตัวกรองไม่ใช่นักแปลนี่เป็นที่ชัดเจน

2
@ Birfl: ฉันไม่ได้ไปโดยวิกิพีเดีย เพียงแค่สร้างกระแสข้อมูลหนึ่งจากอีกสิ่งหนึ่ง ความแตกต่างระหว่างตัวกรองและตัวแปลเป็นที่รู้จักกันดี ตัวกรองประกอบด้วย / ไม่รวมตามกริยา มันไม่ได้เปลี่ยน กรองรายการจำนวนเต็มด้วยหรือไม่ และคุณจะได้รับเลขจำนวนเต็มไม่เปลี่ยนรูปแบบ แปลรายการเดียวกันโดยใช้ inc และคุณจะได้รับรายการต้นฉบับเวอร์ชันที่แปลงแล้ว

1
บัญชีการรวบรวมของคุณนั้นใช้ได้ยกเว้นคำว่า "ตัวกรอง"

4

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

ดังนั้นแหล่งที่มาสำหรับคอมไพเลอร์คือภาษาการเขียนโปรแกรม (C) ในขณะที่เป้าหมายคือ bytecode (คำแนะนำระดับเครื่อง) เรามักจะใช้เป้าหมายในการรวบรวมเพราะระบบที่แตกต่างกัน (สถาปัตยกรรมของ CPU) มีชุดคำสั่งต่าง ๆ เช่น ARM, MIPS และอื่น ๆ คอมไพเลอร์จำเป็นต้องรู้ว่าชุดคำสั่งใดเป็นเป้าหมายเพื่อให้สามารถสร้างเอาต์พุตที่ถูกต้อง (bytecode)


0

WebAssemby เป็นสิ่งล่าสุดและยิ่งใหญ่ที่สุดซึ่งจะแปลงรหัส c / c ++ ในรูปแบบไบนารี

  • WebAssembly มีวัตถุประสงค์เพื่อดำเนินการด้วยความเร็วสูงโดยใช้ประโยชน์จากฮาร์ดแวร์ทั่วไป มันออกแบบมาเพื่อทำงานร่วมกับแพลตฟอร์มเว็บ

นี่คือลิงค์ที่เป็นหนึ่งในแอพพลิเคชั่นที่คุณสามารถเห็นได้ว่ามันแปลงโปรแกรมแฟกทอเรียลแบบง่าย ๆ ให้เร็วแค่ไหนในรหัสเครื่อง

ตรวจสอบสัตว์ร้ายนี้https://godbolt.org/

คุณสามารถใช้โปรแกรมตัวอย่างนี้เพื่อเรียกใช้ในไซต์นั้นเพื่อดูชุดประกอบ

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • กำหนดรูปแบบไบนารีแบบพกพาขนาดและเวลาในการโหลดที่มีประสิทธิภาพเพื่อใช้เป็นเป้าหมายในการรวบรวมซึ่งสามารถรวบรวมเพื่อดำเนินการด้วยความเร็วดั้งเดิมโดยใช้ประโยชน์จากความสามารถของฮาร์ดแวร์ทั่วไปที่มีอยู่ในแพลตฟอร์มที่หลากหลายรวมถึงมือถือและ IoT

ข้อมูลพื้นฐานบางอย่างเกี่ยวกับโฮสต์และเป้าหมายวิธีแปลภาษาโปรแกรมเป็น 10101010

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC แปลงรหัส C / C ++ เป็นรหัสชุดประกอบ เครื่องมือที่เรียกว่า "แอสเซมเบลอร์" จะแปลงรหัสแอสเซมบลีเป็นรหัสเครื่องและเครื่องมือที่ชื่อว่า "ลิงเกอร์" จะเชื่อมต่อไฟล์รหัสเครื่องหลาย ๆ ไฟล์เป็นไฟล์ปฏิบัติการเดียว (.EXE ภายใต้ Windows) คอมไพเลอร์เหล่านี้ส่วนใหญ่อนุญาตให้คุณเขียนโค้ดแอสเซมเบลอร์ที่เป็นผลลัพธ์ลงในไฟล์เพื่อให้คุณสามารถดูโค้ดแอสเซมเบลอร์หรือแก้ไขได้

  2. แอสเซมเบลอร์และตัวเชื่อมโยงเป็นส่วนหนึ่งของห่วงโซ่เครื่องมือซึ่งหมายความว่าพวกเขามักจะส่งมอบพร้อมกับคอมไพเลอร์

  3. คอมไพเลอร์บางตัว (เช่น Microsoft) อย่างไรก็ตามแปลงรหัส C / C ++ โดยตรงเป็นภาษาเครื่องจึงไม่จำเป็นต้องใช้แอสเซมเบลอร์อีกต่อไป คอมไพเลอร์เหล่านี้จำนวนมากไม่สามารถสร้างรหัสแอสเซมเบลอร์ดังนั้นคุณจึงไม่สามารถเขียนรหัสแอสเซมเบลอร์ลงในไฟล์ได้

โดยวิธีการ: ยังมีคอมไพเลอร์ (ไม่ใช่สำหรับ C / C ++ แต่สำหรับภาษาการเขียนโปรแกรมอื่น ๆ ) ที่สร้างไฟล์. EXE โดยตรงดังนั้นจึงไม่จำเป็นต้องใช้ตัวเชื่อมโยง

WebAssembly: https://github.com/WebAssembly/design

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