Machine code and punched cards
You normally started by entering a little loader program one word at a time by setting the bits with a line of toggle switches on the front panel, like this:



Wikipedia has a bit of explanation of the process. (Yes, it was tedious.) The little program would then read a larger program off of some convenient input device, which could be a card reader, although the machines I used in those days used paper tape. 

It could even be magnetic tape or some other magnetic storage device.



The larger program was the equivalent to the boot loader which is on sector zero of the persistent storage of whatever computer you used to ask this question, so the process is not that different.

A useful innovation was storing the initial boot loader loader in hardwired persistent memory (aka BIOS).

The use of symbolic codes to replace individual binary toggle switches (or equivalent) grew over time, and the distinction between assemblers and "higher level" languages is not a clear line. Fortran was certainly not the first higher level language, but it was extremely important.

(Some of the images come from David Gesswein's wonderfully nostalgic PDP-8 site.)