Lisp vs Python - статическая компиляция
Почему Lisp со всеми его динамическими функциями статически компилируется, но Python не может (не теряя всех своих динамических функций)?
Ответы
Ответ 1
Нет ничего, что предотвращало бы статическую компиляцию Python. Это немного менее эффективно, потому что Python обнаруживает более изменчивую локальную область, также, чтобы сохранить некоторые динамические свойства (например, eval), вам нужно включить компилятор с скомпилированной программой, но ничего не мешает этому.
Тем не менее, исследования показывают, что большинство программ Python, в то время как динамические при статическом анализе, довольно статичны и мономорфны во время выполнения. Это означает, что подходы к компиляции JIT для работы во время работы намного лучше работают на Python-программах. См. Без порога, PyPy, Psyco для подходов, которые компилируют Python в машинный код. Но также IronPython и Jython, которые используют виртуальные машины, первоначально предназначенные для статических языков, для компиляции Python в машинный код.
Ответ 2
Для чего стоит скрипты Python скомпилированы в файлы .pyc, когда они выполняются, см. "Скомпилированные" файлы Python.
Вы также можете использовать инструмент, например py2exe, чтобы скомпилировать программу Python в исполняемый файл.
Ответ 3
На самом деле, нет ничего, что помешало бы вам статически компилировать программу Python, просто так, что никто не писал такой компилятор до сих пор (я лично считаю, что время выполнения Python очень легко по сравнению с CL).
Вы могли бы сказать, что разница в деталях напоминает "сколько времени было потрачено на то, чтобы на самом деле писать компиляторы, и имеет ли язык формальную спецификацию того, как писать один".
Позвольте адресовать эти точки:
- Lisp компиляторы развиваются уже более 40 лет, а работа начинается в 70, если не раньше (я не уверен в своих датах, слишком ленив слишком точные Google). Это создает огромный кусок знаний о том, как писать компилятор. OTOH, Python был номинально разработан как "язык обучения", и поскольку такие компиляторы были не так важны.
- Отсутствие спецификации - Python не имеет ни одного источника, определяющего точную семантику языка. Конечно, вы можете указать документы PEP, но это все еще не меняет того факта, что единственным реальным spec является источник основной реализации, CPython. Который, nota bene, является простым компилятором сорта (в байт-код).
Что касается того, возможно ли это - Python использует довольно простую структуру для обработки символов и т.д., а именно его словарей. Вы можете рассматривать их как таблицу символов программы. Вы можете пометить типы данных для распознавания примитивных и получить остальное на основе сохраненных имен и внутренней структуры. остальная часть языка также довольно проста. Единственный недостающий бит - это фактическая работа по его реализации и правильная работа.
Ответ 4
Python может быть "скомпилирован", где компиляция рассматривается как перевод с одного языка Turing Complete (исходного кода) на другой (объектный код). Однако в Lisp объект является сборкой, что теоретически возможно с Python (доказано), но не выполнимо.
Истинная причина, однако, менее уплощенная. Lisp во многих отношениях является революционным языком, который впервые использовал в своих диалектах множество функций в языках программирования, к которым мы привыкли сегодня. В Lisps, однако, они просто "следуют" логически из основ языка. Язык, который вдохновлен сырыми выразительными способностями lisps, такими как JavaScript, Ruby, Perl и Python, обязательно интерпретируется, потому что получить эти функции на языке с синтаксисом типа Algol просто сложно.
Lisp получает эти функции от "гомо-знаковых", нет существенной разницы между программой Lisp и структурой данных Lisp. Lisp программы представляют собой структуры данных, они являются структурными описаниями программы в таком S-выражении, если вам нравится, поэтому скомпилированная программа Lisp эффективно "интерпретирует себя" без необходимости лексера и всего этого, Lisp программа может рассматриваться только как ручной ввод дерева разбора. Это требует синтаксиса, с которым многие люди сталкиваются с интуитивно понятным интерфейсом, поэтому было предпринято множество попыток передать сырую выразительную силу парадигмы на более читаемый синтаксис, что означает, что это невозможно, но не невозможно, скомпилировать его к сборке.
Кроме того, компиляция Python для сборки, возможно, будет медленнее и больше, чем "полуинтерпретация" его на виртуальной машине, многие функции в python зависят от синтаксического анализа.
Вышеупомянутое, хотя написано огромным фанатом Lisp, держите этот конфликт интересов в уме.