Re[38]: Правильная ссылка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 02:15
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?

VD>А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков. Языки вроде Явы и Шарпа обзавелись большей частью фич которые только обсуждались в С++ох. Скажем методы расширения шарпа были тупо стянуты из одного из реквестов еще в 2002.
VD>12 лет — это строк за который человек вырастает. А они не смогли принять какой-то там стандарт.
VD>За это время обсуждение проблем С++ плавно переросла в обсуждение его реальной необходимости и в итоге просто исчезло так как те кто задавались вопросами просто пересели на другие языки.

По-моему, явление по имени "C++" нужно рассматривать в комплексе с такими штуками, как куча производителей, которые реализовывали язык, как заблагорассудится, неторопливой активностью комитета и тем фактом, что некоего единого владельца С++ нет в природе. В отличие от десятков других языков, у которых есть владелец, есть узкий круг лиц, занимающихся развитием и нет "отвязного" комитета. Я не хочу сказать, что второе — плохо, но это главным образом определяет отличия динамики развития C++ от Java, C# и иже с ними.

Так что, как бы там что-то во что-то ни перерастало, и какими бы метафизическими свойствами C++ ни наделялся, но он как раз является плодом объёмного договорного процесса очень разных разработчиков программного обеспечения. "Какой-то там" стандарт можно принимать хоть по десять раз на дню, а такой, что удовлетворит кучу разных участников и принимается не для проформы, вырабатывать, всё же, посложнее. 10-12 лет для таких взаимодействий — не то, что мелочь, а так, цветочек понюхать не успеешь. Хорошо, хоть не разругались. Здесь интересно поведение производителя конкурирующего (якобы) языка. Обрати внимание, Microsoft реализовала стандарт 98-го года только в 2003-м, спустя пять лет после принятия, тогда как нововведения C++0x появились в VS10 CTP до принятия стандарта. С чего бы это MS впереди паровоза понеслась, тогда как раньше относилась к стандарту хорошо, если не наплевательски?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[38]: Addon
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 02:26
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?

VD>А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков.

Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[37]: Работа - с чего начать: С++ или С#?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.05.09 02:42
Оценка:
Здравствуйте, Хвост, Вы писали:

Х>Здравствуйте, VladD2, Вы писали:


VD>>Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов.

Х>ой ли, ты часто передаёшь лямбды после выхода из scope?
Постоянно. При наличии Linq, у которого отложенное выполнение, лямбды в большенстве случаев живут дольше скоупа.

Х>как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага).

Возможность захватывать контекст по ссылке без GC обеспечивает море глюков, а копирование — тормоза. Причем избавиться от того и другого одновременно нельзя.
Боксингом мугать никого не надо, для примитивных типов затраты на боксинг минимальны, а более сложные структуры и так передаются по ссылке.

Х>Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.

Это правда жизни, в С++ — недолямбды, потому что оба варианта, из которых еще надо выбирать, не позволяют решть все задачи, доступные обычным лямбдам.
Re[32]: Работа - с чего начать: С++ или С#?
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.05.09 03:55
Оценка: 2 (1)
Здравствуйте, Mamut, Вы писали:
M>Я имею в виду — что ссылка _ это адрес чего-то, что указатель — это адрес чего-то
Нет-нет-нет, я против. http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[44]: Другой вариант
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 05:03
Оценка: 2 (2)
Здравствуйте, samius, Вы писали:

S>Может как раз тот случай, когда это вешается на разработчика?


Нет, это именно объект.

S>Этот код — это чисто предположение, или компилящийся и выполняющийся?


Судя по всему, предположение не совсем правильное. Перечитал драфт и обсуждения, кажется, должно быть так:

function<double(double)> derivative(function<double(double)> f, double dx) {
  return [=](double x) -> double {
    return (f(x + dx) - f(x)) / dx;
  }
}


И что касается копирований, то тоже, кажется, ясно. По сути, лямбда — это объект, содержащий замкнутые значения. А дальше — как обычно с объектами. Те же ограничения, те же особенности передачи и сохранения параметров по ссылке и по значению, и т.п.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[38]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 05:21
Оценка:
Здравствуйте, gandjustas, Вы писали:

Х>>как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага).

G>Возможность захватывать контекст по ссылке без GC обеспечивает море глюков, а копирование — тормоза. Причем избавиться от того и другого одновременно нельзя.

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

G>Боксингом мугать никого не надо, для примитивных типов затраты на боксинг минимальны, а более сложные структуры и так передаются по ссылке.


Тормозами тоже пугать никого не надо. (<- косность мозга, тузик, тряпка)

Х>>Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.

G>Это правда жизни, в С++ — недолямбды, потому что оба варианта, из которых еще надо выбирать, не позволяют решть все задачи, доступные обычным лямбдам.

Похоже, что ты не прав. Хотя, конечно, никто тебе не запретит называть C++-ные лямбды "недолямбдами".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[39]: Работа - с чего начать: С++ или С#?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.05.09 06:29
Оценка: -1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, gandjustas, Вы писали:


