Почему никто принципиально не хочет писать компилятор для Python?

Модератор: Модераторы разделов

Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

watashiwa_daredeska писал(а):
06.03.2012 01:01
Ну, для компиляции Perl вполне можно разобрать. В приведенном примере:

Код: Выделить всё

whatever  / 25 ; # / ; die "this dies!";
есть два варианта парсинга в зависимости от типа whatever. Это вызывает проблемы для syntax highliting и прочих инструментов, которые ориентируются на статический парсинг, но компилятор вполне может выдать на выход оба варианта, добавив условие на тип whatever.

Хм... А если в этом "то ли комментарии, то ли нет" блок закрыть?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение watashiwa_daredeska »

/dev/random писал(а):
06.03.2012 01:29
А если в этом "то ли комментарии, то ли нет" блок закрыть?
Ну, будет условный continue или return или что там за блок.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение NickLion »

watashiwa_daredeska писал(а):
06.03.2012 01:59
/dev/random писал(а):
06.03.2012 01:29
А если в этом "то ли комментарии, то ли нет" блок закрыть?
Ну, будет условный continue или return или что там за блок.

Нет. Если для Python вопрос упирался в eval и тормознутость вызовов по хешам, то тут спорно становится само понятие, как должен выглядеть код. Т.е. то же закрытие блока может соответствовать разным началам (по аналогичному принципу). Это всё можно превратить в жуткое спагетти с изменением соответствующих значений. Всё же компилятор не думаю, что получится написать.
Спасибо сказали:
Юрий Денисов
Сообщения: 6

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Юрий Денисов »

С удовольствием приму участие в написании компилятора для питона (Python) , надо создать такой проект, кстати если писать то на чем? На питоне?
Если кому-то это интересно то пусть напишет в этой теме.
Спасибо сказали:
Юрий Денисов
Сообщения: 6

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Юрий Денисов »

FlySnake писал(а):
26.09.2015 19:18
http://nuitka.net/

К сожалению я не знаю английский, а как я могу помочь проекту даже если не пойму документацию? К тому-же это не настоящий компилятор питон а лишь транслятор в С++ , с кучей ограничений. Почему-бы не написать настоящий компилятор для питона ?
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE
Контактная информация:

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение FlySnake »

Юрий Денисов писал(а):
03.10.2015 15:14
FlySnake писал(а):
26.09.2015 19:18
http://nuitka.net/

К сожалению я не знаю английский, а как я могу помочь проекту даже если не пойму документацию? К тому-же это не настоящий компилятор питон а лишь транслятор в С++ , с кучей ограничений. Почему-бы не написать настоящий компилятор для питона ?

Он сначала транслирует код в C++, а потом компилирует его в один большой бинарник. В реальном проекте его пробовал и даже работало, но были странные глюки уже не вспомню какие. Автор, кстати, живёт в Германии. Вдруг немецкий знаете - сможете подключиться к разработке, параллельно выучив английский. Поверьте, это намного проще написания своего компилятора с нуля и пользы миру больше от одного реально работающего проекта чем от двух недо-работающих.
Спасибо сказали:
Юрий Денисов
Сообщения: 6

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Юрий Денисов »

FlySnake писал(а):
03.10.2015 20:32
Юрий Денисов писал(а):
03.10.2015 15:14
FlySnake писал(а):
26.09.2015 19:18
http://nuitka.net/

К сожалению я не знаю английский, а как я могу помочь проекту даже если не пойму документацию? К тому-же это не настоящий компилятор питон а лишь транслятор в С++ , с кучей ограничений. Почему-бы не написать настоящий компилятор для питона ?

Он сначала транслирует код в C++, а потом компилирует его в один большой бинарник. В реальном проекте его пробовал и даже работало, но были странные глюки уже не вспомню какие. Автор, кстати, живёт в Германии. Вдруг немецкий знаете - сможете подключиться к разработке, параллельно выучив английский. Поверьте, это намного проще написания своего компилятора с нуля и пользы миру больше от одного реально работающего проекта чем от двух недо-работающих.

Спасибо! Как раз учу немецкий (но только учу я :) ) . Надо будет попробовать помочь проекту. И еще разве любой питон-код можно транслировать в С++?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

Юрий Денисов писал(а):
04.10.2015 15:24
И еще разве любой питон-код можно транслировать в С++?

Тот, который можно скомпилировать - любой. Но, к сожалению, не любой Python-код можно скомпилировать.
Спасибо сказали:
Kopilov
Сообщения: 947
ОС: [K]Ubuntu, Debian

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Kopilov »

/dev/random писал(а):
04.10.2015 16:04
Тот, который можно скомпилировать - любой. Но, к сожалению, не любой Python-код можно скомпилировать.

