Интерпретирован против скомпилирован против позднего обязательства

StackOverflow https://stackoverflow.com/questions/2881526

Вопрос

Python скомпилируется в промежуточный байт-код (PYC), а затем выполняется. Таким образом, есть компиляция, а затем интерпретация. Тем не менее, давние пользователи Python говорят, что Python является «поздним» языком, и что он должен быть называется интерпретированным языком.

  1. Как бы Питон был отличным от другого интерпретированного языка?

  2. Не могли бы вы сказать мне, что «поздние» означает, в контексте Python?

Java - это еще один язык, который сначала имеет исходный код, компилируемый в Bytecode, а затем интерпретируется в Bytecode.

  1. Является ли Java интерпретированным / скомпилированным языком?

  2. Как это отличается от Python с точки зрения компиляции / исполнения?

  3. Ява говорят, что не имеет «позднего обязательства». У этого есть что-нибудь связано с программами Java, будучи всего быстрее, чем Python?

Было бы здорово, если бы вы могли также дать мне ссылки на места, где люди уже обсуждали это; Я хотел бы прочитать больше на этом. Спасибо.

Это было полезно?

Решение

Поздние связывания - очень разная концепция для интерпретации.

Строго говоря, интерпретируемый язык выполнен непосредственно из источника. Он не проходит через стадию компиляции байта. Путаница возникает, потому что программа Python является Переводчик, но он интерпретирует байт-код, так что это язык байта Python, который вы бы описали как «интерпретируемые». Сам языка Python является скомпилированным языком.

В отличие от Java Bytecode, в отличие от интерпретации, так и компиляции в наши дни. Он скомпилирован в нативный код с помощью JIT-компилятора, а затем запустить непосредственно на оборудовании.

Позднее связывание - это свойство системы типа и присутствует на большинстве языков в некоторой степени, независимо от того, интерпретируются ли они или компиляция.

Другие советы

Как бы Питон был отличным от другого интерпретированного языка?

Это связано с расщеплением волос. Интерпретаторы языки и «Управляемый код» Языки, такие как C # и языки виртуальной машины (например, Java), образуют странный континуум. Есть люди, которые скажут это все Языки «интерпретированы» - даже машинный язык. В конце концов, электронные схемы процессора «интерпретировать» машиностроительный язык.

Лучше всего вы можете сделать, это сказать, что «интерпретируется» означает, что есть видимый слой программного обеспечения интерпретации ваших приложений байтов. «Не интерпретируется» означает, что ваше программное обеспечение (более или менее) непосредственно выполняется основным аппаратным обеспечением. «Управляемый код» люди свободны, чтобы продолжать разделить эти волосы.

Не могли бы вы сказать мне, что «поздние» означает, в контексте Python?

Переменные не объявлены, чтобы иметь тип. Переменная связана с типом настолько поздно - с назначением фактического объекта.

Является ли Java интерпретированным / скомпилированным языком?

да. Он скомпилирован к байтовым кодам. Коды байтов интерпретируются. Я предпочитаю называть это интерпретированным.

Однако люди будут (для действительно неясных причин) не согласны. Наличие любого рода «компиляционный» шаг - однако минимальный - всегда путает людей. Перевод в байтовый код почти не имеет отношения к фактическому поведению программы во время выполнения. Некоторые люди любят сказать, что Только Языки, которые есть полностью Свободно от любых приложений предварительной обработки «компиляция» можно интерпретировать. Несколько примеров этого больше нет, так как многие языки переводятся с человеческими удобствами для переводчиков для переводных кодов байтов. Даже AppleSoft Basic (обратно в 80-е годы) имел этот вид перевода, который вы набирали код.

Некоторые JVM DO JIT. Некоторые нет. Некоторые смесь. Сказать, что JVM только для Jit Byte-Code перевод неверно. Некоторые JVM делают. Некоторые нет.

Как это отличается от Python с точки зрения компиляции / исполнения?

