One who takes seperate components and combines them into a whole. This could be a human, as in an assembly line worker, or robot, or program.

An example of this is in programming. Processors follow directions contained in a stream (or streams) of numbers. Any particular particle in this stream is a machine instruction, and the number representing that instruction is a machine code. It used to be that in order to get a processor to process something you had to look at a large table of possible instructions, determine the matching machine code, and insert that into the stream. By building up a series of instructions in this way you were essentially assembling a program.

In time people determined it was easier for a human to understand even cryptic 3 and four letter mnemonics than it was to remember and understand machine code numbers, and that one could use the machine itself to translate between the mnemonic and the machine code. The assembler (program) was created to do this. It translates the assembly code listing into machine code.

This is usually the lowest level you would see anyone attempting to program at. While students and researchers still hand assemble some things, it is not efficient to do so in the long run, especially since new processor architechtures, and therefore new machine codes, come out frequently, and many popular processors have hundreds of instructions, which each have several parameters.

The first assembler was written in machine code.
The next assembler, and those following it, was written in assembler.
The first compiler was written in assembler
The next compiler, and all following it, was written in a compiled language.

At this point it is a useful learning experience to study machine code (especially if you plan on designing your own processor), but it is nearly useless as a practical function in society today.