Solidity compiles into Bytecode.
Smart Contract languages on Tezos compile into Michelson.
Ethereum uses EVM(Ethereum Virtual Machine) as the system, smart contract code written in high-level languages needs to be compiled into EVM bytecode and Contract ABI to be run. EMV Bytecode is an executable code on EVM and Contract ABI is an interface to interact with EVM bytecode. For example, if you want to call a function in a smart contract with your JavaScript code, ABI plays a role as an intermediary between your JavaScript code and EVM bytecode to interact with each other.
This diagram shows the architecture of Contract ABI, EVM bytecode and outside components(dApp and network). The left side is a process of compiling and the right side is interacting.
But how exactly does this work in Tezos with Michelson? Michelson makes sure that everything is executed as it should before modifying the storage. Solidity will modify the storage. Is this the big advantage over Solidity and the Bytecode?