introduction programming hardware software languages program execution cycle editing compiling executing debugging