Чи завжди інтерпретуються динамічні мови?


18

Переглядаючи більшість (якщо не всі) динамічних мов (наприклад, Python, PHP, Perl та Ruby), всі вони інтерпретуються. Виправте мене, якщо я помиляюся. Чи є приклад динамічної мови, який проходить фазу компіляції? Чи однакова динамічна мова з інтерпретованою мовою?


4
Визначте динамічну мову, чи вона динамічно набирається?
БенджамінB

3
Objective-C виявляє багато "динамічних" властивостей.
Едвард Странд

4
@Job, можна було це робити з Ліспом десятиліттями. І вона одночасно складається і динамічно набирається. Отже, ніколи не було точної межі між складанням та інтерпретацією.
SK-логіка

2
@Darien Ви можете також компілювати це під час виконання та виконувати код згодом. Строго кажучи, це не інтерпретація.
xmm0

3
@Darien Ніщо не заважає компілятору зберігати інформацію таблиці символів у зібраному бінарному та генерувальному коді для доступу до цього під час виконання. Це правда, що деякі мови піддаються інтерпретації більше, ніж компіляції, але вся справа в тому, що можна створити компілятор для цієї мови. Ще одна важлива річ, яку слід зазначити, це те, що деякі люди припускають, що компілятор повинен генерувати якийсь машинний код. На практиці є компілятори, які просто виконують перетворення рівня джерела на двох мовах (або навіть на одній і тій же мові, як деякі міні-міні Javascript).
xmm0

Відповіді:


33

Дивлячись на більшість (якщо не всі) динамічні мови [тобто Python, PHP, Perl та Ruby], всі вони інтерпретуються.

Неправда. Ви можете скласти джерело Python. Це одне екзистенційне підтвердження.

Існують перекладачі для мов статичного типу та компілятори для динамічно набраних мов. Два поняття є ортогональними.

Побічна примітка: Загалом, мова - це саме те, що мова - це набір синтаксичних конструкцій для вираження семантики. Якщо ви пишете Python на дошці, це все ще називається Python! Саме реалізація може бути перекладачем або компілятором. Бути типовим або динамічно типізованим (на зразок гібридом обох) є властивістю мови, а виконання програми інтерпретацією чи компіляцією є властивістю реалізації.


19
З якою точністю повинні відповідати відступи на дошці, щоб Python був синтаксично дійсним? ;)
edA-qa mort-ora-y

1
Не можна компілювати Python. PYC прискорює лише завантаження модуля. І py2exe просто вбудує інтерпретатора в exe разом із вихідним файлом.
БенджамінB

8
@ Ubiquité: .pycфайли є байт- кодом . Розроблений, оптимізований та компільований вихідний код Python для їх створення. Інструкції щодо байт-коду відносно високого рівня, і найпопулярніша його реалізація - це звичайний інтерпретатор (на противагу, подивіться на PyPy, який JIT-компілює байт-код для дуже розумного машинного коду під час виконання), але Python не менш компільований, ніж Java або C #. Python лише "не компілюється", якщо "компіляція" була обмежена до нашої дострокової компіляції , але ніхто нічого про це не говорив, і загалом це може стосуватися будь-якої трансформації мови на мову.

4
@ Ubiquité: Так, це правильно, але це не пов'язане з вашим твердженням про те, що "Ви не можете компілювати Python" або чи можливо компілювати Python. По-перше, ви змішуєте Pythonі CPython, хоча останнє - це реалізація першого, так і є PyPy.
phant0m

2
@ClemC ВСІ властивості мови вбудовуються в компілятор або інтерпретатор, інакше інтерпретатор чи компілятор - це щось для іншої мови.
Пітер Б

15

Звичайний Lisp динамічно (і сильно) набирається і зазвичай складається .

Оскільки ця динамічність досягається під час виконання, існують деякі директиви, які ви можете використовувати у вихідному коді, щоб переконати компілятора, що символ матиме лише певне значення, щоб компілятор міг оптимізувати створений код та підвищити продуктивність.


12

C # 4.0 підтримує динамічні типи (пізньозв'язкові) і він компілюється.


4

node.js базується на двигуні JavaScript V8 від Google. V8 робить компіляцію часу виконання. V8 сліпуче швидко враховуючи цей факт. Просто перегляньте http://shootout.alioth.debian.org і порівняйте V8 з будь-якою з перерахованих вище мов.


3

Ні - це, безумовно, можливо складати динамічні мови.

Існують навіть деякі динамічні мови, які завжди складаються дизайном (наприклад, Clojure).

Питання, однак, стосується важливого спорідненого моменту: хоча динамічні мови можуть бути складені, часто трапляється так, що динамічні мови не можуть бути складені до коду, який є настільки ж ефективним, як і статично набрана мова . Це пояснюється тим, що в динамічних мовах є деякі притаманні функції, які вимагають перевірки виконання, які були б непотрібними в статично складеному мові.

