คอมไพเลอร์เชิงมุม "คอมไพเลอร์" คืออะไร?


88

ฉันถูกถามในวันนี้และไม่สามารถให้คำตอบที่เหมาะสมได้

typescript ถ่ายทอดเป็น JS จากนั้นมีต้นไม้สั่น "น้อยกว่า" (ไม่บังคับ) และมีอะไรอีกบ้างในกระบวนการทำให้ใช้งานได้ แต่ไม่มีอะไรเช่นนั้น (afaik) เกี่ยวข้องกับการ "รวบรวม" ทุกอย่างได้รับการรวมและปรับให้เหมาะสมอย่างมาก แต่ยังไม่ได้รวบรวมจริงใช่ไหม?

แม้จะมีผู้ควบคุม - "ล่วงหน้า" ซึ่งทำงานได้อย่างเห็นได้ชัด ฉันคิดถึงอะไร?

Javascript เองก็ยังตีความได้ใช่ไหม?


6
ฉันเห็นด้วยกับการ "รวบรวมข้อมูลไม่ได้จริงๆ" โดยพื้นฐานแล้วมันเป็นเรื่องของความหมายของการสะสม บางคนชอบใช้คำว่าTranspilationเพื่อทำเครื่องหมายการแปลงจาก TypeScript เป็น JavaScript แต่โดยพื้นฐานแล้วบทบาทของคอมไพเลอร์ typescript เป็นเพียงการสร้าง Javascript จาก typescript
Pac0

6
@ Pac0 ฉันอาจจะเข้าใจผิดอะไรบางอย่างที่นี่ แต่ถ้า TypeScript เป็น JavaScript เป็นการถ่ายโอน GCC จะไม่เป็นตัวแปลงรหัส C ไปยังเครื่อง คุณจะกำหนดความแตกต่างระหว่างทรานส์ไพเลอร์และคอมไพเลอร์ได้อย่างไร?
11684

24
Transpiler เป็นคอมไพเลอร์
user253751

5
ดูว่าผู้คนหมายถึงอะไรเมื่อพูดว่า "ทรานสไพเลอร์" (และต่อจากนั้น“ คอมไพเลอร์สิบห้าตัวแรกของฉัน” ) (จากคนที่ทำงานเกี่ยวกับคอมไพเลอร์) ซึ่งระบุว่า“ คอมไพเลอร์” เป็นคำที่ดีที่จะใช้สำหรับสิ่งต่างๆเช่นนี้
ShreevatsaR

2
Javascript เองก็ยังคงถูกตีความใช่ไหม? - ไม่อีกต่อไปจะรวบรวมเป็นรหัสเครื่องได้ทันทีโดยเครื่องยนต์ V8
Max Koretskyi

คำตอบ:


91

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

ที่กล่าวว่าฉันพูดคำดีสำหรับเรื่องนี้คือTranspiling ฉันขอแนะนำว่าคอมไพเลอร์ typescript อธิบายได้ดีกว่าว่าเป็น Transpiler

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

ผลมาจากการรวบรวมรหัสที่เป็นปกติไม่ใช่ภาษาที่คุณจะเขียนด้วยตัวคุณเอง ผลลัพธ์ของทรานสไพเลอร์เป็นภาษาระดับสูงอีกภาษาหนึ่ง ในทางทฤษฎีคุณสามารถเขียน IL ได้ (เป็นตัวอย่าง) แต่ออกแบบมาให้สร้างโดยคอมไพเลอร์และไม่มีเครื่องมือหรือการสนับสนุนในการทำเช่นนี้คุณสร้าง IL โดยรวบรวม C # / vb.net เท่านั้น ในขณะที่ Javascript เป็นภาษาโปรแกรมที่ใช้งานได้ (และใช้แล้ว) ในสิทธิของตนเอง

* คำเตือนมากมายเนื่องจากคำจำกัดความของคำเหล่านี้และการใช้งานค่อนข้างคลุมเครือ


12
JavaScript ไม่อยู่ในระดับที่ต่ำกว่า TypeScript อย่างเคร่งครัดใช่หรือไม่?
Bergi

