Сказка о насильниках, приплюснутых насильниках, о переносимости и о том, чего не покажут проверки.

Ivan8209

Переменные s и x объявлены как "unsigned long int."
Переменная s предполагается берущейся произвольно.
Например, считыванием показаний часов.
Она принимает произвольные допустимые значения.
Переменная x ни при каких условиях не должна оказаться нулевой.
"Ни при каких" означает именно "ни при каких" и ничего более.


if (s == 0)
s = 1;
x = s & 0xffffffffUL;


---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

Marinavo_0507

кг/ам
типа вот:


x = s & 0xFFFFFFFFUL;
if (x == 0) {
x = 1;
}

yolki

это вообще, к чему? пишем x=1 и всё. x у тебя никогда не будет 0. при чём здесь s?

Ivan8209

Оно обязано быть.
Таковы условия.
---
...Я работаю антинаучным аферистом...

Ivan8209

Молодец.
Теперь объясни, почему насильники не могли написать сразу
правильно.
Кстати, сможешь на взгляд определить,
что за число такое 2147483646?
---
...Я работаю антинаучным аферистом...

yolki

1111111111111111111111111111110_2

Marinavo_0507

> Теперь объясни, почему насильники не могли написать сразу
> правильно.
А я доктор?

Ivan8209

А 2145483479?
А 1103515245?
И что?
Прямо так, на взгляд?
---
...Я работаю антинаучным аферистом...

Ivan8209

M-x doctor?
Как-то не тянешь.
Тебе надо больше тренироваться.
Да, в одном-двух местах насильник написал действия в верном порядке.
Опечатался, наверное.
---
...Я работаю антинаучным аферистом...

yolki

2^31 (2147483648) и 2^32 (4294967296) слишком часто попадались на глаза - я их запомнил.
эти два на взгляд не определяются.

Dasar

а зачем здесь " & 0xfffffffUL"?

Ivan8209

Да, я чуть упростил задачу.
Если бы я сразу выложил число 4194302,
которое 2^22-2, было бы посложнее.
Немного объяснений.
Числа вида 2^31-2, 2^22-2 возникают закономерно,
как наибольшие в соответствующих кольцах вычетов.
А вот другие два числа подбираются "так, чтобы."
Выводы.
---
...Я работаю антинаучным аферистом...

Dasar

Также я не понял, при чем здесь "насильники"?
Или ты хочешь сказать, что на Java, Basic-е, shell-е, ML-е, Haskel-е или на чем-то еще данная задача автоматически была бы решена правильно?

Ivan8209

Ты будешь смеяться, но вот так эти извращенцы берут остаток от
деления на 2^n.
---
...Я работаю антинаучным аферистом...

Dasar

т.е. в условии задачи еще входит, что переменная s должна быть обрезана до 4 байт?

Ivan8209

Да, на МЛе задача, почти наверняка, была бы решена сразу
правильно.
Потому что в МЛ можно определить, если его ещё нет,
возведение в степень, и ускорением взятия остатка от деления
занимается, по договорёности, не человек.
---
...Я работаю антинаучным аферистом...

Ivan8209

Не до "четырёх байт," а впихнуто в подтип "INTEGER range 0..2**32."
---
...Я работаю антинаучным аферистом...

Dasar

> Потому что в МЛ можно определить, если его ещё нет,
> возведение в степень, и ускорением взятия остатка от деления
> занимается, по договорёности, не человек.
Но как это поможет? т.е. что мешает программисту на ML-е сначала проверить на ноль, а потом взять остаток от деления?

Dasar

> Не до "четырёх байт," а впихнуто в подтип "INTEGER range 0..2**32."
Почему об этом ничего не написано в оригинальном условии задачи?

Ivan8209

Потому что задача ставится не "построить мост вот по этим
чертежам," а "построить такой мост."
---
...Я работаю антинаучным аферистом...

Ivan8209

Культура программирования.
---
...Я работаю антинаучным аферистом...

Dasar

> Культура программирования.
И что это такое?
Хочешь сказать, что если завтра новичка посадить за ML - он эту самую культуру магическим способом выучит?
ps
Замечу, что доля новичков на C много больше, чем новичков в ML-е

Marinavo_0507

> Хочешь сказать, что если завтра новичка посадить за ML - он эту самую культуру магическим способом выучит?
Сразу не получится. Мне тут недавно сказали, что сначала нужно чакры открыть.

Ivan8209

Нет.
Но МЛ, сам язык не способствует, если не препятствует
программированию с ранними низкоуровневыми "хаками"
в расчёте на скорость исполнения.
Код, кстати, выставляется на профессиональном уровне.
Если б он был учебным, то разговор шёл бы иначе.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

> Код, кстати, выставляется на профессиональном уровне.
На выставке, что ли?

Ivan8209

Предназначен для профессионального продукта.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

Тогда ничего удивительного.

Dasar

> Но МЛ, сам язык не способствует, если не препятствует
> программированию с ранними низкоуровневыми "хаками"
> в расчёте на скорость исполнения.
т.е. ты хочешь сказать, что если запись была бы высокоуровневой:


