тема «перевод статьи <Инноватор ли Microsoft?>» не показывается в топ 10
Это так и задумано, или баг?
Это так и задумано, или баг?
Дискуссия началась при обсуждении Хаскеля 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)); }
Понятно, что надо страться void* избегать, как и слова на букву «а», которое не понравилось Шаману007,
однако ЛОР — одно из мест,
где интересы краткости и точности выражения своей мысли перевешивают интересы эмоциональной приятности сообщения.
В некоторых случаях это слово необходимо, хотя лично мне за 4000+ сообщений оно не понадобилось до момента, когда надо было ответить Шаману007.
Тотальное вырезание этого слова не приведет к улучшению качества постов тех людей, которых интересуют эмоции, а не точность,
т.к. таких исправить вообще невозможно,
и помешает той категории людей, которую интересует точность, выражаться точно.
____________________________________________
Популярность этого слова на ЛОРе обусловлена в том числе и объективными причиной — программирование, возможно, так еще не стало индустрией,
т.к. повторное или иное нестандартное использование честно купленного или свободного кода программистом, пользователем, или интегратором
либо соврешенно бессмысленно запрещено лицензией
либо требует действий, аналогичных удалению гланд через отверстие с противоположной стороны человеческого тела :-)
Если бы вы изобретали С++ с чистого листа, то как бы вы...?
___
Чтобы тема была чуть определеннее, приведу несколько обычных притензий к С++, и мои предложения как это исправить:
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
Решение: ввести быстрые "статические" исключения, эквивалентные сишной проверке возвращенного значения (при этом компиятор должен проверять то, что все варианты кода возврата проверены, либо проверен просто факт неудачи). Но это отдельный разговор.
(Понятно, что все это требует более умного компилятора)
Ну и в таком же духе -- т.е. хотелось бы услышать либо притензии такого типа, либо мнения/уточнения по рассказанным притензиям.
Обычная фраза: deriving (Read, Show, Eq, Ord)
Компилятор умеет выводить инстансы этих typeclass-ов. А что делать, если хочется их выводить чуть-чуть по-другому или добавить еще один, который автоматически бы выводился? (Для этого, возможно, подошло что-то похожее на reflection, патчить компилятор не предлагайте)
__________________________________________________
Недемократизм языка в моем понимании -- это
1. Частичная реализация некой фичи и одновременно отстутствие инструмента для расширения реализации этой фичи. Например в яве оператор + для сложения целых, вещественных, строк и все: комплексные, кватернионы, вектора, матрицы... складывай уже через add.
2. Невозможность смены конкретной реализации фичи (зачастую связано с п.1). Например, невозможность создать в рамках с++ свой virtual dispatch (для того, что сделать множественный virtual dispatch, т.е. п.1). В принципе, п.2 до некоторой степени неизбежен, так как иногда намного проще сделать фичу, чем API для написания фич).
__________________________________________________
Более глобальный вопрос -- а насколько хаскель демократичен? (для обеспечения демократизма разрешается использовать ключи компилятора, template haskell, ...)
Предлагаю исправить -- вставить линк на http://www.linux.org.ru/view-message.jsp?msgid=3959726 , а может еще лучше -- сделать статический адрес, который бы переадресовывался в текущую жалобную книгу.
Речь идет о http://www.linux.org.ru/view-message.jsp?msgid=3998050
> ... диспетчер совершенно нового уровня, интегрированный во все элементы системы для максимально чёткой работы ... который теперь будет шагать в ногу со временем вместе с такими же ...
Маркетоидный понос.
> ... OpenCL позволяет разработчикам программ ощутить всю полноту графической фантазии ...
С каких пор OpenCL отосится к графике??? это не OpenGL, это язык для юзания GPU, не более того.
Подчеркну, что я __за__ новости об Apple, и даже как-то сам постил новость о том, что Mac-у исполнилось 25 лет.
_________________________________________________
Отдельно Макскому:
твой аргумет "Хочешь сделать лучше - ссылка на форму добавления новости на главной странице внизу" -- не проходит, т.к. мою новость про "25 лет мак-у" модераторы не пропустили.
http://www.linux.org.ru/view-message.jsp?msgid=3973125
Как минимум, представь, что ЛОР бы отдавался прямыми запросами к БД и отрисовывался клиентским кодом типа Google Native Client в браузере -- это было бы и прямее, и удобнее.
Вообще я девелопменте читаю с интересом в т.ч. нубские вопросы -- они дают возможность оценить языки программирования с точки зрения их дизайна -- насколько прямо они понимаются. Так что даже детсадовские вопросы удалять не стоит.
Или уже считается, что ссылка на технический текст на английском языке испугает целевую аудиторию ресурса? За кого тут нас принимают?
Речь идет о новости http://www.linux.org.ru/view-message.jsp?msgid=3955302
Гугление результатов не принесло.
Задача: заставить материнку перезагружаться в случае, если линукс мертво завис (было пару раз за полгода).
Ядро железку видит:
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, что ли, сделать? как?
Еще вопрос — материнку на перезагрузку будет толкать железка или все же ядро?
Два линукса, 2 рута. Сетевые карты желательно разделить между ними -- каждому свои карты. Жесткие диски, возможно, тоже каждому свои, а возможно и рейд, который совместно используется -- возможно такое? Интересуют все варианты.
Вот исходники
#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 и других железках? Возможно, я не указал полезные опции? А дальше флейм :-)
Министерство юстиции США начало расследование в отношении Google, Apple, Yahoo и некоторых других крупных компаний (в частности, Genentech) по обвинению в сговоре не переманивать друг у друга ключевых сотрудников.
Напомню также, что в мае FTC начала расследование отношений Google и Apple по поводу того, что ряд сотрудников входит в совет директоров обоих компаний. Например, в совет директоров Apple входит исполнительный директор Google Эрик Шмидт, и что членом совета директоров обеих компаний является Артур Левинсон, бывший исполнительным директором Genentech. Это, по мнению коммисии, препятствует свободной конкуренции компаний, являющихся естественными конкурентами (iPhone <=> Android, iTunes <=> YouTube).
Подробности
Перемещено Shaman007 из Apple
Обратный пункт "Отсутствие анонимного постинга" есть. А прямого нет.
З.Ы. Для тех, кто не видит логики:
Сейчас, при "Отсутствие анонимного постинга", вполне возможно, и не стал бы регистрироваться тут. Лень регистрироваться ради пары комментов.
1. Наличие таковых. Некоторые утверждают, что критерии качества языка программирования субъективны. Но это же не поэзия <неразборчиво>!
2. Мое понимание критериев качества языка программирования:
А. семантика -- тут вопрос в том, насколько язык умеет оперировать абстракциями -- т.е. создавать новые и правильно (верифицируемо) использовать готовые.
Б. синтаксис языка. Тут у меня есть точка зрения, но интересно послушать чужие мнения.
В. возможность цеплять чужие либы.
3. Ну и собственно вопрос. По каким ключевым словам на английском гуглить?
По-русски гуглиться мало, и достаточно хлипкие утверждения.
Использовались тесты 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
Сразу отмечу, что обычные растровые шрифты не подходят -- они 1-битные, а мне хочется юзать именно grayscale, хотя бы 2 бита, а лучше все 8 (если я не прав, подскажите формат растрового шрифта).
[идеально]. Возможно, что ttf или type2 форматы позволяют внедрить в себя уже отрендеренные grayscale картинки для фиксированных размеров шрифта -- тогда посоветуйте утилиту для этого.
[терпимо] Возможно, что есть патч к X фонт серверу для этого же?
[на крайняк] Может можно пропатчить свою qt, дабы она юзала qpf2 не только на Embedded Linux? (qpf2, как я понял, растровый, но grayscale).
Менеджер по коммуникации Windows Brandon LeBlanc в своем блоге сообщает, что в бесплатной Windows 7 Starter отменено ограничение в 3 запускаемых приложения, и, кроме того, Windows 7 Starter будет доступна по всему миру, а не только в некоторых регионах, как это было раньше. Тем не менее, ряд ограничений остается, самые серьезные из которых -- невозможность настроить цвета и звуки, сменить картинку на десктопе (хорошо, хоть там не крутятся неотключаемые баннеры), смотреть DVD и запускать программы в режиме совместимости с ХР.
В связи с этим событием на www.linux.org.ru уже было высказано ряд как позитивных, так и негативных ожиданий относительно популярности линукса. Среди позитивных: пользователи смогут покупать ноутбук без переплаты за ненужную, некомфортную и куцую систему, без сожаления сносить ее и устанавливать линукс. Среди негативных: бесплатность винды приведет к смерти альтернативных систем (это написал пятизвездочный пользователь :-)
Итак: как же этот шаг Microsoft повлияет на популярность Linux?
публикация в блоге Brandon LeBlanc
Перемещено svu из Linux General
Перл почти устраивает как (локальная) замена bash-у, но вот отсутствие ash-евских > и >> напрягает. Что посоветуете (не слишком извращенное)
Речь идет естественно о новости "Проведен анализ результатов тестов производительности языков". Оба предложения в ней -- злостное 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, и рассмотрены некоторые другие вопросы -- например, влияет ли наличие функциональных черт в языке на скорость.
← назад | следующие → |