What is the exact border between the static and dynamic languages?
There is no precise border, and indeed, no precise definition of what these terms mean.
The only thing that makes even the slightest sense is the type system: does the language have a static type system? If yes, it is a "static" language. If not, it is "dynamic". (However, that doesn't imply "dynamic" > "static" though. And indeed, it is sometimes felt that dynamic (typed) languages are static (typed) languages.
None of the other features in your list can be used to categorize languages, since they are properties of implementations:
Compilation or interpretation
Most languages have both compilers and interpreters, or a combination of the two (a JIT). This is an implementation mechanism.
Most languages support some form of runtime metaprogramming, through the reflection of data to code at runtime, and support for integrating code into a running process (Haskell, Lisp, Python, Java, ...). Runtime code generation support is a nice feature, but doesn't make a language or implementation "dynamic".
I assume you mean an
eval like mechanism, for reflecting data to code, and running it. See the above point.
So, for any combination of these features there is a language that supports that combination, with a static type system, and with a dynamic type system. As a result, this is a vague and unsuitable way to categorize languages and implementations.
More useful is to ask:
- does the language support runtime meta-programming?
- does the language have a static type system?
These are useful considerations when looking at a language.