برنامهنویسی کامپیوتر (به انگلیسی: Computer Programming) (یا به اختصار برنامهنویسی) بهطور کلی به فرایند نوشتن و توسعه نرمافزار کامپیوتر گفته میشود. به بیان جزئی تر برنامهنویسی رایانه به معنای فرایند تبدیل و سوق دادن فرمول حل یک مسئله یا الگوریتم محاسباتی، به یک برنامه قابل اجرا (نرمافزار) میباشد.
معنای برنامهنویسی رایانه در فرهنگ عامه میتواند به تمامی فرایند توسعه نرمافزار (به انگلیسی: Software Development) اطلاق گردد که شامل فعالیتهای مختلفی همچون بررسی، توسعه، درک، طراحی الگوریتم؛ پیادهسازی، تست، اشکال زدایی و نگهداری نرمافزارهای کامپیوتری نیز میشود. همچنین برنامهنویس به شخصی اطلاق میگردد که عمل برنامهنویسی و توسعه نرمافزار را انجام میدهد.
برنامهنویسی مستلزم فعالیتهایی همچون تحلیل و درک مسئله است و عموماً حل چنین مسایلی منجر به ایجاد یک الگوریتم میشود، بازبینی نیازمندیهای الگوریتم که شامل صحت و میزان منابع مصرفی است، پیادهسازی (که معمولاً به عنوان کدینگ از آن یاد میشود) این الگوریتم در یک زبان برنامهنویسی مقصد، تست کردن، اشکال زدایی، نگهداری کد منبع، پیادهسازی سیستم ساخت(build system) و مدیریت مصنوعات مشتق شده مانند کد ترجمه شده به زبان ماشین برنامههای کامپیوتری. الگوریتم اغلب تنها به شکل قابل تجزیه و تحلیل برای انسان و قابل استدلال با منطق نمایش داده میشود. کد منبع به یک یا چند زبان برنامهنویسی، مانند جاوااسکریپت، اسمالتاک، پایتون، جاوا، سی شارپ، سی پلاسپلاس و سی نوشته شدهاست.
تاریخچه
موضوع دستگاههایی که به دنبالهای از دستورالعملهای از قبل تعریف شده عمل میکند برمیگردد به Greek Mythology.
برنامهنویسی مدرن
نیازهای کیفیتی
هر روشی که برای برنامهنویسی به کار برود، برنامه نهایی باید دارای تعدادی مشخصات پایه باشد. مشخصات زیر تعدادی از مهمترین آنها هستند.
قابلیت اطمینان: این که چقدر نتایج یک برنامه درست باشند، به صحت طراحی الگوریتم و به حداقل رساندن اشتباهات برنامهنویسی مربوط میشود. اشتباهات برنامهنویسی شامل اشکالاتی مثل اشکال در مدیریت منابع (مثل سرریز شدن بافر یا وضعیت رقابتی) و اشکالات منطقی (مثل تقسیم بر صفر یا خطاهای off-by-one).
پایایی: این که یک برنامه چگونه اشکالاتی (نه باگها) را که ممکن است پیش بیایند، پیشبینی کردهاست. این شامل حالتهایی مانند دریافت اطلاعات نادرست، نامناسب یا غلط میشود؛ همچنین کمبود منابعی مانند حافظه، سرویسهای سیستم عامل یا اتصال به شبکه و سایر اشکالات مانند خطای کاربر یا اشکالات قطع برق نیز در این دسته قرار میگیرند.
کاربرد پذیری: ارگونومی یک برنامه: آسانی استفاده از برنامه برای شخصی که میخواهد از آن برای کار در نظر گرفته شده استفاده کند یا گاهی برای کارهای پیشبینی نشده آن را به کار برد. این مورد میتواند به تنهایی و علیرغم تمام موارد دیگر باعث موفقیت یا شکست شود. طیف وسیعی از عناصر متنی، تصویری و گاهی سختافزاری وجود دارند که میتوانند باعث ارتقای وضوح، درک، پیوستگی، کامل بودن واسط کاربری برنامه شوند.
قابلیت انتقال: طیف سختافزارها و سیستم عاملهایی که کد منبع برنامه را بتوان روی آنها با مترجم یا مفسر اجرا کرد. این قابلیت بستگی به تفاوت در تسهیلاتی دارد که سیستمهای مختلف از نظر منابع سختافزاری و سیستم عاملها برای برنامهنویسی ارائه میکنند. همچنین رفتار پیشبینی شده سختافزارها و سیستمهای عامل، و در دسترس بودن مترجمها (و منابع کتابخانهای) اختصاصی در آن سیستمها برای کد منبع موجود نیز مهم است.
نگهداشت پذیری: این که سازندگان و ارتقا دهندگان فعلی برنامه یا افراد دیگری در آینده بتوانند به راحتی ارتقاها یا تغییراتی در برنامه انجام دهند تا خطاها و حفرههای امنیتی را رفع کنند یا بتوانند آن را برای محیط جدیدی تطبیق دهند. در این مورد تلاش مناسب اولیه در ایجاد برنامه است که نقش عمدهای بازی میکند. این خاصیت ممکن است تأثیر خیلی زیادی روی کاربر نهایی برنامه نداشته باشد ولی در بلند مدت برای سرنوشت یک برنامه خیلی مهم است.
کارایی / عملکرد :اندازهگیری منابع سیستمی مورد نیاز برای یک برنامه (زمان پردازنده، فضای حافظه، وسایل کند مثل دیسکها، پهنای باند شبکه و موارد دیگری مثل تعامل با کاربر): هر چقدر کمتر، بهتر. این خاصیت همچنین شامل مدیریت صحیح منابع مانند پاک کردن فایلهای موقت و از بین بردن نشتیهای حافظه نیز میشود.
خوانایی کد منبع
در برنامهریزی رایانه، خوانایی عبارت است از این که خواننده متن کد منبع بتواند هدف، جریان برنامه و عملکرد کد منبع را متوجه شود. این موضوع در مجموعه نیازهای کیفیتی شامل موارد قابلیت انتقال، کاربرد پذیری و نگهداشت پذیری میشود.
خوانایی خیلی مهم است به این علت که برنامه نویسان بیشترین وقتشان را به جای این که صرف نوشتن کد جدید بکنند، در زمینه درک و تغییر کد منبع موجود میکنند. کدهای ناخوانا معمولاً به خطا، نارسایی و کدهای تکراری ختم میشوند. یک تحقیق نشان داد که تغییرات جزئی و سادهای برای خوانایی برنامه میتواند منجر به این شود که کد نهایی نوشته شده کوتاهتر شود و همچنین زمان فهم آن بهطور قابل توجهی کاهش یابد.
پیروی از یک سبک برنامهنویسی منسجم معمولاً به خوانایی کمک میکند؛ اگر چه خوانایی چیزی بیش از فقط سبک برنامهنویسی است. عوامل زیادی که معمولاً دخالتی در توانایی رایانه برای ترجمه مناسب و اجرای بهتر برنامه ندارند، به خوانایی کمک میکنند. بعضی از این عوامل اینها هستند:
بلوک بندی متفاوت
یادآورها
تکهتکه کردن نوشتههای طولانی
قواعد نامگذاری برای اشیا (مثل متغیرها، کلاسها، روالها و غیره)
جنبههای دیداری برای این کار (مثل تورفتگی، شکستن خطوط، علامتگذاری رنگی و مانند اینها) معمولاً به وسیله ویرایشگر کد منبع فراهم میشود، اما جنبههای محتوایی بازتابی از استعداد و تواناییهای برنامهنویس است.
زبانهای برنامهنویسی دیداری متعددی با این منظور توسعه داده شدهاند تا بتوانند از روشهای غیر سنتی برای ارائه کد و تصویر استفاده کنند. محیطهای یکپارچه توسعه نرمافزار (IDEها) میخواهند تا تمام این گونه کمکها را به شکل یک پارچه ارائه کنند. تکنیکهایی برای بازسازی کد میتواند خوانایی را افزایش دهد.
پیچیدگی الگوریتمی
محیطهای دانشگاهی و همچنین مهندسین فعال در برنامهنویسی هر دو عمیقاً به دنبال کشف و تکمیل الگوریتهای کارآمد تر برای گروه مشکلات مشخص شده هستند. برای نیل به این هدف الگوریتمها در ترتیبهایی طبقهبندی میشوند که به عنوان نماد O بزرگ خوانده میشوند. این طبقهبندی نشانگر استفاده الگوریتم از منابع، مثل زمان اجرا یا انباشت حافظه در ازای اندازه یک داده وارده است.
برنامه نویسان حرفهای با گسترهای از الگوریتهای خوب سازمان یافته آشنایی دارند و پیچیدگیهای مخصوص آنها را میدانند و در نتیجه از این دانستهها برای انتخاب الگوریتمهای مناسب برای شرایط مورد نظر خود، استفاده میکنند.
روشها
قدم اول در فرایند توسعه بیشتر نرمافزارها به شکل معمول شامل بررسی نیازمندیها، سپس آزمایش برای تشخیص الگوی متغیرها، اجرا و سپس حذف خرابیها (اشکال زدایی) است. راههای مختلفی برای رسیدن به هر کدام از این وظایف وجود دارند. یک راه پرطرفدار برای تحلیل نیازمندیها تحلیل مورد کاربردی است. بسیاری از برنامه نویسان از شکل توسعه چابک نرمافزاری استفاده میکنند؛ در این روش مراحل مختلف توسعه نرمافزار به شکل چرخههای کوتاه با هم ترکیب میشوند بهطوریکه هر کدام از این چرخهها فقط چند هفته طول بکشند. این درمقابل روش معمول است که ممکن است چند سال زمان ببرد. روشهای خیلی زیادی برای روند توسعه برنامهها وجود دارند.
محبوبترین زبان در برنامهنویسی
تعیین اینکه محبوبترین زبان برنامهنویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبانها در کاربردهای خاصی محبوب است و بعضی دیگر مرتباً در نوشتن کاربردهای گوناگون استفاده میشود. روشهای اندازهگیری محبوبیت زبان شامل موارد زیر میباشد: شمردن تعداد آگهیهای اشتغال و توجه به یک زبان، تعداد کتابهای آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان
اشکال زدایی
اشکال زدایی وظیفه بسیار مهمی در فرایند توسعه نرمافزار میباشد، زیرا یک برنامه غلط میتواند پیامدهای مهمی برای کاربر خود داشته باشد. بعضی از زبانها بیشتر در معرض برخی اشتباهات میباشند، به خاطر خصوصیاتشان نیاز به بررسی بیشتر کامپایلر نسبت به زبانهای دیگر ندارند.
کاربرد زبان برنامهنویسی
اجرا و عملی ساختن الگوریتمهای انتزاعی وابسته به هم بهوسیله تولید یک برنامه رایانهای مشخص با ابزار زبان برنامهنویسی ممکن است.
نمونه یک برنامه
یک برنامهٔ ساده در زبان برنامهنویسیBasic که از سادهترین زبانهای برنامهنویسی است میتواند به شکل زیر باشد:
1 2 3 | <span class="kr">REM</span> <span class="vg">MY</span> <span class="vg">FIRST</span> <span class="vg">TRY</span> <span class="k">TO</span> <span class="vg">COMMAND</span> <span class="vg">THIS</span> <span class="vg">MACHINE</span> <span class="k">TO</span> <span class="kr">DO</span> <span class="vg">WHAT</span> <span class="vg">I</span> <span class="vg">LIKE</span> <span class="kr">PRINT</span> <span class="s2">"HELLO NEW WORLD!"</span> <span class="kr">END</span> |
سطر نخست که با واژه کلیدی “REM” آغاز شده و از سوی برنامهٔ واسط درنظر گرفته نمیشود و تنها برای نگاه داشتن یک توضیح یا مانند آن برای خود برنامهنویس است. سطر دوم با واژه کلیدی “PRINT” به دستگاه فرمان میدهد تا نوشته “HELLO NEW WORLD!” (“سلام دنیای نو!”) را روی نمایشگر بنویسد (چاپ کند). سطر آخر پایان فرامین و برنامه را به ماشین اطلاع میدهد.
پس از نوشتن یک برنامه مانند بالا، برنامهٔ مترجم (در اینجا Basic) دستورها را تبدیل به فرامینی میکند که لایه زیرین، که ممکن است همان سختافزار باشد، میتواند آنها را اجرا کند.
برای راحت تر شدن کدنویسی (برنامهنویسی) از نرمافزارهای مختلفی وابسته به زبان ان استفاده میکنند به عنوان مثال برای کدنویسی به زبان c# از نرمافزار visual studio, sql server… استفاده میشود.
پارادایمها
زبانهای برنامهنویسی گوناگون براساس قابلیتهای درنظر گرفته شده از شیوهٔ خطهای مختلف استفاده میکنند. موارد ریزتری مانند چگونگی برخورد با نیازهای پشت پردهٔ ماشین مانند مدیریت حافظه و مدیریت زباله نیز در زبانهای مختلف متفاوت است. علاوه بر اینها، مفاهیمی متفاوت از (اجرای) یک برنامه تصور شدهاند که پارادایم یا الگو نام دارند.
زبانهای برنامهنویسی
زبانهای متعدد برنامهنویسی وجود دارند که هر کدام از آنها سبکهای خاصی را پشتیبانی میکنند . انتخاب زبان برنامهنویسی مورد نظر بر اساس ملاحظات متعددی صورت میگیرد: مانند سیاست شرکت، مناسب بودن برای وظیفه در نظر گرفته شده، موجود بودن بستههای برنامه از پیش آماده شده یا نظرات شخصی. به شکل ایدهآل مناسبترین زبان برنامهنویسی برای کاربرد مورد نظر که در دسترس باشد ، انتخاب میشود. موضوعاتی که باعث میشوند از این وضعیت ایدهآل فاصله گرفته شوند شامل موضوعاتی مانند یافتن تعداد کافی برنامه نویسان ماهر که بتوانند تیم کاری تشکیل دهند، در دسترس بودن کامپایلرهای مناسب برای زبان مورد نظر، کارایی برنامههای نوشته شده با زبان مورد نظر، است.
زبانهای برنامهنویسی در طیفی بین زبانهای “سطح پائین ” تا “زبانهای سطح بالاً قرار میگیرند. زبانهای سطح پائین معمولاً به زبان ماشین نزدیکتر هستند و سریعتر اجرا میشوند، در مقابل زبانهای سطح بالا خلاصه تر و برای کاربرد آسانتر هستند ولی با سرعت کمتری اجرا میشوند. کد نویسی با زبانهای سطح بالا معمولاً آسانتر از کد نویسی با زبانهای سطح پائین هستند.
آلن داونی در کتاب ” چگونه به شکل یک استاد رایانه فکر کنیم ” مینویسد:
جزئیات در زبانهای برنامهنویسی مختلف متفاوت به نظر میرسند ولی تعدادی از ساختارهای اساسی در همه زبانهای برنامهنویسی یکسان هستند:
ورودی: دادهها را از صفحه کلید، یک فایل یا وسایل دیگر فراهم میکند.
خروجی: اطلاعات را روی صفحه تصویر نشان میدهد، به یک فایل میفرستد یا به دستگاههای دیگری انتقال میدهد.
محاسبات: اعمال محاسباتی اساسی مثل جمع و ضرب را انجام میدهد.
حالتهای شرطی: شرطهای مشخصی را کنترل میکند و بر اساس آن رشته مناسبی از عبارات را اجرا میکند.
حلقه: بعضی اعمال را به شکل تکراری انجام میدهد، معمولاً با استفاده از تعدادی از متغیرها این کار انجام میشود.
بسیاری از زبانهای برنامهنویسی مکانیسمهایی را برای استفاده از کتابخانههای مشترک فراهم میکنند. توابعی در این کتابخانهها بر اساس الگوهای مناسب اجرایی ایجاد میشوند (مانند روشهای انتقال آرگومانها) و سپس میتوان از این توابع در زبانهای متعدد برنامهنویسی استفاده کرد.
جمع بندی
برنامه نویسی یکی از شغل های پر درآمد مخصوصا در زمینه وب و موبایل می باشد و از طرفی دیگر جزو شغل های کثیف است که باعث می شود فرد برنامه نویس به مرور زمان دچار آسیب هایی روحی و جسمی شود که در شرکت های بزرگ برنامه نویسی محیط برنامه نویسی شرایطی را فراهم می کنند که از ایجاد این نوع آسیب ها پیشگیری کنند.