LINUX.ORG.RU

Сообщения www_linux_org_ru

 

тема «перевод статьи <Инноватор ли Microsoft?>» не показывается в топ 10

Это так и задумано, или баг?

www_linux_org_ru
()

Haskell vs. C++ : поддержка зависимых типов

Дискуссия началась при обсуждении Хаскеля 2010

Мой тезис состоит в том, что в Хаскеле поддержка зависимых типов хуже, чем в с++. (А как дело обстоит с Template Haskell?)

И пока что Miguel не представил определение зависимых типов (или ссылку на нее), по которому можно однозначно рассудить, есть ли в с++ зависимые типы. Боюсь, что пока я не реализую ему на шаблонах всю agda, он не согласится на наличие зависимых типов в с++ :-)

В процессе обсуждение родилось задание, похожее вот на это:

создаем вектор a с размерностью вводимой юзером

создаем вектор b с размерностью вводимой юзером

попытка перемножить несовместимые вектора a*b не компилируется

создаем вектор с с размерностью, равной размерности вектора а

попытка перемножить совместимые вектора a*с компилируется

выводим результат — скалярное произведение

Вот как я это сделал:

/*

$ g++ -DTRY dependent-type5.cxx
dependent-type5.cxx: In function ‘int main()’:
dependent-type5.cxx:68: error: no match for ‘operator*’ in ‘a * b’
dependent-type5.cxx:35: note: candidates are: double Vector<dimension>::operator*(const Vector<dimension>&) [with unsigned int* dimension = (& x)]
$ g++ dependent-type5.cxx
$ ./a.out
please enter dimension for vector a: 2
please enter element #0 for vector a: 1
please enter element #1 for vector a: 2
please enter dimension for vector b: 1
please enter element #0 for vector b: 1
please enter element #0 for vector c: 1
please enter element #1 for vector c: 2
a*c = 5
please enter element #0 for vector d: 1
please enter element #1 for vector d: 2
f(a)= 5

*/
#include <iostream>
#include <vector>

template<unsigned int* dimension> class Vector
{
  public:
    Vector(const char* msg): v( *dimension = *dimension ? *dimension : get_dimension(msg) ), dim(dimension)
    {
      for(int i=0; i<*dimension; i++) {
        std::cout << "please enter element #" << i << " for vector " << msg << ": ";
        std::cin >> v[i];
      }
    }
    double operator* (const Vector<dimension>& that) /// вот тут мы следим за размерностью! зависимые типы, да.
    {
      double result=0;
      for(int i=0; i<*dimension; i++)
        result += v[i] * that.v[i];
      return result;
    }
  private:
    std::vector<double> v;
    const unsigned int* const dim; /// для полноты картины

    static unsigned int get_dimension(const char* msg)
    {
      unsigned int result;
      std::cout << "please enter dimension for vector " << msg << ": ";
      std::cin >> result;
      return result;
    }
};

template<unsigned int* dimension> double f(Vector<dimension> a)
{
  Vector<dimension> d("d");
  return a*d;
}

unsigned int x=0, y=0;

int main()
{
  Vector<&x> a("a");                     /// создаем вектор a с размерностью вводимой юзером
  Vector<&y> b("b");                     /// создаем вектор b с размерностью вводимой юзером
#ifdef TRY
  double z0 = a*b;                       /// попытка перемножить несовместимые вектора a*b не компилируется
#endif
  Vector<&x> c("c");                     /// создаем вектор с с размерностью, равной размерности вектора а
                                         /// (это можно записать по-другому: typeof(a) c("c"); но вероятно это не нужно)
                                         /// (однако если все же нужно, потребуется с++0х)
  double z1 = a*c;                       /// попытка перемножить совместимые вектора a*с компилируется
  std::cout << "a*c = " << z1 << "\n";   /// выводим результат -- скалярное произведение
  double z2 = f(a);                      /// теперь считаем то же самое, но как вызов функции f -- компилируется
                                         /// (важно то, что размерность в явном виде в функцию f не передается) 
  std::cout << "f(a)= " << z2 << "\n";   /// снова выводим результат -- скалярное произведение

  return 0;
}

Комментарий: если размерность, поданная вектору, нулевая, он ее читает от юзера, а если ненулевая — то использует.

(Кто знает Qi? интересно было бы взглянуть на решение на нем)

