PDA

View Full Version : Native Code



hamid1361k
دوشنبه 09 آذر 1388, 19:39 عصر
سلام. اگه ممکنه راجع به اینکه Native Code چی هست یه کم توضیح بدید. در مقابل Native Code چه نوع دیگه ای وجود داره و تفاوتشون چیه ؟ چون سوالها همه به هم مربوط بود توی یه تاپیک پرسیدم. ممنون

hamid1361k
سه شنبه 10 آذر 1388, 20:40 عصر
آقا کسی نظری نداره؟ باور کنید کلی جستجو کردم. همه سایتها اومدن از مزایا و معایبش گفتن ولی من اصلاً نمی دونم چی هست !!!

dark-man
سه شنبه 10 آذر 1388, 20:58 عصر
آقا کسی نظری نداره؟ باور کنید کلی جستجو کردم. همه سایتها اومدن از مزایا و معایبش گفتن ولی من اصلاً نمی دونم چی هست !!!

تا ائنجائی که من می دونم Native Code و زبانهائی مثل دلفی که Native Code هست به نوعی میگن که با Win32 کار می کنه و نیاز به هیچ گونه Frame Workی نداره و عملا" مستقل هست در بعضی از مواقع یک نرم افزار نوشته شده با Native Codeها روی سیستم عامل های دیگه هم جواب میده در حالت کلی شما وقتی از زبانی مثل #C استفاده می کنید وقتی برنامه رو می خواهید روی سیستم کاربر اجرا کنید حتما" نیاز به net FrameWork. دارید که باید روی اون سیستم نصب بشه چون کلاس ها و اجزا رو از FrameWork می خونه اما در زبانهای Native دیگه نیازی به نصب چیزی ندارید و فقط کافیه خود فایل اجرائی برنامه رو اجرا کنید . تفاوت زبانهای native با زبانهائی که دارای framework هستند اینه . حداقل اطلاعاتی که من دارم اینه که تو زبانهای native یا بومی همه ارجاعات و کلاسها و جزئیات داخل فایل exe ویا احیانا" فایلهای dll ذخیره میشه و موقع اجرا در سیستم هدف نیازی به نصب چیز خاصی نیست مگه در مواقعی که از دیتابیس استفاده کنید که نیاز به نصب درایور دیتابیس مثل SqlServer روی سیستم هدف هست.

این چیزی که من می دونم شاید ناقص باشه اما امیدوارم کمکت کنه .

hamid1361k
سه شنبه 10 آذر 1388, 21:14 عصر
خیلی کمک کرد. واقعاً ممنون. در نقطه مقابل Native code چه اصطلاحی بکار میبرند؟ (آیا P-code درسته ؟)
یه جایی خوندم که سرعت کامپایلرهای Native بیشتره؟ ولی با این توضیحاتی که شما ارائه کردید نمیتونم استدلال کنم. میشه راجع به این مورد هم یه کم توضیح بدید ؟

dark-man
سه شنبه 10 آذر 1388, 21:24 عصر
خیلی کمک کرد. واقعاً ممنون. در نقطه مقابل Native code چه اصطلاحی بکار میبرند؟ (آیا P-code درسته ؟)
یه جایی خوندم که سرعت کامپایلرهای Native بیشتره؟ ولی با این توضیحاتی که شما ارائه کردید نمیتونم استدلال کنم. میشه راجع به این مورد هم یه کم توضیح بدید ؟


تا اونجائی که اطلاع دارم در مقابل native code ها managed codeها هستند که به کدهای مدیریت شده هم معروفند .

بله سرعت کامپایلرهای Native بیشتر هست و تا اوجائی که من اطلاع دارم یکی از دلایلش عدم وابستگی به مجموعه یا بسته خاصی هست و چون از win32 استفاده می کنه سرعت بیشتری نسبت به managed codeها داره . در واقع در native code ها برنامه مستقیما" به زبان ماشین ترجمه میشه اما در managed code ها چند مرحله طی میشه تا برنامه اجرا بشه . clr و jit و بعد زبان ماشین . البته با کمی جستجو تو google و سایت برنامه نویس می تونی اطلاعات خیلی کاملتر و بیشتری نسبت به چیزی که من گفتم پیدا کنی . خوندن بعضی کتابهای برنامه نویسی هم می تونه کمکت کنه . برای آشنائی بیشتر می تونی یه برنامه ساده رو در محیط دلفی و مثلا" #C بنویسی و سعی کنی اون ها رو روی یک سیستم دیگه تست کنی مطمئنا" اینجوری بیشتر به بعضی چیزها پی می بری

