metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-11-02 05:15 am

Сложность языков программирования

Power and Complexity in a Programming Language

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

Я бы еще добавил, что сложность вносит стандартная библиотека и API к операционной системе. Вот, например, C# весьма простой и понятый язык. Но .NET фреймворк, особенно в новых версиях - это же ад, его в голове удержать невозможно, особенно с учетом тысяч мелких классов и интерфейсов с одним-двумя методами.
Жаба с ее фреймворками на каждый случай жизни - туда же.

Интересно, как в этом плане пришелся бы Haskell? Сам язык вроде не сильно сложный, а вот используемые в нем концепции - кошмарный ад, а мощность и лаконичность языка порождают вот такие алгоритмы. Хотя насчет последнего - интересно было бы взглянуть на аналогичный алгоритм на другом языке, может там окажется на две страницы еще менее понятного трэша.
wizzard: (Default)

[personal profile] wizzard 2009-11-02 06:12 am (UTC)(link)
За эээ 8.5 лет ковыряния в дотнете, начиная с первых бэт, у меня сложилось устойчивое впечатление, что фрэймворк важно уметь не использовать :)

Ну т.е. вот WinForms - архитектурно страшное убожество, WPF, напротив - крутая штука. Но не первоначальная реализация (в .NET 3.0 и 3.5 он мягко говоря отличается по скорости и удобству использования)

Та же фигня с database access layer'ами и прочая. Благо, ничего магического там нет, можно ковырять, расширять, распиливать, декомпилировать и вообще извращаться. Дублирование кода сильное, есть разные штуки подточенные под разные сценарии. Но в общем всё абсолютно обозримо и сценарий "на вчера" поддерживает очень даже.

И не гнушаться лезть рефлектором, ndepend'ом и прочими смотреть что у него внутри. а, да, еще можно выпросить у микрософта сорцы, но там NDA и прочие пляски с буратинами. можно смотреть внутрь SSCLI и Mono, впрочем.

[identity profile] metaclass.livejournal.com 2009-11-02 07:43 am (UTC)(link)
Вот. У меня точно такое же впечатление. Причем third-party контролы точно так же страдают от излишней сложности.

[identity profile] w00dy.livejournal.com 2009-11-02 10:42 am (UTC)(link)
можно студию попинать чтобы сама сорцы вытаскивала где нужно.

А WinForms это просто ui winapi под .net со всеми ограничениями и багами. То что концепция устарела и нужно было что-то новое и так было понятно.
wizzard: (Default)

[personal profile] wizzard 2009-11-02 11:07 am (UTC)(link)
>> сама сорцы вытаскивала

у меня настроено, просто есть же еще corlib и native-части

>> winapi под .net со всеми ограничениями и багами.
Да.

[identity profile] faceted-jacinth.livejournal.com 2009-11-02 09:14 pm (UTC)(link)
Так она вроде и к нейтив частям умеет вытаскивать хотя бы символы.
symsrv*symsrv.dll*f:\symbols*http://msdl.microsoft.com/download/symbols

[identity profile] softmaster.livejournal.com 2009-11-02 03:43 pm (UTC)(link)
http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx
вроде нет там NDA, просто read-only license.
wizzard: (Default)

[personal profile] wizzard 2009-11-02 03:46 pm (UTC)(link)
Это про BCL. А я про runtime (Execution Engine, Type Checker, JIT и т.д.) говорю

[identity profile] softmaster.livejournal.com 2009-11-02 03:54 pm (UTC)(link)
насколько я понял, оригинальный коммент коммент был про библиотеки и фреймворки, куда можно залезть рефлектором %)
wizzard: (Default)

[personal profile] wizzard 2009-11-02 04:53 pm (UTC)(link)
ну.. куда можем - лазим, куда не можем - просим исходников, вот.

[identity profile] lionet.livejournal.com 2009-11-02 06:13 am (UTC)(link)
Haskell — это такой современный перл (write-only language), с двумя положительными от него отличиями:

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

Итого, для одного программиста, пишущего какой-то кусок быстро — это исключительно вкусный язык.
wizzard: (Default)

[personal profile] wizzard 2009-11-02 06:42 am (UTC)(link)
В меру своего опыта полностью соглашусь.

Если бы они еще сделали stable и testing ветки - цены б им не было. А так, мне кажется, многие боятся, что быстрое развитие что-то им сломает.

[identity profile] metaclass.livejournal.com 2009-11-02 07:45 am (UTC)(link)
Вот я примерно из таких же категорий и исхожу.

