hardware - stuff you can put your hands on software - instructions for the hardware to perform, expressed in computer-understandable form chronologically... ENIAC - programming was a very physical process maybe "software" for the ENIAC is the instructions for the programmer about how to connect wires, set switches, etc. why unfun? - incredibly tedious (and time-consuming) - very error-prone - very hard/time-consuming to find/fix mistakes - entering a program the 2nd time just as fun as the 1st "stored programs" - programming process can itself be automated - the instructions for connecting wires, setting switches, can be executed mechanically - we need a more standardized way to communicate those instructions. "machine language" - every processor has a relatively small set of basic operations it can carry out (addition, comparison, etc) -- each of these correspond to a particular physical configuration (wires, switches) machine language is a binary representation of each operation. so "add 4 and 9" might be 0011110010011111001 "programming" now means coming up with the right sequence of binary instructions to cause the hardware to do useful things the "software" is a sequence of these machine language instructions -- these instructions are "understood" in the sense that they cause the mechanism to change configuration programming is improved - mechanization (presumably faultless) of wiring/switching - reading and writing zeroes and ones is still tedious and pretty error-prone, actually - fixing errors - better but still not easy - huge progress: programs can be stored by the computer; can be reloaded easily. (often saved on paper tape) "stored program" - instructions can be stored by the computer just like any other kind of data - easy reloading problem: humans don't think about their algorithms as sequences of the kind of instructions computers can easily execute. it'd be nice if we could express our algorithms in a way slightly more in conformance with human thought patterns the next step. couldn't we at LEAST write those instruction in something that looks like English? 1) what would those instructions look like? (easy) 2) how to make them "computer-understandable"? "assembly language" -- instruction-by-instruction more-readable representation the answer to question 2 is that with the definition of assembly language comes a special piece of software (called an assembler) that allows the computer to translate assembly language to machine language so: programs have been stored as data before now -- but now they're getting TREATED as data by the assembler this still doesn't help with human-level thinking about algorithms. "fourth-generation" languages... QBASIC, ACML JavaScript, PHP, C++, C, Pascal, FORTRAN, COBOL, SNOBOL, ALGOL...... huge proliferation of languages, each of which tries to make it easier for us to describe algorithms in a way divorced from the details of computer hardware. the difference? the translation process is much more complicated! each of these languages has associated software that translates programs into assembly language. these translators are called "compilers." compilers use very powerful algorithms to support the translation process.