سفر به اعماق کامپیوتر (سیستم عامل و api)


سلام.

حالتون چطوره؟

عیدتون مبارک.

انچه در ادامه میخونید متن پادکست ما هست کی میتونید از اینجا گوش بدید همچنین میتونید مارو از اینجاها دنبال کنید. اگه توی کانال تلگرام ما هم عضو بشید خیلی خوبه چون از فعالیت های جدید ما با خبر میشید


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

الانم شما دارید به ششمین قسمت سری سفر به اعماق کامپیوتر گوش میدید.

سفر به اعماق کامپیوتر هم یکی از سری پادکست های ماست که توش اصطلاحات فنی رو تعریف میکنیم.

توی این قسمت من علی قهرمانی میخوام در مورد api و سیستم عامل صحبت کنم.

اگه قسمت های قبلی این سری رو گوش نکردید اونارو هم گوش کنید. چون برای فهمیدن کامل این قسمت نیاز دارید یسری مفاهیم پایه تر رو بدونید.


API

خوب بیاید از API شروع کنیم. API مخفف application programming interface هه. که یعنی واسط برنامه نویسی برنامه.

حالا یعنی چی؟

ببینید ما یه رابط کاربری داشتیم که توی قسمت های قبل در موردش صحبت کردیم که رابط بین یه کاربر با برنامه بود.

حالا بعضی موقع ها خود برنامه ها نیاز دارن با هم ارتباط بگیرن یعنی به هم دیتا بفرستن و از هم دیتا بگیرن یا اتفاق افتادن چیزی رو به هم خبر بدن. عامیانه بخوایم بگیم برنامه ها نیاز دارن با هم حرف بزنن.

حالا از نظر فنی بسترهای مختلفی برای حرف زدن دوتا برنامه با هم هست مثلا شبکه و خیلیای دیگه. ولی دقت کنید که ما اصلا با این بستر ها کاری نداریم. و واسط برنامه نویسی یه چیز دیگس.

بیاید با یه مثال قضیه رو روشن کنیم.

ببینید api مثل منوی رستوران میمونه توی منوی رستوران یه لیستی از غذا هارو با توضیحاتش میشه دید. حالا وقتی شما میاید از بین این غذا ها سفارش میدید اون رستوران اون غذا رو برای شما آماده میکنه. یه جورایی میشه گفت اون رستوران یسری منابع و عملکرد داره که نتیجه اش میشه اون غذا ها. حالا ما از طریق منوی رستوران میتونیم از این منابع و عملکرد ها استفاده کنیم.

اوکی؟

حالا من میام یه برنامه می نویسم که یکسری قابلیت رو ارائه میده. حالا میام لیستی از نحوه ی استفاده از قابلیت هارو با توضیحاتش میدم به برنامه نویسای دیگه. حالا اون برنامه نویسا میتونن از طریق api یا واسط برنامه نویسی برنامه ی من یه برنامه ای بنویسن که با برنامه ی من بتونه حرف بزنه.

مثلا شنیدید میگن api تلگرام؟

داستان اینه که شرکت تلگرام یه سرور داره و توش یه برنامه در حال اجراست.

که در مورد اینکه سرور چیه توی سفر به اعماق کامپیوتر شبکه و اینترنت حرف زدیم و در مورد برنامه ای که توی سرور اجرا میشه هم توی سرکی به دنیای برنامه نویسی وب حرف زدیم.

داستان اینه که شرکت تلگرام یه سرور داره که توی سرورش یه برنامه هست که داره گوش میده به درخواست هایی که از طریق شبکه میاد. و این درخواست دونه دونه میبینه و انجام میده. مثلا یه درخواست میگه این پیام رو بده به فلانی یه درخواست دیگه داره میگه عکس پروفایل منو عوض کن و…

این درخواست ها از طریق اینترنت و از موبایل ها و کامپیوترهای کاربرا به دست سرور میرسه.

نکته ی مهم اینه که همه ی این درخواست ها باید توی فرمت مشخصی به دست سرور برسن که سرور اونارو بفهمه.

حالا اینجا تلگرام اومده لیست درخواست هایی که میشه به سرورش زد رو با جزئیات کامل منتشر کرده یعنی مثلا نوشته اگه میخوای پیام بفرستید باید یه درخواست با این فرم حاوی این اطلاعات به سرور من بفرستید که من پیامو بفرستم برای صاحبش.

