Так і ні. Так, класичний сценарій - це розробник, який використовує компілятор для створення машинного коду з вихідного коду, а машинний код потім поширюється на користувачів.
Там є кілька винятків з цього , хоча. По-перше, багато проектів з відкритим кодом розповсюджуються головним чином (або навіть виключно) у формі вихідного коду, і очікує, що кінцевий користувач встановить їх, ввівши пару команд, як, make
а потімmake intall
. Це дозволить викликати компілятор, лінкер тощо для створення машинного коду з вихідного коду для цього комп'ютера користувачів. Однак у цих випадках процес створення та встановлення автоматизований (принаймні призначений для) автоматизований до того, що користувачеві рідко потрібно багато знань про нього, крім того, що якщо вони ніколи раніше не встановлювали пакет лише для вихідного коду , їх менеджер пакунків, як правило, перераховує певний пакет "розробки" як необхідну умову для встановлення додатка, який їм дійсно важливий (хоча деякі досі вважають це недружньою для кінцевих користувачів).
Інший виняток (на який натякали, але не дуже добре пояснено в інших відповідях, які я бачив) - це щойно вчасно (JIT) компілятори. Кілька очевидних прикладів компіляторів JIT - це загальна мова виконання (CLR) Microsoft і віртуальна машина Java (JVM). У цих випадках зазвичай є два абсолютно окремих компілятори, які беруть участь у перекладі вихідного коду в машинний код. Один використовується розробником. Однак замість того, щоб генерувати машинний код безпосередньо, він генерує машинно-незалежний байт-код. Потім CLR / JVM включає в себе другий компілятор, повністю відокремлений від першого, який перетворює ці байтові коди в машинний код для цільового комп'ютера.
Додам, що другий компілятор не є строго необхідним. Ранні версії JVM (для одного прикладу) просто інтерпретували байтові коди, а не компілювали їх. Це часто несе в собі досить серйозне покарання за продуктивність, тому більшість останніх JVM, призначених для використання у виробництві, включають компілятор JIT.