Das bei den ersten Computern erforderliche Programmieren in der binär codierten Maschinensprache des betreffenden Mikroprozessors war äußerst mühsam. Daher hat man schon bald gut merkbare Abkürzungen (mnemonische Codes) für die erforderlichen Operationen verwendet. So entstanden die in Kap. 5.5 erläuterten Assemblersprachen als die ersten maschinennahen Sprachen. Die Übertragung in ein lauffähiges Maschinenprogramm erfolgt durch ein als Assembler bezeichnetes Hilfsprogramm. Trotz der Einführung von frei wählbaren Namen, Makros und Unterprogrammen blieb die Programmierung sehr mühsam und zeitraubend. Die resultierenden Programme sind meist lang, unübersichtlich und für alle außer (vielleicht) den Autor schwer zu durchschauen. Das liegt daran, dass viele Sprachelemente spezifisch für die verwendete Maschine sind, aber mit dem gerade zu bearbeitenden Problem nichts zu tun haben und insofern vom Programmierer früher oder später als Ballast empfunden werden. Man hat daher schon bald nach der Einführung der ersten elektronischen Rechenanlagen ab ca. 1950 problemorientierte Sprachen entwickelt, die den Benutzer von rechnerspezifischen Details abschirmen. Diese Sprachen sind formalisiert, aber der menschlichen Denk- und Ausdrucksweise angepasst, beispielsweise durch enge Anlehnung an die Schreibweise mathematischer Formeln. Je nachdem wie weit diese Anpassung getrieben wird, spricht man gelegentlich von höheren oder niederen Sprachen.