Basic elements could be processors, such as DSPs microprocessors, memories, ASICs of any kind, hardware accelerators etc.
There are several ways to connect them together, but an example could be you have a main bus with memories, one DSP and one microprocessor connected to the bus.
Then you let the microprocessor control everything (master host processor), this one sends commands to the DSP (slave co processor) to do some calculations on data stored in the memories, and DSP stores the results back in the memories.
There is an infinite number of ways you can build your system but the main thing is you need something to control the flow, a microprocessor for example, who gives instructions to other units and keep track of everything. Like where data and results are stored so that nothing important is overwritten by another unit.
All units, DSPs and microprocessors etc have a program memory from where its own code is executed, then there are memories and register files from where the units gets and stores the data which are processed.
The language could be any, in the end it all breakes down to assembly code which in turn breaks down to 0s and 1s in the program memory of the CPUs.
But if you need fast and optimized code like for a DSP the best thing is to write directly in assembler (if you have time

since a C-compiler of whatever may produce redundant code.