Приклад цього: мови, які дозволяють виконувати виправлення часу виконання об'єктів (наприклад, Ruby), часто вимагають перевірки об'єкта (за допомогою пошуку хештибу чи подібного), коли ви викликаєте метод на об'єкті. Навіть якщо це компілюється, компілятору доведеться генерувати код, щоб здійснити пошук методу під час виконання. Певною мірою пошук цього методу не відрізняється від того, що повинен був зробити перекладач.

Це додає суттєвих накладних витрат у порівнянні з викликом методу на такій мові, як Java, де правильний метод може статично визначити компілятор з визначення класу і звести до простого виклику функції в рідному коді.

Я вважаю, що саме цей ефект більше, ніж усе інше, призводить до того, що динамічні мови мають в середньому повільнішу ефективність, ніж їхні статистично складені аналоги. Як видно з хибних орієнтирів , статично набрані мови (C, Java, Fortran тощо), як правило, найшвидші з динамічними мовами (Perl, Python, Ruby, PHP тощо) в нижній частині рейтингу.


2

Колись інтерпретували BASIC. І деякі варіанти BASIC мали динамічний набір тексту. І ви також можете отримати компілятори для них.

(Це було ще в часи дискети на 100 К, коли динозаври ще блукали землею і їли на сніданок не підозрюючих розробників.)


... але лише тоді, коли вони використовували GOTO. (Що, звичайно, було досить часто, якщо вони розвивалися в ОСНОВІ. АХА! Це пояснює це!)
Мейсон Уілер

BASIC у свій час проектування була мовою складання.
AProgrammer

2

Різні реалізації Smalltalk вирішують це по-різному, але декілька з них компілюються в байт-коди, які працюють на високоефективній програмі VM.


2

Насправді більшість так званих "інтерпретованих" мов проходять / дозволяють вчасно скласти компіляцію, щоб зробити її швидшою. І деякі з них повинні бути скомпільовані в байт-код, перш ніж ви зможете їх запустити.

Насправді динамічні та інтерпретовані - це абсолютно дві різні ідеї, хоча є кореляція. Тому що коли-небудь відчуває, що динамічне введення полегшує їх роботу легше і швидше, вони не заперечують проти того, щоб код працював трохи повільніше, але був портативний.


1

Chrome, IE9 та Firefox 3.1+ новіші компілюють JavaScript у рідні бінарні файли, а JavaScript динамічно набирається.

Я думаю, що причина динамічних мов, що історично прагнуть інтерпретувати, полягає в тому, що динамічне введення та інтерпретація (а точніше відсутність компіляції) обидві, як правило, корисні для мов скриптування та загальних сценарій.

Продуктивність також не викликає особливих проблем щодо програм, які були написані цими мовами, тож, знову-таки, динаміка набору тексту та інтерпретації не була такою проблемою, як на мовах що цінні показники.


1

Як правило, компілюється Python. Допустимо, компілюється в байт-код, який потім інтерпретується.

Perl працює аналогічно.

Звичайний Lisp, як правило, компілюється в один з рідних або байтових кодів. Це відрізняється між реалізаціями (і певною мірою всередині реалізації, залежно від різних параметрів оптимізації).


-5

Так. Усі динамічні мови - це інтерпретована мова (але інтерпретована мова може бути нединамічною).

Причина проста: якщо вона динамічна, їй потрібен інтерпретатор, щоб виконувати динамізм на рівні бінарної компіляції.

колишній : коли ми поміщаємо дані у змінну PHP, то пізніше ще одного іншого типу, наша програма не може компілюватись у двійковий код, оскільки кожен тип має свій бінарний формат представлення; інтерпретатор динамічно управляє змінами на бінарному рівні


2
Неправильно. Динамічні мови можна складати (а іноді і дуже ефективно, наприклад, використовуючи JIT та адаптаційні методи компіляції)
Basile Starynkevitch

"Приблизно, компіляція JIT поєднує швидкість компільованого коду з гнучкістю інтерпретації, накладними витратами інтерпретатора ..." en.wikipedia.org/wiki/Just-in-time_compilation ваша програма не компілюється: вона складена перекладач для вас
ClearMind

Прочитайте документи, пов'язані з САМО
Базиле Старинкевич

Звичайно. У вашому посиланні згадується: "Однією з особливостей Self є те, що він базується на тій самій системі віртуальної машини, що і раніше використовувались системи Smalltalk. Тобто, програми не є окремими об'єктами, як вони є на таких мовах, як C, але потребують їх все середовище пам'яті для того, щоб запустити. " не окрема = не скомпільована двійкова віртуальна машина потрібна для виконання двійкової компіляції
ClearMind

1
Ваше визначення компілятора є занадто обмежуючим. Не кожен компілятор створює двійковий виконуваний файл. Для недавнього контрприкладу вивчіть реалізацію SBCL . Читайте останню книгу Дракона та ляскайте маленькими шматками
Базиль Старинкевич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.