Откомпилируйте программу что это

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

Объем откомпилированных программ по сравнению с и записью на исходном командном языке СУБД может увеличиться в 7 — 10 раз. Для уменьшения занимаемой оперативной памяти применяются различные способы, например, создаются оверлейные ( перекрываемые) структуры программ и используется динамическое распределение элементов программы в памяти. При организации оверлейной структуры в оперативной памяти находится только выполняемая в текущий момент часть программы ( модуль), а другие модули хранятся на диске и вызываются в память по мере потребности в их выполнении. [3]

Создавать библиотеки откомпилированных программ стало гораздо менее удобно, чем раньше, более привлекательно хранить непосредственно тексты программ. В частности, это справедливо и для Паскаля, поскольку программа на Паскале может быть легко откомпилирована за один просмотр, текста программы. [4]

Этапы компиляции на Си: предобработка, трансляция, компоновка

Длина поля откомпилированной программы будет установлена компилятором. [5]

Какие же преимущества имеет откомпилированная программа на Автолиспе по сравнению с обычной. [6]

В качестве длины поля откомпилированной программы будет выбрано наибольшее из чисел, одно из которых вычисляется компилятором, а другое равно текущей длине поля. [7]

Основное свойство библиотечных модулей и языка Модула-2 — возможность хранения раздельно откомпилированных программ в библиотечных модулях, к которым во время выполнения могут обращаться программные модули. [8]

В программу, написанную на интерпретируемом языке, можно внести изменения в любой момент, даже во время ее работы, а в машинный код откомпилированной программы , не имея исходного текста, внести изменения крайне трудно — это законченный продукт. [9]

Когда этот режим включен, а опция Destination пункта Compile принимает значение Disk, Турбо Паскаль генерирует на диске специальный текстовый файл, содержащий информацию об откомпилированной программе . [10]

Скорость работы программы почти всегда сказывается на ее качестве. Многие интересные находки программистов не могут быть реализованы из-за того, что они выполняются слишком медленно. Откомпилированные программы работают в 20 — 50 раз быстрее, чем программы, выполняемые под управлением интерпретатора. Интерпретатор выполняет роль посредника между программой и процессором и забирает себе большую часть ресурсов компьютера. К тому же он много раз повторяет одни и те же операции. Поэтому практически все прикладные и служебные программы поставляются в откомпилированном виде. [11]

Опыт показывает, что проигрыш в скорости по сравнению с откомпилированной программой составляет по меньшей мере порядок. Другой, не столь принципиальный недостаток, состоит в том, что интерпретируемым языком, как правило, является язык Бейсик, разговор о недостатках которого заслуживал бы отдельного параграфа. [12]

Свободное программное обеспечение: что это? Чем отличается от Open Source? Лицензии и заблуждения

Программы, написанные на высокоуровневых языках сценариев, также могут интерпретироваться. В этом случае машинные адреса не используются, поэтому нет опасности, что сценарий попытается получить доступ к памяти недопустимым образом. Недостаток интерпретации в основном состоит в том, что такой метод исполнения программ значительно медленнее по сравнению с исполнением откомпилированных программ . [14]

КОМПЕНСИРУЮЩИЕ УСТРОЙСТВА в электрической системе — электроустановки, предназначенные для компенсации реактивных параметров электрич. В качестве К.у. применяют, напр. ЛЭП и улучшают технико-экономич. Полностью откомпилированная программа работает намного быстрее программы, к-рая транслировалась в машинные коды строка за строкой. [15]

Источник: www.ngpedia.ru

Динамическая компиляция

Из-за необходимости интерпретации байт-код выполняется значительно медленнее машинного кода сравнимой функциональности, однако он более переносим (не зависит от операционной системы и модели процессора). Чтобы ускорить выполнение байт-кода, используется динамическая компиляция, когда виртуальная машина транслирует псевдокод в машинный код непосредственно перед его первым исполнением (и в при повторных обращениях к коду исполняется уже скомпилированный вариант).

Декомпиляция

Существуют программы, которые решают обратную задачу — перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а такие программы — декомпиляторами. Но поскольку компиляция — это процесс с потерями, точно восстановить исходный код, скажем, на C++, в общем случае невозможно.

Читайте также:
Video converter packages что это за программа

Более эффективно декомпилируются программы в байт-кодах — например, существует довольно надёжный декомпилятор дляFlash. Разновидностью декомпилирования является дизассемблирование машинного кода в код на языке ассемблера, который почти всегда выполняется успешно (при этом сложность может представлять самомодифицирующийся код или код, в котором собственно код и данные не разделены). Связано это с тем, что между кодами машинных команд и командами ассемблера имеется практически взаимно-однозначное соответствие.

Раздельная компиляция

Раздельная компиляция — трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль. При трансляции каждой части программы компилятор порождает объектный модуль, содержащий дополнительную информацию, которая потом, при компоновке частей в исполнимый модуль, используется для связывания и разрешения ссылок между частями.

Интерпретатор(англ. interpreter — истолкователь, устный переводчик) переводит и выполняет программу строка за строкой, производит пооператорный (покомандный, построчный) анализ, обрабатывает и тут же выполняет исходную программу или запроса (в отличие от компиляции, при которой программа транслируется без её выполнения. После того, как программа откомпилирована, ни сама исходная программа, ни компилятор более не нужны. В то же время программа, обрабатываемая интерпретатором, должна заново переводиться на машинный язык при каждом очередном запуске программы. Откомпилированные программы работают быстрее, но интерпретируемые проще исправлять и изменять.

Типы интерпретаторов

  • Простой интерпретатор анализирует и тут же выполняет (собственно интерпретация) программу покомандно (или построчно), по мере поступления её исходного кода на вход интерпретатора. Достоинством такого подхода является мгновенная реакция. Недостаток — такой интерпретатор обнаруживает ошибки в тексте программы только при попытке выполнения команды (или строки) с ошибкой.
  • Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, какJava,Tcl,Perl(используется байт-код), а также в различных СУБД.

Источник: studfile.net

Компиляция Python

Предположим, вы разработали приложение или библиотеку на Python и уже готовитесь передать его / её заказчику. И в этот момент возникают вопросы, о которых многие даже не задумываются.

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

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

И, наконец, хочется, чтобы конечное приложение работало быстрее, чем в среде разработки.

И вот тут настало время скомпилировать Python-код. Меня зовут Руслан, я старший разработчик компании «Цифровое проектирование». Сегодня я расскажу, как выбрать тот самый компилятор из множества доступных.

AOT/JIT

Компиляция – это сборка программы, включающая: трансляцию всех модулей программы, написанных на языке программирования высокого уровня, в эквивалентные программные модули на низкоуровневом языке, близком к машинному коду, или на машинном языке и сборку исполняемой программы. Существует два вида компиляции:

  • AOT-компиляция (ahead-of-time) – компиляция перед исполнением программы. Т.е. программа компилируется один раз, в результате компиляции получается исполняемый файл.
  • JIT-компиляция (just-in-time) – компиляция во время исполнения программы. Т.е. программа (а точнее, блоки программы) компилируется много раз — при каждом запуске.

Бенчмарк

Так как одной из целей является ускорение, необходимо оценить, насколько быстро работает скомпилированный код. В качестве бенчмарка будем использовать pyperfomance. К сожалению, pyperfomance не подошел для Cython и Pythran, потому что не позволяет визуализировать все возможности языка. Ускорения для Cython без модификации кода получить не удалось, а Pythran не умеет в пользовательские классы. Для них воспользуемся вычислением числа пи:

Читайте также:
Precedent что это программа

def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result

Эксперименты будем проводить на процессоре Intel Core i7 10510U. На CPython 3.9.7 время вычисления числа пи до 100.000.000 знака заняло 5.82 секунды.

AOT-компиляция Python

PyInstaller

PyInstaller упаковывает приложения Python в автономные исполняемые файлы в Windows, GNU / Linux, Mac OS X, FreeBSD, Solaris и AIX.

Устанавливается через pip:

pip install pyinstaller

После установки для создания исполняемого файла достаточно выполнить команду:

В результате будет создано:

  • *.spec – файл спецификации (используется для ускорения будущих сборок приложения, связи файлов данных с приложением, для включения .dll и .so файлов, добавление в исполняемый файл параметров runtime-а Python);
  • build/ – директория с метаданными для сборки исполняемого файла;
  • dist/ – директория, содержащая все зависимости и исполняемый файл.

Сборку приложения можно настроить с помощью параметров командной строки:

  • —name – изменение имени исполняемого файла (по умолчанию, такое же, как у сценария);
  • —onefile – создание только исполняемого файла (по умолчанию, папка с зависимостями и исполняемый файл);
  • —hidden-import – перечисление импортов, которые PyInstaller не смог обнаружить автоматически;
  • —add-data – добавление в сборку файлов данных;
  • —add-binary – добавление в сборку бинарных файлов;
  • —exclude-module – исключение модулей из исполняемого файла;
  • —key – ключ шифрования AES256. Да, приложение не будет содержать исходного кода, но его можно декомпилировать, например, так: Pyinstaller Extractor (.exe → .pyc) и uncompile6 (.pyc → .py). Для скрытия исходного кода можно обфусцировать байт-код Python с помощью шифрования.

У PyInstaller есть ограничения. Он работает с Python 3.5–3.9. Поддерживает создание исполняемых файлов для разных операционных систем, но не умеет выполнять кросскомпиляцию, т. е. необходимо генерировать исполняемый файл для каждой ОС отдельно. Более того, исполняемый файл зависит от пользовательского glibc, т. е. необходимо генерировать исполняемый файл для самой старой версии каждой ОС.

PyInstaller знает о многих Python-пакетах и умеет их учитывать при сборке исполняемого файла. Но не о всех. Например, фреймворк uvicorn практически весь нужно явно импортировать в файл, к которому будет применена команда pyinstaller. Полный список поддерживаемых из коробки пакетов можно посмотреть здесь.

Cython

Cython — это оптимизирующий статический компилятор как для языка программирования Python, так и для расширенного языка программирования Cython. С его помощью можно код на Python транслировать в С и затем скомпилировать в бинарник, совместимый с CPython. Компиляцию придется делать под все операционные системы и архитектуры процессора.

Ставится Cython через pip:

pip install Cython

Рассмотрим его работу на примере с вычислением числа пи:

def approximate_pi(int n): cdef float step cdef float result cdef float x step = 1.0 / n result = 0.0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result

А что делать, если в нашем проекте несколько файлов, которые нужно скомпилировать? Тогда нужно использовать так называемый сценарий сборки. С его помощью можно модернизировать сборку в зависимости от операционной системы, указывать несколько файлов, которые необходимо скомпилировать, и многое другое.

Создадим файл build.py:

from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize(«bench_cython.pyx»), )

