A semiotic approach to programming