Declarative Programming is one of the major programming paradigms. Declarative Programming is often defined in contrast to Imperative Programming. In Imperative Programming the programmer defines how a program should work. In Declarative Programming the programmer defines what the outcome of the program should be. There is implicitly more room for interpretation by the compiler in a declarative program than in an imperative program.
Computer Assembly Languages are absolutely imperative languages. Assembly Languages define how a program should operate at the most specific level without crossing the hardware/software boundary. Programmable Circuits are similarly imperative languages that do cross the hardware/software boundary.
Functional Programming is one of the many possible abstractions in Declarative Programming. In Functional Programming the programmer uses functional composition to declare a desired outcome of a program. There are many possible implementation choices that a compiler can make when implementing a functional program. The irreducible semantic component of Functional Programming is the concept of a value passed to a function, performing some operation, then returning a value. As long as the compiler satisfies these semantic contracts when choosing an implementation, the program will not "go wrong" by definition.