Запустим: python build.py build_ext –-inplace

В результате будет сгенерирован .so/.dll файл.

Nuitka

Nuitka способна упаковывать приложения Python в автономные исполняемые файлы, а также транслировать Python-код в С для его последующей компиляции. Работает с разными версиями Python (2.6, 2.7, 3.3 — 3.9).

Ставится через pip:

pip install nuitka

Для генерации исполняемого файла достаточно выполнить команду:

python -m nuitka —follow-import some_program.py

Читайте также:
Es что это за программа

Для компиляции модуля:

python -m nuitka —module some_module.py

Для компиляции пакета:

python -m nuitka —module some_package —include-package = some_package

Pythran

Pythran – статический компилятор Python, позиционирующий себя как ориентированный на научные вычисления и использующий преимущества многоядерных процессоров и блоков инструкций SIMD. Он транслирует Python-код, аннотированный описаниями интерфейса, в C++. До версии 0.9.5 (включительно) Pythran поддерживал Python 3 и Python 2.7. Последние версии поддерживают только Python 3.

pip install pythran

Генерируем бинарный файл .so:

Pythran по умолчанию не умеет в пользовательские классы, поэтому при попытке их компиляции будет выброшена ошибка:

Top level statements can only be assignments, strings,functions, comments, or imports