3
แม้ว่าทุกสิ่งในคำตอบนี้จะถูกต้องและเป็นประโยชน์โดยเฉพาะอย่างยิ่งเนื่องจากคำจำกัดความของการรวบรวมเป็นเรื่องที่สับสนอยู่เสมอ แต่ก็ไม่ได้ตอบคำถามในชื่อเรื่อง คำตอบนี้พูดถึง TypeScript เท่านั้นในขณะที่คำถามเกี่ยวกับ Angular ความแตกต่างเป็นอย่างมาก เป็นไปได้ทั้งหมดที่จะใช้ Angular โดยที่ไม่รู้ด้วยซ้ำว่า TS เป็นสิ่งของ ฉันประหลาดใจที่ได้รับคำตอบนี้
Pedro A

3
คอมไพเลอร์จำเป็นต้องเข้าใจโปรแกรมทั้งหมดเป็นหลักเพื่อสร้างโปรแกรมอื่น (ซึ่งโดยปกติจะทำสิ่งเดียวกัน แต่เป็นภาษาอื่นซึ่งรวมถึงรหัสเครื่อง)
Thorbjørn Ravn Andersen

8
ฉันเพิ่งอ่านสองครั้งและไม่พบคำตอบสำหรับคำถามที่นี่ คำตอบอยู่ด้านล่าง
kuncevic.dev

5
คำถามโดยนัยที่ OP ถามซึ่งเป็นเหตุผลที่พวกเขายอมรับสิ่งนี้คือ "ถูกต้องหรือไม่ที่จะเรียกคอมไพเลอร์ Angular ว่าคอมไพเลอร์" - และนั่นคือสิ่งที่คำตอบนี้ตอบโจทย์ +1 จากฉัน ดูเพิ่มเติมว่าผู้คนหมายถึงอะไรเมื่อพูดว่า "ทรานสไพเลอร์" และติดตาม“My สิบห้าคอมไพเลอร์ครั้งแรก”
ShreevatsaR

70

ดูเหมือนคุณจะถามคำถามสามข้อในหนึ่งข้อ:

  • อะไรคือความแตกต่างระหว่างคอมไพเลอร์และทรานสไพเลอร์?
  • Angular และ TypeScript ใช้คอมไพเลอร์หรือทรานสไพเลอร์หรือไม่
  • มีคอมไพเลอร์ Angular แยกต่างหากหรือไม่? มันรวบรวมอะไร?

อะไรคือความแตกต่างระหว่างคอมไพเลอร์และทรานสไพเลอร์?

@ JörgWMittag ให้คำตอบที่ดีมากสำหรับคำถามนี้

Angular และ TypeScript ใช้คอมไพเลอร์หรือทรานสไพเลอร์หรือไม่

ทั้ง TS และ Angular ใช้คอมไพเลอร์จริง พวกเขาทำตามขั้นตอนเดียวกันของการวิเคราะห์คำศัพท์การแยกวิเคราะห์การวิเคราะห์เชิงความหมายและการสร้างรหัสเป็นคอมไพเลอร์ C / C ++ ที่สร้างรหัสแอสเซมบลี (ยกเว้นอาจเป็นการเพิ่มประสิทธิภาพ) คุณจะเห็นว่าชั้น / โฟลเดอร์ที่มีชื่อ "คอมไพเลอร์" ทั้งในเชิงมุมและTS

คอมไพเลอร์เชิงมุมไม่เกี่ยวข้องกับคอมไพเลอร์ TypeScript จริงๆ คอมไพเลอร์เหล่านี้แตกต่างกันมาก

มีคอมไพเลอร์ Angular แยกต่างหากหรือไม่? มันรวบรวมอะไร?

Angular มีคอมไพเลอร์สองตัว:

  • ดูคอมไพเลอร์
  • โมดูลคอมไพเลอร์

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

นอกจากเปลี่ยนแม่แบบคอมไพเลอร์ดูยังรวบรวมข้อมูลเมตาดาต้าต่างๆในรูปแบบของการตกแต่งเช่น@HostBinding, @ViewChildฯลฯ

สมมติว่าคุณกำหนดองค์ประกอบและแม่แบบดังนี้:

@Component({
  selector: 'a-comp',
  template: '<span>A Component</span>'
})
class AComponent {}

