Lisp по сравнению с Python — статическая компиляция

Почему может Lisp со всеми его динамическими функциями быть статически скомпилированным, но Python не может (не теряя все его динамические функции)?

13
задан yodie 11 May 2010 в 17:27
поделиться

4 ответа

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

Тем не менее, исследования показывают, что большинство программ Python, будучи динамическими при статическом анализе, довольно статичны и мономорфны во время выполнения. Это означает, что подходы к JIT-компиляции во время выполнения намного лучше работают с программами Python. См. Unladen-swallow, PyPy, Psyco, чтобы узнать о подходах, которые компилируют Python в машинный код. Но также IronPython и Jython, которые используют виртуальные машины, изначально предназначенные для статических языков, для компиляции Python в машинный код.

13
ответ дан 1 December 2019 в 21:37
поделиться

На самом деле, ничто не мешает вам статически компилировать программу на Python, просто до сих пор никто не написал такой компилятор (лично я нахожу время выполнения Python очень простым по сравнению с CL).

Можно сказать, что разница заключается в таких деталях, как "сколько времени было потрачено на написание компиляторов и есть ли в языке формальная спецификация того, как его написать".

Давайте рассмотрим эти моменты:

  1. Компиляторы Lisp развиваются уже более 40 лет, причем работа над ними началась еще в 70-х годах, если не раньше (я не уверен в датах, лень гуглить точные). Это создает огромный пласт знаний о том, как писать компилятор. Однако, Python был номинально разработан как "обучающий язык", и поэтому компиляторы были не так важны.
  2. Отсутствие спецификации - у Python нет ни одного источника, который бы определял точную семантику языка. Конечно, вы можете указать на документы PEP, но это все равно не изменит того факта, что единственная реальная спецификация - это источник основной реализации, CPython. Который, что немаловажно, является простым компилятором своего рода (в байткод).

Что касается того, возможно ли это - Python использует довольно простую структуру для работы с символами и т.д., а именно словари. Вы можете рассматривать их как таблицу символов программы. Вы можете пометить типы данных, чтобы распознать примитивные и получить остальные, основываясь на сохраненном именовании и внутренней структуре. Остальная часть языка также довольно проста. Единственное, чего не хватает - это фактической работы по его реализации и корректному выполнению.

4
ответ дан 1 December 2019 в 21:37
поделиться

По правде говоря, скрипты Python компилируются в файлы .pyc при выполнении, смотрите "Компилированные" файлы Python.

Вы также можете использовать такой инструмент, как py2exe для компиляции программы на Python в исполняемый файл.

4
ответ дан 1 December 2019 в 21:37
поделиться

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

Истинная причина, однако, менее плоская. Lisp во многих отношениях является революционным языком, который впервые применил в своих диалектах множество функций языков программирования, к которым мы привыкли сегодня. Однако в Лиспе они просто логически «следуют» основам языка. Язык, вдохновленный необработанными выразительными возможностями шепелявых, таких как JavaScript, Ruby, Perl и Python, обязательно интерпретируется, потому что получить эти функции на языке с «похожим на Алгол синтаксисом» просто сложно.

Lisp получает эти возможности из-за того, что он «гомо-иконический», нет существенной разницы между Lisp-программой и структурой данных lisp. Программы на Лиспе - это структуры данных, они являются структурным описанием программы в таком S-выражении, если хотите, поэтому скомпилированная программа на Лиспе эффективно `` интерпретирует себя '' без необходимости в лексере и тому подобном, программа на Лисп может просто можно рассматривать как ручной ввод дерева синтаксического анализа. Это требует синтаксиса, который многие люди считают нелогичным для работы, поэтому было много попыток перенести грубую выразительную силу парадигмы в более читаемый синтаксис, что означает, что его невозможно, но не невозможно скомпилировать. к сборке.

Кроме того, компиляция Python в сборку, возможно, будет медленнее и больше, чем его «полуинтерпретация» на виртуальной машине, многие функции Python зависят от синтаксического анализа.

Вышеупомянутое написано большим фанатом шепелявости, помните об этом конфликте интересов.

4
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: