PDA

View Full Version : مشکل در برخی مفاهیم برنامه نویسی...



m.m0h@mm@dy
دوشنبه 11 فروردین 1393, 19:44 عصر
سلام
من درمورد یک سری از مفاهیم مشکل داشتم و ممنون میشم از دوستان اگر جواب بدن

1- نصب کردن برنامه یعنی چی؟؟؟برنامه نویس کد برنامه رو کامپایل میکنه و کدهای دودویی تولید شده رو به کاربر میده ، کاربر کدهای دودویی رو روی سیستمش کپی میکنه و از اون استفاده میکنه...درسته؟حالا من میخوام درباره ی اتفاقاتی که می افته زمانی که من کد رو کامپایل میکنم و زمانی که اون رو نصب میکنم به طور دقیق تر بدونم...

2- کامپایلرها کدها را برای چه سکو هایی کاپایل میکنند؟آیا کامپایلر نصب شده روی سیستم من میتونه کدهای من رو برای اجرا روی هر سکویی کامپایل کنه و کدهای دودویی اون رو دراختیار من قرار بده یا فقط قادر به کامپایل کد برای پردازنده ی فعلی من است؟

3- آیا نوشتن برنامه برای اجرا روی cpu های مختلف متفاوته؟یعنی کدی که من نوشتم میتونم اون رو برای چندین cpu کامپایل و استفاده کنم؟اگر نمیشه دلیل این تفاوت چیه؟



ممنون

eshpilen
سه شنبه 12 فروردین 1393, 13:01 عصر
1- نصب کردن برنامه یعنی چی؟؟؟برنامه نویس کد برنامه رو کامپایل میکنه و کدهای دودویی تولید شده رو به کاربر میده ، کاربر کدهای دودویی رو روی سیستمش کپی میکنه و از اون استفاده میکنه...درسته؟حالا من میخوام درباره ی اتفاقاتی که می افته زمانی که من کد رو کامپایل میکنم و زمانی که اون رو نصب میکنم به طور دقیق تر بدونم...


نصب چیز خاصی نیستش.
نصب یعنی یه برنامهء کمکی (که میتونه جزیی از برنامهء خودتون هم باشه) فایل اجرایی برنامه رو و یکسری فایلهای جانبی و بند و بساط دیگش رو در جاهای مشخصی از سیستم کاربر کپی میکنه و مثلا در رجیستری هم یکسری entry هایی رو ممکنه ایجاد کنه (که برای اجرای برنامه میتونن ضروری باشن یا نباشن بسته به استفاده ای که ازشون میشه) و غیره. یا مثلا برنامهء نصب ممکنه چک کنه ببینه یکسری کتابخانه ها و مسائل مرتبط که برنامهء شما برای اجرا به اونا نیاز داره در سیستم کاربر مهیا هستن یا خیر، نوع و نسخهء سیستم عامل سازگاری داره یا نه، و غیره. کلا هرکاری که مستقیما جزو هستهء برنامهء شما نیست ولی برای فراهم کردن و مرتب کردن محیط اجرا و راحتتر کردن استفادهء کاربران از برنامتون و خلاصه اینطور چیزا نیازه.
لزومی نداره که برنامه حتما نصبی باشه و اینطور کار کنه. بعضی برنامه ها اونقدر ساده هستن که فقط کپی کردن دستی فایل اجرایی برنامه و مخلفات همراهش (فایلهای دیتاهای جانبی و کتابخانه های استفاده شده و غیره) برای استفاده ازش کفایت میکنه. یا گاهی هم ممکنه عمدا برنامه رو اینطوری طراحی و پکیج کنن بخاطر راحتی استفاده یا Portable بودن و این حرفا. خیلی از برنامه های نصبی رو هم یه عده میان و اجزای لازم اونا رو پیدا و جمع آوری میکنن میبینن موقع نصب چه تغییراتی توی سیستم صورت میگیره چه چیزهایی نیازه بعد همهء اونا رو با هم پکیج و درصورت نیاز چیزهایی رو توی برنامه و غیره دستکاری و کانفیگ و تنظیم میکنن که اون برنامه بتونه فقط با کپی کردن اجزاش قابل استفاده باشه و دیگه نیازی به فرایند نصب نباشه؛ به این نسخه از اون برنامه میگن Portable و خوبیش اینه دیگه نیازی به نصب نداره و اغلب میتونید مستقیما از روی فلش یا حتی CD (اگر نخواد روی رسانهء خودش فایلی بنویسه) و اینها هم اجرا کنید.




2- کامپایلرها کدها را برای چه سکو هایی کاپایل میکنند؟آیا کامپایلر نصب شده روی سیستم من میتونه کدهای من رو برای اجرا روی هر سکویی کامپایل کنه و کدهای دودویی اون رو دراختیار من قرار بده یا فقط قادر به کامپایل کد برای پردازنده ی فعلی من است؟


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



