برنامه نویسی یا کدگذاری کامپیوتری ترکیبی از توالی دستورات است که برنامه نامیده می شود و کامپیوترها می توانند برای انجام وظایف از آنها پیروی کنند. [1] [2] این شامل طراحی و پیاده سازی الگوریتم ها ، مشخصات گام به گام رویه ها، با نوشتن کد در یک یا چند زبان برنامه نویسی است . برنامه نویسان معمولاً از زبان های برنامه نویسی سطح بالا استفاده می کنند که برای انسان راحت تر از کد ماشین قابل درک است که مستقیماً توسط واحد پردازش مرکزی اجرا می شود . برنامه نویسی ماهر معمولاً به تخصص در چندین موضوع مختلف از جمله دانش حوزه برنامه ، جزئیات زبان های برنامه نویسی و کتابخانه های کد عمومی ، الگوریتم های تخصصی و منطق رسمی نیاز دارد .
وظایف کمکی همراه و مرتبط با برنامه نویسی شامل تجزیه و تحلیل نیازمندی ها ، آزمایش ، اشکال زدایی (بررسی و رفع مشکلات)، پیاده سازی سیستم های ساخت و مدیریت مصنوعات مشتق شده ، مانند کد ماشین برنامه ها است . در حالی که اینها گاهی اوقات برنامه نویسی در نظر گرفته می شوند، اغلب اصطلاح توسعه نرم افزار برای این فرآیند کلی بزرگتر استفاده می شود - با عبارات برنامه نویسی ، پیاده سازی ، و کدگذاری که برای نوشتن و ویرایش کد به خودی خود محفوظ است. گاهی اوقات توسعه نرم افزار به عنوان مهندسی نرم افزار شناخته می شود ، به خصوص زمانی که از روش های رسمی استفاده می کند یا از یک فرآیند طراحی مهندسی پیروی می کند .
دستگاه های قابل برنامه ریزی قرن هاست که وجود داشته اند. در اوایل قرن نهم، یک ترتیبدهنده موسیقی قابل برنامهریزی توسط برادران ایرانی بانو موسی اختراع شد که یک دستگاه فلوت مکانیکی خودکار را در کتاب دستگاههای مبتکر توصیف کردند . [3] [4] در سال 1206، مهندس عرب الجزاری یک دستگاه درام قابل برنامه ریزی را اختراع کرد که در آن یک خودکار مکانیکی موسیقی می توانست برای نواختن ریتم ها و الگوهای طبل مختلف، از طریق گیره و بادامک ساخته شود . [5] [6] در سال 1801، دستگاه بافندگی ژاکارد میتوانست با تغییر «برنامه» بافتهای کاملاً متفاوتی تولید کند - یک سری کارتهای مقوایی با سوراخهایی روی آنها.
الگوریتم های کدشکن نیز قرن هاست که وجود داشته اند. در قرن نهم، الکندی ، ریاضیدان عرب ، الگوریتم رمزنگاری را برای رمزگشایی کدهای رمزگذاری شده در کتاب دستنوشته ای درباره رمزگشایی پیام های رمزنگاری شده توصیف کرد . او اولین توصیف را از تحلیل رمز با استفاده از تجزیه و تحلیل فرکانس ارائه کرد که اولین الگوریتم شکستن کد است. [7]
اولین برنامه کامپیوتری عموماً به سال 1843 مربوط می شود، زمانی که ریاضیدان آدا لاولیس الگوریتمی را برای محاسبه دنباله ای از اعداد برنولی منتشر کرد که قرار بود توسط موتور تحلیلی چارلز بابیج انجام شود . [8] با این حال، چارلز بابیج خود برنامه ای برای AE در سال 1837 نوشته بود. [9] [10]
در دهه 1880، هرمان هولریث مفهوم ذخیره سازی داده ها را به شکل قابل خواندن توسط ماشین ابداع کرد. [11] بعداً یک صفحه کنترل (برد پلاگین) به جدولگر نوع I در سال 1906 اضافه شد و اجازه داد تا برای کارهای مختلف برنامه ریزی شود و در اواخر دهه 1940، تجهیزات ضبط واحد مانند IBM 602 و IBM 604 توسط پانل های کنترل برنامه ریزی شدند. به روشی مشابه، همانطور که اولین کامپیوترهای الکترونیکی بودند . با این حال، با مفهوم کامپیوتر برنامه ذخیرهشده در سال 1949، هم برنامهها و هم دادهها به یک شکل در حافظه رایانه ذخیره و دستکاری شدند . [12]
کد ماشین زبان برنامه های اولیه بود که در مجموعه دستورات ماشین خاص نوشته می شد، اغلب به صورت دودویی . زبانهای اسمبلی به زودی توسعه یافتند که به برنامهنویس اجازه میداد دستورالعملها را در قالب متنی (مثلاً ADD X، TOTAL) با اختصارات برای هر کد عملیات و نامهای معنیدار برای تعیین آدرسها مشخص کند. با این حال، از آنجایی که یک زبان اسمبلی کمی بیشتر از یک نماد متفاوت برای یک زبان ماشین است، دو ماشین با مجموعههای دستورالعمل متفاوت نیز زبانهای اسمبلی متفاوتی دارند.
زبانهای سطح بالا، فرآیند توسعه یک برنامه را سادهتر و قابل فهمتر کرده و کمتر به سختافزار زیرین محدود میشوند . اولین ابزار مرتبط با کامپایلر، سیستم A-0 ، در سال 1952 [13] توسط گریس هاپر ، که اصطلاح "کامپایلر" را نیز ابداع کرد، توسعه یافت . [14] [15] FORTRAN ، اولین زبان پرکاربرد سطح بالا که دارای یک پیاده سازی کاربردی بود، در سال 1957 منتشر شد، [16] و بسیاری از زبان های دیگر به زودی توسعه یافتند - به ویژه، COBOL با هدف پردازش داده های تجاری، و Lisp. برای تحقیقات کامپیوتری
این زبانهای کامپایلشده به برنامهنویس اجازه میدهند تا برنامههایی را با عباراتی بنویسد که از نظر نحوی غنیتر هستند، و توانایی بیشتری در انتزاع کد دارند، و هدف قرار دادن مجموعههای دستورات مختلف ماشین را از طریق اعلانهای کامپایل و اکتشافی آسان میکنند . کامپایلرها از قدرت رایانهها برای آسانتر کردن برنامهنویسی استفاده کردند [16] با اجازه دادن به برنامهنویسان برای تعیین محاسبات با وارد کردن یک فرمول با استفاده از نماد infix .
برنامه ها بیشتر با استفاده از کارت های پانچ یا نوار کاغذی وارد می شدند . در اواخر دهه 1960، دستگاههای ذخیرهسازی داده و پایانههای رایانه به اندازهای ارزان شدند که میتوان برنامهها را با تایپ مستقیم در رایانه ایجاد کرد. ویرایشگرهای متنی نیز توسعه یافتند که اجازه میدادند تغییرات و اصلاحات بسیار راحتتر از کارتهای پانچ انجام شود .
رویکرد توسعه هر چه باشد، برنامه نهایی باید برخی از ویژگی های اساسی را برآورده کند. خواص زیر از مهمترین آنها هستند: [17] [18]
استفاده از تست های خودکار و توابع تناسب اندام می تواند به حفظ برخی از ویژگی های ذکر شده کمک کند. [20]
در برنامه نویسی کامپیوتر، خوانایی به سهولتی که خواننده انسانی می تواند هدف، جریان کنترل و عملکرد کد منبع را درک کند، اطلاق می شود . این بر جنبه های کیفیت فوق تأثیر می گذارد، از جمله قابلیت حمل، قابلیت استفاده و از همه مهمتر قابلیت نگهداری.
خوانایی مهم است زیرا برنامه نویسان بیشتر وقت خود را صرف خواندن، تلاش برای درک، استفاده مجدد و اصلاح کد منبع موجود می کنند، نه نوشتن کد منبع جدید. کدهای ناخوانا اغلب منجر به اشکالات، ناکارآمدی ها و کدهای تکراری می شود . یک مطالعه نشان داد که چند تغییر خوانایی ساده کد را کوتاهتر کرده و زمان درک آن را به شدت کاهش میدهد. [21]
پیروی از یک سبک برنامه نویسی ثابت اغلب به خوانایی کمک می کند. با این حال، خوانایی چیزی فراتر از سبک برنامه نویسی است. بسیاری از عوامل، که ارتباط کمی با توانایی رایانه در کامپایل و اجرای مؤثر کد دارند، به خوانایی کمک می کنند. [22] برخی از این عوامل عبارتند از:
جنبه های ارائه این (مانند تورفتگی، شکسته شدن خط، برجسته کردن رنگ، و غیره) اغلب توسط ویرایشگر کد منبع مدیریت می شود ، اما جنبه های محتوا نشان دهنده استعداد و مهارت های برنامه نویس است.
زبان های برنامه نویسی بصری مختلف نیز با هدف رفع نگرانی های مربوط به خوانایی با اتخاذ رویکردهای غیر سنتی برای ساختار و نمایش کد توسعه داده شده اند. محیط های توسعه یکپارچه (IDE) با هدف ادغام تمام این کمک ها هستند. تکنیک هایی مانند بازآفرینی کد می توانند خوانایی را افزایش دهند.
رشته دانشگاهی و تمرین مهندسی برنامه نویسی کامپیوتر با کشف و پیاده سازی کارآمدترین الگوریتم ها برای یک کلاس معین از مسائل مرتبط است. برای این منظور، الگوریتمها با استفاده از نماد Big O به ترتیبی طبقهبندی میشوند که استفاده از منابع - مانند زمان اجرا یا مصرف حافظه - را بر حسب اندازه ورودی بیان میکند. برنامه نویسان خبره با انواع الگوریتم های به خوبی تثبیت شده و پیچیدگی های مربوط به آنها آشنا هستند و از این دانش برای انتخاب الگوریتم هایی استفاده می کنند که به بهترین وجه مناسب شرایط هستند.
اولین گام در اکثر فرآیندهای رسمی توسعه نرم افزار، تجزیه و تحلیل نیازمندی ها است ، به دنبال آن آزمایش برای تعیین مدل سازی ارزش، پیاده سازی، و حذف شکست (اشکال زدایی) انجام می شود. برای هر یک از این وظایف، رویکردهای متفاوتی وجود دارد. یکی از رویکردهای رایج برای تحلیل نیازمندی ها، تحلیل Use Case است . بسیاری از برنامه نویسان از اشکال توسعه نرم افزار Agile استفاده می کنند که در آن مراحل مختلف توسعه نرم افزار رسمی بیشتر با هم در چرخه های کوتاهی که چند هفته طول می کشد به جای سال ها یکپارچه می شوند. رویکردهای زیادی برای فرآیند توسعه نرم افزار وجود دارد.
تکنیکهای مدلسازی محبوب شامل تحلیل و طراحی شی گرا ( OOAD ) و معماری مدل محور ( MDA ) است. زبان مدلسازی یکپارچه ( UML ) نمادی است که برای هر دو OOAD و MDA استفاده می شود.
تکنیک مشابهی که برای طراحی پایگاه داده استفاده می شود، مدلسازی نهادی-رابطه ( ER Modeling ) است.
تکنیک های پیاده سازی شامل زبان های امری ( شی گرا یا رویه ای )، زبان های تابعی و زبان های برنامه نویسی منطقی است .
تعیین محبوب ترین زبان های برنامه نویسی مدرن بسیار دشوار است. روشهای اندازهگیری محبوبیت زبان برنامهنویسی عبارتند از: شمارش تعداد آگهیهای شغلی که به آن زبان اشاره میکند، [23] تعداد کتابهای فروخته شده و دورههای آموزش زبان (این امر اهمیت زبانهای جدیدتر را بیش از حد برآورد میکند)، و تخمین تعداد خطوط موجود. کد نوشته شده در زبان (این تعداد کاربران زبان های تجاری مانند COBOL را دست کم می گیرد).
برخی از زبان ها برای انواع خاصی از برنامه ها بسیار محبوب هستند، در حالی که برخی از زبان ها به طور منظم برای نوشتن انواع مختلف برنامه ها استفاده می شوند. برای مثال، COBOL هنوز در مراکز داده شرکتی [24] اغلب در رایانههای بزرگ بزرگ ، فرترن در برنامههای مهندسی، زبانهای برنامهنویسی در توسعه وب و C در نرمافزارهای تعبیهشده قوی است . بسیاری از برنامه ها از ترکیبی از چندین زبان در ساخت و استفاده خود استفاده می کنند. زبانهای جدید عموماً حول سینتکس زبان قبلی با قابلیتهای جدید اضافه شده طراحی میشوند (به عنوان مثال C++ شی گرایی را به C اضافه میکند و جاوا مدیریت حافظه و کد بایت را به C++ اضافه میکند، اما در نتیجه کارایی و توانایی کم را از دست میدهد. دستکاری سطح).
اشکال زدایی یک کار بسیار مهم در فرآیند توسعه نرم افزار است زیرا وجود نقص در یک برنامه می تواند عواقب قابل توجهی برای کاربران آن داشته باشد. برخی از زبان ها بیشتر مستعد برخی از اشکالات هستند، زیرا مشخصات آنها نیازی به کامپایلرها ندارد که به اندازه زبان های دیگر بررسی کنند. استفاده از ابزار تجزیه و تحلیل کد استاتیک می تواند به شناسایی برخی مشکلات احتمالی کمک کند. معمولاً اولین قدم در اشکال زدایی، تلاش برای بازتولید مشکل است. این می تواند یک کار غیر ضروری باشد، به عنوان مثال در مورد فرآیندهای موازی یا برخی از اشکالات نرم افزاری غیر معمول. همچنین، محیط کاربری خاص و سابقه استفاده می تواند بازتولید مشکل را دشوار کند.
پس از بازتولید اشکال، ممکن است لازم باشد ورودی برنامه ساده شود تا اشکال زدایی آسانتر شود. به عنوان مثال، هنگامی که یک اشکال در یک کامپایلر میتواند هنگام تجزیه برخی از فایلهای منبع بزرگ باعث خرابی آن شود، سادهسازی مورد آزمایشی که تنها چند خط از فایل منبع اصلی ایجاد میکند میتواند برای بازتولید همان خرابی کافی باشد. آزمایش و خطا/تقسیم و غلبه مورد نیاز است: برنامه نویس سعی می کند برخی از قسمت های مورد آزمایشی اصلی را حذف کند و بررسی کند که آیا مشکل همچنان وجود دارد یا خیر. هنگام اشکال زدایی مشکل در یک رابط کاربری گرافیکی، برنامه نویس می تواند سعی کند برخی از تعاملات کاربر را از توضیحات اصلی مشکل رد کند و بررسی کند که آیا اقدامات باقی مانده برای ظاهر شدن باگ ها کافی است یا خیر. اسکریپت و نقطه شکست نیز بخشی از این فرآیند هستند.
اشکال زدایی اغلب با IDE ها انجام می شود . دیباگرهای مستقل مانند GDB نیز مورد استفاده قرار می گیرند، و اینها اغلب محیط بصری کمتری را ارائه می دهند، معمولاً از خط فرمان استفاده می کنند . برخی از ویرایشگرهای متن مانند Emacs به GDB اجازه می دهند تا از طریق آنها فراخوانی شود تا یک محیط بصری فراهم شود.
زبان های برنامه نویسی مختلف از سبک های مختلف برنامه نویسی پشتیبانی می کنند (به نام پارادایم های برنامه نویسی ). انتخاب زبان مورد استفاده به ملاحظات زیادی بستگی دارد، مانند خط مشی شرکت، مناسب بودن برای انجام وظیفه، در دسترس بودن بسته های شخص ثالث، یا ترجیحات فردی. در حالت ایده آل، زبان برنامه نویسی که برای کار در دست مناسب است انتخاب می شود. معاوضه از این ایده آل شامل یافتن برنامه نویسان کافی است که زبان را برای ساختن یک تیم می دانند، در دسترس بودن کامپایلر برای آن زبان، و کارایی برنامه های نوشته شده در یک زبان خاص اجرا می شوند. زبان ها یک طیف تقریبی از "سطح پایین" تا "سطح بالا" را تشکیل می دهند. زبانهای «سطح پایین» معمولاً ماشینگراتر و سریعتر اجرا میشوند، در حالی که زبانهای «سطح بالا» انتزاعیتر و آسانتر برای استفاده هستند اما با سرعت کمتری اجرا میشوند. معمولا کدنویسی در زبان های "سطح بالا" آسان تر از زبان های "سطح پایین" است. زبان های برنامه نویسی برای توسعه نرم افزار ضروری هستند. آنها بلوک های سازنده همه نرم افزارها هستند، از ساده ترین برنامه ها تا پیچیده ترین آنها.
آلن داونی در کتاب خود چگونه مانند یک دانشمند کامپیوتر فکر کنیم می نویسد:
بسیاری از زبان های رایانه مکانیزمی برای فراخوانی توابع ارائه شده توسط کتابخانه های مشترک ارائه می دهند . به شرطی که توابع موجود در یک کتابخانه از قراردادهای زمان اجرا مناسب پیروی کنند (مثلاً روش ارسال آرگومان ها )، این توابع ممکن است به هر زبان دیگری نوشته شوند.
برنامه نویسان کامپیوتر کسانی هستند که نرم افزار کامپیوتری می نویسند. مشاغل آنها معمولاً شامل موارد زیر است:
اگرچه برنامه نویسی در رسانه ها به عنوان یک موضوع تا حدودی ریاضی ارائه شده است، اما برخی تحقیقات نشان می دهد که برنامه نویسان خوب مهارت های قوی در زبان های طبیعی انسانی دارند و یادگیری کدنویسی مشابه یادگیری یک زبان خارجی است . [26] [27]
ابتکار محاسبات به دنبال حذف موانع برای پذیرش ابر در امنیت، قابلیت همکاری، قابلیت حمل و قابلیت اطمینان است.
آیا بر اساس ... قابلیت اطمینان قابل حمل. سازگاری