vcldeveloper
سه شنبه 10 آذر 1388, 23:12 عصر
Native Code یعنی کدی که مستقیما به کدهای یک ماشین خاص کامپایل میشه؛ مثلا کامپایلر دلفی برای ماشین های x86 کد تولید میکنه. در مقابلیش Managed Code قرار داره که در آن سورس کد به کدهای یک ماشین مجازی کامپایل میشه، نه یک ماشین حقیقی. از آنجایی که کد برای یک ماشین مجازی کامپایل شده، قابل اجرا در یک ماشین حقیقی نیست، و باید کد ماشین مجازی به کد ماشین حقیقی کامپایل بشه. عمده ترین مزیتی که از Managed Code به دست میاد این هست که برنامه نویس یک بار برنامه را مینویسه و به کد ماشین مجازی کامپایل میکنه، و این کد ماشین مجازی را می توان بدون نیاز به تغییر سورس کد اولیه، برای ماشین های مختلف کامپایل کرد. نمونه استفاده از Managed Code را می تونید در دات نت یا جاوا ببینید.

hamid1361k
چهارشنبه 11 آذر 1388, 20:46 عصر
ممنون. هنوز دلیل اینکه چرا سرعتش بیشتره رو نتونستم استنباط کنم. چون manage ها هم درسته که یه واسطه بیشتر دارن ولی برای اجرا بالاخره کد اصلی تولید میشه. منظورم اینه که لینکر میاد و کدهای کتابخانه های استفاده شده (مثلاً توابع فریم ورک دات نت) رو به برنامه پیوند میزنه و اینجوری نیست که در حین اجرا مرتباً به هی بخواد ترجمه بشه. البته ممکنه درست در لحظه اجرا یه مدت زم انی طول بکشه که بخواد تبدیل بشه...

پ.ن: الان فکر کردم یه جورایی میشه گفت که آره، کمتره.... بیخیال، اگه میشه شما هم توضیح بدید

vcldeveloper
چهارشنبه 11 آذر 1388, 22:51 عصر
ممنون. هنوز دلیل اینکه چرا سرعتش بیشتره رو نتونستم استنباط کنم. چون manage ها هم درسته که یه واسطه بیشتر دارن ولی برای اجرا بالاخره کد اصلی تولید میشه. منظورم اینه که لینکر میاد و کدهای کتابخانه های استفاده شده (مثلاً توابع فریم ورک دات نت) رو به برنامه پیوند میزنه و اینجوری نیست که در حین اجرا مرتباً به هی بخواد ترجمه بشه. البته ممکنه درست در لحظه اجرا یه مدت زم انی طول بکشه که بخواد تبدیل بشه...
کامپایلرهای Managed Code فقط کد را به زبان ماشین مجازی کامپایل می کنند. پس برنامه ایی که با این کامپایلرها نوشته میشه هنوز آماده اجرا شدن روی سیستم مقصد نیست. در سیستم مقصد باید ماشین مجازی این کامپایلر نصب باشه. وقتی برنامه توسط کاربر روی سیستم مقصد اجرا میشه، ابتدا ماشین مجازی مربوطه در حافظه بارگزاری میشه، و سپس هر بخشی از کد برنامه که نیاز به اجرا داشته باشه، به ماشین مجازی تحویل داده میشه تا آن را به زبان ماشین مقصد کامپایل کنه. این کار توسط JIT انجام میشه.

