Language isn't wasteful. All of that extra information allows for error correction. You can infer what
*r* **u *k**?
means. Longer messages can be easier to decode, for similar reasons stated above in this thread. A lot of information is contained in the language outside of the character set, which is necessary for decoding. It asks a lot of the decoder to know everything necessary, but allows for relatively robust communication.