การใช้ข้อมูลนี้คอมไพเลอร์จะสร้างโรงงานส่วนประกอบที่ง่ายขึ้นเล็กน้อยดังต่อไปนี้:

function View_AComponent {
  return jit_viewDef1(0,[
      elementDef2(0,null,null,1,'span',...),
      jit_textDef3(null,['My name is ',...])
    ]

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

ฉันขอแนะนำอย่างยิ่งให้อ่านบทความเหล่านี้:

นอกจากนี้โปรดดูคำตอบว่า Angular AOT และ JIT compiler แตกต่างกันอย่างไร

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

สำหรับข้อมูลเพิ่มเติมโปรดอ่าน:



1
@codepleb โปรดทราบว่า GCC และคอมไพเลอร์อื่น ๆ ไม่ได้สร้างรหัสเครื่องเลย ในทางปฏิบัติ GCC เรียกระบบโดยอัตโนมัติเพื่อสร้างรหัสเครื่องจักร แต่รหัสที่สร้างขึ้นโดยไม่ได้รับความช่วยเหลือจากภายนอกเป็นเพียงการประกอบเท่านั้นซึ่งจะถูกส่งไปยังผู้ประกอบภายนอก
prosfilaes

7
@codepleb คำตอบนี้ดีกว่ามากและตอบคำถามของคุณได้จริง ยังมีเวลาพิจารณาการตัดสินเดิมของคุณอีกครั้ง
async

3
@codepleb ไม่มีเหตุผลที่ดีที่คำว่า "ทรานสไพเลอร์" จะมีอยู่จริงหรือเคยมีอยู่ทั้งหมดมันทำให้เข้าใจผิด
Leushenko

2
@stom ขออภัยคำถามนั้นกว้างเกินไป คำตอบที่ได้รับการโหวตมากที่สุดก็ค่อนข้างดี
Max Koretskyi

54

typescript จะเปลี่ยนเป็น JS จากนั้นมีต้นไม้สั่น "น้อยกว่า" (ไม่บังคับ) และมีอะไรอีกบ้างในกระบวนการทำให้ใช้งานได้ แต่ไม่มีอะไรเช่นนั้น (afaik) เกี่ยวข้องกับการ "รวบรวม" ทุกอย่างได้รับการรวมและปรับให้เหมาะสมอย่างมาก แต่ยังไม่ได้รวบรวมจริงใช่ไหม?

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

รวบรวมหมายความแปลโปรแกรมจากภาษาภาษาB นั่นหมายความว่าทั้งหมด (โปรดทราบว่าAและBเป็นภาษาเดียวกันเป็นไปได้อย่างสมบูรณ์แบบ)

ในบางกรณีเรามีชื่อเฉพาะสำหรับคอมไพเลอร์บางประเภทขึ้นอยู่กับว่าAและBคืออะไรและคอมไพเลอร์ทำอะไร:

  • ถ้าAถูกมองว่าเป็นภาษาแอสเซมบลีและBถูกมองว่าเป็นภาษาเครื่องเราจึงเรียกมันว่าแอสเซมเบลอร์
  • ถ้าเป็นที่รับรู้เป็นภาษาเครื่องและBเป็นที่รับรู้เป็นภาษาประกอบแล้วเราเรียกมันว่าdisassembler ,
  • ถ้าเป็นที่รับรู้จะเป็นระดับที่ต่ำกว่าBแล้วเราเรียกมันว่าDecompiler ,
  • ถ้าและBเป็นภาษาเดียวกันและโปรแกรมที่เกิดขึ้นอยู่ในวิธีการบางอย่างได้เร็วขึ้นหรือเบาแล้วเราเรียกว่าเพิ่มประสิทธิภาพ ,
  • ถ้าและBเป็นภาษาเดียวกันและโปรแกรมส่งผลให้มีขนาดเล็กแล้วเราเรียกมันว่าminifier ,
  • ถ้าและBเป็นภาษาเดียวกันและโปรแกรมที่เกิดขึ้นสามารถอ่านได้น้อยกว่านั้นเราเรียกมันว่าObfuscator ,
  • ถ้าAและBถูกมองว่าอยู่ในระดับนามธรรมใกล้เคียงกันเราจึงเรียกมันว่าTranspilerและ
  • หากAและBถูกมองว่าอยู่ในระดับนามธรรมใกล้เคียงกันและโปรแกรมผลลัพธ์จะรักษาการจัดรูปแบบความคิดเห็นและเจตนาของโปรแกรมเมอร์เพื่อให้สามารถรักษาผลลัพธ์ของโปรแกรมให้เป็นแบบเดียวกับโปรแกรมดั้งเดิมได้เราจึงเรียกว่า มันเป็นเครื่องมือวิศวกรรมใหม่

นอกจากนี้โปรดทราบว่าแหล่งข้อมูลเก่า ๆ อาจใช้คำว่า "translation" และ "translator" แทน "compilation" และ "compiler" ตัวอย่างเช่น C พูดถึง "หน่วยการแปล"

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

Javascript เองก็ยังตีความได้ใช่ไหม?

JavaScript เป็นภาษา ภาษาคือชุดของกฎและข้อ จำกัด เชิงตรรกะ ภาษาไม่ได้รับการตีความหรือเรียบเรียง ภาษาเพียงแค่มี

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

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

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

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

ตรงประเด็น: ทุกการใช้งาน JavaScript หลักที่มีอยู่ในปัจจุบันมีคอมไพเลอร์

V8 เริ่มต้นจากการเป็นคอมไพเลอร์ที่บริสุทธิ์: มันรวบรวม JavaScript ตรงไปยังรหัสเครื่องดั้งเดิมที่ปรับให้เหมาะสมในระดับปานกลาง ต่อมามีการเพิ่มคอมไพเลอร์ตัวที่สอง ตอนนี้มีคอมไพเลอร์สองตัว: คอมไพเลอร์น้ำหนักเบาที่สร้างโค้ดที่ปรับให้เหมาะสมระดับปานกลาง แต่ตัวคอมไพเลอร์นั้นเร็วมากและใช้ RAM เพียงเล็กน้อย คอมไพเลอร์นี้ยังฉีดโค้ดการทำโปรไฟล์ลงในโค้ดที่คอมไพล์ คอมไพเลอร์ตัวที่สองเป็นคอมไพเลอร์ที่มีน้ำหนักมากขึ้นช้ากว่าและมีราคาแพงกว่าซึ่งจะสร้างโค้ดที่แน่นกว่าและเร็วกว่ามาก นอกจากนี้ยังใช้ผลลัพธ์ของโค้ดการสร้างโปรไฟล์ที่คอมไพเลอร์ตัวแรกใส่เข้าไปเพื่อทำการตัดสินใจเกี่ยวกับการเพิ่มประสิทธิภาพแบบไดนามิก นอกจากนี้การตัดสินใจว่าจะคอมไพล์โค้ดใหม่โดยใช้คอมไพลเลอร์ตัวที่สองจะขึ้นอยู่กับข้อมูลการทำโปรไฟล์นั้น สังเกตว่าไม่มีล่ามเข้ามาเกี่ยวข้อง V8 ไม่เคยตีความมันมักจะรวบรวม มันไม่ ' ไม่มีล่ามด้วยซ้ำ (อันที่จริงฉันเชื่อว่าทุกวันนี้ฉันกำลังอธิบายการทำซ้ำสองครั้งแรก)

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

เอ็นจิ้นการเรียกใช้ JavaScript เกือบทั้งหมด (ยกเว้น V8) เป็นไปตามโมเดลของคอมไพเลอร์ AOT ที่คอมไพล์ JavaScript เป็น bytecode และเอนจิ้นโหมดผสมที่สลับระหว่างการตีความและการคอมไพล์ไบต์โค้ดนั้น

คุณเขียนในความคิดเห็น:

ฉันคิดจริงๆว่ารหัสเครื่องมีส่วนเกี่ยวข้อง

"รหัสเครื่อง" หมายถึงอะไร?

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

มีตัวแปล x86 ที่เรียกว่า JPC ที่เขียนด้วยภาษาจาวา ถ้าฉันเรียกใช้รหัสเครื่อง x86 บน JPC ที่ทำงานบน JVM CPU ดั้งเดิม…ซึ่งเป็นรหัส bytecode และรหัสใดคือรหัสดั้งเดิม หากฉันรวบรวมรหัสเครื่อง x86 เป็น JavaScript (ใช่มีเครื่องมือที่สามารถทำได้) และเรียกใช้ในเบราว์เซอร์บนโทรศัพท์ของฉัน (ซึ่งมีซีพียู ARM) ซึ่งเป็นรหัส bytecode และรหัสเครื่องใดเป็นรหัสดั้งเดิม จะเกิดอะไรขึ้นถ้าโปรแกรมที่ฉันกำลังรวบรวมเป็นโปรแกรมจำลอง SPARC และฉันใช้เพื่อเรียกใช้รหัส SPARC

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


4
+1 สำหรับคำอธิบายอย่างละเอียดเกี่ยวกับแนวคิดของการรวบรวมและถ้าฉันทำได้ +1 อีกครั้งสำหรับสัญลักษณ์แสดงหัวข้อย่อยเหล่านั้น เป็นประโยชน์มาก
Pedro A

1
แม้ว่าฉันต้องบอกว่าในทางเทคนิคแล้วสิ่งนี้ไม่สามารถตอบคำถามในชื่อเรื่องได้ ... ยังคงเป็น +1 ที่สมควรได้รับจากฉัน!
Pedro A

ฉันยอมรับว่ามันเป็นนัย แต่คำตอบสำหรับคำถามในชื่อเรื่องคือ "ทุกสิ่งที่รายการ OP ไม่ใช่การรวบรวมคือการคอมไพล์เชิงมุมคืออะไร"
Jörg W Mittag

คำอธิบายที่ดีจริงๆเกี่ยวกับหลักการตั้งชื่อมากกว่าความแตกต่างที่สำคัญ อาจปรับปรุงได้โดยการกล่าวถึงไมโครโค้ด - เพื่อชี้ให้เห็นว่าแม้ในระดับของรหัสเครื่องคุณไม่ได้ 'ที่โลหะ' ...
AakashM

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

18

การรับโค้ดที่คุณเขียนเพื่อรันบนเบราว์เซอร์มีสองสิ่ง:

1) Transpiling typescript เข้า JavaScript นี่เป็นปัญหาที่แก้ไขได้ ฉันคิดว่าพวกเขาใช้แค่ webpack

2) การรวบรวมแนวคิดมุมเข้าไปใน JavaScript ฉันหมายถึงสิ่งต่างๆเช่นส่วนประกอบท่อคำสั่งเทมเพลตเป็นต้นนี่คือสิ่งที่ทีมแกนเชิงมุมทำงาน

