Почему может Lisp со всеми его динамическими функциями быть статически скомпилированным, но Python не может (не теряя все его динамические функции)?
Нет ничего, что препятствовало бы статической компиляции Python. Это немного менее эффективно, потому что Python показывает более изменяемую локальную область видимости, а также для сохранения некоторых динамических свойств (например, eval) вам необходимо включить компилятор в скомпилированную программу, но это тоже ничто не мешает.
Тем не менее, исследования показывают, что большинство программ Python, будучи динамическими при статическом анализе, довольно статичны и мономорфны во время выполнения. Это означает, что подходы к JIT-компиляции во время выполнения намного лучше работают с программами Python. См. Unladen-swallow, PyPy, Psyco, чтобы узнать о подходах, которые компилируют Python в машинный код. Но также IronPython и Jython, которые используют виртуальные машины, изначально предназначенные для статических языков, для компиляции Python в машинный код.
На самом деле, ничто не мешает вам статически компилировать программу на Python, просто до сих пор никто не написал такой компилятор (лично я нахожу время выполнения Python очень простым по сравнению с CL).
Можно сказать, что разница заключается в таких деталях, как "сколько времени было потрачено на написание компиляторов и есть ли в языке формальная спецификация того, как его написать".
Давайте рассмотрим эти моменты:
Что касается того, возможно ли это - Python использует довольно простую структуру для работы с символами и т.д., а именно словари. Вы можете рассматривать их как таблицу символов программы. Вы можете пометить типы данных, чтобы распознать примитивные и получить остальные, основываясь на сохраненном именовании и внутренней структуре. Остальная часть языка также довольно проста. Единственное, чего не хватает - это фактической работы по его реализации и корректному выполнению.
По правде говоря, скрипты Python компилируются в файлы .pyc при выполнении, смотрите "Компилированные" файлы Python.
Вы также можете использовать такой инструмент, как py2exe для компиляции программы на Python в исполняемый файл.
Python может быть «скомпилирован», где компиляция рассматривается как перевод с одного полного языка Тьюринга (исходный код) на другой (объектный код). Однако в Лиспе объектом является сборка, что теоретически возможно с Python (доказано), но не выполнимо.
Истинная причина, однако, менее плоская. Lisp во многих отношениях является революционным языком, который впервые применил в своих диалектах множество функций языков программирования, к которым мы привыкли сегодня. Однако в Лиспе они просто логически «следуют» основам языка. Язык, вдохновленный необработанными выразительными возможностями шепелявых, таких как JavaScript, Ruby, Perl и Python, обязательно интерпретируется, потому что получить эти функции на языке с «похожим на Алгол синтаксисом» просто сложно.
Lisp получает эти возможности из-за того, что он «гомо-иконический», нет существенной разницы между Lisp-программой и структурой данных lisp. Программы на Лиспе - это структуры данных, они являются структурным описанием программы в таком S-выражении, если хотите, поэтому скомпилированная программа на Лиспе эффективно `` интерпретирует себя '' без необходимости в лексере и тому подобном, программа на Лисп может просто можно рассматривать как ручной ввод дерева синтаксического анализа. Это требует синтаксиса, который многие люди считают нелогичным для работы, поэтому было много попыток перенести грубую выразительную силу парадигмы в более читаемый синтаксис, что означает, что его невозможно, но не невозможно скомпилировать. к сборке.
Кроме того, компиляция Python в сборку, возможно, будет медленнее и больше, чем его «полуинтерпретация» на виртуальной машине, многие функции Python зависят от синтаксического анализа.
Вышеупомянутое написано большим фанатом шепелявости, помните об этом конфликте интересов.