Так Так. Це чергове запитання про різницю між компілятором і інтерпретатором ЯП. Тільки відповіді, які зазвичай даються мене не задовольняють.
Зазвичай кажуть, компілятор переводить код на будь-якому ЯП в виконуваний і вже при виконанні код відразу виконується безпосередньо процесором. У разі інтерпретатора, в процесі виконання програми спеціальна програма інтерпретатор зчитує вихідний код програми по рядках та виконує його. Крок за кроком. При цьому йдеться, що мовляв компілятори не так-то просто ще написати.
Власне питання ось у чому. Якщо в результаті програма виконується, то яка по суті різниця виконується відразу машинний код, або спочатку інтерпретатор щось робить з вихідним кодом, а вже потім виконує його - в результаті щось процесор виконує такі ж інструкції машинні. Яка тоді різниця? Явно ж не в тому, що компілятор зберігає машинний код в файл заздалегідь, а інтерпрететор немає) Ну припустимо я розумію, що при інтерпретації програми з if-ами якась частина ніколи може бути і не виконана, а відтак не переведена в машинний код . Але, знову ж таки, напевно не в цьому проблема, що складно перевести всі if-и в машинний код заздалегідь, тобто скомпілювати код.
Коротше, в чому ще відмінності і складності реалізації компілятора на відміну від інтерпретатора?
Інтерпретатор не займається генерацією машинного коду. Замість цього він викликає для кожної інтерпретується команди спеціальну функцію (яка входить у коду інтерпретатора), яка і роблять всю роботу.
Компілятор ж (як звичайний, так і JIT) спочатку генерує машинний код, який потім згодовується процесору для безпосереднього виконання.
Компілятор робить всю роботу один раз (при складанні програми), а інтерпретатор - кожен раз при читанні черговий інструкції. Тобто при компіляції накладні витрати виконання менше, а отже, вище швидкість роботи кінцевого коду.
Тепер щодо складності реалізації компілятора. Інтерпретатор просто бере і виконує чергове вираз програми; а як виконає - тут же забуває про нього (зрозуміло, попередньо зберігши результат). Компілятор ж змушений мислити більш глобально: тут і оптимізації, і межмодульного імпорт / експорт сутностей (адже програма може складатися з безлічі файлів вихідних кодів). На додачу, компілятор повинен дотримуватися певних угод і стандартів для взаємодії з іншими інструментами (компоновщиком, наприклад); інтерпретатор ж є «річчю в собі», що робить всю роботу самостійно.
"Компілятором і інтерпретатором" - не зовсім коректне питання. Речі абсолютно різні. Компілятор - перетворює вихідний код в виконуваний (машинний, який буде виконуватися процесором або який-небудь проміжний, який буде виконуватися віртуальної виконуючою середовищем). Інтерпретатор ж виконуємо вихідний код. Бачите різницю. Компілятор перетворює (компілює), а інтерпретатор виконує (інтерпретує). Можливо ви хотіли інакше поставити питання: в чому відмінність компільованих яп від інтерпретованих. Різниця очевидна: другі можна виконувати як є і для цього не потрібно додаткових інструментів. Ну в загальному спробую підсумувати: в кінцевому рахунку так, в кінцевому рахунку ми маємо зміна стану процесора, реального фізичного процесора і до цього зводиться виконання будь-якої програми. Але відмінності адже є: 1) компільовані мови вимагають спеціальних інструментів (компіляторів), кінцевий продукт частково захищений і складно отримати вихідний код, кінцевий продукт більш компактний. так як складається з бінарних інструкцій, а не з людино зрозумілих - слів. Кінцевий продукт виповнюється швидше - бо він описаний інструкція, які безпосередньо підтримуються цільової платформою. 2) інтерпретована мова виповнюється як є - не вимагає доп. інструментів для доведення до фінального стану, не захищений - будь-хто може вкрасти і змінити. Я розумію, що написав очевидні речі. Я просто не розумію що ви взагалі крім цього хочете почути.
Якщо про складність, то компілятор і інтерпретатор можуть бути однаково складні в написанні. Якщо мова складний, то в будь-якому випадку його буде складно розбирати на лексеми, не має значення для якої мети для виконання або компіляції. Ну лише той момент, що перед комплятором завжди буде стояти завдання приведення інструкцій до якоїсь канонічної, придумана не вами формі