То есть, даже в питоновский байт-код не всё компилируетя? А какие есть ограничения?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

Kopilov писал(а):
04.10.2015 16:08
То есть, даже в питоновский байт-код не всё компилируетя? А какие есть ограничения?

В питоновский байт-код всё компилируется. А вот в нативный - нет. Попробуйте-ка скомпилировать в нативный код что-то вроде eval.
Спасибо сказали:
Юрий Денисов
Сообщения: 6

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Юрий Денисов »

/dev/random писал(а):
04.10.2015 16:04
Юрий Денисов писал(а):
04.10.2015 15:24
И еще разве любой питон-код можно транслировать в С++?

Тот, который можно скомпилировать - любой. Но, к сожалению, не любой Python-код можно скомпилировать.

Понятно что eval() скомпилировать нельзя. Но я хотел-бы увидеть какие команды понимает виртуальная машина питон то есть её ассемблер, если не ясно выразился то я хочу компилировать не исходный код питона а код виртуальной машины.
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение yars »

А чего ее компилировать-то? Реализации компиляторов в байткод и так уже есть, равно как и трансляторы байткода в машинный код. У вас получится еще один. Зачем?
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE
Контактная информация:

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение FlySnake »

/dev/random писал(а):
04.10.2015 16:10
Kopilov писал(а):
04.10.2015 16:08
То есть, даже в питоновский байт-код не всё компилируетя? А какие есть ограничения?

В питоновский байт-код всё компилируется. А вот в нативный - нет. Попробуйте-ка скомпилировать в нативный код что-то вроде eval.

Кстати, скомпилировало и запустило eval("print('hello world')")
Судя по содержимому сгенерированного файла __constants.bin

Код: Выделить всё

print('hello world')eval__package__bytes<string><module>strip/home/oleg/Desktop/main.py/usr/bin/python3endlenfileiteropenreprsendsitetypecloserangethrow__all____cmp____doc__compileinspect__dict____exit____file____iter____main____name____class____enter____cached____import____loader____module____builtins____metaclass__

он сохраняет строку, а потом в рантайме выполняет на питоньей вм. Как по-другому это возможно я не знаю. Копнуть глубже мне знаний питоньих внутренностей не хватает.
Спасибо сказали:
Юрий Денисов
Сообщения: 6

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Юрий Денисов »

yars писал(а):
04.10.2015 18:33
А чего ее компилировать-то? Реализации компиляторов в байткод и так уже есть, равно как и трансляторы байткода в машинный код. У вас получится еще один. Зачем?

А почему нельзя использовать транслированный в машинный байткод ? Чем он хуже скомпилированного С++?
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение yars »

Чем С/С++ хуже? Переносимостью. Задумка с промежуточной компиляцией как раз и придумана для создания переносимого кода и некоторого увеличения быстродействия по сравнению с трансляцией из исходного кода на Python. Исполнимый бинарник запустится только под ОС, для которой он скомпилирован, тогда как байткод способен работать на любой машине, на которой есть нужный интерпретатор, равно как и программа на обычном интерпретируемом языке программирования.
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Юрий Денисов
Сообщения: 6

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение Юрий Денисов »

yars писал(а):
04.10.2015 19:57
Чем С/С++ хуже? Переносимостью. Задумка с промежуточной компиляцией как раз и придумана для создания переносимого кода и некоторого увеличения быстродействия по сравнению с трансляцией из исходного кода на Python. Исполнимый бинарник запустится только под ОС, для которой он скомпилирован, тогда как байткод способен работать на любой машине, на которой есть нужный интерпретатор, равно как и программа на обычном интерпретируемом языке программирования.

Надо сделать так чтобы не надо было устанавливать/таскать виртуальную машину питон, поэтому надо скопировать то что VMP(виртуальная машина питон) скармливает компьютеру / ОС, и упаковать в exe , dll . Правда такая реализация будет для конкретного процессора(архитектуры) и операционной системы, ну так все программы на С++ работают.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

Юрий Денисов писал(а):
04.10.2015 22:45
Надо сделать так чтобы не надо было устанавливать/таскать виртуальную машину питон, поэтому надо скопировать то что VMP(виртуальная машина питон) скармливает компьютеру / ОС, и упаковать в exe , dll . Правда такая реализация будет для конкретного процессора(архитектуры) и операционной системы, ну так все программы на С++ работают.

Насколько я понимаю, он так и делает, но только для такого кода, для которого это принципиально возможно. eval() к такому не относится.
Спасибо сказали:
asssd
Сообщения: 1

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение asssd »