ในกรณีที่คุณสนใจจริงๆในบิตสองคอมไพเลอร์เชิงมุมเขียนนาฬิกาคอมไพเลอร์โทเบียสบ๊อชอธิบายเชิงมุมคอมไพเลอร์ที่ AngularConnect 2016

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


1

คอมไพเลอร์เชิงมุม

การเปลี่ยนแปลงที่สำคัญที่สุดอย่างหนึ่งจาก Angular 4 เป็น 5 คือคอมไพเลอร์ได้รับการเขียนใหม่ให้เร็วขึ้นและละเอียดขึ้น ในอดีตแอปพลิเคชัน Angular ใช้สิ่งที่เราเรียกว่าการคอมไพล์ Just-in-Time (JIT) โดยที่แอปพลิเคชันถูกคอมไพล์ที่รันไทม์ในเบราว์เซอร์ก่อนที่จะรัน คอมไพเลอร์อัปเดตใน Angular 5 ทำให้การย้ายไปยัง AOT ซึ่งทำให้แอปทำงานได้เร็วขึ้นเนื่องจากมีการรวบรวมน้อยลงเมื่อเรียกใช้แอป AOT จะเปิดใช้งานโดยค่าเริ่มต้นในรุ่นการผลิตใด ๆ ตั้งแต่ Angular CLI เวอร์ชัน 1.5

