Почему программы на С требуют декомпиляторов, а программы на Python - нет? - PullRequest
3 голосов
/ 06 октября 2010

Если я напишу скрипт на python, любой может просто указать на него редактор и прочитать его. Но для программирования, написанного на C, нужно будет использовать декомпиляторы и шестнадцатеричные таблицы и тому подобное. Это почему? Я имею в виду, что просто не могу открыть веб-браузер Safari и посмотреть его код.

Ответы [ 11 ]

12 голосов
/ 06 октября 2010

Примечание: автор дезавуирует глубокие знания в этой области.Некоторые утверждения могут быть неверными.

Python фактически компилируется в байт-код, который запускается интерпретатором python.Всякий раз, когда вы используете модуль Python, Python генерирует файл .pyc с именем, соответствующим модулю.Это эквивалент файла .o, который создается при компиляции файла C.

Так что, если вы хотите что-то разобрать, файл .pyc будет таким:)

Процесс, который проходит Python при компиляции модуля, очень похож на то, что gcc или другой компилятор C делает с исходным кодом C.Основное отличие состоит в том, что это происходит прозрачно как часть выполнения файла.Это также необязательно: при запуске немодульного, то есть скрипта конечного пользователя, Python будет просто интерпретировать код, а не компилировать его вначале.

Поэтому на самом деле ваш вопрос таков: «Почему программы на Python распространяются как исходные тексты?чем скомпилированные модули?Или, говоря по-другому: «Почему приложения C распространяются как скомпилированные двоичные файлы, а не как исходный код?»

Раньше распространенные приложения C распространялись как исходный код.Это было еще до того, как операционные системы и их различные сущности (например, дистрибутивы Linux) стали более устоявшимися.Некоторые дистрибутивы, например gentoo, по-прежнему распространяют приложения в виде исходного кода.Приложения, которые являются немного более передовыми или малоизвестными, все еще распространяются как исходный код для всех платформ, на которые они ориентированы.

Причина этого - совместимость и зависимости.Причина, по которой вы можете запустить предварительно скомпилированный бинарный Safari на Mac или Firefox на Ubuntu Linux, заключается в том, что он был специально создан для этой операционной системы, архитектуры (например, x86_64) и набора библиотек.

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

Так почему бы не создать бинарный дистрибутив Python?С одной стороны, как упоминает Аарон , модули необходимо будет перекомпилировать для каждой новой версии байт-кода Python.Но это было бы похоже на перестройку приложения C для связи с более новой версией динамической библиотеки - модули Python в этом смысле аналогичны библиотекам C.

Реальная причина в том, что компиляция Python выполняется намного быстрее, чемС компиляцией.Я думаю, что это отчасти связано с динамической природой языка, а также с тем, что он не так тщателен для компиляции.Это имеет свои недостатки: в частности, приложения Python работают намного медленнее, чем их аналоги на C, потому что Python должен интерпретировать скомпилированный байт-код в инструкции для процессора, тогда как приложение C уже содержит такие инструкции.

При этом существует программа под названием py2exe , которая будет принимать модуль Python и распространять его, а также создавать предварительно скомпилированный исполняемый файл Windows, включая в него логику модуля и его зависимостей, включая сам Python.Я предполагаю, что смысл этого состоит в том, чтобы не заставлять людей устанавливать Python в своей системе Windows только для запуска вашего приложения.Под linux, или я думаю, что даже OS / X, Python обычно уже установлен, поэтому прекомпиляция на самом деле не нужна.В системах Linux также есть менеджеры пакетов super-dandy, которые прозрачно устанавливают такие зависимости, как Python, если они еще не установлены.

10 голосов
/ 06 октября 2010

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

5 голосов
/ 06 октября 2010

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

Краткий ответ: Python - это «интерпретируемый» язык, а это значит, что онПрограмма машинного языка (интерпретатор Python) для запуска программы Python, добавив слой косвенности.C или C ++ разные.Они скомпилированы непосредственно в машинный код, который запускается непосредственно на вашем процессоре.

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

3 голосов
/ 06 октября 2010

В нескольких комментариях вы спрашивали: «Можно ли скомпилировать python в исполняемый двоичный файл, а затем просто распространить его?»

С теоретической точки зрения, нет сомнений в том, что ответ - да - программа на Python может быть скомпилирована и распространена как полностью скомпилированный машинный код.

