Statically typed programming languages do type checking (the process of verifying and enforcing the constraints of types
) at compile-time as opposed to run-time. Dynamically typed programming languages do type checking at run-time as opposed to Compile-time.
Strong/Weak typing is about how strictly types are distinguished (e.g. whether the language tries to do implicit conversion from strings to numbers).
Simply put it this way: in a statically typed language the type is static, meaning once you set a variable to a type, you CANNOT change it.
The main advantage here is that all kinds of checking can be done by the compiler, and therefore a lot of stupid bugs are caught at a very early stage.
A language is dynamically typed if the type of a variable is interpreted at run-time. This means that you as a programmer can write a little quicker because you do not have to specify type every-time. Example: Perl, Ruby, Python
Most scripting languages have this feature as there is no compiler to do static type-checking anyway, but you may find yourself searching for a bug that is due to the interpreter misinterpreting the type of a variable