Основні принципи програмування компільовані й інтерпретовані мови

Як і в попередній статті цього циклу, я хочу звернути вашу увагу на ключові принципи програмування, які впливають на все те, що ми робимо, але з якими ми рідко стикаємося безпосередньо і тому не до кінця їх розуміємо. Тема сьогоднішньої статті - компільовані й інтерпретовані мови.
Будучи розробниками, ми часто стикаємося з такими поняттями, як компілятор і інтерпретатор, але я вважаю, що багато хто не зовсім розуміють, що вони означають. Тим часом, компіляція і інтерпретація - це основи роботи всіх мов програмування. Давайте поглянемо на те, як насправді влаштовані ці поняття.
вступ
Ми покладаємося на такі інструменти, як компіляція і інтерпретація, щоб перетворити наш код в форму, зрозумілу комп'ютеру. Код може бути виконаний нативної, в операційній системі після конвертації в машинний (шляхом компіляції) або ж виконуватися через підрядник іншою програмою, яка робить це замість ОС (інтерпретатор).
Компільований мову - це така мова, що програма, будучи компільованою, містить інструкції цільової машини; цей машинний код незрозумілий людям. Інтерпретується ж мова - це такий, в якому інструкції не виконуються цільової машиною, а зчитуються і виконуються іншою програмою (яка зазвичай написана на мові цільової машини). Як у компіляції, так і у інтерпретації є свої плюси і мінуси, і саме це ми і обговоримо.
Перш ніж ми продовжимо, варто відзначити, що багато мов програмування мають як компільованих, так і интерпретируемую версії, тому класифікувати їх важко. Проте, щоб не ускладнювати, надалі я буду розділяти компільовані й інтерпретовані мови.
компільовані мови
Головна перевага компільованих мов - це швидкість виконання. Оскільки вони конвертуються в машинний код, вони працюють набагато швидше і ефективніше, ніж інтерпретовані, особливо якщо врахувати складність тверджень деяких сучасних скриптових різних мов.
Низькорівневі мови як правило є модульна, оскільки ефективність зазвичай ставиться вище платформ. Крім того, компільовані мови дають розробнику набагато більше можливостей в плані контролю апаратного забезпечення, наприклад, управління пам'яттю і використанням процесора. Прикладами компільованих мов є C. C ++. Erlang, Haskell і більш сучасні мови, такі як Rust і Go.
Проблеми компільованих мов, в общем-то, очевидні. Для запуску програми, написаної на компільовані мови, її спершу потрібно скомпілювати. Це не тільки зайвий крок, але і значне ускладнення налагодження, адже для тестування будь-якої зміни програму потрібно компілювати заново. Крім того, компільовані мови є платформо-залежними, оскільки машинний код залежить від машини, на якій компілюється і виконується програма.
інтерпретовані мови
На відміну від компільованих мов, інтерпретується для виконання програми не потрібен машинний код; замість цього програму порядково виконають інтерпретатори. Раніше процес інтерпретації займав дуже багато часу, але з приходом таких технологій, як JIT-компіляція. розрив між компільовані і інтерпретуються мовами скорочується. Прикладами різних мов є PHP. Perl. Ruby і Python. Ось деякі з концептів, які стали простіше завдяки інтерпретується мов:
Основним недоліком інтерпретованих мовою є їх невисока швидкість виконання. Проте, JIT-компіляція дозволяє прискорити процес завдяки переведенню часто використовуваних послідовностей інструкції в машинний код.
Бонус: байткод-мови
Байткод-мови - це такі мови, які використовують для виконання коду як компіляцію, так і інтерпретацію. Java і фреймворк .NET - це типові приклади байткод-мов. Насправді, Java Virtual Machine (JVM) - це настільки популярна віртуальна машина для інтерпретації байткода, що на ній працюють реалізації декількох мов. До речі, недавно стало відомо. що в новій версії Java буде також підтримуватися і статична компіляція.
У байткод-мові спершу відбувається компіляція програми з человекочітаемого мови в байткод. Байткод - це набір інструкцій, створений для ефективного виконання інтерпретатором і складається з компактних числових кодів, констант і посилань на пам'ять. З цього моменту байткод передається в віртуальну машину, яка потім інтерпретує код також, як і звичайний інтерпретатор.
При компіляції коду в байткод відбувається затримка, але подальша швидкість виконання значно зростає в силу оптимізації байткода. Крім того, байткод-мови є платформо-незалежними, перевершуючи при цьому по швидкості інтерпретовані. Для них також доступна JIT-компіляція.
висновок
Багато мови в наші дні мають як компільовані, так і інтерпретовані реалізації, зводячи різницю між ними нанівець. У кожного виду виконання коду є переваги і недоліки.
Якщо коротко, компільовані мови є найефективнішими, оскільки вони виконуються як машинний код і дозволяють використовувати апаратне забезпечення системи. Однак це вводить додаткові обмеження на написання коду і робить його від платформи залежним. Інтерпретуються же язики не залежать від платформи і дозволяють використовувати такі техніки динамічного програмування, як метапрограмування. Проте, в швидкості виконання вони значно поступаються компільовані мов.
Байткод-мови, в свою чергу, намагаються використовувати сильні сторони обох видів мов, і у них це непогано виходить.