Re[4]: В C# уже и так многое добавили
От: k0st1x Марс  
Дата: 13.03.13 17:02
Оценка:
Здравствуйте, sgrape, Вы писали:

S>Как джит поможет превратить вот это:


S>
S>            list.ForEach((item) =>
S>                {
S>                    item.SetValue(1);
S>                });

S>


S>например в это:


S>
S>            for (int i = 0; i < list._array.Length; i++)
S>            {
S>                list._array[i]._value = 1;
S>            }

S>


S>последовательно совершив инлайнинг лямбды внутрь ForEach, затем превратив ForEach в for, вытащив массив изнутри списка и выкинув проверки на границы массива в индексаторе?

S>А ведь это только одна из элементарных оптимизаций, которые хотелось бы видеть в дотнете.

я против "инлайнинга из коробки".
лично мне важно, чтобы stack trace совпадал с исходниками
Re[4]: В C# уже и так многое добавили
От: Jack128  
Дата: 13.03.13 19:31
Оценка:
Здравствуйте, sgrape, Вы писали:

К слову, где то слышал, что ngen и jit оптимизируют абсолютно одинаково. это так??
Re[5]: В C# уже и так многое добавили
От: AlexRK  
Дата: 13.03.13 19:59
Оценка:
Здравствуйте, k0st1x, Вы писали:

K>я против "инлайнинга из коробки".

K>лично мне важно, чтобы stack trace совпадал с исходниками

Для этого давно придуманы debug и release.
Re[4]: Что нужно добавить в C#?
От: Аноним  
Дата: 13.03.13 21:02
Оценка:
HL>Как насчёт 0x синтакса
Кстати да. Реализовать поддержку Int128, и не понадобится в языке изобретать ничего нового.
Re[10]: Что нужно добавить в C#?
От: Ziaw Россия  
Дата: 14.03.13 12:47
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Для того чтобы разумно работать с объединением тебе в любом случае нужно состояние. В том или ином виде.


Мне нужно, но я могу сам выбирать, где и как его хранить. Может я его в один бит умещу, а может буду хранить отдельно диапазоны с одним состоянием для массива объединений.
Re[6]: Что нужно добавить в C#?
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 15.03.13 20:28
Оценка: +1
Здравствуйте, agat50, Вы писали:

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


A>>Зачем Майкрософту рубить сук, на котором он сидит?

A>>Компания зарабатывает деньги не на продаже .NET, а на продаже операционной системы Windows. .NET — это средство для облегчения создания программ под Windows сторонним производителям, а не способ облегчить перенос этих программ на другие платформы.
A>>Именно поэтому компания поддерживает платформу Mono ровно настолько, чтобы её не обвинили в монополизме, и ни на грамм больше.

A>Спасибо кэп, открыли глаза Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды. Как отдельный продукт. Ну естественно по другим ценам, но по 10 баксов за лицензию бессрочную на систему можно было бы за него платить. Ну а с виндой вроде как бесплатно бы шёл. Как это сделать вопрос второй. В принципе да, особых надежд не питаю. Если бы было бесплатно, то это скорее уже была бы java с её недостатками из-за отсутствия централизации.

Видимо, открыл не до конца
Windows & Office — это две cash cows компании. Наибольший доход от их продажи компания получает не из розничных продаж, а от всяких DELL/HP/ACER/etc., которые предустанавливают этих дойных коров на продаваемые компы.
Отношение количества девелоперов в мире к количеству остальных юзеров, я думаю, даже не в сотни раз. Поэтому предустанавливать Visual Studio или даже .NET SDK на все компы смысла ноль — затраты не отобъёшь.
Если компания сделает средство разработки многоплатформенным среди не своих платформ, то тем самым она своими собственными руками выпилит сук, на которых сидит — заложит основу для перевода пользователей на нругие платформы. И вот представьте: за средство разработки денег больших не поднять, а платформа больше не приносит того огромного бабла. А виноват в этом тот, кто решил "дать людЯм свободу, равенство и братство" в выборе платформы для разработки.
Respectfully,
Alexander Fedin.
Re[7]: Что нужно добавить в C#?
От: agat50  
Дата: 16.03.13 10:27
Оценка:
Здравствуйте, alexanderfedin, Вы писали:

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


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


A>>>Зачем Майкрософту рубить сук, на котором он сидит?

A>>>Компания зарабатывает деньги не на продаже .NET, а на продаже операционной системы Windows. .NET — это средство для облегчения создания программ под Windows сторонним производителям, а не способ облегчить перенос этих программ на другие платформы.
A>>>Именно поэтому компания поддерживает платформу Mono ровно настолько, чтобы её не обвинили в монополизме, и ни на грамм больше.

A>>Спасибо кэп, открыли глаза Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды. Как отдельный продукт. Ну естественно по другим ценам, но по 10 баксов за лицензию бессрочную на систему можно было бы за него платить. Ну а с виндой вроде как бесплатно бы шёл. Как это сделать вопрос второй. В принципе да, особых надежд не питаю. Если бы было бесплатно, то это скорее уже была бы java с её недостатками из-за отсутствия централизации.

A>Видимо, открыл не до конца
A>Windows & Office — это две cash cows компании. Наибольший доход от их продажи компания получает не из розничных продаж, а от всяких DELL/HP/ACER/etc., которые предустанавливают этих дойных коров на продаваемые компы.
A>Отношение количества девелоперов в мире к количеству остальных юзеров, я думаю, даже не в сотни раз. Поэтому предустанавливать Visual Studio или даже .NET SDK на все компы смысла ноль — затраты не отобъёшь.
A>Если компания сделает средство разработки многоплатформенным среди не своих платформ, то тем самым она своими собственными руками выпилит сук, на которых сидит — заложит основу для перевода пользователей на нругие платформы. И вот представьте: за средство разработки денег больших не поднять, а платформа больше не приносит того огромного бабла. А виноват в этом тот, кто решил "дать людЯм свободу, равенство и братство" в выборе платформы для разработки.


Намёк понятен?

Причём тут средство разработки, я не предлагаю сделать студию портируемой, только CLR с классами. Как и sql server, axapta, directx и т.п. Пусть они останутся привязаны к винде, нет вопросов. Но имхо dotnet весьма страдает как серверная платформа из-за ограничений этих, ну не могу я на 5 виртуалок винду лицензии поставить. Не говоря про отсутствие лёгких дистрибутивов винды типа ubuntu server. Вообще забейте, надо будет, с моно разберусь конечно.
Re: Что нужно добавить в C#?
От: Аноним  
Дата: 01.04.13 11:31
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Что бы можно было написать так.

 public static implicit operator IEnumerable<MyOperator<T>>(IEnumerable<T> src)
        {
            return src.Select(a => MyOperator<T>.Create(a));
        }

и не получить
User-defined conversion must convert to or from the enclosing type
Re[2]: Что нужно добавить в C#?
От: Аноним  
Дата: 01.04.13 11:45
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>Что бы можно было написать так.


хотя бы внутри