Х>>>как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага).

G>>Возможность захватывать контекст по ссылке без GC обеспечивает море глюков, а копирование — тормоза. Причем избавиться от того и другого одновременно нельзя.

ГВ>Вот это вот очень сильно бабушка надвое сказала. Всегда остаётся возможность оптимизировать передачу захватом по ссылке и одновременным контролем жизненного цикла. Собственно, это обычная техника для C++.

Ага, "контроль жазненного цикла" обычно как делается? shared_ptr или другой подсчет ссылок. Иначе получаете трудноуловимые баги при изменениях.
А shared_ptr — дополнительный оверхед к распределению памяти в куче.
Очень странная ситуация для "языка без оверхедов"

Х>>>Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.

G>>Это правда жизни, в С++ — недолямбды, потому что оба варианта, из которых еще надо выбирать, не позволяют решть все задачи, доступные обычным лямбдам.
ГВ>Похоже, что ты не прав. Хотя, конечно, никто тебе не запретит называть C++-ные лямбды "недолямбдами".
Ну также как другим никто не запретит называть недолямбды С++ (которых пока еще нету) лямбдами.
Re[40]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 06:42
Оценка: :)
Здравствуйте, gandjustas, Вы писали:

G>Ага, "контроль жазненного цикла" обычно как делается? shared_ptr или другой подсчет ссылок. Иначе получаете трудноуловимые баги при изменениях.


Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[41]: Работа - с чего начать: С++ или С#?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.05.09 06:50
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, gandjustas, Вы писали:


G>>Ага, "контроль жазненного цикла" обычно как делается? shared_ptr или другой подсчет ссылок. Иначе получаете трудноуловимые баги при изменениях.


ГВ>Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.


Ну как например?
Re[39]: Работа - с чего начать: С++ или С#?
От: MxKazan Португалия  
Дата: 06.05.09 06:56
Оценка: +1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, gandjustas, Вы писали:


G>>Боксингом мугать никого не надо, для примитивных типов затраты на боксинг минимальны, а более сложные структуры и так передаются по ссылке.

ГВ>Тормозами тоже пугать никого не надо. (<- косность мозга, тузик, тряпка)
Хоспадя, да нет там боксинга. Один ни черта не разбирающийся ляпнул, другой зачем то ответил, третий зацепился...
Re[45]: Другой вариант
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.05.09 11:25
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

S>>Этот код — это чисто предположение, или компилящийся и выполняющийся?


ГВ>Судя по всему, предположение не совсем правильное. Перечитал драфт и обсуждения, кажется, должно быть так:


ГВ>
ГВ>function<double(double)> derivative(function<double(double)> f, double dx) {
ГВ>  return [=](double x) -> double {
ГВ>    return (f(x + dx) - f(x)) / dx;
ГВ>  }
ГВ>}


ГВ>И что касается копирований, то тоже, кажется, ясно. По сути, лямбда — это объект, содержащий замкнутые значения. А дальше — как обычно с объектами. Те же ограничения, те же особенности передачи и сохранения параметров по ссылке и по значению, и т.п.

Невполне ясно.

Поправь меня если ошибаюсь:
согласно моим представлениям, приведенное выше предположение должно быть транслировано во что-то следующее:

class LambdaFunctor {
public:
    LambdaFunctor(function<double(double)> f, double dx) : m_f(f), m_dx(dx) { }
    double operator()(double x) const { return m_f(x + m_dx) - m_f(x)/m_dx; }
private:
    function<double(double)> m_f;
    double m_dx;
};

function<double(double)> derivative(function<double(double)> f, double dx) {
  return LambdaFunctor(f, dx);
  }
}

Разве возвращается не обертка над объектом на стеке? Копирования я тут не вижу. А даже если бы оно было, разве обертка управляет временем жизни того, что она обертывает? (Кстати, эта обертка — аналог boost-овской?)
Re[38]: Работа - с чего начать: С++ или С#?
От: CreatorCray  
Дата: 06.05.09 12:36
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

VD>Ага. Причем юмор начинается со слов "лямбды в с++" ибо на сегодня в С++ нет даже тех недолямбд которые описаны в С++ох (читать как си-плюс-плюс ох).

Ну в С++0х они есть. Компилеры с лямбдами тоже есть (ICC).
Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[43]: Работа - с чего начать: С++ или С#?
От: CreatorCray  
Дата: 06.05.09 12:36
Оценка: 4 (2)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.


Может вот это (документация к ICC) поможет:

Lambda Function Object

The compiler creates an anonymous function object upon evaluating a lambda expression.
This function object, created by a lambda expression, may live longer than the block in which it is created. You must ensure that it does not use variables that were destroyed before the function object is used.
The following example shows how a function object created by a lambda expression can outlive the function that creates it.

