(Typo. 'Assembly', "contracted notation", is a language. Made to make human readable the elements of those pieces of binary information that the 'Assembler', executed code, assembles.)
For that matter, language in use has a "descriptive" side overwhelmingly larger than the "prescriptive" side.
Now, the "assembler" is that thing which takes program components - say, a loop, an array of data and a subroutine - and concatenates them, e.g. fixing addressing (see Wilkes, Wheeler and Gill 1951) - you have to compute, for specification e.g. in the loop, at which address the data and the subroutine will start. The result is hence an "assembly".
Assembling was a clerical work. And famously (or notably), when Donald Gilles wrote an automated assembler, John von Neumann protested that "to have computers perform clerical work is a waste of precious resources".
But since at some point you got a piece of software to assemble the chunks, you can then think of adding an interpreter to translate machine operation mnemonics into machine code. So its syntax becomes "the language for the assembler", and "assembly language" would be "the language to obtain an assembly". Both expressions are weak, and I do not know historical details in their use. Some adopted the use of 'assembly' for the language to reserve 'assembler' for the processing program.