LINUX.ORG.RU

Объектная модель питона

 , ,


2

4

- Сколько нужно архитекторов, чтобы создать язык программирования?
- Сто. Один будет писать язык, а 99 - говорить, что могут сделать лучше.

Так скажем, я решил вспомнить обсуждение по теме треда: Generics в Python или помогите победить mypy

Да, наркоманский питон захватывает мир, и с этим нужно что-то делать. Нет, я не намерен делать питон 4 - я вижу свет в конце тоннеля в рамках третьей версии. Но мне нужна ваша помощь: какие фундаментальные фичи, по-вашему, в питоне вообще не нужны, а какие - должны быть переработаны?

Прежде всего, я хотел бы вспомнить про RPython ( https://rpython.readthedocs.io/en/latest/rpython.html ).
Смысл особенностей языка прост - поддержка вывода типов. В частности, из языка убраны динамические определения классов и функций, динамическая типизация переменных, глобальные переменные стали константами, функции-генераторы транслируются в классы-итераторы и потеряли большую часть своих фич. У RPython есть большой минус - эти его ограничения сильно раздувают код, затрудняют писание и читание.
Итак, мои соображения:

1. Множественное наследование. Его нет даже на уровне C-функций в реализации питона и API расширений. «Но как же интерфейсы?» - возразите вы. Интерфейсы в C++ и Java нужны в роли объявления протоколов вызова методов объекта с целью последующей статической проверки этих протоколов при компиляции, а также для формирования таблиц методов, которые можно использовать независимо от объекта во время выполнения. Эти роли полностью потеряны в питоне, потому нет никакого оправдания их существованию. Мне нравится то, как сделаны интерфейсы в Go - это очень похоже на питоновые ABC: https://www.python.org/dev/peps/pep-3119

2. Генераторы - зло. Это прямо-таки запущенный случай GoTo, когда выполнение не просто бесконтрольно прыгает по коду - оно прыгает по стэкам. Особенно лютая дичь происходит, когда генераторы пересекаются с менеджерами контекста (привет PEP 567). В треде, скорее всего, опишу веселости реализации генераторов в PyPy/RPython. В питоне есть общая тенденция запутывать приложение в тесный клубок связанных изменяемых состояний, что не дает возможности параллелить и оптимизировать выполнение программы, а генераторы - вишенка на этом торте.

3. Изменение классов для существующих экземпляров объектов. Не, я понимаю, что класс в питоне объявляется во время выполнения. Но, блин, зачем в него совать изменяемые переменные? Зачем в старые объекты добавлять новые методы? Причем, попрошу обратить внимание на то, как нужно нагибаться раком для того, чтобы добавить аналогичные методы в сам объект, а не в класс - для этого нужны types.MethodType, function.__get__, functools.partial, и так далее. Методы в питоне вообще понадобились по простой причине - гвидо не придумал других способов сделать короткие имена функций (чтобы не было gtk_button_set_focus_on_click), поскольку не ясно, как выбирать из кучи похожих функций с коротким именем нужную под этот конкретный объект. Так в питоне появились len, iter, next, isinstance, slice, dict, dir, str, repr, hash, type - сейчас это обертки над соответствующими методами классов с подчеркиваниями в имени, а когда-то встроенные простые типы не являлись классами и работали только через эти функции. Так-то, я не вижу особой разницы между записью method(object) и object.method - особенно если method является статичной функцией, которой, в общем-то, все равно, какой первый аргумент (self) принимать.

Вот. Прошу дополнять. Да, я знаю, что у питона основные проблемы две: отсутствие статической типизации и многопоточности - но это черезчур абстрактные требования. К тому же, Javascript безо всяких типизаций достиг производительности Java, при том, что жавамакакам постоянно приходится гнуться под язык, а JS-кодеры испытывают удовольствие от говнокодинга.

★★★★
Ответ на: комментарий от byko3y

во время написания кода генерировать питоновый код по JS-структурам.

Даже и так?? Ято подумал, имеется в виду нечто вроде препроцессора.
Зачем это кому то из коробки? Если кому то вдруг надо - пусть сам пишет, не?

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

Какими? Твой код вывел Вход и Конец. Что тебе не так-то?

Первый блок кода: Объектная модель питона (комментарий)
Здесь концы выполняются в произвольном порядке. И это очень простой пример кода на 16 строчек - а теперь представь, что будет, когда строчек станет хотя бы 16 тысяч?

Жаба расчитана на кроссплатформу и низкий уровень

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

И этого жопаскрипта, на котором писались перделки для сайтов, тоже давно нет. Сейчас фронтенд может представлять из себя полноценное клиентское приложения. +существуют всякие service worker.

А куда же он делался? На том же языке пишут до сих пор ведь. Да, сделалы worker-ов, которые дергаются из отдельных потоков. А главный цикл по прежнему вне зоны видимости JS остается, так что это по прежнему скриптик, который «только дергается изредка из гуя».

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Пачка десериализуемых классов с разным количеством аргументов различных типов наследуются от абстрактного класса. Есть поле type в JSON-объекте, при десериализации можно диспетчеризоваться по этому полю.

Liz812
()
Ответ на: комментарий от Liz812

В яве потоки нормально работают.

Для тех, кто родился в нулевых - да.

С удовольствием послушаю какое отношение поддержка native threads в яве имеет к сборке мусора?

Брейнфак теоретически имеет поддержку многопотока - дальше что? Имелось же в виду «многопоточные приложения на этом языке имеет смысл писать». Так-то я тоже могу сказать «в питоне потоки нормально работают», потому что они же там работают? Работают. Ну и что, что иногда все, кроме одного останавливаются? И в жаве останавливаются.

byko3y ★★★★
() автор топика
Ответ на: комментарий от menangen

А C# не на низкий уровень расчитан? Имхо, всё относительно

C# = Java. Это относительно низкий уровень, но смотря с чем сравнивать. Асм и Си ниже уровнем будут, а Lisp/Python/Haskell/JS - выше.

byko3y ★★★★
() автор топика
Ответ на: комментарий от Liz812

Пачка десериализуемых классов с разным количеством аргументов различных типов наследуются от абстрактного класса. Есть поле type в JSON-объекте, при десериализации можно диспетчеризоваться по этому полю.

https://jsonpickle.github.io/

byko3y ★★★★
() автор топика
Ответ на: комментарий от Liz812

А Tcl не тормозит? Он же не компилируемый как и питон?

Удивительно, но факт. Тикль не тормозит, если его применять по назначению для описания гуи. Но программу писать все равно будешь на сишке, тут не отвертеться.

anonymous
()
Ответ на: комментарий от byko3y

Дядя, ты не юли.

«жабовые сборщики мусора того времени намекают, что ни о каком многопотоке речи быть не могло, когда у тебя периодически все потоки зависают намертво.»

Это твоя фраза? Я еще удивилась, почему «ни о каком многопотоке речи быть не могло» и при чем тут сборка мусора?

Liz812
()
Ответ на: комментарий от n008_b4800n

Все что выводит скрипт. Выход после конца - потому что ты затолкал его в finally. Что не так?

print('Конец') расположен после потери видимости генератора. По этой причине он может выполняться до или после print('Выход')в зависимости от реализации транслятора.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Она мало изменилась -

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

это по прежнему скриптик, который «только дергается изредка из гуя».

Ну а код на java - скриптик, который дергается (получает управление) изредка из ОС.

n008_b4800n
()
Ответ на: комментарий от byko3y

В CPython он выполняется так, как я написал, всегда. На левые реализации транслятора мне как-то плевать. Претензии к их разрабам.

n008_b4800n
()
Ответ на: комментарий от Liz812

«жабовые сборщики мусора того времени намекают, что ни о каком многопотоке речи быть не могло, когда у тебя периодически все потоки зависают намертво.»
Это твоя фраза? Я еще удивилась, почему «ни о каком многопотоке речи быть не могло» и при чем тут сборка мусора?

Это моя фраза. А еще моя фраза была про то, что при моем участии не так давно было обсуждение вопросов многопотока в жаве. А обсуждение то было о том, что примерно в 2002-2004 году в жаве сделали большую часть многопоточных либ, переработали атомики, и сделали норм сборщики мусора. До тех пор потенциал жавы в многопотоках был не сильно выше, чем у питона.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

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

Я еще помню времена когда казалось, что вот прям все пишут на выжал бейсике, и у него великое будущее. А потом через несколько лет бобик сдох, сейчас уже и vb.net экзотика. Миллионы мух как по команде перелетают на новое говно, так есть ли смысл за ними гоняться? В случае питона ты вообще опоздал лет на 15, это говно уже легаси, и дальше будет все больше каменеть.

anonymous
()
Ответ на: комментарий от Liz812

Так тебе что надо то?
Чтоб твое приложение в рантайме брало джейсон, генерило из него код, и тут же его подгружало?
Ну тогда, наверное, надо самому это реализовать, не? Не знаю языков, которые умеют так «изкоробки», кроме, наверное, собственно JS.

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

Жаба расчитана на кроссплатформу и низкий уровень

Той жабы уже давно нет, вроде как.

Она мало изменилась - просто была переадаптирована с утюгов и браузеров на сервера

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

Изменились. Каким-то образом они отменили кроссплатформу и низкий уровень? Нет.

Ну а код на java - скриптик, который дергается (получает управление) изредка из ОС.

Это неэффективное использованые жавы, поскольку она относительно долго запускается. Нужно понимать, что какой-нибудь жабо-GUI имеет главный цикл на жаве и всю обработку графических компонентов на жаве. В то же время, JS оперирует только интерфейсами DOM, не имея доступа к самому графическому интерфейсу и главному циклу, где, на самом деле, происходит большая часть работы фронтэнда. В случае бэка - да, большая часть работы происходит в JS, но JS на бэке - это что-то из серии «брак между двумя мужчинами».

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

«брак между двумя мужчинами».

Это нетолерантно, чувак. лол)

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