Добавим комментарий аннотации функции:

#pythran export approximate_pi(int) def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result

Скомпилируем и бенчмарк выдает 0,00007 секунды.

cx-Freeze

cx-Freeze – это набор скриптов и модулей преобразования скриптов Python в исполняемые файлы. cx_Freeze — кроссплатформенный. Он поддерживает Python 3.5.2 и выше.

Ставится с помощью pip:

pip install cx_Freeze

Для генерации исполняемого файла достаточно выполнить команду:

Сборку можно настроить с помощью параметров командной строки:

  • -h, —help — справка;
  • -O — оптимизировать сгенерированный байт-код согласно PYTHONOPTIMIZE;
  • -c, —compress — сжать байт-код в zip-файлах;
  • -s, —silent — выводить только предупреждения и ошибки;
  • —target-dir=DIR, —install-dir=DIR — каталог, в который следует поместить целевой файл и все зависимые файлы.

Также возможно использование сценария сборки, например, так:

import sys from cx_Freeze import setup, Executable # Dependencies are automatically detected, but it might need fine tuning. build_exe_options = # GUI applications require a different base on Windows (the default is for a # console application). base = None if sys.platform == «win32»: base = «Win32GUI» setup( name = «guifoo», version = «0.1», description = «My GUI application!», options = , executables = [Executable(«guifoo.py», base=base)])

Сборка исполняемого файла:

python setup.py build

JIT-компиляция Python

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

PyPy

PyPy — интерпретатор языка программирования Python 2.7 и Python 3.7. Он написан на RPython и содержит:

  • компилятор байт-кода, отвечающий за создание объектов кода Python из исходного кода пользовательского приложения;
  • оценщик байт-кода, ответственный за интерпретацию объектов кода Python;
  • стандартное объектное пространство, отвечающее за создание и управление объектами Python, видимыми приложением.

PyPy поддерживает сотни библиотек Python, включая NumPy.

Основные особенности (сравнение с CPython):

  • Скорость. При выполнении длительно выполняющихся программ, когда значительная часть времени тратится на выполнение кода Python, PyPy может значительно ускорить ваш код.
  • Использование памяти. Программы Python, требующие много памяти (несколько сотен Мб или более), могут занимать меньше места, чем в CPython. Однако это не всегда так, поскольку зависит от множества деталей. Также базовый уровень потребления оперативной памяти выше, чем у CPython.

Скачать PyPy можно с здесь. После скачивания PyPy готов к запуску после распаковки архива. Если необходимо сделать PyPy доступным для всей системы, достаточно поместить символическую ссылку на исполняемый файл pypy в /usr/local/bin. Также можно поставить с помощью pyenv.

PyPy работает на Mac, Linux (не все дистрибутивы) или Windows.

Для запуска кода с помощью PyPy вместо команды python3 (как c помощью CPython) достаточно воспользоваться командой pypy3:

Pyston

Pyston — это форк CPython 3.8.8 с дополнительной оптимизацией производительности. В настоящее время он поддерживает установку только из исходников. Или с помощью pyenv.

В Pyston поддерживаются все возможности CPython, в том числе C API для разработки расширений на языке Си. Среди основных отличий Pyston от CPython помимо общих оптимизаций выделяется использование DynASM JIT и inline-кэширования.

Заключение

Итак, мы рассмотрели 5 фреймворков AOT-компиляции Python. Для любителей аналитики, ниже приведена таблица со сравнительным анализом.

PyInstaller

Cython

Nuitka

Pythran

cx-Freeze

Генерация автономных исполняемых файлов

Компиляция python-модуля в исполняемый файл, совместимый с CPython

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru