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-кодеры испытывают удовольствие от говнокодинга.

★★★★

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

а вот чего думаешь по поводу языка Nim, например? мультиметоды там реализованы. есть dispatch trees и более правильный полиморфизм вдобавок к одиночной диспетчеризации.
как тебе этот Nim в качестве более «правильного питона» ?

Да, очень похоже на правильный питон. По крайней мере, с большого расстояния. Правда, не ясно, сколько десятков лет понадобится, чтобы ему дорасти до уровня продакшена. Задача, которую я ставил в этом треде, другая: как сделать конфетку из всё того же питона, которым в мире пользуются миллиарды макак.

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

ты мне лучше скажи, кто в питоне виноват в GIL? где он там возникает?

У тебя есть огромная паутина изменяемых состояний, например: есть экземпляр объекта, его класс, базовые классы, и модули, в которых определены классы и переменная со ссылкой на эксемпляр. Всё это может потенциально в любой момент поменяться, запустив сложный механизм распространения изменений, и зависимый код в это время не должен выполняться.
Поскольку такое ограничение уже было и избавиться от него не было возможности/необходимости/желания, то Гвидо решил, что будет хорошей идеей дальше строить интерпретатор вместе со стандартной билиотекой вокруг предположения, что вызов функции из питона будет делаться только под GIL. Так проще писать и получается быстрее по скорости выполнения, поскольку функции синхронизации не бесплатны.

Так-то даже стандартная библиотека содержит в себе некую долю потокобезопасных функций, которые выполняются вне GIL, но всех их объединяет общее свойство: они не работают с объектами питона. Numpy/scipy, tensorflow - они прекрасно многопоточатся, но именно потому, что изолируют свои структуры от объектов питона. Нет абсолютно никакой надежды сделать работу с объектами питона параллелизуемой. Я работаю над либой, которая могла бы предоставить возможность общих структур с параллелизуемостью операций, но там пока что стадия «concept of proof of concept».

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

Достаточно(self): просто(self): написать(self): пару(self): строк(self): на(self): этом(self): языке(self):

Явное объявление self - это просто детские шалости, как по мне. Претензия более существенная заключается в том, что классы в питоне вообще не нужны - и тогда остается вполне осмысленная функция с объектом-контекстом в виде первого аргумента. По хорошему вызов obj.method() должен был бы полностью равняться вызову method(obj).

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

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

iluha16
()

Вот. Прошу дополнять

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

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

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

Да? Что вот здесь непонятно, например:

from time import localtime

activities = {8: 'Sleeping',
              9: 'Commuting',
              17: 'Working',
              18: 'Commuting',
              20: 'Eating',
              22: 'Resting' }

time_now = localtime()
hour = time_now.tm_hour

for activity_time in sorted(activities.keys()):
    if hour < activity_time:
        print (activities[activity_time])
        break
else:
    print ('Unknown, AFK or sleeping!')

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

Здесь все понятно, но обычно там какие-то навороты.

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

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

вроде Symphony, но в основном код на PHP - это полный угар

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

no-such-file ★★★★★
()
Ответ на: комментарий от bonta

главный минус Питона его малословный синтаксис

Минус не в том, что он малословный (Си тоже малословный), а то что синтаксиса овердохрена и на каждый чих свой специальный синтаксис.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Раз уж ты не в курсе, то зачем утверждать? Средний код с гитхаба на пыхе гораздо симпатичнее такового на питоне.

Открываю первый попавшийся проект на гитхабе с PHP:
https://github.com/mohsinenur/E-Commerce-Website-Using-PHP/blob/master/E-Comm...
Полный пэ. С питоном у меня побольше опыта было в этом плане, потому я уверенно могу сказать, что средний питонопроект на гибтахе - это говнище. Про PHP я не могу настолько же уверенно сказать, но по косвенным признакам вижу, что картина все-таки аналогичная.

Да, потому что в пыхе уже давно есть всё то, что ты тут пытаешься пропагандировать.

Мне кажется, что ты почти ничего не читал из того, что я писал, кроме примера со списками. В PHP абсолютно те же проблемы, и ту же проблему со множественным наследованием недавно скопировали туда.

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

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