Решение на Template Haskell с UnsafeIO наверно подойдет, но интересно было бы попугать народ полноценным решением без UnsafeIO :-)

И еще меня интересуе, как переписать на (Template?) Haskell вот это (даже если тут нет зависимых типов):

const int n=17;

...

Z<n> f(int x) { return mod<n>(x+(n/2)); }

www_linux_org_ru
()

запрет слова на букву «а» из ЛОРа аналогично запрету void* из языка Си

Понятно, что надо страться void* избегать, как и слова на букву «а», которое не понравилось Шаману007,

однако ЛОР — одно из мест,

где интересы краткости и точности выражения своей мысли перевешивают интересы эмоциональной приятности сообщения.

В некоторых случаях это слово необходимо, хотя лично мне за 4000+ сообщений оно не понадобилось до момента, когда надо было ответить Шаману007.

Тотальное вырезание этого слова не приведет к улучшению качества постов тех людей, которых интересуют эмоции, а не точность,

т.к. таких исправить вообще невозможно,

и помешает той категории людей, которую интересует точность, выражаться точно.

____________________________________________

Популярность этого слова на ЛОРе обусловлена в том числе и объективными причиной — программирование, возможно, так еще не стало индустрией,

т.к. повторное или иное нестандартное использование честно купленного или свободного кода программистом, пользователем, или интегратором

либо соврешенно бессмысленно запрещено лицензией

либо требует действий, аналогичных удалению гланд через отверстие с противоположной стороны человеческого тела :-)

www_linux_org_ru
()

Несколько вопросов: языки высокого уровня и С++ с точки зрения программистов на С (kernel, embedded, realtime, ...)

Если бы вы изобретали С++ с чистого листа, то как бы вы...?

___

Чтобы тема была чуть определеннее, приведу несколько обычных притензий к С++, и мои предложения как это исправить:

1. Вроде-как-объявление переменной Something s=1; может вызвать сколь угодно длинное вычисление

Решение: разный синтаксис:

Something s=1; означает, что конструктор s завершается за заранее известное число таков (и деструктора нет?)

Something s(1); означает... что ожидать можно что угодно.

2. С++ поддерживает перегрузку оператора [] -- и это значит, что a["asdf"] может обращаться за значением к серверу на другой стороне Земли, не говоря уж о произвольном таймауте и возможном выбросе исключения. В то же время абстрактная запись типа a["asdf"] для языка высокого уровня *НУЖНА*. Поэтомо, возможно, следует *на уровне синтаксиса* различать абстрактное и гарантированно-себя-хорошо-ведущее.

Решение: разный синтаксис:

a.[i] означает, что компилятор гарантирует, что i не выйдет за пределы границ массива а, операция завершается за заранее известное число таков, и проверка в ран-тайме *не нужна*, как например в случае for(int i=0; i<sizeof(a)/sizeof(a.[0]); i++) do_something(a.[i]);

a.at(i) (или a.at[i]?) означает, что проверка диапазона (или наличия значения в хэше, или ... ) производится, операция завершается за заранее известное число тактов; выход за границы -- это критическая ошибка логики программы, и при ее наличии программа должна gracefully завершиться.

a[i] означает... что ожидать можно что угодно.

3. Исключительно тормозные плюсовые исключения (на десятичные порядки) http://www.linux.org.ru/view-message.jsp?msgid=3856841

Решение: ввести быстрые "статические" исключения, эквивалентные сишной проверке возвращенного значения (при этом компиятор должен проверять то, что все варианты кода возврата проверены, либо проверен просто факт неудачи). Но это отдельный разговор.

(Понятно, что все это требует более умного компилятора)

Ну и в таком же духе -- т.е. хотелось бы услышать либо притензии такого типа, либо мнения/уточнения по рассказанным притензиям.

www_linux_org_ru
()

[haskell] есть ли что-то типа reflection? (недемократизм языка?)

Обычная фраза: deriving (Read, Show, Eq, Ord)

Компилятор умеет выводить инстансы этих typeclass-ов. А что делать, если хочется их выводить чуть-чуть по-другому или добавить еще один, который автоматически бы выводился? (Для этого, возможно, подошло что-то похожее на reflection, патчить компилятор не предлагайте)

__________________________________________________

Недемократизм языка в моем понимании -- это