Кроссплатформу конеш не отменили, без нее жаба ненужна. Речь не про это ведь была, а про stop-the-world в гарбаджколлекторе. И кстати, stop-the-world в случае с сетевыми сервисами гораздо более терпим, чем при работе с гуем.

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

В CPython он выполняется так, как я написал, всегда. На левые реализации транслятора мне как-то плевать. Претензии к их разрабам.

Я меняю конец кода на

def test():
	g1 = gen_in_manager()
	next(g1)

test()
print('Конец')
И вуаля, исполнение кода изменилось. Я тебе еще раз повторю, что ты сможешь найти эту проблему в 20 строчках кода, но не сможешь найти в проекте на 3-4 порядка больше.

byko3y ★★★★
() автор топика
Ответ на: комментарий от anonymous

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

VB 1.0 был выпущен в 1991. Он довольно долго прожил. На VBA сейчас довольно много работы, между прочим.

byko3y ★★★★
() автор топика
Ответ на: комментарий от n008_b4800n

Кроссплатформу конеш не отменили, без нее жаба ненужна. Речь не про это ведь была, а про stop-the-world в гарбаджколлекторе. И кстати, stop-the-world в случае с сетевыми сервисами гораздо более терпим, чем при работе с гуем.

Напомню:

В жаве тоже есть глобальная блокировка,

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

