I was around (actually operating an analog computer) when people in the same lab were hired to write programs for the Univac I that Sperry-Rand had donated to Penn (it was already obsolete in 1956). The machine came with storage for 1000 double words (each double word being 12 bytes of six bits each–no byte did not invariably mean 8 bits). The machine automatically interpreted double instructions like
A__647?__734
where A means add, ? means my memory is failing and _ represents blanks to mean
add what is in memory location 647 to what is in the accumulator and store it (if I could remember the store mnemonic–I do know S meant subtract) in memory location 734, You could think of this language as halfway between machine language and assembler. Soon, Univac provided an actual assembler. There were two real differences. First it allowed symbolic rather than explicit addressing. The second was that it had a linker that allowed you have a library of procedures that could be incorporated in any other program. Obviously the second feature was heavily dependent on the first.
AFAIK, the first real compiler was Fortran (formula translator) created by IBM for their computers. Although primitive and heavily weighted towards arithmetic, it was a true compiler in the sense that you didn’t have to know machine language to use it. I assume that an assembler (itself programmed in machine language) preceded it. During the 60s, there were probably over 100 languages created, most of which have since fallen by the wayside (including Forth, my peronsal favorite language).