[identity profile] potan.livejournal.com 2009-11-02 08:45 am (UTC)(link)
На моем опыте программы сравнимой сложности на Haskell читаются все-таки легче, чем на C, C++, Java, Python и Scheme.
Правда, модифицируются тяжелее - чистота и типизация не дают создавать систему грузиков и противовесиков.

[identity profile] lionet.livejournal.com 2009-11-03 01:48 am (UTC)(link)
isBipartite g = isJust $ runStateT (mapM_ fill (indices g)) M.empty
  where
    fill     v = whenM (M.notMember v`fmap`get) $ spread True v
    spread k v = whenM (paint k v)              $ mapM_ (spread (not k)) (g!v)

paint k v = get >>= \c -> case M.lookup v c of 
    Nothing     -> put (M.insert v k c) >> return True
    Just x|x==k ->                         return False
          |True ->                         fail ""

vs
def is_bipartite(graph): # graph is {id : [id], ...}
    colors = {} # {id : bool, ...}
    def paint(node, color):
        current_color = colors.get(node, None)
        if current_color is not None: return current_color == color
        colors[node] = color
        return all(paint(edge, not color) for edge in graph[node]) 

    return all(paint(node, True) for node in graph if node not in colors)

[identity profile] metaclass.livejournal.com 2009-11-03 05:14 am (UTC)(link)
О блин, на питоне намного понятнее. Это при том, что я одинаково знаю что питон, что хаскель. Вот же зло :)

[identity profile] lionet.livejournal.com 2009-11-03 05:48 am (UTC)(link)
Вывод: хаскель — от лукавого.

[identity profile] cp-poster.livejournal.com 2009-11-02 10:22 am (UTC)(link)
Почему write only то? Может это просто такой высокий входной порог?

[identity profile] lionet.livejournal.com 2009-11-02 10:27 am (UTC)(link)
Мне нужно было вставить хотя бы один controversial point в комментарий, и я это сделал.

[identity profile] aamonster.livejournal.com 2009-11-02 07:51 am (UTC)(link)
Откуда две страницы? На императивном языке с рекурсией - несколько строк (в пределах десятка, не считая типов данных).

Расшифровка

[identity profile] lionet.livejournal.com 2009-11-02 09:05 am (UTC)(link)
Попробую предложить расшифровку алгоритма, который я вижу первый раз мопед не мой кто такой антиламер не знаю и подобного задания никогда в жизни не видел. Честно.

http://lionet.livejournal.com/44305.html

Re: Расшифровка

[identity profile] metaclass.livejournal.com 2009-11-02 09:15 am (UTC)(link)
О, позитивно.

[identity profile] fas-tm.livejournal.com 2009-11-02 09:32 am (UTC)(link)
Может потому что программисты пишущие на языке программирования X никому сегодня ненужны ??? Все же пишут сейчас на фреймворках/с помощью библиотек/etc. Если не брать STL/bost/etc, С++ тоже понятный вполне :) Упрощение и унификация это хорошо, но швейцарским ножем нельзя пилить дерево. А бензопилой наду уметь пользоваться и иметь опыт :)

[identity profile] metaclass.livejournal.com 2009-11-02 09:36 am (UTC)(link)
Оно конечно правильно, если не заглядывать в исходный код этих библиотек. Там же ад внутри, сразу вызывающий синдром Not Invented Here :)

[identity profile] voidex.livejournal.com 2009-11-02 10:13 am (UTC)(link)
Сложность бывает разная. Порог вхождения в Хаскель высок, труднее научиться, но вот читать, понимать и изменять код на нём легче.
Если над задачей надо думать, то над ней надо думать, никакой язык не спасёт. Чем больше думаешь, тем более понятный и легко-модифицируемый рождается вариант. Уродливый тупой (который приходит в голову обычно раньше всех) вариант можно написать и на Хаскеле, только там этому мешает функциональная чистота, а лаконичный вариант нередко на "простом" языке (без ленивости и ФВП) выглядит не менее уродливо, чем тупой.
Ну это так, субъективные ощущения.

[identity profile] kiryl.livejournal.com 2009-11-02 11:22 am (UTC)(link)
Руби мощный, выразительный и лёгкий. И это сыграло с ним злую шутку. Из-за очень низкого порога вхождения, получилось очень красноглазое комьюнити. В большенстве сторонних либ, внутри страх и ужас. Меня это очень расстраивает. Читаю Real World Haskell.