Smart contracts are typically written in high-level languages that targets the Ethereum Virtual Machine (EVM).
If you are familiar with the Java Virtual Machine (JVM), you might know that there are various languages that you can use to produce code that runs on it (ex: Java, Kotlin, Clojure, etc). Similarly, smart contract can be written in any EVM-compatible languages. Most prominently being Solidity and Vyper.
While previously Solidity was the dominant choice with better documentation, tooling, and developer support, Vyper have also recently gained a lot of momentum via large DeFi projects such as Curve and Yearn using it as the smart contract language of their choice.
That said, each language have its own sets of tradeoff and benefits that should go into your consideration when deciding on which one to work with. Check out the resource below with the list of considerations!
Example Codebase in Solidity
Example Codebase in Vyper