สมมติว่าเราต้องการสร้างแอปพลิเคชันสำหรับการปรับใช้และรันคำสั่งต่อไปนี้:

ng build --prod

มีบางสิ่งเกิดขึ้น: เวอร์ชันที่ใช้งานจริงการลดขนาดสินทรัพย์บันเดิลการแฮชชื่อไฟล์การเขย่าต้นไม้ AOT ... (เราสามารถเปิด / ปิดใช้งานได้โดยใช้แฟล็กเช่น aot = false) กล่าวโดยย่อธง prod จะสร้างบันเดิลที่ได้รับการปรับให้เหมาะสมของแอปพลิเคชันโดยทำการคอมไพล์ AOT โดยใช้ngc (คอมไพเลอร์เชิงมุม) เพื่อสร้างโค้ดที่ปรับให้เหมาะสมพร้อมสำหรับเบราว์เซอร์ ( ใช่มันรวบรวมเทมเพลตล่วงหน้า )

TypeScript คอมไพเลอร์

คอมไพเลอร์ TypeScript, tscมีหน้าที่ในการคอมไพล์ไฟล์ TypeScript เป็นคอมไพเลอร์ที่รับผิดชอบในการใช้งานคุณลักษณะ TypeScript เช่นประเภทคงที่และผลลัพธ์คือ JavaScript บริสุทธิ์ซึ่งคีย์เวิร์ดและนิพจน์ TypeScript ถูกลบออก

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

  • ลบคำอธิบายประกอบประเภททั้งหมด
  • รวบรวมคุณลักษณะใหม่ของ JavaScript สำหรับ JavaScript เวอร์ชันเก่า
  • คอมไพล์คุณลักษณะ TypeScript ที่ไม่ใช่ JavaScript มาตรฐาน