public class MyOperator<T>
    {
Re[4]: Что нужно добавить в C#?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 04.04.13 16:37
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Ну, это как сказать. С одной стороны да. С другой стороны, CLR — это в первую очередь C#, так же как JVM это в первую очередь Java. Они неразрывно связанны и обсуждение одного в отрыве от второго бессмысленно.


Наличие Mono как бы намекает, что вы ерунду говорите
[КУ] оккупировала армия.
Re[10]: Что нужно добавить в C#?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 04.04.13 17:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Бывают такие юнионы, которые содержат в себе флаг, указывающий в каком они состоянии.

WH>Я такими каждый день пользуюсь.
Это неправильные юнионы. Правильные — это по сути reinterpret_cast<> из C++.
[КУ] оккупировала армия.
Re[9]: В C# уже и так многое добавили
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 04.04.13 17:32
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Защита от вирусов.


Странная какая-то защита. Просто запустить экзешник можно, а вот отngen'ить и потом результат запустить — нельзя...
[КУ] оккупировала армия.
Re[3]: Что нужно добавить в C#?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 04.04.13 17:38
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Это возможно реализовать только с изменением рантайма, сам язык для поддержки интринзиков менять не нужно. В Mono такое сделали, но я даже не уверен что этим API кто-либо пользуется.

Однозначно в рантайме. Иначе маршаллинг съест нафиг всё преимущество параллельного вычисления.
[КУ] оккупировала армия.
Re[10]: В C# уже и так многое добавили
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.04.13 08:48
Оценка:
Здравствуйте, koandrew, Вы писали:

AVK>>Защита от вирусов.

K>Странная какая-то защита. Просто запустить экзешник можно, а вот отngen'ить и потом результат запустить — нельзя...

Просто ехешник это IL код, который при генерации нативного кода верифицируется. А вот кеш ngen при запуске уже никто не верифицирует.
... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
AVK Blog
Re[11]: В C# уже и так многое добавили
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 05.04.13 09:48
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Просто ехешник это IL код, который при генерации нативного кода верифицируется. А вот кеш ngen при запуске уже никто не верифицирует.


Ngen же вроде верифицирует код...
[КУ] оккупировала армия.
Re: Что нужно добавить в C#?
От: Аноним  
Дата: 05.04.13 11:54
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам. Желательно раскрыть мысль поподробнее.

...

исправить наконец компилятор и сделать using abort безопасными. что бы в случае остановки потока abort-ом ресурсы гарантированно освобождались.
 
using(var res=CreateSomeResource()) {
  // сечас компилятор генерит такой код что возможно вызвать Abort для потока и ресурсу не будет вызван Dispose();
}


сделать префиксы по умолчанию что бы короче писать
class A {
static public [dllimport(.....)] [SomeAttr] ... {
  void fn1() {}
  void fn2() {}
}
или во
#prefixregion static public [Attr1] [Attr2] ...
...
#endregion
}


из тойже оперы. чтобы можно было не уразывать каждый раз название enum
enum Bits { B0=1,B1=2,B2=4,B3=8 };
...
int r1=(int)( Bits.B0 | Bits.B1 | Bits.B2 | Bits.B3);
int r2=(int) using(Bits) B0|B1|B2;
...
void fn(Bits bits) {...}
...
fn(using(Bits) B0|B1|B2|B3);
или чтоб по умолчанию так было
fn( B0|B1|B2|B3 );


задание поведения при невозможности вычисления выражения (не только null exception но и например пропускать код)
по принципу isset из php: isset( $a[1][2][3][4][5][6][7][8] )
  Action a1;
  if (a1!=null) a1();

  Action<string> trace
  if (trace!=null) trace( prepare_string_for_trace() );

  if (a!=null && a.b!=null && a.b.c!=null && a.b.c.d!=null) a.b.c.d( retrive_some_args() );

  // что бы было примерно так
  call a1();
  call trace( prepare_string_for_trace );
  call a.b.c.d( retrive_some_args() );


подстановка кода например
  bool enable=true;
  after_each_line(enable, source_file => trace( "{0}:{1}", source_file.Name, source_file.Line ), ()=> {
     fn1();
     fn2();
     fn3();
     fn4();
  });
  ...
  bool enable=true;
  Action<SourceFile> fn=!enable ? null : source_file => trace( "{0}:{1}", source_file.Name, source_file.Line);
  fn1(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=100, ... });
  fn2(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=101, ... });
  fn3(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=102, ... });
  fn4(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=103, ... });


сделать обытия для свойств помимо get_ set_ методов еще event_ событие было по изменению
...
public int value=5 { get;set;modify; }
...
value.modify+=()=>{ ... };
или так
onchange(value)+=()=> {...};


иногда хочется вот такой вот порнографии
for(int a=0;i<N;++a) {
case first: {}
case last: {}
case odd: {}
case even: {}
case enter: {}
case leave: {}
case if (a%3==2) {}
// every step
}
...
foreach(var it in list) {
case first: {}
case last: {}
case odd: {}
case even: {}
case enter: {}
case leave: {}
case if (cond(it)) {}
// ordinary
}


