Лисп против Питона - Статическая Компиляция - PullRequest
13 голосов
/ 11 мая 2010

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

Ответы [ 4 ]

13 голосов
/ 11 мая 2010

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

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

4 голосов
/ 18 мая 2010

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

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

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

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

Хотя вышесказанное написано огромным фанатом-фанатом, помните об этом конфликте интересов.

4 голосов
/ 12 мая 2010

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

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

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

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

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

4 голосов
/ 11 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...