حالا منه برنامه نویس میتونم بیام یه برنامه بنویسم که از طریق این api ها با سرور تلگرام صحبت کنه. مثلا یه ربات بنویسیم یا یه برنامه اندروید برای تلگرام بنویسم. البته خود برنامه رسمی تلگرام هم از همین api ها استفاده میکنه.

حالا اینجا به این api ها اصطلاحا web api میگن چون از طریق شبکه ی وب قابل دسترسیه. ولی همه ی api ها فقط توی وب نیستن.

بخش زیادی از api هارو میتونید توی سیستم عامل ها پیدا کنید.

مثلا توی همه ی سیستم عامل ها یه برنامه ای هست که زمان رو نگه میداره. هر موقع هر برنامه ی دیگه ای زمان رو بخواد بدونه باید از طریق api ای که برنامه نویس سیستم عامل در اختیارش گذاشته زمان رو از اون برنامه بپرسه و جوابش رو بگیره و استفاده کنه.

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

یا مثلا توی ویندوز یسری برنامه ها دکمه save as دارن. وقتی می زنید برنامه ی فایل منیجر ویندوز تون باز میشه و میتونید یه فولدری رو انتخاب کنید و یه اسم فایل هم مشخص کنید و بعد از زدن دکمه ی save همه ی این اطلاعات به برنامه اولیه داده میشه و برنامه میفهمه باید فایل رو کجا ذخیره کنه.

و این قابلیتی که برنامه ی فایل منیجر در اختیار برنامه های دیگه میزاره و یه راه و فرم مشخصی برای استفاده ازش وجود داره که بهش میگن API

فکر کنم دیگه زیادی دارم مثال میزنم ولی خوب گستردگی موضوع زیاده. هر جا رو نگاه کنید API میبینید. و یه بخش جدانشدنی از برنامه نویسی هست.

بریم یه موزیک گوش بدیم بیایم در مورد سیستم عامل صحبت کنیم


سیستم عامل

حالا بریم سراغ سیستم عامل.

سیستم عامل یا Operating system یا OS یه برنامه اس که وظیفه اش اینه که سخت افزار و منابع کامپیوتر رو مدیریت کنه. در واقع میاد یه بستری رو برای اجرا شدن برنامه ها فراهم میکنه و سخت افزار رو توی یه لایه abstract میبره.

گفتم abstract :)

اشنا نیست؟

توی قسمت قبلی پادکست که زهرا براتون از abstraction توی شئ گرایی حرف زد حالا ما abstraction رو اینجا هم داریم.

داشتم میگفتم.

اینکه سیستم عامل سخت افزار رو توی یه لایه abstract میبره یعنی اینکه برنامه ها مستقیم لازم نیست با سخت افزار کار کنن.

بر فرض مثال من میخوام یه برنامه بنویسم که یه داده ای رو توی شبکه ارسال کنه. حالا اگر سیستم عامل نباشه باید بیام مستقیم برای کارت شبکه برنامه بنویسم. حالا این کارت شبکه ها هم که یکی دوتا نیستن. انواع دارن. کارت شبکه ی intel یجور کار میکنه واسه یه شرکت دیگه یه جور دیگه کار میکنه. حالا بعضی کارت شبکه ها وایرلس ان بعضیا سیم دار ان و در کل نابود میشم اگه بخوام واسه همه اینا جدا جدا کد بنویسم و تازه اگر هم بتونم همچین کاری رو بکنم. بعد از منتشر کردن برنامه یهو یه کارت شبکه جدید معرفی میشه و روی کامپیوتر های جدید دیگه برنامه من کار نمیکنه.

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

اگه قسمت قبل رو گوش کرده باشید شباهت مثال زهرا در مورد گاز و ترمز ماشین با سیستم عامل رو درک میکنید.

حالا این فقط مربوط به شبکه بود حالا بیاید این مفهوم رو تعمیم بدیم به کل سخت افزار.

مثلا دیسک. یه موقع ssd هه یه موقع hdd هه و رابط های مختلفی داره. بعد تازه دیسک اصلا فایل و فولدر نمیفهمه چیه که. یسری بلوک حافظه اس که توش میشه نوشت.

حالا برنامه نویس از کجا میخواد بفهمه که توی کدوم بلوک دیسک باید بنویسه؟