Не хватает такого синтаксиса в определения методов класса
class A {
   public event void dyn_fn(object prm) { ... }
}
...
class A {
   Action<object> dyn_fn=dyn_fn_default;
   void dyn_fn_default(object prm) { ... }
}


Дозадание функций (регулярных выражений не прошу)
class A {
  void fn(int x) switch;
  void fn(int x) case x=0 { ... }
  void fn(int x) case (x>10 && x<100) { ... }
  void fn(int x) case default { ... }
}
class B : public A {
  void fn(int x) case (x>200 && x<214) { ... }
}


Динамический switch
   class A {
     public switch cases;
     void fn(int cmd) {
        switch(cases(cmd)) {
          case 0: { ... } break;
          case 1: { ... } break;
          default: { ... } break;
        }
     }
   }
   class B : public A {
     void fn(int cmd) {
        switch(cases(cmd)) {
          case 2: { ... } break;
          case 3: { ... } break;
        }
     }
   }
   ...
   var b=new B();
   b.cases.add(4, cmd=> { ... });
   b.cases.add(5, cmd=> { ... });


Очень не хватает контекста для функций и свойств
   class A {
     public static void fn(string msg) { var ctx=ThreadContext::GetCurrentThreadContext(); var recorder=ctx.Resolve<IRecorder>();  recorder.Record(msg); }
     int x;
     public int X { 
       get { 
         #if AUTOMATIC_DEBUG
         var ctx=ThreadContext::GetCurrentThreadContext(); var bp=ctx.Resolve<IBreakPoints>(); 
         bp.NotifyReadAccess(this,"A.get_X",x)
         #endif
         return x; 
       } 
       set { 
         #if AUTOMATIC_DEBUG
         var ctx=ThreadContext::GetCurrentThreadContext(); var bp=ctx.Resolve<IBreakPoints>(); 
         bp.NotifyWriteAccess(this,"A.set_X",value);
         #endif
         x=value;
       }
   }


Не хватает простой авто генерации кода
  interface A {
    void f1(int x,int y);
    string f2(int x,int y,param object[] args);
    int X { get;set; }
    ...
  }
  class AWrapper : public A() {
    public A a;
    public void f1(int x,int y) { a.f1(x,y); }
    public string f2(int x,int y,param object[] args) { return a.f2(x,y,args); };
    public int X { get { return a.X; } set { a.X=value; } }
    ...
  }

Вобщем нехватает макросов как так чтоб можно было генерить исходный текст параметрически.
Re[12]: В C# уже и так многое добавили
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.04.13 14:01
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Ngen же вроде верифицирует код...


Ngen то верифицирует, но результат потом сохраняет на диске. И если потом неадмину этот результат позволено будет подправить, то потом, при запуске сборки в том числе и из под админских привелегий можно будет подсунуть собственный код. Поэтому модификация кеша ngen должна быть строго с админскими привилегиями.
... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: Что нужно добавить в C#?
От: matumba  
Дата: 05.04.13 20:44
Оценка:
Здравствуйте, alexanderfedin, Вы писали:

A>Если компания сделает средство разработки многоплатформенным среди не своих платформ, то тем самым она своими собственными руками выпилит сук, на которых сидит


Не совсем всё так однозначно. Сейчас вот что мы имеем? Сидит какой-нть прыщавый виндо-хэйтер и решает — и винда вроде нужна, и сишарпить под ней можно, но внутренний кретин голос говорит — "а мы уйдём на север!". Причём полностью уйдём — на линупс+пестон, например. И получается, что вместо придержания "многоплатформенного" хэйтера, который мог бы делать софт ДЛЯ ОБЕИХ платформ, мелкософт ПОЛНОСТЬЮ теряет отдельного специалиста!
Когда выбор "или-или" — теряют все. Просто дебилам в руководстве проще изображать из себя властелина платформы, чем думать мозгами и грести бабло экскаваторами. А с планшетно-мобильной волной вообще вымывает все стойки под виндоофисом: если раньше выбор был "мак или вынь" (причём сильно в пользу последней), то сейчас уже задумываются "а нужен ли мне десктопный виндовоз вообще?".
Re: Что нужно добавить в C#?
От: Didi  
Дата: 06.04.13 06:50
Оценка: 2 (2) +1
Наконец, хотя этот предмет не из приятных, я должен упомянуть PL/1, язык программирования, документация которого обладает устрашающими размерами и сложностью. Использование PL/1 больше всего напоминает полет на самолете с 7000 кнопок, переключателей и рычагов в кабине. Я совершенно не представляю себе, как мы можем удерживать растущие программы в голове, когда из-за своей полнейшей вычурности язык программирования — наш основной инструмент, не так ли! — ускользает из-под контроля нашего интеллекта. И если мне понадобится описать влияние, которое PL/1 может оказывать на своих пользователей, ближайшее сравнение, которое приходит мне в голову, — это наркотик. Я помню лекцию в защиту PL/1, прочитанную на симпозиуме по языкам программирования высокого уровня человеком, который представился одним из его преданных пользователей. Но после похвал в адрес PL/1 в течение часа он умудрился попросить добавить к нему около пятидесяти новых «возможностей», не предполагая, что главный источник его проблем кроется в том, что в нем уже и так слишком уж много «возможностей». Выступающий продемонстрировал все неутешительные признаки пагубной привычки, сводящейся к тому, что он впал в состояние умственного застоя и может теперь только просить еще, еще, еще... Если FORTRAN называют детским расстройством, то PL/1, с его тенденциями роста подобно опасной опухоли, может оказаться смертельной болезнью.
Смиренный программист (EWD340) Эдсгер Дейкстра 1972г.

Ничего не напоминает? Действительно, история развивается по спирали...
Re: Что нужно добавить в C#?
От: Аноним  
Дата: 06.04.13 09:10
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.


конструкцию assume такого вида:
  int ret=0;
  assume (res>0) or throw new Exception(GetErrorMessage(res)) {
     ret=DoOp1();
     ret=DoOp2();
     ret=DoOp3();
  }
  ...
  Action<string> action=null;
  ...
  assume (action!=null) or skip {
     ...
     action("some message");
     ...
     action("some message");
     ...
  }
  assume possible or skip {
     a.b.c.d.e.f=1; // проверять возможно ли выполнить такое действие если да то выполнить и ничего не делать если не возможно например a.b.c.d=null
  }
  assume no return {
     ...
     return 1; // ошибку компиляции если встретился return
     ...
  }
  object a=...;
  assume a is Control or skip {
    a.Name="name";
  }
  ...

Просто что бы внутри блока проверяло условие перед использованием или при изменении значения переменной(ых) и выполняло заданное действие.

Что бы не писать так:
  int res=0;
  {
     ret=DoOp1(); if (!(res>0)) throw new Exception(GetErrorMessage(res));
     ret=DoOp2(); if (!(res>0)) throw new Exception(GetErrorMessage(res));
     ret=DoOp3(); if (!(res>0)) throw new Exception(GetErrorMessage(res));
  }
  Action<string> action=null;
  ...
  {
    if (action!=null) action("some message");
    ... 
    if (action!=null) action("some message");
    ...
  }
  // no return - на уровне компилятора (чтоб рефакторить длиныые портянки if-ов или switch-ей)
  {
     if (a!=null && a.b!=null && a.b.c!=null && a.b.c.d!=null && a.b.c.d.e!=null) a.b.c.d.e.f=1;
     // try { a.b.c.d.e.f=1; } catch {}
  }

  object a=...;
  if (a is Control) { Control local_a=(Control)a;
    local_a.Name="name";
  }


Хотелось бы вложенных функций
   void Foo(int x) {
     int Bar(int a) { ... }
     Bar(x);
   }
   // а не только так
   void Foo(int x) {
     Func<int,int> Bar=(a)=>{ ... };
     Bar(x);
   }
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.