Жаву довели до норм многопотока, в JS прикрутили воркеры и параллельный рендер - один питон остался в углу.

byko3y ★★★★
() автор топика
Ответ на: комментарий от n008_b4800n

finally тут как деструктор. Все предсказуемо, не?

finally тут непонятно что. Например по каким исключениям он отработает вообще? Стэк генератора чисел ведь вызывается из главного стэка и в обход стэка менеджера контекста.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

один питон остался в углу.

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

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

Он отработает при любом раскладе. Будет ексепшн или нет - пофик. На то он и финалли.

Он на паузе стоит, он ничего не отработает в таком состоянии.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Какая пауза? Вход в блок try был? Был. Значит финалли отработает. Точка. Генератор тут вообще кстати не при чем, тут скорее особенности обработки исключений.

n008_b4800n
()
Ответ на: комментарий от byko3y

пор потенциал жавы в многопотоках был не сильно выше, чем у питона

Вот это ты серьезно дядя?

JavaTM 2 SDK, Standard Edition, v. 1.2.2-001 for SCO® Operating Systems какого года выпуска?

Liz812
()
Ответ на: комментарий от n008_b4800n

О чем и речь - проблема не в генераторах, к которым ты прицепилсо, а в реализации

PyPy не ограничен GIL сам по себе, Jython работает без GIL. Но почему-то все продолжают пользоваться CPython. Как так? Я не только к генераторам прицепился, но и вобще к реализации ООП в питоне - именно эти решения гарантировали, что питон никогда не будет быстрым. И в случае Jython/JRuby многопоток для реализации генераторов пришлось использовать, потому что никаких более эффективных решений в рамках JVM нет. И в итоге чтение значения из генератора становится снятием одного потока с планировщика и постановкой другого потока в очередь, а потом то же самое в обратную сторону.

byko3y ★★★★
() автор топика
Ответ на: комментарий от n008_b4800n

В json модель, ты по ней генеришь код. Все эти лиспы так умеют, скала и эликсир, короче где есть макросы. Про dsl слышал? Вот это оно и есть.

Liz812
()
Ответ на: комментарий от Liz812

пор потенциал жавы в многопотоках был не сильно выше, чем у питона

