การรวบรวมเทียบกับการถ่ายโอนข้อมูล


92

ในขณะที่ค้นหาความแตกต่างฉันพบคำจำกัดความเหล่านี้:

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

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

ฉันเข้าใจว่า Abstraction คืออะไร

แต่ "ระดับนามธรรมที่คล้ายคลึงกัน" ในคำจำกัดความข้างต้นหมายความว่าอย่างไร และเราจะหาระดับของนามธรรมในภาษาได้อย่างไร?


เป็นไปได้ที่จะซ้ำกันของนามธรรมคืออะไร?
GrumpyCrouton

นี่คือที่มา? stevefenton.co.uk/2012/11/compiling-vs-transpiling
wjandrea

คำตอบ:


143

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

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

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

ตัวอย่างบางส่วนของทรานสไพเลอร์:

  1. Emscripten : แปลงไฟล์ C / C ++ เป็น JavaScript
  2. Babel : Transpiles ES6 + code เป็น ES5 (ES6 และ ES5 เป็นภาษา JavaScript หรือรุ่นต่างๆ)

"ระดับนามธรรมที่ใกล้เคียงกัน" หมายความว่าอย่างไร: อย่างที่บอกว่าคอมไพล์ / ทรานสไพร์ไปยังไฟล์ซอร์สมีใครโต้แย้งได้ว่าภาษาแอสเซมบลีเป็นไฟล์ต้นฉบับด้วยดังนั้น gcc จึงเป็นทรานสไพเลอร์ด้วย ดังนั้นอาร์กิวเมนต์นี้คือโมฆะนามธรรมในระดับที่ใกล้เคียงกันนี้

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

ภาษาระดับล่างเช่นแอสเซมบลีนั้นใกล้เคียงกับสถาปัตยกรรมโปรเซสเซอร์เช่นมีคำสั่งที่แตกต่างกันสำหรับโปรเซสเซอร์ที่แตกต่างกัน ในขณะที่ C / C ++ / Java / JavaScript นามธรรมทั้งหมดนี้ให้นามธรรมมากขึ้น

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

หวังว่านี่จะช่วยได้!


10
"ตัวอย่างบางส่วนของทรานสไพเลอร์:" --- บาเบลเรียกตัวเองว่าคอมไพเลอร์ การแยกระหว่างทรานส์ไพเลอร์และคอมไพเลอร์เป็นสิ่งประดิษฐ์จริงๆ
zerkms

14
@zerkms อย่างที่บอกทรานสไพเลอร์เป็นคอมไพเลอร์ส่วนย่อย
tapananand

