Compiled programming languages allow earlier error checking, better enforcement of programming styles, and generation of more efficient object code than interpreted languages, where all type-consistency checks are performed at run time. However, even in compiled languages, there is often the need to deal with data whose type cannot be determined at compile time. In such cases, a certain amount of dynamic type checking is required in order to preserve type-safety.
Type safety is synonymous with one of the many definitions of strong typing; but type safety and dynamic typing are mutually compatible, strong typing is used to describe those situations where programming languages specify one or more restrictions on how operations involving values having different data types,