By definition, an
ABI (or Application Binary Interface) is the interface of interoperability of compiled software (hence binary).
In EVM smart-contracts need to be compiled from e.g. _index to EVMs bytecode. The smart contract is just this sequence of bytecode. To access functions defined in high-level languages, users need to translate names and arguments into byte representations for byte code to work with it. The ABI documents these names and types precisely, easily parseable format, doing translations between human-intended method calls and smart-contract operations discoverable and reliable.
In other words, when you compile your smart contract, the compiler spits out a bunch of files needed that lets you interact with the contract. The files are basically the ABI.
In Hardhat compiled ABI lies under