درس 9 از 33
در حال پیشرفت

گفتگوی JVM و compiler، کی مهم‌تره؟!

بحث امشب:

کامپایلر و JVM سر این سوال مناظره می‌کنن:

کی مهم‌تره؟

JVM: چی؟ شوخی می‌کنی؟ سلام! من جاوا هستم. منم که برنامه رو واقعاً اجرا می‌کنم.
کامپایلر فقط یه فایل بهت می‌ده، همین! فقط یه فایل ساده. می‌تونی چاپش کنی و ازش برای کاغذ دیواری، باد زدن، یا حتی قفس پرنده استفاده کنی.
ولی اون فایل هیییچ کاری نمی‌کنه، مگر اینکه من باشم و اجراش کنم! 😎

کامپایلر: من از این لحنت خوشم نمیاد! 😒

و یه چیز دیگه، کامپایلر هیچ حس شوخی‌ای نداره. البته هرکسی اگه مجبور بود تمام روز رو صرف چک کردن ایرادات ریز و بی‌اهمیت سینتکس کنه… 😅

ببخشیدا، ولی بدون من، دقیقاً چی رو می‌خوای اجرا کنی؟ یه دلیلی داره که جاوا طوری طراحی شده که از کامپایلر بایت‌کد استفاده کنه، محض اطلاع شما. اگر جاوا یه زبان صرفاً تفسیر شده بود که —توی زمان اجرا— ماشین مجازی مجبور بود کدهای مستقیم از ویرایشگر متن رو ترجمه کنه و در نتیجه برنامه‌های جاوا با یه سرعت خیلی خنده‌دار و کند اجرا می‌شدن. 😅

من نمی‌گم که کاملاً بی‌فایده‌ای. ولی واقعاً، تو چه کارایی می‌کنی؟ جدی می‌پرسم. من که هیچ ایده‌ای ندارم! یه برنامه‌نویس می‌تونه بایت‌کد رو دستی بنویسه، و من هم اون رو اجرا می‌کنم. شاید خیلی زود کارت رو از دست بدی، رفیق. 😏

ببخشید، ولی این دیدگاه خودخواهانه است. درسته که —از نظر تئوری— می‌تونید هر بایت‌کدی رو اجرا کنید حتی اگه از کامپایلر جاوا نیومده باشه، ولی یه برنامه‌نویس خیلی باید بیکار باشه که بایت‌کد رو دستی بنویسه و تا جایی که من میدونم برنامه نویس ها ترجیح می‌دن وقتشون رو برای چیزای دیگه بذارن. و خواهش می‌کنم منو «رفیق» صدا نکن قربونت. 😏

ولی هنوز به سوال من جواب ندی، واقعاً چه کار می‌کنی؟

یادت باشه که جاوا یه زبان تایپ قویه، یعنی من نمی‌تونم اجازه بدم متغیرها داده‌های اشتباه رو نگه دارن. این یه ویژگی ایمنی خیلی مهمه و من می‌تونم بیشتر تخلفات رو قبل از اینکه اصلاً به تو برسن متوقف کنم. 😊

ولی بعضی‌ها هنوز رد می‌شن! می‌تونم ClassCastException بندازم و بعضی وقت‌ها می‌بینم که مردم می‌خوان یه نوع اشتباه رو توی آرایه‌ای بذارن که برای نوع دیگه‌ای تعریف شده. 😊

ببخشید، ولی من هنوز حرفم تموم نشده. و بله، بعضی وقت‌ها ممکنه خطای نوع داده (datatype exception) توی زمان اجرا پیش بیاد، ولی بعضی از اینا باید اجازه داده بشن تا بتونم یکی از ویژگی‌های مهم جاوا رو پشتیبانی کنم—اتصال پویا (dynamic binding).

توی زمان اجرا، یه برنامه جاوا می‌تونه شامل شیءهایی بشه که حتی برنامه‌نویس اصلی هم ازشون خبر نداشته. برای همین، باید یه مقدار انعطاف‌پذیری رو قبول کنم. ولی کار من اینه که جلوی هر چیزی که هیچ وقت—هیچ وقت—توی زمان اجرا موفق نمی‌شه رو بگیرم.

مثلاً اگر یه برنامه‌نویس به اشتباه بخواد از یه شیء Button به عنوان اتصال Socket استفاده کنه، من سریع می‌فهمم که این کار جواب نمی‌ده و از بروز مشکل جلوگیری می‌کنم و محافظتش می‌کنم. 😊

باشه، قبول. ولی امنیت چی؟
به همه اون کارای امنیتی که من انجام می‌دم نگاه کن! تو فکر می‌کنی داری چی کار می‌کنی؟ مثلاً فقط چک می‌کنی که نقطه‌ویرگول‌ها (;) سر جاشون باشن؟ اووو، چه خطر امنیتی بزرگی! مرسی که هستی، واقعاً! 😏

ببخشید، ولی من خط دفاع اولم، همونطور که می‌گن.
اون خطاهای نوع داده (datatype violations) که قبلاً گفتم، اگه توی برنامه اتفاق بیفتن، می‌تونن حسابی همه چیز رو به هم بریزن.

منم همون کسی هستم که جلوی نقض‌های دسترسی (access violations) رو می‌گیرم. مثلاً وقتی کدی بخواد یه متد خصوصی (private method) رو اجرا کنه، یا یه متدی رو تغییر بده که به دلایل امنیتی نباید دست بخوره.

همچنین نمی‌ذارم کسی به کدی که نباید ببینه دست بزنه، حتی اگه بخواد به داده‌های حیاتی یه کلاس دیگه دسترسی پیدا کنه. اهمیت کار من اونقد زیاده که توضیحش شاید ساعت‌ها یا حتی روزها طول بکشه! 😊

هر چی. منم مجبورم همون کارا رو انجام بدم، فقط برای اینکه مطمئن شم کسی بعد از تو نیومده و یواشکی بایت‌کد رو قبل از اجرا تغییر نداده! 😏

خب، معلومه که همینطوره. ولی همونطور که قبلاً گفتم، اگه من جلوی چیزی حدود 99% از مشکلات احتمالی رو نگیرم، کل برنامه‌ت از کار می‌افته.
به هر حال، به نظر می‌رسه وقتمون تموم شده. باید این بحث رو یه بار دیگه توی گفتگوی بعدی ادامه بدیم! 😊