نرم افزار، مجموعه ای از برنامه های رایانه ای، رویه ها و مستندات است که انجام کارهای مختلف بر روی یک سیستم رایانه ای را بر عهده دارد. عبارت “نرم افزار” برای نخستین بار توسط جان توکی در سال ۱۹۵۸ مورد استفاده قرار گرفت. در سطح بسیار ابتدایی، نرم افزار کامپیوتر، متشکل از زبان ماشین است که شامل گروهی از مقادیر دودویی بوده و دستورالعمل پردازنده را تعیین می کند. دستورالعمل پردازنده تغییر بیان از سخت افزار کامپیوتر در یک توالی از پیش تعریف شده می باشد. به طور خلاصه، نرم افزار کامپیوتر، زبانی است که اصطلاحاً به وسیلۀ آن یک رایانه، صحبت می کند. انواع مختلفی از نرم افزار های رایانه ای وجود دارد و باید دید اقسام اصلی آنها کدامند؟

نرم افزار‌ها از منظرهای مختلفی قابل دسته بندی و تقسیم می باشند و متخصصین علوم رایانه ای با توجه به ابعاد مختلف نرم افزار به ارائۀ تقسیم بندی های متفاوتی از این پدیدۀ فناورانه پرداخته اند.

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

 ۱-تقسیم بندی های فنی نرم افزار

به جهت فنی و ابعاد مرتبط با علوم رایانه ای، نرم افزار ها را با توجه به معیارهای گوناگون از جمله هدف و مأموریت نرم افزار، زمینۀ استفاده، نوع نقش و عملکرد و یا کاربر نرم افزار، می توان مورد تقسیم بندی‌های مختلفی قرار داد. ذیلاً با توجه به معیارهای پیش گفته به بررسی انواع نرم افزارها از جهت فنی خواهیم پرداخت.

۱-۱-  نرم افزارهای پایه(Programming Software) :

این دسته از نرم افزارها، یکی از انواع معمول، شناخته شده و مورد علاقۀ کاربران در میان نرم افزار های کامپیوتری است . این نرم افزار در قالب ابزار بوده و به برنامه نویس در نوشتن برنامه های کامپیوتری کمک می کند. برنامه های کامپیوتری مجموعه ای از دستورات منطقی هستند که برای یک سیستم کامپیوتری، وظایف خاصی را انجام می دهند . ابزارهایی که به برنامه نویسان در ایجاد یک سیستم کامپیوتری کمک  می کنند، شامل ویرایشگر متن ، کامپایلرها و مترجم ها ست. کامپایلرها(مفسرها)، کد منبع را که در قالب یک زبان برنامه نویسی، نوشته شده اند به زبانی که کامپیوتر آن را می فهمد، ترجمه می کنند.(اغلب در قالب دو دویی). کامپایلرها چیزهایی را که به وسیلۀ رابط ها، تجمیع و تبدیل شده اند، تولید می کنند. دی باگرها( اِشکال زداها )، جهت بررسی و اشکال زدایی کدها استفاده می شوند. کد منبع، بعضاً یا به طور کامل، برای ابزارهای اشکال زدا (Debugging tool) که بر روی آنها اجرا شده و به جهت برطرف کردن هرگونه اشکال احتمالی به کار می روند، شبیه سازی  می شود. مترجم ها (Interpreters) برنامه ها را اجرا می کنند. آنها کد منبع و یا یک کد از پیش تالیف شده را اجرا و یا کد منبع را قبل از اجرا به یک زبان میانی ترجمه می کنند.

۱-۲-  نرم افزارهای سیستمی(System Software) :

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

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