1. Частичная реализация некой фичи и одновременно отстутствие инструмента для расширения реализации этой фичи. Например в яве оператор + для сложения целых, вещественных, строк и все: комплексные, кватернионы, вектора, матрицы... складывай уже через add.

2. Невозможность смены конкретной реализации фичи (зачастую связано с п.1). Например, невозможность создать в рамках с++ свой virtual dispatch (для того, что сделать множественный virtual dispatch, т.е. п.1). В принципе, п.2 до некоторой степени неизбежен, так как иногда намного проще сделать фичу, чем API для написания фич).

__________________________________________________

Более глобальный вопрос -- а насколько хаскель демократичен? (для обеспечения демократизма разрешается использовать ключи компилятора, template haskell, ...)

 

www_linux_org_ru
()

в http://www.linux.org.ru/rules.jsp «напишите нам» — линк на емейл, а не на тему форума.

Предлагаю исправить -- вставить линк на http://www.linux.org.ru/view-message.jsp?msgid=3959726 , а может еще лучше -- сделать статический адрес, который бы переадресовывался в текущую жалобную книгу.

www_linux_org_ru
()

Что за маркетоидный понос на главной странице? Почему нельзя было подать техническую инфу?

Речь идет о http://www.linux.org.ru/view-message.jsp?msgid=3998050

> ... диспетчер совершенно нового уровня, интегрированный во все элементы системы для максимально чёткой работы ... который теперь будет шагать в ногу со временем вместе с такими же ...

Маркетоидный понос.

> ... OpenCL позволяет разработчикам программ ощутить всю полноту графической фантазии ...

С каких пор OpenCL отосится к графике??? это не OpenGL, это язык для юзания GPU, не более того.

Подчеркну, что я __за__ новости об Apple, и даже как-то сам постил новость о том, что Mac-у исполнилось 25 лет.

_________________________________________________

Отдельно Макскому:

твой аргумет "Хочешь сделать лучше - ссылка на форму добавления новости на главной странице внизу" -- не проходит, т.к. мою новость про "25 лет мак-у" модераторы не пропустили.

www_linux_org_ru
()

Pi, тема не была офтопиком и детсадом, и даже если бы была детсадом, удалять ее не стоило

http://www.linux.org.ru/view-message.jsp?msgid=3973125

Как минимум, представь, что ЛОР бы отдавался прямыми запросами к БД и отрисовывался клиентским кодом типа Google Native Client в браузере -- это было бы и прямее, и удобнее.

Вообще я девелопменте читаю с интересом в т.ч. нубские вопросы -- они дают возможность оценить языки программирования с точки зрения их дизайна -- насколько прямо они понимаются. Так что даже детсадовские вопросы удалять не стоит.

www_linux_org_ru
()

у нас тут филиал podrobnosti.ua? почему модеры пропускают новость без ссылки на патент?

Или уже считается, что ссылка на технический текст на английском языке испугает целевую аудиторию ресурса? За кого тут нас принимают?

Речь идет о новости http://www.linux.org.ru/view-message.jsp?msgid=3955302

www_linux_org_ru
()

как юзать iTCO_wdt (watchdog timer) и как гарантировано сделать kernel oops для симуляции ?

Гугление результатов не принесло.

Задача: заставить материнку перезагружаться в случае, если линукс мертво завис (было пару раз за полгода).

Ядро железку видит:

iTCO_wdt: Intel TCO WatchDog Timer Driver v1.02 (26-Jul-2007)                                                                       
iTCO_wdt: Found a ICH5 or ICH5R TCO device (Version=1, TCOBASE=0x0860)                                                              
iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0) 

root         5  0.0  0.0      0     0 ?        S<   Aug07   0:00 [watchdog/0]

Еще надо как-то симулировать мертвое зависание... oops, что ли, сделать? как?

Еще вопрос — материнку на перезагрузку будет толкать железка или все же ядро?

www_linux_org_ru
()

2 root-а, несколько сетевых карт — какой виртуализатор выбрать?

Два линукса, 2 рута. Сетевые карты желательно разделить между ними -- каждому свои карты. Жесткие диски, возможно, тоже каждому свои, а возможно и рейд, который совместно используется -- возможно такое? Интересуют все варианты.

www_linux_org_ru
()

[бенчмарк] С++ медленне С в 5 раз при уже при 0.1% кидаемых исключений [ЧЯДНТ ?]