Нисколько. Java VM может выполнить Python. [Для легко смущенного слово «Python» в этом контексте не может означать «Python Source». Это должно означать Python Bytecode.

Ява говорят, что не имеет «позднего обязательства». У этого есть что-нибудь связано с программами Java, будучи всего быстрее, чем Python?

Возможно. Программы Java часто быстрее из-за компиляторов JIT, которые переводят код Java Byte в машинный код во время выполнения.

Статическое («раннее») обязательное обязательство не имеет такого же пользы для Java, что он имеет по-настоящему скомпилированным языком, таким как C или C ++, где практически нет проверки выполнения любого вида. Java по-прежнему делает такие вещи, как проверка границ массива, которые опускают в интересах сырой скорости.

На самом деле есть маленькая штраф для «позднего» привязки. Атрибуты и методы Python решаются с использованием простых поиска словаря. Словарь - это хэш; Производительность довольно хорошая. Хэси для имени могут быть помещены в «интернированную» строку буквального пула амортизации стоимости вычисления хэша.

Для реального веселья посмотрите пикируют и рьто. Это интерпретатор Python, который может делать JIT Compilation. Вы заводили 2-уровня переводчика. Ваш код интерпретируется Pypy. Pypy интерпретируется RYPHON. http://alexgaynor.net/2010/may/15/pypy-future-python/

Есть связь между тем, что мы называем Время привязки и концепция Интерпретация / Компиляция.

Время связывания - это время, когда символическое выражение связано с его конкретным значением. Более того, связанные с определением языка программирования, например, динамические против статического определения переменных. Или статический метод против виртуальных методов или динамических набрав по сравнению со статическими наборами.

Затем приходит реализация языка. Чем больше информации статически известна аванс, тем легче написать компилятор. Ожидательно, чем более поздние связанные язык, тем сложнее это. Следовательно, необходимость полагаться на интерпретативные методы иногда.

Различие между обоими не строгими, однако. Можем ли мы рассмотреть вопрос о том, что все в конечном итоге интерпретируется (см. S.Lott Review), но часть кода может быть скомпилирована, декомпилировать или перекомпилировать динамически (например, JIT), делая различие очень нечеткое.

Например, нагрузка динамического класса в Java идет в категории «Поздние привязки»: Набор классов не зафиксирован один раз для всех, а классы могут быть загружены динамически. Некоторые оптимизации могут быть сделаны, когда мы знаем набор классов, но нужно будет быть недействительным, как только будет загружен новые классы. То же самое происходит с возможностью обновления метода с отладкой инфраструктурой: JVM потребуется де оптимизацию всех сайтов вызовов, был установлен метод включен.

Я не знаю много о Python, но практикующие Python предпочитают, возможно, термин «поздно связан», чтобы избежать такой путаницы.

Я думаю, что общее заблуждение, что Python интерпретируется, когда Java скомпилирован, возникает, потому что Java имеет явный шаг компиляции - вам необходимо запустить Javac, чтобы преобразовать исходный файл .java в файл bytecode.

Поскольку вы правильно указываете на Python, аналогично компилировали исходные файлы в Bytecode, но он делает это прозрачно - компиляция и работа, как правило, выполняется за один шаг, поэтому он менее очевиден для пользователя.

Важным отличием находится между ранним и поздним связыванием и динамическими и статическими наборами. Компилированное / интерпретируемое различие бессмысленно и не имеет значения.

Время привязки - это когда имена решаются в вещи. Более динамические языки имеют тенденцию к поздней привязке. Это может быть отделено от интерпретации / компиляции - например, методы объекта-C решаются поздние и динамически по сравнению с C ++. Java делает большую часть этого привязки во время нагрузки класса: позже, чем C, но раньше, чем Python.

Моя любимая цитата от компьютерного контрамного спора Stan Kelly-Bootle:

время связывания n. Момент, когда таблица хэша становится поврежденным.

==> Достижения в вычислениях могут быть сопоставлены против «опоздания привязки», что заставляет меня думать о своих собственных так называемых CS так называемой карьеры: Золотое прошлое, серое настоящее и розовое будущее. Это моя версия оптимизма синге: трава зеленее, кроме как при t = 0. На EDSAC i мои функции (5CH бумажные ленты подпрограммы) были пробиты, сращены и связаны примерно за две недели до ввода. Это известное привязку и привязку к дефиците с упругими полосами. Фортран пришел дальше с новым видом связывания: Сумные колоды карт, которые отказались быть перетасовываться. Затем с ALGOL и C я наслаждался связыванием статического (совокупности), пока C ++ не привел обезжиренные радости динамического (время выполнения) привязки. Мои нынешние исследования направлены на задержку связывания до колодца после выполнения. Я называю этот привязку к концу времени, так как пророчествовал в Евангелии Святого Мэтью: «... и Whatsoee, что ты связываешься на земле, будет связан на небесах ...» (Мэтью 16:19 KJV).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top