Ваша классификация языков программирования точь-в-точь такова, как классификация животных из древне-китайской энциклопедии: :) "Животные подразделяются на: а) принадлежащих императору, б) бальзамированных, в) прирученных, г) молочных поросят, д) сирен, е) сказочных, ж) бродячих собак, з) включенных в нашу классификацию, и) буйствующих, как в безумии, к) неисчислимых, л) нарисованных очень тонкой кисточкой из верблюжьей шерсти, м) и прочих, н) только что разбивших кувшин, о) издали кажущихся мухами".
Типа того, что формально классификация построена, но толку от нее никакой. Разве что только для философствования на диване.
Тогда как реально языки программирования четко делятся лишь на процедурные и непроцедурные. Процедурные - все те, которые задают последовательность действий для процессора. А непроцедурные - те, где человек описывает свои пожелания (то, что хочет получить), а программу для этого составляет сам компилятор (хотя в этом случае из компиляторов он уже сильно вырос). Однако в эмбеддерской жизни непроцедурные языки едва ли когда-либо встретятся, а потому и от этой классификации толку тоже нет. А стало быть, утверждение "Программа является последовательностью инструкций" недалеко от истины.
Всевозможные прерывания, как аппаратные, т.к. и программные (по результатам проверки условий) по своей сути есть лишь варианты реализации ВЕТВЛЕНИЯ программного кода. А потому в данном случае термин "конечный автомат" является не антиподом последовательности инструкций, а одной из конструкций, той же последовательностью инструкций реализуемую. Всё остальное - вкусовщина, предназначенная для дисциплинирования программиста и обеспечения "блочности" кода.