नहीं, बिलकुल नहीं। इसके बजाय आपके कंपाइलर के लिए असेंबली कोड का उत्सर्जन करना पूरी तरह से संभव है (और अक्सर बेहतर भी)। तब असेंबलर वास्तविक मशीन कोड बनाने का ध्यान रखता है।
वैसे, गैर-वीएम कार्यान्वयन बनाम वीएम कार्यान्वयन का आपका भेद उपयोगी नहीं है।
शुरुआत के लिए, मशीन कोड के लिए वीएम या प्रीकंप्लिमेंटेशन का उपयोग करना एक भाषा को लागू करने के लिए सिर्फ अलग-अलग तरीके हैं; ज्यादातर मामलों में एक भाषा को रणनीति का उपयोग करके लागू किया जा सकता है। मुझे वास्तव में एक बार C ++ इंटरप्रेटर का उपयोग करना पड़ा ।
इसके अलावा, कई वीएम जैसे जेवीएम दोनों में एक बाइनरी मशीन कोड और कुछ असेंबलर होते हैं, बिल्कुल एक साधारण आर्किटेक्चर की तरह।
LLVM (जिसका उपयोग क्लैंग कंपाइलर द्वारा किया जाता है) यहां विशेष उल्लेख के योग्य है: यह एक वीएम को परिभाषित करता है जिसके लिए या तो निर्देश बाइट कोड, टेक्स्ट असेंबली या एक डेटा संरचना के रूप में दर्शाए जा सकते हैं जो कंपाइलर से उत्सर्जन करना बहुत आसान बनाता है। इसलिए यद्यपि यह डीबगिंग के लिए उपयोगी होगा (और यह समझने के लिए कि आप क्या कर रहे हैं), आपको विधानसभा भाषा के बारे में भी पता नहीं होगा, केवल एलएलवीएम एपीआई के बारे में।
LLVM के बारे में अच्छी बात यह है कि इसका VM केवल एक अमूर्त है, और यह कि बाइट कोड की आमतौर पर व्याख्या नहीं की जाती है, लेकिन पारदर्शी रूप से इसके बजाय JITted किया जाता है। तो यह पूरी तरह से एक भाषा लिखने के लिए संभव है जो प्रभावी रूप से संकलित हो, बिना आपके सीपीयू के निर्देश सेट के बारे में कभी भी पता चले।