Espero poder ayudarte con esta respuesta: Cuando tu intentas ejecutar un programa que escribiste en un lenguaje de programación como java, c o c++ entre muchos otros, debes pasar por un proceso que se llama compilación. De forma muy resumida la compilación consiste en una "verificación" de todas las instrucciones que están escritas, pero no de la lógica y/o flujo de datos del programa, por lo cual SI Y SOLO SI todas las instrucciones del programa están escritas correctamente de acuerdo a las reglas de ese lenguaje es que te permite ejecutar tu programa. Ojo, esto no implica que al estar revisado el programa no habrá fallas y esto es debido a que el compilador hace una revisión de la sintaxis del programa y no de toda la lógica de programación que intentaste usar. Y una de esas reglas de los lenguajes de programación de tipado estático, como los que mencione al principio, es que las variables deben definirse antes de usarse y deben cumplir esta regla cuando el compilador las revisa, de lo contrario no se ejecutara el programa.
Mientras, en un lenguaje de tipado dinámico, uno no necesita de un compilador que revise la sintaxis para poder ejecutar el programa y por lo tanto tampoco es esencial cumplir la regla de declarar una variable antes de usarla. en estos lenguajes de tipado estático no hay un compilador si no un interprete del lenguaje de programación. Algunos ejemplos pueden ser lenguajes como JavaScript, php, python.
Luego, HTML es un lenguaje de marcado de hipertexto, no un lenguaje de programación, pero si necesita un interprete, el cual siempre es un navegador web por lo cual podría seguir la filosofía de un lenguaje de programación dinámico, aun que no sea un lenguaje de programación, como lo mencione.
Así que en resumen, un lenguaje estático usa un compilador y uno dinámico un interprete. mientras que un compilador analiza primero el código para después ejecutarlo, un interprete va leyendo y comprendiendo las instrucciones conforme se va ejecutando el programa o script.
por otra parte, un lenguaje de tipado débil son aquellos que no necesitan que se defina el tipo de dato que se guardara en una variable o constante. mientras que en en un lenguaje de tipado fuerte si necesitas definir que tipo de datos sera el que almacenaras. Hay muchos tipos de datos, y depende del lenguaje la variedad de tipos de datos.
Espero haberte ayudado, saludos