struct Base {
    virtual bool test(int x) = 0;
};
template<typename F>
struct Derived: Base {
    F f;
    bool test(int x) {return f(x);}
    Derived(F f_) : f(f_) {}
};
template<typename F>
Base* MakeDerived( F f ) {
    return new Derived<F>(f);
}
Base* Foo( int k ) {
    return MakeDerived( [k](int x) {return x%k==3;} );
}
bool Bar() {
    Base* b = Foo(3);
    return b->test(6);
}

In the above example, Bar invokes Foo, which copies the function object generated by a lambda expression into an instance of template class Derived. The lambda expression refers to a local variable k. Although the code destroys k before using the copied function object, the code is safe because k was captured by copy.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[40]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 13:38
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>Хоспадя, да нет там боксинга. Один ни черта не разбирающийся ляпнул, другой зачем то ответил, третий зацепился...


...короче говоря, на форуме КСВ было скучно и тихо.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[42]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 13:39
Оценка:
Здравствуйте, gandjustas, Вы писали:

ГВ>>Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.


G>Ну как например?


Есть ещё совсем ничего не подсчитывающий auto_ptr. Как минимум.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[46]: Другой вариант
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 13:53
Оценка:
Здравствуйте, samius, Вы писали:

ГВ>>И что касается копирований, то тоже, кажется, ясно. По сути, лямбда — это объект, содержащий замкнутые значения. А дальше — как обычно с объектами. Те же ограничения, те же особенности передачи и сохранения параметров по ссылке и по значению, и т.п.

S>Невполне ясно.

S>Поправь меня если ошибаюсь:

S>согласно моим представлениям, приведенное выше предположение должно быть транслировано во что-то следующее:

S>
S>class LambdaFunctor {
S>public:
S>    LambdaFunctor(function<double(double)> f, double dx) : m_f(f), m_dx(dx) { }
S>    double operator()(double x) const { return m_f(x + m_dx) - m_f(x)/m_dx; }
S>private:
S>    function<double(double)> m_f;
S>    double m_dx;
S>};

S>function<double(double)> derivative(function<double(double)> f, double dx) {
S>  return LambdaFunctor(f, dx);
S>  }
S>}
S>


ИМХО, похоже.

S>Разве возвращается не обертка над объектом на стеке?


Нет, это не обёртка над стеком: m_f, m_dx — собственные члены объекта.

S>Копирования я тут не вижу.


1. В конструкторе: "m_f(f), m_dx(dx)" — это копирования аргумента и указателя на функцию.
2. Неявно сгенерированный конструктор копирования: LambdaFunctor(const LambdaFunctor &). Если какая-то функция вернёт LambdaFunctor (например, как делает derivative: return LambdaFunctor(f, dx)), то вызван будет как раз этот конструктор копирования.

S>А даже если бы оно было, разве обертка управляет временем жизни того, что она обертывает?


Повторюсь, это не обёртка.

S>Кстати, эта обертка — аналог boost-овской?


Скорее, это обычный функтор. boost-овые лямбды сильно посложнее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[39]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 14:38
Оценка: 1 (1)
Здравствуйте, CreatorCray, Вы писали:

CC>Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.


Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[40]: Работа - с чего начать: С++ или С#?
От: criosray  
Дата: 06.05.09 14:50
Оценка: -1
Здравствуйте, Геннадий Васильев, Вы писали:

CC>>Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.


ГВ>Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.


Это то о чем Вам говорил Влад. Лямбды С++ — неудобные недолямбды. Потому ими и не пользуются.
Re[39]: Addon
От: criosray  
Дата: 06.05.09 14:52
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?

VD>>А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков.

ГВ>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами.


Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это...
Re[39]: Правильная ссылка
От: criosray  
Дата: 06.05.09 14:55
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>По-моему, явление по имени "C++" нужно рассматривать в комплексе с такими штуками, как куча производителей, которые реализовывали язык, как заблагорассудится, неторопливой активностью комитета и тем фактом, что некоего единого владельца С++ нет в природе. В отличие от десятков других языков, у которых есть владелец, есть узкий круг лиц, занимающихся развитием и нет "отвязного" комитета. Я не хочу сказать, что второе — плохо, но это главным образом определяет отличия динамики развития C++ от Java, C# и иже с ними.


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

ГВ>Так что, как бы там что-то во что-то ни перерастало, и какими бы метафизическими свойствами C++ ни наделялся, но он как раз является плодом объёмного договорного процесса очень разных разработчиков программного обеспечения. "Какой-то там" стандарт можно принимать хоть по десять раз на дню, а такой, что удовлетворит кучу разных участников и принимается не для проформы, вырабатывать, всё же, посложнее. 10-12 лет для таких взаимодействий — не то, что мелочь, а так, цветочек понюхать не успеешь.


Ой, ну может хватит чушь молоть-то? 10-12 лет это МОРЕ времени. Посмотрите на С# и Nemerle, которых 12 лет тому назад еще и в планах не было.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.