เมื่อเรียกใช้คอมไพลเลอร์จะค้นหาคอนฟิกูเรชันที่โหลดใน tsconfig.json (รายการโดยละเอียดของตัวเลือกคอมไพเลอร์ทั้งหมดพร้อมกับค่าดีฟอลต์สามารถพบได้ที่นี่ )

โดยส่วนใหญ่คอมไพเลอร์ TypeScript จะทำงานเหมือนกับคอมไพเลอร์ใด ๆ แต่มีข้อแตกต่างอย่างหนึ่งที่สามารถจับได้โดยไม่ระมัดระวัง: โดยค่าเริ่มต้นคอมไพลเลอร์ยังคงปล่อยโค้ด JavaScript แม้ว่าจะพบข้อผิดพลาดก็ตาม โชคดีที่สามารถปิดใช้งานพฤติกรรมนี้ได้โดยตั้งค่าการnoEmitOnErrorกำหนดค่าเป็น true ในไฟล์ tsconfig.json

หมายเหตุ : tscและngcมีวัตถุประสงค์ที่แตกต่างกันและไม่เกี่ยวกับการเลือกอย่างใดอย่างหนึ่ง คำตอบนี้อาจจะเป็นที่สนใจ

คำตอบนี้สร้างขึ้นโดยอิงจากเนื้อหาจากหนังสือต่อไปนี้

  • Cloe, M. (2018). "โครงการ Angular 5: เรียนรู้การสร้างเว็บแอปพลิเคชันหน้าเดียวโดยใช้โครงการมากกว่า 70 โครงการ"

  • Dewey, B. , Grossnicklaus, K. , Japikse, P. (2017). "การสร้างเว็บแอปพลิเคชันด้วย Visual Studio 2017: การใช้. NET Core และ Modern JavaScript Frameworks"

  • ฟรีแมน, A. (2019). "Essential TypeScript: ตั้งแต่เริ่มต้นจนถึงระดับมืออาชีพ"

  • Ghiya, P. (2018). "TypeScript Microservices"

  • Iskandar, A. , Chivukulu, S. (2019). "การพัฒนาเว็บด้วย Angular และ Bootstrap - Third Edition"

  • Hennessy, K. , Arora, C. (2018). "เชิงมุม 6 ตามตัวอย่าง"

  • Jansen, R. , Wolf, I. , Vane, V. (2016). "TypeScript: การพัฒนา JavaScript สมัยใหม่"

  • โมฮัมเหม็ด, Z. (2019). "โครงการเชิงมุม".

  • เซชาดรี, S. (2018). "เชิงมุม: ขึ้นและทำงาน"

  • วิลเคน, J. (2018). "เชิงมุมในการดำเนินการ".

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