Вот исходники

#include <stdio.h>

#define BITS 10    // 0<=BITS<=16

unsigned int i0=0, i1=0;

int f(unsigned int arg)
{
    if( ( (arg>>16) & ((1<<BITS)-1) ) == 0 )
        return 1; // exception
    else
        ++i0; // do some good work here, i.e. increment i0
    return 0; // ok
}
int main()
{
    unsigned int i=0, x=1;

    do {
        ++i;
        x+=x<<2; // x == 5 power i
        if( f(x) )
            ++i1; // exception
    }
    while(x!=1);

    printf("i=%u i0=%u i1=%u i0+i1=%u\n", i,i0,i1,i0+i1 );
    printf("  %u    %u    %u       %u\n", 0x40000000u, i-i1, (1<<(16-BITS))<<14, 0x40000000u );
    return 0;
}

#include <stdio.h>

#define BITS 10    // 0<=BITS<=16

unsigned int i0=0, i1=0;
class E1 {};
E1 e1;

void f(unsigned int arg)
{
    if( ( (arg>>16) & ((1<<BITS)-1) ) == 0 )
        throw &e1;
    else
        ++i0; // do some good work here, i.e. increment i0
}
int main()
{
    unsigned int i=0, x=1;

    do {
        ++i;
        x+=x<<2; // x == 5 power i
        try{ f(x); }
        catch( E1* e ){ ++i1; }
    }
    while(x!=1);

    printf("i=%u i0=%u i1=%u i0+i1=%u\n", i,i0,i1,i0+i1 );
    printf("  %u    %u    %u       %u\n", 0x40000000u, i-i1, (1<<(16-BITS))<<14, 0x40000000u );
    return 0;
}

Вот выхлопы [ gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) ]:

$ gcc -O3 1.c && time ./a.out 
i=1073741824 i0=1072693248 i1=1048576 i0+i1=1073741824
  1073741824    1072693248    1048576       1073741824

real    0m2.368s
user    0m2.256s
sys     0m0.004s

$ g++ -O3 1.cxx && time ./a.out 
i=1073741824 i0=1072693248 i1=1048576 i0+i1=1073741824
  1073741824    1072693248    1048576       1073741824

real    0m11.741s
user    0m10.921s
sys     0m0.008s

Кто сможет протестить на icc, других версиях gcc и других железках? Возможно, я не указал полезные опции? А дальше флейм :-)

www_linux_org_ru
()

Министерство юстиции США начало расследование в отношении Google и Apple

Министерство юстиции США начало расследование в отношении Google, Apple, Yahoo и некоторых других крупных компаний (в частности, Genentech) по обвинению в сговоре не переманивать друг у друга ключевых сотрудников.

Напомню также, что в мае FTC начала расследование отношений Google и Apple по поводу того, что ряд сотрудников входит в совет директоров обоих компаний. Например, в совет директоров Apple входит исполнительный директор Google Эрик Шмидт, и что членом совета директоров обеих компаний является Артур Левинсон, бывший исполнительным директором Genentech. Это, по мнению коммисии, препятствует свободной конкуренции компаний, являющихся естественными конкурентами (iPhone <=> Android, iTunes <=> YouTube).
Подробности

Перемещено Shaman007 из Apple

www_linux_org_ru
()

Добавть, пожалуста, в опрос «Что побудило вас зарегистрироваться на Linux.org.ru» пункт «Наличие анонимного постинга».

Обратный пункт "Отсутствие анонимного постинга" есть. А прямого нет.

З.Ы. Для тех, кто не видит логики:

Сейчас, при "Отсутствие анонимного постинга", вполне возможно, и не стал бы регистрироваться тут. Лень регистрироваться ради пары комментов.

www_linux_org_ru
()

Кто знает объективные критерии качества языка программирования, или хотя бы синтаксиса?

1. Наличие таковых. Некоторые утверждают, что критерии качества языка программирования субъективны. Но это же не поэзия <неразборчиво>!

2. Мое понимание критериев качества языка программирования:

А. семантика -- тут вопрос в том, насколько язык умеет оперировать абстракциями -- т.е. создавать новые и правильно (верифицируемо) использовать готовые.

Б. синтаксис языка. Тут у меня есть точка зрения, но интересно послушать чужие мнения.

В. возможность цеплять чужие либы.

