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) จึงไม่ใช่ภาษาพื้นเมือง