Жизнь внутри метода
23.10.2008
|
IT |
Из Лингвы:
У меня есть подозрение, что данное определение несколько устарело. Лет так на тридцать. 30 лет назад такое определение было совершенно верным и отражало существующий тогда порядок вещей. Код программы действительно состоял из последовательности команд и данных, всё было предельно просто:
Что же изменилось с тех пор? Давайте посмотрим:
За 30 лет развития традиционных языков программирования (Fortran, PL/1, COBOL, Pascal, C/C++, Java, C#) принципиально изменился только мир вокруг метода. Мы получили наследование, инкапсуляцию и полиморфизм, компонентность и контрактность, шаблоны/дженерики и атрибуты, массу паттернов проектирования, подходов и отходов, методологий и прочих вещей, призванных организовать код в нечто более менее управляемое.
Что же изменилось внутри метода? Да почти ничего. Как и 30 лет назад мы имеем if/else/switch, несколько циклов, команды выхода из цикла и метода, операции, присваивание и ещё немного по мелочёвке. Было только одно существенное новшество – замыкания в C# 2.0 в 2005-м году, и те приобрели человеческое лицо только в 2008-м в C# 3.0 с введением лямбд. Может быть ещё с натяжкой вывод типов из инициализации. И это всё! Всё! За 30, блин (в грубой форме), лет!
Фактически, 30 лет развитие шло только снаружи метода и сегодня мы имеем полный мыслимый набор инструментов для организации кода и управления им. По развитию снаружи метода мы уже давно вышли в космос и осваиваем другие планеты. А внутри метода? Внутри мы всё ещё в той же пещере, с тем же каменным топором в руках, что и 30 лет назад. Ни письменности, ни колеса, ни железа.
Думаю, именно в этом заключается природа предпочтений многих разработчиков. Все хотят быть архитекторами, никто не хочет быть кодером. Ведь кто такой архитектор? Это стратег, командир космической эскадры, бороздящей просторы вселенной. А кто такой кодер? Пещерный человек с каменным топором в руке, пусть даже его пещера и находится внутри одного из кораблей эскадры. Жуткий дисбаланс. Иметь такой дисбаланс в стратегических и тактических средствах не просто глупо, а уже даже не смешно. Только представьте себе ситуацию – космический десант в виде волосатого безграмотного сброда в шкурах с каменными топорами и костяными ножами. А ведь это и есть истинный портрет современных коммандос от IT. Мы сильно преуспели в стратегии, но при этом являемся абсолютными ламерами в тактике.
В результате часто следствием такого дисбаланса становится смена приоритетов – архитектура всё, код ничто. Много ли у нас обсуждений на тему жизни внутри метода? А чему у нас учат в вузах? Есть ли у нас хотя бы один предмет, рассказывающий как правильно писать код внутри метода? Скорее всего нет. А о чём там рассказывать? Вот и получается на уровне кода бескультурье, самопал и дурь. Но ведь это просто чудовищная несправедливость. Без кода внутри метода, без кодера программа работать не будет, точнее её просто не будет. Без внешней обвязки и архитектора хоть как-то, но можно обойтись.
Но так ли всё плохо? Есть ли надежда на просветление? Конечно, есть. Имя этому просветлению – (кто бы мог подумать) functional programming.
Как это ни странно, но всё это время, в отличии от традиционных языков программирования, развитие на планете FP шло по пути наращивания возможностей внутри функции и манипуляции функциями. В результате было наработано множество техник и паттернов не относящихся напрямую к FP: pattern matching, algebraic types, tuples, type inference, immutability. Всё это спокойно можно использовать вообще без знания, что такое функция высшего порядка. Более того, если попытаться применить FP в традиционном программировании, то окажется, что и ФВП и любые другие возможности FP вообще никак не конфликтуют ни с ООП, ни с АОП, ни с компонентностью, вообще ни с чем. Причина в том, что они применимы и улучшают жизнь внутри метода, практически никак не проявляя себя и не влияя на то, что происходит снаружи, что отлично демонстрируется новыми возможностями C# 3.0.
Казалось бы, причём тут Немерле? А вы думали я о чём? Не дождётесь!
Немерле – это удачная попытка совмещения традиционного программирования и FP. Практически все, что наработано в FP поддерживается в Немерле и уже сейчас готово к использованию. Можно отложить в сторону каменный топор (if/else) и взять в руки охринительной мощности базуку (match). Кривизну out/ref параметров можно заменить на tuples, а зоопарк из приватных методов на удобные локальные функции. Много чего. И главное больше нет необходимости компенсировать скудность тактических средств стратегией.
Это путь в другой мир, в другую жизнь внутри всё того же метода. Примерно как разница между структурным C и современным C# с точки зрения организации архитектуры приложения. Вспомните, как вы изучали ООП или COM/компонентность, точно так же и здесь напрочь рушатся устоявшиеся представления о существующем порядке вещей. Код, получив стероиды от FP, становится мощнее, выразительнее, компактнее, понятнее и интереснее одновременно. Здесь есть куда приложить мозги и есть от чего получить эффект. Кодер здесь уже не троглодит в поеденной молью шкуре, а боец спецназа в нано-костюме из Crysis , способный в одиночку выполнять самые сложные задания.
Впрочем, это всё лирика. На практике получается, что код внутри и снаружи – это два разных кода, два мира, внешний и внутренний. Это хорошо видно при рефакторинге, когда код алгоритма не трогается, но его компоновка полностью меняется. Из этого, кстати, напрашивается ещё один вывод.
Людей принято делить по темпераменту на сангвиников, холериков, флегматиков и меланхоликов. Программистов можно условно поделить на (в примере выше я назвал метод Foo, а класс Bar) фуриков и бариков, на тех, чей код растёт из методов и тех, кто проектирует приложение от иерархий классов. Попробуйте ответить для себя на вопрос кто вы. Представьте, что вы пишите небольшое консольное приложение строчек на 300. Я – однозначно фурик. Я сразу начну писать код прямо в методе Main и только когда почувствую дискомфорт, озабочусь иерархией классов. Делать это сразу я не стану, т.к. считаю это бесполезной тратой времени, потому что не знаю, что меня ждёт впереди. Потом, если понадобится, будет всё, и иерархии, и паттерны, и компоненты. Но это потом, а пока главное – код, главное – функционал.
Смею предположить, что именно поэтому Немерле произвёл на меня столь сильное впечатление. И, наоборот, для бариков все эти фенечки вторичны. А мега-архитекторам так вообще глубоко до лампочки. Представим себе такого условного мега-архитектора. Вот взял он Немерле, покопался в нём и ничего интересного для себя не обнаружил. И правильно. Ведь с точки зрения архитектуры приложения в целом Немерле не привносит ничего нового. Вообще ничего. Все фичи на уровне методов, а методы у нас удел кодеров, затупятся каменные топоры, настругают ещё. В общем, нафига такой козе такой баян? Непонятно.
Собственно, всё. Теперь можно и пофлеймить
Сразу хочу обозначить несколько моментов для предотвращения ненужного флейма.
— Я умышленно не стал трогать МП, так эта вещь идёт в параллель с обсуждаемой темой.
— Я знаю про F# и другие функциональные языки. Моё мнение – у них нет будущего в мэйнстриме даже на платформе .NET по причине необходимости переселения на другую планету.
— Все имена и совпадения в тексте случайны.
Код [программы] — компьютерная программа или часть программы: последовательность команд, данных и описаний данных, из которых она состоит.
У меня есть подозрение, что данное определение несколько устарело. Лет так на тридцать. 30 лет назад такое определение было совершенно верным и отражало существующий тогда порядок вещей. Код программы действительно состоял из последовательности команд и данных, всё было предельно просто:
int Foo()
{
return 2 * 2;
}
Что же изменилось с тех пор? Давайте посмотрим:
class Bar
{
int Foo()
{
return 2 * 2;
}
}
За 30 лет развития традиционных языков программирования (Fortran, PL/1, COBOL, Pascal, C/C++, Java, C#) принципиально изменился только мир вокруг метода. Мы получили наследование, инкапсуляцию и полиморфизм, компонентность и контрактность, шаблоны/дженерики и атрибуты, массу паттернов проектирования, подходов и отходов, методологий и прочих вещей, призванных организовать код в нечто более менее управляемое.
Что же изменилось внутри метода? Да почти ничего. Как и 30 лет назад мы имеем if/else/switch, несколько циклов, команды выхода из цикла и метода, операции, присваивание и ещё немного по мелочёвке. Было только одно существенное новшество – замыкания в C# 2.0 в 2005-м году, и те приобрели человеческое лицо только в 2008-м в C# 3.0 с введением лямбд. Может быть ещё с натяжкой вывод типов из инициализации. И это всё! Всё! За 30, блин (в грубой форме), лет!
Фактически, 30 лет развитие шло только снаружи метода и сегодня мы имеем полный мыслимый набор инструментов для организации кода и управления им. По развитию снаружи метода мы уже давно вышли в космос и осваиваем другие планеты. А внутри метода? Внутри мы всё ещё в той же пещере, с тем же каменным топором в руках, что и 30 лет назад. Ни письменности, ни колеса, ни железа.
Думаю, именно в этом заключается природа предпочтений многих разработчиков. Все хотят быть архитекторами, никто не хочет быть кодером. Ведь кто такой архитектор? Это стратег, командир космической эскадры, бороздящей просторы вселенной. А кто такой кодер? Пещерный человек с каменным топором в руке, пусть даже его пещера и находится внутри одного из кораблей эскадры. Жуткий дисбаланс. Иметь такой дисбаланс в стратегических и тактических средствах не просто глупо, а уже даже не смешно. Только представьте себе ситуацию – космический десант в виде волосатого безграмотного сброда в шкурах с каменными топорами и костяными ножами. А ведь это и есть истинный портрет современных коммандос от IT. Мы сильно преуспели в стратегии, но при этом являемся абсолютными ламерами в тактике.
В результате часто следствием такого дисбаланса становится смена приоритетов – архитектура всё, код ничто. Много ли у нас обсуждений на тему жизни внутри метода? А чему у нас учат в вузах? Есть ли у нас хотя бы один предмет, рассказывающий как правильно писать код внутри метода? Скорее всего нет. А о чём там рассказывать? Вот и получается на уровне кода бескультурье, самопал и дурь. Но ведь это просто чудовищная несправедливость. Без кода внутри метода, без кодера программа работать не будет, точнее её просто не будет. Без внешней обвязки и архитектора хоть как-то, но можно обойтись.
Но так ли всё плохо? Есть ли надежда на просветление? Конечно, есть. Имя этому просветлению – (кто бы мог подумать) functional programming.
Как это ни странно, но всё это время, в отличии от традиционных языков программирования, развитие на планете FP шло по пути наращивания возможностей внутри функции и манипуляции функциями. В результате было наработано множество техник и паттернов не относящихся напрямую к FP: pattern matching, algebraic types, tuples, type inference, immutability. Всё это спокойно можно использовать вообще без знания, что такое функция высшего порядка. Более того, если попытаться применить FP в традиционном программировании, то окажется, что и ФВП и любые другие возможности FP вообще никак не конфликтуют ни с ООП, ни с АОП, ни с компонентностью, вообще ни с чем. Причина в том, что они применимы и улучшают жизнь внутри метода, практически никак не проявляя себя и не влияя на то, что происходит снаружи, что отлично демонстрируется новыми возможностями C# 3.0.
Казалось бы, причём тут Немерле? А вы думали я о чём? Не дождётесь!
Немерле – это удачная попытка совмещения традиционного программирования и FP. Практически все, что наработано в FP поддерживается в Немерле и уже сейчас готово к использованию. Можно отложить в сторону каменный топор (if/else) и взять в руки охринительной мощности базуку (match). Кривизну out/ref параметров можно заменить на tuples, а зоопарк из приватных методов на удобные локальные функции. Много чего. И главное больше нет необходимости компенсировать скудность тактических средств стратегией.
Это путь в другой мир, в другую жизнь внутри всё того же метода. Примерно как разница между структурным C и современным C# с точки зрения организации архитектуры приложения. Вспомните, как вы изучали ООП или COM/компонентность, точно так же и здесь напрочь рушатся устоявшиеся представления о существующем порядке вещей. Код, получив стероиды от FP, становится мощнее, выразительнее, компактнее, понятнее и интереснее одновременно. Здесь есть куда приложить мозги и есть от чего получить эффект. Кодер здесь уже не троглодит в поеденной молью шкуре, а боец спецназа в нано-костюме из Crysis , способный в одиночку выполнять самые сложные задания.
Впрочем, это всё лирика. На практике получается, что код внутри и снаружи – это два разных кода, два мира, внешний и внутренний. Это хорошо видно при рефакторинге, когда код алгоритма не трогается, но его компоновка полностью меняется. Из этого, кстати, напрашивается ещё один вывод.
Людей принято делить по темпераменту на сангвиников, холериков, флегматиков и меланхоликов. Программистов можно условно поделить на (в примере выше я назвал метод Foo, а класс Bar) фуриков и бариков, на тех, чей код растёт из методов и тех, кто проектирует приложение от иерархий классов. Попробуйте ответить для себя на вопрос кто вы. Представьте, что вы пишите небольшое консольное приложение строчек на 300. Я – однозначно фурик. Я сразу начну писать код прямо в методе Main и только когда почувствую дискомфорт, озабочусь иерархией классов. Делать это сразу я не стану, т.к. считаю это бесполезной тратой времени, потому что не знаю, что меня ждёт впереди. Потом, если понадобится, будет всё, и иерархии, и паттерны, и компоненты. Но это потом, а пока главное – код, главное – функционал.
Смею предположить, что именно поэтому Немерле произвёл на меня столь сильное впечатление. И, наоборот, для бариков все эти фенечки вторичны. А мега-архитекторам так вообще глубоко до лампочки. Представим себе такого условного мега-архитектора. Вот взял он Немерле, покопался в нём и ничего интересного для себя не обнаружил. И правильно. Ведь с точки зрения архитектуры приложения в целом Немерле не привносит ничего нового. Вообще ничего. Все фичи на уровне методов, а методы у нас удел кодеров, затупятся каменные топоры, настругают ещё. В общем, нафига такой козе такой баян? Непонятно.
Собственно, всё. Теперь можно и пофлеймить
Сразу хочу обозначить несколько моментов для предотвращения ненужного флейма.
— Я умышленно не стал трогать МП, так эта вещь идёт в параллель с обсуждаемой темой.
— Я знаю про F# и другие функциональные языки. Моё мнение – у них нет будущего в мэйнстриме даже на платформе .NET по причине необходимости переселения на другую планету.
— Все имена и совпадения в тексте случайны.
23.10.2008 1174 комментария |
IT>Но так ли всё плохо? Есть ли надежда на просветление? Конечно, есть. Имя этому просветлению – (кто бы мог подумать) functional programming.
Ну, ёптыть. Более забористой травы, чем FP в области программирования я пока не встречал. Кто ни попробует -- у всех бошку сносит напрочь.
E>Ну, ёптыть. Более забористой травы, чем FP в области программирования я пока не встречал. Кто ни попробует -- у всех бошку сносит напрочь.
Этот топик как раз о том, что не у всех и я долго не мог понять почему
IT>Этот топик как раз о том, что не у всех и я долго не мог понять почему
Наверное потому-что пару десятков лет "бошку" пытались снести на объектно-ориентированный лад. Хотя классики предупреждали:
IMHO ФП и ООП несовместимы.
PS. Похоже в математике нет ничего, на чем могло бы основываться ООП, в то время как функциональное программирование просто пропитано идеями из математики. А ведь давно известно, что
I>PS. Похоже в математике нет ничего, на чем могло бы основываться ООП, в то время как функциональное программирование просто пропитано идеями из математики.
A Theory of Objects как теоретический фундамент не прокатит?
На citeseer есть прорва статей в которых OO выражают средствами FP.
И у небезывестного Олега что-то видел на эту тему.
IT>>Этот топик как раз о том, что не у всех и я долго не мог понять почему
I>Наверное потому-что пару десятков лет "бошку" пытались снести на объектно-ориентированный лад. Хотя классики предупреждали:
За цитаты — респект
А вот как из процетированно следует, что
I>IMHO ФП и ООП несовместимы.
неясно Или это только IMHO?
I>IMHO ФП и ООП несовместимы.
IMHO, как раз наоборот. Высокий уровень дизайна — ООП (паттерны, классы), низкий (внутри классов) — ФП.
I>IMHO ФП и ООП несовместимы.
Давай попробуем сделать так. Представим, что ФП и ООП это не целые парадигмы, а просто набор паттернов. Ну там ООП — это инкапсуляция, наследование и полиморфизм, а ФП даже лень перечислять. Так вот теперь ответь на вопрос, какие из этих паттернов между собой несовместимы.
IT>Давай попробуем сделать так. Представим, что ФП и ООП это не целые парадигмы, а просто набор паттернов. Ну там ООП — это инкапсуляция, наследование и полиморфизм, а ФП даже лень перечислять. Так вот теперь ответь на вопрос, какие из этих паттернов между собой несовместимы.
Угу совместимы тот же Ocaml да и величайший из языков на букву N это демонстрируют. Но совместимы только на том уровне который ты сейчас рекламируешь, а вот если идти выше то уже нет, притом скорее и не отрицают и не дополняют друг — друга а просто совершено различны.
FR>Угу совместимы тот же Ocaml да и величайший из языков на букву N это демонстрируют. Но совместимы только на том уровне который ты сейчас рекламируешь, а вот если идти выше то уже нет, притом скорее и не отрицают и не дополняют друг — друга а просто совершено различны.
Уровень выше это для тех кто всосал FP с молоком матери, а особо продвинутым оно передалось вообще по трубочке ещё в чреве. Я к ним, к счастью, не отношусь.
IT>Уровень выше это для тех кто всосал FP с молоком матери, а особо продвинутым оно передалось вообще по трубочке ещё в чреве. Я к ним, к счастью, не отношусь.
Достаточно чтобы ООП не был впитан с молоком матери или еще раньше
Я как раз и отношусь к таким (большое влияние форта на неокрепший еще мозг ).
E>>Ну, ёптыть. Более забористой травы, чем FP в области программирования я пока не встречал. Кто ни попробует -- у всех бошку сносит напрочь.
IT>Этот топик как раз о том, что не у всех и я долго не мог понять почему
В стартовом сообщении темы ты как раз и не ответил на вопрос "почему же бошку сносит не у всех".
PS. В начале 90-х в Союзе у многих крышу срывало Прологом. С тех пор я думал, что именно Пролог самая крутая трава. Но, видимо, FP еще круче.
E>В стартовом сообщении темы ты как раз и не ответил на вопрос "почему же бошку сносит не у всех".
Не ответил? Странно. Ну ладно. Ответ тогда может звучать так: у людей разные предпочтения и тем, кто проектирует приложения от иерархий классов, то что происходит внутри методов глубоко вторично.
E>PS. В начале 90-х в Союзе у многих крышу срывало Прологом. С тех пор я думал, что именно Пролог самая крутая трава. Но, видимо, FP еще круче.
Пролог трава более крутая, но к сожалению плохо совместимая с жизнью, так как создать эффективные реализации практически невозможно, и с императивными языками не стыкуется.
VD>Здравствуйте, eao197, Вы писали:
E>>PS. В начале 90-х в Союзе у многих крышу срывало Прологом. С тех пор я думал, что именно Пролог самая крутая трава. Но, видимо, FP еще круче.
VD>Пролог трава более крутая, но к сожалению плохо совместимая с жизнью, так как создать эффективные реализации практически невозможно, и с императивными языками не стыкуется.
Это почему это не стыкуется? Очень даже стыкуется. Посмотри тот же интерфейс SWI Prolog. Всё стыкуется.
VD>Пролог трава более крутая, но к сожалению плохо совместимая с жизнью, так как создать эффективные реализации практически невозможно, и с императивными языками не стыкуется.
Еще как стыкуется. Пролог-машинку можно использовать как "решатель", т.е. ставишь ей задачу (подаёшь данные), запускаешь, и забираешь результат. Сама по себе пролог-программа имеет глобальный контекст, поэтому для обхода этого все реализации embedded-прологов позволяют плодить независимые инстансы пролог-машин, вполне удобно и применимо.
"Мясо" все равно сейчас писать намного проще, чем раньше. Появились фреймворки и это главное. Если раньше надо было все писать самому, то сейчас можно использовать готовое.
IT>Фактически, 30 лет развитие шло только снаружи метода и сегодня мы имеем полный мыслимый набор инструментов для организации кода и управления им. По развитию снаружи метода мы уже давно вышли в космос и осваиваем другие планеты. А внутри метода? Внутри мы всё ещё в той же пещере, с тем же каменным топором в руках, что и 30 лет назад. Ни письменности, ни колеса, ни железа.
Взять например web-программирование. Тогда каменный топор — это когда html код надо формировать плюсованием строк. От этого очевидно очень далеко ушли.
IT>Много ли у нас обсуждений на тему жизни внутри метода?
Загляните в форум по .NET'у, там только такие вопросы и есть.
IT>>Много ли у нас обсуждений на тему жизни внутри метода?
_>Загляните в форум по .NET'у, там только такие вопросы и есть.
Ты, ИМХО, не правильно IT понял. Он о форме, а ты о содержании.
_>"Мясо" все равно сейчас писать намного проще, чем раньше.
Мясо как писалось раньше на if/else/while, так и сейчас пишется на if/else/while.
_>Появились фреймворки и это главное. Если раньше надо было все писать самому, то сейчас можно использовать готовое.
Если бы фреймворки решали всё, то всё уже было бы давно написано и мы были бы без работы. Тем не менее мне почему-то приходится каждый день писать код не покладая рук.
_>Взять например web-программирование. Тогда каменный топор — это когда html код надо формировать плюсованием строк. От этого очевидно очень далеко ушли.
В ASP.NET эта проблема решается средствами метапрограммирования, конкретно precompile time генерацией. А дальше практически как ты сказал, правда не конкатенация, а вывод в stream. Но сути дела это не меняет. Придумали парни из MS DSL для типовой задачи, очень хорошо. Но как мы уже выяснили типовыми задачами жизнь не ограничивается. Почему-то работодатели когда ищут ASP.NET программиста включают в графу skills C#. А значит придётся писать ifs & whiles.
IT>>Много ли у нас обсуждений на тему жизни внутри метода?
_>Загляните в форум по .NET'у, там только такие вопросы и есть.
Дай ссылку хатя бы на один.
IT>Мясо как писалось раньше на if/else/while, так и сейчас пишется на if/else/while.
Вопрос в том сколько раньше этих if/else/while нужно было, чтобы написать что-то и сколько сейчас. Я прекрасно понимаю, что мы о разном говорим: вы про синтаксические конструкции внутри методов, а я про то насколько проще стало писать мясо используя готовые написанные компоненты. Но видимо не так уж важны эти синтаксические навороты...
_>>Появились фреймворки и это главное. Если раньше надо было все писать самому, то сейчас можно использовать готовое.
IT>Если бы фреймворки решали всё, то всё уже было бы давно написано и мы были бы без работы. Тем не менее мне почему-то приходится каждый день писать код не покладая рук.
Хехе, вы оптимист. Что значит ВСЕ написано? Все нельзя написать и кстати любой фреймворк можно улучшить. Поэтому тут работа никогда не закончится.
_>>Взять например web-программирование. Тогда каменный топор — это когда html код надо формировать плюсованием строк. От этого очевидно очень далеко ушли.
IT>В ASP.NET эта проблема решается средствами метапрограммирования, конкретно precompile time генерацией. А дальше практически как ты сказал, правда не конкатенация, а вывод в stream. Но сути дела это не меняет. Придумали парни из MS DSL для типовой задачи, очень хорошо. Но как мы уже выяснили типовыми задачами жизнь не ограничивается. Почему-то работодатели когда ищут ASP.NET программиста включают в графу skills C#. А значит придётся писать ifs & whiles.
Да, внутри те же if/else/while. Но только если раньше это все приходилось писать самому, то теперь нет проблем: взял ASP.NET и ваяй сколько душе угодно. Надо использовать шаблоны? Пожалуйста тебе UserControl. Надо кеширование? Да нет проблем, выбирай что душе угодно.
_>Вопрос в том сколько раньше этих if/else/while нужно было, чтобы написать что-то и сколько сейчас. Я прекрасно понимаю, что мы о разном говорим: вы про синтаксические конструкции внутри методов, а я про то насколько проще стало писать мясо используя готовые написанные компоненты. Но видимо не так уж важны эти синтаксические навороты...
Это всё до поры до времени. Вот здесь я приводил пример того, как синтаксические навороты рвут if/else как тузик грелку.
IT>Это всё до поры до времени. Вот здесь я приводил пример того, как синтаксические навороты рвут if/else как тузик грелку.
Собственно, я тоже совсем недавно об этом упоминал.
Пример хороший и я согласен — преимущества у LINQ очевидные, но опять же есть одно но. Если исходные данные будут браться из базы данных, то надо очень четко следить, чтобы вот такой вот наворот:
не наворотил тучу запросов к базе данных вместо одного/нескольких. И частенько это будет снова решаться на уровне SQL и простейших операций в .NET.
А так — да, я преимуществ LINQ не отрицаю.
_>Пример хороший и я согласен — преимущества у LINQ очевидные, но опять же есть одно но. Если исходные данные будут браться из базы данных, то надо очень четко следить, чтобы вот такой вот наворот:
_>не наворотил тучу запросов к базе данных вместо одного/нескольких.
Серъезно? Ну-ка, ну-ка, и как же нужно модифицировать этот запрос, чтобы он наворотил тучу SQL запросов? Хочется подтвердить эту небезынтересную гипотезу реальным ахтунг-примером.
Вот тут например: http://codebetter.com/blogs/david.hayden/archive/2007/08/06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios.aspx
Или тут: http://msmvps.com/blogs/theproblemsolver/archive/2008/03/04/linq-to-sql-and-prefetching-data.aspx
Ну и т.п.
Когда есть join'ы надо быть с LINQ очень аккуратным.
_>Да, внутри те же if/else/while. Но только если раньше это все приходилось писать самому, то теперь нет проблем: взял ASP.NET и ваяй сколько душе угодно. Надо использовать шаблоны? Пожалуйста тебе UserControl. Надо кеширование? Да нет проблем, выбирай что душе угодно.
Правильно я тебя понял: в процессе эволюции методы вовсе писать не понадобится?
AVK>Правильно я тебя понял: в процессе эволюции методы вовсе писать не понадобится?
Неправильно. В процессе эволюции не методы, а "примитивы" придется писать все реже и реже. Если раньше в программах на VB сортировка встречалась в каждом более-менее приличном проекте, то сейчас она идет в .NET Framework и никто (ну 99%) этим не заморачивается. Кроме сложных случаев, когда стандартная сортировка не оптимальна, но и это в итоге решится, если таких сложных случаев станет много.
_>Неправильно. В процессе эволюции не методы, а "примитивы" придется писать все реже и реже.
А что такое примитивы? И что, окромя таинственных примитивов, при этом останется внутри методов?
_> Если раньше в программах на VB сортировка встречалась в каждом более-менее приличном проекте, то сейчас она идет в .NET Framework и никто (ну 99%) этим не заморачивается.
Ну и чего? Это ж совсем не означает, что конструкция if тоже не используется. Еще раз повторюсь — речь о форме, а не о содержании.
AVK>А что такое примитивы? И что, окромя таинственных примитивов, при этом останется внутри методов?
Все то, что входит в библиотеки. Как пример библиотеки — .NET Framework. Внутри как и всегда логика.
_>> Если раньше в программах на VB сортировка встречалась в каждом более-менее приличном проекте, то сейчас она идет в .NET Framework и никто (ну 99%) этим не заморачивается.
AVK>Ну и чего? Это ж совсем не означает, что конструкция if тоже не используется. Еще раз повторюсь — речь о форме, а не о содержании.
Ну так я уже сказал, что мы о разном говорим. Я говорю, что изменения есть и направлены они в сторону содержания.
IT>Казалось бы, причём тут Немерле? А вы думали я о чём? Не дождётесь!
Почему то после прочтения первой строчки я уже в этом не сомневался.
IT> Попробуйте ответить для себя на вопрос кто вы. Представьте, что вы пишите небольшое консольное приложение строчек на 300.
Не смог. Ответить, в смысле . Пишу и то и другое одновременно.
Я так понимаю, это обещаное объяснение, почему мне не нравится Немерле? Тогда мимо. Я как раз таки очень положительно отношусь к ФП, и даже первый готов воткнуть Хейлсбергу вилку в глаз за то, что в шарпе до сих пор нет паттерн матчинга . Скептическое отношение у меня как раз таки к МП, а точнее к его реализации в Немерле.
Ну и еще, хоть я и стараюсь с собой бороться, местный неуемный немерлевый пиар, приправленный изрядной порцией демагогии, периодически переходящей в хамство, вызывает чисто инстинктивное раздражение и отторжение.
AVK>Скептическое отношение у меня как раз таки к МП, а точнее к его реализации в Немерле.
+1, реализация кошмарная, особенно после семейства скобочных в этом плане скобочные превзойти по-моему невозможно в принципе.
AVK>Скептическое отношение у меня как раз таки к МП, а точнее к его реализации в Немерле.
Мне очень интересно послушать, какие в ней есть реальные проблемы.
AVK>Ну и еще, хоть я и стараюсь с собой бороться, местный неуемный немерлевый пиар, приправленный изрядной порцией демагогии, периодически переходящей в хамство, вызывает чисто инстинктивное раздражение и отторжение.
Угм. "Сниму шапку, пусть назло бабушке уши отмерзнут нахрен". Всё таки странно слышать такую аргументацию от взрослого человека.
AF>Мне очень интересно послушать, какие в ней есть реальные проблемы.
А мне уже нет. Я уже мильен раз об этом говорил, и поднимать старый флейм нет никакого желания.
AF>Угм. "Сниму шапку, пусть назло бабушке уши отмерзнут нахрен". Всё таки странно слышать такую аргументацию от взрослого человека.
Это не аргументация. Это констатация факта. Если непонятно — могу проиллюстрировать: когда зовут обедать криком "жрать, суки", у меня почему то аппетит пропадает.
Ну и насчет взрослого человека — давай все таки обходится без хамства.
AVK>А мне уже нет. Я уже мильен раз об этом говорил, и поднимать старый флейм нет никакого желания.
Ну тогда не надо поднимать флейм, достаточно просто нейтрально написать — "я считаю, что вот такая-то вещь в реализации является проблемой вот в таких-то случаях".
AVK>Это не аргументация. Это констатация факта. Если непонятно — могу проиллюстрировать: когда зовут обедать криком "жрать, суки", у меня почему то аппетит пропадает.
Ни разу не видел ничего в духе "пользуйтесь Немерле с#%и"
AVK>Ну и насчет взрослого человека — давай все таки обходится без хамства.
Давай.
AF>Ну тогда не надо поднимать флейм, достаточно просто нейтрально написать — "я считаю, что вот такая-то вещь в реализации является проблемой вот в таких-то случаях".
Не вижу разницы и причин, почему ты посчитал что я начинаю флейм.
AF>Ни разу не видел ничего в духе "пользуйтесь Немерле с#%и"
А я видел.
AVK>Не вижу разницы и причин, почему ты посчитал что я начинаю флейм.
Ты написал "нет желания поднимать старый флейм" — я написал "ну и не надо его поднимать".
Чтобы устроить флейм нужно как минимум две желающие этого стороны, не так ли?
AVK>А я видел.
ссылку, пожалуйста
AF>Ты написал "нет желания поднимать старый флейм" — я написал "ну и не надо его поднимать".
Ну так я и не поднимаю. В чем суть притензии?
AVK>>А я видел.
AF>ссылку, пожалуйста
Надеюсь, ты понимаешь, что мой пример — это иллюстрация мысли, а не точное описание происходящего. Что же касается ссылки — думаю, ты и без ссылки легко найдешь требуемое.
AF>>Мне очень интересно послушать, какие в ней есть реальные проблемы.
AVK>А мне уже нет. Я уже мильен раз об этом говорил, и поднимать старый флейм нет никакого желания.
Раз миллион, то не составит труда найти ссылку хоть на одно внятное объяснение?
VD>Раз миллион, то не составит труда найти ссылку хоть на одно внятное объяснение?
Лень искать, если честно. Если тебе действительно интересно, пошукай тему с названием то ли "Nemerle vs все остальное", то ли "Nemerle vs весь мир". Смотреть сообщения мои, IB, Синклера.
Ну а насчет внятного — для тебя любое объяснение, отличное от Nemerle рулиззз, как показывает практика, будет невнятным, вредничанием и прочая. Ты уж извини, но другого у меня нет. Не все мыслят так же, как ты.
AVK>Здравствуйте, VladD2, Вы писали:
VD>>Раз миллион, то не составит труда найти ссылку хоть на одно внятное объяснение?
AVK>Лень искать, если честно. Если тебе действительно интересно, пошукай тему с названием то ли "Nemerle vs все остальное", то ли "Nemerle vs весь мир". Смотреть сообщения мои, IB, Синклера.
AVK>Ну а насчет внятного — для тебя любое объяснение, отличное от Nemerle рулиззз, как показывает практика, будет невнятным, вредничанием и прочая. Ты уж извини, но другого у меня нет. Не все мыслят так же, как ты.
Ясно. Опять много слов и никакого дела. Другого и не ожидал, если честно.
ЗЫ
За других тоже не стоит говорить. Особенно за Синклера. Может быть мне конечно и показалось, но он в некоторый момент как-то резко переменил риторику.
VD>Ясно. Опять много слов и никакого дела. Другого и не ожидал, если честно.
Ну а что я могу на подобное ответить? Учитывая, что "внятное" — характеристика в большей степени субъективная, то мне остается только признать — да, вероятно я не в состоянии дать внятное для тебя объяснение.
VD>ЗЫ
VD>За других тоже не стоит говорить. Особенно за Синклера.
А я за него нигде и не говорил, вообще то (в отличие от кое кого, кто тут решил поговорить за меня). Просто предложил почитать его сообщения, бо с его точкой зрения в тех флеймах я в общем и целом согласен.
VD>Может быть мне конечно и показалось, но он в некоторый момент как-то резко переменил риторику.
Ну и кто из нас тут говорит за Синклера?
IT>>Казалось бы, причём тут Немерле? А вы думали я о чём? Не дождётесь!
AVK>Почему то после прочтения первой строчки я уже в этом не сомневался.
Первая строчка была:
Ну ты телепат!
IT>> Попробуйте ответить для себя на вопрос кто вы. Представьте, что вы пишите небольшое консольное приложение строчек на 300.
AVK>Не смог. Ответить, в смысле . Пишу и то и другое одновременно.
Я в этом ни секунды не сомневаюсь.
AVK>Я так понимаю, это обещаное объяснение, почему мне не нравится Немерле? Тогда мимо. Я как раз таки очень положительно отношусь к ФП, и даже первый готов воткнуть Хейлсбергу вилку в глаз за то, что в шарпе до сих пор нет паттерн матчинга .
В следующий раз будешь проездом в Редмонд я тебе выделю вилку из семейного серебра и специально её инкрустирую "за всех обиженных отсутствием паттерн матчинга"
AVK>Скептическое отношение у меня как раз таки к МП, а точнее к его реализации в Немерле.
Я не знаю огорчит это тебя или обрадует, но за два года работы с Немерле я написал ровно 0 макросов. Мне не надо было
IT>Первая строчка была:
IT> IT>Ну ты телепат!
Первая строчка была сабжем Так что я еще круче телепат, чем ты думаешь
AVK>>Не смог. Ответить, в смысле . Пишу и то и другое одновременно.
IT>Я в этом ни секунды не сомневаюсь.
Тогда как быть с твоей классификацией?
IT>Я не знаю огорчит это тебя или обрадует, но за два года работы с Немерле я написал ровно 0 макросов. Мне не надо было
Отож. А дальше идеть скучная и нудная волынка про возможность использования Немерли в моей текущей и будущей работе.
IT>Фактически, 30 лет развитие шло только снаружи метода и сегодня мы имеем полный мыслимый набор инструментов для организации кода и управления им. По развитию снаружи метода мы уже давно вышли в космос и осваиваем другие планеты. А внутри метода? Внутри мы всё ещё в той же пещере, с тем же каменным топором в руках, что и 30 лет назад. Ни письменности, ни колеса, ни железа.
Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
Граждан, способных нагородить иерархую классов, из которой, если ее нарисовать на бумажке разноцветными карандашами, можно обои сделать — пруд пруди. А много вы знаете граждан, способных написать самостоятельно RB-дерево? Или сделать недостающий в системе примитив синхронизации из того, что в системе есть? Много ли вы вообще знаете граждан, которые знают, что в системе может недоставать каких-то примитивов синхронизации?
Дело в том, что проектировать клей и упаковку фундаментально проще, чем проектировать структуры данных и алгоритмы. Кроме того, не все понимают, зачем вообще нужно проектировать алгоритмы, когда полно готовых компонент. А без клея и упаковки 30 человек не посадишь колупать одну большую программу, это же понятно. А без 30 человек ну никак невозможно наваять в срок все эти красивые всплывающие полупрозрачные окна. А без них кто же купит такую программу, только разве лохи безденежные?
Так что совершенно понятно, что архитектор, вооруженный иерархией классов, гораздо более важный для бизнеса человек, чем 30 кодеров, вместе взятые — ведь именно он соединяет их труд воедино, делая одновременно их всех взаимозаменяемыми, а себя — единым и неповторимым (это пройдет, когда изобретут метод, позволяющий засадить за один проект 30 архитекторов).
И получается печальная картина: все мечтают наслаивать классы, слой за слоем, а простую сортировку, если что, и написать-то некому.
IT>Думаю, именно в этом заключается природа предпочтений многих разработчиков. Все хотят быть архитекторами, никто не хочет быть кодером. Ведь кто такой архитектор? Это стратег, командир космической эскадры, бороздящей просторы вселенной. А кто такой кодер? Пещерный человек с каменным топором в руке, пусть даже его пещера и
Осталось еще небольшое количество просто программистов — людей, способных и разрабатывать архитектуру, и наполнять ее кодом. Но увы, это вымирающий вид...
IT>- Я знаю про F# и другие функциональные языки. Моё мнение – у них нет будущего в мэйнстриме даже на платформе .NET по причине необходимости переселения на другую планету.
Обратите внимание, что тот дикий язык, на котором в C++ пишут темплейты, тоже является функциональным языком. Причем чисто функциональным, с ленивыми вычислениями и выводом типов.
Pzz>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
Тут надо не книжки читать. Тут надо прежде всего инструмент соответствующий. А то на while/if реализация даже простых алгритмов превращается в кошмар. А чтение того, что получилось — ещё ужаснее.
Pzz>Обратите внимание, что тот дикий язык, на котором в C++ пишут темплейты, тоже является функциональным языком. Причем чисто функциональным, с ленивыми вычислениями и выводом типов.
K>Тут надо не книжки читать. Тут надо прежде всего инструмент соответствующий. А то на while/if реализация даже простых алгритмов превращается в кошмар. А чтение того, что получилось — ещё ужаснее.
Никак не могу согласиться. Одному дай топор — он комплекс в Кижах сделает, а другой — замочит кучу народа. Так же и с инструментами.
Инструмент у программиста — прежде всего голова. Когда в голове бардак, то реализация даже простейшего алгоритма будет нечитаемой. Когда голова в порядке — реализация даже сложных алгоритмов весьма хорошо читается.
F>Никак не могу согласиться. Одному дай топор — он комплекс в Кижах сделает, а другой — замочит кучу народа. Так же и с инструментами.
F>Инструмент у программиста — прежде всего голова. Когда в голове бардак, то реализация даже простейшего алгоритма будет нечитаемой. Когда голова в порядке — реализация даже сложных алгоритмов весьма хорошо читается.
Вопрос к головастому товарищу, много ли он на ваяет современных многоэтажных домов если ему дать один топор?
Как ни одного? А тогда к чему вся эта пышная демагогия?
VD>Вопрос к головастому товарищу, много ли он на ваяет современных многоэтажных домов если ему дать один топор?
VD>Как ни одного? А тогда к чему вся эта пышная демагогия?
Вопрос к другому головастому товарищу — сколько комплексов в Кижах ему удастся сделать с помощью крупнопанельных блоков ?
VD>>Вопрос к головастому товарищу, много ли он на ваяет современных многоэтажных домов если ему дать один топор?
VD>>Как ни одного? А тогда к чему вся эта пышная демагогия?
PD>Вопрос к другому головастому товарищу — сколько комплексов в Кижах ему удастся сделать с помощью крупнопанельных блоков ?
С начало сам на вопрос ответь, а потом свой задавай.
Шикарно. Предлогаю переименовать форум в "Демагагия программирования", как более соответствующее духу дискуссий
VD>>Как ни одного? А тогда к чему вся эта пышная демагогия?
Dog>Шикарно. Предлогаю переименовать форум в "Демагагия программирования", как более соответствующее духу дискуссий
Батенька, вы не первый.
Pzz>>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
K>Тут надо не книжки читать. Тут надо прежде всего инструмент соответствующий. А то на while/if реализация даже простых алгритмов превращается в кошмар. А чтение того, что получилось — ещё ужаснее.
Да помилте, какой еще нужен струмент для написаныя простых алгоритмов, кроме как раз тех самых if'ов и while'ов? Откройте любую книжку про алгоритмы, обратите внимание, на каком языке в этих книжках алгоритны расписывают.
ФП, кстати, надо понимать, для описания именно алгоритмов ничуть не лучше. Но ФП предоставляет гораздо более удобные способы представления сложных структур данных.
Pzz>Да помилте, какой еще нужен струмент для написаныя простых алгоритмов, кроме как раз тех самых if'ов и while'ов? Откройте любую книжку про алгоритмы, обратите внимание, на каком языке в этих книжках алгоритны расписывают.
См. квиксорт на Хаскеле и на С. Классический пример. Или там использование паттерн матчинга для красно-черных деревьев.
Оно реально выглядит красивше и понятнее.
M>См. квиксорт на Хаскеле и на С. Классический пример. Или там использование паттерн матчинга для красно-черных деревьев.
M>Оно реально выглядит красивше и понятнее.
Квиксорт с хаскеля практически 1:1 переписывается в Си, с той поправкой, что в Си не сделаешь итератора по списку с помощью пары загадочных знаков препинания, приходится цикл руками расписывать.
А вообще да, ФП предоставляет очень гибкий набор средств для выражения сложных структур данных и итераторов по ним. Но не более того. Те вещи, которые не сводятся к хитроунмой итерации сложной структуры данных, на ФП и на Фортране будут выглядеть совершенно одинаково
Pzz>А вообще да, ФП предоставляет очень гибкий набор средств для выражения сложных структур данных и итераторов по ним. Но не более того. Те вещи, которые не сводятся к хитроунмой итерации сложной структуры данных, на ФП и на Фортране будут выглядеть совершенно одинаково
ФП предоставляет расширяемый набор средств. Не на столько хорошо расширяемый, как в случае с метапрограммированием, но всё же. Взять хотя бы тот же Parsec. Он же не использует сторонних утилит. И не пользуется средствами метапрограммирования. Он целиком сделан поверх языка. А вот если бы в Хаскелле были средства расширения синтаксиса, Parsec выглядел бы красиво.
Даже какая-нибудь троица map/filter/reduce в "традиционном" ИЯ тянула бы на полноценную конструкцию языка. А дальше — больше. Таких "конструкций" я могу понаделать вдоволь. Жаль только, что синтаксис не всегда будет замечательным. Вообще, тот факт, что функция является первоклассным объектом в языке и что эти самые функции удобно описывать, есть большое подспорье в смысле увеличения выразительности языка на порядки.
Pzz>Квиксорт с хаскеля практически 1:1 переписывается в Си, с той поправкой, что в Си не сделаешь итератора по списку с помощью пары загадочных знаков препинания, приходится цикл руками расписывать.
Елы палы, так тебе об этом в теме и говорили. Все что пишется в функциональном стиле можно "один в дин" переписать на ИЯ, только вот появляется много НО и из понятной и краткой реализации получается засилье if-ов и гора мало понятного кода.
Pzz>А вообще да, ФП предоставляет очень гибкий набор средств для выражения сложных структур данных и итераторов по ним. Но не более того. Те вещи, которые не сводятся к хитроунмой итерации сложной структуры данных, на ФП и на Фортране будут выглядеть совершенно одинаково
Чушь это все. Нет никаких итераторв в ФП. И все это "просто" и есть огромная заслуга тех кто развивал ФП. О том речь.
А на Фортране просто пишется только 2 + 2.
Pzz>Да помилте, какой еще нужен струмент для написаныя простых алгоритмов, кроме как раз тех самых if'ов и while'ов?
Так и для организации кода достаточно одних структур и методов. Зачем ООП придумали и кучу других паттернов? Непонятно
Pzz>>Да помилте, какой еще нужен струмент для написаныя простых алгоритмов, кроме как раз тех самых if'ов и while'ов?
IT>Так и для организации кода достаточно одних структур и методов. Зачем ООП придумали и кучу других паттернов? Непонятно
ООП придумали для того, чтобы можно было структуруровать программу в терминах довольно больших блоков. Это нужно, в первую очередь, в связи с индустриальными методами разработки, когда над одной программой работают 50 индусов, и надо как-то провести границы, чтобы они не наступали друг другу на пятки.
Т.е., в первую очередь ООП — это инструмент для менеджера проекта, а не для программиста.
Что касается паттернов, их существование объясняется только тем, что люди решают похожие проблемы похожими способами, и похожих проблем встречается довольно много. В принципе, никаких паттернов быть не должно, раз уж люди постоянно делают одно и тоже, готовое решение должно стать библиотечной функцией (макросом, классом, темплейтом, ... — не важно).
А вот внутри самих алгоритмов if'ы и while'ы — вполне себе адекватный инструмент. Во всяком случае, все классические алгоритмы описаны в литературе именно в этих терминах.
IT>>Так и для организации кода достаточно одних структур и методов. Зачем ООП придумали и кучу других паттернов? Непонятно
Pzz>ООП придумали для того, чтобы можно было структуруровать программу в терминах довольно больших блоков.
Какая разница для чего его придумали. Без ООП можно обойтись? Можно. Но почему тогда не обходятся?
Pzz>Т.е., в первую очередь ООП — это инструмент для менеджера проекта, а не для программиста.
Даже так? Надо будет рассказать об этом своему менеджеру.
Pzz>А вот внутри самих алгоритмов if'ы и while'ы — вполне себе адекватный инструмент.
Ты сам пробовал что-нибудь ещё?
Pzz>Во всяком случае, все классические алгоритмы описаны в литературе именно в этих терминах.
Лучший язык для обучения — Паскаль. Давайте все писать на нём.
IT>>Так и для организации кода достаточно одних структур и методов. Зачем ООП придумали и кучу других паттернов? Непонятно
Pzz>ООП придумали для того, чтобы можно было структуруровать программу в терминах довольно больших блоков. Это нужно, в первую очередь, в связи с индустриальными методами разработки, когда над одной программой работают 50 индусов, и надо как-то провести границы, чтобы они не наступали друг другу на пятки.
Цирк. Для тех кто в это верит, поясню: привлекать неквалифицированных пользователей к формализации задачи — хорошо, привлекать неквалифицированных программистов (именно их ты имеешь в виду, говоря об индусах, правда?) — очень плохо.
Pzz>Т.е., в первую очередь ООП — это инструмент для менеджера проекта, а не для программиста.
Вообще-то ООП зародилось из фреймов-слотов, это такой ма-а-а-алепусенький кусочек инструментария ИИ по формализации знаний. Менеджеры софтостроения там если и стояли рядом, то только стояли.
Pzz>Что касается паттернов, их существование объясняется только тем, что люди решают похожие проблемы похожими способами, и похожих проблем встречается довольно много. В принципе, никаких паттернов быть не должно, раз уж люди постоянно делают одно и тоже, готовое решение должно стать библиотечной функцией (макросом, классом, темплейтом, ... — не важно).
Свежо предание... Только паттерн, это не "готовое решение", а некое собирательное название разных по существу решений. Хотя примеры могут быть и вполне определёнными. А каким же им ещё быть?!
Pzz>А вот внутри самих алгоритмов if'ы и while'ы — вполне себе адекватный инструмент. Во всяком случае, все классические алгоритмы описаны в литературе именно в этих терминах.
Это не просто "адекватный инструмент", if — это блин, базисная конструкция императивного стиля. Ну, вернее, не if, а goto. if — это уже структурный подход. Уж куда "адекватнее"!
P.S.: Не ставьте лошадь позади телеги, коллеги. Совсем уже свихнулись на "инструментах", "адекватности" и прочих "проблемах". Хех, ООП — инструмент менеджеров. Насмешил, спасибо.
IT>>>Так и для организации кода достаточно одних структур и методов. Зачем ООП придумали и кучу других паттернов? Непонятно
Pzz>>ООП придумали для того, чтобы можно было структуруровать программу в терминах довольно больших блоков. Это нужно, в первую очередь, в связи с индустриальными методами разработки, когда над одной программой работают 50 индусов, и надо как-то провести границы, чтобы они не наступали друг другу на пятки.
ГВ>Цирк. Для тех кто в это верит, поясню: привлекать неквалифицированных пользователей к формализации задачи — хорошо, привлекать неквалифицированных программистов (именно их ты имеешь в виду, говоря об индусах, правда?) — очень плохо.
Я что-то не смог найти в постинге Певзнера стремления привлечь индусов к _формализации_ задачи. Где Вы это вычитали?
Pzz>>Т.е., в первую очередь ООП — это инструмент для менеджера проекта, а не для программиста.
ГВ>Вообще-то ООП зародилось из фреймов-слотов, это такой ма-а-а-алепусенький кусочек инструментария ИИ по формализации знаний. Менеджеры софтостроения там если и стояли рядом, то только стояли.
А при чём тут, откуда оно зародилось? Современная практика совсем иная, и от тех времён, когда оно рождалось — несколько крупных логических переходов (например, насколько ООП формата Simula & Smalltalk отличается от того, что из него сделали даже в Objective C, я уж не говорю про развития C и Паскаля). Фактически, разделение объектов — то, что позднее назвали "контрактным программированием", с ограничением тем, что "контракт" проводится по границе объекта ("пуля вылетает — проблемы не на моей стороне").
Другой вопрос, что такое разделение нормально возможно только при статичных спецификациях. Если они меняются — приходится пересматривать места проведения границ. А вот тут уже начинаются нюансы.
ГВ>Цирк. Для тех кто в это верит, поясню: привлекать неквалифицированных пользователей к формализации задачи — хорошо, привлекать неквалифицированных программистов (именно их ты имеешь в виду, говоря об индусах, правда?) — очень плохо.
Их привлекают не к формализации, а к реализации. Хорошо ли это, плохо ли, но вот привлекают. Наверное потому, что свободных квалифицированных уже почти не осталось.
ГВ>Вообще-то ООП зародилось из фреймов-слотов, это такой ма-а-а-алепусенький кусочек инструментария ИИ по формализации знаний. Менеджеры софтостроения там если и стояли рядом, то только стояли.
Вообще-то ООП зародилось из Симулы, языка. предназначенного для компутерного моделирования. А в индустрию пришло и разрослось именно потому, что помогает раскидывать задачу по большому количеству исполнителей. Фича эта сама по себе очень ценная, но имеет отношение скорее к управлению проектом, чем собственно к программированию.
ГВ>Свежо предание... Только паттерн, это не "готовое решение", а некое собирательное название разных по существу решений. Хотя примеры могут быть и вполне определёнными. А каким же им ещё быть?!
Это, признаюсь, не моя мысль, а Пола Грэхема. В оригинале она звучала примерно в том духе, что наличие паттернов проектирования свидетельствует об отсутствии в языке нормальных макросов. Потому что если приходится из проекта в проект делать похожие телодвижения, это повод написать макрос, который эти телодвижения автоматизирует.
Я, в общем, отчасти согласен, но с той оговоркой, что некоторые вещи очень просто рассказать человеку, но при этом очень трудно формализовать до такой степени, чтобы их можно было сказать компьютеру.
Pzz>>А вот внутри самих алгоритмов if'ы и while'ы — вполне себе адекватный инструмент. Во всяком случае, все классические алгоритмы описаны в литературе именно в этих терминах.
ГВ>Это не просто "адекватный инструмент", if — это блин, базисная конструкция императивного стиля. Ну, вернее, не if, а goto. if — это уже структурный подход. Уж куда "адекватнее"!
Я как-то не уловил, почему базисная конструкция императивного стиля не может быть адекватным инструментом? Какое слово является ругательным, "базисная" или "императивного"?
Pzz>А вот внутри самих алгоритмов if'ы и while'ы — вполне себе адекватный инструмент. Во всяком случае, все классические алгоритмы описаны в литературе именно в этих терминах.
Для тупых и ленивых индокодеров — да. Для людей с мозгами — нет.
Pzz>А вот внутри самих алгоритмов if'ы и while'ы — вполне себе адекватный инструмент. Во всяком случае, все классические алгоритмы описаны в литературе именно в этих терминах.
Ай, неправда Ваша, уважаемый. if и while — ересь бесовская, для лохов, реальные пацаны и девчонки пишут на ассемблере, который есть самый адекватный инструмент. Во всяком случае, все самые классические алгоритмы описаны в самом классическом трехтомнике Кнуте не именно в терминах if-ов, а на ассемблере выдуманной им угребищной машины (открываем ветхий завет, и приобщаемся к истинной, ортодоксальной вере).
ЗЫ: Удивительно дурацкие флеймы пошли. Как на подбор. Кошмар просто. Казалось бы, причем здесь пропаганда Немерле?
IT>>Фактически, 30 лет развитие шло только снаружи метода и сегодня мы имеем полный мыслимый набор инструментов для организации кода и управления им. По развитию снаружи метода мы уже давно вышли в космос и осваиваем другие планеты. А внутри метода? Внутри мы всё ещё в той же пещере, с тем же каменным топором в руках, что и 30 лет назад. Ни письменности, ни колеса, ни железа.
Pzz>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
Я как-то всегда думал, что как раз алгоритмы — это то, что очень неплохо поддаётся "библиотизации", то есть вынесением в многократно используемые кирпичи. И задумываться над алгоритмами лишний раз не приходится.
Pzz>Граждан, способных нагородить иерархую классов, из которой, если ее нарисовать на бумажке разноцветными карандашами, можно обои сделать — пруд пруди. А много вы знаете граждан, способных написать самостоятельно RB-дерево? Или сделать недостающий в системе примитив синхронизации из того, что в системе есть? Много ли вы вообще знаете граждан, которые знают, что в системе может недоставать каких-то примитивов синхронизации?
В первую очередь из-за того, что редко, очень редко встречаются сейчас такие задачи.
Pzz>И получается печальная картина: все мечтают наслаивать классы, слой за слоем, а простую сортировку, если что, и написать-то некому.
Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
_FR>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
Да, однозначно. Ничто не может служить оправданием халтуры. Конечно, на практике нужно использовать оптимизированные и проверенные библиотечные функции. Но это не значит, что нет необходимости знать основные алгоритмы. Пусть пузырьковая сортировка не оптимальна: она дает навык работы с массивами. А быстрая сортировка — навык работы с рекурсией. Или, по вашему, это лишнее ?
F>Здравствуйте, _FRED_, Вы писали:
_FR>>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
F>Да, однозначно. Ничто не может служить оправданием халтуры. Конечно, на практике нужно использовать оптимизированные и проверенные библиотечные функции. Но это не значит, что нет необходимости знать основные алгоритмы. Пусть пузырьковая сортировка не оптимальна: она дает навык работы с массивами. А быстрая сортировка — навык работы с рекурсией. Или, по вашему, это лишнее ?
Т.е. так как я сейчас не могу написать быструю сортировку по памяти — я не умею работать с рекурсией?
Вам не кажется, что вполне возможно оттачивать навыки и на других задачах?
F>Здравствуйте, _FRED_, Вы писали:
_FR>>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
F>Да, однозначно. Ничто не может служить оправданием халтуры. Конечно, на практике нужно использовать оптимизированные и проверенные библиотечные функции. Но это не значит, что нет необходимости знать основные алгоритмы. Пусть пузырьковая сортировка не оптимальна: она дает навык работы с массивами. А быстрая сортировка — навык работы с рекурсией. Или, по вашему, это лишнее ?
Навыки работы с массивами приобретаются не только при написании своего пузырька.
А в языках без поддержки хвостовой рекурсии гораздо полезнее навыки работы без рекурсии.
_FR>>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
F>Да, однозначно. Ничто не может служить оправданием халтуры. Конечно, на практике нужно использовать оптимизированные и проверенные библиотечные функции. Но это не значит, что нет необходимости знать основные алгоритмы.
Под "знать алгоритм" я понимаю наличие представления о том, для чего этот алгоритм нужен. Я не понимаю, к чему знание деталей реализации? В наиболее общем ключе, ка кговорим сейчас мы.
F>Пусть пузырьковая сортировка не оптимальна: она дает навык работы с массивами. А быстрая сортировка — навык работы с рекурсией. Или, по вашему, это лишнее ?
Мне больше нравится линейный поиск как навык работы с массивами и факториал как пример рекурсии. Они проще И что мы получаем: есть знания и про массивы и про рекурсию, но никакого отношения к сортировке это не имеет.
_FR>Здравствуйте, fplab, Вы писали:
_FR>Мне больше нравится линейный поиск как навык работы с массивами и факториал как пример рекурсии. Они проще И что мы получаем: есть знания и про массивы и про рекурсию, но никакого отношения к сортировке это не имеет.
Наконец-то — дождались ! Вот оно — ключевое слово: "проще". Зачем нам обезболивающие ? Деревянным молотком по голове, как в средние века: пока пациент очухается, мы ему немножко вырежем здесь и подрихтуем там
Факториал — это да, это классика. Но именно как пример. Наверное процентов 90 всех книг по программированию объясняют рекурсию на примере именно факториала. Но между теорией и практикой дистанция немалого размера. Интересно, а если надо построить дерево, а потом сделать его обход ? Понятно, что можно и без рекурсии, но вот вопрос — а стоит ли ?
А линейный поиск — вообще прелесть. Понятно, что в массиве из 100 записей "при современном развитии печатного дела на Западе" (О.Бендер) — просмотреть их плевое дело. Дураки они, что ли компиляторщики — сортируют таблицу символов, чтобы потом в ней быстро искать ? А то и вообще хэш-функции втыкают
Правда, надо сделать одно важное извиняющее замечание — если человеку так не повезло, что ему не приходилось решать по настоящему сложных (а, значит, интересных) задач, то тогда, действительно, к чему засорять мозг
_FR>>Мне больше нравится линейный поиск как навык работы с массивами и факториал как пример рекурсии. Они проще И что мы получаем: есть знания и про массивы и про рекурсию, но никакого отношения к сортировке это не имеет.
F>Наконец-то — дождались ! Вот оно — ключевое слово: "проще". Зачем нам обезболивающие ? Деревянным молотком по голове, как в средние века: пока пациент очухается, мы ему немножко вырежем здесь и подрихтуем там
Не согласен с аналогией. Зачем мне таскать тяжеленный сундук, когда у меня есть удобный рюкзачёк? Объясни, зачем для понимания рекурсии необходимо именно возиться с сортировкой и не подойдёт факториал?
F>между теорией и практикой дистанция немалого размера.
Это и есть ответ? Гхм, мне одному кажется это нелогичным? Например, правила сложения гораздо легче объяснять на примере натуральных силел, нежели комплексных (да ещё и в показательном представлении). Так и тут: для объяснения рекурсии — факториал.
F>Интересно, а если надо построить дерево, а потом сделать его обход ? Понятно, что можно и без рекурсии, но вот вопрос — а стоит ли ?
Это большой вопрос. Например, может зависеть от используемого компилятора. Где-то я с удовольствием предпочитаю рекурсии цикл.
F>А линейный поиск — вообще прелесть. Понятно, что в массиве из 100 записей "при современном развитии печатного дела на Западе" (О.Бендер) — просмотреть их плевое дело.
А если в массиве всего четыре элемента?
F>Дураки они, что ли компиляторщики — сортируют таблицу символов, чтобы потом в ней быстро искать ? А то и вообще хэш-функции втыкают
Если поиск в большом массиве делается один раз, то зачем его перед этим сортировать?
F>Правда, надо сделать одно важное извиняющее замечание — если человеку так не повезло, что ему не приходилось решать по настоящему сложных (а, значит, интересных) задач, то тогда, действительно, к чему засорять мозг
Как видишь, обсуждаемый вопрос (необходимость знания некоторых, пусть и часто используемых, алгоритмов) многогранен. Не менее многогранен и вопрос о "настоящности" и "сложности" тех или иных задач. А раз, то категоричные высказывания о необходимости того или иного — ни что иное как заносчивость.
_FR>Не согласен с аналогией. Зачем мне таскать тяжеленный сундук, когда у меня есть удобный рюкзачёк? Объясни, зачем для понимания рекурсии необходимо именно возиться с сортировкой и не подойдёт факториал?
Хотя бы потому что нормальный человек, знающий, как вычислить факториал с помощью цикла, не оценит пример с факториалом и вспомнит что-нибудь про шашечки. Объяснение рекурсии на примере факториала — это сродни (утрирование) объяснению шаблонов с++ на примере вычисления того же факториала на этапе компиляции.
F>>Интересно, а если надо построить дерево, а потом сделать его обход ? Понятно, что можно и без рекурсии, но вот вопрос — а стоит ли ?
_FR>Это большой вопрос. Например, может зависеть от используемого компилятора. Где-то я с удовольствием предпочитаю рекурсии цикл.
Казалось бы, при чем тут рекурсия и цикл? Там, где можно обойтись просто циклом, рекурсия обычно не нужна и не используется. В той же (прости господи ) быстрой сортировке рекурсия обычно используется потому, что циклом не отделаешься.
F>Наконец-то — дождались ! Вот оно — ключевое слово: "проще".
Ключевое слово — "к чему знание деталей реализации"
F> Зачем нам обезболивающие ? Деревянным молотком по голове, как в средние века: пока пациент очухается, мы ему немножко вырежем здесь и подрихтуем там
А без некорректных приемов выразить свою точку зрения никак?
F>Факториал — это да, это классика. Но именно как пример. Наверное процентов 90 всех книг по программированию объясняют рекурсию на примере именно факториала. Но между теорией и практикой дистанция немалого размера.
Ну да. И что?
F> Интересно, а если надо построить дерево, а потом сделать его обход ? Понятно, что можно и без рекурсии, но вот вопрос — а стоит ли ?
Иногда очень даже стоит. Только вот, сдается мне, как раз таки нерекурсивный обход дерева может вызвать у новичков затруднение, а не рекурсия.
А еще иногда нужно рекурсивный обход замаскировать под нерекурсивный. И вот тут то уже частенько у знатоков быстрой сортировки начинаются проблемы.
F>А линейный поиск — вообще прелесть. Понятно, что в массиве из 100 записей "при современном развитии печатного дела на Западе" (О.Бендер) — просмотреть их плевое дело. Дураки они, что ли компиляторщики — сортируют таблицу символов, чтобы потом в ней быстро искать ? А то и вообще хэш-функции втыкают
Только вот, как оказалось, на современных компьютерах линейный поиск на очень коротких списках может оказаться самым быстрым решением. Вот ведь незадача.
F>Правда, надо сделать одно важное извиняющее замечание — если человеку так не повезло, что ему не приходилось решать по настоящему сложных (а, значит, интересных) задач, то тогда, действительно, к чему засорять мозг
О да, без пенисометрии никак. Знаешь только, в чем проблема, особенно в этом форуме? По результатам измерений запросто может оказаться, что у кого то из твоих оппонентов длиннее.
AVK>О да, без пенисометрии никак. Знаешь только, в чем проблема, особенно в этом форуме? По результатам измерений запросто может оказаться, что у кого то из твоих оппонентов длиннее.
Эххх, ну когда же все поймете, важна ведь не длина, а диаметр!
AVK>Здравствуйте, fplab, Вы писали:
F>>Наконец-то — дождались ! Вот оно — ключевое слово: "проще".
AVK>Ключевое слово — "к чему знание деталей реализации"
Ага. Теоретически я знаю, как пилотировать самолет, но практически — предпочту обратиться к тому, кто в деталях знает как это делается. Ну извините — опять "некорректный" прием !
F>> Зачем нам обезболивающие ? Деревянным молотком по голове, как в средние века: пока пациент очухается, мы ему немножко вырежем здесь и подрихтуем там
AVK>А без некорректных приемов выразить свою точку зрения никак?
Так живее. Многое проще объяснить на пальцах, чем строить строгое доказательство. Тем более в такой области, где сколько голов — столько и мнений.
F>>Факториал — это да, это классика. Но именно как пример. Наверное процентов 90 всех книг по программированию объясняют рекурсию на примере именно факториала. Но между теорией и практикой дистанция немалого размера.
AVK>Ну да. И что?
И ничего. Я же написал "именно как пример", поскольку на императивных языках обычный цикл эффективнее.
F>> Интересно, а если надо построить дерево, а потом сделать его обход ? Понятно, что можно и без рекурсии, но вот вопрос — а стоит ли ?
AVK>Иногда очень даже стоит. Только вот, сдается мне, как раз таки нерекурсивный обход дерева может вызвать у новичков затруднение, а не рекурсия.
А что, программист не должен знать (или хотя бы предполагать) где и в чем могут возникнуть затруднения и уметь их либо обходить, либо решать ? Но для этого, думается мне, надо все же знать и детали реализации.
AVK>А еще иногда нужно рекурсивный обход замаскировать под нерекурсивный. И вот тут то уже частенько у знатоков быстрой сортировки начинаются проблемы.
Не понял — а зачем маскировать ? Ясность — лучшее "украшение" программы (после, понятно, эффективности, т.е. быстродействия и расхода памяти).
F>>А линейный поиск — вообще прелесть. Понятно, что в массиве из 100 записей "при современном развитии печатного дела на Западе" (О.Бендер) — просмотреть их плевое дело. Дураки они, что ли компиляторщики — сортируют таблицу символов, чтобы потом в ней быстро искать ? А то и вообще хэш-функции втыкают
AVK>Только вот, как оказалось, на современных компьютерах линейный поиск на очень коротких списках может оказаться самым быстрым решением. Вот ведь незадача.
Незадача, да только у кого ? Ведь я и привел пример короткого списка 100 элементов в массиве — это разве много ? Для него, действительно, практически никогда не надо осуществлять дополнительных телодвижений.
F>>Правда, надо сделать одно важное извиняющее замечание — если человеку так не повезло, что ему не приходилось решать по настоящему сложных (а, значит, интересных) задач, то тогда, действительно, к чему засорять мозг
AVK>О да, без пенисометрии никак. Знаешь только, в чем проблема, особенно в этом форуме? По результатам измерений запросто может оказаться, что у кого то из твоих оппонентов длиннее.
Вот тут, коллега, вы сами себе противоречите Выше, если не ошибаюсь, вы указали мне на использование некорректных приемов. Может, будем последовательными ?
В общем, я понял — минусов я себе заработал
F>>Правда, надо сделать одно важное извиняющее замечание — если человеку так не повезло, что ему не приходилось решать по настоящему сложных (а, значит, интересных) задач, то тогда, действительно, к чему засорять мозг
AVK>О да, без пенисометрии никак. Знаешь только, в чем проблема, особенно в этом форуме? По результатам измерений запросто может оказаться, что у кого то из твоих оппонентов длиннее.
Угу, особенно если учесть тот факт, что сравнивают тут обычно не первичные половые признаки (если следовать физиологической аналогии), а пальцы рук. И получаются занятные посылы типа "мой большой палец левой руки, длиннее и толще твоего мизинца на правой, поэтому я круче". А вот, если бы заявляющий такое, попробовал бы поковырять своим суперским большим пальцем на левой руке в своей же правой ноздре, то глядишь и проникся бы важной ролью правых мизинцев в нелегкой судьбе местных спорщиков.
Важно не насколько длинные / толстые у человека пальцы, а насколько он умеет их применять по делу и к месту. А про пенисы, я вообще — молчу
_FR>и факториал как пример рекурсии
Убивать за такие примеры рекурсии.
_FR>>и факториал как пример рекурсии
T>Убивать за такие примеры рекурсии.
За что? Только за то, что "навязло" в зубах?
_FR>>>и факториал как пример рекурсии
T>>Убивать за такие примеры рекурсии.
_FR>За что? Только за то, что "навязло" в зубах?
За методическую некорректность. Показывание рекурсии на примере факториала, при том, что рядом он считается просто и тривиально обычным циклом — это способ показать "а вот можно ещё через левое ухо, если очень захотеть и совсем нечего делать". Этот способ годится по отношению к тем, кто интересуется математическими диковинками, или к тем, кто заранее _сознательно_ готов принимать все методические принципы преподавателя. И много Вы таких сейчас видели? обычно 1-2 на сотню. остальные — сдадут и забудут.
Если бы я показывал рекурсию на каком-то примере, первый пример был бы взят максимально практический, причём такой, чтобы его нельзя было в одной функции свести в цикл. А уже после этого — числа Фибоначчи, а собственно факториал — уже в качестве упражнения (если на лекции — вызвать кого-то к доске и заставить преобразовать).
И ещё одно — размахивание факториалом является косвенным указанием на то, что "рекурсия — это очень просто". Когда же выучивший такое сталкивается с реальной жизнью, когда перекладка алгоритма на рекурсивный лад в первую очередь крайне громоздка — следует шок.
_FR>Мне больше нравится линейный поиск как навык работы с массивами и факториал как пример рекурсии. Они проще
А вычисление чисел Фибоначчи с помощью рекурсии нравится ? Тоже ведь проще...
_FR>>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
F>Да, однозначно. Ничто не может служить оправданием халтуры. Конечно, на практике нужно использовать оптимизированные и проверенные библиотечные функции. Но это не значит, что нет необходимости знать основные алгоритмы. Пусть пузырьковая сортировка не оптимальна: она дает навык работы с массивами. А быстрая сортировка — навык работы с рекурсией. Или, по вашему, это лишнее ?
Если человеку ни разу не приходилось писать сортировку, это не значит, что он не сможет это сделать, если понадобится. Измерять профессионализм тем, что человеку приходилось или не приходилось делать — это пустое дело. Единственный объективный индикатор профессионализма — это уровень зарплаты.
N>…Единственный объективный индикатор профессионализма — это уровень зарплаты.
А что значит в таком контексте "уровень"? "Уровень", как я понимаю, сама по себе штука необъективная
Если же меряться абсолютным размером… по-твоему это будет "объективно"?
N>Если человеку ни разу не приходилось писать сортировку, это не значит, что он не сможет это сделать, если понадобится. Измерять профессионализм тем, что человеку приходилось или не приходилось делать — это пустое дело.
Согласен. Именно это и есть моя точка зрения, но вот так выразить ее я не смог.
N>Единственный объективный индикатор профессионализма — это уровень зарплаты.
А здесь — не согласен.
Не все рвутся в центр. А на перифирии программисты оплачиваются дешевле. Кроме этого — не все стремятся к максимальной зарплате.
Не поверите наверное, но есть толковые ребята, которые сидят в каких-нить оборонных НИИ за проволокой и работают за еду. Я не утверждаю, что все там толковые. Я только утверждаю, что такие есть.
S>Не поверите наверное, но есть толковые ребята, которые сидят в каких-нить оборонных НИИ за проволокой и работают за еду. Я не утверждаю, что все там толковые. Я только утверждаю, что такие есть.
IT в свое время на эту тему писал большое сообщение, породившее большой флейм.
N>Единственный объективный индикатор профессионализма — это уровень зарплаты.
Тогда те кто работают в США большие профессионалы чем те кто работает Москве. А те кто работает в Малых Васюках вообще ламеры.
N>>Единственный объективный индикатор профессионализма — это уровень зарплаты.
VD>Тогда те кто работают в США большие профессионалы чем те кто работает Москве. А те кто работает в Малых Васюках вообще ламеры.
Речь шла об "уровне", то есть некой относительной величине. Только вот не ясно, как её мерять.
VD>>Тогда те кто работают в США большие профессионалы чем те кто работает Москве. А те кто работает в Малых Васюках вообще ламеры.
_FR>Речь шла об "уровне", то есть некой относительной величине. Только вот не ясно, как её мерять.
Уровень, как зарплаты, так и знаний определяется тучей факторов. Скажем уровень зарплаты определяется в частности востребованностью кокретных скилов и наличием предложения на рынке. Простой пример. 1С-ники были низкоплачиваемой раб. силой до тех пор пока не прошел слух, что С1 завязывает с поддержкой 7-ой версии. Сразу после этого зарплаты у 1С-ников взлетели до уровня высококвалифицированных программистов. При это умнее или работоспособнее никто из 1С-ников не стал.
Что до уровня занний, то это вообще субъективная оценка. Скажем многие преподаватели сильно переоценивают свои реальные знания. И почти все преподаватели недооценены с точки зрения зарплаты (даже те что действительно являются отличными программистами).
Pzz>>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
_FR>Я как-то всегда думал, что как раз алгоритмы — это то, что очень неплохо поддаётся "библиотизации", то есть вынесением в многократно используемые кирпичи. И задумываться над алгоритмами лишний раз не приходится.
Приходится задумываться, очень даже. Вот возьмём ту же пресловутую сортировку. Кто из кодеров вообще слышал о каком-то методе кроме "quick sort" (и то — под его маркетинговым названием)? А условия применимости? Вот завтра придут данные с определённым на них частичным порядком вместо линейного, и опаньки — условия применимости не выполняются. А если сравнения очень дорогие и их надо минимизировать? А если данных никогда не больше 8 элементов и quicksort просто дорог в раскачке, простейший метод вставок сработает быстрее? А если надо выполнить сортировку параллельно? А если дали 100 миллиардов элементов и они даже в виртуальную память не влезут (я уж молчу, что сортировать данные толще физической памяти такой сортировкой — самоубийство независимо от того, влезло оно в виртуалку или нет)? Всё, такой кодер сдулся, независимо от того, насколько он хорошо знает STL и может задавать сортировку его средствами.
"Библиотизация", конечно, возможна — до определённой степени. И грустно то, что факт самих ограничений многим недоступен просто по недостатку образования и желания их узнать и осознать.
Pzz>>Граждан, способных нагородить иерархую классов, из которой, если ее нарисовать на бумажке разноцветными карандашами, можно обои сделать — пруд пруди. А много вы знаете граждан, способных написать самостоятельно RB-дерево? Или сделать недостающий в системе примитив синхронизации из того, что в системе есть? Много ли вы вообще знаете граждан, которые знают, что в системе может недоставать каких-то примитивов синхронизации?
_FR>В первую очередь из-за того, что редко, очень редко встречаются сейчас такие задачи.
Угу, именно так. Фактически, можно тупо рубить бабло на минимальном базисе. Впрочем, для этого нужно соответствующее усердие, которое тоже нечастый скилл.;(
Pzz>>И получается печальная картина: все мечтают наслаивать классы, слой за слоем, а простую сортировку, если что, и написать-то некому.
_FR>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
Какой ответ на этот вопрос Вы хотите? Можно ответить цинически — мол, есть клавишное мясо, которое не способно даже осознать, что оно теряет и почему. А можно — что пусть себе и дальше продолжает, но пусть осознаёт, где его потолок. В принципе, оба ответа правильны.
N>Здравствуйте, _FRED_, Вы писали:
Pzz>>>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
_FR>>Я как-то всегда думал, что как раз алгоритмы — это то, что очень неплохо поддаётся "библиотизации", то есть вынесением в многократно используемые кирпичи. И задумываться над алгоритмами лишний раз не приходится.
N>Приходится задумываться, очень даже. Вот возьмём ту же пресловутую сортировку. Кто из кодеров вообще слышал о каком-то методе кроме "quick sort" (и то — под его маркетинговым названием)? А условия применимости? Вот завтра придут данные с определённым на них частичным порядком вместо линейного, и опаньки — условия применимости не выполняются. А если сравнения очень дорогие и их надо минимизировать? А если данных никогда не больше 8 элементов и quicksort просто дорог в раскачке, простейший метод вставок сработает быстрее? А если надо выполнить сортировку параллельно? А если дали 100 миллиардов элементов и они даже в виртуальную память не влезут (я уж молчу, что сортировать данные толще физической памяти такой сортировкой — самоубийство независимо от того, влезло оно в виртуалку или нет)? Всё, такой кодер сдулся, независимо от того, насколько он хорошо знает STL и может задавать сортировку его средствами.
Мне очень завидно, если у вас такие задачи появляются чаще, чем раз в пять лет. У меня пока такие задачи были только на собеседованиях, в реальности всё гораздо проще.
Вообще-то вопросы границ применимости встречаются постоянно. Простейший пример: парни проектируют систему миграции из инфраструктуры A в инфраструктуру B. Архитектурная идея — проста как грабли, и при этом хорошо идет в струе технологического совершенства: экспортируем все данные из A в XML, трансформируем его в понятный системе B XML при помощи XSLT, и радуемся жизни.
И тут (через, грубо говоря, полгода разработки) вдруг возникает грустный эффект: трансформация подразумевает работу с DOM моделью, а далеко не все из интересных нам систем A генерируют документы, которые умещаются в 3GB RAM. Я доступно объясняю?
S>Здравствуйте, Aen Sidhe, Вы писали:
S>Вообще-то вопросы границ применимости встречаются постоянно. Простейший пример: парни проектируют систему миграции из инфраструктуры A в инфраструктуру B. Архитектурная идея — проста как грабли, и при этом хорошо идет в струе технологического совершенства: экспортируем все данные из A в XML, трансформируем его в понятный системе B XML при помощи XSLT, и радуемся жизни.
S>И тут (через, грубо говоря, полгода разработки) вдруг возникает грустный эффект: трансформация подразумевает работу с DOM моделью, а далеко не все из интересных нам систем A генерируют документы, которые умещаются в 3GB RAM. Я доступно объясняю?
Конечно понятно. Моё сообщение не было издёвкой. Это было сугубо про мой опыт работы, который невелик (всего три года).
А сложные задачки интереснее, чем обычные банальные вещи, поэтому я и завидую, да.
S>Вообще-то вопросы границ применимости встречаются постоянно. Простейший пример: парни проектируют систему миграции из инфраструктуры A в инфраструктуру B. Архитектурная идея — проста как грабли, и при этом хорошо идет в струе технологического совершенства: экспортируем все данные из A в XML, трансформируем его в понятный системе B XML при помощи XSLT, и радуемся жизни.
S>И тут (через, грубо говоря, полгода разработки) вдруг возникает грустный эффект: трансформация подразумевает работу с DOM моделью, а далеко не все из интересных нам систем A генерируют документы, которые умещаются в 3GB RAM. Я доступно объясняю?
Испугал. Пишем для одной этой системы SAX трансформатор. Делов то
V>Испугал. Пишем для одной этой системы SAX трансформатор. Делов то
Ага. Только придется всю архитектуру перетряхивать
N>Какой ответ на этот вопрос Вы хотите? Можно ответить цинически — мол, есть клавишное мясо, которое не способно даже осознать, что оно теряет и почему. А можно — что пусть себе и дальше продолжает, но пусть осознаёт, где его потолок. В принципе, оба ответа правильны.
У меня один знакомый считает, что тот не программист, кто не написал ни одного драйвера устройства.
Весьма ограниченная точка зрения, как впрочем и Ваша.
S>Здравствуйте, netch80, Вы писали:
N>>Какой ответ на этот вопрос Вы хотите? Можно ответить цинически — мол, есть клавишное мясо, которое не способно даже осознать, что оно теряет и почему. А можно — что пусть себе и дальше продолжает, но пусть осознаёт, где его потолок. В принципе, оба ответа правильны.
S>У меня один знакомый считает, что тот не программист, кто не написал ни одного драйвера устройства.
S>Весьма ограниченная точка зрения, как впрочем и Ваша.
Вы ещё ничего не поняли толком про мою точку зрения, но уже успели приравнять её к "одному знакомому" и унизить сравнением.
Не думаю, что такой метод дискутирования адекватен теме.
N>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, netch80, Вы писали:
N>>>Какой ответ на этот вопрос Вы хотите? Можно ответить цинически — мол, есть клавишное мясо, которое не способно даже осознать, что оно теряет и почему. А можно — что пусть себе и дальше продолжает, но пусть осознаёт, где его потолок. В принципе, оба ответа правильны.
S>>У меня один знакомый считает, что тот не программист, кто не написал ни одного драйвера устройства.
S>>Весьма ограниченная точка зрения, как впрочем и Ваша.
N>Вы ещё ничего не поняли толком про мою точку зрения, но уже успели приравнять её к "одному знакомому" и унизить сравнением.
Думаю что понял. Она примерно следующая: есть те, кому приходилось иметь дело с сортировкой с выкрутасами, и есть клавишное мясо. Ну или мягче — версия с потолком. По части унижения — я унизил только Вас, а Вы — всех тех, кто не писал свою сортировку.
Если я не понял Вашу точку зрения — поправьте.
N>Не думаю, что такой метод дискутирования адекватен теме.
Не думаете — не начинайте.
S>>>У меня один знакомый считает, что тот не программист, кто не написал ни одного драйвера устройства.
S>>>Весьма ограниченная точка зрения, как впрочем и Ваша.
N>>Вы ещё ничего не поняли толком про мою точку зрения, но уже успели приравнять её к "одному знакомому" и унизить сравнением.
S>Думаю что понял. Она примерно следующая: есть те, кому приходилось иметь дело с сортировкой с выкрутасами, и есть клавишное мясо.
Неверно. Попробуйте ещё.
N>>Не думаю, что такой метод дискутирования адекватен теме.
S>Не думаете — не начинайте.
Так не я начал, а Вы.
N>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, netch80, Вы писали:
N>>>Какой ответ на этот вопрос Вы хотите? Можно ответить цинически — мол, есть клавишное мясо, которое не способно даже осознать, что оно теряет и почему. А можно — что пусть себе и дальше продолжает, но пусть осознаёт, где его потолок. В принципе, оба ответа правильны.
S>>У меня один знакомый считает, что тот не программист, кто не написал ни одного драйвера устройства.
S>>Весьма ограниченная точка зрения, как впрочем и Ваша.
N>Вы ещё ничего не поняли толком про мою точку зрения, но уже успели приравнять её к "одному знакомому" и унизить сравнением.
netch80! Приношу извинения за сравнение Вашей точки зрения с мнением моего недалекого знакомого. Наблюдая за Вашими постами неоднократно убедился, что Вы человек опытный и очень разносторонний. После этого я переосмыслил высказывание про мясо и потолок. Мое несогласие с ним было обусловлено разницей восприятия термина мяса и уровня потолка.
N>Здравствуйте, _FRED_, Вы писали:
Pzz>>>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
_FR>>Я как-то всегда думал, что как раз алгоритмы — это то, что очень неплохо поддаётся "библиотизации", то есть вынесением в многократно используемые кирпичи. И задумываться над алгоритмами лишний раз не приходится.
N>Приходится задумываться, очень даже. Вот возьмём ту же пресловутую сортировку. Кто из кодеров вообще слышал о каком-то методе кроме "quick sort" (и то — под его маркетинговым названием)? А условия применимости? Вот завтра придут данные с определённым на них частичным порядком вместо линейного, и опаньки — условия применимости не выполняются. А если сравнения очень дорогие и их надо минимизировать? А если данных никогда не больше 8 элементов и quicksort просто дорог в раскачке, простейший метод вставок сработает быстрее? А если надо выполнить сортировку параллельно? А если дали 100 миллиардов элементов и они даже в виртуальную память не влезут (я уж молчу, что сортировать данные толще физической памяти такой сортировкой — самоубийство независимо от того, влезло оно в виртуалку или нет)? Всё, такой кодер сдулся, независимо от того, насколько он хорошо знает STL и может задавать сортировку его средствами.
N>"Библиотизация", конечно, возможна — до определённой степени. И грустно то, что факт самих ограничений многим недоступен просто по недостатку образования и желания их узнать и осознать.
И как в решении описанных проблем поможет умение написать _реализацию алгоритма_? ИМХО, достаточно знаний о том, что есть вот такое, есть такое, которое хорошо тогда и тогда, а тут лучше это и это. Что бы провести подобные рассуждения и сделать правильный выбор для решения задачи, вовсе не требуется знание алгоритма. А уж узнав, каким молотком надо вбивать гвоздь, пойти и достать молоток (читай: разобраться с реализацией) совсем, мне кажется, не сложно.
_FR>>В первую очередь из-за того, что редко, очень редко встречаются сейчас такие задачи.
N>Угу, именно так. Фактически, можно тупо рубить бабло на минимальном базисе. Впрочем, для этого нужно соответствующее усердие, которое тоже нечастый скилл.;(
Гхм… попробую так: в каком проценте задач сортировки данных вам не достаточно библиотечных реализаций? Мне кажется, эта цифра вполне подойдёт под описание "очень редкно".
_FR>И как в решении описанных проблем поможет умение написать _реализацию алгоритма_? ИМХО, достаточно знаний о том, что есть вот такое, есть такое, которое хорошо тогда и тогда, а тут лучше это и это.
Напрямую — никак. Но так уж человек устроен, что чтобы помнить о том, что есть разные методы — ему нужно с ними столкнуться лично и желательно написать хотя бы простейшую реализацию. Собственно, поэтому метод пузырька до сих остаётся в книгах, хотя он худший из того, что может быть. Альтернатива — умение запоминать большое количество абстрактных данных, с которыми не сталкиваешься и которые остаются пустым звуком, а затем через много лет — вытащить эти данные из памяти, когда нужно. Это редкое умение, противоречащее всей природе человеческой памяти, и поэтому на него ориентироваться нельзя.
А описанные Вами знания "есть такое, а есть сякое" без подкрепления забудутся после первого экзамена.
Поэтому я с сомнением отношусь к тем архитекторам, которые давно сами не кодируют, и к тем кодерам, которые способны только применить указанное им решение.
_FR>>>В первую очередь из-за того, что редко, очень редко встречаются сейчас такие задачи.
N>>Угу, именно так. Фактически, можно тупо рубить бабло на минимальном базисе. Впрочем, для этого нужно соответствующее усердие, которое тоже нечастый скилл.;(
_FR>Гхм… попробую так: в каком проценте задач сортировки данных вам не достаточно библиотечных реализаций? Мне кажется, эта цифра вполне подойдёт под описание "очень редкно".
У меня лично статистики недостаточно. Но вот случай, когда обычная сортировка крайне невыгодна — каждый рабочий день на глазах, это таймерное дерево в движке событий. Оно сделано на пирамиде.
N>А описанные Вами знания "есть такое, а есть сякое" без подкрепления забудутся после первого экзамена.
N>Поэтому я с сомнением отношусь к тем архитекторам, которые давно сами не кодируют, и к тем кодерам, которые способны только применить указанное им решение.
Вот пример из личной жизни: пока писал на VB, приходилось вручную реализовывать бинарный поиск (ну нет его в стандартной библиотеке), и с обобщением написанного кода нет так всё просто в этом языке. Так вот несколько лет уже пишу на C# и, наверное, не вспомню, как его реализовать.
Знания забываются от отсутствия практики, а вовсе не от понимания сути. И закономерно, что в некоторых областях, где от определённых знаний толку чуть (я не говорю "совсем нет"), уровень "базы" снижается.
Например, вспоминаю анекдот про то, как старого програмиста спросили, как записать некие данные на диск, а он начал ответ со слов о том, что "перво-наперво нужно спозиционировать головку устройства". И life is good что подобного не требуется знать сейчас.
_FR>>Гхм… попробую так: в каком проценте задач сортировки данных вам не достаточно библиотечных реализаций? Мне кажется, эта цифра вполне подойдёт под описание "очень редкно".
N>У меня лично статистики недостаточно. Но вот случай, когда обычная сортировка крайне невыгодна — каждый рабочий день на глазах, это таймерное дерево в движке событий. Оно сделано на пирамиде.
В отдельных случаях может быть (и даже имеет право быть) всё что угодно. Но вот спрашивать веб-програмиста про объекты синхронизации на юниксе — гхм..? Вот я и говорю, что "база" у програмистов в общем смысле не в алгоритмах сортировки и прочих деталях реализации.
_FR>Здравствуйте, netch80, Вы писали:
N>>А описанные Вами знания "есть такое, а есть сякое" без подкрепления забудутся после первого экзамена.
N>>Поэтому я с сомнением отношусь к тем архитекторам, которые давно сами не кодируют, и к тем кодерам, которые способны только применить указанное им решение.
_FR>Вот пример из личной жизни: пока писал на VB, приходилось вручную реализовывать бинарный поиск (ну нет его в стандартной библиотеке), и с обобщением написанного кода нет так всё просто в этом языке. Так вот несколько лет уже пишу на C# и, наверное, не вспомню, как его реализовать.
_FR>Знания забываются от отсутствия практики, а вовсе не от понимания сути. И закономерно, что в некоторых областях, где от определённых знаний толку чуть (я не говорю "совсем нет"), уровень "базы" снижается.
Есть такие программисты вроде меня, которые просто не могут понять, ну как можно "не вспомнить", как реализовывать бинарный поиск. Ну это же простейший кирпичик, который многие дети придумывают сами в школе на уроках информатики. Не знаю, наверное, круг общения у меня исторически такой что ли среди программистов, но я действительно не могу понять, как люди, которые не могут написать бинарный поиск, могут написать маломальски сложный код. Ведь вроде бы это настолько просто..
Но, в общем-то, как там у Малдера.. "I want to believe", то есть я заставляю себя верить, что есть отличные программисты в своих областях, не знающие таких вещей, но понять этого не могу. И таких, как я, довольно много, и флеймам этим нет счета..
_FR>Здравствуйте, netch80, Вы писали:
N>>А описанные Вами знания "есть такое, а есть сякое" без подкрепления забудутся после первого экзамена.
N>>Поэтому я с сомнением отношусь к тем архитекторам, которые давно сами не кодируют, и к тем кодерам, которые способны только применить указанное им решение.
_FR>Вот пример из личной жизни: пока писал на VB, приходилось вручную реализовывать бинарный поиск (ну нет его в стандартной библиотеке), и с обобщением написанного кода нет так всё просто в этом языке. Так вот несколько лет уже пишу на C# и, наверное, не вспомню, как его реализовать.
В данном случае я не имел в виду конкретику. Но если — по Вашему же примеру — он веб-программист (кстати, какой именно? это очень обширный класс ролей) — то должен иметь свои, специфические базовые знания.
N>>У меня лично статистики недостаточно. Но вот случай, когда обычная сортировка крайне невыгодна — каждый рабочий день на глазах, это таймерное дерево в движке событий. Оно сделано на пирамиде.
_FR>В отдельных случаях может быть (и даже имеет право быть) всё что угодно. Но вот спрашивать веб-програмиста про объекты синхронизации на юниксе — гхм..?
Ну а почему нет? Какой это веб-программист? Может, он программирует какую-то CMS, в которой хранится содержимое сайта (пардон, надо говорить "портала" и проблемы с модификацией данных ему очень даже существенны. Не надо зарекаться, случай всякий бывает...
_FR> Вот я и говорю, что "база" у програмистов в общем смысле не в алгоритмах сортировки и прочих деталях реализации.
База всегда в своих деталях реализации, и от этого не деться.
_FR>>И как в решении описанных проблем поможет умение написать _реализацию алгоритма_? ИМХО, достаточно знаний о том, что есть вот такое, есть такое, которое хорошо тогда и тогда, а тут лучше это и это.
N>Напрямую — никак. Но так уж человек устроен, что чтобы помнить о том, что есть разные методы — ему нужно с ними столкнуться лично и желательно написать хотя бы простейшую реализацию.
Т.е. я правильно понял вашу точку зрения:
1. Программист(инженер) должен учитывать характеристики составных частей при проектировании более сложной системы. Если существующие составные части не подходят, можно использовать специальные нестандартные детали.
2. Большинство программист(инженер) ленивые и потому берут первую попавшуюся деталь, если не бились ранее лбом по этой теме. Если бились, то обычно разбираются в вопросе и сразу думают, какую деталь лучше взять.
3. Если программист(инженер) не имеет знаний о сортировках, то он относится к пункту 2
3.a [с большой вероятностью].
?
С 1-м пунктом не согласиться сложно. Этой банальности учат на всех инженерных специальностях.
Со 2-м пунктом тоже сложно не согласиться. И правда ленивых немало.
C 3-им пунктом я не согласен. Во-первых, вывод просто неверен. Это логика. Множество ленивых инженеров и не знающих сортировки пересекаются, но ни одно из них не включает другое.
Во-вторых, если даже он относится к пункту 2, то он сталкивался. И либо он сразу сделал осознанный вывод (что опровергает пункт 3, так как изначально знаний он не имел), либо он таки напортачил. Зачем вам программист, который на неизвестной задаче сначала портачит, а потом разбирается?
Если вы имели в виду пункт 3.а (большинство/многие/некоторые, а не все), то я не понимаю требования знания сортировок.
Это лишь значит, что при прочих равных инженер, знающий сортировку, вероятнее окажется лучшим.
Но знание сортировок не является для этого ни достаточным, ни необходимым.
VE>Т.е. я правильно понял вашу точку зрения:
VE>1. Программист(инженер) должен учитывать характеристики составных частей при проектировании более сложной системы. Если существующие составные части не подходят, можно использовать специальные нестандартные детали.
VE>2. Большинство программист(инженер) ленивые и потому берут первую попавшуюся деталь, если не бились ранее лбом по этой теме. Если бились, то обычно разбираются в вопросе и сразу думают, какую деталь лучше взять.
VE>3. Если программист(инженер) не имеет знаний о сортировках, то он относится к пункту 2
VE> 3.a [с большой вероятностью].
VE>?
Да.
VE>С 1-м пунктом не согласиться сложно. Этой банальности учат на всех инженерных специальностях.
VE>Со 2-м пунктом тоже сложно не согласиться. И правда ленивых немало.
VE>C 3-им пунктом я не согласен. Во-первых, вывод просто неверен. Это логика. Множество ленивых инженеров и не знающих сортировки пересекаются, но ни одно из них не включает другое.
Речь не идёт о знании, как писать конкретную сортировку. Но о знании граничных и оптимальных условий их применения, хотя бы минимальных оценок эффективности. И о том, что лучший способ усвоения этих знаний — написать в порядке обучения хотя бы парочку.
Пусть сортировка только классический показательный пример, но программист, который решил применить quicksort на множестве ключей без линейного порядка — мягко говоря, поступает некорректно.
VE>Во-вторых, если даже он относится к пункту 2, то он сталкивался.
Почему?
VE> И либо он сразу сделал осознанный вывод (что опровергает пункт 3, так как изначально знаний он не имел), либо он таки напортачил. Зачем вам программист, который на неизвестной задаче сначала портачит, а потом разбирается?
Если он при этом учится и ошибка замечена вовремя — то почему бы и нет?
VE>Если вы имели в виду пункт 3.а (большинство/многие/некоторые, а не все), то я не понимаю требования знания сортировок.
VE>Это лишь значит, что при прочих равных инженер, знающий сортировку, вероятнее окажется лучшим.
VE>Но знание сортировок не является для этого ни достаточным, ни необходимым.
Точно так же как любое другое отдельно взятое знание. Реальная оценка будет идти по их совокупности.
N>Приходится задумываться, очень даже.
Вы всего лишь сказали одну банальную истину. Что выбор того или иного алгоритма должен быть осознанным, т.е. надо разобраться в _характеристиках_ и выбрать то, что подходит.
Но это не значит, что я должен уметь писать каждую сортировку (и тем более, что я должен был их когда-то писать), но знать их характеристики — должен. Но и то, только тогда, когда эта сортировка мне понадобится.
Вы же не берёте для проекта библиотеку U% только потому, что она единственная вам известная. Плюсы-минусы-то надо взешивать, так это никто не отрицал.
VE>Вы всего лишь сказали одну банальную истину. Что выбор того или иного алгоритма должен быть осознанным, т.е. надо разобраться в _характеристиках_ и выбрать то, что подходит.
VE>Но это не значит, что я должен уметь писать каждую сортировку (и тем более, что я должен был их когда-то писать), но знать их характеристики — должен. Но и то, только тогда, когда эта сортировка мне понадобится.
Если я правильно понял, он утверждает что человеку без знания подробного алгоритма запомнить характеристики невозможно, и что иное встречается крайне редко.
AVK>Если я правильно понял, он утверждает что человеку без знания подробного алгоритма запомнить характеристики невозможно, и что иное встречается крайне редко.
Я тоже так понял. И чтобы исключить недопонимание, я предлагаю ввести таки буквенные логические утверждения и пользоваться логикой, что частично сделал
Вопрос к fplab и netch80:
"Программист должен написать хотя бы пару сортировок, иначе его уровень программизма ниже, чем у тех, кто сортировки писал."
Если это то, что вы утверждаете, то:
A: уровень программиста ниже
B: написал сортировки
C: усвоил сортировки
Вы утверждаете:
!B => A // Не писал сортировок — плохой программист
что эквивалентно
!A => B // Хороший программист — писал сортироки
Обоснование, как я понял, вот такое:
B => C => !A // Писал сортировки, значит усвоил, значит хороший программист
Далее получаем:
B => !A // пропуская C
И потом делаем логическую ошибку:
!B => A // что явно неверно, т.о. вывод из предпосылок неверен
Т.о. либо у вас другие предпосылки, либо вы неправы.
N>... "quick sort" ...
Во, IT, ты удивляешься почему не у всех FP крышу сносит? У людей крыша занята. Одни ее занимают мыслями о том как писать quick sort-ты и где их лучше применять. Другие о том как бы не пропустить новые революции от Майкрософ. Третие еще чем-мто...
Pzz>>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
_FR>Я как-то всегда думал, что как раз алгоритмы — это то, что очень неплохо поддаётся "библиотизации", то есть вынесением в многократно используемые кирпичи. И задумываться над алгоритмами лишний раз не приходится.
В библиотеках содержатся стандартные алгоритмы. Куда вы пойдете, если вам нужна не просто сортировка, а сортировка с преподвывертом? Готовую именно с нужными вам свойствами вы не найдете, свою написать вы не умеете, т.к. всегда использовали готовую.
_FR>В первую очередь из-за того, что редко, очень редко встречаются сейчас такие задачи.
Принесут вам код, написанный для UNIX'а и активно использующий read/write lock'и, и попросят запустить его на Windows XP. А в XP нет read/write lock'ов. Ваши дальнейшие действия?
Pzz>>И получается печальная картина: все мечтают наслаивать классы, слой за слоем, а простую сортировку, если что, и написать-то некому.
_FR>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
Ну скорее я посоветую такому кодеру освоить другую профессию. Потому что произойдет очередная "смена технологий", C# заменят на C#$#%, и такой кодер останется без работы: кому нужен в качестве кодера 50-летний дядька, владеющий только устаревшими методами?
Pzz>>>Внутри метода — алгоритмы. Те самые сортировки и поиски, о которых книжки пишут. А снаружи — клей и упаковка.
_FR>>Я как-то всегда думал, что как раз алгоритмы — это то, что очень неплохо поддаётся "библиотизации", то есть вынесением в многократно используемые кирпичи. И задумываться над алгоритмами лишний раз не приходится.
Pzz>В библиотеках содержатся стандартные алгоритмы. Куда вы пойдете, если вам нужна не просто сортировка, а сортировка с преподвывертом? Готовую именно с нужными вам свойствами вы не найдете, свою написать вы не умеете, т.к. всегда использовали готовую.
Уметь по памяти и суметь на рабочем месте — две разные задачи.
_FR>>В первую очередь из-за того, что редко, очень редко встречаются сейчас такие задачи.
Pzz>Принесут вам код, написанный для UNIX'а и активно использующий read/write lock'и, и попросят запустить его на Windows XP. А в XP нет read/write lock'ов. Ваши дальнейшие действия?
Сяду читать или пойду пить пиво с юниксойдами, или нет, сначала пойду колоть юниксойдов, а потом сяду читать… нет, сначала почитаю, потом пойду пить пиво с юниксойдами Или попросту скажу, что это "не мой профиль" Зачем "это" (read/write lock) знать заранее? Именно: только в силу специфики решаемых задач. Если человеку каждый день надо писать под UNIX с учётом многопоточности, то он, наверное, должен это знать. Если человеку каждый день приходится писать запросы к базе данных, то он должен представлять себе, как работает её оптимизатор. Для "абстрактного" програмиста, для которого не определена специфика решаемых задач эти вопросы безсмысленны.
В том числе и сортировка, потому что (внимание) абстрактному програмисту не придётся её писать самому. Максимум — придётся научиться выбирать между сортировкой А и сортировкой Б, так этому научиваешься быстро, когда решаешь реальные задачи.
Если говорить конкретно о програмисте XYZ, то тогда можно с него потребовать и X, и Y и Z.
Pzz>>>И получается печальная картина: все мечтают наслаивать классы, слой за слоем, а простую сортировку, если что, и написать-то некому.
_FR>>Вот что ты скажешь о кодере, которому за девять с лишним лет ни разу не пришлось самому писать сортировку Не то, что строить деревья или создавать примитив синхронизации? Что он должен сгореть от горя или позора?
Pzz>Ну скорее я посоветую такому кодеру освоить другую профессию. Потому что произойдет очередная "смена технологий", C# заменят на C#$#%, и такой кодер останется без работы: кому нужен в качестве кодера 50-летний дядька, владеющий только устаревшими методами?
Из этих слов не ясно, почему пришедшие новые технологии потребуют навыков в рукопашной сортировке Скорее, я буду прав, предположив, что с течением времени (при условии использования новых и новых технологий) всё реже и реже придётся придётся самостоятельно разбираться с такими вещами, как реализация быстрой сортировки.
Pzz>>В библиотеках содержатся стандартные алгоритмы. Куда вы пойдете, если вам нужна не просто сортировка, а сортировка с преподвывертом? Готовую именно с нужными вам свойствами вы не найдете, свою написать вы не умеете, т.к. всегда использовали готовую.
_FR>Уметь по памяти и суметь на рабочем месте — две разные задачи.
Владение в совершенстве счетными палочками очень мало помогает в решении дифференциальных уровнений — тут требуется, э, несколько другой уровень математической культуры.
Точно так же умение в совершенстве склеивать готовые компоненты совершенно не помогает сочинять алгоритмы, напоминающие классические алгоритмы. Понять их устройство глядя на интерфейс тоже невозможно, как невозможно понять принципы работы двигателя внутреннего сгорания, в совершенстве овладев рулем и педалями.
Вы это либо умеете, либо нет. Если никогда не занимались, то, скорее всего, не умеете. Наверное, потратив время, вы сможете научиться, но у вас никогда не найдется на это времени. Поэтому когда встанет задача, в которой надо не просто скрестить XML с HTML'ем, а изобрести что-нибудь необычное, вас к ней никогда не привлекут. Это и есть тот самый ваш потолок, о котором говорил Валентин Нечаев. Заметьте, это ваш добровольный выбор.
Pzz>>Принесут вам код, написанный для UNIX'а и активно использующий read/write lock'и, и попросят запустить его на Windows XP. А в XP нет read/write lock'ов. Ваши дальнейшие действия?
_FR>Сяду читать или пойду пить пиво с юниксойдами, или нет, сначала пойду колоть юниксойдов, а потом сяду читать… нет, сначала почитаю, потом пойду пить пиво с юниксойдами Или попросту скажу, что это "не мой профиль" Зачем "это" (read/write lock) знать заранее? Именно: только в силу специфики решаемых задач. Если человеку каждый день надо писать под UNIX с учётом многопоточности, то он, наверное, должен это знать. Если человеку каждый день приходится писать запросы к базе данных, то он должен представлять себе, как работает её оптимизатор. Для "абстрактного" програмиста, для которого не определена специфика решаемых задач эти вопросы безсмысленны.
Есть знание специфическое, и есть знание фундаментальное. Специалист по географии, который не знает климатические особенности какого-нибудь никому неизвестного острова размером 2х2 метра в Тихом окене — явление вполне нормальное. Специалист по географии, который не знает, что такое остров вообще, потому что всю жизнь изучал только сушу — нонсенс.
Read/write lock — это классический примитив синхронизации, а не что-то UNIX-специфическое. Его нету в API Windows XP по чистому недоразумению (в Висте он уже появился), но аналогичные конструкции попадаются на каждом шагу. Так что я не понимаю, что вы собираетесь обсуждать с юниксоидами, и довольно печально, что вы по этому вопросу вообще собираетесь с ними что-то обсуждать — это свидетельствует о том, что вы не поняли вопрос.
Pzz>>Ну скорее я посоветую такому кодеру освоить другую профессию. Потому что произойдет очередная "смена технологий", C# заменят на C#$#%, и такой кодер останется без работы: кому нужен в качестве кодера 50-летний дядька, владеющий только устаревшими методами?
_FR>Из этих слов не ясно, почему пришедшие новые технологии потребуют навыков в рукопашной сортировке Скорее, я буду прав, предположив, что с течением времени (при условии использования новых и новых технологий) всё реже и реже придётся придётся самостоятельно разбираться с такими вещами, как реализация быстрой сортировки.
Я имел ввиду, что поскольку знания, в которые вы вкладываетесь, в основном состоят из перечня интерфейсов той технологии, которую вы сейчас считаете современной, то они по природе своей полностью устаревают за несколько лет, и вам приходится переучиваться. В 50 лет это будет сделать значительно сложнее. В том числе и по организационным причинам: никто не возьмет 50-летнего дядьку "на вырост", лучше возьмут студента.
Pzz>Есть знание специфическое, и есть знание фундаментальное. Специалист по географии, который не знает климатические особенности какого-нибудь никому неизвестного острова размером 2х2 метра в Тихом окене — явление вполне нормальное. Специалист по географии, который не знает, что такое остров вообще, потому что всю жизнь изучал только сушу — нонсенс.
Это что же, аналогия?
Не, ну если программист не знает, что такое сортировка вообще, то я соглашусь.
Только вы вроде о другом говорили.
Pzz>Так что я не понимаю, что вы собираетесь обсуждать с юниксоидами, и довольно печально, что вы по этому вопросу вообще собираетесь с ними что-то обсуждать — это свидетельствует о том, что вы не поняли вопрос.
Вы слишком хорошо развешиваете ярлыки. Самомнение что ли высокое.
Я понял ваш вопрос, он тоже. Однако ответили мы максимально общо, ибо вопрос был "например".
VE>Вы слишком хорошо развешиваете ярлыки. Самомнение что ли высокое.
VE>Я понял ваш вопрос, он тоже. Однако ответили мы максимально общо, ибо вопрос был "например".
Меня очень удручает то, что вы оба собрались потопать к юниксоидам. Поскольку единственный содержательный вопрос, который вы можете им задать, это "что такое read/write lock?", я делаю вывод, что вы оба не знаете, что такое read/write lock.
Ума ни приложу, что вы при таком раскладе могли понять в моем вопросе...
Pzz>Вы это либо умеете, либо нет. Если никогда не занимались, то, скорее всего, не умеете. Наверное, потратив время, вы сможете научиться, но у вас никогда не найдется на это времени. Поэтому когда встанет задача, в которой надо не просто скрестить XML с HTML'ем, а изобрести что-нибудь необычное, вас к ней никогда не привлекут. Это и есть тот самый ваш потолок, о котором говорил Валентин Нечаев. Заметьте, это ваш добровольный выбор.
Точно! Но с каикх это пор область прогармирования ограничивается "изобретением что-нибудь необычного"? Если хотя бы каждый сотый програмист на Земле начнёт этим "изобретением" заниматься, во что превратится мир [програмирования]?
Pzz>Есть знание специфическое, и есть знание фундаментальное.
Я по-прежнему не понимаю (из Ваших слов), для чего веб-програмисту обладать фундоментальными знаниями о примитивах синхронизации? Давайте тогда определим, что для "тех-то" нужно "то-то", а для "этих" "вон то". Только ограничить уж очень не просто получится, вплоть до того, что обоснованная работа на эту тему сможет стоитьь дисера.
Pzz>Я имел ввиду, что поскольку знания, в которые вы вкладываетесь, в основном состоят из перечня интерфейсов той технологии, которую вы сейчас считаете современной, то они по природе своей полностью устаревают за несколько лет,
С чего Вы это взяли? Это как-то следует из того, что я не могу написать сортировку?
_FR>Точно! Но с каикх это пор область прогармирования ограничивается "изобретением что-нибудь необычного"? Если хотя бы каждый сотый програмист на Земле начнёт этим "изобретением" заниматься, во что превратится мир [програмирования]?
Ну как вам сказать. Среднее техническое образование подразумевает умение грамотно применять изученные в техникуме приемы для решения типовых задач. Высшее техническое образование подразумевает умение подбирать подходы для решения нетиповых задач. Мне как-то хочется все же видеть программирование среди профессий, которые подразумевают высокую степень квалификации. Хотя я понимаю, что многие сегодняшние программисты не имеют профессиональных знаний даже в эквиаваленте техникума.
Если говорить о более практических вещах, то по-моему как-то справедливо, что если у программиста знаний примерно как у хорошего слесяря-сантехника, то и зарплата у него должна быть, как у хорошего слесаря-сантехника. И к этому, безусловно, со временем придет, т.к. готовить программистов-техников не сложно.
Pzz>>Есть знание специфическое, и есть знание фундаментальное.
_FR>Я по-прежнему не понимаю (из Ваших слов), для чего веб-програмисту обладать фундоментальными знаниями о примитивах синхронизации? Давайте тогда определим, что для "тех-то" нужно "то-то", а для "этих" "вон то". Только ограничить уж очень не просто получится, вплоть до того, что обоснованная работа на эту тему сможет стоитьь дисера.
Ну это как спросить, зачем начальнику домоуправления знать формы глаголов. Чтобы грамотно писать, вот зачем.
Pzz>>Я имел ввиду, что поскольку знания, в которые вы вкладываетесь, в основном состоят из перечня интерфейсов той технологии, которую вы сейчас считаете современной, то они по природе своей полностью устаревают за несколько лет,
_FR>С чего Вы это взяли? Это как-то следует из того, что я не могу написать сортировку?
Нет, это следует из подхода, за который вы агитируете. Который заключается в том, что знать надо только специфические для своей области вещи.
Pzz>Я имел ввиду, что поскольку знания, в которые вы вкладываетесь, в основном состоят из перечня интерфейсов той технологии, которую вы сейчас считаете современной, то они по природе своей полностью устаревают за несколько лет, и вам приходится переучиваться. В 50 лет это будет сделать значительно сложнее. В том числе и по организационным причинам: никто не возьмет 50-летнего дядьку "на вырост", лучше возьмут студента.
Очень сильное утверждение. А какие знания вы считаете несводимыми к перечню интерфейсов технологии?
Я вот регулярно спорю в этих же форумах со "старой гвардией", которая делает аналогичные высказывания. А потом выясняется, что для этой гвардии интерфейс строки — это ровно ASCIIZ. И человек, гордящийся умением написать по памяти поиск бойер-мура, совершенно не в состоянии написать эффективный алгоритм конкатенации строк, потому что в его ментальной модели не у всех строк есть длина. Я понятно объясняю?
Или, к примеру, совершенно невозможно объяснить такому человеку, что сравнение двух строк не сводится к сравнению байт, потому что есть суррогаты, есть нормализация, есть case sensitivity, есть accent sensitivity, и что пунктуация должна сравниваться с другим приоритетом, чем alphanumeric.
Тем не менее, такой человек считает себя безмерно круче окружающих и позволяет себе смеяться над людьми, которые выучили только интерфейс к string.Compare().
Тем не менее, с точки зрения, скажем, менеджера, эти наивные молодые люди куда полезнее старой гвардии: они, по крайней мере, могут правильно сравнить строки, когда нужно.
Pzz>>Я имел ввиду, что поскольку знания, в которые вы вкладываетесь, в основном состоят из перечня интерфейсов той технологии, которую вы сейчас считаете современной, то они по природе своей полностью устаревают за несколько лет, и вам приходится переучиваться. В 50 лет это будет сделать значительно сложнее. В том числе и по организационным причинам: никто не возьмет 50-летнего дядьку "на вырост", лучше возьмут студента.
S>Очень сильное утверждение. А какие знания вы считаете несводимыми к перечню интерфейсов технологии?
Отвечу вопросом на вопрос , а какие вы считаете сводимыми?
S>Тем не менее, такой человек считает себя безмерно круче окружающих и позволяет себе смеяться над людьми, которые выучили только интерфейс к string.Compare().
S>Тем не менее, с точки зрения, скажем, менеджера, эти наивные молодые люди куда полезнее старой гвардии: они, по крайней мере, могут правильно сравнить строки, когда нужно.
Угу. И настойчиво продолжают их сравнивать, когда не нужно. Но зато правильно, с учетом пунктуации
Вы говорите ровно то же, что и я: люди, привыкшие изучать интерфейсы без понимания того, что "под капотом" у этих интерфейсов, оказываются в неудобном положении, когда интерфейсы меняются. Через несколько лет string.Compare() будет смотреться столь же ограниченным частным случаем, как сейчас смотрится интерфейс к строке в виде последовательности байт в кодировке ASCII.
Pzz>В библиотеках содержатся стандартные алгоритмы. Куда вы пойдете, если вам нужна не просто сортировка, а сортировка с преподвывертом? Готовую именно с нужными вам свойствами вы не найдете, свою написать вы не умеете, т.к. всегда использовали готовую.
Ваша фраза применима к любой области и любой библиотеке. Однако, вы не станете требовать от человека знание всех ГУИ библиотек, всех библиотек для работы с сетью и т.п.?
Важно, чтобы человек не бездумно брал первую попавшуюся, а выбирал лучшую, и, если таковой не нашлось, 10 раз подумать и таки написать самому.
Только причём тут важность уметь писать самому всё изначально? Понадобится — будем разбираться.
Pzz>Принесут вам код, написанный для UNIX'а и активно использующий read/write lock'и, и попросят запустить его на Windows XP. А в XP нет read/write lock'ов. Ваши дальнейшие действия?
Почитаю соответствующую документацию, выберу решение. Или я должен всё знать заранее?
VE>Ваша фраза применима к любой области и любой библиотеке. Однако, вы не станете требовать от человека знание всех ГУИ библиотек, всех библиотек для работы с сетью и т.п.?
VE>Важно, чтобы человек не бездумно брал первую попавшуюся, а выбирал лучшую, и, если таковой не нашлось, 10 раз подумать и таки написать самому.
VE>Только причём тут важность уметь писать самому всё изначально? Понадобится — будем разбираться.
Напротив, я призываю как раз к прямо противоположному: попытаться понять те принципы, которые у этих библиотек "под капотом", а не все 10 миллионов вариантов реализации, различающихся только деталями. Принципов на самом деле не так много, они медленно меняются и редко устаревают, в отличии от реализаций. Время, потраченное на обучение, лучше инвестировать в те знания, которые приносят долгосрочную помощь, а не устаревают раз в несколько лет.
Pzz>>Принесут вам код, написанный для UNIX'а и активно использующий read/write lock'и, и попросят запустить его на Windows XP. А в XP нет read/write lock'ов. Ваши дальнейшие действия?
VE> VE>Почитаю соответствующую документацию, выберу решение. Или я должен всё знать заранее?
По вашему ответу хорошо видно, что вы совсем не поняли вопроса. Что такое read/write lock, я вам и так расскажу, это несложно (кстати, это классический примитив синхронизации, печально, что вы про него не слышали). Вопрос в том, из чего вы будете его делать — готового-то в венде нет.
Тут надо не знать, а уметь думать. И не стесняться пользоваться этим умением.
Pzz>Тут надо не знать, а уметь думать. И не стесняться пользоваться этим умением.
Т.е. вы умение думать проверяете по тому, писал ли программист сортировки?
Или тогда потрудитесь разъяснить, какая вообще связь между тем, разбирался ли человек с сортировками, и умением думать.
Pzz>>Тут надо не знать, а уметь думать. И не стесняться пользоваться этим умением.
VE>Т.е. вы умение думать проверяете по тому, писал ли программист сортировки?
VE>Или тогда потрудитесь разъяснить, какая вообще связь между тем, разбирался ли человек с сортировками, и умением думать.
Школьные сочинения преследуют 2 цели: научить человека писать синтаксически грамотно, и научить внятно излагать свои мысли в письменном виде. Вероятно и тому и другому можно научиться, не написав в жизни не одного сочинения. Но на практике такое встречается нечасто.
Умение думать вообще от сортировок, конечно, не зависит. Вон узбеки на рынке какие умные , а сортировкок поди не писали. Но умение думать в приложении к программированую подразумевает определенную грамотность и умение внятно излагать свои мысли в виде програмного кода. Наверное, этому можно научитася безо всяких сортировок — с таким же примерно успехом, как научиться пользоваться письменной речью без школьных сочинений.
Pzz>А много вы знаете граждан, способных написать самостоятельно RB-дерево?
ну дык слава богу выясняется не зря программисты несколько десятков лет работали и не нужно уже в каждом проекте реализовывать свои списки, деревья, сортировки и проч. фигню
OE>ну дык слава богу выясняется не зря программисты несколько десятков лет работали и не нужно уже в каждом проекте реализовывать свои списки, деревья, сортировки и проч. фигню
Ну да, в программировании вычислительных машин появились уже области, где не требуется высшее образование, достаточно знаний на уровне техникума
Pzz>Обратите внимание, что тот дикий язык, на котором в C++ пишут темплейты, тоже является функциональным языком. Причем чисто функциональным, с ленивыми вычислениями и выводом типов.
Обратил. И с удивлением для себя обнаружил, что до конца понимают его десятые доли процента из тех кто считает, что знает С++.
Из всего этого вывод я делаю такой, что ООП в принципе и не нужен, ФП более чем достаточно. Ну разве, что если ООП будет средством модульности. Т.е. от ООП в классическом понимании останется совсем мало.
Смотря, что считать классическим понимание ООП Если "черные ящики, обменивающиеся сообщениями"(с)Алан Кей, то ООП остается
Y>В итоге от ООП остались только описание класса и внешние интерфейсы. Все. Далее, остальные подсистемы подверглись такому же процессу рефакторинга, ну кроме мордочек.
Всё верно, я как раз об этом говорил. Такое получилось потому, что ранее у тебя скудность тактических средств затыкалась стратегией.
Y>Из всего этого вывод я делаю такой, что ООП в принципе и не нужен, ФП более чем достаточно. Ну разве, что если ООП будет средством модульности. Т.е. от ООП в классическом понимании останется совсем мало.
GUI на ФП тоже хорошо делается?
AF>Здравствуйте, yumi, Вы писали:
Y>>Из всего этого вывод я делаю такой, что ООП в принципе и не нужен, ФП более чем достаточно. Ну разве, что если ООП будет средством модульности. Т.е. от ООП в классическом понимании останется совсем мало.
AF>GUI на ФП тоже хорошо делается?
Вот, кстати, очень интересный вопрос! Сколько смотрю на последние "жаркие" темы — учебный флейм и эту — всё пытаюсь представить, как же делать на ФП пользовательский интерфейс. Я пока что на ФП не пробовал ниче писать и вопрос скорее оффтопный, но мож кто чиркнет в общих чертах Вот как баттон на форму впихнуть?
MK>Вот, кстати, очень интересный вопрос! Сколько смотрю на последние "жаркие" темы — учебный флейм и эту — всё пытаюсь представить, как же делать на ФП пользовательский интерфейс. Я пока что на ФП не пробовал ниче писать и вопрос скорее оффтопный, но мож кто чиркнет в общих чертах Вот как баттон на форму впихнуть?
в общем, ничего неожиданного.
M>в общем, ничего неожиданного.
Ага... эмуляция эмперативщины на функциональном языке эмулиуемом в императивной машине.
VD>Ага... эмуляция эмперативщины на функциональном языке эмулиуемом в императивной машине.
Влад, ну это ж уже сто раз обсасывалось.
кто-то пользует mutable для изменяемых переменных, а кто-то State и IO.
где-то mutable захардкоженый элемент языка, а где-то это сделано на основе патттерна который применяется еще многими способами.
Допустим на той же идеологии монад в f# сделали красивые асинхронные вычисления. И software transactional memory. В Немерле допустим это можно было бы организовать макросами. разные подходы просто.
А где что кому лучше... Оно вопрос из серии "на вкус и цвет фломастеры разные".
MK>Вот, кстати, очень интересный вопрос! Сколько смотрю на последние "жаркие" темы — учебный флейм и эту — всё пытаюсь представить, как же делать на ФП пользовательский интерфейс. Я пока что на ФП не пробовал ниче писать и вопрос скорее оффтопный, но мож кто чиркнет в общих чертах Вот как баттон на форму впихнуть?
xmonad — какие-то маньяки вообще сделали windows manager на haskell
AF>GUI на ФП тоже хорошо делается?
Лично я Гуи на ФП не делал, не могу ничего сказать по этому поводу.
AF>GUI на ФП тоже хорошо делается?
UI то, конечно, делать можно. Проблема в дизайн-тайме, причем не только этого самого UI. Сколько я ни спрашивал, никто не смог мне продемонстрировать чисто функциональную компонентную модель. Что, впрочем, не мешает при этом какими то элементами ФП пользоваться.
AVK>UI то, конечно, делать можно. Проблема в дизайн-тайме, причем не только этого самого UI. Сколько я ни спрашивал, никто не смог мне продемонстрировать чисто функциональную компонентную модель. Что, впрочем, не мешает при этом какими то элементами ФП пользоваться.
Любой интерфейс должен иметь состояние — просто потому, что пользователь так устроен Так что делать его в идеологии ФП — все равно что бегать в ластах.
AF>Любой интерфейс должен иметь состояние — просто потому, что пользователь так устроен
ФП не отрицает состояния, ФП отрицает изменяемое состояние. А устроенность мира заменяется в ФП копированием. Это ж, блин, азы.
Еще раз — проблема не в UI, он то как раз в ФП стиле описывается, хотя о балансе плюсов и минусов такого способа я вывода сделать не готов. Проблема в другом — никакой альтернативы понятию компонента со стороны ФП нет. А вот уже компонент сделать неизменяемым, да так чтобы дизайн-тайм был нормальный — та еще задачка, в основном идеологического плана.
AVK>ФП не отрицает состояния
AVK>А устроенность мира заменяется в ФП копированием. Это ж, блин, азы.
Я, блин, в курсе, как работает ФП.
"Все вокруг тупицы, один я д'Артаньян" — это ты молодец. Не надо обвинять фанатичных немерлистов, источник флейма явно в тебе.
AVK>>ФП не отрицает состояния
AF>
Кривое определение непонятно откуда, что я еще могу сказать. Автомат без состояния это тупая КС, на ней много не построишь.
Слабо написать функциональную программу для машины только с ПЗУ?
AF>"Все вокруг тупицы, один я д'Артаньян" — это ты молодец. Не надо обвинять фанатичных немерлистов, источник флейма явно в тебе.
А может в тебе?
AVK>>UI то, конечно, делать можно. Проблема в дизайн-тайме, причем не только этого самого UI. Сколько я ни спрашивал, никто не смог мне продемонстрировать чисто функциональную компонентную модель. Что, впрочем, не мешает при этом какими то элементами ФП пользоваться.
AF>Любой интерфейс должен иметь состояние — просто потому, что пользователь так устроен Так что делать его в идеологии ФП — все равно что бегать в ластах.
Нет.
Состояние может существовать просто согласно постановке задачи (например, stateful протокол). Для того, чтобы состояние не рассыпалось, конечно достаточно линеаризации мутаторов и аксессоров, и так делают все императивные языки. Однако, это не необходимое условие. Для корректного сохранения состояния достаточно соблюдать относительный порядок вызовов мутаторов и аксессоров.
Один из подходов — это монады, о них ты уже много раз слышал. Формируется ФВП, связывающая аргумент и цепочку мутаторов/аксессоров, таким образом сохраняющая относительный порядок и таким образом поддерживающая состояние в корректном гхм... состоянии Итоговая конструкция скорее не "последовательная", а "вложенная", и обладает несимметричностью (слева значение, а справа функцию (условно говоря, ибо функции тоже значения)).
Другой подход. Теперь мы говорим, что эти обращения к состоянию образуют поток (то есть вводим понятие функционального потока). Мы можем, если хотим, производить различные операции над такими потоками, эти операции будут порождать другие потоки. Операции над потоками обобщаются до стрелок (в случае хаскеля просто класс типов Arrow). В деталях эта абстракция довольно сложна, но пользоваться ею (при наличии необходимых примитивов) вполне нормально:
LCR>Нет.
Допустим, у нас есть некоторый GUI с деревом. Развесистым таким деревом, на 10^n элементов. И пользователь где-то в глубине иерархии поменял название одного элемента. Как это будет выглядеть в рамках ФП?
AF>Допустим, у нас есть некоторый GUI с деревом. Развесистым таким деревом, на 10^n элементов. И пользователь где-то в глубине иерархии поменял название одного элемента. Как это будет выглядеть в рамках ФП?
Ах, бедные, забаненые гуглом люди.
http://en.wikipedia.org/wiki/Purely_functional
AF>Допустим, у нас есть некоторый GUI с деревом. Развесистым таким деревом, на 10^n элементов. И пользователь где-то в глубине иерархии поменял название одного элемента. Как это будет выглядеть в рамках ФП?
Допустим, у нас есть некоторый компилятор с деревом (AST). Развесистым таким деревом, на 10^n элементов. И в процессе компиляции где-то в глубине иерархии поменяли тип одного элемента. Как это будет выглядеть в рамках ФП?
AF>Допустим, у нас есть некоторый GUI с деревом. Развесистым таким деревом, на 10^n элементов. И пользователь где-то в глубине иерархии поменял название одного элемента. Как это будет выглядеть в рамках ФП?
Из сообщений z00n, я понял, что тебе недостаточно, что функциональные структуры данных существуют и работают. Тебя интересует, как будет происходить весь процесс, начиная с процедуры вндового цикла сообщений?
Вопрос не столько в том — есть именно такой предмет или нет. Вопрос в системе подготовки программистов. В вузах элементарно отсутствуют преподаватели. Те, кто действительно что-то знает, работают в других местах. Ибо решиться получать 7..10 тыс.руб. за эту весьма тяжкую и нервную работу способны далеко не все, а альтруистов как обычно на всех не хватает.
А старые кадры (еще советских времен) — в подавляющем большинстве так и остались на уровне "времен Очаковских и покоренья Крыма". Научить ассемблеру ЕС-ЭВМ они еще могут. Те, кто продвинутей, вспомнят PDP-11. От практики такие "учителя" оторвались безнадежно (да, наверное, никогда ею и не занимались).
Отдельные вузы (наверное, штук 5-7 на всю Расею) не в счет: по большому счету они, к сожалению, погоды не делают. Вот вам и бескультурье. Добро, если начинающему программисту встретится на пути добрый человек и посоветует почитать, к примеру "Практику программирования" (Б.Керниган и Р.Пайк), "Дисциплину программирования" (Э.Дейкстра) или "Жемчужины программирования" (Дж.Бентли).
Только, боюсь, подавляющее большинство неофитов сие премудрые книжки "ни асилит" — проще ваять псевдомудреный код с кучей абсолютно лишних наворотов
F>Вопрос не столько в том — есть именно такой предмет или нет. Вопрос в системе подготовки программистов. В вузах элементарно отсутствуют преподаватели. Те, кто действительно что-то знает, работают в других местах. Ибо решиться получать 7..10 тыс.руб. за эту весьма тяжкую и нервную работу способны далеко не все, а альтруистов как обычно на всех не хватает.
F>А старые кадры (еще советских времен) — в подавляющем большинстве так и остались на уровне "времен Очаковских и покоренья Крыма". Научить ассемблеру ЕС-ЭВМ они еще могут. Те, кто продвинутей, вспомнят PDP-11. От практики такие "учителя" оторвались безнадежно (да, наверное, никогда ею и не занимались).
F>Отдельные вузы (наверное, штук 5-7 на всю Расею) не в счет: по большому счету они, к сожалению, погоды не делают. Вот вам и бескультурье. Добро, если начинающему программисту встретится на пути добрый человек и посоветует почитать, к примеру "Практику программирования" (Б.Керниган и Р.Пайк), "Дисциплину программирования" (Э.Дейкстра) или "Жемчужины программирования" (Дж.Бентли).
Так, может, что-то делать по сути? Например, я думаю, что Вам надоедает таки 8 часов в день сидеть за монитором, а свои мысли надо уложить в систему.
Объявите на фирме семинар для студентов, где-то так в пятницу 17:00-18:30, с приходом всех желающих, и рассказывайте хоть что-то, но свежее и актуальное, а тех, кто показывает понимание, заманивайте на пиво и затем на работу В принципе, неважно, что именно будете рассказывать — лишь бы умели это делать. Развесить объявления в ближайших профильных вузах и смотреть, кто приходит... После этого всерьёз воспринимать тех титанов мысли XIX века с ассемблером ЕС ЭВМ уже не станут.
F>Только, боюсь, подавляющее большинство неофитов сие премудрые книжки "ни асилит" — проще ваять псевдомудреный код с кучей абсолютно лишних наворотов
Ну и не надо книжки, надо с людьми работать. Книжки потом будут.
N>Так, может, что-то делать по сути? Например, я думаю, что Вам надоедает таки 8 часов в день сидеть за монитором, а свои мысли надо уложить в систему.
N>Объявите на фирме семинар для студентов, где-то так в пятницу 17:00-18:30, с приходом всех желающих, и рассказывайте хоть что-то, но свежее и актуальное, а тех, кто показывает понимание, заманивайте на пиво и затем на работу В принципе, неважно, что именно будете рассказывать — лишь бы умели это делать. Развесить объявления в ближайших профильных вузах и смотреть, кто приходит... После этого всерьёз воспринимать тех титанов мысли XIX века с ассемблером ЕС ЭВМ уже не станут.
F>>Только, боюсь, подавляющее большинство неофитов сие премудрые книжки "ни асилит" — проще ваять псевдомудреный код с кучей абсолютно лишних наворотов
N>Ну и не надо книжки, надо с людьми работать. Книжки потом будут.
Да стараюсь как могу За трех человек, кто прошел через наставничество, не стыдно. Одно печалит — выход мал: это все достижения за 15 лет. Оставшихся стараюсь хоть чему-нибудь да поднатаскивать.
IT>Сразу хочу обозначить несколько моментов для предотвращения ненужного флейма.
IT>- Я умышленно не стал трогать МП, так эта вещь идёт в параллель с обсуждаемой темой.
Если ты имеешь в виду метапрограммировние — то очень зря его "умышленно не трогаешь".
Сила декларативного программирования (и ФП в частности) — как раз в том, что внутренности метода могут являться метапрограммой, подвергать и подвергаться разнообразным трансформациям.
Паттерн-матчинг — это очень красивый if, всё-таки.
А вот трансформирующийся код — это реально круто.
Причём необязательно прибегать к мощи языков С++, Haskell и тем более Template Haskell.
Старые добрые паттерны ООП делают немножко чудес.
Например, банальная сериализация объекта
Здесь, благодаря полиморфизму всех участников соревнования (сам объект-подлежащее, его члены, и посетитель) мы написали метапрограмму, порождающую разные способы записи и чтения (смотря какой посетитель туда придёт), а то и генерирования кода для дальнейшей записи и чтения.
Что же касается фуриков-бариков, то для кодирования прямо в методе нужен достаточно богатый и выразительный фреймворк.
Не обязательно "супер-богатый и супер-выразительный", но всё-таки достаточный.
Почему так популярен Tk во всех его портах — там уже есть все классы окон с кучей точек кастомизации (причём колбеки там на функциях, а не на интерфейсах).
IT>Казалось бы, причём тут Немерле? А вы думали я о чём?
Если это такой чудесный и суперпродуктивный язык, то почему единственные условно известные проекты на нем — компилятор и интеграция — никак не могут дойти до версии 1.0?
DM>Если это такой чудесный и суперпродуктивный язык, то почему единственные условно известные проекты на нем — компилятор и интеграция — никак не могут дойти до версии 1.0?
Потому что всем и так хорошо
IT>Но так ли всё плохо? Есть ли надежда на просветление? Конечно, есть. Имя этому просветлению – (кто бы мог подумать) functional programming.
Понимаете, есть один очень серьёзный камень преткновения и его имя -- деструктивные присваивания. Не знаю как вам а лично мне очень сложно обойтись без деструктивных присваиваний. Основной рабочий инструмент для меня C, но я много изучал Haskell и много пытался на нём писать. Вы когда-нибудь пробовали написать на этом языке двусвязный список например? А вы попробуйте... А потом слить два отсортированных двусвязных списка с сохранением сортировки... верёвка и мыло в магазине за углом кстати. Диссер Окасаки по чисто функциональным структурам данных на мой взгляд просто хоронит эти структуры с точки зрения практики.
Так вот любая попытка смешать снотворное со слабительным неизбежно заканчивается тем, что обычный человек в своей жизни мыслит императивно, деструктивными ходами. Типа взять ложку положить в ящик. Потом вынуть ложку положить вилку. Вам мама в детстве записки на столе наверняка оставляла. Типа возьми крупу, свари кашу, съешь её и иди в школу. Чисто императивный алгоритм. А функциональные фичи в языке требуют функциональной чистоты и высокой математической культуры (я месяц въезжал в монады и до сих пор не уверен, что въехал). Что до метапрограммирования, то напишите этот марсианский кошмар и вы увидите что его некому поддерживать.
В то же время у меня есть опыт редукции офигительной объектно-ориентированной иерархии на C++ из десятка шаблонных классов и активным использованием STL и Boost на полсотни килобайт кода в одну (!) функцию на C из сорока строчек, *не использующую даже CRT*. И я совершенно уверен из всего своего опыта -- любая "сложность" программирования на простых языках без лишних фич во многом надумана. C is really enough.
Сейчас все эти сишарпы и немерле выплывают только на растущей производительности компов, которая пока растёт быстрее чем все их сборщики мусора тормозят. Надолго ли?
T>В то же время у меня есть опыт редукции офигительной объектно-ориентированной иерархии на C++ из десятка шаблонных классов и активным использованием STL и Boost на полсотни килобайт кода в одну (!) функцию на C из сорока строчек, *не использующую даже CRT*.
дьявол как всегда в деталях — сохранена ли при этом _вся_ функциональность исходного кода, или половину выкинули (пусть даже за ненадобностью), сохранена ли та же безопасность по отношению к внешним параметрам и т.д., без этого судить о крутости "редукции" не представляется возможным
T>А функциональные фичи в языке требуют функциональной чистоты и высокой математической культуры (я месяц въезжал в монады и до сих пор не уверен, что въехал).
Лично мне плевать на чистоты и высокие культуры. Я беру от FP то, что мне надо, там где надо пишу императивно и сплю при этом абсолютно спокойно. Всё это только потому, что я рассматриваю FP не как религиозное учение, а как набор удобных паттернов, вполне совместимых с жизнью.
T> Что до метапрограммирования, то напишите этот марсианский кошмар и вы увидите что его некому поддерживать.
Метапрограммирования у меня целая библиотека — http://www.bltoolkit.net. Если бы она была написана на Немерле и для Немерле, то была бы в несколько раз короче и делала бы больше полезных вещей более прямыми способами.
T>В то же время у меня есть опыт редукции офигительной объектно-ориентированной иерархии на C++ из десятка шаблонных классов и активным использованием STL и Boost на полсотни килобайт кода в одну (!) функцию на C из сорока строчек, *не использующую даже CRT*. И я совершенно уверен из всего своего опыта -- любая "сложность" программирования на простых языках без лишних фич во многом надумана. C is really enough.
Нет таких алгоритмов, которые можно сделать на C и нельзя сделать на том же C# так же или проще. Обратное неверно. Возьми хотя бы замыкания.
T>Сейчас все эти сишарпы и немерле выплывают только на растущей производительности компов, которая пока растёт быстрее чем все их сборщики мусора тормозят. Надолго ли?
Это всё домысла. GC работает вполне приемлемо. А вот от объема того функционала, который делается сегодня современными средствами, любой C очень быстро захлебнётся в собственном дерь... простите в malloc, free и char*.
T>>В то же время у меня есть опыт редукции офигительной объектно-ориентированной иерархии на C++ из десятка шаблонных классов и активным использованием STL и Boost на полсотни килобайт кода в одну (!) функцию на C из сорока строчек, *не использующую даже CRT*. И я совершенно уверен из всего своего опыта -- любая "сложность" программирования на простых языках без лишних фич во многом надумана. C is really enough.
IT>Нет таких алгоритмов, которые можно сделать на C и нельзя сделать на том же C# так же или проще. Обратное неверно. Возьми хотя бы замыкания.
Обратное верно, если учесть хотя бы низкоуровневую специфику, которую часто на C# или реализовать нельзя, или только unmanaged кодом (который лучше считать диверсией, а не C#, по крайней мере в рамках данной дискуссии). Но и замыкания — ни капельки не rocket science. Везде, где интерфейс написан нормально (а не через двуединую сущность с вертикальной улыбкой) и есть передача указателя на callback, есть и передача произвольного параметра (как правило, void*) к этому коллбэку. Если мы подменим и функцию (на свою) и данные (заведя структуру с исходным указателем и сохранёнными данными), получим то же замыкание. Да, это "закат солнца вручную" и грабли этого подхода известны. Но тем не менее — работает и используется.
Я подобный механизм использовал на C, и мне его понять было значительно легче, чем замыкания, в которых косвенным и изначально неочевидным образом фиксируются значения переменных. Фактически, замыкания в известных ФЯ и приближенных к них, таких, как Perl, Python... — хак на основании того, что ссылка на копию значения запоминается через неявное средство обеспечения уникальной копии (для процедурно функционально-обогащённых) языков это персональный стековый фрейм).
(О, какой термин прикольный родился на ходу — надо запомнить.)
T>>Сейчас все эти сишарпы и немерле выплывают только на растущей производительности компов, которая пока растёт быстрее чем все их сборщики мусора тормозят. Надолго ли?
IT>Это всё домысла. GC работает вполне приемлемо. А вот от объема того функционала, который делается сегодня современными средствами, любой C очень быстро захлебнётся в собственном дерь... простите в malloc, free и char*.
С этим полностью согласен — сила современных языков не столько в том, что они позволяют, сколько в том, что они не позволяют и в какие рамки укладывают применяемые средства.
IT>>Нет таких алгоритмов, которые можно сделать на C и нельзя сделать на том же C# так же или проще. Обратное неверно. Возьми хотя бы замыкания.
N>Обратное верно, если учесть хотя бы низкоуровневую специфику,
Для низкоуровневой специфики лучше всего использовать ассемблер. Впрочем, C это и есть почти ассемблер, вот пусть он этими спецификами и занимается. А тягаться с высокоуровневой логикой на C даже не смешно.
T>Понимаете, есть один очень серьёзный камень преткновения и его имя -- деструктивные присваивания. Не знаю как вам а лично мне очень сложно обойтись без деструктивных присваиваний.
Они конечно нужны но намного реже чем ты думаешь.
T>Основной рабочий инструмент для меня C,
Заметно.
T>но я много изучал Haskell и много пытался на нём писать.
На хаскеле или таки на С с синтаксисом хаскеля?
T>Вы когда-нибудь пробовали написать на этом языке двусвязный список например? А вы попробуйте...
А зачем?
Лично мне двусвязные списки по делу так ни разу и не понодобились.
T>А потом слить два отсортированных двусвязных списка с сохранением сортировки... верёвка и мыло в магазине за углом кстати.
А зачем?
T>Диссер Окасаки по чисто функциональным структурам данных на мой взгляд просто хоронит эти структуры с точки зрения практики.
Если применять их по делу то нет.
T>Так вот любая попытка смешать снотворное со слабительным неизбежно заканчивается тем,
Демагогия.
T>что обычный человек в своей жизни мыслит императивно, деструктивными ходами.
Не обобщай свой ход мыслей на всех.
T>Типа взять ложку положить в ящик. Потом вынуть ложку положить вилку. Вам мама в детстве записки на столе наверняка оставляла. Типа возьми крупу, свари кашу, съешь её и иди в школу. Чисто императивный алгоритм.
Сколько раз твердили миру что нельзя тупо переносить опыт из реального мира на программирование и все тудаже...
T>А функциональные фичи в языке требуют функциональной чистоты и высокой математической культуры (я месяц въезжал в монады и до сих пор не уверен, что въехал).
Я въехал минут за нацать прочитав одну статью.
Концепция тупая как пробка. Никакой заумной матиматики для ее понимания не нужно.
T>Что до метапрограммирования, то напишите этот марсианский кошмар и вы увидите что его некому поддерживать.
Вот только это не соответствует действительности.
Например код на немерле буквально забит вызовами макросов. Они есть почти в каждой строке, а то и по нескульку раз. И никаких проблем это не создает.
Натворить конечно можно будь здоров сколько вот только натворить можно и на обычном языке. Вон посмотри индусячий код.
T>В то же время у меня есть опыт редукции офигительной объектно-ориентированной иерархии на C++ из десятка шаблонных классов и активным использованием STL и Boost на полсотни килобайт кода в одну (!) функцию на C из сорока строчек, *не использующую даже CRT*.
У меня есть обратный опыт из в и что? На функциональщене это будет еще короче.
Будешь и дальше обобщать один случай (скорей всего показывающий неопытность тех кто писал тот код) на все?
Это слишком простая демагогия. Тут такая не работает.
T>И я совершенно уверен из всего своего опыта -- любая "сложность" программирования на простых языках без лишних фич во многом надумана. C is really enough.
А я уверен прямо в противоположном.
T>Сейчас все эти сишарпы и немерле
Эти языки стоят на разных уровнях.
T>выплывают только на растущей производительности компов, которая пока растёт быстрее чем все их сборщики мусора тормозят. Надолго ли?
Навсегда.
Ибо сборщики мусора тормозят гораздо меньше чем ты думаешь и более того со временем тормозят все меньше и меньше.
А когда наконец сделают правильную ВМ (модель CLR и JVM мусор редкостный хрен чего докажешь почти как в С, а без доказательств агрессивную оптимизацию не сделать) у С начнутся очень тяжелые времена.
Сначала его загонят во встраиваимые железки, а потом кроскомпиляцией и оттуда выдавят.
IT>Было только одно существенное новшество – замыкания в C# 2.0 в 2005-м году
Еще задолго до C# 2.0 я писал в самом банальном жабо-скрипте:
Как говорится, найди 3 отличия
ВВ>Здравствуйте, IT, Вы писали:
IT>>Было только одно существенное новшество – замыкания в C# 2.0 в 2005-м году
ВВ>Еще задолго до C# 2.0 я писал в самом банальном жабо-скрипте:
Ну так где ECMAscript (который Netscape зачем-то назвал JavaScript), а где C#.
Кстати, "ещё задолго до C# 2.0" тривиально было в делегат поместить метод класса, а в класс вгрузить необходимые параметры — это было то же замыкание, только сконструированное вручную. Добавка синтаксического клея во 2-й и 3-й версии сделала этот процесс доступным ширнармассам, но кто хотел — умел и раньше.
ВВ>>Еще задолго до C# 2.0 я писал в самом банальном жабо-скрипте:
N>Ну так где ECMAscript (который Netscape зачем-то назвал JavaScript), а где C#.
А где? Каждый на своем месте. И думаю на жабо-скрипте пишут даже больше людей чем на C#.
N>Кстати, "ещё задолго до C# 2.0" тривиально было в делегат поместить метод класса, а в класс вгрузить необходимые параметры — это было то же замыкание, только сконструированное вручную. Добавка синтаксического клея во 2-й и 3-й версии сделала этот процесс доступным ширнармассам, но кто хотел — умел и раньше.
Я собственно придираюсь к хронологии. А то выглядит так — все жили в пещерах, потом пришел C# и показал всем "свет разума", а Немерле превратил этот "свет" в пожарище. Я не специалист по истории ЯВУ, но сдается мне, что все этим "замыканиям" уже сто лет в обед, и C# тут как обычно выступает лишь в роли качественного подражателя.
ВВ>Еще задолго до C# 2.0 я писал в самом банальном жабо-скрипте:
Твой основной язык javascript?
ВВ>Еще задолго до C# 2.0 я писал в самом банальном жабо-скрипте:
ВВ>
ВВ>Как говорится, найди 3 отличия
Возможно, отличия в скорости работы?
V>Возможно, отличия в скорости работы?
А причем тут скорость работы? Для жабо-скрипта кстати никто не мешает сделать Джит — причем даже примеры реализации уже есть в количестве.
Кстати, у тебя присутствует фактически следующая классификация: сам ООП это ультрамодный космический корабль, а то, что мы пишем в методах — пещерный век.
А мне кажется, что ООП — это не космический корабль. Это ржавая подводная лодка, которая медленно идет ко дну
Вот неужели ООП не предлагает средств, чтобы избавиться от всех этих switch, if/else и прочая? Разве нельзя спроектировать систему — именно спроектировать — чтобы практически избавиться от всех этих "пережитков" вкупе с out/ref и другими неприглядными вещами? Так почему же мы это не делаем?
А ответ простой. Потому что последовательно и полностью реализованная ООП концепция в большом приложении — это просто кошмар. По сравнению с этим все "неприглядности" старого структурного программирования покажутся просто детскими шалостями. Я видел, как люди, "дорвавшиеся" до всяких ООП фенек, начинали проектировать системы — вполне в соответствии со всеми, паттернами — и когда я смотрел на их творчество мне хотелось выблевать на монитор, извините. При этом я с удовольствием читал код, скажем, Sqlite — хотя мои знания C# на настоящий момент несколько лучше, мягко говоря, чем plain C.
Собственно, почему я не "проникся" Немерле. Не из-за того, что я "барик", не из-за того, что не могу оценить все прелести ФП, а из-за того, что все это очень сильно похоже на "припарки" мертвому. Я не понимаю, почему "внешняя" архитектура должны быть ООП, а "внутренняя", скажем, ФП. Если та или иная концепция не позволяет реализовать ее последовательно во всех частях программы — так ли эта самая концепция хороша? И может стоит вообще пересесть с этой подводной лодки на что-нибудь другое?
ВВ>Если та или иная концепция не позволяет реализовать ее последовательно во всех частях программы — так ли эта самая концепция хороша?
так ли хороша концепция подводной лодки если на ней неудобно ездить по пустыне?
ВВ>И может стоит вообще пересесть с этой подводной лодки на что-нибудь другое?
безусловно, по пустыне — лучше на верблюде
OE>безусловно, по пустыне — лучше на верблюде
Что-то я уже не улавливаю суть метафор Что за "пустыня"?
ВВ>Кстати, у тебя присутствует фактически следующая классификация: сам ООП это ультрамодный космический корабль, а то, что мы пишем в методах — пещерный век.
ВВ>А мне кажется, что ООП — это не космический корабль. Это ржавая подводная лодка, которая медленно идет ко дну
Как вам угодно. Пусть это ржавая подводная лодка. Но это всё равно офигительный прогресс по сравнению с каменным топором.
ВВ>И может стоит вообще пересесть с этой подводной лодки на что-нибудь другое?
Предлагай. Насколько мне известно, на сегодняшний день всё уже придумано, но не всё пока реализовано в мэйнстриме. Если ты придумаешь что-то новое, что будет круче всего, что уже есть, то Нобелевская премия тебе гарантирована.
IT>Предлагай. Насколько мне известно, на сегодняшний день всё уже придумано, но не всё пока реализовано в мэйнстриме. Если ты придумаешь что-то новое, что будет круче всего, что уже есть, то Нобелевская премия тебе гарантирована.
Это вряд ли. Насколько мне известно, премия Нобеля не распространяется на математические области. Но это чисто так, придирка.
MS>Это вряд ли. Насколько мне известно, премия Нобеля не распространяется на математические области. Но это чисто так, придирка.
Для придирчивых есть премия Тьюринга.
ВВ>Собственно, почему я не "проникся" Немерле. Не из-за того, что я "барик", не из-за того, что не могу оценить все прелести ФП, а из-за того, что все это очень сильно похоже на "припарки" мертвому. Я не понимаю, почему "внешняя" архитектура должны быть ООП, а "внутренняя", скажем, ФП. Если та или иная концепция не позволяет реализовать ее последовательно во всех частях программы — так ли эта самая концепция хороша? И может стоит вообще пересесть с этой подводной лодки на что-нибудь другое?
На что? Можно конкретнее?
VD>На что? Можно конкретнее?
Для того, чтобы определиться "на что", надо в первую очередь понять "что" конкретно не устраивает. В интерпретации ИТ ситуация выглядит так:
Мне вот это как раз и непонятно. Я об этом тут уже писал да потерли.
А "что" происходит внутри методов-то? Что за таинственная "жизнь" такая? Может сложиться впечатление, что "жизнь внутри методов" происходит как бы отдельно и сугубо автономно от всех этих внешних иерархий.
А фактически внутри методов и пишется как раз код, который использует все эти "иерархии". И если наши красивые объектно-ориентированные классы предполагают по своему дизайну, что работать с ними приходится пещерными методами — то чему тут можно удивляться?
Касательно Немерле. Вопроса метапрограммирования я нарочно не касаюсь — возьмем только сочетание ФП и ООП. Почему мне не нравится это? Потому что ФП в данном случае это не что иное как попытка облечь "пещерные методы" в более красивую форму. И все. Я тут не вижу никаких "кардинальных" изменений по сравнению с тем что раньше было. Да, раньше кололи дрова топором, теперь лесопилка — но "двора"-то по-прежнему нужны, мы от этого не ушли никуда.
Ну по-моему реально странно все это. Мы, к примеру, создаем коллекции, скажем так, "векторного" типа, которые предполагают, что для осуществления групповых операций придется пользоваться банальным перебором — а потом начинаем придумывать наиболее "красивые" формы этого перебора.
ООП, как тут многие более чем справедливо говорили, это фактически "кирпичи". Из них можно построить здание, но если мы хотим получить что-то более изящное, чем кондовую "хрущобу", то кирпичи не годятся. Весь "лес" из if-ов, foreach-ей, switch-ей и прочего возникает даже не потому, что ООП не предлагает нам других средств, но мы просто понимаем одним место, что если раскрутить весь наш великий полиморфизм, то мы получим не что иное как большое жилое здание, сделанное из конструктора Лего. Кирпичи они всегда кирпичи, независимо от размера.
Реплика в зал: не, ну что за мода пошла — понапридумывать аналогий, и потом считать, что это выглядит хоть в малейшей степени убедительным обоснованием собственной точки зрения?
AVK>Реплика в зал: не, ну что за мода пошла — понапридумывать аналогий, и потом считать, что это выглядит хоть в малейшей степени убедительным обоснованием собственной точки зрения?
А что, на использование аналогий тоже нужны какие-то особые полномочия или мне тоже можно? К тому же как раз основную часть своей позиции я объяснил без всяких аналогий. Если есть что сказать по существу — буду рад подискутировать.
ВВ>Ну по-моему реально странно все это. Мы, к примеру, создаем коллекции, скажем так, "векторного" типа, которые предполагают, что для осуществления групповых операций придется пользоваться банальным перебором — а потом начинаем придумывать наиболее "красивые" формы этого перебора.
Вот в этом месте не понял. Недавно набрел на linq-проект, который прозрачным образом использует индексы на In-memory коллекциях. Вот он, небанальный перебор за счет декларативности программирования. Может, другой пример подберем?
S>Вот в этом месте не понял. Недавно набрел на linq-проект, который прозрачным образом использует индексы на In-memory коллекциях. Вот он, небанальный перебор за счет декларативности программирования. Может, другой пример подберем?
Зачем другой пример? Ты, наверное, меня не до конца понял — я не отрицаю, что можно сделать по-другому. Причем для этого не нужен ни LINQ, ни прочие навороты последних ревизий си-шарпа. Собственно, первое что приходит в голову:
Уже модель работы с коллекцией изменяется — не будем рассматривать, в какую сторону
Речь-то не о том, как можно сделать, а как обычно делается. Ведь неужели корень зла в том, что в методах пару if-ов используется, и программа партии состоит в том, чтобы заменить эти if-ы на синтаксически что-нибудь другое? Проблема в том, что логика приложений фактически целиком строится на старых приемах и конструкциях, которым уже лет сто в обед. А почему так происходит?
Трактовка 1. "Внешняя" сторона, за которую отвечает ООП, все эти графы, полиморфизмы и прочая вроде как прогрессировала со времен царя гороха, а "внутреняя" нет. Так да здравствует же язык, который предоставляет средства, позволяющие, так сказать, поднять технологический уровень того, что в методах происходит.
Трактовка 2. Да, конечно, императивные конструкции стары. Но все старо в этом мире. Да и сам ООП в общем-то не молодчик. Проблема не в том, что мы в принципе используем эти конструкции, а в том что мы ими злоупотребляем. А почему злоупотребляем? Что мы делаем в этих методах? Пишем хитрые полностью изолированные от всего мира алгоритмы? Фига два. Мы используем "все эти графы, полиморфизмы и прочая". Никаких подозрений не возникает? Так где же у нас root of evil в таком случае?
Собственно, твой пример даже косвенно подтверждает то, о чем я писал.
ЗЫ. Аналогии по просьбе трудящихся не использовал.
[]
со всем более-менее согласен кроме
IT>Немерле – это удачная попытка совмещения традиционного программирования и FP. Практически все, что наработано в FP поддерживается в Немерле и уже сейчас готово к использованию. Можно отложить в сторону каменный топор (if/else) и взять в руки охринительной мощности базуку (match). Кривизну out/ref параметров можно заменить на tuples, а зоопарк из приватных методов на удобные локальные функции. Много чего. И главное больше нет необходимости компенсировать скудность тактических средств стратегией.
локальная функция, если она не захватывает контекст, ничем не лучше private static, а может быть и хуже, тк захламляет код оснофной функции. Если же захватывает, то надо быть очень осторожным. Тут по работе пришлось насмотреться на локальные функции в delphi.net — ппц.
[]
КЛ>со всем более-менее согласен кроме
IT>>…а зоопарк из приватных методов на удобные локальные функции.…
КЛ>локальная функция, если она не захватывает контекст, ничем не лучше private static, а может быть и хуже, тк захламляет код оснофной функции. Если же захватывает, то надо быть очень осторожным. Тут по работе пришлось насмотреться на локальные функции в delphi.net — ппц.
Ага, уж лучше замусорить тело класса пачкой функций-хелперов, чем тело одной единственной функции
_FR>Здравствуйте, Константин Л., Вы писали:
КЛ>>со всем более-менее согласен кроме
IT>>>…а зоопарк из приватных методов на удобные локальные функции.…
КЛ>>локальная функция, если она не захватывает контекст, ничем не лучше private static, а может быть и хуже, тк захламляет код оснофной функции. Если же захватывает, то надо быть очень осторожным. Тут по работе пришлось насмотреться на локальные функции в delphi.net — ппц.
_FR>Ага, уж лучше замусорить тело класса пачкой функций-хелперов, чем тело одной единственной функции
Это сарказм? Если удается сделать правильную пачку хэлперов, то это повышает читабельность основного метода, плюс от к захвату контекста все-же лучше прибегать с осторожностью.
КЛ>>>локальная функция, если она не захватывает контекст, ничем не лучше private static, а может быть и хуже, тк захламляет код оснофной функции. Если же захватывает, то надо быть очень осторожным. Тут по работе пришлось насмотреться на локальные функции в delphi.net — ппц.
_FR>>Ага, уж лучше замусорить тело класса пачкой функций-хелперов, чем тело одной единственной функции
КЛ>Это сарказм? Если удается сделать правильную пачку хэлперов, то это повышает читабельность основного метода,
То есть можно жертвовать надёжностью, модульностью, локализацией ради "читабельности"? Это при том, что мнение "чем локальнее объявление, тем лучше" можно считать верным (или нет?), а "читабельность" — величина субъективная?
КЛ>плюс от к захвату контекста все-же лучше прибегать с осторожностью.
Вынося метод "наружу" ты позваляешь кому-то (а как ты запрещаешь? ага, никак!) к нему обратиться, тем самым увеличивая связаность. К лишней связаности надо относиться с ещё большим подозрением чем "к захвату контекста". Кстати, из за чего требуется осторожность? И, между прочим, мы же говорим о методах, не захватывающих контекст.
_FR>Здравствуйте, Константин Л., Вы писали:
КЛ>>>>локальная функция, если она не захватывает контекст, ничем не лучше private static, а может быть и хуже, тк захламляет код оснофной функции. Если же захватывает, то надо быть очень осторожным. Тут по работе пришлось насмотреться на локальные функции в delphi.net — ппц.
_FR>>>Ага, уж лучше замусорить тело класса пачкой функций-хелперов, чем тело одной единственной функции
КЛ>>Это сарказм? Если удается сделать правильную пачку хэлперов, то это повышает читабельность основного метода,
_FR>То есть можно жертвовать надёжностью, модульностью, локализацией ради "читабельности"? Это при том, что мнение "чем локальнее объявление, тем лучше" можно считать верным (или нет?), а "читабельность" — величина субъективная?
где ты увидел что я ими жертвую? private static. ни стейта, ни открытости.
КЛ>>плюс от к захвату контекста все-же лучше прибегать с осторожностью.
_FR>Вынося метод "наружу" ты позваляешь кому-то (а как ты запрещаешь? ага, никак!) к нему обратиться, тем самым увеличивая связаность. К лишней связаности надо относиться с ещё большим подозрением чем "к захвату контекста". Кстати, из за чего требуется осторожность? И, между прочим, мы же говорим о методах, не захватывающих контекст.
связанность и там и там. только в одном случае по параметрам, в другом по локальным переменным. Наружу это куда? Я же написал — private.
_FR>>То есть можно жертвовать надёжностью, модульностью, локализацией ради "читабельности"? Это при том, что мнение "чем локальнее объявление, тем лучше" можно считать верным (или нет?), а "читабельность" — величина субъективная?
КЛ>где ты увидел что я ими жертвую? private static. ни стейта, ни открытости.
Ну представь себе такой не очень маленький класс. Кому-то понадобилось дописать в него некий метод, в котором понадобился какой-то хелпер. Он смотрит: ага! кто-то добрый уже такой написал! и берёт его. Вот связанность и получилась. Когда же хелпер объявлен локально, "случайно", поошибке, "не правильно" заиспользовать его невозможно, нужно явно постараться.
КЛ>>>плюс от к захвату контекста все-же лучше прибегать с осторожностью.
_FR>>Вынося метод "наружу" ты позваляешь кому-то (а как ты запрещаешь? ага, никак!) к нему обратиться, тем самым увеличивая связаность. К лишней связаности надо относиться с ещё большим подозрением чем "к захвату контекста". Кстати, из за чего требуется осторожность? И, между прочим, мы же говорим о методах, не захватывающих контекст.
КЛ>связанность и там и там. только в одном случае по параметрам, в другом по локальным переменным. Наружу это куда? Я же написал — private.
Связанность с параметрами — нормальное дело. Это всё равно что утверждать, что класс связан со своими членами: конечно связан, только это "положительная связь", в том смысле, что не причиняет вреда и которую легко порвать.
_FR>Здравствуйте, Константин Л., Вы писали:
_FR>>>То есть можно жертвовать надёжностью, модульностью, локализацией ради "читабельности"? Это при том, что мнение "чем локальнее объявление, тем лучше" можно считать верным (или нет?), а "читабельность" — величина субъективная?
КЛ>>где ты увидел что я ими жертвую? private static. ни стейта, ни открытости.
_FR>Ну представь себе такой не очень маленький класс. Кому-то понадобилось дописать в него некий метод, в котором понадобился какой-то хелпер. Он смотрит: ага! кто-то добрый уже такой написал! и берёт его. Вот связанность и получилась. Когда же хелпер объявлен локально, "случайно", поошибке, "не правильно" заиспользовать его невозможно, нужно явно постараться.
Прости, но если это хелпер, который удовлетворяет его потребности, то это значит, что мы написали реюзабельный код, и его уже можно попробовать вынести наружу в common/utils. Чем лучше в данном случае подход "локальная функция на каждый чих"?
КЛ>>>>плюс от к захвату контекста все-же лучше прибегать с осторожностью.
_FR>>>Вынося метод "наружу" ты позваляешь кому-то (а как ты запрещаешь? ага, никак!) к нему обратиться, тем самым увеличивая связаность. К лишней связаности надо относиться с ещё большим подозрением чем "к захвату контекста". Кстати, из за чего требуется осторожность? И, между прочим, мы же говорим о методах, не захватывающих контекст.
КЛ>>связанность и там и там. только в одном случае по параметрам, в другом по локальным переменным. Наружу это куда? Я же написал — private.
_FR>Связанность с параметрами — нормальное дело. Это всё равно что утверждать, что класс связан со своими членами: конечно связан, только это "положительная связь", в том смысле, что не причиняет вреда и которую легко порвать.
Тогда еще раз повторюсь.
Кто тут из нас за связанность по параметрам?
КЛ>Это сарказм? Если удается сделать правильную пачку хэлперов, то это повышает читабельность основного метода,
Дык, так оно и есть. Только если эти хэлперы локальны специфичны для конкретного метода, то лучше калькулироваться их в этом самом методе, а уж если они универсальны, то мм самое место в отдельном классе/модуле.
КЛ>плюс от к захвату контекста все-же лучше прибегать с осторожностью.
Это предрассудок. Другое дело, что нужны некоторые инструменты позволяющие упростить рефаторинг локальных функций. Так разумно было бы иметь фичу (в IDE) позволяющую выявить все захваченные переменные, фичу позволяющую переносить захваченные переменные в параметры, и фичу позволяющую вынести локальную функцию в отдельный метод.
IT>Я сразу начну писать код прямо в методе Main и только когда почувствую дискомфорт, озабочусь иерархией классов.
Слушай, Игорь, но почему именно "озабочусь иерархией классов"? Что, без наследования в современном мире не прожить? Лично я считаю парадигму наследования самым противоестественным самодурством какого-то одного горе-теоретика, типа авторитета, которому удалось запудрить мозги всем и надолго. Я это уже говорил что инкапсуляция и полиморфизм — 256 раз да! Наследованию — отказать. Парадигма наследования в программировании компьютеров — это пожалуй второй по величине фуфлоид.
IT>Делать это сразу я не стану, т.к. считаю это бесполезной тратой времени, потому что не знаю, что меня ждёт впереди.
Согласен! Лично для меня первична алгортмическая сущность — на уровне получится или нет и что можно выжать из этого именно на алгортмическом уровне. Это для меня — самая сложная и самая интересная часть задачи. А уж обернуть в классы и иерархии, плюс кодовая оптимизация — это рутина, этим пусть мальчики-архитекторы и мальчики-кодеры занимаются. Я всегда готов их проконсультировать и объяснить сущность алгоритма.
MS>Слушай, Игорь, но почему именно "озабочусь иерархией классов"? Что, без наследования в современном мире не прожить?
Прожить-то можно даже без рекурсии и динамической памяти, вопрос удобно ли.
Не поделишься удобным способом делать похожие по поведению (но слегка отличающиеся) сущности в императивных и функциональных языках?
Например, у меня есть несколько алгоритмов компенсации движения, отличающиеся лишь способом поиска похожего блока. Наследование позволило обойтись без дублирования кода, лишних if'ов и указателей на функции (которые, по сути, изоморфны VMT).
MS>Парадигма наследования в программировании компьютеров — это пожалуй второй по величине фуфлоид.
А первый какой?
DM>Например, у меня есть несколько алгоритмов компенсации движения, отличающиеся лишь способом поиска похожего блока. Наследование позволило обойтись без дублирования кода, лишних if'ов и указателей на функции (которые, по сути, изоморфны VMT).
Если я правильно тебя понял, то нужно было написать один generic алгоритм компенсации движения, и в него при создании конкретного экземпяра передавать функцию поиска похожего блока.
Насколько я понял, проблему ты решаешь таким ООПшным способом:
Теперь попробуем ее решить в стиле ФП:
Правда чем то STL напоминает?
Я думаю плюсы минусы обоих подходов проанализировать не сложно самому.
Y>Правда чем то STL напоминает?
Y>Я думаю плюсы минусы обоих подходов проанализировать не сложно самому.
Только при сравнеии не стоит забывать что в языках с хорошей подержкой FP код будет гораздо короче и удобнее.
Y>Здравствуйте, D. Mon, Вы писали:
DM>>Например, у меня есть несколько алгоритмов компенсации движения, отличающиеся лишь способом поиска похожего блока. Наследование позволило обойтись без дублирования кода, лишних if'ов и указателей на функции (которые, по сути, изоморфны VMT).
Y>Если я правильно тебя понял, то нужно было написать один generic алгоритм компенсации движения, и в него при создании конкретного экземпяра передавать функцию поиска похожего блока.
А на практике окажется, что из ~100 методов отличаются у потомков 20, и этого достаточно, чтобы действие "передать функцию поиска похожего блока" вылилось в извращение типа "передать структуру функций, специфичных именно для этой реализации". И всё это с костылями вроде приведения типов.
Нет, конечно, использовать такое порой можно и нужно. Но в общую практику я бы рекомендовал наследование. Конечно, у него есть свои проблемы (вспомним множественное наследование и его эффекты). Но это проблема любого подобного механизма — можно загнать в ситуацию, когда перестанет работать.
N>А на практике окажется, что из ~100 методов отличаются у потомков 20, и этого достаточно, чтобы действие "передать функцию поиска похожего блока" вылилось в извращение типа "передать структуру функций, специфичных именно для этой реализации". И всё это с костылями вроде приведения типов.
Если на практике ~100 методов, то эту практику нужно прекращать немедленно
А костыли эти появляются из-за того, что языки не поддерживают higher-order functions & functions as first class objects. Вы кажется про С++, да, он этого не поддерживает, придется обходиться функторами, а это действительно костыли. А в C# 3 уже есть некоторая поддержка ФП и этих костылей не будет, не говоря уже о более развитых языках.
N>Нет, конечно, использовать такое порой можно и нужно. Но в общую практику я бы рекомендовал наследование. Конечно, у него есть свои проблемы (вспомним множественное наследование и его эффекты). Но это проблема любого подобного механизма — можно загнать в ситуацию, когда перестанет работать.
Наследование реализации сама по себе одна большая проблема.
Y>Здравствуйте, netch80, Вы писали:
N>>А на практике окажется, что из ~100 методов отличаются у потомков 20, и этого достаточно, чтобы действие "передать функцию поиска похожего блока" вылилось в извращение типа "передать структуру функций, специфичных именно для этой реализации". И всё это с костылями вроде приведения типов.
Y>Если на практике ~100 методов, то эту практику нужно прекращать немедленно
А давайте Вы немедленно прекратите практику рассказывать подобные вещи тому, кто последние 4 года плотно писал на Питоне и разнообразными лямбдами, встроенными def'ами и list comprehensions пользуется куда лучше, чем STL'ем и прочими крестатостями.
Я пользуюсь разными средствами. И first class functions. И duck typing. И наследованием. Всему своё место, и у наследования — своё, заметное и положительное.
Y>А костыли эти появляются из-за того, что языки не поддерживают higher-order functions & functions as first class objects. Вы кажется про С++, да, он этого не поддерживает, придется обходиться функторами, а это действительно костыли. А в C# 3 уже есть некоторая поддержка ФП и этих костылей не будет, не говоря уже о более развитых языках.
Ну вот Вы только-только будете его осваивать, а для меня это как воздух. Так что рекомендую поверить мне, а не своему источнику, который может только ругать.
N>>Нет, конечно, использовать такое порой можно и нужно. Но в общую практику я бы рекомендовал наследование. Конечно, у него есть свои проблемы (вспомним множественное наследование и его эффекты). Но это проблема любого подобного механизма — можно загнать в ситуацию, когда перестанет работать.
Y>Наследование реализации сама по себе одна большая проблема.
Нет, не проблема. Если не относиться к ней как к панацее.
N>Я пользуюсь разными средствами. И first class functions. И duck typing. И наследованием. Всему своё место, и у наследования — своё, заметное и положительное.
Ну может расскажете где место наследованию?
Y>>А костыли эти появляются из-за того, что языки не поддерживают higher-order functions & functions as first class objects. Вы кажется про С++, да, он этого не поддерживает, придется обходиться функторами, а это действительно костыли. А в C# 3 уже есть некоторая поддержка ФП и этих костылей не будет, не говоря уже о более развитых языках.
N>Ну вот Вы только-только будете его осваивать, а для меня это как воздух. Так что рекомендую поверить мне, а не своему источнику, который может только ругать.
Верить я тебе на слово не буду, извини. Я незнаю как там в вашем Питоне, может там и действительно хреново получается делать функциональную декомпозицию, а вот по крайней мере в Хаскеле (и Лиспе тоже) это делается очень естесственно.
N>>А на практике окажется, что из ~100 методов отличаются у потомков 20, и этого достаточно, чтобы действие "передать функцию поиска похожего блока" вылилось в извращение типа "передать структуру функций, специфичных именно для этой реализации". И всё это с костылями вроде приведения типов.
Y>Если на практике ~100 методов, то эту практику нужно прекращать немедленно
Y>А костыли эти появляются из-за того, что языки не поддерживают higher-order functions & functions as first class objects.
А вот тут подробнее, пожалуйста. Как упомянутые фишки изменят дело, кроме более удобного синтаксиса?
Вот задачка: есть семейство алгоритмов (та же компенсация, допустим), которые теперь отличаются не одной функцией, а пятью (при этом имеют по 10 общих). В случае ООП и наследования все просто — общие функции в базовый класс, различные — в наследников.
А что в этом случае делают в Хаскеле и Лиспе?
Не передают же при каждом вызове "вагон колбеков", как тут его назвали.
Первое, приходящее мне на ум решение, — функция-конструктор, которая получает на вход охапку тех функций, что отличают конкретный алгоритм, и выдает в качестве результата одну функцию, его реализующую. Последняя уже вызывается когда надо. Т.е. все детали специализации пошли в замыкание, и по сути, мы получили некий аналог объекта из ООП, но с меньшим числом степеней свободы.
DM>А вот тут подробнее, пожалуйста. Как упомянутые фишки изменят дело, кроме более удобного синтаксиса?
DM>Вот задачка: есть семейство алгоритмов (та же компенсация, допустим), которые теперь отличаются не одной функцией, а пятью (при этом имеют по 10 общих). В случае ООП и наследования все просто — общие функции в базовый класс, различные — в наследников.
А у тебя тут не ожидается комбинаторного взрыва наследников?
DM>А что в этом случае делают в Хаскеле и Лиспе?
DM>Не передают же при каждом вызове "вагон колбеков", как тут его назвали.
Нет конечно, они обычно осмысленно комбинируется в промежуточные сущности.
DM>Первое, приходящее мне на ум решение, — функция-конструктор, которая получает на вход охапку тех функций, что отличают конкретный алгоритм, и выдает в качестве результата одну функцию, его реализующую. Последняя уже вызывается когда надо. Т.е. все детали специализации пошли в замыкание, и по сути, мы получили некий аналог объекта из ООП, но с меньшим числом степеней свободы.
В общем да так и будет, только наоборот на объектах и будет корявое подобие с ограниченым числом степеней свободы
DM>А вот тут подробнее, пожалуйста. Как упомянутые фишки изменят дело, кроме более удобного синтаксиса?
DM>Вот задачка: есть семейство алгоритмов (та же компенсация, допустим), которые теперь отличаются не одной функцией, а пятью (при этом имеют по 10 общих). В случае ООП и наследования все просто — общие функции в базовый класс, различные — в наследников.
Вот эти "если" — это все выдумки. На практике если для алгоритма требуется передавать более трех функций, то что-то не так в самой функции. Когда код исходно пишется в функциональном стиле, то функция пишется не как монолит с "настройками", а собирается из других более общих функций. При этом происходит нечто вроде IoC (разворот управления). Вместо того чтобы создавать функцию-монстра и потом передавать ей тонну детализирующих функций, нужная функция собирается из кусков. Примером тут может служить LINQ. В нем нет одной супер-функции типа Query, а есть несколько функций: Where, OrderBy, ThenBy, Join, Group, Select и т.п. Каждая из них принимает одну-две лямбды и возвращает некий обект-контекст к которому можно применять другие функции из приведённого списка.
Ну, и если, что то гибридный язык позволяет использовать для обледенения набора функций и интерфейсы с реализациями. На программу (если ее пишут не долболомы) таки случаев должно быть не много, за то случаев где требуется передать одну-две функции море. Это сэкономит массу времени сил и избавит код от не нужных типов (баласта).
DM>А что в этом случае делают в Хаскеле и Лиспе?
Ты бы попробовал на них по программировать, а потом бы уже вопросы задавал. А то тебе ведь ничего объяснить нельзя просто по определнию. Ты думаешь другими категориями.
DM>Первое, приходящее мне на ум решение, — функция-конструктор, которая получает на вход охапку тех функций, что отличают конкретный алгоритм, и выдает в качестве результата одну функцию, его реализующую. Последняя уже вызывается когда надо. Т.е. все детали специализации пошли в замыкание, и по сути, мы получили некий аналог объекта из ООП, но с меньшим числом степеней свободы.
Есть разные пути. В конце концов не трудно функции поместить в кортеж. Но на самом деле сама постановка задачи — это выдумка.
DM>Например, у меня есть несколько алгоритмов компенсации движения, отличающиеся лишь способом поиска похожего блока. Наследование позволило обойтись без дублирования кода, лишних if'ов и указателей на функции (которые, по сути, изоморфны VMT).
Ну я уже говорил где-то. Это классический пример полиморфного поведения — перегрузка виртуальных функций. Это нормально, но это не наследование, это, дети, называется специализация. Что не нормально, так это расширение функциональности. А особенным идиотизмом является наследование от классов типа std::string или std::vector.
MS>>Парадигма наследования в программировании компьютеров — это пожалуй второй по величине фуфлоид.
DM>А первый какой?
Первенство по идиотизму до сих пор устойчиво держит фуфлоид под названием Венгерская Нотация.
MS>Ну я уже говорил где-то. Это классический пример полиморфного поведения — перегрузка виртуальных функций. Это нормально, но это не наследование, это, дети, называется специализация. Что не нормально, так это расширение функциональности.
Так это не в наследовании проблема, а в его использовании. Если нарушать LSP, естественно добра от этого не жди. Классическая ситуация, описываемая присказкой про альтернативно одаренного человека и детородный орган из стекла.
Вообще, тут все намешали в одну кучу — наследование интерфейсов, наследование реализаций и LSP. В результате — каждый говорит о своем.
MS>Первенство по идиотизму до сих пор устойчиво держит фуфлоид под названием Венгерская Нотация.
Не отрывай труп, пусть покоится с миром.
DM>Например, у меня есть несколько алгоритмов компенсации движения, отличающиеся лишь способом поиска похожего блока. Наследование позволило обойтись без дублирования кода, лишних if'ов и указателей на функции (которые, по сути, изоморфны VMT).
Это я тебе легко подскажу. Делается это так:
OOP здесь только лишним будет.
VD>Это я тебе легко подскажу. Делается это так:
http://rsdn.ru/Forum/Default.aspx?mid=3151859&flat=0
MS>Здравствуйте, IT, Вы писали:
IT>>Я сразу начну писать код прямо в методе Main и только когда почувствую дискомфорт, озабочусь иерархией классов.
MS>Слушай, Игорь, но почему именно "озабочусь иерархией классов"? Что, без наследования в современном мире не прожить? Лично я считаю парадигму наследования самым противоестественным самодурством какого-то одного горе-теоретика, типа авторитета, которому удалось запудрить мозги всем и надолго. Я это уже говорил что инкапсуляция и полиморфизм — 256 раз да! Наследованию — отказать. Парадигма наследования в программировании компьютеров — это пожалуй второй по величине фуфлоид.
IT>>Делать это сразу я не стану, т.к. считаю это бесполезной тратой времени, потому что не знаю, что меня ждёт впереди.
MS>Согласен! Лично для меня первична алгортмическая сущность — на уровне получится или нет и что можно выжать из этого именно на алгортмическом уровне. Это для меня — самая сложная и самая интересная часть задачи. А уж обернуть в классы и иерархии, плюс кодовая оптимизация — это рутина, этим пусть мальчики-архитекторы и мальчики-кодеры занимаются. Я всегда готов их проконсультировать и объяснить сущность алгоритма.
самый большой проект, в котором ты когда-либо участвовал?
КЛ>самый большой проект, в котором ты когда-либо участвовал?
Я не участвую в так называемых "больших проектах", мне это не интересно.
MS>Здравствуйте, Константин Л., Вы писали:
КЛ>>самый большой проект, в котором ты когда-либо участвовал?
MS>Я не участвую в так называемых "больших проектах", мне это не интересно.
может быть после того, как поучаствуешь, будешь говорить про мальчиков-архитекторов?
КЛ>может быть после того, как поучаствуешь, будешь говорить про мальчиков-архитекторов?
У тебя есть разум, надо только научиться им пользоваться. Почему все приходится разжевывать? Понимаешь, нет в этом моем высказывании ничего уничижительного. Я просто хотел сказать, что бывают разные задачи по самой сути. Для меня — это придумать алгоритм и отдать его "мальчикам-архитекторам" и прочим. И меня не интересует размер проекта, это их забота (про разделение труда слышал?) Поэтому, можно сказать, что я и не участвую в этом проекте. При этом архитекторы могут считать меня неким мальчиком-алгоритмистом и в этом тоже нет ничего уничижительного.
Бывали и казусы. Однажды архитекторы так запроектировали некий модуль обработки данных, что он требовал квадратичного времени выполнения как ты ни кодируй (а надо и можно было обойтись линейным.) В результате, по самым оптимистичным прогнозам, данная архитектура на реальных объемах данных требовала бы не меньше 500 лет для обработки. Зато все было очень красиво.
MS>Здравствуйте, Константин Л., Вы писали:
КЛ>>может быть после того, как поучаствуешь, будешь говорить про мальчиков-архитекторов?
[]
от твоей манеры общения пропадает все желание тебе отвечать
MS>Здравствуйте, Константин Л., Вы писали:
КЛ>>может быть после того, как поучаствуешь, будешь говорить про мальчиков-архитекторов?
MS>У тебя есть разум, надо только научиться им пользоваться. Почему все приходится разжевывать? Понимаешь, нет в этом моем высказывании ничего уничижительного. Я просто хотел сказать, что бывают разные задачи по самой сути. Для меня — это придумать алгоритм и отдать его "мальчикам-архитекторам" и прочим. И меня не интересует размер проекта, это их забота (про разделение труда слышал?) Поэтому, можно сказать, что я и не участвую в этом проекте. При этом архитекторы могут считать меня неким мальчиком-алгоритмистом и в этом тоже нет ничего уничижительного.
Ну что за тон, право?
Понимаешь, обычно уменьшительно-ласкательные приставки это способ выразить насмешку, презрение. Мне вот было интересно, на каком основании ты всех архитекторов того, под общую гребенку, м? Я тебя спросил, я ты мне тут же "не участвовал, стремно; используй моск, приходится разжевывать". Твой тон очень резок и категоричен. Как ты хочешь, чтобы потом тебя нормально понимали?
MS>Бывали и казусы. Однажды архитекторы так запроектировали некий модуль обработки данных, что он требовал квадратичного времени выполнения как ты ни кодируй (а надо и можно было обойтись линейным.) В результате, по самым оптимистичным прогнозам, данная архитектура на реальных объемах данных требовала бы не меньше 500 лет для обработки. Зато все было очень красиво.
Как твоё "используй моск, я никого не хотел обидеть, бывали казусы" сочетается с вот этим высказыванием?
1. Обосрал процесс создания архитектуры
2. Обосрал пару профессий вместе с ихними представителями
КЛ>Ну что за тон, право?
КЛ>Понимаешь, обычно уменьшительно-ласкательные приставки это способ выразить насмешку, презрение.
ИМХО, вполне естественная, хоть и некорректная, реакция на попытку пенисометрии.
КЛ>1. Обосрал процесс создания архитектуры
КЛ>2. Обосрал пару профессий вместе с ихними представителями
Это у него такая манера беседовать. Не только у него, кстати. Остается только либо забанить его навечно, либо терпеть, пока он совсем не выйдет за рамки.
КЛ>Я тебя спросил, я ты мне тут же "не участвовал, стремно; используй моск, приходится разжевывать".
Не надо выдавать свои домыслы за мои высказывания. Где я говорил, что не участвовал, и где я говорил, что стремно?
Видишь, действительно приходится разжевывать. И все равно толку нету.
КЛ>самый большой проект, в котором ты когда-либо участвовал?
WPF для тебя большой проект, а WinForms? Так вот, если бы там не было наследования реализации, то жизнь у прикладников была бы немного веселей.
IT>Здравствуйте, Константин Л., Вы писали:
КЛ>>самый большой проект, в котором ты когда-либо участвовал?
IT>WPF для тебя большой проект, а WinForms? Так вот, если бы там не было наследования реализации, то жизнь у прикладников была бы немного веселей.
Ну для начала McSeem2 надо было уточнить какое наследование он имеет ввиду. Да и потом, наследование реализации не самое последнее зло.
[]
MS>Слушай, Игорь, но почему именно "озабочусь иерархией классов"? Что, без наследования в современном мире не прожить? Лично я считаю парадигму наследования самым противоестественным самодурством какого-то одного горе-теоретика, типа авторитета, которому удалось запудрить мозги всем и надолго.
Проблемы обычно встречаются при наследовании реализации. А какие проблемы у наследования интерфейса? К тому же иерархия объектов — это не обязательно наследование.
Согласен со всем сказанным по сути, но хочу заметить, что ты немного занижаешь заслуги ФП за пределами реализации методов.
Кроме отличного набора паттернов кодирования методов у ФП еще есть один два конька:
1. Неизменяемые структуры данных.
2. Аглебраические типы данных (variant в Nemerle).
Некоторые части приложения очень выигрывают если их писать на основе неизменяемых структур. При этом у нас получаются как бы слепки состояний и отладка (а значит и сопровождение) кода резко упрощается.
Алгебраические типы данных позволяют решать многие задачи вроде анализа или логического вывода на намного более высоком уровне абстракции (за счет того же паттерн-матчинга). Без них паттерн-матчинг был бы детской игрушкой.
Так что хочется сказать, что эти две фичи позволяют улучшить наш инструментарий и на уровне дизайна приложения (на уровне классов, если так проще).
ЗЫ
Ну, и про МП забывать тоже нельзя. Это действительно мощьнейшее оружее. Им проникся даже Хейльсберг...
VD>1. Неизменяемые структуры данных.
VD>2. Аглебраические типы данных (variant в Nemerle).
Я это не упомянул, т.к. это всё опять же работает на уровне кода. На компоновку кода и архитектуру приложения это никак не влияет.
VD>>1. Неизменяемые структуры данных.
VD>>2. Аглебраические типы данных (variant в Nemerle).
IT>Я это не упомянул, т.к. это всё опять же работает на уровне кода. На компоновку кода и архитектуру приложения это никак не влияет.
Достаточно сравнить архитектуру компилятора написанного на ООЯ и на том же Немерле. Сразу видно, что два этих пункта сильно влияют на архитектуру. Так что тут я с тобой не соглашусь.
VD>Достаточно сравнить архитектуру компилятора написанного на ООЯ и на том же Немерле. Сразу видно, что два этих пункта сильно влияют на архитектуру. Так что тут я с тобой не соглашусь.
В общем, я бы поправил твое высказывание следующим образом:
ФП с человеческим лицом офигительно улучшает и упрощает реализацию алгоритмов за счет встраивания в язык мощных фич вроде поддержки ФВП, паттерн-матчинга, возможности возвращать значение почти из любой конструкции языка, вывода типов и т.п., а так же позволяет, в некоторых случаях, существенно упростить проектирование отдельных частей приложения заменив классы алгебраическими типами данных и неизменяемыми структурами данных.
В таком описании соглашусь полностью.
Собственно проблема только в том, что тех кто придерживаются такого мнения окружают с двух сторон. С одной стороны те кто не хочет или не может (в силу своих особенностей) воспринять ФП, а с другой те кто кроме ФП ничего больше не видят и не приемлют.
IT>За 30 лет развития традиционных языков программирования (Fortran, PL/1, COBOL, Pascal, C/C++, Java, C#) принципиально изменился только мир вокруг метода. Мы получили наследование, инкапсуляцию и полиморфизм, компонентность и контрактность, шаблоны/дженерики и атрибуты, массу паттернов проектирования, подходов и отходов, методологий и прочих вещей, призванных организовать код в нечто более менее управляемое.
Ничего мы не получили. Все вышесказанное относится к организации кода и только. А сам код каким был, таким и остался. И если не согласен — напиши, пожалуйста, какой-либо более или менее серьезный алгоритм иным способом. Ну, к примеру, ту же сортировку, хоть быструю, хоть пузырьковую. Сам напиши, а не метод вызови.. Тут как-то сразу забываешь про инкапсуляцию с полиморфизмом и про все паттерны, потому что надо код писать, а не организовать. Алгоритм реализовать то есть.
А вот роль организации кода резко повысилась по сравнению с фортрановскими временами, да. Но это не столько с новыми приемами связано, сколько с характером задач. В значительной степени нынешний код — код без алгоритма . Это не реализация какого-то алгоритма, заложенного в задачу, а набор обработчиков разных событий. Программу для обработки битовых карт не превратишь в программу для обработки текста, алгоритмы тут совсем разные. А программа типа — ввести данные с формы — записать в БД практически индифферентна к тому, что вводить с формы и что писать в БД. Отсюда и все эти паттерны, фреймворки, библиотеки и т.д.
IT>Что же изменилось внутри метода? Да почти ничего. Как и 30 лет назад мы имеем if/else/switch, несколько циклов, команды выхода из цикла и метода, операции, присваивание и ещё немного по мелочёвке.
А не возникала ли у тебя мысль — а может, ничего и не надо ? Базовые конструкции потому и называются базовыми, что они , во-первых, не упрощаются, а во-вторых, их набор минимален и не всякое туда пустят, просто для того, чтобы не нарушать стройность и логику — иными словами, по принципу бритвы Оккама. Это как аксиомы Евклида — за 2000 лет никаких новых аксиом туда не добавили и не добавят . И три классические формы — следование, выбор, повторение — так и остались, и четвертому Риму похоже, не бывать
IT>>За 30 лет развития традиционных языков программирования (Fortran, PL/1, COBOL, Pascal, C/C++, Java, C#) принципиально изменился только мир вокруг метода. Мы получили наследование, инкапсуляцию и полиморфизм, компонентность и контрактность, шаблоны/дженерики и атрибуты, массу паттернов проектирования, подходов и отходов, методологий и прочих вещей, призванных организовать код в нечто более менее управляемое.
PD>Ничего мы не получили. Все вышесказанное относится к организации кода и только. А сам код каким был, таким и остался. И если не согласен — напиши, пожалуйста, какой-либо более или менее серьезный алгоритм иным способом. Ну, к примеру, ту же сортировку, хоть быструю, хоть пузырьковую. Сам напиши, а не метод вызови.. Тут как-то сразу забываешь про инкапсуляцию с полиморфизмом и про все паттерны, потому что надо код писать, а не организовать. Алгоритм реализовать то есть.
PD>А вот роль организации кода резко повысилась по сравнению с фортрановскими временами, да.
Знаешь что ты только что сказал? Примерно следующее:
(я) — я думаю, что 2 * 2 = 4
(ты) — нифига ты, мужик, не понимаешь. 2 * 2 — ЭТО ЧЕТЫРЕ!!!!! Запомни, будешь знать!
IT>>Что же изменилось внутри метода? Да почти ничего. Как и 30 лет назад мы имеем if/else/switch, несколько циклов, команды выхода из цикла и метода, операции, присваивание и ещё немного по мелочёвке.
PD>А не возникала ли у тебя мысль — а может, ничего и не надо ? Базовые конструкции потому и называются базовыми, что они , во-первых, не упрощаются, а во-вторых, их набор минимален и не всякое туда пустят, просто для того, чтобы не нарушать стройность и логику — иными словами, по принципу бритвы Оккама. Это как аксиомы Евклида — за 2000 лет никаких новых аксиом туда не добавили и не добавят . И три классические формы — следование, выбор, повторение — так и остались, и четвертому Риму похоже, не бывать
Даже не хочется на это отвечать. Знаешь, если всё же открыть дверь, то мир может оказаться совсем не таким, каким он видится через замочную скважину.
Вот здесь два примера того, как правильные высокоуровневые конструкции могут сделать код в разы проще, понятнее и эффективнее.
1. http://www.rsdn.ru/forum/message/2102148.aspx
2. http://www.rsdn.ru/forum/message/3112438.aspx
IT>Знаешь что ты только что сказал? Примерно следующее:
IT>(я) — я думаю, что 2 * 2 = 4
IT>(ты) — нифига ты, мужик, не понимаешь. 2 * 2 — ЭТО ЧЕТЫРЕ!!!!! Запомни, будешь знать!
Что-то чересчур много экспрессии и мало смысла.
IT>Даже не хочется на это отвечать. Знаешь, если всё же открыть дверь, то мир может оказаться совсем не таким, каким он видится через замочную скважину.
Ну и не отвечал бы.
IT>Вот здесь два примера того, как правильные высокоуровневые конструкции могут сделать код в разы проще, понятнее и эффективнее.
IT>1. http://www.rsdn.ru/forum/message/2102148.aspx
IT>2. http://www.rsdn.ru/forum/message/3112438.aspx
Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую. Или, скажем, какой-нибудь графический фильтр. Или создание и управление неким сложно организованным файлом на диске. Или математический алгоритм — матричную алгебру, к примеру. Или что угодно еще, но только не использование классов, а написание методов класса с нуля, и при этом желательно ну хоть на порядок сложнее вычисления процентов Вот тогда и поговорим. А пока в качестве аргумента приводится вычисление процентов — говорить не о чем, потому как меня совсем не интересует, как сделать вычисление их в разы проще, понятнее и эффективнее.
Слишком уж разные у нас с вами задачи, господа...
PD>Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую.
http://www.haskell.org/haskellwiki/Introduction#Quicksort_in_Haskell
FR>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую.
FR>http://www.haskell.org/haskellwiki/Introduction#Quicksort_in_Haskell
и
http://www.haskell.org/haskellwiki/Introduction#Ease_of_understanding
на всякий случай
S>Здравствуйте, FR, Вы писали:
Ответ обоим.
FR>>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую.
FR>>http://www.haskell.org/haskellwiki/Introduction#Quicksort_in_Haskell
S>и
S>http://www.haskell.org/haskellwiki/Introduction#Ease_of_understanding
S>на всякий случай
У меня нет Хаскеля, проверить не могу.
Пожалуйста, приведи данные по скорости работы алгоритма на Хаскеле и на С, если они есть. Обещано же (хоть и не вами обоими) — эффективнее
"Мы обслужим вас быстро, дешево и качественно. Выберите любые два из этих трех слов"
PD>У меня нет Хаскеля, проверить не могу.
PD>Пожалуйста, приведи данные по скорости работы алгоритма на Хаскеле и на С, если они есть. Обещано же (хоть и не вами обоими) — эффективнее
Программа на хаскеле конечно эффективнее, в смысле производительности пишущего (и читающего) код программиста.
В смысле производительности работы готового она малоэффективна. Но можно оптимизировать http://en.literateprograms.org/Quicksort_(Haskell) и все равно код будет проще сишного в разы а по производительности вполне к нему приблизится.
PD>>Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую.
FR>http://www.haskell.org/haskellwiki/Introduction#Quicksort_in_Haskell
Фишка в том, что этот Quicksort совcем не quick.
FR>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую.
FR>http://www.haskell.org/haskellwiki/Introduction#Quicksort_in_Haskell
Вы уверенны что это эквивалентные программы , по скорости выполнения ? по сложности ? по потреблению памяти ?
M>Вы уверенны что это эквивалентные программы , по скорости выполнения ? по сложности ? по потреблению памяти ?
Ты дальше читал?
Полностью абстрагируясь от эффективного вычисления процентов , отмечу лишь, что сделать код с помощью каких-то высокоуровненвых конструкций проще — можно, понятнее — тоже можно, а вот эффективнее — дудки. Потому что предельно эффективная программа — это наилучшим образом оптимизированная программа, написанная на ассемблере. А в этом самом ассемблере есть только презренные присваивания, if, с грехом пополам циклы, и ни одной лямбды
IT>>>Вот здесь два примера того, как правильные высокоуровневые конструкции могут сделать код в разы проще, понятнее и эффективнее.
PD>Полностью абстрагируясь от эффективного вычисления процентов , отмечу лишь, что сделать код с помощью каких-то высокоуровненвых конструкций проще — можно, понятнее — тоже можно, а вот эффективнее — дудки. Потому что предельно эффективная программа — это наилучшим образом оптимизированная программа, написанная на ассемблере. А в этом самом ассемблере есть только презренные присваивания, if, с грехом пополам циклы, и ни одной лямбды
Если уж абстрагироваться полностью, то идеальный компилятор идеально (в плане эффективности) скомпилирует все наши лямбды и прочая в понятные процессору ифы и вайлы.
AS>Если уж абстрагироваться полностью, то идеальный компилятор идеально (в плане эффективности) скомпилирует все наши лямбды и прочая в понятные процессору ифы и вайлы.
Да. Но не более эффективно, чем собственно ассемблер. В лучшем случае (см. выделенное мной) — не хуже. А ведь обещали на порядок — вот я и смеюсь.
PD>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Если уж абстрагироваться полностью, то идеальный компилятор идеально (в плане эффективности) скомпилирует все наши лямбды и прочая в понятные процессору ифы и вайлы.
PD>Да. Но не более эффективно, чем собственно ассемблер. В лучшем случае (см. выделенное мной) — не хуже. А ведь обещали на порядок — вот я и смеюсь.
Там шёл разговор о том, что эффективнее будет твоя работа, как программиста. Вместо написания 30 ифов и 50 вайлов — пара хайлевел инструкций.
ЗЫ: следует понимать, что про 30 и 50 — утрирование.
PD>Да. Но не более эффективно, чем собственно ассемблер. В лучшем случае (см. выделенное мной) — не хуже. А ведь обещали на порядок — вот я и смеюсь.
Некторые современные компиляторы настолько хорошо оптимизируют, в том числе и в compile time что вручную на ассемблере их очень сложно обставить, особенно на нетривиальном коде.
А на порядок обещали поднять эффективность програмиста а не кода. Хотя я думаю на порядок не будет, но в разы да вполне возможно.
PD>Да. Но не более эффективно, чем собственно ассемблер. В лучшем случае (см. выделенное мной) — не хуже. А ведь обещали на порядок — вот я и смеюсь.
Неочевидно, кто будет смеяться последним. Представления вашего поколения об эффективности программ оказались плохо совместимыми с реальностью.
Помимо abstraction penalty есть еще и abstraction gain.
В реальной жизни вручную оптимизировать мало-мальски сложный алгоритм на ассемблере не получится — слишком мала емкость головы. И это даже если задаться конкретным целевым процессором и параметрами окружения.
Наточить вручную программу, которая будет эффективна на широком классе условий эксплуатации — вообще малореально. В том смысле, что всё-таки придется вводить абстракции высокого уровня. Ну, например, придется делать подменяемый алгоритм сортировки чего-нибудь, чтобы выбирать его в зависимости от количества ядер процессора.
А то и вообще придется точить свой кодогенератор, который будет инлайнить оптимальный для данного RegEx целевой код непосредственно перед вызовом.
В итоге, если потратить достаточное время и усилия, то скорее всего получится та самая управляемая среда, jit, hot-spotting, query plan evaluation, и прочие техники, с успехом применяющиеся там, где некоторые упертые программисты до сих пор думают, что ассемблер лучше.
PD>а вот эффективнее — дудки.
Тут вопрос: эффективнее чем что? Чем идеально оптимизированная программа — действительно вряд ли. А чем обычная — легко.
Чем выше уровнем конструкция, тем ближе она к смыслу операции, а не деталям реализации ("что?" вместо "как?"), и тем больше шансов, что хороший компилятор найдет более удачное решение.
DM>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>а вот эффективнее — дудки.
Уф, хоть один нормальный ответ
DM>Тут вопрос: эффективнее чем что? Чем идеально оптимизированная программа — действительно вряд ли. А чем обычная — легко.
Все зависит от того, что делаем. Если употребить неэффективный алгоритм, то, конечно, да, но язык тут ни при чем. Если неэффективно кодировать — тоже да (например, лишние ненужные действия). Если же обычная программа написана как следует (ты же не будешь утверждать, что обычняа == плохо написанная), то тут уже зависит от оптимизирующих возможносте компилятора.
DM>Чем выше уровнем конструкция, тем ближе она к смыслу операции, а не деталям реализации ("что?" вместо "как?"), и тем больше шансов, что хороший компилятор найдет более удачное решение.
Черт знает. Чем выше уровень, тем больше вероятность, что этот самый компилятор применит стандартное решение, которое как раз в этом случае лучше бы и не применять, может быть. Либо в нем должны быть зашиты эти самые "что" (это в конечном счете эквивалентно набору встроенных высокоэффективных решений). Но все "что" не встроишь, а вот оптимизировать детали можно всегда — на то они и детали, их немного.
IT>>>Вот здесь два примера того, как правильные высокоуровневые конструкции могут сделать код в разы проще, понятнее и эффективнее.
PD>Полностью абстрагируясь от эффективного вычисления процентов , отмечу лишь, что сделать код с помощью каких-то высокоуровненвых конструкций проще — можно, понятнее — тоже можно, а вот эффективнее — дудки. Потому что предельно эффективная программа — это наилучшим образом оптимизированная программа, написанная на ассемблере. А в этом самом ассемблере есть только презренные присваивания, if, с грехом пополам циклы, и ни одной лямбды
Дворкин, а что ты тогда делаешь в форуме по дотнету, да и здесь? Ты же должен писать софт на асме. И по сему, времени у тебя свободного остаться не должно. Вот у меня и возникает вопрос, ты просто: ты нас обманываешь или заказчиков?
VD>Дворкин, а что ты тогда делаешь в форуме по дотнету, да и здесь? Ты же должен писать софт на асме. И по сему, времени у тебя свободного остаться не должно. Вот у меня и возникает вопрос, ты просто: ты нас обманываешь или заказчиков?
Вообще-то на вопросы, заданные в таком тоне, лучше не отвечать, но так и быть, отвечу.
1. В форуме по дотнету я задаю вопросы, связанные с небольшой утилиткой, которую я написал. А мне на эти вопросы вместо ответов по существу дают советы, как правильно делать и учат уму-разуму.
2. На асме мне писать, возможно, придется. Очередная задача — есть некий код автора алгоритма, работает 5 сек, коммерческий софт на эту тему работает тоже примерно 5 сек, а заказчик хочет, чтобы уложилось в 200 мсек. Как ускорить быстродействие раза в 3-4 — понимаю, а вот в 20 — нет. Хотя предпочел бы обойтись без асма, но, возможно, придется. И не так уж это сложно, поверь.
3.И поскольку я это не понимаю пока, и заказчик тоже понимает, что я это за мгновение не сделаю, то мне надо думать, и заказчик меня не торопит. Думать надо, понимаешь ? Не оптимизировать вычисление процентов и не искать синтаксический сахар или аттическую соль, а думать, что с алгоритмом сделать. И думать я могу в самых разных местах, например, в маршрутке по дороге из дома/домой (почти час в один конец, увы). И я не знаю, сколько времени мне понадобится на то, чтобы что-то радикальное придумать. Был случай — две недели думал, ни одной строчки не написал, потом придумал и за пару дней реализовал.
Вот поэтому мне и забавно, когда серьезные вроде бы люди на полном серьезе обсуждают, как оптимизировать вычисление процентов или как контрол должен с родителем общаться. Мне бы ваши проблемы, господа.
4. А сегодня у меня университетский день был, между прочим. И писалось все это в основном в двухчасовом перерыве, а немного рано утром, пока студенты меня еще в оборот не взяли.
5. А обманывать тебя или других — в чем, собственно, этот обман мог бы заключаться ?
Надеюсь, я удовлетворил твое любопытство ?
А теперь позволь вопрос к тебе. Я не буду указывать, на чем ты должен писать софт, а вопрос такой — ты его вообще пишешь или только рассуждаешь здесь о преимуществах того или иного языка/среды/сахара/соли ? Дело в том, что у меня довольно давно сложилось устойчивое впечатление — те, кто очень любят обсуждать синтаксические конструкции и т.п. — люди, которые сами уже ничего серьезного не пишут.
PD>2. На асме мне писать, возможно, придется. Очередная задача — есть некий код автора алгоритма, работает 5 сек, коммерческий софт на эту тему работает тоже примерно 5 сек, а заказчик хочет, чтобы уложилось в 200 мсек. Как ускорить быстродействие раза в 3-4 — понимаю, а вот в 20 — нет. Хотя предпочел бы обойтись без асма, но, возможно, придется. И не так уж это сложно, поверь.
PD>3.И поскольку я это не понимаю пока, и заказчик тоже понимает, что я это за мгновение не сделаю, то мне надо думать, и заказчик меня не торопит. Думать надо, понимаешь ? Не оптимизировать вычисление процентов и не искать синтаксический сахар или аттическую соль, а думать, что с алгоритмом сделать. И думать я могу в самых разных местах, например, в маршрутке по дороге из дома/домой (почти час в один конец, увы). И я не знаю, сколько времени мне понадобится на то, чтобы что-то радикальное придумать. Был случай — две недели думал, ни одной строчки не написал, потом придумал и за пару дней реализовал.
PD>Вот поэтому мне и забавно, когда серьезные вроде бы люди на полном серьезе обсуждают, как оптимизировать вычисление процентов или как контрол должен с родителем общаться. Мне бы ваши проблемы, господа.
Дворкин, не смеши народ своими проблемами. 200 мс Мне вот тут нужно сократить время работы одного процесса, генерирующего десятки миллионов транзакций, с шести часов хотя бы до одного. Что бы люди спать могли по ночам. И как его сократить в десятки раз я знаю, только заказчик ждать не будет, т.к. это не день, не два, и даже не неделя как у тебя, а примерно год работы. И знаний одного ассемблера тут вовсе не достаточно. Нужно быть и алгоритмистом, и энтерпрайзным архитектором, и датабазным, а заодно и сетевым админом, и шарить в сетевых протоколах и местной инфраструктуре, и уметь распаралеливать вычисления не только на одной машине, но и на нескольких серверах, и писать читабельный код, который потом будут править будущие поколения, а не тяп-ляпать на ассемблере. И всё это нужно вчера. А ты говоришь 200 мс
PD>Полностью абстрагируясь от эффективного вычисления процентов , отмечу лишь, что сделать код с помощью каких-то высокоуровненвых конструкций проще — можно, понятнее — тоже можно, а вот эффективнее — дудки.
Я могу тебе ещё раз посоветовать перестать подглядывать за миром через замочную скважину и наконец-то распахнуть дверь. Приведённый мною алгоритм ускоряется пропорционально количеству ядер за время меньшее, чем тебе потребовалось на прочтение этого сообщения.
Что касается первого примера с pattern matching, то для леквидации своей безграмотности можешь полистать на досуге вот этот документик. Это алгоритм компиляции pattern matching, который используется в Nemerle. Код, который получается в результате, не просто полностью отжат и максимально эффективен, он ещё и генерируется так, что повторить его столько же эффективно на if-ах просто невозможно. Refletor в большинстве случаев такой код не восстанавливает, пишет что метод обфусцирован.
Ассемблер рулил 20 лет назад. И то с переменным успехом. Сегодня компиляторы вытворяют такие оптимизации, которые человек не станет использовать хотя бы потому, что написанный им код должен оставаться элементарно читаемым. При этом чем более высокоуровневые средства используются, тем больше у компилятора свободы для оптимизаций.
IT>Я могу тебе ещё раз посоветовать перестать подглядывать за миром через замочную скважину и наконец-то распахнуть дверь.
Слушай, а не хватит ? Так ведь ничего не докажешь!
>Приведённый мною алгоритм ускоряется пропорционально количеству ядер за время меньшее, чем тебе потребовалось на прочтение этого сообщения.
У меня есть подозрение, что любой алгоритм, допскающий истинное распараллеливание, ускоряется пропорционально количеству ядер . Впрочем, это только подозрение, так как если алгоритм оперирует данными, несколько более сложными, чем делимое и делитель при вычислении процентов, то начинают играть роль и иные факторы, как , например, время доступа к памяти и т.д. Тут это не раз обсуждалось.
IT>Что касается первого примера с pattern matching, то для леквидации своей безграмотности
Опять! Ну пойми же наконец — так ничего не докажешь.
>можешь полистать на досуге вот этот документик. Это алгоритм компиляции pattern matching, который используется в Nemerle. Код, который получается в результате, не просто полностью отжат и максимально эффективен, он ещё и генерируется так, что повторить его столько же эффективно на if-ах просто невозможно.
Он на P4 выполняется или нет ? Если да — берем ассемблерный код, который в конце концов получился хоть от Немерле, хоть от духа святого. Вот тебе эти самые if'ы и т.д.
Вот ответь прямо — можно написать код лучше, чем идеально написанный код на ассемблере ? Заметь, я вовсе не говорю, что знаю, как такой код написать. Но он теоретически существует — при данном алгоритме, конечно, и данном железе.
>Refletor в большинстве случаев такой код не восстанавливает, пишет что метод обфусцирован.
И что? какое это отношение к делу имеет ? В EXE с С++ все "обсфуцировано" и без всяких усилий с моей стороны
IT>Ассемблер рулил 20 лет назад. И то с переменным успехом. Сегодня компиляторы вытворяют такие оптимизации, которые человек не станет использовать хотя бы потому, что написанный им код должен оставаться элементарно читаемым.
Если я в своей задаче сделаю код слабочитаемым (о задаче я писал в ответе VladD2) — мне это простят. Если там будет нечто вроде блюда спагетти (не будет , конечно, но допустим) — простят. Ассемблер — не обсуждал с заказчиком, но , думаю, простят. Все простят, кроме одного — если я не уложусь в эти 200 мсек. И на фоне этого все прочие рассуждения меня интересуют, как прошлогодний снег. Потому что тут действительно сложная задача(и как ее решить — я пока не знаю), а не оптимизация вычисления процентов
>При этом чем более высокоуровневые средства используются, тем больше у компилятора свободы для оптимизаций.
Свободы больше, но при условии, что задачи стандартные, и компилятор знает, как их оптимизировать. Как только что-то нестандартное — будет плохо.
PD>Он на P4 выполняется или нет ? Если да — берем ассемблерный код, который в конце концов получился хоть от Немерле, хоть от духа святого. Вот тебе эти самые if'ы и т.д.
Ну так возьми, давай. Не надо нас пугать своими магаалгоритмами, возьми этот простенький и распаралель. Можешь взять ассемблер, который получился от Немерле. Вперёд.
PD>Вот ответь прямо — можно написать код лучше, чем идеально написанный код на ассемблере ? Заметь, я вовсе не говорю, что знаю, как такой код написать. Но он теоретически существует — при данном алгоритме, конечно, и данном железе.
Можно, PGO (http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.80).aspx) не зря придумали
PD>Полностью абстрагируясь от эффективного вычисления процентов , отмечу лишь, что сделать код с помощью каких-то высокоуровненвых конструкций проще — можно, понятнее — тоже можно, а вот эффективнее — дудки. Потому что предельно эффективная программа — это наилучшим образом оптимизированная программа, написанная на ассемблере. А в этом самом ассемблере есть только презренные присваивания, if, с грехом пополам циклы, и ни одной лямбды
Как и следовало ожидать, провокационная тема ушла в глубокий флейм, перемежаемый пенисометрией.
Поскольку никто из нормальных людей в такие глубины веток не ныряет, напишу правильный ответ здесь.
Итак, не отвлекаясь на фигню, отвечаем на вопрос: "можно ли сделать код эффективнее с помошью каких-то высокоуровневых конструкций?".
Во-первых, нужно отметить, что вопрос про то, какой код исполняется эффективнее — ассемблерный или еще какой — не стоит. Как ты верно подметил в глубинах флейма, "процессор всё равно не умеет исполнять никакого другого кода, кроме ассемблерного".
Отлично, тогда что же мы сравниваем и с чем? Вот у нас одна программа (очевидно, ассемблерная), и вот другая программа. Очевидно, тоже ассемблерная. Одна из них может оказаться эффективнее другой. Какая же программа будет именно такой?
Для начала, нужно понять, что такое "более эффективная". Это не такой тривиальный вопрос, как кажется. Дело даже не столько в том, что количество тактов, потребляемое некоторой программой для решения некоторой задачи, зависит от массы сторонних факторов (например, насколько часто процессору приходится отвлекаться от нее на обслуживание чего-то другого), а в том, что сначала нужно определиться с тем, что такое "решение задачи".
В стародавние времена программы (и задачи) были одноразовыми. Нужно вам, скажем, посчитать число Пи до тысячного знака. Ок, пишем программу, которая считает число Пи; запускаем, дожидаемся результата — ок, задача решена. Очевидно, что второй раз нам считать число Пи уже не надо. (Если, конечно, мы не забыли вывести куда-то результат вычислений ). Опять же очевидно, что при многократном запуске расчета числа Пи эффективнее всех прочих будет программа, которая устроена примерно так (в терминах C++):
(Производители процессоров об этом в курсе; поэтому инструкция fldpi выполняется значительно быстрее, чем самый оптимизированный расчет суммы несложного ряда)
Cейчас мы подразумеваем под "задачей" семейство задач в том древнем смысле. То есть когда мы говорим "нужна программа для сортировки массива" мы подразумеваем, что одна и та же программа будет использоваться для сортировки различных массивов. А вовсе не для сортировки конкретного массива.
В чем сложность? В том, что раньше мы могли рассуждать об эффективности в терминах расходов памяти и тактов процессора, нужных для решения конкретной задачи. Нужно тебе X знаков после запятой в разложении Пи? Ок, это будет стоить N(X) тактов и потребует P(X) байт памяти.
Теперь так рассуждать нельзя — затраты в тактах и байтах существенным образом зависят от того, какие именно данные мы подали на вход. На пальцах: пузырек, запущенный на отсортированном массиве длины N выполнит N сравнений, 0 обменов и успокоится. На обратно отсортированных данных он выполнит N^2/2 сравнений и обменов.
Поэтому, говоря об эффективности, мы говорим о матожидании затрат при некотором распределении входных данных. Очень немногие программисты задумываются об этом распределении. К примеру, асимптотические оценки алгоритмов сортировки традиционно даются для равномерного распределения: все перестановки значений во входных данных считаются равновероятными.
Конечно же, в природе задач с равномерным распределением не существует.
На данном этапе мы уже поняли, что если мы беремся сравнивать две программы по эффективности, то нам нужно задатсья некоторым распределением входных данных. Если мы этого не сделаем, то сравнение не имеет смысла — в одних условиях выиграет программа А, в других — программа B.
Итак, критерий сравнения эффективности программ — это матожидание затрат памяти и тактов на решение одной из задач, заданных некоторым распределением.
Поговорим об идеальной эффективности.
В идеальном мире мы можем получить информацию о предполагаемом распределении, и выбрать ту программу, которая покажет наилучшие результаты именно для него.
В реальном мире такие оценки очень редко можно получить заранее, до запуска программы.
Как же нам быть в таком случае? Выбирать программу случайно?
Способ, очевидно, есть. Вместо того, чтобы подготовить одну программу, мы можем подготовить семейство программ, которые имеют одну и ту же семантику (например, все они сортируют любой массив), но отличаются характеристиками производительности для различных входных данных.
И только тогда, когда мы узнаем, какие же данные поступают к нам на вход, мы выбираем ту из программ, которая лучше подходит для конкретного случая.
Этот подход замечателен тем, что он не требует полной априорной информации о свойствах будущей задачи. Очевидно, что он обеспечит не худшую производительность, чем фиксированная программа на все случаи жизни.
Осталось понять, можно ли применить этот подход, оставаясь в рамках "наилучшим образом оптимизированной программы, написанной на ассемблере", и "можно ли сделать код эффективнее с помошью каких-то высокоуровневых конструкций". Об этом я напишу завтра, потому что сегодня пора домой
S>Этот подход замечателен тем, что он не требует полной априорной информации о свойствах будущей задачи. Очевидно, что он обеспечит не худшую производительность, чем фиксированная программа на все случаи жизни.
При соблюдении двух услових:
в среднем автомат не ошибается, и выбирает правильный вариант программы
вычислительные ресурсы, потраченные на, собственно, выбор, не превышают экономии от правильно сделанного выбора
Итак, продолжаем разрывать шаблоны. Но перед тем, как перейти к основному обсуждению, сделаю два уточнения:
1. Напомню, что речь идет именно о сферических программах в вакууме. Мы не собираемся обсуждать возможности реально доступных компиляторов и сред исполнения. Во-первых, потому, что изначально вопрос формулировался именно в абстрактно-теоретических терминах, а во-вторых, потому, что иначе нам придется сравнивать реальные компиляторы с реальными программистами-ассемблерщиками, и тут совершенно неясно, слон кита заборет или всё-таки наоборот
2. Как совершенно верно заметил Pzz, моё утверждение про эффективность адаптивного алгоритма слишком сильное. Действительно, нужно оговориться: мы выиграем только в том случае, когда цена выбора оптимального решения не превышает проигрыш от применения неоптимального.
Тем не менее, на справедливость остальных умозаключений это не влияет: дело в том, что мне не нужно доказывать, что этот подход будет пределом эффективности. Мне достаточно показать, что существуют задачи, на которых он эффективнее.
Итак, вернемся к нашим "высокоуровневым конструкциям".
Пока что мы получили интуитивное представление о том, что неплохо бы выбирать решение в зависимости от свойств поступающих задач. Ассемблер достаточно гибок для того, чтобы помочь нам в простых случаях. Под простыми случаями я имею в виду такие, когда количество вариантов решения невелико. Ну вот сколько у нас алгоритмов сортировки для массива? В таком случае, расходы памяти на одновременное хранение всех этих программ не выходят за пределы разумного, а выбор сводится к традиционному conditional statement.
К сожалению, у этого подхода имеются свои ограничения.
Если "размеры" семейства программ-решений выходят за разумные пределы, то их суммарный объем становится препятствием для статической реализации. Это не такая уж редкая ситуация: как правило, некоторая задача делится на более мелкие подзадачи. Если у подзадач A1 и A2 — по четыре решения, то у задачи A, которая является суперпозицией этих двух задач, получается 16 решений.
В более сложных случаях мы можем наблюдать экспоненциальный взрыв пространства возможных решений. Реальный пример желающие могут пронаблюдать здесь.
Есть ли способ "ускорить" решение таких задач, при этом не заплатив мегабайтами различных комбинаций ассемблерных инструкций?
Для машин с фон-Неймановской архитектурой есть. Поскольку программа — это те же данные, никто не мешает нам генерировать новый код (или модифицировать имеющийся) "на лету", в процессе выполнения программы.
И вот тут-то у нас и возникает спецэффект. Если мы проведем водораздел там, где начинается генерация кода, то как раз и окажется, что она всё-таки помогает сделать код эффективнее.
В принципе, вопрос можно считать решенным, но на всякий случай я продолжу разжевывание — практика показала, что даже высокообразованные люди совершенно неспособны самостоятельно строить логические цепочки, особенно когда им этого не хочется.
Итак, изначальный вопрос пользовался "высокоуровневыми конструкциями", а не "runtime code generation".
Поясняю логическую взаимосвязь: вот у нас есть та часть программы, которая не меняется в процессе ее работы. И вот есть другая часть программы, которая таки меняется в процессе работы. На чем написана эта вторая часть? Я имею в виду — до того, как мы начали программу выполнять?
На ассемблере? Нет, это не лучшая идея.
На ассемблере ее написать нельзя — потому, что сам ассемблер не содержит достаточно информации о том, какие трансформации можно над ним проводить. Ну, если быть точным, то для ограниченного количества вырожденных случаев всё-таки можно обойтись ассемблером — соблюдая специальные конвенции, чтобы обеспечить "совместимость" кусочков программы, из которых собирается конечное решение.
Но в общем случае помимо собственно ассемблерного "образца" статической части программы понадобится какая-то еще информация о его устройстве: какие части образца можно менять, куда их можно встраивать, и так далее. Эта информация как раз эквивалентна более высокоуровневым конструкциям, чем сам язык ассемблера.
Вот, собственно, и всё. Sapienti Sat.
PD>Все же, если не сложно, сделай, пожалуйста, в разы проще, понятнее и эффективнее сортировку — любую. Или, скажем, какой-нибудь графический фильтр. Или создание и управление неким сложно организованным файлом на диске. Или математический алгоритм — матричную алгебру, к примеру.
В сортировках, графических фильтрах и сложных файлах на дисках увы дас вайст их нихт.
А вот про матричную алгебру — это пожалуйста:
Скалярное умножение вектора-строки на вектор-столбец:
Сложение матриц:
Транспонирование:
Умножение матрички на скаляр:
Умножение матрички на матричку:
Умножение матрички на вектор-столбец справа
Умножение матрички на вектор-строку слева
Умножение вектор-строка * матричка * вектор-столбец
Ортогонализация Грамма-Шмидта
Ну и решение СЛАУ методом выделения треугольной матрицы:
Представьте себе, и это всё, да. В последний раз, когда я видел решение СЛАУ (моё) оно было минимум 5 экранов — и for-ы, for-ы, много for-ов... Выбор несколько других примитивов позволяет, даже в такой "цыкло-насыщенной" задаче, избежать явного применения оператора цикла. Казалось бы, согласно маэстро Дейкстре, основополагающего примитива.
PD>Слишком уж разные у нас с вами задачи, господа...
Из ваших сообщениях в тематических форумах подозреваю что нет. Просто у меня другое отношение к заточке инструмента
LCR>А вот про матричную алгебру — это пожалуйста:
Вот из-за таких примеров народ и бегает от ФП, как черт от ладана. Классика, блин — специфичные математические задачи, однобуквенные переменные.
LCR>>А вот про матричную алгебру — это пожалуйста:
AVK>Вот из-за таких примеров народ и бегает от ФП, как черт от ладана. Классика, блин — специфичные математические задачи, однобуквенные переменные.
Не понял. Ты предлагаешь локальные бинды обзывать my_favourite_name. Или что? Если так, то это контрпродуктивно.
Или сказывается просто отсутствие комментариев, которые я намеренно убрал, чтобы сообщение не получилось чересчур длинным, поскольку цель сообщения была дать представление о том, как может выглядеть другой способ решения. Реально нужно просто добавить удалённые комментарии
или (ещё лучше) использовать literate style.
LCR>Не понял. Ты предлагаешь локальные бинды обзывать my_favourite_name. Или что? Если так, то это контрпродуктивно.
Я предлагаю использовать примеры, которые ближе к реальности, и писать их так, чтобы они не напоминали птичью тропку на снегу. Обсуждаемый тут пример IT как раз такой.
LCR>Представьте себе, и это всё, да.
Это всё будет работать очень и очень медленно. Это просто в принципе не может работать быстро.
LCR>>Представьте себе, и это всё, да.
IT>Это всё будет работать очень и очень медленно. Это просто в принципе не может работать быстро.
Что возможно верно в случае данного компилятора и не верно в общем случае. Так что с "в принципе" не согласен.
IT>>Это всё будет работать очень и очень медленно. Это просто в принципе не может работать быстро.
LCR>верно
Вот!
LCR>Так что с "в принципе" не согласен.
Ты не понимаешь. Быстро может работать только написанное на ассемблере или его высокоуровневых аналогах вроде C. У тебя же только GC будет отрабатывать столько, сколько нормально написанная программа на ассемблере будет работать всего.
LCR>А вот про матричную алгебру — это пожалуйста:
<местами skipped>
LCR>Скалярное умножение вектора-строки на вектор-столбец:
LCR>Сложение матриц:
LCR>Представьте себе, и это всё, да. В последний раз, когда я видел решение СЛАУ (моё) оно было минимум 5 экранов — и for-ы, for-ы, много for-ов... Выбор несколько других примитивов позволяет, даже в такой "цыкло-насыщенной" задаче, избежать явного применения оператора цикла. Казалось бы, согласно маэстро Дейкстре, основополагающего примитива.
Лет так 30 назад была такая система программирования Альфа, сделана была в Новосибирске Ершовым, поттосиным и др. На базе языка Алгол, но с расширениями. Так вот, там сложение матриц делалось еще проще
real array a[1:n][1:m],b[1:n][1:m], c[1:n][1:m];
// инициализация
c := a + b;
Проще некуда. И это во времена, когда ни о каком функциональном программировании и речи не было.
Но за эту простоту заплачено. В данном случае — куском компилятора, который разобрался, что эти массивы одинакового размера и создал код, который реализует это двойной цикл. В вашем примере — средствами иной системы. А в конечном счете их будет реализовать процессор P4, которому до матриц столько же дела, сколько мне до китайского языка .
Так что весь вопрос в цене этой платы — это раз, и в том, насколько хорошо это сделано — это два. Второе ИМХО выглядит так — если речь идет о чем-то стандартном, это может быть сделано очень хорошо, потому что писали реализацию грамотные люди. Но все стандартные задачи не переберешь, а когда что-то нестандартное потребуется, то будет уже и сложнее, и менее понятно, и менее эффективно. Это, кстати, хорошо демонстрируют приведенные примеры. По строкам и по столбцам (сложения, умножения) — очень ясно и просто, а что касается решения СЛАУ — не намного короче кода на С++. Не понял, кстати, для чего требуется 5 экранов для СЛАУ — ИМХО инвертирование матрицы по Гауссу-Жордану занимает строк 30-40. Не без циклов, правда. Но они и здесь есть — так же, как и в том примере сложения матриц, с которого я начал.
Бесплатный сыр бывает только в мышеловке
PD>Проще некуда. И это во времена, когда ни о каком функциональном программировании и речи не было.
Ну чисто для справки: функциональное программирование придумано раньше Алгола. ЛИСП называется. Говорят, были очень хорошие оптимизирующие компиляторы лиспа, хотя в обычной реализации как правило ограничивались интерпретатором.
PD>Лет так 30 назад была такая система программирования Альфа, сделана была в Новосибирске Ершовым, поттосиным и др. На базе языка Алгол, но с расширениями. Так вот, там сложение матриц делалось еще проще
PD>real array a[1:n][1:m],b[1:n][1:m], c[1:n][1:m];
PD>// инициализация
PD>c := a + b;
PD>Проще некуда. И это во времена, когда ни о каком функциональном программировании и речи не было.
http://www.rsdn.ru/article/funcprog/fp.xml#EZC
Кстати, посмотрите кто статью переводил
S>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Лет так 30 назад была такая система программирования Альфа, сделана была в Новосибирске Ершовым, поттосиным и др. На базе языка Алгол, но с расширениями. Так вот, там сложение матриц делалось еще проще
Уточняю. Не 30, а 40 (книга от 1968 года, можно, кстати, отметить — когда-то у нас компиляторы делали . Впрочем, Лиспу 50. Я просто не знал, что у него такой почтенный возраст.
S>Кстати, посмотрите кто статью переводил
PD>Лет так 30 назад была такая система программирования Альфа, сделана была в Новосибирске Ершовым, поттосиным и др. На базе языка Алгол, но с расширениями. Так вот, там сложение матриц делалось еще проще
PD>real array a[1:n][1:m],b[1:n][1:m], c[1:n][1:m];
PD>// инициализация
PD>c := a + b;
PD>Проще некуда.
PD>Второе ИМХО выглядит так — если речь идет о чем-то стандартном, это может быть сделано очень хорошо, потому что писали реализацию грамотные люди. Но все стандартные задачи не переберешь, а когда что-то нестандартное потребуется, то будет уже и сложнее, и менее понятно, и менее эффективно.
Вот, по-моему это и есть ключевая фраза. Все задачи не переберёшь, следовательно экстенсивный путь уже обречён на неудачу. Мы можем реализовать сложение, умножение, инвертирование матриц, матрицы могут быть ленточные, треугольные, разряжённые, но этого всё-равно ничтожно мало, за бортом по-прежнему множество алгоритмов счётной мощности, куда уже не сунешься, потому что выразительных средств недостаточно.
На данный момент необходимо иметь такой базовый набор выразительных средств (нотацию, язык — назовите как угодно), которая
1. Позволяет реализовать любой алгоритм в принципе
2. Позволяет реализовать любой алгоритм практически, причём реализация была или как можно более эффективной (учитывала конкретное окружение включая кэши, конвейеры, наличие нескольких ядер), или давала гарантии по эффективности или затратам памяти.
Несложный анализ показывает, что вышеназванная Альфа никак укладывается в требования выше. Чтобы попытаться накрыть ладонью всё множество алгоритмов, выделения кусочка кода и возможность обозвать его "+" явно недостаточно. Нужна модульность, много модульности, больше чем сейчас. Поясню на примере.
Допустим, вы реализовали умножение матриц, причём учли и кэши, и многопроцессорность, и учли специфику Intel/AMD и ещё много чего. То есть, ваш алгоритм стал очень очень быстрым, так что на любой машине это оказалась самая эффективная реализация.
Я делаю преобразование Лапласа, (или решаю нелинейные уравнения, или делаю какой-нибудь комбинаторный алгоритм), и теперь мне тоже надо его сделать как можно быстрее. Я запрограммировал его в виде функции laplas_transform, и теперь как мне выделить из вашего алгоритма отражение знания об архитектуре и использовать с моей функцией? Как вообще сделать так, чтобы это было возможно?
А Вася, например, хочет взять ваш алгоритм, и сделать так, чтобы вместо вещественных чисел можно было использовать символьные значения (ему нужны символьные алгебраические преобразования).
А Таня, вдобавок, хочет взять ваш алгорить, и сделать так, чтобы вместо вещественных чисел были функции, да ещё и на комплексном пространстве.
И, наконец, Алиса, взяв ваш алгоритм в качестве процедуры, вдруг осознала, что он и является главным пожирателем процессорного времени, но специфика задачи позволяет вычислять всё произведение не сразу, а по немножку. И её осенило, что если в вашем алгоритме использовать ленивые for-ы, то всё становится замечательно.
Единственный разумный путь сделать счастливыми всех четырёх человек, как мне видится, это декларативно описать алгоритм и возложить знание об архитектуре и окружение на компилятор (так что компилятор и будет модулем optimize, можно считать что каждая функция описана как f = optimize f_). Такое декларативное описание присутствует в коде на Хаскеле, и в подавляющем большинстве случаев отсутствует в коде на C++, так что бедные Вася, Таня, Алиса и ваш покорный ученик должны заново изобретать свои многоугольные колёса.
LCR>Вот, по-моему это и есть ключевая фраза. Все задачи не переберёшь, следовательно экстенсивный путь уже обречён на неудачу. Мы можем реализовать сложение, умножение, инвертирование матриц, матрицы могут быть ленточные, треугольные, разряжённые, но этого всё-равно ничтожно мало, за бортом по-прежнему множество алгоритмов счётной мощности, куда уже не сунешься, потому что выразительных средств недостаточно.
Если использовать крупноблочное строительство, то всегда найдется проект, для которого ни один набор выпускаемых крупных блоков не подходит. Если строить из кирпичей, то можно построить все, что угодно — от утепленной собачьей будки до собора святого Петра.
LCR>На данный момент необходимо иметь такой базовый набор выразительных средств (нотацию, язык — назовите как угодно), которая
LCR>1. Позволяет реализовать любой алгоритм в принципе
Из кирпичей можно все построить.
LCR>2. Позволяет реализовать любой алгоритм практически, причём реализация была или как можно более эффективной (учитывала конкретное окружени
е включая кэши, конвейеры, наличие нескольких ядер), или давала гарантии по эффективности или затратам памяти.
И будет это здание наиболее эффективным. Некоторые их них уже 2000 лет стоят. И все там учитывают , если надо — от сейсмостойкости до розы ветров.
LCR>Несложный анализ показывает, что вышеназванная Альфа никак укладывается в требования выше.
Коля, вы что говорите! Эта Альфа 1968 г.р.
>Чтобы попытаться накрыть ладонью всё множество алгоритмов, выделения кусочка кода и возможность обозвать его "+" явно недостаточно. Нужна модульность, много модульности, больше чем сейчас. Поясню на примере.
LCR>Допустим, вы реализовали умножение матриц, причём учли и кэши, и многопроцессорность, и учли специфику Intel/AMD и ещё много чего. То есть, ваш алгоритм стал очень очень быстрым, так что на любой машине это оказалась самая эффективная реализация.
LCR>Я делаю преобразование Лапласа, (или решаю нелинейные уравнения, или делаю какой-нибудь комбинаторный алгоритм), и теперь мне тоже надо его сделать как можно быстрее. Я запрограммировал его в виде функции laplas_transform, и теперь как мне выделить из вашего алгоритма отражение знания об архитектуре и использовать с моей функцией? Как вообще сделать так, чтобы это было возможно?
А так же, как делали умножение. С учетом кэшей, и многопроцессорности, и специфики Intel/AMD и ещё много чего. Наверняка многие решения совпадут, но, в общем, это разные алгоритмы, и оптимизировать их надо по -разному.
LCR>А Вася, например, хочет взять ваш алгоритм, и сделать так, чтобы вместо вещественных чисел можно было использовать символьные значения (ему нужны символьные алгебраические преобразования).
Что-то я не понял. Вы собрались матрицы в символьном виде перемножать ? Задача достойная, но это не арифметика, а обработка текста в основном. И оптимизация совсем другого, мб, понадобится — рабботы со строками, к примеру.
LCR>А Таня, вдобавок, хочет взять ваш алгорить, и сделать так, чтобы вместо вещественных чисел были функции, да ещё и на комплексном пространстве.
LCR>И, наконец, Алиса, взяв ваш алгоритм в качестве процедуры, вдруг осознала, что он и является главным пожирателем процессорного времени, но специфика задачи позволяет вычислять всё произведение не сразу, а по немножку. И её осенило, что если в вашем алгоритме использовать ленивые for-ы, то всё становится замечательно.
Что-то много у вас знакомых, и все они чего-то хотят
LCR>Единственный разумный путь сделать счастливыми всех четырёх человек, как мне видится, это декларативно описать алгоритм и возложить знание об архитектуре и окружение на компилятор (так что компилятор и будет модулем optimize, можно считать что каждая функция описана как f = optimize f_). Такое декларативное описание присутствует в коде на Хаскеле, и в подавляющем большинстве случаев отсутствует в коде на C++, так что бедные Вася, Таня, Алиса и ваш покорный ученик должны заново изобретать свои многоугольные колёса.
К сожалению, если поручить это все оптимизатору компилятора, то этот компилятор должен будет быть попросту гениальным, то есть включать в себя знание всех и всяческих техник, трюков и т.п, связанных и с кэшами, и с многопроцессорностью и с характером задачи. Увы, это вряд ли реально. Компилятор будет в лучшем случае оптимизировать "в среднем", то есть в расчете на некую среднюю задачу. И чем выше уровень абстракций, тем хуже он это будет делать. Оптимизировать цикл можно очень хорошо, а оптимизировать задачу "сделай вот это" — можно лишь на бвзе некоторых правил оптимизации общего порядка. Как только попадется нечто, что под эти правила не подходят — результат будет плохим.
Оптимизировать задачу "построите мне автоматически жилой дом" — можно. Выбираем подходящие блоки, стыкуем их, определяем , в каком порядке их ставить, ставим, замазываем щели — дом готов.
Оптимизировать задачу "постройте мне автоматически собор святого Петра" — нельзя. Для этого Браманте и Микеланджело нужны. А если эту задачу оптимизировать автоматически, то в итоге получится утепленная собачья будка размером с собор святого Петра.
PD> Тут как-то сразу забываешь про инкапсуляцию с полиморфизмом и про все паттерны, потому что надо код писать, а не организовать. Алгоритм реализовать то есть.
Предлагаю повторить то же самое на "базовых" if-ах и while-ах. Кстати, хочу заметить, что истинно базовыми являются jz, jnz, jc, jnc и т.п. Ну а вообще труъ — это когда таблица переходов для машины Тьюринга.
PD>А не возникала ли у тебя мысль — а может, ничего и не надо ? Базовые конструкции потому и называются базовыми, что они , во-первых, не упрощаются, а во-вторых, их набор минимален и не всякое туда пустят, просто для того, чтобы не нарушать стройность и логику — иными словами, по принципу бритвы Оккама. Это как аксиомы Евклида — за 2000 лет никаких новых аксиом туда не добавили и не добавят . И три классические формы — следование, выбор, повторение — так и остались, и четвертому Риму похоже, не бывать
Гм, ну вообще-то повторение тоже разное бывает. Я вот уже давно for-ом в C# не пользуюсь. А в Питоне, например, for вообще имеет семантику C#-ского foreach, и ничего. Во-вторых, про труъ базовые конструкции я уже писал. В-третьих, туда не только не добавили аксиомы, но и изъяли одну, и получили теории, гораздо более мощные. Ну и наконец, никто не заставляет строить геометрию аки Евклид. Можно выбрать и другой набор аксиом, правда он будет не столь удобен. Так вот в случае с программированием мне известны три такие альтернативные системы аксиом. И не факт, что они чем-то уступают машине Тьюринга.
K> Я вот уже давно for-ом в C# не пользуюсь.
А если надо пройтись по индексированному списку и индекс использовать внутри — руками заводишь счетчик или делаешь foreach по Enumerable.Range()?
AVK>А если надо пройтись по индексированному списку и индекс использовать внутри — руками заводишь счетчик или делаешь foreach по Enumerable.Range()?
Правильнее было сказать, "уже давно for-ом практически не пользуюсь". Правда, чаще выбираю второй подход, нежели for. Потому что у меня есть свой индексированный список. И для работы с ним у меня есть Range. Я как правило не имею дело с парами индексов или длиной списка. У меня на это есть Range, который ещё реализует IEnumerable (например, пройтись по списку foreach (var i in list.All) { }. Разумеется, всё это только в тех проектах, где мне можно использовать свои библиотеки, и не надо взаимодейтстовать с кодом, который уже написан под List<T> или массивы.
K>Гм, ну вообще-то повторение тоже разное бывает. Я вот уже давно for-ом в C# не пользуюсь. А в Питоне, например, for вообще имеет семантику C#-ского foreach, и ничего. Во-вторых, про труъ базовые конструкции я уже писал. В-третьих, туда не только не добавили аксиомы, но и изъяли одну, и получили теории, гораздо более мощные. Ну и наконец, никто не заставляет строить геометрию аки Евклид. Можно выбрать и другой набор аксиом, правда он будет не столь удобен. Так вот в случае с программированием мне известны три такие альтернативные системы аксиом. И не факт, что они чем-то уступают машине Тьюринга.
Со всем этим можно было бы согласиться, если бы процессор мог непосредственно выполнять код на Хаскеле/C#... Тогда я бы снял свои возражения. А пока что, что там не делай, а закончится все mov, add, jmp и т.д. И вот это есть абсолютный теоретический предел при данном алгоритме, если его идеально эффективно запрограммировать. Улучшить можно, только если алгоритм поменять (или доступ к данным ускорить или распараллелить и т.д.).
PD>Со всем этим можно было бы согласиться, если бы процессор мог непосредственно выполнять код на Хаскеле/C#... Тогда я бы снял свои возражения. А пока что, что там не делай, а закончится все mov, add, jmp и т.д. И вот это есть абсолютный теоретический предел при данном алгоритме, если его идеально эффективно запрограммировать. Улучшить можно, только если алгоритм поменять (или доступ к данным ускорить или распараллелить и т.д.).
Ну прикол-то в том, что если программа сформулирована в терминах mov, add, jmp и т.д, то простор для ее оптимизации крайне мал. Да, процессоры сейчас выжимают максимум из этого, но у них есть существенные ограничения как по ресурсам, которые можно на это потратить, так и по возможным действиям, которые они могут выполнить.
А вот если задача сформулирована декларативно, то как раз можно и алгоритм поменять, и доступ к данным ускорить, и распараллелить и всё что угодно.
Более того, во многих задачах невозможно заранее предложить оптимальное решение в терминах mov, add, jmp и т.д. Просто потому, что еще нет информации о том, в каких условиях будет алгоритм выполняться. Потому, что, к примеру, параллелить на 1 ядре — это гарантированная потеря производительности. И непараллелить при 4 ядрах — тоже гарантированная потеря. А никакого способа автоматически трансформировать mov/add/jmp так, чтобы они были оптимальны для 1/2/4 ядер наука не знает. Зато знает способы делать это в том случае, если программа написана в декларативном стиле.
Ты в курсе, как работают оптимизаторы в современных компиляторах? Именно так и делают: переписывают Control Flow Graph в виде SSA/SSI, то есть практически в функциональном, а потом уже применяют всякие трансформации, учитывая дополнительную информацию.
S>Ну прикол-то в том, что если программа сформулирована в терминах mov, add, jmp и т.д, то простор для ее оптимизации крайне мал.
Ты когда-нибудь видел задачу, которая могла бы быть сформулирована в терминах mov, add, jmp и т.д ? Я таких задач в предметной области не встречал, разумееется, драйверы и прочие средства доступа к железу не в счет.
На тебе банальную задачу умножения матриц и сформулируй ее в терминах mov, add, jmp и т.д. Подчеркиваю, сформулируй, а не напиши програму. А мы посмотрим, что из этого вышло
>Да, процессоры сейчас выжимают максимум из этого
Из чего они выжимают, ты что говоришь-то ? Из себя, что ли ? Или из своих собственных команд add. mov и т.д. ? Вот сижу и вижу — процессор пытается из самого себя выжать максимум. Меня это даже пугает немного — а вдруг чего-то выжмет
> но у них есть существенные ограничения как по ресурсам, которые можно на это потратить, так и по возможным действиям, которые они могут выполнить.
Это у процессоров ограничения по действиям, которые они могут выполнить ? Ну , кажется, приехали. У процессоров , значит, ограничения, а вот если на этих процессорах исполнять управляемый код со всеми наворотами, то эти ограничения куда-то исчезают и открываются у процессоров дополнительные возможности, так , что ли ? Ну и ну!
S>А вот если задача сформулирована декларативно, то как раз можно и алгоритм поменять, и доступ к данным ускорить, и распараллелить и всё что угодно.
Можно. Алгоритм всегда поменять можно, было бы на что менять. И доступ тоже поменять можно. И распараллелить. Поверь, все это вполне можно и без всяких управляемых сред. Это еще лет 20 назад умели и даже раньше.
S>Более того, во многих задачах невозможно заранее предложить оптимальное решение в терминах mov, add, jmp и т.д.
И неоптимальное тоже — см. выше, потому что так никто задачи не формулирует. И зря ты пытаешься доказать, что я это утверждаю. Я лишь одно утверждал — есть некий теоретический предел, им является идеально написанная программа на ассемблере. На любом языке с любыми средствами лучше сделать нельзя. При этом я вовсе не утверждаю, что знаю, как такую программу написать. Это лишь теорема о существовании. Но теорема верная. И из нее вовсе не следует, что программы надо писать на ассемблере.
>Просто потому, что еще нет информации о том, в каких условиях будет алгоритм выполняться.
Если он на нетипичном процессоре или на иной архитектуре может выполняться — я со скрипом, но соглашусь. Потому что не знаю. что там хорошо, а что плохо. (В скобках : если буду знать — не соглашусь) Если же речь идет об обычной архитектуре, то не соглашусь. Windows NT-Vista, как тебе известно должно быть, написана так, что кроме HAL, все остальное от архитектуры не зависит. И работает она на x86, x64, а до этого были Alpha, MIPS, Power PC.
>Потому, что, к примеру, параллелить на 1 ядре — это гарантированная потеря производительности.
Грандиозная мысль! Я бы сам никак не догадался . Но , к твоему сведению, узнать число процессоров через Win32 совсем не сложно. См. мой ответ IT с примером программы.
>И непараллелить при 4 ядрах — тоже гарантированная потеря.
А вот до этого я не догадался. Я как-то до сих пор считал, что параллелить можно либо распараллеливаемые алгоритмы, либо массовые операции. А ты, похоже, дай тебе 4 ядра — возьмешься параллелить все, что угодно. Успехов
>А никакого способа автоматически трансформировать mov/add/jmp так, чтобы они были оптимальны для 1/2/4 ядер наука не знает. Зато знает способы делать это в том случае, если программа написана в декларативном стиле.
Посмотри мой пример. Там хоть и не mov и не add (опять борьба с ветряными мельницами), но вполне-таки распараллелено, и без всякого декларативного стиля. Без LINQ. Без интерфейсов. И даже (о ужас!) без классов. Кошмар просто
S>>Ну прикол-то в том, что если программа сформулирована в терминах mov, add, jmp и т.д, то простор для ее оптимизации крайне мал.
PD>Ты когда-нибудь видел задачу, которая могла бы быть сформулирована в терминах mov, add, jmp и т.д ? Я таких задач в предметной области не встречал, разумееется, драйверы и прочие средства доступа к железу не в счет.
PD>На тебе банальную задачу умножения матриц и сформулируй ее в терминах mov, add, jmp и т.д. Подчеркиваю, сформулируй, а не напиши програму. А мы посмотрим, что из этого вышло
Повторяю специально для альтернативно одаренных: речь о том, в каких абстракциях сформулирована программа. А не исходную задачу.
>>Да, процессоры сейчас выжимают максимум из этого
PD>Из чего они выжимают, ты что говоришь-то ? Из себя, что ли ? Или из своих собственных команд add. mov и т.д. ? Вот сижу и вижу — процессор пытается из самого себя выжать максимум. Меня это даже пугает немного — а вдруг чего-то выжмет
Да, Павел, всё именно так плохо. Процессор пытается выжать максимум именно из add, mov и так далее. Тебе вообще знакома хотя бы поверхностно архитектура современных процессоров? Термин "предсказание переходов" тебе что-нибудь говорит? Это как раз и есть попытка изменить стратегию исполнения ассемблерного кода так, чтобы увеличить throughput. Потому что формально любое ветвление обязано приводить к простою конвеера: на ассемблере ясно написано "пока не сравнишь содержимое EAX с EBX, непонятно куда переходить".
Далее, я тебе открою страшную тайну: реально никаких EAX и EBX в процессоре нету. Есть внутренние регистры, и маппинг "внешних" регистров на внутреннние определяется только в момент исполнения программы. Более того, процессор переупорядочивает команды для обеспечения лучшей производительности. Добро пожаловать в реальный мир, Павел.
Все эти трюки призваны исправить глупости, допущенные программистом ассемблера. Потому, что если бы он был умным, то он бы сам переупорядочил командны так, чтобы обеспечить максимальную микропараллельность. Вот только возможности процессора в этом ограничены.
>> но у них есть существенные ограничения как по ресурсам, которые можно на это потратить, так и по возможным действиям, которые они могут выполнить.
PD>Это у процессоров ограничения по действиям, которые они могут выполнить ? Ну , кажется, приехали. У процессоров , значит, ограничения, а вот если на этих процессорах исполнять управляемый код со всеми наворотами, то эти ограничения куда-то исчезают и открываются у процессоров дополнительные возможности, так , что ли ? Ну и ну!
Совершенно верно. Для человека, который декларирует стремление к оптимальности, ты последовательно демонстрируешь потрясающую некомпетентность в вопросах оптимизации. На любом, причем, уровне. Поясняю еще раз: у процессора очень маленькое "окно просмотра кода", внутри которого он пытается понять намерения программиста, и обеспечить их выполнение с наилучшей производительностью. У него очень мало прав по внесению изменений в код, т.к. ему неясна семантика.
Вот простейший пример: ты пишешь код, вычисляющий сумму целых чисел в массиве. По какой-то причине на каждой итерации цикла ты выполняешь запись в определенную ячейку памяти.
Процессору совершенно непонятно, зачем ты это делаешь. То ли ты просто забыл, что можно использовать регистр, то ли есть другой поток, который наблюдает за этой ячейкой. В итоге, процессор честно выполняет обращение к памяти.
Если та же программа написана в терминах языка высокого уровня, типа того же С++, то по ней можно гораздо лучше понять, что именно происходит.
В частности, например, компилятор может выбрать хранение промежуточных результатов в регистре, потому что это эффективнее.
Далее, если процессор видит вызов в ассемблерном коде, он попытается предсказать переход и накормить конвейер. Но он не может выполнить инлайнинг кода, потому что у него нет такого права. А инлайнинг позволяет массу других оптимизаций. Тебе понятно, что сам по себе инлайнинг требует размеченного кода? Мы вроде уже обсуждали LTCG. Жаль, что ты ничего из этого не запомнил.
PD>Можно. Алгоритм всегда поменять можно, было бы на что менять. И доступ тоже поменять можно. И распараллелить. Поверь, все это вполне можно и без всяких управляемых сред. Это еще лет 20 назад умели и даже раньше.
Да-да. Я как бы в курсе.
S>>Более того, во многих задачах невозможно заранее предложить оптимальное решение в терминах mov, add, jmp и т.д.
PD>И неоптимальное тоже — см. выше, потому что так никто задачи не формулирует.
Еще раз повторяю для альтернативно одаренных: я говорю не о формулировке задачи, а о формулировке решения.
PD>И зря ты пытаешься доказать, что я это утверждаю. Я лишь одно утверждал — есть некий теоретический предел, им является идеально написанная программа на ассемблере. На любом языке с любыми средствами лучше сделать нельзя. При этом я вовсе не утверждаю, что знаю, как такую программу написать. Это лишь теорема о существовании. Но теорема верная. И из нее вовсе не следует, что программы надо писать на ассемблере.
Эта теорема неверна. Попробуй ее доказать
>>Просто потому, что еще нет информации о том, в каких условиях будет алгоритм выполняться.
PD>Если он на нетипичном процессоре или на иной архитектуре может выполняться — я со скрипом, но соглашусь. Потому что не знаю. что там хорошо, а что плохо. (В скобках : если буду знать — не соглашусь)
PD>Если же речь идет об обычной архитектуре, то не соглашусь. Windows NT-Vista, как тебе известно должно быть, написана так, что кроме HAL, все остальное от архитектуры не зависит. И работает она на x86, x64, а до этого были Alpha, MIPS, Power PC.
И почему ты думаешь, что Windows NT — это теоретический предел быстродействия???
>>Потому, что, к примеру, параллелить на 1 ядре — это гарантированная потеря производительности.
PD>Грандиозная мысль! Я бы сам никак не догадался . Но , к твоему сведению, узнать число процессоров через Win32 совсем не сложно. См. мой ответ IT с примером программы.
PD>А вот до этого я не догадался. Я как-то до сих пор считал, что параллелить можно либо распараллеливаемые алгоритмы, либо массовые операции. А ты, похоже, дай тебе 4 ядра — возьмешься параллелить все, что угодно. Успехов
>>А никакого способа автоматически трансформировать mov/add/jmp так, чтобы они были оптимальны для 1/2/4 ядер наука не знает. Зато знает способы делать это в том случае, если программа написана в декларативном стиле.
PD>Посмотри мой пример. Там хоть и не mov и не add (опять борьба с ветряными мельницами), но вполне-таки распараллелено, и без всякого декларативного стиля. Без LINQ. Без интерфейсов. И даже (о ужас!) без классов. Кошмар просто
Павел, это даже смешно. Во-первых, твоя программа тупо делает два прохода: один в последовательном режиме, второй в параллельном.
Давай ты приведешь ту программу, которая просто старается сделать один проход, но как можно быстрее. В том числе и в зависимости от количества процессоров. И мы сразу убедимся, что теоретического предела она не достигает.
Во-вторых, Павел, ты же против лишнего уровня абстракции, так? Давай-ка, приведи код сразу на ассемблере; посмотрим, насколько он порвет высокоабстрактные плюсы.
PD>>И зря ты пытаешься доказать, что я это утверждаю. Я лишь одно утверждал — есть некий теоретический предел, им является идеально написанная программа на ассемблере. На любом языке с любыми средствами лучше сделать нельзя. При этом я вовсе не утверждаю, что знаю, как такую программу написать. Это лишь теорема о существовании. Но теорема верная. И из нее вовсе не следует, что программы надо писать на ассемблере.
S>Эта теорема неверна. Попробуй ее доказать
А если так: для любой программы на языке высокого уровня существует эквиавалентная программа на ассемблере, которая работает не хуже?
S>Здравствуйте, Pavel Dvorkin, Вы писали:
S>>>Ну прикол-то в том, что если программа сформулирована в терминах mov, add, jmp и т.д, то простор для ее оптимизации крайне мал.
PD>>Ты когда-нибудь видел задачу, которая могла бы быть сформулирована в терминах mov, add, jmp и т.д ? Я таких задач в предметной области не встречал, разумееется, драйверы и прочие средства доступа к железу не в счет.
PD>>На тебе банальную задачу умножения матриц и сформулируй ее в терминах mov, add, jmp и т.д. Подчеркиваю, сформулируй, а не напиши програму. А мы посмотрим, что из этого вышло
S>Повторяю специально для альтернативно одаренных: речь о том, в каких абстракциях сформулирована программа. А не исходную задачу.
А не может ли уважаемый сэр, хоть и допускающий невежливые высказывания (чтобы не сказать больше) пояснить, как это можно сформулировать хотя бы программу на уровне абстракций типа mov — jmp. Мне это все же кажется странным. Написать ее с применением mov, jmp — или if, for — это понятно, а вот сформулировать в абстракциях хоть тех, хоть других — нет. Формулируют обычно в абстракциях структур данных и алгоритмов, а уж потом кодируют с помощью mov или for. Это курсе так на 1-2 объясняют вообще-то.
S>Да, Павел, всё именно так плохо. Процессор пытается выжать максимум именно из add, mov и так далее. Тебе вообще знакома хотя бы поверхностно архитектура современных процессоров?
И даже очень неплохо.
>Термин "предсказание переходов" тебе что-нибудь говорит?
Примерно так лет 10 назад с ним ознакомился. При появлении Pentium
>Это как раз и есть попытка изменить стратегию исполнения ассемблерного кода так, чтобы увеличить throughput.Потому что формально любое ветвление обязано приводить к простою конвеера: на ассемблере ясно написано "пока не сравнишь содержимое EAX с EBX, непонятно куда переходить".
Батенька, не морочь людям голову и не путай божий дар с яичницей. Предсказание переходов, конвейер и внутренние регистры — это одно, а время выполнения команды add, взятой самой по себе, от конвейера и предсказания переходов не зависит. А ты обещал выжать что-то из самой add
S>Далее, я тебе открою страшную тайну: реально никаких EAX и EBX в процессоре нету.Есть внутренние регистры, и маппинг "внешних" регистров на внутреннние определяется только в момент исполнения программы. Более того, процессор переупорядочивает команды для обеспечения лучшей производительности. Добро пожаловать в реальный мир, Павел.
Очень сильно похоже на ребенка, который узнал, откуда дети берутся и спешит сообщить своим друзьям по песочнице эту страшную тайну. Поверь, эта тайна — тайна только для тебя, всем остальным она давным-давно известна. В общем, почитай приличное руководство по архитектуре процессора, там есть и другие тайны, о которых можешь тоже всех оповестить
S>Все эти трюки призваны исправить глупости, допущенные программистом ассемблера. Потому, что если бы он был умным, то он бы сам переупорядочил командны так, чтобы обеспечить максимальную микропараллельность. Вот только возможности процессора в этом ограничены.
Ну и ну! Не вдаваясь в суть этого утверждения ( а оно совсем не верно, но объяснять почему просто нет времени), могу лишь сделать вывод — программист на асме глупый, а вот компилятор — умный, он видимо, такое делать не будет. Остается лишь ответить на вопрос, умные ли те, кто писал этот компилятор.
А если серьезнее — почитай про penalty, про конвейеры, про рекомендации Intel, какие команды следует и в каком порядке выполнять, чтобы добиться наилучшего распараллеливания. VTune, наконец, загрузи и запусти, пусть она твою программу оценит. Может, перестанешь после этого нести ахинею насчет априорно глупых программистов на ассемблере.
>>> но у них есть существенные ограничения как по ресурсам, которые можно на это потратить, так и по возможным действиям, которые они могут выполнить.
PD>>Это у процессоров ограничения по действиям, которые они могут выполнить ? Ну , кажется, приехали. У процессоров , значит, ограничения, а вот если на этих процессорах исполнять управляемый код со всеми наворотами, то эти ограничения куда-то исчезают и открываются у процессоров дополнительные возможности, так , что ли ? Ну и ну!
S>Совершенно верно. Для человека, который декларирует стремление к оптимальности, ты последовательно демонстрируешь потрясающую некомпетентность в вопросах оптимизации. На любом, причем, уровне. Поясняю еще раз: у процессора очень маленькое "окно просмотра кода", внутри которого он пытается понять намерения программиста, и обеспечить их выполнение с наилучшей производительностью. У него очень мало прав по внесению изменений в код, т.к. ему неясна семантика.
В огороде бузина, а в Киеве дядька. Никто от процессора и не требует, чтобы он вдруг начал изображать собой твой любимый JIT и пытаться что-то понять. Не его это задача, а задача программиста на ассемблере — писать программу так, чтобы учесть специфику выполнения команд процессором. И не только процессором, кстати, а еще и продумать, как доступ к ОП лучше организовать, чтобы не было проблем с кэшем и т.п.
S>Вот простейший пример: ты пишешь код, вычисляющий сумму целых чисел в массиве. По какой-то причине на каждой итерации цикла ты выполняешь запись в определенную ячейку памяти.
S>Процессору совершенно непонятно, зачем ты это делаешь. То ли ты просто забыл, что можно использовать регистр, то ли есть другой поток, который наблюдает за этой ячейкой. В итоге, процессор честно выполняет обращение к памяти.
А по какой, собственно , причине ты это делаешь (я это не делаю без надобности и про регисты не забываю — про все.). Причин две — либо твое неумение писать на ассемблере как следует, либо volatile. Второе вполне разумно, хотя и странно при сумировании, а если первое — иди учись.
S>Если та же программа написана в терминах языка высокого уровня, типа того же С++, то по ней можно гораздо лучше понять, что именно происходит.
Вот это верно.
S>В частности, например, компилятор может выбрать хранение промежуточных результатов в регистре, потому что это эффективнее.
И грамотный программист тоже. В общем, изобрел ты себе некий образ неграмотного программиста, не умеющего писать как следует на ассемблере и успешно с ним расправился. Бога ради, но какое это отношение к делу имеет ?
S>Далее, если процессор видит вызов в ассемблерном коде, он попытается предсказать переход и накормить конвейер. Но он не может выполнить инлайнинг кода, потому что у него нет такого права. А инлайнинг позволяет массу других оптимизаций. Тебе понятно, что сам по себе инлайнинг требует размеченного кода? Мы вроде уже обсуждали LTCG. Жаль, что ты ничего из этого не запомнил.
Устал я уже отвечать. Резюме твои высказываниям — компилятор умнее человека. Компилятор может такой код соорудить, что человек его соорудить не может. Остается только одно понять — кто же этот компилятор написал — сверхчеловеки ?
А то, что компилятор может сделать код лучше, чем средний программист на ассемблере — вполне мб и верно. Но я-то говорил про идеально написанную программу на ассемблере как некий теоретический предел, как теорему о существовании. А ты это понять не хочешь, а вместо это рассказываешь мне банальные истины под видом страшной тайны для маленьких детей.
S>>>Более того, во многих задачах невозможно заранее предложить оптимальное решение в терминах mov, add, jmp и т.д.
Все ясно. Человек не может, а вот компилятор может. Приехали.
PD>>И зря ты пытаешься доказать, что я это утверждаю. Я лишь одно утверждал — есть некий теоретический предел, им является идеально написанная программа на ассемблере. На любом языке с любыми средствами лучше сделать нельзя. При этом я вовсе не утверждаю, что знаю, как такую программу написать. Это лишь теорема о существовании. Но теорема верная. И из нее вовсе не следует, что программы надо писать на ассемблере.
S>Эта теорема неверна. Попробуй ее доказать
Подумаю, сейчас нет времени.
>>>Просто потому, что еще нет информации о том, в каких условиях будет алгоритм выполняться.
PD>>Если он на нетипичном процессоре или на иной архитектуре может выполняться — я со скрипом, но соглашусь. Потому что не знаю. что там хорошо, а что плохо. (В скобках : если буду знать — не соглашусь)
PD>>Если же речь идет об обычной архитектуре, то не соглашусь. Windows NT-Vista, как тебе известно должно быть, написана так, что кроме HAL, все остальное от архитектуры не зависит. И работает она на x86, x64, а до этого были Alpha, MIPS, Power PC.
S>И почему ты думаешь, что Windows NT — это теоретический предел быстродействия???
>>>Потому, что, к примеру, параллелить на 1 ядре — это гарантированная потеря производительности.
А вот на этот пункт я тебе вчера неверно ответил. Исправляюсь.
Параллелить на одном ядре — это совершенно обычная практика, существующая уже лет так 30-40. Тебе , видимо, просто неизвестны такие понятия как состояния потоков, переходы между этим состояниями, ожидание и т.д. И имея 10 потоков, каждый из которых по своему характеру может работать 10% времени, а 90% должен ожидать, скажем, завершения операции ввода-вывода, можно получить десятикратное (в пределе) ускорение работы при одном ядре. Это все азбучные истины, и их изучают на средних курсах института. Я студентам об этом в спецкурсе рассказываю. Приезжай, послушаешь
Да больше скажу — ты ведь своим высказыванием просто похоронил всю вычислительную технику, начиная с 60-х-70-х годов. Все мультпрограммирование похоронил — оно начиналось, когда о нескольких процессорах и речи не было. Windows похоронил — она внутри себя асинхронна и распараллелена. Зачем ей потоки, если при одном ядре параллелить — это гарантированная потеря производительности ?
Ты уж хоть думай следующий раз, прежде чем такое писать. И почитай хотя бы тут в форумах, это много раз обсуждалось в самых разных аспектах. А то решили — AsParallel и ура, пусть умный компилятор все остальное за нас сделает
S>Павел, это даже смешно. Во-первых, твоя программа тупо делает два прохода: один в последовательном режиме, второй в параллельном.
Ты хоть посмотри на нее как следует и почитай что я написал. Там есть тест без распараллеливания (для сравнения времени только) и тест, когда каждый поток берет себе 1/N работы, гдк N- число процессоров. И в обоих случаях один проход — по всем столбцам окна. Только в параллельном тесте это проход разделен на N частей.
S>Давай ты приведешь ту программу, которая просто старается сделать один проход, но как можно быстрее.
Что быстрее ? Пиксели с окна считывать ?
>В том числе и в зависимости от количества процессоров.
Ну и бери ее. Выкинь кусок без распараллеливаняи и бери второй.
>И мы сразу убедимся, что теоретического предела она не достигает.
Ну и аргументы!. Сначала IT меня подначил, требуя от меня доказать, что я умею писать распараллеливание. А теперь от меня требуют, чтобы этот простенький тест, написанный за 20 минут, выдал прямо-таки теоретический предел. Да еще с GetPixel внутри цикла . И подай мне эту программу, и мы все убедимся, что твоя программа не достигает теоретического предела .
Как, кстати, ты этот предел вычислять собираешься, если не секрет Я готов попробовать доказать теорему о его существовании, а ты готов , видимо, дать прямо-таки методику его вычислкния ? . Давай сюда ее, обсудим
S>Во-вторых, Павел, ты же против лишнего уровня абстракции, так? Давай-ка, приведи код сразу на ассемблере; посмотрим, насколько он порвет высокоабстрактные плюсы.
Это точно! Правильное замечание, с примесью демагогии, конечно, но правильное. Еще надо будет Windows выкинуть, вернуться к MS-DOS, напрямую читать из видеопамяти (думаю, не забыл еще , запретить все прерывания, оптимизировать донельзя код — вот тогда мы и получим этот самый теоретический предел
Забавно с вами спорить, господа (и не с тобой одним). Из кожи лезете вон, готовы всякую чепуху писать, противника в незнании элементарных вещей обвинять, передергивать, демагогией заниматься и т.д. — и все лишь ради одного — доказать, что мой Спартак — это круто, а ваше Динамо никуда не годится. А когда вам говорят — да, есть в Спартаке хорошие игроки, но в Динамо тоже есть — получаем в ответ — Спартак рулез, Динамо маст дай.
Как дети, ей-богу
PD>Со всем этим можно было бы согласиться, если бы процессор мог непосредственно выполнять код на Хаскеле/C#... Тогда я бы снял свои возражения. А пока что, что там не делай, а закончится все mov, add, jmp и т.д. И вот это есть абсолютный теоретический предел при данном алгоритме, если его идеально эффективно запрограммировать. Улучшить можно, только если алгоритм поменять (или доступ к данным ускорить или распараллелить и т.д.).
Вы рассматриваете ассемблер на котором человеку программировать достаточно легко. Поинтересуйтесь программированием цифровых сигнальных процессоров TMS. Там распараллеливание по конвейерам выполняется вручную (архитектура VLIW).
Мне удавалось бороться с C++ компилятором при одновременном выполнении двух итераций цикла. Дальше просто швах. А у него получается до 8 параллельных итераций.
Так что, заявления о ручной ассемблерной оптимизации прокатывают только для морально устаревшей системы команд x86.
Но я оцениваю вероятность такой ситуации близкой к нулю , потому что не встречал написанных революционно проектв типа FFMPEG или openCV или декодер jpeg2000.
M>Если существуют методологии позволяющие очень сильно повысить читабельность, уменьшить к-во, улучшить сопровождение и т.п. Я бы очень хотел об этом подробнее узнать.
См. FP.
M>Но я оцениваю вероятность такой ситуации близкой к нулю , потому что не встречал написанных революционно проектв типа FFMPEG или openCV или декодер jpeg2000.
А как ООП революционно работает для проектов типа FFMPEG или openCV или декодер jpeg2000? Никак? Давайте откажемся от ООП!
IT>Здравствуйте, minorlogic, Вы писали:
M>>Если существуют методологии позволяющие очень сильно повысить читабельность, уменьшить к-во, улучшить сопровождение и т.п. Я бы очень хотел об этом подробнее узнать.
IT>См. FP.
Я читал предыдущий пост пере тем как ответить.
M>>Но я оцениваю вероятность такой ситуации близкой к нулю , потому что не встречал написанных революционно проектв типа FFMPEG или openCV или декодер jpeg2000.
IT>А как ООП революционно работает для проектов типа FFMPEG или openCV или декодер jpeg2000? Никак? Давайте откажемся от ООП!
ОПП просто восхитительно работает , см исходники Jasper или kakadu или JJ2000, это из тех что я точно знаю.
M>>>Если существуют методологии позволяющие очень сильно повысить читабельность, уменьшить к-во, улучшить сопровождение и т.п. Я бы очень хотел об этом подробнее узнать.
IT>>См. FP.
M>Я читал предыдущий пост пере тем как ответить.
Тогда что именно не понятно?
M>>>Но я оцениваю вероятность такой ситуации близкой к нулю , потому что не встречал написанных революционно проектв типа FFMPEG или openCV или декодер jpeg2000.
IT>>А как ООП революционно работает для проектов типа FFMPEG или openCV или декодер jpeg2000? Никак? Давайте откажемся от ООП!
M>ОПП просто восхитительно работает , см исходники Jasper или kakadu или JJ2000, это из тех что я точно знаю.
И что там революционного?
IT>Здравствуйте, minorlogic, Вы писали:
M>>>>Если существуют методологии позволяющие очень сильно повысить читабельность, уменьшить к-во, улучшить сопровождение и т.п. Я бы очень хотел об этом подробнее узнать.
IT>>>См. FP.
M>>Я читал предыдущий пост пере тем как ответить.
IT>Тогда что именно не понятно?
Я не говорил что мне что то непонятно.
M>>>>Но я оцениваю вероятность такой ситуации близкой к нулю , потому что не встречал написанных революционно проектв типа FFMPEG или openCV или декодер jpeg2000.
IT>>>А как ООП революционно работает для проектов типа FFMPEG или openCV или декодер jpeg2000? Никак? Давайте откажемся от ООП!
M>>ОПП просто восхитительно работает , см исходники Jasper или kakadu или JJ2000, это из тех что я точно знаю.
IT>И что там революционного?
Понятия не имею с чего ты взял? на мой взгляд ничего революционного там нет? Я имел ввиду написаноого в революцыонном стиле (FP например) из подобного рода проектов не встречал.
M>>>>>Если существуют методологии позволяющие очень сильно повысить читабельность, уменьшить к-во, улучшить сопровождение и т.п. Я бы очень хотел об этом подробнее узнать.
IT>>>>См. FP.
M>>>Я читал предыдущий пост пере тем как ответить.
IT>>Тогда что именно не понятно?
M>Я не говорил что мне что то непонятно.
Если всё понятно, то о чём тогда хочется подробнее узнать?
M>Понятия не имею с чего ты взял? на мой взгляд ничего революционного там нет? Я имел ввиду написаноого в революцыонном стиле (FP например) из подобного рода проектов не встречал.
Почему тогда от FP хочется именно чего-то революционного?
Почему по твоему мнению , серезные приложения которые я перечислял FFMPEG — JASPER написанны без использования FP ? на традиционных C/C++. ?
M>Если существуют методологии позволяющие очень сильно повысить читабельность, уменьшить к-во, улучшить сопровождение и т.п. Я бы очень хотел об этом подробнее узнать.
Как уже сказали FP и связаные с ним вкусности и сахар.
M>Но я оцениваю вероятность такой ситуации близкой к нулю , потому что не встречал написанных революционно проектв типа FFMPEG или openCV или декодер jpeg2000.
Пока просто нет нужной массовости, но ситуация уже меняется, в общем ждем релиза F# и доведение до ума Scala скорее всего на них появятся первые серъезные приложения. Хотя последние версии Haskell'а тоже радуют.
FR>Пока просто нет нужной массовости, но ситуация уже меняется, в общем ждем релиза F# и доведение до ума Scala скорее всего на них появятся первые серъезные приложения. Хотя последние версии Haskell'а тоже радуют.
А я считаю что дело не в массовости , потому что FFMPEG ядро делают несколько человек. Я уверен, что если бы использование FP дало бы хоть 5% к производительности программы ядро бы уже переписали.
M>А я считаю что дело не в массовости , потому что FFMPEG ядро делают несколько человек. Я уверен, что если бы использование FP дало бы хоть 5% к производительности программы ядро бы уже переписали.
Сейчас эти технологии могут ускорить разработку скажем в полтора-два раза (при сложной логике и побольше) и в эти же полтора-два раза замедлить (тот же Ocaml) работу готового кода.
FR>Здравствуйте, minorlogic, Вы писали:
M>>А я считаю что дело не в массовости , потому что FFMPEG ядро делают несколько человек. Я уверен, что если бы использование FP дало бы хоть 5% к производительности программы ядро бы уже переписали.
FR>Сейчас эти технологии могут ускорить разработку скажем в полтора-два раза (при сложной логике и побольше) и в эти же полтора-два раза замедлить (тот же Ocaml) работу готового кода.
Именно , вот про цену которую придется заплатить за использование FP. Кажется никто и не сказал.
M>Именно , вот про цену которую придется заплатить за использование FP. Кажется никто и не сказал.
Ровно ту же цену приходится платить за любую высокоуровневость, за тот же ООП например. В те же 90ые годы эта цена в очень большом числе случаев была слишком дорогой, сейчас скорее наоборот, но это после 10 — 15 лет развития оптимизиторов и прогресса вычислительной техники.
Никто пока не занимался серъезной оптимизацией (на уровне хороших компиляторов для C++ ) для ФП языков. Но лед уже тронулся так что цена будет дешеветь.
M>Именно , вот про цену которую придется заплатить за использование FP. Кажется никто и не сказал.
Ну и какова будет цена за использование tuples, например, immutable паттерна или pattern matching? Ты видимо не понял смысла основного поста. Там нет призыва переходить на FP и тем более на чистые FP языки. Там высказано желание получить арсенал FP фич в мэйнстрим языках.