3. Ну и собственно вопрос. По каким ключевым словам на английском гуглить?

По-русски гуглиться мало, и достаточно хлипкие утверждения.

www_linux_org_ru
()

Недавно вышедший Safari 4.0 обгоняет в тестах остальные браузеры

Использовались тесты i-Bench HTML, i-Bench JavaScript, SunSpider JavaScript. Вот, например, результаты для i-Bench HTML под Windows (чтобы исключить влияние родной ОС):

Safari 4.0 1.01 s
Chrome 2.0 1.41 s
Firefox 3.5 Beta 4 3.10 s
Firefox 3.0 3.21 s
Opera 9.6 3.26 s
Internet Explorer 8 3.60 s

Интересно, что разрекламированный Chrome во всех тестах отстает от Safari.

Результаты тестирования

Перемещено Shaman007 из Apple

www_linux_org_ru
()

[X][ttf][type2][qpf2?] Как внедрить grayscale bitmap в ttf или заставить Х сервер (или хотя бы qt приложения) использовать фонт, растеризованный в grayscale?

Сразу отмечу, что обычные растровые шрифты не подходят -- они 1-битные, а мне хочется юзать именно grayscale, хотя бы 2 бита, а лучше все 8 (если я не прав, подскажите формат растрового шрифта).

[идеально]. Возможно, что ttf или type2 форматы позволяют внедрить в себя уже отрендеренные grayscale картинки для фиксированных размеров шрифта -- тогда посоветуйте утилиту для этого.

[терпимо] Возможно, что есть патч к X фонт серверу для этого же?

[на крайняк] Может можно пропатчить свою qt, дабы она юзала qpf2 не только на Embedded Linux? (qpf2, как я понял, растровый, но grayscale).

 ,

www_linux_org_ru
()

Microsoft убрала ряд ограничений в бесплатной Windows 7 Starter. Как это повлияет на популярность Linux?

Менеджер по коммуникации Windows Brandon LeBlanc в своем блоге сообщает, что в бесплатной Windows 7 Starter отменено ограничение в 3 запускаемых приложения, и, кроме того, Windows 7 Starter будет доступна по всему миру, а не только в некоторых регионах, как это было раньше. Тем не менее, ряд ограничений остается, самые серьезные из которых -- невозможность настроить цвета и звуки, сменить картинку на десктопе (хорошо, хоть там не крутятся неотключаемые баннеры), смотреть DVD и запускать программы в режиме совместимости с ХР.

В связи с этим событием на www.linux.org.ru уже было высказано ряд как позитивных, так и негативных ожиданий относительно популярности линукса. Среди позитивных: пользователи смогут покупать ноутбук без переплаты за ненужную, некомфортную и куцую систему, без сожаления сносить ее и устанавливать линукс. Среди негативных: бесплатность винды приведет к смерти альтернативных систем (это написал пятизвездочный пользователь :-)

Итак: как же этот шаг Microsoft повлияет на популярность Linux?
публикация в блоге Brandon LeBlanc

Перемещено svu из Linux General

www_linux_org_ru
()

[perl] что посоветуете в перле по типу bash-евских > и >>

Перл почти устраивает как (локальная) замена bash-у, но вот отсутствие ash-евских > и >> напрягает. Что посоветуете (не слишком извращенное)

 

www_linux_org_ru
()

За 4.2 в посте предусмотрено снижение скора, а за 4.2 в новости?

Речь идет естественно о новости "Проведен анализ результатов тестов производительности языков". Оба предложения в ней -- злостное 4.2, причем 4.2 не из-за религиозных соображений (что еще можно было бы как-то простить):

1. 2 параметра, а не 4 (т.к. диаграммы двумерные)

2. These languages do not have enough benchmark implementations in the database

Я бы оценил такое в -20...-30 скора. Что скажут модераторы?

З.Ы. нормальный текст выглядел бы так:

В статье предложен интересный метод классификации языков: идеальный (быстрый и краткий), системный (быстрый и многословный), скриптовый (медленный и краткий), устаревший (медленный и многословный). В соответствии с этим методом проведена классификация языков на материале http://shootout.alioth.debian.org, и рассмотрены некоторые другие вопросы -- например, влияет ли наличие функциональных черт в языке на скорость.

www_linux_org_ru
()

RSS подписка на новые темы