1
ฉันต้องการเพิ่มสิ่งหนึ่งเรากำลังพูดถึงภาษาธรรมชาติที่นี่ ดังนั้นจึงคาดว่าคำจำกัดความที่คลุมเครือ ฉันคาดหวังว่า "ความสะดวกในการอ่าน" ผลลัพธ์ของทรานสไพเลอร์จะคล้ายกับที่เคยมีมาก่อนในขณะที่คอมไพเลอร์ทำให้อ่านยากขึ้น ดังนั้น Webpack / npm จึงเป็นคอมไพเลอร์คุณไม่ต้องการอ่านเอาต์พุต (อย่างน้อยเมื่อคุณเพิ่ม "Loaders" สำหรับเช่นไฟล์.
vue

1
ความคิดเห็น: ฉันคิดว่าคำจำกัดความควรเป็น: การรวบรวม: ภาษา -> ภาษาระดับล่าง การถ่ายโอน: ภาษา -> ภาษาระดับเดียวกัน
Deji

3
@ เดจิไม่จำเป็นต้องเป็นภาษาระดับเดียวกัน แต่เป็นภาษาที่มีระดับนามธรรมใกล้เคียงกัน
tapananand

33

นี่คือวิธีการอธิบายคำตอบ

หากคุณนึกถึงเลเยอร์ของนามธรรมดังตัวอย่างนี้:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

คอมไพเลอร์ไปที่ระดับล่าง (ตัวเลขต่ำกว่า) ทรานสไพเลอร์จะเปลี่ยนจากภาษาหนึ่ง (หรือเวอร์ชันของภาษา) ไปยังอีกภาษาหนึ่งโดยใช้หมายเลขเดียวกัน


1
อยากรู้ไหมว่ารายการ "ระดับนามธรรม" นั้นมาจากไหน
zerkms

เพียงแค่ตัวอย่างตัวอย่างแบบสุ่มฉันรู้ว่าสองคนแรกค่อนข้างอ่อน แต่ฉันต้องการรายการที่ยาวกว่านี้: P
Araymer

2
ฉันชอบและมันจะเจ๋งมากถ้าเป็นการจัดประเภท "อย่างเป็นทางการ" แบบนั้น เนื่องจากไม่มีมันก็ยากที่จะใส่เครื่องมือ (นักแปล) ลงในหมวดหมู่หนึ่งหรือหมวดอื่น เช่น: เป็นjavacคอมไพเลอร์หรือไม่
zerkms

2

ส่วนใหญ่เห็นด้วยกับคำตอบของคุณ tapananand แต่ ...


นิยาม

คำว่า "สร้าง" ดังนั้นจึงตอบสนองวัตถุประสงค์ และสิ่งนี้ก็เปลี่ยนแปลงไปตามกาลเวลา

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


ตัวอย่าง

ดังนั้นทุกอย่างจึงเป็นเรื่องส่วนตัวมาก ในขณะที่เขียนนี้:

  • มาจากโลก Java ฉันสามารถเรียก Transpiler CoffeeScript / TypeScript เพื่อแสดงให้เห็นว่าโค้ดที่ได้นั้นไม่มีประสิทธิภาพมากกว่าโค้ดต้นฉบับ
  • เอกสาร CoffeScript ระบุว่าเป็นคอมไพเลอร์และ Babel เป็นตัวส่งสัญญาณ ต้องการบอกว่า CoffeeScript แม้จะคล้ายกันมาก แต่ก็ไม่ใช่ Javascript อย่างน้อยก็ไม่ใช่เวอร์ชันของมันเนื่องจากเป็นสิ่งที่บาเบลสร้างขึ้น
  • บาเบลเรียกตัวเองว่าคอมไพเลอร์

fazit

ดังนั้นtranspileคือในขณะนี้มากไม่ค่อยได้ใช้อีกต่อไปและเดียวที่จะบอกคอมไพเลอร์ทั้งสองออกจากกัน

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


2

เช่น TypeScript (ชุดย่อยของ Microsoft ของ JavaScript ที่มีการตรวจสอบประเภทที่ปลอดภัย) เปลี่ยนเป็นโค้ด JavaScript ซึ่งสามารถทำงานบนเบราว์เซอร์ประเภทต่างๆ

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript เป็นภาษาโปรแกรมโอเพ่นซอร์สที่พัฒนาและดูแลโดย Microsoft ซึ่งเป็นชุดคำสั่งพิเศษทางไวยากรณ์ที่เข้มงวดของ JavaScript และเพิ่มการพิมพ์แบบคงที่ซึ่งเป็นทางเลือกให้กับภาษา

TypeScript ได้รับการออกแบบมาสำหรับการพัฒนาแอปพลิเคชันขนาดใหญ่และทรานคอมไพล์เป็น JavaScript [5] เนื่องจาก TypeScript เป็นส่วนเหนือของ JavaScript โปรแกรม JavaScript ที่มีอยู่จึงเป็นโปรแกรม TypeScript ที่ถูกต้อง อาจใช้ TypeScript เพื่อพัฒนาแอปพลิเคชัน JavaScript สำหรับการดำเนินการทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ (Node.js) "


มี "คอมไพเลอร์ typescript" (หรือ TSC) เครื่องมือคือการตั้งชื่อของมันหมายถึงว่า typescript จะรวบรวมไม่transpiled ... ยังเครื่องมือแปลง typescript เพื่อ Javascript ซึ่งเป็นระดับเดียวกันของนามธรรม WRT ฮาร์ดแวร์พื้นฐาน มีการคอมไพล์ TypeScript หรือไม่?
Alex McMillan

@AlexMcMillan TypeScript ถูกคอมไพล์เนื่องจากเป็นส่วนเหนือของจาวาสคริปต์และด้วยเหตุนี้จึงถูกคอมไพล์ลงในจาวาสคริปต์
Araymer

@Araymer คุณเข้าใจความแตกต่างระหว่างการรวบรวมและการถ่ายทอดหรือไม่? เนื่องจาก TS ไม่ได้รวบรวม ไม่ใช่ JS
Alex McMillan

ใช่ฉันทำ. และเนื่องจาก TS เป็นส่วนเหนือของ JS จึงถือว่าเป็นนามธรรมในระดับที่สูงกว่าจึงเรียกว่า "คอมไพล์" JS ที่คอมไพล์แล้วจะถูกตีความตามปกติ ดังนั้นหากคุณค้นหา TS หัวข้อที่มีการพูดถึงมากที่สุดเพียงหัวข้อเดียวคือ แต่เส้นแบ่งระหว่างการถ่ายโอนและการรวบรวมไม่มีคำจำกัดความเชิงปริมาณอย่างเป็นทางการ มันค่อนข้างอ่อนดังนั้นความคิดเห็นของคุณเกี่ยวกับสิ่งที่รวบรวม (แตกต่างจากผู้สร้างตามที่เป็นอยู่) เป็นเพียงความคิดเห็นของคุณ
Araymer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.