ML = Machine Language. THis means programming an executable in the processors native language, controlling every action the processor takes. It can be used to create an app that is much more streamlined and efficient than compiling from BASIC (or other language). A ML program is just a series of numbers between zero and 255 inclusive (on an 8 bit machine). Each number is either a specific processor command (such as "load the accumulator with this data"), data, or the memory address to be used in the process. Note that many of the commands (such as LDA, or "load accumulator") often had several versions, each with it's own "command" depending on whether you are using direct mode, indirect-x, indirect-y, zero page, etc.
An "assembler" was an app that would show the "assembly" instruction (ie, LDA) rather than the number for that particular instruction, making the code a bit more "human readable". It also allowed "flags" to be set for jump points, and variables by name (instead of by memory address).
Due to the increased complexity of todays apps, vastly larger "instruction sets" available with modern processors, increased memory available, and sheer speed of todays processors (which make the absolute optimization of code less important) ML and Assembly are rarely used today. Some of Steve Gibson's stuff (at GRC.com) is still done in assembly, but these tend to be very small, simple apps that perform only one fairly simple task.