در ابتدا باید بگویم زبان های برنامه نویسی به دو دسته کلی سطح پایین و سطح بالا تقسیم می شوند. زبانهای برنامه نویسی سطح پایین به صورت مستقیم با پردازنده ی سیستم سر و کار دارند و با استفاده از آنها میتوان دستورات پایهای برنامه نویسی را اجرا کرد. فهمیدن دستورات نوشته شده در این زبانها کار دشورای است. به طور مثال، یک از این زبانهای سطح پایین، Machine Language یا زبان ماشین نام دارد که به جای آن که از دستورات انگلیسی در آن استفاده شده باشد، از اعداد صفر و یک برای نوشتن دستورات در آن استفاده شده است. زبان اسمبلی هم یک نمونه ی دیگر از زبانهای سطح پایین است.
برای اینکه به صورت دقیق متوجه کار زبان ماشین شویم باید ابتدا بفهمیم که پردازنده چطور کار میکند چون زبان ماشین با پردازنده درگیر است. اساسا پردازنده از میلیون های سوییچ کوچک که میتوانند خاموش و روشن شوند تشکیل شده اند. حال با خاموش یا روشن کردن برخی از این سوییچ های خاص، میتوان از پردازنده خواست تا کار خاصی را انجام دهد.
به جای روشن یا خاموش کردن این سوییچ ها به صورت دستی، زبان ماشین یا همان صفر و یک این امکان را به شما میدهد تا با ۰ و ۱ که ۰ به معنی خاموش و ۱ به معنی روشن است، این سوییچ ها را خاموش و روشن کنید.
حال نوشتن برنامه های کامپیوتری به زبان صفر و یک یا همان زبان ماشین بسیار سخت و طاقت فرسا است و احتمال خطا و اشتباه در نوشتن آن بسیار زیاد است به همین خاطر دانشمندان کامپیوتر زبانی رو ابداع کردن به نام زبان اسمبلی، که برنامه نویسی از حالت صفر و یک رو کمی به زبان محاوره ای نزدیک تر میکرد. و برنامه نویسی یا همون صحبت کردن با پردازنده (سی پی یو) راحت تر میکرد.
برای آن که درک کنیم که ساز و کار زبان اسمبلی به چه شکل است، ابتدا می بایست بفهمیم که پردازنده ها چگونه دادهها را پردازش می کنند. توجه داشته باشیم که پردازنده ی سیستمهای کامپیوتری همانند “مغز” آن کامپیوتر است. همانطور که مغز انسانها زمانی که در ارتباط با سایر اعضای بدن و جهان واقع باشد میتواند کارایی داشته باشد، پردازنده ی کامپیوتری هم صرفاً زمانی کار خواهد کرد که با سایر بخشهای سیستم در ارتباط بوده و بتواند با دنیای بیرون (یا همان برنامه نویس) در ارتباط باشد. راههای ارتباطی که یک پردازنده از آن طریق با بخشهای دیگر سیستم در ارتباط است اصطلاحاً باس گفته می شود.
فرض کنیم که یک پردازنده میخواهد با دیتای خاصی کار کند. در این صورت، پردازنده دادهها را از بخش دیگر سیستم مثلاً هارد دیسک گرفته و به صورت موقت آنها را در مکانی که اصطلاحاً رجیستر گفته میشود ذخیره می سازد. سپس پردازنده تغییرات را روی دادهها اعمال کرده و دادههای تغییر یافته را به بخش دیگری از سیستم مثل حافظه ارسال می کند. به عبارت دیگر، همانطور که در اولین کامپیوترهای ساخته شده برای اجرای یک دستور جای کابل ها و سوییچ ها عوض می شد، در کامپیوترهای امروزی جای صفرها و یک ها تغییر مییابد که این تغییر جایگاه صفر و یک ها با استفاده از زبان ماشین انجام می پذیرد.
بزرگترین مشکل زبان اسمبلی این است که برای نوشتن یکسری دستورات با استفاده از این زبان، می بایست با رجیسترهای پردازنده که پیش از این با آنها آشنا شدیم کار کنیم. به عبارت دیگر، به منظور جمع کردن دو عدد با یکدیگر، برنامه نویس می بایست به پردازنده دستور دهد تا یک عدد را در یک رجیستر ذخیره سازد، سپس عدد دوم را به عددی که در رجیستر ذخیره شده اضافه کند و در نهایت نتیجه را از رجیستر بازخوانی کند.
نوشتن یک برنامه به زبان ماشین (حتی اگر آن برنامه خیلی هم ساده باشد) کار نسبتاً دشواری است. بسیاری از برنامه نویسان از زبان اسمبلی در جاهایی که نیاز به سرعت و اثربخشی بالا دارند استفاده میکنند اما توجه داشته باشیم که برنامههای نوشته شده با استفاده از زبان اسمبلی به مراتب کندتر از برنامههای نوشته شده با زبان ماشین هستند چرا که برای اجرا، برنامههای نوشته شده با زبان اسمبلی ابتدا می بایست به زبان ماشین تفسیر شوند که معمولاً این کار توسط برنامههایی تحت عنوان Assembler انجام می شود که این اسمبلر کارش این است که یک برنامهای که با استفاده از زبان اسمبلی نوشته شده باشد را گرفته و آن را تبدیل به زبان ماشین یا همان صفر و یک کند.
توجه داشته باشیم که هر پردازنده ای صرفاً زبان اسمبلی خاص خود را می فهمد. بنابراین یک پردازنده ی Intel Core 2 زبان اسمبلی پردازنده PowerPC را نمیفهمند و بالعکس. به هر حال برخی پردازنده ها هم هستند که با سایر پردازنده ها تعامل خوبی دارند مثل پردازنده های AMD که مثلاً با پردازنده های اینتل سازگار می باشند.
این سر و کله زدن با رجیسترهای پردازنده، منجر به سردرگمی بیش از پیش برنامه نویسان و کسانی که علاقمند به برنامه نویسی بودند شد لذا دانشمندان علوم کامیپوتری به فکر طراحی زبانهای برنامه نویسی سطح بالا افتادند که در ادامه بیشتر در مورد زبان های سطح بالا صحبت خواهیم کرد.
در مورد زبان های سطح پایین یا Low level صحبت کردیم و در مقابل این زبان ها، زبان های سطح بالا هستند که از دستوراتی استفاده میکنند که بیشتر به زبان محاوره ای نزدیک است (کلمات انگلیسی که برای انسانها قابل فهم تر هستند). زمانی که برنامه نویسی دستورات مد نظر اش را در یکی از این زبانهای سطح بالا (همچون زبانهای سی شارپ، جاوا اسکرپیت، پی اچ پی، پایتون، و غیره) می نویسد، یک نرمافزار واسطه ای میآید که آن کدها را به زبان ماشین (یا همان صفر و یک) ترجمه کرده و در اختیار سیستم قرار میدهد چرا که سیستمها فقط و فقط معنی زبان ماشین یا همان صفر و یک را متوجه می شوند.
هدف از طراحی زبان اسمبلی رو گفتیم حال به این رسیده ایم که در مورد هدف طراحی زبان های برنامه نویسی سطح بالا یا High-level صحبت کنیم، هدف از طراحی این زبان ها این بوده است تا فرآیند برنامه نویسی راحتتر گردد. زبانهای برنامه نویسی سطح بالا این امکان را در اختیار برنامه نویس قرار میدهند تا به سیستم هر دستوری که میخواهند بدهند و اصلا کاری به این که سیستم قرار است به چه شکل آن دستور یا دستورات را عملی سازد نداشته باشند. یه مثال بزنم براتون مثلا تو زبان های سطح پایین برای نوشتن یه جمع ساده باید ۱۵ ۲۰ خط برنامه مینوشتی ولی در زبان های سطح بالا نهایت ۲ الی ۳ خط برنامه لازم است. همین راحتی باعث شده کاربران زبان های سطح بالا به شدت بیشتر شوند و کسی به ندرت به سمت زبان های سطح پایین برود. البته در دانشگاه ها فعلا دارند زبان های سطح پایین رو درس میدهند مثل زبان اسمبلی که بیشتر برای آشنایی دانشجویان با بخش سطح پایین برنامه نویسی است.
حالا شاید بپرسید زبان های فورتران، بیسیک، کوبول و پاسکال جز کدام دسته هستند، باید بگویم این زبان ها جز زبان های سطح بالا هستند که منجر شدند تا برنامه نویسان وارد جزئیات برنامه نویسی و نحوه ی کار پردازنده نشوند اما این دور بودن از جزئیات کار منجر به این میشد تا در برخی جاها دست برنامه نویسان آن طور که باید و شاید باز نباشد بنابراین برای آن که فصل مشترکی مابین زبانهای سطح بالا و زبان اسمبلی (که یک زبان سطح پایین است) ایجاد شود، زبانی تحت عنوان زبان برنامه نویسی C ابداع شد.
ایده ی پشت زبان برنامه نویسی سی، فراهم آوردن فرصتی برای برنامه نویسان بود تا از آن طریق امکان صحبت کردن با سی پی یو (یا همان مغز کامپیوتر) به صورت مستقیم همچون زبان اسمبلی را داشته باشند اما در عین حال این فضا را هم برای برنامه نویس فراهم آورند تا بتوانند در صورت نیاز، جزئیات فنی نحوه ی کار سی پی یو را هم همچون یک زبان سطح بالا نادیده بگیرند.
زبان برنامه نویسی C این امکان را به برنامه نویسان میدهد تا پردازنده را همچون زبان اسمبلی کنترل کنند اما در عین حال برنامههایی بنویسند که برای انسانها قابل فهم و قابل خواندن و نوشتن باشند. بسیاری از برنامههای کاربردی که امروزه میبینیم مثل سیستم عامل های ویندوز، لینوکس، مکینتاش و … با استفاده از این زبان نوشته شدهاند و زبان C یک زبان مادر در دنیای برنامه نویسی محسوب می شود.
حال زبان برنامه نویسی سی به خاطر کنسول (به صورت داس مانند- ویژوالی نیست) بودنش یه کم سخت است، و دانشجو زود خسته می شود از برنامه نویسی، دانشجو میتواند به جای برنامه نویسی سی، از فرزند سی یعنی زبان برنامه نویسی سی شارپ شروع کند آن هم به چند دلیل:
- یک زبان بسیار قابل حمل که توانایی ساخت برنامههای دسکتاپ، برنامههای وب، بستههای خط فرمان، برنامه های موبایل و بسیاری شکلهای دیگر برنامهها را دارد.
- یک زبان تحت چهار چوب .net نوشته شده و به همین خاطر کاملا قدرتمند و کاملا شی گراست
- یک زبان برنامهنویسی چند منظوره است که برای ساخت طیف گستردهای از برنامهها مورد استفاده قرار میگیرد.(قابلیت نوشتن برنامه های اندروید، ویندوز موبایل و ios)
- یکی زبان برنامه نویسی که در تعداد کثیری از شرکت ها و موسسات چه شخصی و چه دولتی استفاده می شود (شرکت های برنامه نویسی و بخش فناوری)
- یکی زبان که توسط مایکروسافت پشتیبانی می شود و در برنامه نویسی وب خیلی کاربرد دارد. (با استفاده از برنامه نویسی ASP.Net MVC که سایت های بزرگ ایران هم با این زبان نوشته شده اند مثل دیجی کالا، ورزش ۳، بانک ملی و . . . )
- در انتها با رجوع به بخش استخدام روزنامه ها و سایت های استخدام متوجه خواهید شد چه تعداد آگهی استخدام برنامه نویس سی شارپ (چه دسکتاپ چه وب) درج شده است.
نکته مهم: در پاسخ به این سؤال که سریعترین زبان برای صحبت کردن با سی پی یو آیا زبان ماشین، زبان اسمبلی، زبانهای سطح بالا یا زبان سی است، بایستی گفت که مسلماً زبان ماشین (یا همان صفر و یک) سریعترین زبان برنامه نویسی دنیا است چرا که سیستمها فقط و فقط زبان ماشین را میفهمند و به نوعی میشود گفت که زبان ماشین، زبان مادری آنها است!
برای این که پردازنده ها برنامههایی که با استفاده از زبانهای سطح بالا نوشته میشوند را هم بفهمند، دانشمندان برنامه ی واسطی تحت عنوان Compiler طراحی کردهاند تا کدهای زبانهای سطح بالا را به زبان ماشین یا زبان باینری یا همان زبان صفر و یک مبدل سازند تا برای کامپیوتر قابل فهم شوند.