Ну и зачем ты собрался этот пистон чинить? Типа в теории на нем можно писать хороший понятный код? Так на любом языке можно писать, только мало тех, кто может. Кодеры либо макаки без образования, либо сумрачные технари, которые генерят код еще ужасней, чем у макак (но он хотя бы работает правильно). Так лучше пусть код будет страшненький (а он всегда к этому стремится), но эффективный. Пистон тут точно не вывезет.

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

Ну и зачем ты собрался этот пистон чинить? Типа в теории на нем можно писать хороший понятный код?

С таким же успехом можно сказать «зачем чинить C++, если есть намного лучше инструменты?». Плохих кодеров на крестах - валом; они не только напишут медленный код - он еще и будет регулярно падать. Для этого и создали жаву - чтобы плохие кодеры на крестах (большинство) хотя бы не приносили столько ущерба.

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

А произошло это потому, что первые реализации питона были беспросветно тормознутыми, и банальная работа со строками не могла быть написана на питоне - слишком медленно. Отсюда возникло знаменитое движение по созданию Си функций на каждый чих и пук — мне особенно понравилась функция для вычисления exp1, который вычисляет «e^x - 1» — даже такое банальное вычисление засунули в функцию на Си. Здесь возникает проблема статичной компиляции, которую мало кто из кодеров понимает. А дело в том, что JIT-компилированный код может легко обскакивать по производительности модульный AOT-компилированный, даже с учетем накладных расходов на трассировку и компиляцию во время выполнения. В частности, не так давно в «benchmarking game» LuaJIT выносил неокрепшие мозги, обгоняя по скорости выполнения проги на C/C++.

Но как так может быть, что скриптовуха дает пососать сишечке? Поясню на примере:

import math

def sum_exp(list):
    sum = 0.0
    for val in list:
        sum += math.exp(val)

print(sum_exp([a, b, c, d]))
Не считая импортов, здесь CPython сделает 4 разных запроса к ассоциативному массиву по ключу-строке, из них два, math и exp, будут в цикле (__iter__ и __next__ являются слотами, потому на них всегда есть быстрые указатели). Трассирующий компилятор или AOT-оракул-бабаванга-компилятор сможет превратить это в ноль выборок из ассоциативных массивов и вызов одной единственной функции print, производя все вычисления в регистрах при помощи несколько десятков машинных команд. В отсутствие ветвления производительность такого кода будет огромной. Что-то близкео к этому мог бы сделать PyPy, но ограничения языка не дают ему развернуться в полной мере. Даже GCC с вызовами функций из отдельно скомпилированных библиотек будет работать медленнее, чем оптимальный код питона. Это одна из причин, почему в жаве библиотеки сделаны на жаве — они JIT-инлайнятся в нужные места по необходимости, а JNI использовать не рекомендуется. В итоге Java код отстается от сишного только потому, что сишный код использует небезопасные операции.

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

Открываю первый попавшийся проект на гитхабе с PHP

Серьёзно, первый попавшийся? Как ты его вообще выкопал? Давай уже как-то объективно смотреть, сравним что-нибудь из https://github.com/trending/php?since=daily и https://github.com/trending/python?since=daily. Например, схожие по смыслу проекты https://github.com/php-telegram-bot/core и https://github.com/ytdl-org/youtube-dl (то и другое некая автоматизация на базе стороннего api). В питоне сразу бросается в глаза: нет доков, нет тайпхинтов, куча функций в стиле «стена текста», постоянно собирают строки из строк руками (по сути грязный хак, это оправдано только для одноразовых скриптов) и т.д.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Давай уже как-то объективно смотреть, сравним что-нибудь из https://github.com/trending/php?since=daily и https://github.com/trending/python?since=daily.

Я хз, зачем ты сравниваешь топовые проекты.

В питоне сразу бросается в глаза: нет доков, нет тайпхинтов, куча функций в стиле «стена текста», постоянно собирают строки из строк руками (по сути грязный хак, это оправдано только для одноразовых скриптов)

Дальше разбираем сказанное тобой по частям:

нет доков

В пыховом проекте из 10000 строк, 5000 - это доки. Половина! Люди не пишут код - люди пишут доки.

нет тайпхинтов

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

куча функций в стиле «стена текста»