نکنه یجا شرو کنه نوشتن که قبلا یه برنامه دیگه اونجا یه چیزی نوشته بوده. و توی اجرا شدن اون برنامه اختلال ایجاد کنه

حالا سیستم عامل میاد یسری مفهوم ساده تعریف میکنه مثل:

فایل و فولدر و لینک و…

بعد برنامه ای که روی سیستم عامل اجرا میشه میگه بیا توی این فولدر یه فایل بساز توش این داده هارو بنویس و اصلا برای برنامه مهم نیست که سیستم عامل این فایل هارو توی کدوم بلوک حافظه ی دیسک ذخیره میکنه و این سیستم عامله که میاد مدیریت میکنه که کدوم فایل تو چه فولدری هست و کجای دیسک ذخیره شده و حواسش هم هست که یه جایی که یه فایل هست نیاد یه فایل دیگه روی اون بنویسه.

حالا در مورد RAM هم همینطوره. وقتی یه برنامه اجرا میشه و نیاز به رم داره سیستم عامل میاد این رم رو در اختیار برنامه میزاره. تصور کنید که همزمان برنامه های دیگه هم توی سیستم عامل در حال اجرا هستن و اونا هم رم میخوان این سیستم عامله که میاد مدیریت میکنه این داستان رو.

وظیفه ی بعدی سیستم عامل اصن مدیریت کردن این پردازش هاست.

داخل پرانتز اینم بگم که برنامه وقتی که اجرا میشه بهش میگن پردازش.

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

خلاصه که برنامه ای که روی سیستم عامل اجرا میشه اگه با هر تیکه سخت افزار بخواد ارتباط برقرار کنه از سیستم عامل کمک میگیره.

هر تیکه از سخت افزار که فکرش رو بکنید.

میکروفون و بلندگو و کیبورد و موس و صفحه نمایش و پرینتر و وبکم و خلاصه همه ی سخت افزار هارو اینجوری توی لایه abstract میبره و کار کردن باهاشون رو ساده میکنه و از تداخل برنامه ها جلوگیری میکنه.

جا داره بگم سیستم عامل ها همه ی سخت افزار هارو ساپورت نمیکنن و بعضی موقع ها نیاز هست که ما بیایم درایور نصب کنیم.

درایور هم یه برنامه اس که سازنده ی سخت افزار اونو مینویسه و قابل نصب روی سیستم عامله و عملکرد سیستم عامل رو توی کار با سخت افزار ها کامل میکنه.

مثلا یه پرینتر جدید میخرید و سیستم عامل شما کار کردن با اون رو بلد نیست. اصطلاحا میگن پرینتر رو نمیشناسه. حالا شما می‌آید درایورش رو نصب میکنید بعد دیگه میشناسه.

و حالا سیستم عامل برای همه ی این فرایند هایی که گفتیم میاد api ارائه میده به برنامه ها که از طریق این api ها چیزی که میخوان رو درخواست کنن.

حالا بریم به چند تا سوالی که ممکنه پیش بیاد جواب بدیم.

۱. سوال اول اینه که این api هارو از کجا پیدا کنیم؟

جواب اینه که توی اینترنت.

مثلا اگه بزنید android api میبینید که گوگل یه داکیومنت عظیم در مورد api های اندروید گذاشته توی سایتش. که با جزئیات خیلی زیاد کار کردن با هر بخش سیستم عامل اندروید رو توضیح داده.


۲. سوال بعدی اینه که ایا همه ی کامپیوترها سیستم عامل دارن؟

نههه.

مثلا میکروکنترلر ها ندارن.

اینا کامپیوتر های خیلی کوچولو و ارزون قیمت و ضعیفی هستن که واسه یه کار خاص معمولا تو حوزه ی اینترنت اشیا ازشون استفاده میشه.

کلا یدونه برنامه قراره روش اجرا شه که یه کار ثابتی رو انجام بده و یسری ورودی و خروجی رو کنترل کنه. اینجور موقع ها نمیان سیستم عامل نصب کنن چون همه ی این کارایی که گفتیم پردازش میطلبه و رم اشغال میکنه. میان خود برنامه رو که معمولا با زبون های سطح پایینی مثل c یا c++ یا اسمبلی مینویسن. و مستقیم برای سخت افزار برنامه مینویسن.

