▁check er , ▁then ▁the ▁program ▁is ▁guaranteed ▁to ▁satisfy ▁some ▁set ▁of ▁type ▁safety ▁properties ▁for ▁all ▁possible ▁inputs . ▁ ▁St atic ▁type ▁checking ▁can ▁be ▁considered ▁a ▁limited ▁form ▁of ▁program ▁ver ification ▁( see ▁type ▁safety ), ▁and ▁in ▁a ▁type - safe ▁language , ▁can ▁be ▁considered ▁also ▁an ▁optimization . ▁If ▁a ▁compiler ▁can ▁prove ▁that ▁a ▁program ▁is ▁well - ty ped , ▁then ▁it ▁does ▁not ▁need ▁to ▁emit ▁dynamic ▁safety ▁checks , ▁allowing ▁the ▁resulting ▁compiled ▁binary ▁to ▁run ▁faster ▁and ▁to ▁be ▁smaller . ▁ ▁St atic ▁type ▁checking ▁for ▁T uring - complete ▁languages ▁is ▁inher ently ▁conserv ative . ▁That ▁is , ▁if ▁a ▁type ▁system ▁is ▁both ▁sound ▁( mean ing ▁that ▁it ▁reject s ▁all ▁incorrect ▁programs ) ▁and ▁decid able ▁( mean ing ▁that ▁it ▁is ▁possible ▁to ▁write ▁an ▁algorithm ▁that ▁determ ines ▁whether ▁a ▁program ▁is ▁well - ty ped ), ▁then ▁it ▁must ▁be ▁incomplete ▁( mean ing ▁there ▁are ▁correct ▁programs , ▁which ▁are ▁also ▁rejected , ▁even ▁though ▁they ▁do ▁not ▁encounter ▁runtime ▁errors ). ▁For ▁example , ▁consider ▁a ▁program ▁containing ▁the ▁code : ▁ ▁if ▁< complex ▁test > ▁then ▁< do ▁something > ▁else ▁< signal ▁that ▁there ▁is ▁a ▁type ▁error > ▁ ▁Even ▁if ▁the ▁expression ▁< complex ▁test > ▁always ▁evalu ates ▁to ▁true ▁at ▁run - time , ▁most ▁type ▁check ers ▁will ▁reject ▁the ▁program ▁as ▁ill - ty ped , ▁because ▁it ▁is ▁difficult