if (s == 0)
s = 1;
x = mod(s, pow(2, 32;


то ошибка опять же магическим способом исчезла бы?

Dasar

Такой ошибки можно было бы избежать только на языках, поддерживающих контракты:


unsigned long transform(unsigned long s) contract result != 0
{
if (s == 0)
s = 1;
return s & 0xFFFFFFFFUL;
}


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

Ivan8209

Ещё к вопросу о переносимости.
Часто встречаемый образец.


#define AAA NNN_1
#define MMM NNN_2
#define RRR NNN_3
#define QQQ NNN_4
<Тут много какого-то текста с фигурными скобками>
long int Y = X;
long int R = RRR * (Y / QQQ);
Y = AAA * (Y % QQQ) - R;
if (Y < 0)
Y += MMM;
X = Y;


Сможете сходу догадаться, что делает подобная ворожба?
---
...Я работаю антинаучным аферистом...

Dasar

Смотря в каком контексте данный код используется.
Имея только эти голые формулы - ни о чем более высокоуровневом, чем сами эти формулы, ничего сказать нельзя.

Marinavo_0507

Решил замещать Глебиуса - учись подбирать заголовки.
Вот примеры:

Ivan8209

Во-первых, приличный структурный программист сразу бы выделил
вот это самое действие (Да, пожалуй, я слишком сильно порезал,
знание области существования переменных Y и R необходимо. в
отдельную подпрограмму.
Это отображение X -> (A*X) mod M.
Числа Q и R подбираются отдельно (делением M на A).
Заметьте, что их значения _вбиваются_. Дословно.
То есть, доцифренно.
И это вместо обыкновенных M)/(A и M)%(A соответственно.
Причём удвоение разрядности машины (чем чёрт не шутит?) приводит
к бесполезности подобных вывертов.
Кстати, рядом же насильник описывает функции,
как "static inline unsigned int."
Какого чёрта врисовывать эту функцию вручную?
---
...Я работаю антинаучным аферистом...

Dasar

"приличный структурный программист сразу бы выделил вот это самое действие"
Вот видишь: ты сам себе ответил, т.е. это зависит не от языка, а зависит от того - является ли программист - структурным или не является.

Ivan8209

Ты хочешь сказать, что Си не является структурным?
---
...Я работаю антинаучным аферистом...

Dasar

Основная роль C - "кроссплатформенный ассемблер", поэтому то, что в C есть элементы структурного программирования - погоды не делает.
ps
Структурно писать можно и на Asm-е, а неструктурно хоть на прологе.

Ivan8209

Да ничерта он не "кроссплатформенный ассемблер."
Был бы он "кроссплатформенным," у него был бы


subtype THAT_DAMN_INTERVAL is INTEGER range 0..2**32;


или, на худой конец


DCL X BINARY(32);


а не вышеописанное умножение "unsigned long int"-ов на месте
или размещение 48-разрядных двоичных чисел в трёх
"unsigned short int"-ах, которые могут в один прекрасный день
оказаться вдвое короче, чем надо.
Кстати, про структурное программирование на Прологе расскажи.
А то я как-то плохо представляю себе, что это такое.
---
...Я работаю антинаучным аферистом...

Dasar

> subtype THAT_DAMN_INTERVAL is INTEGER range 0..2**32;
Если такое добавить, то на тех компьютерах, на которых такого нет, придется делать эмуляцию.
Что же это будет за ассемблер - если он требует для работы "эмулирующую прослойку".

Ivan8209

Так на то и существуют компиляторы!
В противном случае люди писали бы на связке as+m4,
а не на cc+cpp.
Встроить арифметику большей точности, чем имеющаяся
разрядность,--- это не такая уж большая забота.
Вон, на К580-ых есть плавающая запятая и ничего.
Никто от этого не умер.
---
...Я работаю антинаучным аферистом...

buka

Очередная КОНТРАатака на С++... В чем же причина? Вот глава из известной книги.
Позволил себе отметить курсивом, на мой взгляд, важный для понимания отрывок.
Дао С++
С++ — язык, который изучается постепенно. Лишь после того, как будет сделан последний шаг,
разрозненные приемы и фрагменты синтаксиса начинают складываться в общую картину. По-моему,
изучение С++ чем-то напоминает подъем на лифте. Дзынь! Второй этаж. С++ — это
усовершенствованный вариант С, с сильной типизацией (которую, впрочем, при желании можно
обойти) и удобными комментариями //. Любой программист на С, если он не хочет подаваться в
менеджеры, должен двигаться дальше… а Бьярн Страуструп (Господи, благослови его) придумал для
этого отличную возможность.
Дзынь! Третий этаж. С++ — хороший, хотя и не потрясающий объектно-ориентированный язык
программирования. Не Smalltalk, конечно, но чего ожидать от языка, работающего с такой
головокружительной скоростью? С++ — это Cobol 90-х, политически выдержанный язык, которые
гарантирует финансирование вашего проекта высшим руководством. А уж если С++ достаточно часто
упоминается в плане, можно надеяться на удвоение бюджета. Это тоже хорошо, потому что никто
толком не умеет оценивать проекты на С++ и управлять ими. А что касается инструментария — глаза
разбегаются, не правда ли?
Дзынь! Последний этаж, все выходят. Но позвольте, где же «все»? Лифт почти пуст. С++ — это на
самом деле не столько язык, сколько инструмент для создания ваших собственных языков. Его
элегантность заключается отнюдь не в простоте (слова С++ и простота режут слух своим явным
противоречием а в его потенциальных возможностях. За каждой уродливой проблемой прячется
какая-нибудь умная идиома, изящный языковой финт, благодаря которому проблема тает прямо на
глазах. Проблема решается так же элегантно, как это сделал бы настоящий язык типа Smalltalk или
Lisp, но при этом ваш процессор не дымится от напряжения, а на Уолл-Стрит не растут акции
производителей чипов памяти. С++ — вообще не язык. Это мировоззрение или наркотик, меняющий
способ мышления.
Но вернемся к слову «элегантный». В программировании на С++ действует перефразированный
принцип Дао: «Чтобы достичь истинной элегантности, нужно отказаться от стремления к
элегантности». С++ во многом представляет собой С следующего поколения. Написанные на нем
программы эффективно компилируются и быстро работают. Он обладает очень традиционной блочной
структурой и сокращенной записью для многих распространенных операций (например, i++). В нем
есть свои существительные, глаголы, прилагательные и свой жаргон:
out << 17 << endl << flush;
Ревнители чистоты языка часто нападают на С++. Они полагают, что высшее достижение современной
цивилизации — язык, построенный исключительно из атомов и скобок. По мнению этих террористов
от синтаксиса, если простую переменную с первого взгляда невозможно отличить от вызова функции
или макроса — это вообще не язык, а шарлатанство для развлечения праздной толпы. К сожалению,
теория расходится с практикой. В реальной жизни толпа платит лишь за то, чтобы видеть языки, в
которых разные идеи выглядят по-разному. «Простые и последовательные» языки никогда не
пользовались особым успехом за стенками академий, а языки с блочной структурой овладели массами.
Стоит ли этому удивляться? Ведь компьютерные языки приходится изучать и запоминать, а для этого
используется то же серое вещество, с помощью которого мы изучаем и запоминаем естественные
языки. Попробуйте-ка назвать хотя бы один естественный язык без существительных, глаголов и
скобок! Я бы не рискнул. Все наши познания в лингвистике говорят о том, что эти «плохие»
особенности только ускоряют изучение компьютерного языка и делают его более понятным. i++ во
всех отношениях действительно понятнее, чем i:=i+1, а x=17+29 читается лучше, нежели (setq
x(+17, 29. Речь идет не о строении компьютерного языка, а скорее о нашем собственном
строении. Все уродства С++ — это в основном наши уродства. Когда вы научитесь понимать и любить
его странности, когда перестанете беспокоиться о математической стройности, будет сделан ваш
первый шаг к достижению элегантности в С++.

С++ наряду с Lisp, Smalltalk и другими динамическими языками (в отличие от С) обладает средствами
для низкоуровневых манипуляций с компьютером. Вы можете создать свой собственный тип данных и
подсунуть его компилятору так, чтобы он принял этот тип за встроенный. Вы можете управлять
вызовами своих функций, обращениями к переменным классов, выделением и освобождением памяти,
инициализацией и удалением объектов — и все это (в основном) происходит без потери
эффективности или безопасности типов. Но в отличие от других языков, если эта сила будет применена
неправильно, программа на С++ «грохнется». А если устоит программа, грохнутся ваши коллеги-
программисты — если вы не придумаете, как пояснить свои намерения и использовать правильную
идиому для особенно сложных моментов. Как известно, Дедал со своим сыном Икаром бежал и
заточения на Крите с помощью крыльев, сделанных из перьев и воска. Дедал, главный архитектор и
изобретатель, спокойно порхал где-то внизу. Его безрассудный сын поднялся слишком высоко к
солнцу и упал в море. Хммм… Нет, пожалуй, аналогия получилась неудачная. Ведь именно Дедал
построил Лабиринт — такой сложный, что в попытках выбраться из него люди либо умирали, либо
попадали на обед к Минотавру. Может, попробуем более современную аналогию? Используя
низкоуровневые возможности С++, вы действуете, как суровый детектив с его сакраментальной
фразой: «Доверься мне — я знаю, что делаю». Компилятор закатывает глаза и безмолвно подчиняется.
С++ интригует своими явными противоречиями. Его гибкость легко превращается в главный источник
ошибок. За возможности его расширения не приходится расплачиваться скоростью или объемом кода.
Он элегантен в одних руках и опасен в других, прост и сложен одновременно. После нескольких лет
работы вы так и не можете решить, восхищаться им или проклинать. Да, настоящий знаток понимает
все концепции, лежащие в основе языка и склоняющие чашу весов в его пользу. Эти концепции не
видны с первого взгляда; чтобы понять их, необходимо в течение нескольких лет пытаться решать
совершенно разные задачи. Некоторые архитектурные парадигмы лучше всего соответствуют
конкретным языковым решениям. Их неправильное сочетание обернется хаосом, а правильное —
элегантностью.
Jeff Alger, «C++ for Real Programmers».

Chupa

"Миллионы мух не могут ошибаться."
Ты выделил курсивом именно это.
В продолжнение темы:
литературный журнал компьютерра недавно
опубликовал очередное творение P.Graham'а.
Как всегда про хаккиров и правильные языки.
http://www.computerra.ru/think/35350/
http://www.computerra.ru/think/35404/

Ivan8209

Что, в Си++ появилось возведение в степень?
> С++ --- это на самом деле не столько язык, сколько инструмент
> для создания ваших собственных языков.
Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
> Проблема решается так же элегантно, как это сделал бы
> настоящий язык типа Smalltalk или Lisp, но при этом ваш
> процессор не дымится от напряжения, а на Уолл-Стрит не растут
> акции производителей чипов памяти.
Как насчёт Си++ на 8-разрядных машинах?
А вот смолтолковские были.
> С++ --- вообще не язык. Это мировоззрение или наркотик,
> меняющий способ мышления.
Императивный стиль мышления настолько не нов, что менять его
надо именно с помощью императивного языка.
Кстати, ты хоть раз пробовал создавать на основе Си какой-нибудь
язык?
> Вы можете создать свой собственный тип данных и подсунуть его
> компилятору так, чтобы он принял этот тип за встроенный.
Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
до "BINARY(48)", чтобы подсунуть его вместо встроенного
неизвестной разрядности.
Заодно расскажи, как средствами языка Си замерить собственную
разрядность и сразу же использовать её в своей программе.
Да, очередное "Real Programmers Don't Use Pascal" не надо.
В подобных случаях некто Луговский предлагает отправлять в
биореактор.
Последнее время я склоняюсь к тому, чтобы с ним согласиться.
---
...Я работаю антинаучным аферистом...

Dasar

> Что, в Си++ появилось возведение в степень?
функцию pow уже отменили?
> Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
функциональную парадигму же сделали, да и lazy-вычисления тоже.
> Как насчёт Си++ на 8-разрядных машинах?
и в чем проблема?
C++ и сейчас используется на 8-битных процессорах
> Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
> до "BINARY(48)", чтобы подсунуть его вместо встроенного
> неизвестной разрядности.
Берешь любой класс LargeNumber и используешь. http://www.codeproject.com/cpp/largenumber.asp
> Заодно расскажи, как средствами языка Си замерить собственную разрядность
sizeof
> и сразу же использовать её в своей программе
int q[sizeof(long)];

yolki

хм. а сейчас есть восьмибитные процессоры?
Кажись даже легендарный Z80 был 16-битным..

Dasar

> а сейчас есть восьмибитные процессоры?
8-битные процессоры сейчас активно используются в промышленных контроллерах, бытовой технике и т.д.

yolki

Название хоть одного?

Chupa

потомки i8051 вроде бы до сих пор популярны
PS насчёт z80 тебя обманули

Dasar

Z80
intel-8080
motorola M68HC08
8051/8052 MCU

buka

Любой язык не для всех. Кому-то этот язык не нравится, ему бросаются в глаза недочеты, которые он считает непростительными. Вот так и появляются новые языки.
Если ты не любишь С++ — не пиши на нем. Зачем его чернить на форуме? Тебе не нравиться, что большинство его приемлет, если не любит? Тогда создай свой, настолько хороший, что все на него перейдут.
Всем, надеюсь, понятно, что С++ Лиспом или Перлом не заменишь — так нехрен их постоянно сравнивать. Они для разных целей и разных людей.
P. S. Ах да, насчет мух. Если ты больше мухи, расскажи, пожалуйста, что такого великого написал ты? Достаточно великого, чтобы отбрасывать тень среди толпы С++-программистов.

Ivan8209

>> Что, в Си++ появилось возведение в степень?
> функцию pow уже отменили?
static unsigned long int buf[pow(2,12)];
>> Попробуй создать на нём DSL хоть сколько-то отличающийся от
>> процедурного.
> функциональную парадигму же сделали,
> да и lazy-вычисления тоже.
DSL --- это не только парадигма.
Из "живого" проекта:
ПЛОСКОСТЬ Базовая
ПРЯМАЯ Прямая1
ПРЯМАЯ Прямая2
УГОЛ МЕЖДУ Прямая1 И Прямая2 БАЗА Базовая
HОМИHАЛЬHО 18
+ДОПУСК 0.1
-ДОПУСК -0.1
> C++ и сейчас используется на 8-битных процессорах
Hosted?
>> Заодно расскажи, как средствами языка Си замерить собственную разрядность
> sizeof
И что, для sizeof(int) оно покажет 32?
---
...Я работаю антинаучным аферистом...

Ivan8209

С++ легко заменяется Лиспом.
И выгоды от этой замены очевидны.
Это понятно любому, кто достаточно с ним знаком.
---
...Я работаю антинаучным аферистом...

Ivan8209

Кстати, о больших числах.
Заменить "(unsigned) (long) int" я могу?
Или придётся везде перебивать "(unsigned) (long) int" в
"(UL)Int"?
И где, после этого, хвалёная переносимость?
---
...Я работаю антинаучным аферистом...

kokoc88

Можно вопрос? Это ж как, например, написать Doom3 на ЛИСПе? И какие от этого будут выгоды?

Ivan8209

Во-первых, будет настоящая, а не выдуманная, переносимость.
Во-вторых появится распараллеливаемость на сколько есть
процессоров, и этим будет заниматься компилятор.
Наверняка появится ещё что-нибудь.
---
...Я работаю антинаучным аферистом...

buka

Так же, как и недостатки. Пример ОС на ЛИСПе? Или мы говорим о б. м. в.?
P. S . бесконечно мощный вычислитель =)

Ivan8209

Ключевое слово: Symbolics.
---
...Я работаю антинаучным аферистом...

buka

Прошу простить, счет на Интернет опустел полчаса назад. И как, работает?

kokoc88

Ага, и сколько эта твоя переносимость оставит от FPS? И кто купит такую игру, если у большинства стоит винда, и им эта переносимость никуда не впилась - они думают о динамичности игры. И потом, я слабо понимаю, как всё-таки его написать на ЛИСПе?

Ivan8209

Работает.
Кстати, объяснишь, почему DoD выбрала в качестве стандартных
языков для СРВ Аду и Лисп?
Можешь задуматься.
---
...Я работаю антинаучным аферистом...

Ivan8209

Их легко может оказаться даже больше.
Учи матчасть.
---
...Я работаю антинаучным аферистом...

kokoc88

Их легко может оказаться даже больше.
Я в этом ОЧЕНЬ сильно сомневаюсь.
Учи матчасть.
Ответ-отмазка. Я всё понял, спасибо за коментарии.

smnikiforov

>Их легко может оказаться даже больше
ну да, конечно

Chupa

Да ты, оказывается, спец по женской логике:
сразу сделал недостающие выводы, чтобы воспринять всё как личное оскорбление.

smnikiforov

И где, после этого, хвалёная переносимость?

если ты пишешь не переносимый код - это твои проблемы, а не плюсов

buka

К сожалению, я не знаю этих обозначений.
Задуматься почему кто-то, пусть, скажем, Microsoft, пользуется VB... Потому что им нужен он. Но это не значит, что он нужен везде и всегда.

Dasar

> static unsigned long int buf[pow(2,12)];


template<int k, int n>
class pow
{
public:
enum{
value = k * pow<k, n-1>::value
};
};
template<int k>
class pow<k, 1>
{
public:
enum
{
value = k
};
};
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long int q[pow<2, 12>::value];
std::cout << sizeof(q) << std::endl;
return 0;
}


> И что, для sizeof(int) оно покажет 32?
юзай тогда numeric_limits<unsigned long int>::max

buka

Это провокация? Мол, обижусь за применение понятия «женственности» к себе — значит, что я что-то там додумал и тем самым подтвердил твои слова, придавая им основательность? Или подумав вышеописанное я уже совершил этот шаг?
Нет уж, дудки. Считай, что я ничего не писал. Эсли вспылил лишнего — прости, но за «мух» обидно.

Ivan8209

Агностический скептик?
Для того, чтобы знать, нужно знать.
А пересказывать учебник по общему шёпоту я считаю занятием
бесполезным. Захочешь --- сам прочитаешь.
---
...Я работаю антинаучным аферистом...

Ivan8209

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


CREATE Table szTable ALLOT
MARKER forget-it
: fill-table ... ;
fill-table
forget-it


Я знаю, что это обходится через make,
но опять же --- это от бедности.
---
...Я работаю антинаучным аферистом...

Dasar

> Не хватает препроцессора --- возьми препроцессор помощнее.
Совсем не согласен.
Препроцессор - это зло: препроцессор работает с текстом, а не с программой.

Ivan8209

Можно подумать, что я согласен.
Только почему-то твой pow для компиляции имеет сильно
отличающийся от обычного синтаксис.
Хотя выполняет, казалось бы, не очень-то сложное действие.
---
...Я работаю антинаучным аферистом...

buka

Ну, зря Вы так, батенька!
C суть Assembler, переносимый за счет макроопределения команд процессора.
С++ суть C, удобный за счет макроопределения всего остального =)
Вот перегрузка — добро? Добро!
А шаблоны? Ого-го-го!
Если язык должен хорошо транслироваться в машинный код, то он должен, ну просто обязан, быть макро...макроассеблером.

Ivan8209

> Если язык должен хорошо транслироваться в машинный код,
> то он должен, ну просто обязан, быть макро...макроассеблером.
Он должен быть как можно больше непохож на машинный код.
Иначе ты проиграешь как на разнице в уровнях абстракции,
так и на переносимости.
---
...Я работаю антинаучным аферистом...

Ivan8209

Это проблемы плюсов.
Потому что в переносимом коде могут и должны быть написаны
требования к среде исполнения.
Плюсы этого не позволяют сделать никак.
---
...Я работаю антинаучным аферистом...

Ivan8209

Не обратил раньше внимания.
> С++ --- это Cobol 90-х, политически выдержанный язык, который
> гарантирует финансирование вашего проекта высшим руководством.
Ты видел хотя бы одну программу на Коболе?
В ней обязательно, обязательно описываются требования к
инструментальной и целевой машинам.
Сможешь ты в Си написать требования к разрядности слова,
на которую расчитана программа?
Кстати, Кобол использовался раньше для того, для чего сейчас
используется SQL.
Да, и сравнения наподобие "Кобол наших дней" употребляется после
некоторых событий исключительно в отрицательном смысле.
---
...Я работаю антинаучным аферистом...

smnikiforov

>Это проблемы плюсов.
не, твоя
>Плюсы этого не позволяют сделать никак.
учи матчасть

buka

>> Если язык должен хорошо транслироваться в машинный код,
>> то он должен, ну просто обязан, быть макро...макроассеблером.
>Он должен быть как можно больше непохож на машинный код.
>Иначе ты проиграешь как на разнице в уровнях абстракции,
>так и на переносимости.
Это опровержение или подтверждение?
А за Джеффа говорить не буду.

Ivan8209

Ну-ну.
Переведи на плюсы следующее:


X: digits 30;
N: INTEGER range 0..2**48;


Хотя бы это.
---
...Я работаю антинаучным аферистом...

Ivan8209

Опровержение.
---
...Я работаю антинаучным аферистом...

Dasar

> Переведи на плюсы следующее
Я же тебе уже давал ссылку на класс largeNumber
я правильно понял, что digits - это десятичные цифры?
Будет:
largeNumber<log<pow<10, 30>::value, 2>::value > x;
largeNumber<48> y;
ps
Задачи ты ставишь немножко некорретные, ты берешь то, что уже встроено в язык, и предлагаешь - это сделать на другом языке - конечно, другой язык проиграет, если это в него не встроенно.
Интересннее сравнивать на тех задачах, которые и там, и там не вcтроенны.
1. Вот допустим, как будет выглядеть реализация complex-ного числа повышенной точности на твоем любимом языке? интересует тот случай, если такие числа не встроены в сам язык.
2. Или реализация разреженной матрицы? Причем желательно, чтобы способ работы отличался незначительно от обычной матрицы(массива).

Ivan8209

В моём любимом языке я могу переопределить всё.
Например, так:


: * 2dup = over 2 = and if 2drop 5 else * then ;


Когда я работал на другой разрядности, было дело, что пришлось
её резко увеличивать вдвое.
С тех пор у меня есть числа удвоенной точности.
И учетверённой --- тоже.
Кто-то из "братьев по духу" делал числа утроенной точности.
Так что и это не беда.
Если делать матрицу и массив по-алгольному,
как int*int*...*int -> ref чего-то, то безразлично,
будет ли она разрежённая или неразрежённая.
Кстати, и в другом моём любимом языке я могу делать всё:


(define old-* *)
(define (* x y) (if (and (= x y) (= x 2 5 (old-* x y


Надо уметь выбирать любимые языки.
---
...Я работаю антинаучным аферистом...

Dasar

> тех пор у меня есть числа удвоенной точности.
Ты не уходи от задачи.
Приведи, плиз, пример, который позволяет использовать complex-ные числа произвольной точности.
Особенно подчеркиваю слово complex-ные, и особенно подчеркиваю слово "произвольной".

Dasar

(define old-* *)
(define (* x y) (if (and (= x y) (= x 2 5 (old-* x y
но в этом языке полиморфизма не видать, как своих ушей, я правильно понял?

Dasar

> Надо уметь выбирать любимые языки.
Состыковывать (кроме командной строки) - ты свои любимые языки умеешь?

Ivan8209

Неправильно.
number? и прочие есть.
Так что всё в порядке.
---
...Я работаю антинаучным аферистом...

Ivan8209

FICL --- встраиваемый, Guile --- тоже.
---
...Я работаю антинаучным аферистом...

Ivan8209

Они делаются ненамного сложнее чисел двойной точности.
Точно так же определяешь нужные операции для твоих чисел и вперёд.
---
NON PLVS VLTRA

Dasar

> number? и прочие есть.
Пример приведи, плиз.

Dasar

ЧТо значит "встраиваемый"? Встраеваемый куда?

Dasar

> Точно так же определяешь нужные операции для твоих чисел и вперёд.
Приведи пример, плиз, иначе - это голословное утверждение. Или хотя бы идею примера.

Ivan8209



vocabulary complex immediate
( default single precision )
: re forth fdrop ;
: im forth fnip ;
: + forth frot f+ frot frot f+ fswap ;
: minus forth fswap fminus fswap fminus ;
: - minus + ;
: dup forth fover fover ;
: drop forth fdrop fdrop ;
( Da Capo )


В итоге получаешь словарик, в котором все числа комплексные
нужной точности, а действия над ними обозначаются точно так же,
как и действия с остальными числами.
Разрядность замеряется обычным способом.
Например, через 4-(4/3)*3.
Во время компиляции принимаем решение, сколько раз
удваивать-утраивать-упятерять и собираем нужные
пары-тройки-пятёрки.
Требуемая точность обеспечена.
Так и получается "D.-S." расширение языка.
---
...Я работаю антинаучным аферистом...

shlyumper

Их очень много. Выпускают практически все крупные производители микросхем, научившиеся делать flash-память, и многие другие. А к вопросу сущестования C++ на них - например, IAR Systems имеет немного урезанный (по сравнению со стандартом) Embedded C++, который замечательно пашет примерно на двух десятках архитектур различных 8-битных контроллеров, процессоров и DSP.

Dasar

> Во время компиляции принимаем решение
Как это делается?

Ivan8209

Хм.
Как обычно.
А для чего, иначе, нужны IMMEDIATE и POSTPONE/COMPILE/[COMPILE]?
---
...Я работаю антинаучным аферистом...

Dasar

А пример по полиморфизму?

Ivan8209



(define number-* *)
(define (* x y)
(cond and (number? x) (number? y (number-* x y
and (list? x) (list? y)
(= (length x) 2) (= (length y) 2) ... )
;; Насколько ты параноик?
(list (apply - (map number-* x y
(apply + (map number-* x (reverse y
(else ...


В другом случае, есть очень хорошие средства управления
областями видимости, а потому всё обеспечивается простым их
переключением.
---
...Я работаю антинаучным аферистом...

evgen5555

Сие есть не что иное, как идиотизм.

Ivan8209

Сие есть расширение языка внутренними его средствами.
Предложи решение сравнимой сложности для Си.
Плюсы уже могут вылететь по несравнимо большей сложности их самих.
---
...Я работаю антинаучным аферистом...

Dasar

ИМХО, это не полиморфизм.
При полиморфизме решение о том, что надо делать, делается на стороне вызываемомого, а не на стороне вызывающего.

Ivan8209

Ну так сделай полиморфизм в Си без плюсов.
На том же уровне сложности.
Кстати, ты ещё различай относящееся к реализации расширения
языка и расширенному языку.
Оба решения допускают задание требуемой наименьшей точности.
Причём в рамках самих языков: с тем же синтаксисом, скрывающим
особенности реализации.
Основная мысль.
Отсутствие средства в исходном языке достаточно просто
уравновешивается возможностями развития языка:
при отсутствии готового решения возможно создание чуть более
дорогого заместителя, не требующего существенной переработки
исходного текста.
При отсутствии прямого, непосредственного решения, обходное
решение получается заполнением разрыва между требованиями
программы и возможностями инструмента, а не существенной
переработкой программы в расчёте на меньшие требования.
Вот это и понимается под переносимостью.
---
...Я работаю антинаучным аферистом...

smnikiforov

>Плюсы уже могут вылететь по несравнимо большей сложности их самих.
"сказки от КОНТРЫ" ч.2

smnikiforov

100-й пост ветки. КОНТРА наконец соизволил огласить
Основную мысль

Dasar

Вот точь-точь тот полиморфизм, как у тебя в коде.


#define add old_add
#include "something.h"
#undef add
void add (Data data)
{
if (isNumber(data
old_add(data);
else
...
}

Ivan8209

Так где же ваш 48-разрядный "int" с действиями,
обозначаемыми такими привычными "+", "-", "*" и тому подобными?
---
...Я работаю антинаучным аферистом...

Dasar

В плюсах будет и это.

Ivan8209

du -h /mnt/distfiles/scheme48-1.1.tgz
2.0M /mnt/distfiles/scheme48-1.1.tgz
Полностью соответствует R5RS.
Пример столь же сложных компиляторов приплюснутых сей,
соответсвующих последнему принятому стандарту языка?
---
...Я работаю антинаучным аферистом...

Ivan8209

Разве "int" уже не является зарезервированным?
---
...Я работаю антинаучным аферистом...

Dasar

Является.
Почему ты считаешь, что это создает какую-то серьезную проблему?

Ivan8209

Ни "class int", ни "typedef ... int" не пройдут.
Или ты предлагаешь "#define"?
---
...Я работаю антинаучным аферистом...

Dasar

чем плох MyInt?

Ivan8209

Тем, что понадобится проходить везде и править.
Причём автомагически сделать это не получится из-за "func(...)" и "unsigned".
---
...Я работаю антинаучным аферистом...

Dasar

replace "int" "MyInt<Signed>"
replace "unsigned\b+int" "MyInt<Unsigned>"

smnikiforov

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

Ivan8209

"unsigned"?
"...; f(...){...}"?
"unsigned /* .... */ int"?
Видишь, тебе уже приходится заморачиваться для того, чтобы всего
лишь заменить встроенный целый тип новым целым типом.
Хотя особых препятствий к этому быть не должно.
А как замерять имеющуюся разрядность?
Что, если заголовочных файлов не будет?
Здравствуй, напильник?
---
...Я работаю антинаучным аферистом...

Ivan8209

Тем не менее, даже использование самого навороченного
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.
В битах.
В качестве первого приближения использую исключение повторений
посредством кодирования gzip-ом (LZ77+Huff, что ли?).
---
...Я работаю антинаучным аферистом...

smnikiforov

Тем не менее, даже использование самого навороченного
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.

тавтология какая-то
>В битах
>В качестве первого приближения использую исключение повторений
и какой смысл несёт такое "определение" сложности в применении к вот этому:
Плюсы уже могут вылететь по несравнимо большей сложности их самих.
?

mirt1971

Вот Вы тут много говорили про выразительность. А можно вопрос поставить ребром? Что вы сможете сделать такого на Лиспе(или другом языке) чего я не смогу сделать на C++? Да, Вы не должны мне указывать КАК это сделать(ЭТО не будет похоже на Лисп ) ). Вот когда Вы мне представите такую задачу, я признаю что C++ менее выразителен чем выбранный Вами для демонстрации язык.

yolki

Вот я о том же. хотелось увидеть пару восьмибитных процессоров - а уж компиляторы С++ я для них нашёл бы. просто мне убегать надо было и поиском некогда уже стало заниматься.
Так что утверждение про то, что С++ для 8-битных процессоров нет - неверно

Ivan8209

Читай выше.
Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь.
Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил.
Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.
---
...Я работаю антинаучным аферистом...

Ivan8209

У меня дома на полке лежит КР580ИК80.
Могу достать за относительно обозримое время: 6809, 6811, Z80A, 8051, PIC-16XX.
Как, кстати, с поддержкой платформ большей разрядности?
Всё так же будете перемножать 48-разрядные числа кусками по 16 разрядов?
А 22-разрядные --- по 11?
---
...Я работаю антинаучным аферистом...

smnikiforov

>Читай выше.
>Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь
ты что-то не то там вычитал, выше. может. перечитай
>Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил
КОНТРА, твои беды/непонимания от заблуждения, что плюсы - диалект сей это не так, почитай вышеприведённого Элджера на досуге. много нового узнаешь о плюсах и сказках
>Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
опс, опять "сложность" всплыла. я правильно тебя понял, что это означает, что решение большей части задач на Си занимает больше битов чем на Лиспе?
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.

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

Ivan8209

Я знаю, что приплюснутые си к обыкновенным относятся только посредством покалеченных скобок.
Тем не менее, ограничения простых сей в приплюснутых не преодолены.
Добиться можно чего угодно, только какой ценой?
Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
То есть, чтобы писалось "unsigned long int A[pow(2,14)];", а не чего-то там с угловыми скобками и двоеточиями.
И чтобы сдвиг Бернулли (или как оно называется) записывался через

x = (a*x) % m;


с _одним_ умножением.
А не через

x = a*(x%(m/a - (m%a)*(x/(m/a; if(x<0) x+=m;


с двумя умножениями и условным переходом.
---
...Я работаю антинаучным аферистом...

mirt1971

Ты не понял. Мне не нужна задача по обработке кода(заменить чего-то там на что-то там). Ты приведи мне полную постановку задачи как заказчик: входные данные, выходные данные, интерфейс, etc... Тогда и поговорим. А то что ты говоришь доказывает только то что Лисп(например) работает лучше чем С++ в качестве препроцессора и не более. Вот так.

Ivan8209

> Ты приведи мне полную постановку задачи как заказчик:
Если "как заказчик" --- это никак не относится к
> входные данные, выходные данные, интерфейс, etc...
> А то что ты говоришь доказывает только то что Лисп (например)
> работает лучше чем С++ в качестве препроцессора и не более.
Это доказывает только то, что ты не знаком ни с чем, кроме С++.
> Вот так.
---
...Я работаю антинаучным аферистом...

mirt1971

Делать такие поспешные выводы на основании всего одной фразы... Это признак недалекого ума. Во первых, я знаю не только C++. Во вторых, я знаком с некоторыми функциональными языками программирования(например Lisp(как часть(и основа) emacs ocaml, очень мало - Haskell). Конечно я знаком с ними меньше чем ты, но моих знаний хватает для того чтобы делать о них некоторые выводы. Функциональные языки не универсальны - я не представляю себе базу данных, созданную на Lisp. C++ же универсален. На нем можно решить ЛЮБУЮ задачу(может быть и с большими затратами труда нежели чем не Lisp(к примеру. Следовательно, он более выразителен(чтобы не было вопросов, под выразительностью я понимаю возможность ВЫРАЗИТЬ ту или иную программу на конкретном языке). Да, ты так и не привел задачу, о которой я тебя просил

Dasar

> И чтобы сдвиг Бернулли (или как оно называется) записывался через
Ты видешь большую разницу между "x = (a*x) % m;" , "x = BernulliShift(x, a, m)", "x = mod(a*x, m)"?
1. Вся разница между этими записями только "в привычке".
2. Расчетные задачи сегодня составляюь очень маленькую долю от ПО, которое пишется, поэтому реально очень редко возникает потребность в перекрытии операций.

smnikiforov

>Добиться можно чего угодно, только какой ценой?
то есть у тебя больше не осталось сказок о непереносимости плюсов? это хорошо
>Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
довольно бессмысленное требование, с учётом того, что ты вкладываешь в понятие "тот_же_синтаксис"
внимание, вопрос: а зачем это всё? кому это нужно?
я считаю, что запись MyInt A(pow(2,14; - это запись в том_же_синтаксисе. тем паче, что с А далее везде можно обращаться так же, как с переменной встроенного типа
>И чтобы сдвиг Бернулли (или как оно называется) записывался через
ДА! И чтобы эти изверги не смели писать if(a=b)
p.s. надуманные у тебя проблемы какие-то любители SmallTalk-а хоть к более интересным вещам придираются, типа сборки мусора

Chupa

> я не представляю себе базу данных, созданную на Lisp
Обращаю внимание, что это недостаток исключительно твоего
воображения и ни в коем случае не лиспа.
> C++ же универсален. На нем можно решить ЛЮБУЮ задачу [...]
> Следовательно, он более выразителен.
Нихуя не "следовательно".
Данная импликация взята из воздуха (м.б. это "признак недалекого ума"?).
Возможность решить с помощью языка любую задачу называется алгоритмической
полнотой, если ты не в курсе. Кроме лиспа и плюсов таким свойством обладает ещё,
например, машина тьюринга.
"Следовательно, машина тьюринга более выразительна."
Говоря проще, "LOL, бля!"

mirt1971

Для меня интересна не просто возможность решить задачу, а решить ее за приемлимое время/деньги/etc. Так вот, если ты не понял, то я имел в виду что на C++ можно решить любую задачу за приемлимое время/деньги/etc, чего нельзя сказать про Lisp/.../... В конце концов, почему императивные языки общеприняты, а функциональными пользуются только небольшим количеством разработчиков? Единственная достойная область для функциональных языков - вычисления и искуственный интеллект. Все. Да, в догонку, - некоторые люди считают что функциональные языки прощают огрехи проектирования(да вот к примеру КОНТРА тут все пытался выспросить как int заменить на нечто другое - при правильном проектировании такой задачи даже не возникнет). А это не есть хорошо, потому что эти огрехи вылезут рано или поздно, и починить программу уже будет намного сложнее.

Chupa

> Для меня интересна не просто возможность решить задачу,
> а решить ее за приемлимое время/деньги/etc.
Обращаю внимание ещё раз: решить задачу твоими силами
или понятными тебе методами.
> В конце концов, почему императивные языки общеприняты,
> а функциональными пользуются только небольшим количеством разработчиков?
Опять "миллионы мух"... Почитай Graham'а чтоли, он как раз про это рассказывает.
Впрочем, просветление вряд ли наступит, но об этом в другой умной книжке написано.
> Единственная достойная область для функциональных
> языков - вычисления и искуственный интеллект. Все.
Ты о классической музыке по телефонным напевам судишь?
Вот когда научишься "любую задачу" решать и на ФЯ, и на ИЯ,
то я даже тебя послушаю относительно областей применения
того и другого.
> Да, в догонку, - некоторые люди считают что функциональные языки прощают
> огрехи проектирования...
Я не знаю, что именно утверждает контра, но огрехи проектирования не прощает никто.
Однако рефакторинг проги на плюсах производить гораздо сложнее, чем на ФЯ
(доводилось заниматься и тем, и другим).
А "правильное проектирование" -- это отображение функционального представления
в голове архитектора на код проекта ("как оно должно работать" в "что именно оно
должно для этого делать").

mirt1971

1) Ну хорошо. А нельзя ли мне показать несколько ссылочек на большие проекты, использующие функциональные языки?(про емакс я знаю).
2) Человек - не муха. Поэтому аналогии с мухами здесь абсолютно неуместны(кстати и не с мухами вовсе, а с леммингами). Программисты в основе своей довольно неглупые люди. Поэтому если большинство программистов предпочитает императивные языки...
4) Классическую музыку я предпочитаю просто слушать. Вот сейчас в моем playlist'е как раз Вивальди заиграл
5) Уметь решать и решать с приемлимыми трудозатрами - понятия никак не связанные. Ну покажи мне хоть одну базу данных, написанную на Lisp.
6) Вот еще что интересно, я просто пытаюсь высказать свое мнение по техническим вопросам, а моих глубокоуважаемых оппонентов все время почему-то тянет переходить на личности...

Chupa

Ничего удивительного: ты высказываешь своё мнение,
а следовательно сам переводишь разговор на свою личность
(надеюсь, ты не считаешь его суперобъективным и единстенно верным?).
Показывать и доказывать я ничего не собираюсь, так как уже сейчас вижу,
что это будет впустую (переубедить человека невозможно, если он этого
сам не хочет а вот указать на недостатки аргументации и элементы
фанатизма могу (так же, как и заметить подобные вещи за собой,
но в меньшей степени, т.к. со стороны наблюдать гораздо проще).
Просто представь возможность того, что мир может быть устроен чуть иначе,
чем тебе кажется сейчас, тогда ты сам найдёшь необходимые доказательства
или опровержения (вдруг я тебя обманываю? или всё-таки не обманываю?).
Само наличие людей, у которых после знакомства с ФП изменилось представление
о программировании (даже если они по-прежнему пишут на плюсах) или даже
об устройстве мира, должно свидетельствовать, что здесь, как минимум, не всё просто.
А программисты в первую очередь -- обычные люди, поэтому им свойственно
человеческое поведение, которое далеко не всегда является "умным".
Чаще всего оно подвержено первобытным инстинктам выживания
и членства в иерархии стада, нежели интеллекту, да и сам интеллект
от программистов требуется не всегда.

mirt1971

1) А ты сам можешь представить что мир устроен иначе и что функциональное программирование - никому не нужная вещь?
2) Ты не хочешь показывать и доказывать по другим причинам. Прежде всего потому что таких проектов сейчас нет. Раньше - были(тот же Symbolics. Но где он сейчас?). Сейчас специально прошвырнулся в Гугле. И действительно, есть проекты, написанные на Лиспе(или других ФЯ) - но это только системы вычислений(Maxima например) и AI.
3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация. Каковой я до сих пор не увидел
4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более )
5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление о программировании( я например) тоже много о чем говорит.
6) Может все-таки кинешь несколько ссылок?

Ivan8209

Да.
Между этими записями есть громадная разница.
Если в первой и третьей у тебя записано одно умножение и одно деление,
то во второй неизвестно, сколько действий и каких.
И в сях имеет громадное значение способ записи, который ты используешь.
Я хорошо знаю, что такое переполнение.
Про нерасчётные задачи я потом расскажу, не волнуйся.
Там тоже есть, о чём поговорить.
Например, о bzero, memcpy и т. п.
---
...Я работаю антинаучным аферистом...

Ivan8209

БД на ФЯ делаются заметно проще, чем на ИЯ.
И язык запросов там не надо отдельный наворачивать.
"Почему императивные языки общеприняты, а функциональными пользуется
только небольшое количество разработчиков?"
Ну так! "...Миллионы мух не могут ошибаться!"
Ты, кстати, не понял, к чему относилась часть про "int."
Думай дальше.
И Ада, и ПЛ-1, к твоему сведению,--- императивные.
---
...Я работаю антинаучным аферистом...

Chupa

> 1) А ты сам можешь представить что мир устроен иначе
> и что функциональное программирование - никому не нужная вещь?
Твоя категоричность -- явный признак фанатизма.
Мне не нравится мир, в котором нет ФП, да и в окружающей меня действительности ФП есть и нужен.
Но я могу легко себе предствить толпы его не использующих "real programmer'ов"
(т.е. в качестве почти никому не нужной вещи и даже представить, откуда эти толпы берутся.
Вообще, обладание дополнительными знаниями -- всегда бонус,
в отличие от уверенности в ненужности этих знаний.
> 2) Ты не хочешь показывать и доказывать по другим причинам.
> Прежде всего потому что таких проектов сейчас нет.
Опять категоричность.
darcs -- система распределённой коллективной разработки.
Написана на haskell, от конкурирующих систем отличается
в первую очередь наличием теоретической базы.
Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
> Раньше - были(тот же Symbolics. Но где он сейчас?).
> Сейчас специально прошвырнулся в Гугле.
> И действительно, есть проекты, написанные на Лиспе(или других ФЯ) -
> но это только системы вычислений(Maxima например) и AI.
То, что ты кратко сформулировал, в виде AI, можно сказать по другому:
трудно формализуемые задачи, где начиная работать над проектом невозможно
сказать, как должен выглядеть результат. В частности, обработка естественных
языков (самый большой проект на хаскеле -- 50k строк -- занимается обработкой китайского).
Как только задача формализуется в достаточной степени, её переписывают
на какой-нибудь c++, после чего она начинает работать быстро, но теряет
гибкость.
А прототипы некоторых систем долгое время живут исключительно в виде
программулек на ФЯ (или даже в виде математических формул
потому как ещё нет возможности перенести заложенную в них идею
в "настоящий" проект (понимание принципа работы и логика верхнего
уровня есть, а привязки к конкретным данным ещё нет).
В частности, программы для обработки других программ.
Я уже писал про отображение функционального представления в императивный код,
все известные мне примеры и проекты на ФЯ служат одним из этапов этого отображения:
сначала модель в голове/на бумаге/на ФЯ для эффективного представления идей,
потом промышленная реализация на ИЯ для эффективного отображения на аппаратуру.
Только некоторые модели живут в функциональном виде слишком долго,
дожидаясь эффективной реализации, а некоторым такое представление оказывается ненужным.
> 3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация.
> Каковой я до сих пор не увидел
Нет. Нужна прежде всего не нормальная внешняя аргументация, а собственная мотивация.
Тем более речь идёт о сопоставлении различных парадигм, и аргументация здесь не поможет.
Нужно сначала самому увидеть, а потом уже оценить и сравнить.
Категоричность при этом должна исчезнуть: две реальности равноправны,
и в каждой из них можно жить, но у обеих есть преимущества и недостатки.
> 4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более )
Что подразумевается под "моим мнением"? Я пока старался ничего не утверждать.
Несогласие с формулировками наподобие "никому не нужен" и "ФЯ -- это всего лишь..."
ещё не есть проявление какого-либо моего мнения.
А рассуждения относительно областей применения я готов корректировать,
универсальных средств не бывает.
> 5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление
> о программировании( я например) тоже много о чем говорит.
О том, что ФП сложно для понимания?
Или о том, что эти люди не сумели соотнести абстракцию ФП с окружающей действительностью?
Или то, что в действительности ФП невостребовано?
Любые факты доказывают человеку только то, что он хочет видеть.
> 6) Может все-таки кинешь несколько ссылок?
Тут постили однажды lisp success story by P.Graham,. он на личном опыте рассказывал,
почему lisp может сильно порулить в startup'ах: http://www.paulgraham.com/avg.html
Ещё другие статьи: http://www.paulgraham.com/articles.html
Об особенностях восприятия: http://warrax.croco.net/Satan/Books/quantum/cover.htm
Откуда берутся знания и как промываются мозги: http://warrax.croco.net/51/evolution/cover.html
Ещё можно какую-нибудь философию почитать типа Поппер/Кун/Лакатос/Фейерабенд,
философия науки очень хорошо отображается на философию программизма.
Самые интересные вопросы в области сопоставления парадигм как раз относятся к философии и психологии,
нежели идиотизм "какой язык лучше?", так упорно развиваемый в этом треде.

buka

Товарищ зачинщик, не пора ли в заголовок добавить «о ослиспленных счастьем функционального программирования»?

Zeffa

мнение....
Есть математики геометры, а есть алгеброиды. Могут решить одну и туже задачу подходя к ней с разных сторон. Они принципиально мыслят по разному. Также различием в мышлении отличаются математики от физиков или скажем инженеров. Математические рассуждения - рассуждения на уровне абстракций.
ФЯ - математики
математики - абстрактное мышление.
Понятно, что большенству инженеров сложно мыслить в рамках ФЯ. А людей с инженерным мышлением гораздо больше, чем с математическим. Отсюда прямо следует тот факт, что ФЯ не распространены в массах. Просто большенству проще научиться мыслить в рамках ИЯ. Но поскольку в ФЯ заложен больший уровень абстракции, то очевидно, что этоти языки более красивы и гибки (с точки зрения математика ).
Из этого превосходства вытекает минус - большая отдаленность от современных аппаратных средств и медленная скорость работы. Это вторая причина непопулярности. Но если аппаратно-техническая база принципиально изменится...?

shlyumper

Восьмибитных - просто уйма. Во-первых куча на архитектуре i8051, и советских и не советских, есть даже очень интересные модификации, типа Atmel AT83C51SND1 (архитектура 8051, flash-пзу 64кб, mp3-декодер, аппаратная поддержка интерфейсов MMC/DataFlash/SmartMedia/CompactFlash, IDE, USB 1.1, голосовой кодек)
Во-вторых куча специфичных 8bit risc архитектур, типа того же Atmel AVR (для него, кстати, поддержка C++ ожидается даже вскоре в компиляторе GCC. поддержка C для архитектуры avr в gcc уже есть давно, и вполне конкурентноспособная с коммерческими компиляторами).

Ivan8209

> Только некоторые модели живут в функциональном виде слишком
> долго, дожидаясь эффективной реализации, а некоторым такое
> представление оказывается ненужным.
А как ты оцениваешь будущее МЛ-ов?
---
...Я работаю антинаучным аферистом...

Ivan8209

> Из этого превосходства вытекает минус - большая отдаленность
> от современных аппаратных средств и медленная скорость работы.
Вот как ты объяснишь такое дело, что "Эриксон," насколько помню,
для программирования СРВ предлагает Эрланг?
---
...Я работаю антинаучным аферистом...

Chupa

Наличие эффективных реализаций ML и популярность неэффективных Java
наводит на мысль, о том, что скорость работы перестаёт быть критичным параметром,
уступая переносимости, автоматической сборке мусора и прочим высокоуровневым полезностям.
(Разумеется, не везде такое верно.)
При такой тенденции, вероятно, можно ожидать сравнения характеристик языков
(если оно ещё не наступило а также продолжения заимствования императивными
языками свойств функциональных. Растущая сложность, например, приводит
к вопросу полуавтоматической проверки корректности, а для этого нужна матмодель
системы с хорошими свойствами. Ключевое свойство ФЯ - прозрачность по ссылкам -
здесь оказывается чуть ли не единственным спасением: если доказана корректность
(безопасность итп) работы модуля или шаблона приложения, то можно не опасаться
побочных эффектов при его использовании.
То же самое свойство позволяет избежать часть проблем при параллельном исполнении.
Впрочем, я не верю, что переворот в сознании сможет произойти быстро,
но свойства ФЯ будут являться востребованными ещё очень долго.
Нынешняя популярность мультипарадигмальных языков отчасти объясняется этим.
Что касается конкретных предсказаний, то OCaml в виде F# продвигается микрософтом,
так что шансы у него есть, сказать что-либо более конкретное про ML я вряд ли сейчас смогу.

Ivan8209

"Never you have enough RAM.
Never you have enough clock cycles."
Для императивных языков с хорошей блочной структурой отсутствие
побочных эффектов легко проверить и (полу)автоматически.
В отличие от возможности перестановки порядка вычислений.
Последнее, кстати, для оптимизации по скорости очень даже важно.
Про переносимость языков, в которых не описывается требуемая
разрядность, указано выше.
Да, в сторону увеличения разрядности переносить проще
(у меня здесь есть перенесённый код времён, наверное,
ПДП-8, с умножением 22-разрядных чисел кусками по 11 разрядов
но и тогда тоже есть пространство для игры: некоторый код
существенно использует ограничение по разрядности или
представление чисел дополнением до двух.
---
...Я работаю антинаучным аферистом...

Chupa

> Для императивных языков с хорошей блочной структурой отсутствие
> побочных эффектов легко проверить и (полу)автоматически.
Да, именно. Речь шла не о самих ФЯ, а о полезном свойстве ФЯ.

Dasar

> Если в первой и третьей у тебя записано одно умножение и одно деление,
Гон. И подтасовка фактов.
Ты же только, что приводил код, который запросто подменяет стандартные операции.
Соответственно, хоть в коде написанно одно умножение и одно деление - реально их вызов может выливаться, например, в форматирование винчестера - что является довольно ресурсоемкой операцией.
> то во второй неизвестно, сколько действий и каких.
Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
> Например, о bzero, memcpy и т. п.
Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?

Dasar

> Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ. Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается

Dasar

> Как только задача формализуется в достаточной степени, её переписывают
> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
> гибкость.
Зачем переписывают все? Почему не переписывают только критические участки кода? Как, например, поступают при использовании высокоуровневых языков.

Dasar

> Вот как ты объяснишь такое дело, что "Эриксон," насколько помню,
> для программирования СРВ предлагает Эрланг?
Тем, что на ФЯ проще натягивается мат. аппарат, соответственно проще делаются всякие автоматические фичи.
Обращаю внимание на то, что фактически делается уступке машине, а не в сторону человека. Т.е. упрощается работа машины, но не человека.
Из того факта, что на ФЯ проще натягивается мат. аппарат никак не следует, что программы на ФЯ пишутся проще, и получаются лучше - никак не следует.

Chupa

>> Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
> Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
В "реальных условиях" есть требования заказчика и необходимость поддержки кода.
Поддерживать код на ФЯ сейчас сложно, но не потому, что язык для этого не предназначен,
а потому, что некому. Возможностей ФЯ достаточно для реализации многих проектов.
> т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ.
> Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
Откуда взялся такой вывод?

Ivan8209

>> Если в первой и третьей у тебя записано одно умножение и одно деление,
> Гон. И подтасовка фактов.
Ты думаешь, что компилятор сей всегда проверяет на переполнение?
Или он после умножения оставляет промежуточный итог двойной разрядности?
>> то во второй неизвестно, сколько действий и каких.
> Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
Да, если машина не имеет встроенного умножения,
то компилятор должен будет вставлять сложения и сдвиги.
В действительности же, происходит отсечение старших разрядов.
>> Например, о bzero, memcpy и т. п.
> Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
Хорошо.
strcmp, strcpy.
Да, а почему, кстати, остаток находится поразрядным "и"?
---
...Я работаю антинаучным аферистом...

Chupa

>> Как только задача формализуется в достаточной степени, её переписывают
>> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
>> гибкость.
> Зачем переписывают все? Почему не переписывают только критические участки кода?
Переписывают всё, когда возникает необходимость переписать всё.
Про требования заказчиков и поддержку я уже написал.
> Как, например, поступают при использовании высокоуровневых языков.
ФЯ -- высокоуровневые. И они всё это делать позволяют.

Ivan8209

Ещё раз, проверить отсутствие побочных эффектов в Аде не
настолько уж и сложно.
Ада, конечно, не Си, но является императивным языком.
Может, всё-таки, дело в другом?
---
...Я работаю антинаучным аферистом...

Dasar

> Ты думаешь, что компилятор сей всегда проверяет на переполнение?
> Или он после умножения оставляет промежуточный итог двойной разрядности?
1. Замечание важно только в контексте расчетных задач. В реальных задачах, даже в бухгалтерии - таких проблем нет.
2. Да, C-компилятор не отслеживает ошибки переполнения. И что дальше? Как из этого следует, что программы на ФЯ пишутся проще?
> strcmp, strcpy.
хм... Это тоже низкоуровневые команды. И в реальных прикладных программах опять же обычно не используются, и не рекомендуются для использования.
> Да, а почему, кстати, остаток находится поразрядным "и"?
Низкая квалификация (привычка) данного конкретного программиста?

Dasar

> Может, всё-таки, дело в другом?
Да, в другом. Потому что C - априори является низкоуровневым языком.
Позже была предпринята очень удачная попытка добавления высокоуровневых средств, что привело к созданию языка - C++.
Но дальнейшее развитие C++ было подорвано тем, что в C++ так и не устранили ряд существенных недостатков C (отсутствие модулей, отсутствие безопасного режима, отсутствие метаданных и т.д.)

sergey_m

Можно глупый вопрос? Почему у меня этот цикл не даёт аутпута:


for (s = 1; s < ULONG_MAX; s++)
if x = s & 0xffffffffUL) == 0)
printf("Found: %lu\a\n", s);

mirt1971

<= ULONG_MAX?
All works

yolki

условие s<=ULONG_MAX никогда не может быть ложным - выхода из цикла не будет.
Это всё равно, что попробовать сделать такой цикл:


for(unsigned s=10;s>=-10;s--)


и орёт она, когда цикл на второй заход идёт.
для сравнения, можно попробовать такой вариант:


unsigned long s,x,s1;
for (s = 0; s < ULONG_MAX; s++)
{
s1=s+1;
if x = s1 & 0xffffffffUL) == 0)
printf("Found: %lu\a\n", s1);
}


теперь я уже скажу, что All Works, то бишь ничего не печатается

dailies

sizeof(long) == ?

Ivan8209

"...Отрубил Иван-Царевич ему 32768 голов, и умер Змей Горыныч.
Потому что был он шестнадцатиразрядным."


#include <stdio.h>
main(void)
{
unsigned long a,i;
for(a=1,i=0; i<36; a*=2, i++) printf("%u %u\n", i, a);
printf("%d %d\n", sizeof(int sizeof(long;
return 0;
}


Здесь "uname -prs" выдаёт "FreeBSD 5.2.1-RELEASE i386".
Ты тоже веришь в то, что 2^{32}, два в тридцать второй степени, равно нулю?
---
...Я работаю антинаучным аферистом...

yolki

Верю.
А также я верю в то, что 1e200*1e200 равно INF для double, или вывалит программу с FPE (зависит от настроек ядра).

Dasar

> Верю.
Зря веришь, на 64-битной машине - long скорее всего будет 64-разрядным

yolki

Здесь "uname -prs" выдаёт "FreeBSD 5.2.1-RELEASE i386".

Dasar

Маза, что, например, такая FreeBsd-я запустится на Атлоне-64.
При этом программы на такой системе могут компилироваться и работать в 64-битном режиме.

Ivan8209

Перечитай заголовок.
---
...Я работаю антинаучным аферистом

yolki

но из примера видно, что запускалось в таком environment, где unsigned long был 32-битным.
стандарт требует, только то, что тип unsigned long должен быть достаточно большим, чтобы вмещать числа 0..4294967295, а уж его реальный размер - внутреннее дело компилятора, хоть 33-х битный.
вполне законно использовать константу ULONG_MAX, которая и определяет, какое максимальное значение может принимать переменная типа unsigned long. глупо ожидать от переменной такого типа, что она превзойдёт эту константу.
2КОНТРА: в заголовке ничего не понял. нормальная конструкция, нормальная проверка. монопенисуально проверять s на входе или x на выходе, если после этого места s не используется.

Ivan8209

Тогда перечитывай всю ветку.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

yolki

нах надо по третьему разу читать.
Совершенно ясно следующее:
  • тебе чем-то не нравится С++, (это товё имхо)
  • утверждается что он не будет жить в тех средах, где живёт скажем лисп, (что не верно. эта КР580ИК80 - в каком году сделана? Какие устройства на ней работают? Когда стандарт на С++ появился? Не кажется ли что это что-то вроде утверждения: "А вот алгол круче, потому что на нём мы могли писать для ЕС1033" ? - кстати, этот МПК использовался в ЭВМ этих серий)
  • и что вроде как на твоём любимом языке арифметика будет выглядеть красивее.

Dasar

> в заголовке ничего не понял. нормальная конструкция, нормальная проверка. монопенисуально проверять s на входе или x на выходе, если после этого места s не используется.
Исходя из тех данных, что данны в первом сообщения тот же кусок кода из первого сообщения содержит ошибку.
Ощибка следующая: при компиляции кода под 64-битную платформу x на выходе может принимать значение 0, что противоречит требованию x не должно принимать значение 0.

Dasar

т.е. ошибка в коде из первом поста есть, но далее КОНТРА утверждает, что это ошибка навязанна самим C/C++ и что на других языках такой ошибки не будет.
Но при этом КОНТРА так и не показал какие средства в "других" языках позволят избежать данной ошибки, т.е. никак не показал, что тот же самый программист (еще раз подчеркиваю - тот же самый) не допустит такой же ошибки на других языках.

Ivan8209

Это не только моё мнение.
Некоторым упёртым, слепо верящим в неотличимость 32-й степени двойки от нуля,
надо бы попереносить кучу обычного, казалось бы, кода на 16 разрядов и на 64 разряда.
Ибо нефиг машинозависимый код называть переносимым.
---
...Я работаю антинаучным аферистом...

Ivan8209

Эта ошибка навязана именно языком.
Основания:
а) двойное представление целых чисел в виде собственно чисел,
и в виде цепочек двоичных разрядов, с соответствующими
допустимыми действиями над ними;
б) поощрение использования представления целых чисел в виде дополнения до двух;
в) полное отсутствие средств управления переполнением в действиях,
производимых над целыми числами.
Легко встретить другие языки, где:
а) нет легкодоступного представления чисел в виде цепочек двоичных разрядов;
б) надо отдельно объяснить компилятору, что ты хакер
и собираешься работать напрямую с машинным представлением данных;
в) есть возможность явного задания требуемых границ для целых значений;
г) поощряется явное задание этих границ;
д) можно получить границы по умолчания в рамках самого языка,
а не языка текстового препроцессора;
е) есть встроенные средства борьбы с переполнением;
ё) есть возведение в степень.
А ещё в этих языках разделено взятия остатка от деления
с округлением к нулю и с округлением вниз.
Насильники разницы в этих действиях, очевидно, не усматривают.
---
...Я работаю антинаучным аферистом...

smnikiforov

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

smnikiforov

>Насильники разницы в этих действиях, очевидно, не усматривают.
то ли дело химики, которые не только усматривают таковую разницу, но ещё и производят умозаключения вроде этого

Ivan8209

Математики идут изучать жизнь:
1. ANSI X3.215-1994, ISO/IEC 15145:1997.
2. ANSI/MIL-STD-1815A-1983, ISO/IEC 8652:1995.
---
...Я работаю антинаучным аферистом...

Ivan8209

Ещё раз.
Да, можно написать переносимый код.
Его можно написать на чём угодно.
У меня есть образец замечательно переносимого кода,
расчитанного на не менее, чем 12-разрядные машины.
---
...Я работаю антинаучным аферистом...

Dasar

> Основания:
> а) двойное представление целых чисел в виде собственно чисел,
> и в виде цепочек двоичных разрядов, с соответствующими
> допустимыми действиями над ними;
> б) поощрение использования представления целых чисел в виде дополнения до двух;
> в) полное отсутствие средств управления переполнением в действиях,
> производимых над целыми числами.
Еще раз повторю: C - изначально создавался именно, как "переносимый ассемблер".
Все добавления в C вызваны как раз тем, что C - это ассемблер.
Процессор по-разному работает с большими и маленькими числами, различает signed и unsigned => соответственно все тоже самое появилось в C.
процессор умеет оптимальнее работать с числами дополненных до двух => в C также добавлены эти же команды
Процессор умеет сообщать об ошибке переполнения, но это не получается встроить в процедурную модель "много входных данных->один(или меньше) результат" =>- значит нафиг такую ошибку.
Процессор умеет проводить битые операции => Ок, их тоже добавляют в C
Процессор не умеет возводить в степень - нафиг такую функциональность
Процессор не умеет оперировать числами с произвольной разрядностью - нафиг такую функциональность
Процессор не умеет оперировать ограниченными числами - нафиг такую функциональность
Т.е. при разработке языка в первую очередь руководствовались лозунгом "Что умеет машина?", а не "что хочет человек?".
Соответственно получился хороший язык, но удобный, в первую очередь, для системных программистов, но т.к. в то время большое число программистов - даже решающих прикладные задачи, приходилось писать системный код, то язык был очень востребован.

Ivan8209

> Еще раз повторю: C - изначально создавался именно, как
> "переносимый ассемблер".
...Для PDP-11.
> Процессор по-разному работает с большими и маленькими числами,
> различает signed и unsigned => соответственно все тоже самое
> появилось в C.
Одновременно со следующим?
> процессор умеет оптимальнее работать с числами дополненных до
> двух => в C также добавлены эти же команды
> Процессор умеет сообщать об ошибке переполнения, но это не
> получается встроить в процедурную модель "много входных
> данных->один(или меньше) результат" =>- значит нафиг такую
> ошибку.
В ещё более простом ПЛ/М есть "CARRY".
> Процессор не умеет возводить в степень - нафиг такую функциональность
LSI-11 ещё и умножать не умеет.
> Процессор не умеет оперировать числами с произвольной
> разрядностью - нафиг такую функциональность
В отличие от умножения, сложение с переносом
есть в фон-неймановских машинах всегда.
Сложение чисел двойной, тройной и т. д. разрядности
сделать куда проще, чем умножение.
Ада тоже разработан как "переносимый ассемблер."
Причём разработан именно как переносимый.
И разработан с учётом программирования систем.
Однако, таких извратов с двойным представлением нет.
Ещё тебе никто не мешает использовать подмножества языка.
Например, так, как это делали с ПЛ/1.
В котором тоже давно есть объявление разрядности чисел.
---
...Я работаю антинаучным аферистом...

Dasar

И много ты знаешь используемых операционных систем, написанных на PL/1?
Это к слову о системности (низкоуровности) языка.
ps
Все основные операционки написаны на C/C++.
ззы
MacOs (как старый, так и новый) интересно тоже на C/C++ написан?

smnikiforov

что именно в данных документах тебя так заинтересовало?

smnikiforov

>Его можно написать на чём угодно
попробуй написать его на асме потом приходи, обсудим, позапускаем
У меня есть образец замечательно переносимого кода,
расчитанного на не менее, чем 12-разрядные машины.

повезло тебе

Ivan8209

Если учесть, что VM/360 и VMS используются до сих пор, то системное ПО,
написанное на ПЛ-1 ещё в действии.
---
"Narrowness of experience leads to narrowness of imagination."
Rob Pike
Оставить комментарий
Имя или ник:
Комментарий: