We use the term System Software for software which is primarily used to operate the hardware.
The operating system is the software that allows you to operate the hardware. The programs that we want to execute, the applications that we want to use all require a platform on which to execute. That platform is provided by the operating system.
One role of the operating system is to provide a virtual machine. This refers to the way that, by clicking on icons and menus, or by typing in commands at a prompt, we get to interact with the computer hardware without having to understand its complexity. By hiding the true complexity of the system from the user, the operating system makes it easier for ordinary people to make computers perform useful tasks.
Some utility programs are bundled in with operating system software these days. Others you buy or source in some other way.
Utility programs tend to perform specific tasks related to the management of hardware. Examples of utility programs include compression programs, formatters, defragmenters and other disk management tools.
Library programs are compiled libraries of commonly-used routines. On a Windows system they usually carry the file extension dll and are often referred to as run-time libraries. The libraries are run-time because they are called upon by running programs when they are needed. When you program using a run-time library, you typically add a reference to it either in your code or through the IDE in which you are programming.
Some library programs are provided within operating systems like Windows or along with development tools like Visual Studio. For example, it is possible to download and use a library of routines that can be used with Windows Media Player. This includes things like making playlists, functions and procedures for accessing and manipulating the music library (which is a binary file) and playback routines.
Using library programs saves time when programming. It also allows the programmer to interact with proprietary software without having access to its source code.
Whatever language or type of language we use to write our programs, they need to be in machine code in order to be executed by the computer. There are 3 main categories of translator used,
An assembler is a program that translates the mnemonic codes used in assembly language into the bit patterns that represent machine operations. Assembly language has a one-to-one equivalence with machine code, each assembly statement can be converted into a single machine operation.
A compiler turns the source code that you write in a high-level language into object code (machine code) that can be executed by the computer.
The compiler is a more complex beast than the assembler. It may require several machine operations to represent a single high-level language statement. As a result, compiling may well be a lengthy process with very large programs.
Interpreters translate the source code at run-time. The interpreter translates statements one-at-a-time as the program is executed.
Interpreters are often used to execute high-level language programs whilst they are being developed since this can be quicker than compiling the entire program. The program would be compiled when it is complete and ready to be released.
Interpreters are also used with high-level scripting languages like PHP, Javascript and many more. These instructions are not compiled and have to be interpreted either by the browser (in the case of Javascript) or by interpreters on the server (in the case of PHP).
Some programming languages make use of both compilers and interpreters. If you were to write a Java program in a text editor, when you came to compile it with the Java compiler, you would actually be creating something called bytecode. Bytecode can be thought of as an intermediate stage between source code and object code. When a computer executes a Java program, library programs on that machine interpret the bytecode. This allows Java to be platform-independent - a user needs the correct run-time libraries for Java on their machine in order to execute the programs.
Application software tends be used for the tasks that have some relationship to the world outside of the computer. For example, you might use a word processor to write a letter or an essay. Although you use the computer to perform the task, the task itself might reasonably be considered to be a non-computer task.
Software is general-purpose if it can be used for lots of different tasks. You can use a word processor to write letters, memos, essays, instructions, notes, faxes, invoices and lots more.
These days we tend to use integrate suites of office software where a range of general-purpose software is provided, usually with the facility to combine elements from each application in a single file.
This software performs a single specific task. This task might be complex like payroll calculation, stock control etc. but will be based on a single task.
As with many abstract concepts, you can stretch these definitions until they blur a little. These days, web browsers can contain a lot of features. They are still primarily focused on a single task, rendering web pages and so the web browser is special-purpose. Being able to access an application using a browser does not change the main purpose of the browser software itself.
Bespoke software is written for a single client. Large organisations have a need for well-developed applications suited to their specific needs. Such software is often expensive to develop since the development costs are not shared among a large number of people purchasing the software.
Here we are talking about machine code. This is the only form of code that can be executed by the computer directly.
Assembly language was developed to make it easier for programmers to write instructions than it would be using machine code. Mnemonics are used instead of bit patterns (which are harder to remember).
First and second generation languages are low level and machine-oriented. This refers to the way that they are based on the machine operations that are available for a given processor.
Third generation languages are high level, platform-independent and problem oriented. When source code is compiled, there is a one-to-many equivalence of high level language statements to machine code statements. Third generation programs can be run on any platform for which an appropriate compiler or interpreter exists.
High level languages are developed to help solve particular types of problem. The FORTRAN language was designed with Mathematics, Science and Engineering in mind, it contains lots of scientific functions that the average programmer may not need. The COBOL language was developed with business logic in mind, PHP was developed for server-side scripting and so on.
All of the languages in the first 3 generations are called imperative languages because the program's statements are executed in the order specified by the programmer.
Fourth generation languages are declarative. This means that the programmer will write facts or rules rather than statements. The interpreter for the language produces the result using whichever standard algorithms it has been given for doing so.
SQL and Prolog are both examples of declarative languages. Both are described in the programming section of this site and are relatively easy to try out. A quick half-hour blast at each would give you a feel for how they work and help you to understand how they differ from the other types of language.