тема «перевод статьи <Инноватор ли 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
Решение: ввести быстрые "статические" исключения, эквивалентные сишной проверке возвращенного значения (при этом компиятор должен проверять то, что все варианты кода возврата проверены, либо проверен просто факт неудачи). Но это отдельный разговор.
(Понятно, что все это требует более умного компилятора)
Ну и в таком же духе -- т.е. хотелось бы услышать либо притензии такого типа, либо мнения/уточнения по рассказанным притензиям.
Компилятор умеет выводить инстансы этих typeclass-ов. А что делать, если хочется их выводить чуть-чуть по-другому или добавить еще один, который автоматически бы выводился? (Для этого, возможно, подошло что-то похожее на reflection, патчить компилятор не предлагайте)
__________________________________________________
Недемократизм языка в моем понимании -- это
1. Частичная реализация некой фичи и одновременно отстутствие инструмента для расширения реализации этой фичи. Например в яве оператор + для сложения целых, вещественных, строк и все: комплексные, кватернионы, вектора, матрицы... складывай уже через add.
2. Невозможность смены конкретной реализации фичи (зачастую связано с п.1). Например, невозможность создать в рамках с++ свой virtual dispatch (для того, что сделать множественный virtual dispatch, т.е. п.1). В принципе, п.2 до некоторой степени неизбежен, так как иногда намного проще сделать фичу, чем API для написания фич).
__________________________________________________
Более глобальный вопрос -- а насколько хаскель демократичен? (для обеспечения демократизма разрешается использовать ключи компилятора, template haskell, ...)
> ... диспетчер совершенно нового уровня, интегрированный во все элементы системы для максимально чёткой работы ... который теперь будет шагать в ногу со временем вместе с такими же ...
Маркетоидный понос.
> ... OpenCL позволяет разработчикам программ ощутить всю полноту графической фантазии ...
С каких пор OpenCL отосится к графике??? это не OpenGL, это язык для юзания GPU, не более того.
Подчеркну, что я __за__ новости об Apple, и даже как-то сам постил новость о том, что Mac-у исполнилось 25 лет.
_________________________________________________
Отдельно Макскому:
твой аргумет "Хочешь сделать лучше - ссылка на форму добавления новости на главной странице внизу" -- не проходит, т.к. мою новость про "25 лет мак-у" модераторы не пропустили.
Как минимум, представь, что ЛОР бы отдавался прямыми запросами к БД и отрисовывался клиентским кодом типа 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, что ли, сделать? как?
Еще вопрос — материнку на перезагрузку будет толкать железка или все же ядро?
Вот исходники
#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 и других железках? Возможно, я не указал полезные опции? А дальше флейм :-)
Напомню также, что в мае FTC начала расследование отношений Google и Apple по поводу того, что ряд сотрудников входит в совет директоров обоих компаний. Например, в совет директоров Apple входит исполнительный директор Google Эрик Шмидт, и что членом совета директоров обеих компаний является Артур Левинсон, бывший исполнительным директором Genentech. Это, по мнению коммисии, препятствует свободной конкуренции компаний, являющихся естественными конкурентами (iPhone <=> Android, iTunes <=> YouTube).
Подробности
Перемещено Shaman007 из Apple
З.Ы. Для тех, кто не видит логики:
Сейчас, при "Отсутствие анонимного постинга", вполне возможно, и не стал бы регистрироваться тут. Лень регистрироваться ради пары комментов.
2. Мое понимание критериев качества языка программирования:
А. семантика -- тут вопрос в том, насколько язык умеет оперировать абстракциями -- т.е. создавать новые и правильно (верифицируемо) использовать готовые.
Б. синтаксис языка. Тут у меня есть точка зрения, но интересно послушать чужие мнения.
В. возможность цеплять чужие либы.
3. Ну и собственно вопрос. По каким ключевым словам на английском гуглить?
По-русски гуглиться мало, и достаточно хлипкие утверждения.
[идеально]. Возможно, что ttf или type2 форматы позволяют внедрить в себя уже отрендеренные grayscale картинки для фиксированных размеров шрифта -- тогда посоветуйте утилиту для этого.
[терпимо] Возможно, что есть патч к X фонт серверу для этого же?
[на крайняк] Может можно пропатчить свою qt, дабы она юзала qpf2 не только на Embedded Linux? (qpf2, как я понял, растровый, но grayscale).
В связи с этим событием на www.linux.org.ru уже было высказано ряд как позитивных, так и негативных ожиданий относительно популярности линукса. Среди позитивных: пользователи смогут покупать ноутбук без переплаты за ненужную, некомфортную и куцую систему, без сожаления сносить ее и устанавливать линукс. Среди негативных: бесплатность винды приведет к смерти альтернативных систем (это написал пятизвездочный пользователь :-)
Итак: как же этот шаг Microsoft повлияет на популярность Linux?
публикация в блоге Brandon LeBlanc
Перемещено svu из Linux General
1. 2 параметра, а не 4 (т.к. диаграммы двумерные)
2. These languages do not have enough benchmark implementations in the database
Я бы оценил такое в -20...-30 скора. Что скажут модераторы?
З.Ы. нормальный текст выглядел бы так:
В статье предложен интересный метод классификации языков: идеальный (быстрый и краткий), системный (быстрый и многословный), скриптовый (медленный и краткий), устаревший (медленный и многословный). В соответствии с этим методом проведена классификация языков на материале http://shootout.alioth.debian.org, и рассмотрены некоторые другие вопросы -- например, влияет ли наличие функциональных черт в языке на скорость.
| ← назад | следующие → |