Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Ещё раз, медленно: Найк, вроде бы, со мной согласен.
Еще раз, медленно — он может быть миллион раз с тобой согласен, но это никак не обесценивает приведенные им примеры и не делает эти примеры построением протокола обмена данными.
Ну поделитесь с нами грешными примером кода, где программа на С++ на лету во время исполнения генерирует полностью новый класс с методами и полями по переданной ей из текстового файла спецификации.
c> ГВ>Понятно. Значит, я придумал цитату из твоего собственного постинга. А сам твой постинг мне привиделся.
c> Ваши тупые попытки троллинга откровенно утомили. В моем посте ничего не сказано про то, что генерируемый код не должен удовлетворять определенному контракту.
И наоборот, там нигде не говорится, что он должен каком-уто контракту соответствовать
S>public static void EpicFail(HugeBitmap bmp)
S>{
S> RefCounter<HugeBitmap> c;
S> using(var a = new RefCounter<HugeBitmap>(bmp)); // bmp.refCount++;
S> {
S> var b = new RefCounter(a); // bmp.refCount++
S> c = a; // oops... вот в этот момент С++ инкрементирует указатель. С# - нет.
S> b.Dispose(); //bmp.refCount--
S> } // bmp.refCount-- => bmp.Release()
S> c.Reference.Draw(); // InvalidOperationException!
S>}
S>
Я чего-то не понимаю, на кой вообще битмапу(который, по сути, тупо массив байт, вполне себе менеджед, а значит, подвластен GC(или в шарпе это не так? Я только про джаву знаю достоверно)) Release? Не нужен — просто обнуляешь все ссылки на него, пусть сборщик сам разбирается, он прекрасно увидит, что есть крупный массив байт, и на него нету ссылок ни у одного из потоков, и соберет его, когда память начнет кончаться. Зачем вообще эти пляски с бубном?
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Геннадий Васильев, Вы писали: ГВ>>Ответь мне на один наводящий вопрос: а что дальше делать с этой сгенерированной и полностью новой структурой? S>Ну хорошо. Пусть это будет не совсем новая структура. S>Пусть это будет, скажем, наследник некоего известного интерфейса. Впрочем, нет — этого нам недостаточно. Потребуется еще какая-то функция со стандартной сигнатурой. S>Скажем, S>
S>IStandardObject factory()
S>
S>Насколько практично порождать новый код такого рода на С++? К примеру, если у меня есть регулярное выражение — сколько вызовов Match() на нескомпилированном выражении скомпенсируют стоимость компиляции выражения? Тысяча? Миллион?
А насколько практичен в этом отношении Reflection.Emit?
Решил я вмешаться в эту дискуссию, но немного с другой стороны. Статью не читал и не буду — что там может быть, и так представляю, а почитав дискуссию, представляю вполне.
Я другой вопрос хочу задать. Ладно, не любите С++ — имеете право. Ладно, у C#/Java что-то такое есть, чего там нет — вполне возможно.
А вот что не ладно — какие альтернативы С++ можете предложить в ЕГО НИШЕ ? Вот представьте себе — исчез он. Чем замените ?
Тем, кому тут же хочется выдвинуть Java или C# — даю сразу полный отлуп. Я говорю только о той нише, где используется ИСКЛЮЧИТЕЛЬНО компилированный код, без всяких JIT и прочих огромных рантаймов.
Паскаль вроде как собирается приказать долго жить. Модула давно приказала. Ада толком так и не родилась.
Фортран ?
Нет ему замены, господа. Да, он мог бы быть и получше, но что хотеть от языка, который пережил несколько серьезных ревизий, да еще и сам был сделан на принципах совместимости с С.
И если при этих тяжелых наследственных заболеваниях он все же выжил, и не только выжил, но является становым хребтом ИТ — жить ему долго!
А есть в нем property или нет, и как там с сериализацией — господи, какие мелочи и пустяки!
Здравствуйте, Eugeny__, Вы писали:
E__>Я чего-то не понимаю, на кой вообще битмапу(который, по сути, тупо массив байт, вполне себе менеджед, а значит, подвластен GC(или в шарпе это не так? Я только про джаву знаю достоверно)) Release? Не нужен — просто обнуляешь все ссылки на него, пусть сборщик сам разбирается, он прекрасно увидит, что есть крупный массив байт, и на него нету ссылок ни у одного из потоков, и соберет его, когда память начнет кончаться. Зачем вообще эти пляски с бубном?
Ключевое выделено. Парням из банды С++ хочется, чтобы объект собрался не когда память начнет кончаться, а именно когда не будет ссылок. И еще такой момент: текущая реализации битмапа в Windows Forms — это таки нативный хэндл ОС, в котором GC не властен.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А вот что не ладно — какие альтернативы С++ можете предложить в ЕГО НИШЕ ? Вот представьте себе — исчез он. Чем замените ?
Исчезать не нуна. Никто и не призывает вроде. Низкоуровневые детали его удел. Вот в WPF прослойка нативная, исполняющая команды отрисовки и меня это нисколечки не смущает.
PD>Тем, кому тут же хочется выдвинуть Java или C# — даю сразу полный отлуп. Я говорю только о той нише, где используется ИСКЛЮЧИТЕЛЬНО компилированный код, без всяких JIT и прочих огромных рантаймов.
Конкретнее, что за ниша?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Статью не читал
И правильно сделал. Бог с ними, с притянутыми за уши кривостями и ламеризмами типа «шаблоны — это те же макросы». Но такое обилие дурацких смайликов, инфантильных серийных восклицательных знаков и полное пренебрежения правилами типографики — это не «статья», а так, пост в жэжэшечке. Ну или на narod.ru, ага. Серьёзно относиться к такого рода писулькам — много им чести.
PD>Вот представьте себе — исчез он. Чем замените ?
Если бы это сборище костылей с 1K-страничным стандартом исчезло, это послужило бы толчком к появлению и развитию более удачных низкоуровневых языков. Современные компиляторы с C++ выдают эффективный код не благодаря языку C++, а вопреки. Создать компилятор C++ чрезвычайно трудно, причём это не столько объективная трудность, сколько борьба с тёмными углами языка.
Здравствуйте, Константин Б., Вы писали: КБ>А насколько практичен в этом отношении Reflection.Emit?
Ну... На моей тачке регексы компиляются со скоростью около 1E-5 секунды на символ.
То есть для типичных регекспов длиной в сотню символов речь идет об 1й миллисекунде задержки.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Qbit86, Вы писали:
Q>Если бы это сборище костылей с 1K-страничным стандартом исчезло, это послужило бы толчком к появлению и развитию более удачных низкоуровневых языков. Современные компиляторы с C++ выдают эффективный код не благодаря языку C++, а вопреки. Создать компилятор C++ чрезвычайно трудно, причём это не столько объективная трудность, сколько борьба с тёмными углами языка.
Что-то в этой мвсли есть, но если бы такой язык был нужен, он бы ВЫТЕСНИЛ С++. Как в свое время вытеснили Фортран
Здравствуйте, MxKazan, Вы писали:
PD>>Тем, кому тут же хочется выдвинуть Java или C# — даю сразу полный отлуп. Я говорю только о той нише, где используется ИСКЛЮЧИТЕЛЬНО компилированный код, без всяких JIT и прочих огромных рантаймов. MK>Конкретнее, что за ниша?
Операционные системы, драйверы, утилиты. (только ради бога не надо про Сингуларити)
Десктопное ПО с существенными требованиями по быстродействию (граф. редакторы, серьезные текстовые редакторы, системы автоматизации проектироваия,системы распознавания образов разного рода).
ПО с серьезными расчетами.
Это то,что первым в голову пришло. Подумать — можно еще добавить.
Здравствуйте, MxKazan, Вы писали:
MK>Ключевое выделено. Парням из банды С++ хочется, чтобы объект собрался не когда память начнет кончаться, а именно когда не будет ссылок. И еще такой момент: текущая реализации битмапа в Windows Forms — это таки нативный хэндл ОС, в котором GC не властен.
Да и вообще, а вдруг он в видеопамяти живёт? Или прога не битмапами управляет а кудовыми заданиями на рассчёт, например?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, COFF, Вы писали:
COF>По моему, если бы был язык, который поддерживает и сборку мусора и детерминированное освобождение ресурсов, то я бы первый сказал, что этот язык может быть лучше чем C++, а сейчас я могу только повторить, что они разные
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Qbit86, Вы писали:
PD>>Вот представьте себе — исчез он. Чем замените ?
Q>Если бы это сборище костылей с 1K-страничным стандартом исчезло, это послужило бы толчком к появлению и развитию более удачных низкоуровневых языков. Современные компиляторы с C++ выдают эффективный код не благодаря языку C++, а вопреки. Создать компилятор C++ чрезвычайно трудно, причём это не столько объективная трудность, сколько борьба с тёмными углами языка.
Я согласен, что C++ не самый легкий и прямой язык. Но с другой стороны, все это вызвано вполне естественными причинами. Начни разрабатывать подобный язык с нуля, то в итоге либо C++ и получится (так как скажем копирование объекта из одного места в памяти так и останется копированием, соответственно срезка никуда не денется, ну и так далее по всем проблемным местам), либо он будет красивый и стройный, но абсолютно неприменимый в реальных проектах. Сила (и слабость) C++ в том, что он результат более чем тридцатилетней эволюции (если и C тоже считать). Посмотрим во что через двадцать лет превратится C#
Здравствуйте, Sinclair, Вы писали:
S>Когда у тебя в руках молоток — всё кажется гвоздями. Когда С++ — всё кажется классами. Оказывается, не обязательно быть классом для того, чтобы успешно работать.
Добавим тривиальное усложнение в функцию управления Enabled:
// Где-то в недрах:if (bOK) { ... }
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: А я вот, например жену люблю, а к языкам равнодушен ;
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А вот что не ладно — какие альтернативы С++ можете предложить в ЕГО НИШЕ ? Вот представьте себе — исчез он. Чем замените ? PD>Тем, кому тут же хочется выдвинуть Java или C# — даю сразу полный отлуп. Я говорю только о той нише, где используется ИСКЛЮЧИТЕЛЬНО компилированный код, без всяких JIT и прочих огромных рантаймов.
Ну замена есть, и она никуда не девалась -- это собственно С. Может быть С с каким-то другими объектными расширениями. Например Objective-C... (типа всё умное в проекте пишем с объектами, а всё быстрое на чистом С)...
Но оно на самом деле-то понятно, что предмета для спора нет. И что у каждого языка есть своя ниша. И определяется она не умозрительными всякими "достоинствами", а кучей практических соображений... Вот то же D так и не пошёл, например...
А так, да, ХиндиС -- гениальное, IMHO, изобретений. Круче VB даже. Для случая "педалить код быстро-быстро, так как готово должно быть уже вчера" -- это самое то. Тут C++ просто сливает со страшной неодолимой силой.
А написать что-то такое сложно-умное, много насилующее память и процессор, то тут уже ХиндиС не тянет. Можно, конечно всякими ужимками и наймом супер-профи противиться очевидному и в том и в другом случае, но это тупо НЕ ВЫГОДНО...
Да, кстати, я не хочу сказать, что есть только два указанных полюса ("быстропедальный" код vs многосчитающий), полюсов на самом деле много, они все в разной степени важны и нужны, но в целом более или менее одинаково почётны. Эти два я привёл просто для примера...
Вывод:
Нет смысла спорить о том, что круче -- шаблоны или свойства. Надо спорить о том, какие программисты более настоящие? Системные или вычислительные? Энтерпрайз или ретейл и т. д...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, MxKazan, Вы писали:
MK>>Ключевое выделено. Парням из банды С++ хочется, чтобы объект собрался не когда память начнет кончаться, а именно когда не будет ссылок. И еще такой момент: текущая реализации битмапа в Windows Forms — это таки нативный хэндл ОС, в котором GC не властен. E>Да и вообще, а вдруг он в видеопамяти живёт? Или прога не битмапами управляет а кудовыми заданиями на рассчёт, например?
Это к чему?
Здравствуйте, COFF, Вы писали:
COF>Но с другой стороны, все это вызвано вполне естественными причинами.
Я бы предпочёл, чтобы в разработке языка обошлась без «естественных причин» типа совместимости с Си на уровне исходных кодов.
COF>Начни разрабатывать подобный язык с нуля, то в итоге либо C++ и получится
Голословное заблуждение.
COF>Сила (и слабость) C++ в том, что он результат более чем тридцатилетней эволюции (если и C тоже считать).
О какой эволюции может идти речь по отношению к языку, стандарт которого законсервирован на десяток лет? (Предупреждая возможные вопросы — да, я читал «D&E» Страуструпа.) Только сейчас в нём начинают появляться языковые средства (которым, по сути, сто лет в обед), которые уже давно стали нормой для современных ЯП. И ещё не скоро эти нововведения войдут в обиход (учитывая консервативность адептов).
COF>Посмотрим во что через двадцать лет превратится C# :)
Через двадцать лет он скорее всего благополучно преставится, и никто не станет по нему особо сокрушаться. Потому что на смену придут более удачные и удобные инструменты.
var bOk = new StoredProperty<bool>(false);
var bCancel = new StoredProperty<bool>(true);
someCondition = true; // Это упрощение - я имею в виду, что мы привели тестовое окружение в состояние,
// когда внутреннее условие someCondition станет true.
ManageEnabled(bOk, bCancel);
Boilerplate:
public interface IReadProperty<T>
{
T Value { get; }
}
public interface IWriteProperty<T>
{
T Value { set; }
}
public interface IProperty<T> : IReadProperty<T>, IWriteProperty<T>
{
}
public class CustomProperty<T> : IProperty<T>
{
private Func<T> _get;
private Action<T> _set;
public CustomProperty(Func<T> get, Action<T> set)
{
_get = get;
_set = set;
}
public T Value
{
get { return _get(); }
set { _set(value); }
}
}
public class StoredProperty<T> : IProperty<T>
{
private T _value;
public StoredProperty(T value)
{
_value = value;
}
public T Value
{
get { return _value; }
set { _value = value; }
}
}
public class ReflectionProperty<T> : CustomProperty<T>
{
public ReflectionProperty(object obj, string propName)
: base(GetGetter(obj, propName), GetSetter(obj, propName))
{
}
private static Action<T> GetSetter(object obj, string propName)
{
var pi = obj.GetType().GetProperty(propName);
if (pi.PropertyType != typeof(T))
throw new InvalidOperationException("Incorrect property type");
return (Action<T>)Delegate.CreateDelegate(typeof(Action<T>), obj, pi.GetSetMethod());
}
private static Func<T> GetGetter(object obj, string propName)
{
var pi = obj.GetType().GetProperty(propName);
if (pi.PropertyType != typeof(T))
throw new InvalidOperationException("Incorrect property type");
return (Func<T>)Delegate.CreateDelegate(typeof(Func<T>), obj, pi.GetGetMethod());
}
}
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.