سلام دوستان
از اونجایی که من عاشق کدنویسیم بذارید توضیحات ناصر جان کامل کنم:
زبانهای برنامه نویسی به چند دسته تقسیم بندی کلاسیک میشوند:
1-نسل اول یا زبان ماشین که عملا با 0 و 1 در ارتباطیم
2-نسل دوم که با طراحی زبان اسمبلی شکل گرفت و تاحد زیادی سخت و مشقت برنامه نویسی به زبان ماشین حل کرد و پایه گذار نسلهای بعدی شد. برای نمونه من نمونه کدی که دو عدد که از حافظه گرفته میشود جمع میکند مینویسم:
در دیتا سگمنت
a1 db 3
2 a2 db
در سگمنت کد
mov ah,0
mov al,a1
mov bh,0
mov bl,a2
add ax,bx
3- نسل بعدی نسل زبانهای سطح میانی یا ساخت یافته(procedural) که از لحاظ نزدیکی به ماشین در لایه بالاتری از اسمبلی قرار میگیرند و میشود برنامه های باسرعتی بالایی نوشت. زبانهای C و Pascal نمونه ای از این نسل هستند. در این نسل شما بصورت مستقیم میتوانید دستورات اسمبلی قرار دهید. این نسل بسیار به زبان انسان نزدیک شدند و دستورات به زبان انگلیسی هستند.
نمونه برنامه بالا در زبان c
int a1=3;
int a2=2
int a3=a1+a2;
4- نسل بعدی زبانهای سطح بالا
در این نسل زبانهایی مثل Visual c,Visual basic, Delphiو ... قرار دارند که از لحاظ نزدیکی به ماشین از نسل قبلی خود دورترند ولی انعطاف و سهولت بیشتری دارند. پایه زبانهای شی گرا در این نسل و اوایل دهه 70 میلادی شکل گرفت بیارنه استراستروپ در آزمایشگاه کمپانی At&t نسل جدیدی از زبان c که قابلیت های شیگرایی کلاسیک را داشت ایجاد شد و در سالهای میانی دهه 90 با ظهور جاوا به کمال رسید هرچند به دبد خیلی از صاحبنظران زبانهای شیگرا نسل پنجم زبانهای برنامه نویسی هستند ولی عده ای هم معتقدند که این زبانها شامل دسته چهارم میشوند
5-نسل زبانهای مستقیم انسانی
سالهاست توسعه دهندگان در حال توسعه این نسل هستند تا برنامه نویسی توسط زبان مستقیم انسان صورت گیرد بصورتیکه شما با ماشین تعامل مستقیم داشته باشید. کمپانیهای عظیمی چون اوراکل، مایکروسافت و آی بی ام، میلیاردها دلار خرج میکنند تا فقط پیش نیاز های این نسل مثل بینایی ماشین، صدای ماشین و هوشمندی ماشین ایجاد شود که پیشرفتهای خوبی هم داشته اند و هنوز در حال کار هستند.
حالا به بررسی دو شیوه متفاوت اجرای برنامه میپردازیم:
1-کامپایل
2-تفسیر
حتما شما آشنایی با این 2 مورد دارید اما من باز هم توضیح تکمیلی ارائه میکنم:
1- کامپایل:
به شیوه ای از اجرا دستورات که بعد از اتمام کدنویسی، کدها برای تحلیل و بررسی به کامپایلر ارسال میشود و در صورت نبود خطا دستورات به اسمبلی های ماشین تبدیل میشوند اطلاق میشود. اما کامپایلر چه مواردی را بررسی میکند و مراحل کامپایل به چه صورت است:
1- تحلیل واژه ای (Lexical Analysis)
2-تحلیل نحوی (Syntax Analysis)
3- تحلیل معنایی (Semantic Analysis)
4- تولید کد میانی (Intermediate Code Generation)
5- بهینه سازی کد (Cod Optimization)
6- تولید کد نهایی (Code Generation)
در این شیوه چون قبل از اجرا بسیاری از خطا ها گرفته میشود و کدها بهینه میشوند سرعت اجرا بسیار بالاست و احتمال خطا کمتر است
اما دسته دوم یا مفسری ها دارای تفاوت با کامپایلریها هستند:
مفسر چیست ؟
به جای آنکه برنامه هدف به صورات ترجمه شده تولید بشود , عملیاتی که در برنامه مبداء وجود دارد یکی پس از دیگری اجرا میکند.( خروجی تولید نمی کند )
تفاوت بین کامپایلر و مفسر در چیست؟
1 ) مفسر , خط به خط برنامه ورودی را ترجمه و تفسیر میکند این در حالیت که کامپایلر تمام خطوط برنامه ورودی را به یکباره ترجمه میکند.
2 ) در هر خطی از برنامه که کاربر دارای خطا یا اشتباه باشد مفسر در همان لحظه خطا را آشکار میکند و در خواست رفع اشکال می نماید از برنامه نویس ( زبان هایی مانند بیسیک و لیسپ از این نوع هستند ).اما کامپایلر در پایان کار برنامه نویس اقدام به بررسی تمام خطوط برنامه نموده و خطاها را اعلام میکند.
نکته : از (2) نتیجه می گیریم که سرعت ترجمه در مفسر بیشتر از کامپایلر است و خطایابی و تصحیح خطا توسط کاربر با راحتی بیشتری انجام میگیرد.
3 ) پیاده سازی مفسر از کامپایلر ساده تر است.
4 ) این قضیه صحت دارد که سرعت ترجمه مفسر از کامپایلر بیشتر است , اما سرعت اجرای برنامه ای که کامپایل شده بسیار بیشتر از برنامه ای است که تفسیر شده.
5 ) برنامه روی یک کامپیوتر میزبان یک بار کامپایل می شود و در دفعات بعدی فقط اجرا خواهد شد در صورتی که در مفسر,در هر باری که برنامه از ابتدا تا انتها تفسیر و سپس ترجمه میشود.
6 ) مفسر یک محیط مجازی برای اجرای برنامه کاربر ایجاد می کند در واقع محیط اجرایی برنامه به همراه برنامه کاربر وجود داشته و امکان اجرای برنامه در هر کامپیوتر میزبان دیگری داده خواهد شد.اما در کامپایلر وضع به گونه ای دیگر است زیرا کد مقصد تولید شده به زبان ماشین,مربوط به همان ماشین ( کامپیوتر ) میزبانی است که کامپایلر بر روی آن نصب شده و در کامپیوتر دیگر باید برنامه مجددا کامپایل شود.
7 ) در دسترسی به اصل برنامه مبداء,کامپایلر دارای امنیت بیشتری نسبت به مفسر است.
یکی از چالشهای مفسرها مسئله حلقه هاست!!!:
یکی از نقاط ضعف مفسرها نسبت به کامپایلرها همین حلقه هاست.
کامپایلر یک حلقه 10 تایی رو 1 بار ترجمه و 10 بار اجرا میکنه ولی مفسر همین حلقه رو 10 بار ترجمه و 10 بار هم اجرا میکنه. پس هنگام برنامه نویسی با زبانهای مفسری باید حواستون باشه کمتر از حلقه استفاده کنید.
این از توضیحات قسمت اول؛ اما هدف من از این توضیحات در ادامه ببینید:
----------------------------------------------------------------------------------------------------------------------------------------------------
هرچقدر زبانهای برنامه نویسی به قول امروزی ها ساده تر باشند یقین داشته باشید که از ماشین دورترند و بسیار کندتر!!! این یک اصل است؛ اما پس چه دلیل وجود داره که زبانی مثل پایتون یا زبانهای اسکریپت نویسی و یا حتی زبان عظیم و گرانقدری چون جاوا از مفسر استفاده میکنند؟
دلیل مشخص است؛ سخت افزارها بسیار قویتر شده اند و زمان اجرا کاهش پیدا کرده، اما دقت کنید در نوشتن برنامه هایی که کارهای سنگین پردازشی دارید به هیچ عنوان سمت زبانهای مفسری نروید و فقط و فقط از زبانهای کامپایلری سطح میانی چون c استفاده کنید!!
اگر قصد توشتن پلاگینهای ساده مثل مدیریت فایل یا تنظیم کردن مشخصات یا انیمیت های محدود از زبانهای مفسری استفاده کنید وگرنه باید یزوید سمت SDK نرم افزارتون و اونو با استفاده از زبانهای خانواده C مثل Visual c++ و دقت کنید نوع Win32 در ویندوز توسعه دهید.
اینکار نیازمند دانش کدنویسی بالایی مثل آشنایی کامل با منظق شی گرایی، داشتن دید توسعه دهنده و همچنین آشنایی با Api های Sdk مورد نظر داشته باشید.
البته راه دیگه استفاده از wrapperهای Sdk هست که برای محیط .net توسعه داده شده اند اما محدودترند هم هست.
انشالله اگر عمری باشید در آینده ای نزدیک دوره آموزشی توسعه ابزارها در مکس با استفاده از sdk نرم افزار مکس هم در win32 و هم در .net ایجاد میکنم.
من الله توفیق