JavaRush /وبلاگ جاوا /Random-FA /کد ماشین و کد بایت: برنامه شما به چه زبانی صحبت می کند؟

کد ماشین و کد بایت: برنامه شما به چه زبانی صحبت می کند؟

در گروه منتشر شد
کسانی که تازه شروع به آشنایی با جاوا کرده اند اغلب در مورد مفاهیم کد ماشین و کد بایت سردرگمی دارند . آنها چه هستند؟ چه تفاوت هایی دارند؟ در یادداشتی کوتاه سعی می کنیم تا حد امکان ساده و واضح ویژگی های آنها را بیان کنیم تا یک بار برای همیشه این موضوع بسته شود.
کد ماشین و کد بایت: برنامه شما به چه زبانی صحبت می کند؟  - 1

کد ماشین

این پردازنده در اصل یک ماشین حساب بسیار پیچیده و پیشرفته است. دارای مکان های حافظه زیادی (به نام ثبات) است که روی و بین آنها عملیات ریاضی و بایتی مختلف انجام می شود. کد ماشین دقیقاً توصیفی از توالی عملیات و مجموعه داده های مربوطه است. در واقع، این تنها زبانی است که پردازنده کامپیوتر شما آن را می فهمد.

ناسازگاری مادرزادی

علاوه بر این، همه پردازنده‌ها به یک زبان صحبت نمی‌کنند. نه تنها بین معماری CISC و RISC ، بلکه در داخل این "اردوگاه ها" نیز تفاوت هایی وجود دارد .

CISC (Complex Instruction Set Computing) یک مفهوم طراحی پردازنده است که با مجموعه ای از ویژگی های زیر مشخص می شود:

  • دستورات زیادی با طول متفاوت؛
  • بسیاری از حالت های آدرس دهی؛
  • کدگذاری دستورات پیچیده
RISC (Reduced Instruction Set Computing) - یک پردازنده با مجموعه دستورالعمل کاهش یافته است. دستورات با همان فرمت، کوتاه، با کدنویسی ساده هستند.
نسل‌های جدید پردازنده‌ها مجموعه‌ای از دستورالعمل‌های اضافی را معرفی می‌کنند که به سادگی برای مدل‌های نسل قدیمی ناشناخته هستند. به همین دلیل، برنامه های کامپایل شده برای یک معماری (یا یک نسل از پردازنده ها) نمی توانند روی سخت افزار دیگر اجرا شوند. همه اینها ما را مجبور می کند تا برنامه ها را دوباره کامپایل کنیم تا مطمئن شویم که روی رایانه های دیگر کار می کنند. با این حال، نه تنها به دلیل پردازنده ها، بلکه به دلیل تفاوت در تعامل برنامه ها و سیستم عامل، مجبور به کامپایل مجدد هستید. به همین دلیل است که اجرای یک برنامه "ویندوز" در لینوکس و یک برنامه "لینوکس" در ویندوز غیرممکن است.

بایت کد

بایت کد از بسیاری جهات شبیه به کد ماشین است، فقط از مجموعه ای از دستورالعمل ها نه از یک پردازنده واقعی، بلکه از یک پردازنده مجازی استفاده می کند. علاوه بر این، ممکن است شامل بخش‌هایی باشد که بر استفاده از یک کامپایلر JIT متمرکز شده است، که اجرای دستورات را برای پردازنده واقعی که برنامه روی آن اجرا می‌شود بهینه می‌کند.
کامپایل JIT (تلفیق به موقع، کامپایل در زمان پرواز) یا کامپایل پویا (ترجمه پویا) یک فناوری برای افزایش عملکرد سیستم های نرم افزاری است که از بایت کد با کامپایل بایت کد در کد ماشین یا به فرمت دیگری به طور مستقیم در حالی که برنامه در حال اجراست "رسما" در جاوا تا نسخه 9 فقط یک کامپایلر JIT وجود داشت. در جاوا 9، کامپایلر دیگری ظاهر شده است و زودتر از موعد کامپایل می کند (AoT). این ویژگی به کلاس‌های جاوا اجازه می‌دهد تا قبل از اجرا بر روی یک ماشین مجازی به کد بومی کامپایل شوند. این ویژگی برای بهبود زمان راه‌اندازی برای برنامه‌های کوچک و بزرگ، با تأثیر محدود بر عملکرد اوج در نظر گرفته شده است.
برای پردازنده‌های CISC ، برخی دستورالعمل‌ها را می‌توان در ساختارهای پیچیده‌تری که توسط پردازنده پشتیبانی می‌شود ترکیب کرد، و برعکس، برای RISC ، آنها را می‌توان به دنباله‌های ساده‌تری از دستورالعمل‌ها تقسیم کرد.

همچنین یک سیستم عامل مجازی

با این حال، کد بایت نه تنها حاوی دستورالعمل های پردازنده است. همچنین حاوی منطق برای تعامل با یک سیستم عامل مجازی است که رفتار برنامه را مستقل از سیستم عامل مورد استفاده در رایانه می کند. این به وضوح در JVM قابل مشاهده است ، جایی که کار با تماس های سیستمی و رابط کاربری گرافیکی اغلب مستقل از سیستم عاملی است که برنامه روی آن اجرا می شود. به طور کلی، JVM راه‌اندازی یک فرآیند برنامه را شبیه‌سازی می‌کند، برخلاف راه‌حل‌هایی مانند Virtual Box ، که فقط یک سیستم/سخت‌افزار مجازی ایجاد می‌کنند.

آیا JVM تنها چنین چیزی است؟

قطعا نه. همان DotNet CLI نیز یک ماشین مجازی است که بیشتر در رایانه هایی که دارای ویندوز با پردازنده های سازگار x86 هستند استفاده می شود. با این حال، اجرای آن برای سیستم‌های دیگر نیز وجود دارد: برنامه‌های کاربردی برای آن باید روی Windows RT اجرا شوند که روی پردازنده‌های سازگار با ARM (RISC) اجرا می‌شوند ، یا می‌توانید آنها را روی Linux/OSX در محیط Mono که یک شخص ثالث است اجرا کنید (و بنابراین به طور کامل سازگار نیست) اجرای DotNet برای این سیستم عامل ها. بنابراین این پلتفرم مانند JVM بر روی پردازنده های مختلف و سیستم عامل های مختلف اجرا می شود. راه حل های مشابه بسیار بیشتری وجود دارد (چه قدیمی و چه جدید): LLVM ، Flash SWF و موارد دیگر. برخی از زبان های برنامه نویسی ماشین های مجازی مخصوص به خود را دارند. برای مثال، CPython منابع PY را در فایل‌های PYC کامپایل می‌کند - کد بایتی کامپایل‌شده که برای اجرا در PVM آماده شده است . یا یک مثال بسیار قدیمی تر وجود دارد - Lisp را می توان در فایل های FASL (بارگذاری سریع) کامپایل کرد. در واقع، آنها حاوی یک درخت AST هستند که توسط ژنراتور از کد منبع ساخته شده است. این فایل‌ها را می‌توان توسط مفسر Lisp بر روی پلتفرم‌های مختلف خواند و اجرا کرد ، یا برای تولید کد ماشین برای معماری سخت‌افزاری که در حال حاضر استفاده می‌شود، استفاده کرد.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION