You have both operational and denotaional semantics in all languages.
Operational semantics are "what does this code do," and denotaional semantics are "what does this code mean" in a more abstract sense.
In an imperative language, what a given piece of code means is "execute these instructions," so the denotaional semantics are basically equivalent to the operational semantics.
But for higher level languages, these kinds of semantics can differ. For example, in Prolog, the denotaional semantics of a given clause boils down to some formula of predicate logic, while the operational semantics is that a Prolog interpreter will perform a depth first search through the formulas to find acceptable bindings to the variables.
You can imagine another language using the same syntax as Prolog where the denotaional semantics still boils down to formulas of logic, but the operational semantics might be a breath first search through those formulas.
In other words, the denotaional semantics are the more abstract meaning of the code (like, does this code represent data, or formulas, or instructions, or something else) and the operational semantics are the more concrete meaning of the code, i.e. what should happen when the code is executed.
Generally, the denotaional semantics are what you are using in the higher level optimizers, and the operational semantics are what you are using in the lower level optimizers.