ฉันคิดว่ามีความแตกต่างที่จะทำ แต่ไม่จำเป็นระหว่าง "รวบรวม" และ "จัดการ" สิ่งเหล่านี้ไม่ตรงข้าม ภาษาที่สามารถรวบรวมและไม่ได้รับการจัดการหรือตีความ (ไม่ได้รวบรวม) และมีการจัดการหรือทั้งสองอย่างหรือแม้กระทั่งทั้งไม่
ภาษา "เรียบเรียง" เป็นเพียงภาษาเดียวที่มีขั้นตอนในการแปลงซอร์สโค้ดที่นักพัฒนาเขียนไปเป็น "bytecode" ซึ่งเป็นสิ่งปกติที่ดำเนินการโดยเครื่อง "machine" อาจเป็นโปรเซสเซอร์จริงหรือ "virtual machine" ที่ดำเนินการเพิ่มเติมในไบต์เพื่อแปลให้เป็นคำสั่งของเครื่อง "native" คำตรงข้ามสำหรับภาษา "รวบรวม" เป็นภาษา "ตีความ" ซึ่งรหัสแหล่งที่มาจะถูกแปลงเป็นคำแนะนำ bytecode ที่รันไทม์ทีละบรรทัดตามที่พวกเขาจะถูกดำเนินการโดยไม่มีขั้นตอนการรวบรวม ไฮบริดระหว่างพวกเขาคือ "jitting" จาก "JIT" (Just In Time) ซึ่งมักจะตีความว่าเป็นขั้นตอนเดียวโดยเครื่องที่ดำเนินการ
ภาษา "ที่ได้รับการจัดการ" เป็นภาษาที่ออกแบบมาเพื่อผลิตโปรแกรมที่ใช้งานในสภาพแวดล้อมรันไทม์เฉพาะซึ่งมักจะมีล่าม bytecode; "เครื่องเสมือน" ที่ใช้รหัสของโปรแกรมและทำการแปลงเครื่องเพิ่มเติมหรือการแปลงสภาพแวดล้อมเฉพาะ สภาพแวดล้อมอาจรวมถึงการจัดการหน่วยความจำเช่นคุณสมบัติ "ตัวรวบรวมขยะ" และ "ความปลอดภัย" อื่น ๆ ที่มีความหมายเพื่อให้โปรแกรมทำงานภายใน "แซนด์บ็อกซ์" ของพื้นที่และเครื่องมืออย่างไรก็ตามคุณลักษณะดังกล่าวไม่ใช่โดเมนเพียงอย่างเดียวของ . ภาษาที่ตีความทั้งหมดอาจถูกพิจารณาว่ามีการจัดการเพราะพวกเขาต้องการล่ามที่จะทำงานภายใต้บรรทัดของรหัส "ผู้ใช้" ที่กำลังดำเนินการ นอกจากนี้ภาษา JVM และ. NET (Java, Scala, C #, VB, F #, IronWhething) ถูกรวบรวมเป็นภาษาระดับกลางหรือ IL ซึ่งมีความคล้ายคลึงอย่างผิวเผินในรูปแบบและฟังก์ชั่นกับภาษาแอสเซมบลีไบนารี แต่ไม่ได้ยึด 100% กับชุดคำสั่ง "ดั้งเดิม" ใด ๆ คำแนะนำเหล่านี้ดำเนินการโดย JVM หรือโดย CLR ของ. NET ซึ่งแปลได้อย่างมีประสิทธิภาพเป็นคำสั่งไบนารีดั้งเดิมที่เฉพาะเจาะจงกับสถาปัตยกรรม CPU และ / หรือ OS ของเครื่อง
ดังนั้นภาษาโดยทั่วไปสามารถอธิบายได้ว่า "รวบรวม" หรือ "ตีความ" และเป็น "ไม่มีการจัดการ" (หรือ "ดั้งเดิม") และ "จัดการ" มีภาษาที่สามารถอธิบายได้ว่าเป็นการรวมกันของสิ่งเหล่านี้ยกเว้น "การตีความดั้งเดิม" ที่เป็นไปได้ (ซึ่งจะเป็นจริงสำหรับ opcodes เลขฐานสิบหกที่เขียนด้วยมือซึ่งสิ่งที่เขียนโดยนักพัฒนาคือสิ่งที่ถูกดำเนินการ) หากคุณพิจารณาเลเยอร์การตีความว่าเป็น "รันไทม์" (ซึ่งเป็นเรื่องง่ายที่จะโต้แย้งและยากที่จะโต้แย้ง) ภาษาที่ตีความทั้งหมดจะ "จัดการ"
หากคุณต้องการได้รับเทคนิคเกือบทุกโปรแกรมที่กำหนดเป้าหมายระบบปฏิบัติการมัลติทาสกิ้งทุกวันนี้จะ "จัดการ"; ระบบปฏิบัติการจะสร้าง "เครื่องเสมือน" สำหรับแต่ละโปรแกรมที่กำลังทำงานซึ่งโปรแกรมคิดว่า (หรืออย่างน้อยก็ไม่จำเป็นต้องรู้อย่างอื่น) ว่ามันเป็นสิ่งเดียวที่ทำงานอยู่ รหัสอาจทำการโทรภายในตัวเองและไปยังไลบรารีที่อ้างอิงอื่น ๆ ราวกับว่าโปรแกรมนั้นเป็นสิ่งเดียวที่โหลดในหน่วยความจำ ในทำนองเดียวกันการโทรเพื่อจัดสรร RAM และหน่วยความจำที่สูงกว่าอื่น ๆ เพื่อจัดเก็บและจัดการข้อมูลและอุปกรณ์ควบคุมจะถูกเข้ารหัสราวกับว่าสถาปัตยกรรมหน่วยความจำทั้งหมดพร้อมใช้งาน VM (และระบบปฏิบัติการด้านหลัง) จากนั้นแปลพอยน์เตอร์ของหน่วยความจำต่าง ๆ ไปยังตำแหน่งที่แท้จริงของโปรแกรม, ข้อมูล, และ hooks ไปยังไดรเวอร์อุปกรณ์เป็นต้นซึ่งมักทำโดยใช้ออฟเซ็ตหน่วยความจำ (VM แต่ละตัวรับบล็อก 2GB หรืออะไรก็ตามที่จำ เริ่มต้นที่ address X ซึ่งโปรแกรมสามารถจัดการได้ราวกับว่า X เป็นแอดเดรส 0) และเป็นสิ่งที่ถูกมากที่ต้องทำ แต่มีสิ่งอื่น ๆ ที่เคอร์เนล OS รับผิดชอบเช่นการกำหนดตารางกระบวนการและการสื่อสารระหว่างกระบวนการซึ่งเป็น เคล็ดลับในการจัดการ อย่างไรก็ตามรูปแบบพื้นฐานนี้โดยทั่วไปจะไม่ถือว่าเป็น "จัดการ" เนื่องจากโปรแกรมไม่จำเป็นต้องรู้ว่ามันถูกเรียกใช้โดยเครื่องเสมือนและมักจะยังคงรับผิดชอบการรักษาหน่วยความจำที่จัดสรร "สะอาด" โปรแกรมที่ออกแบบมาให้ทำงานบนบรรทัดคำสั่ง MS-DOS สามารถเรียกใช้บนระบบปฏิบัติการ Windows รุ่นใหม่ที่ไม่มีสภาพแวดล้อม MS-DOS ที่อยู่ภายใต้อีกต่อไป โปรแกรมได้รับสภาพแวดล้อม "virtual console" แทนและหากไม่พยายามออกจาก "sandbox" นี้