avva: (Default)
[personal profile] avva
«Смолток просто-напросто непрактичен» — пишет [livejournal.com profile] dz, наряду с другой ерундой, в своём сравнении Джавы и Смоллтока. Видно, что он просто не очень хорошо понимает, какая это качественная разница — действительное динамическое ООП — если думает, что «есть reflection API, который все ПРАКТИЧЕСКИЕ задачи - решает». Конечно, все практические задачи, которые могут возникнуть в системе, спроецированной статически, он решает, а другие задачи человеку, не понимающему Смоллток и динамическое ООП, и в голову не придут.

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

Как-то это сумбурно звучит, поэтому попробую зайти с другой стороны. Ясно, что есть области применения, в которых некоторые языки подходят куда лучше других. Ясно, что программисты разнятся по своим способностям, качеству и скорости работы, эффективности результата, и прямое сравнение тут невозможно. Если мы учтём все эти «ясно» и попытаемся всё же вынести из за скобки, останется ли внутри что-то объективное, зависящее от языка? И если останется, насколько оно влиятельно?

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

С другой стороны, мне хочется сказать, что всё наоборот. Метафора амортизации несостоятельна, т.к. не отражает тот факт, что, глядя на одну и ту же задачу с точки зрения очень разных языков и подходов к программированию, мы видим совершенно разные вещи, и исходная сложность поставленной задачи не является чем-то неизменным, она навязана нам тем взглядом, к которому мы привыкли; при смене языка/взгляда/подхода может оказаться, что всё стало во много раз легче, и это не какой-то особенный случай, вызванный специальными обстоятельствами исходной задачи, а самое обыденное дело. И может оказаться, что какие-то языки с этой точки зрения особенно эффективны, т.е. очень хорошо знающий такой язык программист сможет в среднем работать значительно эффективнее, чем очень хорошо знающий другой язык программист тех же способностей, при работе над той же не-специальной задачей общего направления (естественно, такая точка зрения должна опираться на предположение о возможности определить «задачу общего направления» и «примерно тех же способностей» так, чтобы не впасть в замкнутый круг, и, действительно, неочевидно, что можно это сделать).

В общем, я лично сохраняю скептицизм по этому поводу, и первая из вышеописанных точек зрения в целом побеждает во мне вторую. Ко второй, тем не менее (и вообще к теме разных подходов к программированию, и тому, насколько такие подходы влияют на результаты и эффективность работы программиста) сохраняется живой интерес. Так вот, наиболее убедительные и подтверждённые фактами претензии на особую эффективность любимого языка, которые мне приходилось встречать, проистекали из среды поклонников двух языков: Смоллток и Форт. Не знаю, почему именно эти два, возможно, это больше случайность моего личного знакомства с языками, программистами, и различными сетевыми обсуждениями этой темы, чем какая-то объективная реальность; и, как я написал выше, я вовсе не уверен в том, что такие претензии основаны на чём-то реальном. Но любопытно отметить, что общего в этих двух языках (вообще-то очень разных): именно концептуальная чистота языка («всё — объект» или «всё — макро») и ещё я бы отметил интеграцию языка внутри интерактивной системы, полностью написанной на этом же языке, что-то вроде мини-ОС для языка.

Date: 2004-12-22 01:01 am (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Кстати да. Чего мне не хватает в питоне -- это поставить в *некоторых* местах статическую типизацию (и вообще побольше бы статических проверок сделать).

Такое вроде бы появляется в PHP5: опциональный контроль типов, но там о "статическом" сложно говорить :)

Date: 2004-12-22 08:03 am (UTC)
From: [identity profile] dz.livejournal.com
Вот - да меня тоже этот вопрос как раз беспокоит. Как на рантайм, который в душе динамически типизованный, наложить статик тайпчек?

Date: 2004-12-22 11:03 am (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Крамольный ворос: а зачем на runtime?
Почему бы не сделать анализ в первую очередь статическим, до (и помимо) всякого исполнения? Наложим на некоторые места графа программы ограничения, пройдёмся по возможным путям выполнения (всё равно проходим, чтобы обнаружить dead code, etc) и посмотрим, нет ли где нарушения, т. е. противоречивых ограничений. При желании выдадим warning-и, если где-то вдруг ограничение ослабляется, а потом опять ужесточается (мол, не дырка ли?). Это позволит типизировать *некоторые* пути передачи данных, статически доказать, что в указанных местах у нас будут указанные типы.

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

Аналогия: generics в Java 1.5. В runtime ничего не проверяется (и из RTTI про прототипы ничего не узнать), но при компиляции конкретизирующие типы проверены, и можно не сомневаться (в пределах доверия к компилятору), что ошибки приведения типов не будет.

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

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

Date: 2004-12-23 11:25 am (UTC)
From: [identity profile] rivig.livejournal.com
В Питоне все, к сожалению, тоже динамическое. Все-все. Люди этой динамичностью далеко не всегда пользуются. Я, например, пишу почти как на статическом, но не требующем занудных определений типов объектно-функциональном языке. Истинной динамичностью пользуюсь тогда, когда надо загрузить что-либо в run-time, но с этим и Ява неплохо справляется.
Пример с type elimination неплох, только от этой аналогии до сколько-нибудь работающего решения - пропасть. Видимо поэтому никто еще и не пересек ;-)

Date: 2004-12-22 11:56 pm (UTC)
stas: (Default)
From: [personal profile] stas
Как в PHP вообще возможен статический контроль, я очень слабо представляю. Т.е. если иметь дело с продуктом как единым целым, то до некоторой степени его можно проанализировать - но в контексте, скажем, отдельного класса это будет более или менее лишено смысла - без статического обьявления интерфейсов, которого в PHP нету.

Date: 2004-12-23 09:35 am (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Никак не возможен -- только динамический %))

Про PHP5 потому, что там *опциональный* контроль типов, хоть и не статический.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 04:43 am
Powered by Dreamwidth Studios