It is intentional. The IDE would be significantly less beginner friendly if they had to execute two separate processes in sequence in order to accomplish an upload.
The core and library compilations are cached, so you will find that subsequent compilations are quite fast due to only the sketch code having to be compiled.
If you prefer a separation of the two operations, I recommend using Arduino CLI. arduino-cli upload uploads the binary produced by a previous arduino-cli compile command. In cases where the "compile and upload" behavior like the Arduino IDE is wanted, an --upload flag can be added to the compile command
The core and library compilations are cached, so you will find that subsequent compilations are quite fast due to only the sketch code having to be compiled.
If you prefer a separation of the two operations, I recommend using Arduino CLI. arduino-cli upload uploads the binary produced by a previous arduino-cli compile command. In cases where the "compile and upload" behavior like the Arduino IDE is wanted, an --upload flag can be added to the compile command