Here's a very simple trick that works for programming languages with a C-style syntax: strip out everything except parentheses, braces, and semicolons and compare. I know that it was used successfully in an algorithms course (shortest paths, flows, that kind of stuff) which had stand-alone implementations of the algorithms as assignments.
Edit: Of course there was a manual inspection step involved as well, this matching process was only used to flag suspicious instances.
And I wouldn't punish cheating in those courses directly: Just add the requirement that people need to be able to explain their solutions however they arrived at them. Being able to explain other people's code is a useful skill, too.
Edit: Of course there was a manual inspection step involved as well, this matching process was only used to flag suspicious instances.