پس در این مدل از برنامه ها، ماشین مجازی مرتبا بخش هایی از کد برنامه را به زبان ماشین مقصد کامپایل میکنه. البته بهینه سازی های مختلفی هم برای افزایش سرعت صورت میگیره، مثلا سعی میشه ماشین مجازی در زمان بوت سیستم عامل لود بشه، تا برای اجرای اینگونه برنامه ها نیازی به لود مجدد ماشین مجازی نباشه؛ یا مثلا اگر بخشی از کد توسط JIT کامپایل شد، در دفعات بعدی مراجعه به اون کد، عمل کامپایل مجددا انجام نمیشه، بلکه از همان کد کامپایل شده اول استفاده میشه؛ یا سعی میشه کامپایل به زبان ماشین مقصد با توجه به قابلیت های ماشین مقصد، و چگونگی استفاده از آن کد در برنامه صورت بگیره، مثلا اگر سیستم مقصد SSE2 داره، از آن استفاده بشه، اگر نداره، ازش استفاده نشه، یا اگر ماشین مقصد چند هسته پردازشی داره، از آنها به شکل بهینه تری استفاده بشه، و غیره.

در بسیاری از کاربردهای عادی سعی شده تا کارایی کدهای Managed به کدهای Native نزدیک بشه، ولی همچنان در برخی از زمینه های پردازشی سنگین کند بودنشان مشهود هست. از طرف دیگه، همچنان زمان اولیه اجرای کد در آنها، و حافظه مصرفی آنها بیشتر از کدهای Native هست؛ چون باید در اولین اجرای هر کد، عمل کامپایل انجام بشه، و البته قبل از آن باید کتابخانه های مختلفی برای کار ماشین مجازی و کد در حال کامپایل در حافظه بارگزاری بشند.

esmit61
شنبه 12 دی 1388, 21:08 عصر
وقتی برنامه توسط کاربر روی سیستم مقصد اجرا میشه، ابتدا ماشین مجازی مربوطه در حافظه بارگزاری میشه، و سپس هر بخشی از کد برنامه که نیاز به اجرا داشته باشه، به ماشین مجازی تحویل داده میشه تا آن را به زبان ماشین مقصد کامپایل کنه. این کار توسط JIT انجام میشه.


پس در این مدل از برنامه ها، ماشین مجازی مرتبا بخش هایی از کد برنامه را به زبان ماشین مقصد کامپایل میکنه.

چون باید در اولین اجرای هر کد، عمل کامپایل انجام بشه، و البته قبل از آن باید کتابخانه های مختلفی برای کار ماشین مجازی و کد در حال کامپایل در حافظه بارگزاری بشند.

جناب کشاورز من یه کم گیج شدم. دو تا جمله اولی که شما فرمودید یه جورایی معنای مفسر بودن ازش برداشت میشه. واقعاً اینجوریه ؟
ولی توی جمله سوم فرمودید که در ابتدا عمل کامپایل انجام میشه.
البته من این رو متوجه شدم که زبانهایی که managed کار میکنند در ابتدا عمل کامپایل رو انجام میدن و به یک زبان (که میتونه زبان ماشین مقصد نباشه) ترجمه رو انجام میدن.
حالا سوالم سر اجرای این کد ترجمه شده هست. یعنی به قول شما این کد برای اجرا یکجا به زبان ماشین ترجمه نمیشه و در صورت لزوم و رسیدن خط اجرا به اون دستور، JIT عمل ترجمه رو انجام میده؟ (منظورم اینه که آیا JIT یک مفسر است ؟ ) ببخشید اگه سخت گفتم:افسرده:

vcldeveloper
شنبه 12 دی 1388, 21:33 عصر
جناب کشاورز من یه کم گیج شدم. دو تا جمله اولی که شما فرمودید یه جورایی معنای مفسر بودن ازش برداشت میشه. واقعاً اینجوریه ؟یکجور هایی بله، و یکجورهایی خیر.
JIT خط به خط کامپایل نمیکنه، بلکه بلوک به بلوک کامپایل میکنه، و وقتی کامپایل کرد، در مراجعات بعدی به اون بلوک، بلوک مجددا کامپایل نمیشه، بلکه از کد کامپایل شده در مرحله قبل استفاده میشه. نکته آخر هم این که JIT سعی میکنه با توجه به امکانات سخت افزاری و نرم افزاری سیستم مقصد تا حد امکان کد را بهینه سازی کنه، تا کارایی افزایش پیدا کنه. بطور کلی نرم افزارهای Managed Code از کدهای نوشته شده با زبان های مفسری سریعتر هستند. نسبت به کدهای Native هم متناسب با نوع کد می تونند در شرایطی سرعتی یکسان داشته باشند، یا تا حدودی کندتر باشند.