นอกเหนือจากรหัสเครื่องไม่มีภาษาการเขียนโปรแกรมที่มีอยู่ซึ่งดำเนินการโดยตรงกับฮาร์ดแวร์ในแง่ที่ว่าคุณไม่สามารถป้อนข้อความต้นฉบับที่แท้จริง การใช้งานจริงทั้งหมดจะต้องแปลโปรแกรมต้นฉบับเป็นภาษาของ "เครื่อง"
สำหรับการใช้งานบางอย่างมันแปลแบบคงที่ เรามักจะเรียกการใช้งานเหล่านี้ "รวบรวม" สำหรับคนอื่น ๆ มันถูกแปลเป็นบางรูปแบบกลางซึ่งจะถูกแปลแบบไดนามิกเมื่อโปรแกรมทำงาน เรามักจะเรียกการใช้งานเหล่านี้ "ตีความ" มีความเป็นไปได้อย่างต่อเนื่องระหว่างสิ่งเหล่านี้และแม้แต่ซีพียูสมัยใหม่จำนวนมากก็ทำการแปลแบบไดนามิกซึ่งเป็นส่วนหนึ่งของแกนประมวลผล
แม้ว่าโปรแกรมของคุณจะถูกรวบรวมแบบคงที่นานก่อนที่จะดำเนินการเว้นแต่ว่าคุณกำลังเขียนเฟิร์มแวร์มันเป็นเรื่องยากที่โค้ดที่รวบรวมจะทำงานโดยตรงบนโลหะเปลือยโดยไม่มีอะไรรองรับ ระบบปฏิบัติการจัดเตรียมเครื่องเสมือนสำหรับโปรแกรมพื้นที่ผู้ใช้ซึ่งมักจะให้คุณสมบัติเช่นภาพลวงตาที่คุณมีซีพียูทั้งหมดให้กับตัวเอง ภาพลวงตาของพื้นที่หน่วยความจำแบบเรียบซึ่งอาจมีขนาดใหญ่กว่าแรมจริงที่ติดกับเครื่องเรียกว่า "หน่วยความจำเสมือน"
ยิ่งไปกว่านั้นแม้ว่าคุณจะเขียนโปรแกรมใน C ก็มีเครื่องเสมือน C! มันเป็นประเพณีที่เรียกว่า "C runtime" หรือ CRT สั้น ๆ
เนื่องจาก C ถูกแปลส่วนใหญ่เป็นรหัสแอสเซมบลี / เครื่องโดยตรงล่วงหน้า (ในบางแพลตฟอร์มอาจมีโค้ดเธรดบางส่วนและถือได้ว่าเป็นส่วนหนึ่งของเครื่องเสมือน) เครื่องเสมือนจึงมักจะจัดการเริ่มต้นและ ปิดตัวลง.
โดยทั่วไปแล้วการเริ่มต้นจะเกี่ยวข้องกับการตั้งค่าสแต็กและฮีป ระบบปฏิบัติการจะให้สิ่งเหล่านี้แก่คุณน้อยมากและเป็นหน้าที่ของภาษาการเขียนโปรแกรมเพื่อให้สิ่งเหล่านี้แก่โปรแกรมเมอร์ ในบางแพลตฟอร์มอาจมีการเริ่มต้นบางอย่างของการจัดการสัญญาณตั้งค่าเธรด "main" ในสภาพแวดล้อมแบบมัลติเธรดการเรียกใช้ตัวสร้างทั่วโลกในโอกาสที่โปรแกรมถูกเชื่อมโยงกับรหัส C ++, การจัดการไลบรารี่ที่เชื่อมโยงแบบไดนามิกหรือ อาจต้องดำเนินการบางอย่างเพื่อตั้งค่า argc / argv และ envp ในที่สุด CRT ถ่ายโอนการควบคุมไปยังหลัก
สำหรับการปิดระบบหลายระบบสามารถฆ่ากระบวนการที่ไม่สะอาดได้ดังนั้นการปิดระบบไม่จำเป็นต้องทำมากนัก สิ่งสำคัญคือการประมวลผล atexit () เรียกกรณีที่โปรแกรมออกอย่างหมดจด