С практической точки зрения, это вызывает гораздо больше вопросов. Есть несколько вещей, как Unladen Swallow, Psyco, Shed Skin и PyPy, о которых вы, возможно, захотите узнать.

  1. Unladen Swallow - это, прежде всего, попытка заставить Python работать быстрее, но частью плана для этого является использование LLVM в качестве внутреннего сервера. LLVM может (помимо всего прочего) производить вывод машинного кода. В последних двух выпусках Unladen Swallow использовалась LLVM для генерации собственного кода, , но 1) самое последнее обновление на веб-сайте относится к концу 2009 года, и 2) примечания к выпуску для этой версии гласят: « Команда Unladen Swallow не рекомендует широко применять релиз 2009Q3. "

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

  3. Shed Skin Python-to-C ++ создает C ++ в качестве вывода, а затем вы компилируете C ++ и (потенциально) распространяете результат этого. Сейчас у Shedskin версия 0.5, то есть никто не утверждает, что это законченный, выпущенный продукт. С другой стороны, разработка продолжается, и каждый выпуск, похоже, содержит довольно существенные улучшения.

  4. PyPy - это реализация Python, написанная на Python. Их намерение состоит в том, чтобы позволить «подключать» производство кода, не затрагивая остальную часть реализации, - хотя в настоящее время они поддерживают 4 различных модели генерации кода, я не верю, что какая-либо из них приведет к созданию машинный код, работающий непосредственно на оборудовании.

Итог: работа была проделана и выполняется с намерением делать то, о чем вы просили, но, по крайней мере, насколько мне известно, на самом деле я ничего не могу разумно рекомендовать в качестве готового продукта, который вы может действительно зависеть от того, чтобы сделать работу прямо сейчас. Основной упор делается на скорость выполнения, а не на создание отдельных исполняемых файлов.

2 голосов
/ 06 октября 2010

Да, вы можете - это называется дизассемблированием и позволяет вам смотреть код Safari на отлично.Дело в том, что C, среди других языков, компилируется в нативный код, то есть код, который ваш процессор может «понять» и выполнить.

Более или менее очевидно, что уровень абстракции, присутствующий в наборе команд вашего процессора, намного меньше, чем уровень языка высокого уровня, такого как Python.Инструкции ЦП не касаются «загрузки этого URI», но больше «проверяют, установлен ли этот бит в аппаратном регистре».

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

2 голосов
/ 06 октября 2010

вы не можете открыть и прочитать код, который на самом деле работает для python.Попробуйте

import dis

def foo():
    for i in range(100):
        print i

print dis.dis(foo)

Это покажет вам (читаемый человеком) байт-код программы foo.также вы можете сохранить файл и импортировать его из интерактивного интерпретатора Python.Это создаст файл .pyc с тем же базовым именем, что и скрипт.откройте его с помощью шестнадцатеричного редактора, и вы посмотрите на фактически байт-код python.

Причина различия в том, что python изменяет свой байт-код между выпусками, так что вам нужно будет либо распространять другую версиюбинарный релиз только для каждой версии python.Это было бы больно.

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

1 голос
/ 06 октября 2010

, поскольку код C соответствует объектному (машинному) коду, а код Python компилируется в промежуточный байтовый код.Я не уверен, что вы даже ссылаетесь на байт-код python - вы должны ссылаться на сам исходный файл, который непосредственно исполняется (скрывая байт-код от вас!).C необходимо скомпилировать и связать.

0 голосов
/ 06 октября 2010

G-WAN выполняет сценарии ANSI C на лету - делая это так же, как сценарии Python.

Это могут быть сценарии на стороне сервера (использующие G-WAN в качестве веб-сервера) или любой универсальный Cпрограмма, и вы можете связать любую существующую библиотеку.

О, и сценарии G-WAN C намного быстрее, чем Python, PHP или Java ...

0 голосов
/ 06 октября 2010

Не для всех программ на Си требуются декомпиляторы.Там много кода на C распространяется в виде исходного кода.А для некоторых программ на Python do требуются декомпиляторы, если они распространяются в виде байт-кода (.pyc-файлов).

Но если ваши предположения верны, то это потому, что C скомпилирован язык , в то время как Python является интерпретируемым языком .

0 голосов
/ 06 октября 2010

Сценарии Python аналогичны человеку, который просматривает список дел, написанный на английском языке (или на понятном ему языке). Человек должен делать всю работу, каждый раз, когда этот список вещей должен быть сделан.

Если человек вместо того, чтобы каждый раз выполнять свои действия самостоятельно, создает и программирует робота, который может выполнять эти шаги снова и снова (и, вероятно, быстрее, чем он), этот робот аналогичен программе на Си.

Человек в случае с python называется «интерпретатором», а в случае C - «компилятором», а робот C - скомпилированной программой / исполняемым файлом.

Когда вы смотрите на исходный код программы на Python, вы видите список дел. В случае с роботом вы видите шестерни, двигатели, аккумуляторы и т. Д., Которые сильно отличаются от списка дел. Если бы вы могли получить список «дел» C, он выглядит как код Python, просто на другом языке.

...