Ты никогда не думал о том, что при чтении текста программы выполняемые функции должны быть видны из самого кода, а не из комментариев к нему? Дублирование кода в комментариях создает потенциал для ошибки. Публичные функции в youtube-dl задокументированы, проблемные куски кода тоже задокументированы.

постоянно собирают строки из строк руками (по сути грязный хак, это оправдано только для одноразовых скриптов)

В питоне нельзя сложить строку с числом, или строку с массивом, даже bytes со строкой нельзя сложить:

>>> print([] + 'asd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
>>> print('asd' + b'fgh')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "bytes") to str

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

топовые проекты

Это не топовые проекты. Во всяком случае пыховский.

Типы нужны, если есть достаточно эффективный статический анализатор

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

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

В общем всё ясно. Доки не нужны, типы не нужны, стена текста это норм ибо «чё тут непонятного». Я считаю, что с таким подходом не тебе бы рассуждать о качестве кода.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от byko3y

На нынешний момент достаточно эффективной статической типизации для питона нет,

А как же Cython? Почему он вообще не взлетел и считается низкоуровневой оптимизацией? Мы же просто расставляем типы и всё.

Для тех кто не в теме Cython, вот пример:

Код на питоне

# code.py
import math, sys

def _is_prime( num ):
    if num <= 1:
        return False
    if num == 2:
        return True
    limit = int(math.sqrt(num))
    limit += 1
    for i in range(2, limit):
        if num % i == 0:
            return False
    return True

def main():
    limit = int(sys.argv[1])
    limit += 1
    for x in range( 0,  limit ):
        if _is_prime( x ):
            print( x )

if __name__=="__main__":
    main()

Для Cython, создаём файл с расширением pxd и расставляем там типы, оригинальный питоновский код не меняется(не обязательно везде использовать cython типы, можно и обычные Python если нужна его длинная арифметика или другие типы)

#code.pxd
import cython

@cython.locals(i=cython.int,limit=cython.int)
cdef bint _is_prime (int num)

@cython.locals(limit=cython.int)
@cython.locals(x=cython.int)
cpdef main()

Где здесь вообще оптимизация? Не более чем расставлять типы по PEP 526.

Зато есть практический результат:

$ cat main.py
import code

if __name__=="__main__":
    code.main()

$ time /c/Python27/python.exe main.py 1000000 > /dev/nul

real    0m1,234s
user    0m0,015s
sys     0m0,031s

$ time /c/Python27/python.exe code.py 1000000 > /dev/nul

real    0m14,745s
user    0m0,015s
sys     0m0,031s

$ time ./code_c.exe 1000000 > /dev/nul

real    0m0,613s
user    0m0,015s
sys     0m0,047s
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от no-such-file

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

В общем всё ясно. Доки не нужны, типы не нужны, стена текста это норм ибо «чё тут непонятного». Я считаю, что с таким подходом не тебе бы рассуждать о качестве кода

Ты знаешь что, ты знаешь как, но ты не знаешь зачем. Тебя даже не смущает то, что комментарии, в общем-то, будут написаны всё теми же словами. Что ты хочешь получить этими словами?
Дать возможность человеку использовать твой код, не читая его? Но ты будешь считать свой код внутренним, перепишешь его, и разломаешь в результате кому-то алгоритм. В итоге такого сценария комментарии дали в лучшем случае плюс-минус ничего, а спасут только тесты, которые выявят нарушение работы после правки.
Или, может, чтобы помочь взглянуть на сложную неявную иерархию вызовов? Мой опыт говорит о том, что подобное описание очень быстро устаревает, и со временем я начал писать комменты себе в блокнот, чтобы потом их выкидывать, а не вставлять в код, потому что в достаточно сложной и периодически изменяемой системе спустя какое-то время эти комментарии начнут вводить в заблуждения, играя в минус.
Поэтому, например, в Qt документируются только публичные методы, а крупные методы по 50 строк не содержат ни одного комментария внутри тела, и отдельные внутренние методы вообще не содержат человекочитаемых комментариев:
https://github.com/qt/qtbase/blob/dev/src/widgets/widgets/qcombobox.cpp
Или вот:
https://github.com/qt/qtbase/blob/dev/src/corelib/kernel/qvariant.cpp
в первых полутора тысячах строк содержится лишь десяток коротких комментариев. Дальше идет большое число однострочных функций, у которых объем комментариев намного превышает объем реализации. И опять-таки там дальше можно увидеть отдельные крупные функции без комментариев внутри.

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

Типы нужны, если есть достаточно эффективный статический анализатор

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

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

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

Потому что динамичность типов

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

не рискнул назвать этот анализатор, который есть, потому что и без моего ответа понимаешь, что сразу будут вопросы по поводу «эффективный»

Нет, я не думал, что ты будешь использовать демагогию вокруг «эффективности». Названия легко гуглятся, не вижу никакой проблемы, если тебе хочется ознакомиться с ними, а не выискивать способ меня потроллить. Вообще смешно, что ты ещё и жаловаться прибежал о том что тебе не дали еды. ЛОЛ.

no-such-file ★★★★★
()
Ответ на: комментарий от fsb4000

А как же Cython? Почему он вообще не взлетел и считается низкоуровневой оптимизацией? Мы же просто расставляем типы и всё.

В CPython тоже хотели делать аннотации типов отдельными типами - хз, сделали ли что-то в нем подобное или нет. В Cython и прямо в файле исходника можно расставить типы, но вот проблема: с каждым явно поставленным типом код работает быстрее, а читается — медленнее. Мы просто расставляем типа — и всё, код можно выбрасывать на помойку.

не обязательно везде использовать cython типы, можно и обычные Python если нужна его длинная арифметика или другие типы

Целочисленные и вещественные типы cython намного быстрее вычисляются, поскольку тусуются в регистрах, а не запакованы в объекты из кучи.

def _is_prime( num ):
...

Здесь 4 запроса к ассоциативным массивам вне цикла (int, math, sqrt, range), и просто гора создаваемых и уничтожаемых объектов в цикле. Моя прога на Си, которая делает один в один то же, отработала за 0.4 с. То есть, Cython здесь очень хорошо заоптимизировал.

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

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

Object - это тоже тип, и вполне себе статический, но совершенно бесполезный для проверки корректности программы. Или даже «int|string|object».

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

Первый раз про такое узнаю. Насколько мне известно, максимум - это массив однотипных данных, без проверки корректности структуры самого массива (монотонное возрастание, отсутствие/наличие ключей).

В т.ч. на основе шаблонов-дженериков.

Шаблоны-обобщения — это плохой стиль программирования в целом, не в контексте какого-то одного языка, поскольку подтакивает писать сложные многословные конструкции, не относящиеся к алгоримту программы. Это C++ приучил людей не обращать внимания на убогость шаблонов, для этого понадобилось много времени, и лишь недавно кол-во ушибленных шаблонами макак превысило критическую массу, и говно растеклось по нескольким языка (Java, C#, Python, PHP, etc). Ладно в C++/C#/Java шаблоны-обобщения еще как-то влияли на хранимые данные и были ограничено оправданы, но для питона и PHP они вообще не соотносятся ни с моделью данных, ни с алгоритмами. И в итоге получается, что единственная функция обобщений в PHP/Python — это нагибать раком кодера и заставлять его писать бесполезные проверки, которые все равно не словят большинство ошибок, вместо того, чтобы прогер писал тесты, более эффективные для проверки корректности в нынешних популярных реализация PHP/Python.

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

Ты мог слиться тихо, но ты выбрал перевод стрелок на меня.

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

Ясно понятно, демагогия на марше. Досадно конечно, ну да хрен с тобой.

no-such-file ★★★★★
()

Кратко суть топика «Я копнул очередной $language, ребят, а там внутри насрано…». Обычная история, смирись. Не надо этому так удивляться как будто с тобой это в первый раз.

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

А можно ссылку на

«В частности, не так давно в «benchmarking game» LuaJIT выносил неокрепшие мозги, обгоняя по скорости выполнения проги на C/C++.»

Я искал, не нашел.

anonymous
()
Ответ на: А можно ссылку на от anonymous

А можно ссылку на
«В частности, не так давно в «benchmarking game» LuaJIT выносил неокрепшие мозги, обгоняя по скорости выполнения проги на C/C++.»

https://web.archive.org/web/20081224093034/http://shootout.alioth.debian.org/...

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

сходил по ссылке

1.0 Scheme PLT #4 1.2 ATS 1.2 Ada 2005 GNAT 1.2 Pascal Free Pascal #2 1.2 OCaml 1.2 C GNU gcc 1.2 C++ GNU g++ #2 1.2 Lisaac 1.3 C# Mono #3 1.3 Lua LuaJIT

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

На некоторорых тестах ближе.

anonymous
()

А кто ты такой? Я не узнаю тебя в гриме: Дийкстра? Нет. Вирт? Да вроде нет. Кнут? Не похож. Энтони Хоар? Не он. Так кто ты? Даже на Мацумото не тянешь.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от byko3y
Например, код генератора выше

def gen(n):
    for i in range(5):
        yield i
может быть переписан как
def gen(n):
    return iterator_from(range(5), lambda x: x)

Но зачем? Генераторы же удобнее, особенно если делать так: array = for i in range(5) yield i

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

я знаю про писание тестов но мне лень писать их. видимо скриптота это не моё, уж лучше больше букв написать в джаве или c++ Каким образом джава или c++ избавляют от написания тестов? Или ты пишешь исключительно код, который потом не используется и не дорабатывается?

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

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

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

осталось выяснить при чём здесь написание тестов

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

Генераторы же удобнее, особенно если делать так: array = for i in range(5) yield i

array = [i for i in range(5)]

Примерно то, для этого сделаны генераторы. То, во что их превратили, никакого отношения к исходной цели не имеет.

byko3y ★★★★
() автор топика
Последнее исправление: byko3y (всего исправлений: 1)
Ответ на: комментарий от anonymous

я знаю про писание тестов но мне лень писать их. видимо скриптота это не моё, уж лучше больше букв написать в джаве или c++

Каким образом джава или c++ избавляют от написания тестов? Или ты пишешь исключительно код, который потом не используется и не дорабатывается?

GUI тестировать очень тяжело, например, потому что миллион тестов может пройти успешно, а потом пользователь нажмет не ту кнопку и потеряет все свои данные. По этой причине нет значимых гуев, написанных на PHP/Perl/Python/Ruby/JavaScript.

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

тему-то не раскрыл - язык здесь при чём?

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

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

нет значимых гуев, написанных на JavaScript

Orly?

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

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

Строго динамические языки не дают гарантий корректности выполнения при условии успешной компиляции и успешного прохождения тестов

Таких гарантий никакие языки(да и не языки тоже) не дают

имеют гору странных и неочевидных особенностей поведения

Любая хоть сколько-нибудь крупная система возрастом более нескольких лет страдает от того же

C++, но это все-таки несколько иной класс языков

Но аргументов в разрезе тестов на эту тему пока нет, ясно

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

Таких гарантий никакие языки(да и не языки тоже) не дают

95% типовых проблем с релизом проги на динамическом языке не пройдут в статичных компиляцию или тестирование. Вот об этом я. Есть целая гора языков, где накосячить с указателем сложно, но ты, я так понимаю, под статически компилированным имеешь в виду C/C++, а я имею в виду Go, Rust, Object Pascal, Haskell, OCaml.

Любая хоть сколько-нибудь крупная система возрастом более нескольких лет страдает от того же

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

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

Я(и ты тоже, кстати) имею ввиду GUI

Все эти GUI писали разработчики из гугла, и делали они это на C++. Гугл влил в это очень много денег.

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

Одноразовые скрипты используются здесь и сейчас, поэтому и чинят их здесь и сейчас. Никакой проблемы в этом нет. Я, работая в vim, не испытываю проблем с опечатками в питоне. Куда больше проблем вызывает логика исполния, так вот я не очень представляю как корректно её реализовать, не покрыв тестами. Вручную все тестировать, а при доработках полный регресс вручную проводить?

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

Я никогда, ЕМНИП, не отрицал достоинств статической типизации(хоть они и продолжение недостатков), только неясно, каким образом это помогает хоть сколько-нибудь уменьшить тестовое покрытие без потери качества продукта. Фанатики, пытающиеся протестировать каждый оператор быстро(или не очень) обламываются и прекращают тестировать сущности меньше чем функция строк на 5-10. Статическая типизация здесь только в скорости обнаружения проблем выигрывает(опустим переход количества в качество, думаю это и так ясно).

если изначально всё было очень плохо, то со временем будет намного хуже

С такой постановкой не спорю

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

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

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

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