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.
Solidity vs. 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!
Smart contract languages | ethereum.org
Solidity References
Documentation
Solidity – Solidity 0.8.3 documentation
Example Codebase in Solidity
Vyper References
Documentation
Example Codebase in Vyper