คอมไพเลอร์แบทช์คืออะไร?


28

ฉันมีใบเสนอราคาต่อไปนี้จากหลักสูตรของคอมไพเลอร์ (ในบริบทของการระบายสีกราฟ):

เนื่องจากช้าการทำกราฟสีจึงมีแนวโน้มที่จะใช้ในคอมไพเลอร์แบบแบทช์ในขณะที่การสแกนเชิงเส้นมีแนวโน้มที่จะใช้ในคอมไพเลอร์ JIT

ฉันไม่พบคำจำกัดความที่ชัดเจนทางออนไลน์ ดังนั้นสิ่งที่ทำให้คอมไพเลอร์เป็นชุดคอมไพเลอร์?


คำถามนั้นอยู่นอกหัวข้อที่นี่ softwareengineering.stackexchange.comเป็นสถานที่ที่ดีกว่าที่จะถาม
Basile Starynkevitch

คำตอบ:


42

คอมไพเลอร์คอมไพล์รหัส JIT (Just-In-Time) ณ รันไทม์เช่นขณะที่โปรแกรมกำลังทำงาน ดังนั้นค่าใช้จ่ายในการรวบรวมจึงเป็นส่วนหนึ่งของเวลาดำเนินการของโปรแกรมดังนั้นควรลดให้เหลือน้อยที่สุด

สิ่งที่ตรงกันข้ามนี้คือคอมไพเลอร์ล่วงหน้า (AOT) ซึ่งโดยพื้นฐานแล้วมีความหมายเหมือนกันกับ "batch compiler" สิ่งนี้จะแปลงซอร์สโค้ดเป็นรหัสเครื่องและจากนั้นเพียงแจกจ่ายรหัสเครื่อง ดังนั้นคอมไพเลอร์อาจช้ามากเนื่องจากไม่ส่งผลกระทบต่อเวลาดำเนินการของโปรแกรมผลลัพธ์

ทุกวันนี้เมื่อผู้คนพูดว่า "คอมไพเลอร์" พวกเขามักจะหมายถึงคอมไพเลอร์ AOT แท้จริงแล้วคำว่า "AOT compiler" เพิ่งเริ่มได้รับความนิยมค่อนข้างมากเมื่อผู้คนเริ่มสร้างคอมไพเลอร์ AOT สำหรับภาษาที่รวบรวม JIT โดยเฉพาะ JavaScript ภาษาเหล่านี้จำนวนมากเช่น C # รวบรวมเป็นภาษาระดับกลางสำหรับ VM ซึ่งจากนั้น JIT จะคอมไพล์ไปยังรหัสเครื่องในเวลาทำงาน คำว่า "AOT คอมไพเลอร์" มีความหมายว่าซอร์สโค้ดจะถูกรวบรวมโดยตรงกับรหัสเครื่องดังนั้นจึงไม่จำเป็นต้องรวบรวมรูปแบบ JIT ในเวลาทำงาน

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


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

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

1
@dmckee ส่วนใหญ่ถ้าไม่ใช่การปรับใช้ภาษาทั้งหมดจริง ๆ แล้ว
user253751

ความกำกวมอีกประการหนึ่ง: มีเครื่องมือที่เรียกว่าตัวรวบรวมแบตช์สำหรับระบบปฏิบัติการ MSDOS ไฟล์แบทช์ที่รวบรวมเหล่านี้เป็นไฟล์ที่ปฏิบัติการได้ ....
rackandboneman

แน่นอนว่ามีตัวแทนอยู่ภายในเสมอ แต่บางครั้งมันเป็นภาษาในสิทธิของตนเองเช่นเดียวกับใน Gcc, Llvm หรือ. Net นี่เป็นเพราะสถาปัตยกรรม front-end / middle / back-end front-end เปลี่ยนภาษา (C, C ++, Java, fortran .. ) เป็นภาษาระดับล่างทั่วไปแล้วอัลกอริทึมการเพิ่มประสิทธิภาพจะทำงานและ ในที่สุดรหัสที่ได้รับการปรับปรุงให้ดีที่สุดในภาษาทั่วไปจะถูกแปลงโดยแบ็คเอนด์เป็น bytecode หรือแอสเซมเบลอร์, ไลบรารีที่รันได้หรือสแตติกหรือไดนามิก
reuns

11

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

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

นี่คือการสนทนาของ JIT (Just-In-Time) ซึ่งดำเนินการ "สด" ในเวลาที่แน่นอนซึ่งเป็นสิ่งจำเป็นโดยไม่จำเป็นต้องใช้เวลาเพิ่มเติมเพื่อทำการประมวลผลอย่างละเอียดมากขึ้น

ความเร็วที่ช้าลงของการรวบรวมแบทช์สามารถแสดงได้โดยสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ที่มา: https://xkcd.com/303/

หรือแม้แต่สิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ที่มา: http://dilbert.com/strip/2013-06-22

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