Cython позволяет компилировать python в машинный код. Развивается проект очень давно. Лет 7 наверно минимум.
https://ru.wikipedia.org/wiki/Cython
http://cython.org/
:)

есть еще cx_Freeze, который помогает собрать exe
http://habrahabr.ru/post/138537/


Чтобы под виндой работало нужно поставить mingw и сделать как написано здесь

http://stackoverflow.com/questions/3297254...ckage-using-pip

создать distutils.cfg и прописать в нем
[build]
compiler = mingw32

и разместить файл в PYTHONPATH\Lib\distutils\distutils.cfg

а затем через pip установить cython и cx_Freeze.
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение yars »

В итоге получится exe с интерпретатором python и кучкой *.pyc, файлов с байткодом.
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение eddy »

Т.е. просто взять и не использовать пхытон никто не додумался?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
fnkhk1
Сообщения: 9
ОС: linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение fnkhk1 »

Компилятор python'a должен работать так:

Если у нас есть список, элементы его однотипные и в программе которая компилится не используются операции с ним как с динамической структурой данных, на выходе должен получаться массив подобный массиву в c/c++.

Но если с тем же массивом проводятся операции типа вставки эл-та в середину, append() - то должна создаваться динамическая структура данных.

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

Если при работе с классом не используются вставка/удаление новых методов, утиная типизация - то на выходе должен создаваться класс на c++ с обычными методами и свойствами и без св-ва __class__.

Если в скрипте есть eval(он достижим из кода) то к программе подключается интерпретатор python'a или jit-компилятор. Если нет-не подключается.

В отличии от низкоуровневого языка такого как C++ в питоне нет связи между структурой данных и способом ее машинного представления(т.к. сам язык стандартно не компилируемый) - соответственно компилятор или интерпретатор могут представлять ее по-разному и должны выбирать наиболее рациональный способ представления. при возможности обрезая всю динамику языка.


Цикл for i in range() должен компилироваться в цикл со счетчиком. Без range() в цикл работающий с указателями.
Спасибо сказали:
fnkhk1
Сообщения: 9
ОС: linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение fnkhk1 »

Как пример интерпретатор JS в браузере chrome который представляет массив именно по такому принципу - если все элементы однотипные и динамические операции с ним не используются то в памяти массив как в c++, если элементы разные или динамические операции то массив представляется в виде динамического списка.

Потому что раз язык интерпретируемый то по определению не может быть требования что структура данных должна машинно представляться определенным образом (как динамическая) во всех случаях. В отличии от c и c++ где если есть массив то и на выходе должен быть массив(как представляется структура данных известно с точностью до байта при написании программы). То есть в таких языках как питон/js структура данных имеет виртуальный смысл, а не физический как в c.
Спасибо сказали:
fnkhk1
Сообщения: 9
ОС: linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение fnkhk1 »

asssd писал(а):
18.10.2015 00:46
Cython позволяет компилировать python в машинный код. Развивается проект очень давно. Лет 7 наверно минимум.
https://ru.wikipedia.org/wiki/Cython
http://cython.org/
:)



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

в топку


Jit компилятор тоже имеет свои недостатки. он позволяет добиться более-менее приличной производительности но ценой увеличения использования памяти в огромное количество раз. в итоге программа hello world будет жрать аж 50 мегабайт и стартовать 20 секунд, как это происходит в жабе(java) и всяких дотнетах
Спасибо сказали:
fnkhk1
Сообщения: 9
ОС: linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение fnkhk1 »

yars писал(а):
18.10.2015 11:37
В итоге получится exe с интерпретатором python и кучкой *.pyc, файлов с байткодом.



Такой "компилятор" и я создать могу(за несколько часов)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

fnkhk1 писал(а):
21.03.2016 10:07
Компилятор python'a должен работать так:

Если у нас есть список, элементы его однотипные и в программе которая компилится не используются операции с ним как с динамической структурой данных, на выходе должен получаться массив подобный массиву в c/c++.

Но если с тем же массивом проводятся операции типа вставки эл-та в середину, append() - то должна создаваться динамическая структура данных.

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

Если при работе с классом не используются вставка/удаление новых методов, утиная типизация - то на выходе должен создаваться класс на c++ с обычными методами и свойствами и без св-ва __class__.

Если в скрипте есть eval(он достижим из кода) то к программе подключается интерпретатор python'a или jit-компилятор. Если нет-не подключается.

В отличии от низкоуровневого языка такого как C++ в питоне нет связи между структурой данных и способом ее машинного представления(т.к. сам язык стандартно не компилируемый) - соответственно компилятор или интерпретатор могут представлять ее по-разному и должны выбирать наиболее рациональный способ представления. при возможности обрезая всю динамику языка.