3- آیا نوشتن برنامه برای اجرا روی cpu های مختلف متفاوته؟یعنی کدی که من نوشتم میتونم اون رو برای چندین cpu کامپایل و استفاده کنم؟اگر نمیشه دلیل این تفاوت چیه؟
نوشتن در زبانهای سطح بالا بطور کلی تفاوت نداره و این وظیفهء کامپایلر یا مفسر هست که برنامهء شما رو روی CPU هایی از خانواده های مختلف ترجمه کنه، ولی این در عمل ایدئال و کامل نیست و خیلی وقتا جزییات و مشکلاتی در این امر پیش میان و نیاز هست که برنامه نویس دانش و بینش و مهارت لازم رو در این زمینه داشته باشه و حتی توی خود برنامه برای این مسئله تمهید بکنه. البته زبانها و فریمورک هایی که ادعای کراس پلتفرم بودن دارن سعی میکنن این مسائل رو به حداقل برسونن (و توی خیلی برنامه های ساده یا کلیشه ای هم ممکنه اصلا پیش نیاد) ولی بازم نمیشه 100% تضمین کرد بخصوص اگر برنامه نویس بقدر کافی مطلع نباشه از بعضی مسائل و در روش برنامه نویسی تمهید و احتیاط لازم رو نکنه. بطور کلی زبانها و فریمورک های کراس پلتفرم کار رو راحت میکنن، و در خیلی برنامه ها ممکنه اصلا نیازی نباشه برنامه نویس چیز زیادی بدونه از جزییات فنی هر پلتفرم و کار خاصی بکنه، اما بازم موارد مشکل و خاص کم وجود ندارن که ممکنه پیش بیان بخصوص در برنامه های بزرگتر و پیچیده تر و غیرکلیشه ای.
بطور مثال تفاوت alignment حافظه در پلتفرمهای مختلف میتونه مشکل ساز بشه هم در برنامه و هم در داده هاش.
همینطور استفاده از API و امکاناتی که وابسته به سیستم عامل یا پلتفرم خاص هستن و توی پلتفرم های دیگر وجود ندارن یا دقیقا به اون شکل وجود ندارن میتونه مشکل اساسی ایجاد کنه. در زبانها/فریمورک های کراس پلتفرم هم طبیعتا شما خیلی وقتا ممکنه نیاز داشته باشید و میتونید از امکانات و کتابخانه ها و API وابسته به یک سیستم عامل و پلتفرم خاص استفاده کنید، ولی وقتی میخواید برنامه رو روی پلتفرم دیگری استفاده کنید باید فکر تطبیق و جایگزین و این حرفا باشید برای اون کدها و امکانات.

m.m0h@mm@dy
سه شنبه 12 فروردین 1393, 16:44 عصر
خیلی ممنون از جوابت واقعا مفید بود

eshpilen
چهارشنبه 13 فروردین 1393, 10:28 صبح
راستی بازم یه مزایای دیگری درمورد «نصب» بنظرم اومد.

نصب برنامه ها طبق قاعده و اصول و دایرکتوری های مشخص و registry entry های مشخصی که برای نصب هر برنامه ایجاد میشه یه کاربردش اینه که مثلا نسخهء جدیدی از یک برنامه که میخواد نصب میشه میتونه براحتی و با اطمینان از وجود یک نسخهء قدیمی تر برنامه مطلع بشه و اطلاع از مکان و جزییات نصب قبلی رو کسب کنه و بر این اساس کار خاصی انجام بده، مثلا از تنظیمات و سفارشی سازیها و فایلهای داده ای برنامهء قبلی استفاده کنه. معمولا هم اینطور برنامه ها در دایرکتوری نصب برنامهء قبلی نصب میشن. بعضی وقتا هم بعضی برنامه ها به برنامه های دیگری وابسته هستن یا ارتباط دارن و لزوما این قضیه فقط برای نسخه های جدید یک برنامه مفید نیست و میتونه مورد استفادهء برنامه ها و نرم افزارهای دیگر حتی از شرکتهای دیگر هم باشه.

و یک مزیت دیگر داشتن یک برنامه یا پکیج نصب (منظورم فایلهای MSI است) اصولی اینه که آنیستال کردن برنامه هم میتونه بصورت خودکار و دقیق و کامل و مطمئن صورت بگیره و نیاز به اطلاعات و کار دستی توسط کاربر نداره. اصلا درمورد خیلی برنامه ها این ممکنه واجب باشه، چون فرایند آنیستال کردن میتونه گسترده و پیچیده باشه؛ فایلهای مختلف برنامه که در جاهای مختلف وجود دارن باید حذف بشن، در دایرکتوری های مختلف و حتی بعضا در دایرکتوری های سیستمی، یکسری entry ها در رجیستری باید حذف یا اصلاح بشن، File association ها و آیکون فایلهای مرتبط به حالت قبل از نصب برنامه برگردان بشن، و غیره.