You can write smart contracts in any language you want. Think of them simply instructions on how to modify the state of the decentralized database. You can accomplish this in any language as long as the nodes are able to run your instructions.
As a side note, don't think of the Ethereum Virtual Machine as a virtual machine in the traditional sense; this will lead to a lot of confusion. I suggest taking a look at the white paper. It's fairly straight forward as an overview, and if you're feeling adventurous, the yellow paper is a more formal description.