Цикл for i in range() должен компилироваться в цикл со счетчиком. Без range() в цикл работающий с указателями.

Проблема в том, что определить истинность большинства упомянутых условий может только jit-компилятор. К примеру, цикл for i in range(): что если какой-нибудь неизвестный заранее eval'нутый код подменит функцию range()? Причём глобально, в том числе и для скомпилированного кода? Это ведь не ключевое слово, смысл которого фиксирован, а просто идентификатор, которому можно присвоить другое значение. То же с массивами: вы не можете знать заранее, какой код будет с ними работать и какие операции производить. Даже если вы держите список исключительно в локальной переменной и не передаёте его никаким другим функциям (даже len), кто-то может подменить методы класса list. Определить, произошло ли это, можно только в рантайме, а значит, компиляция тоже должна производиться в рантайме.
Спасибо сказали:
fnkhk1
Сообщения: 9
ОС: linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение fnkhk1 »

/dev/random писал(а):
21.03.2016 12:36
Проблема в том, что определить истинность большинства упомянутых условий может только jit-компилятор. К примеру, цикл for i in range(): что если какой-нибудь неизвестный заранее eval'нутый код подменит функцию range()? Причём глобально, в том числе и для скомпилированного кода? Это ведь не ключевое слово, смысл которого фиксирован, а просто идентификатор, которому можно присвоить другое значение. То же с массивами: вы не можете знать заранее, какой код будет с ними работать и какие операции производить. Даже если вы держите список исключительно в локальной переменной и не передаёте его никаким другим функциям (даже len), кто-то может подменить методы класса list. Определить, произошло ли это, можно только в рантайме, а значит, компиляция тоже должна производиться в рантайме.



не согласен

компилятор и должен определять эту ситуацию, когда подменяется код range() или list и генерировать правильный код. а если подмены не происходит, он должен оптимизировать, потому что нерационально компилить в неоптимизированный код без необходимости как это делает cython тот же

наличие в программе eval() можно определить. если есть eval или другой динамический код то должен подключаться рантайм например, если нет то нет




если мы например компилим такой скрипт:

a=[1,2,3,4,5]
print a

здесь заведомо не происходит никакой подмены и это можно это установить путем несложного анализа программы. компилятор создает исполняемый файл либо генерит c++ код из конкретного скрипта
и на выходе если он переводит в c++ должен быть массив типа int и вывод его без подключения рантаймов, jit, питоновских динамических библиотек и прочих костылей

но если с тем же списком в скрипте мы делаем динамические операции вроде вставки элементов, то должен генерироваться уже другой код(динамический список)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

fnkhk1 писал(а):
21.03.2016 13:05
не согласен

компилятор и должен определять эту ситуацию, когда подменяется код range() или list и генерировать правильный код. а если подмены не происходит, он должен оптимизировать, потому что нерационально компилить в неоптимизированный код без необходимости как это делает cython тот же

наличие в программе eval() можно определить. если есть eval должен подключаться рантайм например, если нет то нет


Вы не поняли.

Код: Выделить всё

eval(input())
for i in range(1, 100):
  ...

Подменяется здесь range или нет?
Спасибо сказали:
fnkhk1
Сообщения: 9
ОС: linux

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение fnkhk1 »

/dev/random писал(а):
21.03.2016 13:12
Вы не поняли.

Код: Выделить всё

eval(input())
for i in range(1, 100):
  ...

Подменяется здесь range или нет?



вы похоже не дочитали мой комментарий до конца

если есть eval() то да - должен подключаться рантайм и дальше код выполняется как динамический(гарантии что код range не поменяется - нет), но если его нет и нет динамического кода способного модифицировать range то за фига подключать этот рантайм с jit-ом? мы ведь можем писать программу и без eval-a и этих штук

компилятор должен компилить наиболее рациональным способом
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Почему никто принципиально не хочет писать компилятор для Python?

Сообщение /dev/random »

fnkhk1 писал(а):
21.03.2016 13:22
вы похоже не дочитали мой комментарий до конца

если есть eval() то да - должен подключаться рантайм и дальше код выполняется как динамический(гарантии что код list не поменяется - нет), но если его нет то за фига подключать этот рантайм с jit-ом? мы ведь можем писать программу и без eval-a

компилятор должен компилить наиболее рациональным способом

Хорошо, без eval.

Код: Выделить всё

a = input()
b = input()
c = input()
setattr(__import__(a), b, getattr(__import__(a), c))
for i in range(1, 100):
  ...

Подменяется здесь range или нет?
Спасибо сказали:
Ответить