The device tree source code is compiled by the dtc tool to the compact binary form expected by the of_xxx() routines. The tool finds and publicizes errors, albeit sometimes with cryptic messages.
My current work is with products that use u-boot as the bootloader. u-boot takes the binary device tree, adds decorations to reflect the hardware (e.g., describing the amount of installed system RAM), then passes it to the Linux kernel.
It's true that a single system-on-chip processor has a constant part. But it may be one of a large family of such chips. It can be easier to describe the individual components of the SOC in the device tree (e.g., there are PCI Express ports at addresses X and Y and an Ethernet port at Z) than to prepare a code module for each chip.