tl;dr: different words for the same thing in different communities / circumstances.
The process of translating a program from one language A into another language B (or even the same language) is called compilation, and the program which performs this process is called a compiler.
Note: some people only use the term compilation if B is perceived as lower-level than A. Some people are even more strict and only call it compilation if B is some sort of binary machine language.
However, there are some specialized terms that are used in some circumstances.
If A == B, the process is sometimes called optimization, obfuscation, minimization, or pretty-printing, depending on what the goal of the process is.
If A is perceived to be lower-level than B, it is sometimes called decompilation. (And if A is some form of binary machine code and B is an assembly language, it is called disassembly).
If A is an assembly language and B is some form of binary machine code, it is called assembly.
If A and B are roughly on the same level of abstraction, and especially if the resulting B program is intended to be human-readable and idiomatic, it is called translation or source-to-source translation.
If A is some sort of macro or template language, it might be called expansion.
The term synthesis is specific to electronics engineering and refers to synthesizing an electronic system from a mathematical model, as opposed to the more traditional approach of engineering a system first and later modeling it mathematically. (I think the term is also used in Model-Driven Development in analogy to electronics.)