دقت کنید که سطح پایین فحش نیست. به زبونی که به زبون ماشین نزدیک باشه و جزئیات سخت افزار توش دخیل باشه میگن سطح پایین تازه این زبون های سطح پایین سرعت اجرا بیشتری هم دارن و حافظه ی کم تری اشغال میکنن که با توجه به اینکه پردازنده ی ما ضعیفه عملکرد بهتری رو ارائه میدن.

داخل پرانتز بگم که بخش زیادی از سیستم عامل ها و درایور ها رو هم با همین زبونای سطح پایین مینویسن.

نکته ی بین مریض سوسکی هم اینجا اینه که بعضی سیستم عامل ها مثل لینوکس و اندروید , نسخه های کوچولو و سبک مخصوص اینترنت اشیا دارن که روی سخت افزار های خیلی ضعیف هم قابل نصب شدن هستن.

۳. سوال بعدی اینه که چرا بعضی برنامه ها فقط مخصوص یه سیستم عامل هستن. مثلا یه برنامه ی ویندوزی مثل فوتوشاپ چرا روی اندروید اجرا نمیشه؟

جواب اینه که api های سیستم عامل ها با هم فرق داره وقتی یه برنامه مثل فوتوشاپ رو مخصوص ویندوز مینویسن میان توش کلی از api های ویندوز رو صدا میکنن. حالا اون api ها روی اندروید وجود ندارن واسه همین نمیتونه اجرا بشه.

حالا یسری برنامه ها هم هستن که platform independent یا مستقل از محیط اجرا هستنند مثلا جاوا ایده اش اینه که شما برنامه ی جاوایی رو مینویسی و یه خروجی jar میگیری ازش و حالا میشه اون خروجی jar رو هم توی ویندوز هم توی لینوکس هم توی همه سیستم عامل های دیگه اجرا کرد.

اما چجوری؟

جاوا یه ماشین مجازی داره که واسه اینکه برنامه جاوایی کار کنه باید روی سیستم عامل نصب باشه. حالا این ماشین مجازی یسری توابع داره که کارایی که با سخت افزار داریم رو انجام میدن.

حالا وقتی برنامه ای که روی ماشین مجازی داره اجرا میشه میخواد با سخت افزار کار کنه و ما میایم اون توابع رو صدا میزنیم و ماشین مجازی جاوا که روی لینوکس نصب شده میاد api های لینوکس رو صدا میزنه و ماشین مجازی که روی ویندوز نصب شده میاد api های ویندوز رو صدا میزنه.

حالا یه زبون تفسیری مثل پایتون چطوری روی همه سیستم عامل ها اجرا میشه؟

پایتون هم مثل جاوا برای اینکه اجرا بشه نیاز داره که مفسر پایتون نصب باشه و این مفسر پایتون هست که میاد برنامه ای که با پایتون نوشته شده رو اجرا میکنه حالا وقتی برنامه درخواست داره که با یه تیکه از سخت افزار ارتباط برقرار کنه این مفسره که میاد با توجه به سیستم عامل api های مربوط رو صدا میزنه.

ولی این platform independent بودن یه مشکلی که داره اینه که شما مستقیم دیگه نمیتونید با همه ی بخش های سیستم عامل ارتباط برقرار کنید که اینجور موقع ها میتونید با زبون های سطح پایین تر مثل c برای زبون های سطح بالاتر لایبری بنویسید و از اون استفاده کنید.

خوب دیگه حرفی نیست. الان دیگه دید کامل تر و بهتری نسبت به api و سیستم عامل و اینا دارید. خداروشکر.


نکته ی خیلی آخر

نکته ی خیلی آخر هم اینه که ما با شعار "شنیدن کی بود مانند دیدن" در کنار پادکست هامون میخوایم از این به بعد ویدیو کست هم منتشر کنیم. اگه از اپلیکیشن های پادکستی مارو دنبال میکنید. مطمئن شید که مارو توی جاهای دیگه هم دنبال کنید که ویدیو هارو از دست ندید. آدرس همه ی شبکه های اجتماعی ما توی وبسایتمون به ادرس internplusplus.ir هست.

قسمت ششم پادکست سفر به اعماق کامپیوتر هم تموم شد.اگه سوالی داشتید میتونید توی گروه تلگرامی ما بپرسید.

مارو به دوستاتون معرفی کنید و با این کار مارو خوشحال کنید.

مرسی که این پادکست رو گوش دادید.

عیدتون هم مبارک.

خدافظ.