Вот это ты серьезно дядя?
JavaTM 2 SDK, Standard Edition, v. 1.2.2-001 for SCO® Operating Systems какого года выпуска?

1999. И что ты хочешь сказать? Тогда же выпустили и HotSpot - до этого жава вообще мусором была на серверах, независимо от числа потоков.

byko3y ★★★★
() автор топика
Ответ на: комментарий от n008_b4800n

О, сорян, надо же.

Jython 2.7.2 beta (November 2019)

Восстал из могилы просто. С 2012 года, чтоли, лежал в ней. 3ей версии правда так и нет. А JRuby на какую то там минорную цифирку отстает.

А gil впилен для совместимости походу таки, да.

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

Jython работает без GIL.

Щито? В jython был GIL - раз. Jython мертв давно - два.

GIL в Jython никогда не было - это была шутка. Ну и пахнет от него плохо, не спорю.

byko3y ★★★★
() автор топика
Ответ на: комментарий от Liz812

А то что там описываются native потоки. Откуда выводы что потенциал не выше чем питоне?

И у питона родные ОС потоки. Дальше что?

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

GIL в Jython никогда не было - это была шутка.

Хах. и вправду. надо же)

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

Визуал бейсик был говном с рождения. Кто на нем что писал то? Макросы в ворде/икселе?

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

anonymous
()
Ответ на: комментарий от Liz812

Расскажи тогда что такое GIL в питне и сравни с явой.

Нужно понимать, что основная обработка в питоне ведется не на самом питоне, а в функциях на Си. Причем, даже для базовых, казалось бы, функций, вроде работы со строками или числами. GIL здесь нужна потому, что состояния самого питона изменяемы и тесно связаны. Но у функций на С/С++ таких проблем нет, и они могут спокойно параллелизоваться, а именно они выполняют большую часть работы. Именно по этой причине научный и ML софт, выполняющий тяжелые вычисления на куче ядер и/или на видеокартах, пишется на верхнем уровне на питоне и не имеет никакой проблемы с многопоточностью.

byko3y ★★★★
() автор топика
Ответ на: комментарий от anonymous

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

n008_b4800n
()
Ответ на: комментарий от byko3y

На VBA сейчас довольно много работы, между прочим.

Так себе аргумент. Питонячье легаси тоже долго проживет, так что можно до конца жизни на нем кормиться. Правда повторюсь, поздновато ты запрыгиваешь. Трудно будет конкурировать с седыми джанго-макаками 15+ лет стажа (за миску риса).

anonymous
()
Ответ на: комментарий от ddidwyll

я разве сказал, что эликсир не надо брать? прост я про него ничего не слышал.
ей виднее, что выбрать. но питон всяко мимо.

n008_b4800n
()

Может, стоит для начала определиться с областью применения всего этого? Питон бывает сильно разный.

Если хочешь ускорить/типизировать то, что дата-scientist’ы называют кодом, то есть, например, nuitka.

Если у тебя ML — там собственно питона не так много и тот же гугль давно продвигает использовать swift вместо питонов в том же tensorflow для тех, кто хочет нормальные типы.

Для веба — для начала определись, как ты собираешься заменять asyncio. Это интереснее, чем обзывать генераторы злом.

Для проектов, способных потенциально вырасти до сотен тысяч SLOC: не используй питон. Это хуже даже чем пхп и javascript, не говоря о более энтерпрайзных языках.

RPython

Это DSL для JIT, который чисто случайно имеет внешне похожий на питон синтаксис. Неплохой язык для написания своих интерпретаторов, но зачем мучаться и юзать его как general purpose?

И да, я считаю что mypy — редкостное говно и в проектах с >200k sloc на питоне все будут страдать, без вариантов. Есть https://github.com/google/pytype и https://github.com/facebook/pyre-check , но они не решают всех проблем.

И одна из основных проблем — тонны исключений на каждый чих и продвижение антипаттерна DontUseExceptionsForFlowControl как «питоничного». Их нельзя типизировать даже в теории.

Система типов в языке здорового человека умеет такое: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/ . В питоне взять [0] от потенциально пустого списка — вообще не проблема: функция тупо бросит IndexError и ни один статический анализатор не предупредит, что его нужно ловить. Никогда. By design. И Гвидо лично считает, что это — ок.

Да, я знаю, что у питона основные проблемы две

У питона ровно одна проблема: некоторые проекты случайно вырастают до размеров, где питон становится неюзабелен. Для вещей на примерно 10-30к SLOC у питона никаких проблем нет.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.