Сказка о насильниках, приплюснутых насильниках, о переносимости и о том, чего не покажут проверки.
типа вот:
x = s & 0xFFFFFFFFUL;
if (x == 0) {
x = 1;
}
это вообще, к чему? пишем x=1 и всё. x у тебя никогда не будет 0. при чём здесь s?
Таковы условия.
---
...Я работаю антинаучным аферистом...
Теперь объясни, почему насильники не могли написать сразу
правильно.
Кстати, сможешь на взгляд определить,
что за число такое 2147483646?
---
...Я работаю антинаучным аферистом...
1111111111111111111111111111110_2
> правильно.
А я доктор?
А 1103515245?
И что?
Прямо так, на взгляд?
---
...Я работаю антинаучным аферистом...
Как-то не тянешь.
Тебе надо больше тренироваться.
Да, в одном-двух местах насильник написал действия в верном порядке.
Опечатался, наверное.
---
...Я работаю антинаучным аферистом...
эти два на взгляд не определяются.
а зачем здесь " & 0xfffffffUL"?
Если бы я сразу выложил число 4194302,
которое 2^22-2, было бы посложнее.
Немного объяснений.
Числа вида 2^31-2, 2^22-2 возникают закономерно,
как наибольшие в соответствующих кольцах вычетов.
А вот другие два числа подбираются "так, чтобы."
Выводы.
---
...Я работаю антинаучным аферистом...
Или ты хочешь сказать, что на Java, Basic-е, shell-е, ML-е, Haskel-е или на чем-то еще данная задача автоматически была бы решена правильно?
деления на 2^n.
---
...Я работаю антинаучным аферистом...
т.е. в условии задачи еще входит, что переменная s должна быть обрезана до 4 байт?
правильно.
Потому что в МЛ можно определить, если его ещё нет,
возведение в степень, и ускорением взятия остатка от деления
занимается, по договорёности, не человек.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
> возведение в степень, и ускорением взятия остатка от деления
> занимается, по договорёности, не человек.
Но как это поможет? т.е. что мешает программисту на ML-е сначала проверить на ноль, а потом взять остаток от деления?
Почему об этом ничего не написано в оригинальном условии задачи?
чертежам," а "построить такой мост."
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
И что это такое?
Хочешь сказать, что если завтра новичка посадить за ML - он эту самую культуру магическим способом выучит?
ps
Замечу, что доля новичков на C много больше, чем новичков в ML-е
Сразу не получится. Мне тут недавно сказали, что сначала нужно чакры открыть.
Но МЛ, сам язык не способствует, если не препятствует
программированию с ранними низкоуровневыми "хаками"
в расчёте на скорость исполнения.
Код, кстати, выставляется на профессиональном уровне.
Если б он был учебным, то разговор шёл бы иначе.
---
...Я работаю антинаучным аферистом...
На выставке, что ли?
---
...Я работаю антинаучным аферистом...
Тогда ничего удивительного.
> программированию с ранними низкоуровневыми "хаками"
> в расчёте на скорость исполнения.
т.е. ты хочешь сказать, что если запись была бы высокоуровневой:
if (s == 0)
s = 1;
x = mod(s, pow(2, 32;
то ошибка опять же магическим способом исчезла бы?
unsigned long transform(unsigned long s) contract result != 0
{
if (s == 0)
s = 1;
return s & 0xFFFFFFFFUL;
}
Вот при наличие такого контракта, компилятор или с помощью "размышлений", или с помощью "тестов" мог бы "увидеть" ошибку.
Часто встречаемый образец.
#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;
Сможете сходу догадаться, что делает подобная ворожба?
---
...Я работаю антинаучным аферистом...
Имея только эти голые формулы - ни о чем более высокоуровневом, чем сами эти формулы, ничего сказать нельзя.
Вот примеры:
вот это самое действие (Да, пожалуй, я слишком сильно порезал,
знание области существования переменных Y и R необходимо. в
отдельную подпрограмму.
Это отображение X -> (A*X) mod M.
Числа Q и R подбираются отдельно (делением M на A).
Заметьте, что их значения _вбиваются_. Дословно.
То есть, доцифренно.
И это вместо обыкновенных M)/(A и M)%(A соответственно.
Причём удвоение разрядности машины (чем чёрт не шутит?) приводит
к бесполезности подобных вывертов.
Кстати, рядом же насильник описывает функции,
как "static inline unsigned int."
Какого чёрта врисовывать эту функцию вручную?
---
...Я работаю антинаучным аферистом...
Вот видишь: ты сам себе ответил, т.е. это зависит не от языка, а зависит от того - является ли программист - структурным или не является.
---
...Я работаю антинаучным аферистом...
ps
Структурно писать можно и на Asm-е, а неструктурно хоть на прологе.
Был бы он "кроссплатформенным," у него был бы
subtype THAT_DAMN_INTERVAL is INTEGER range 0..2**32;
или, на худой конец
DCL X BINARY(32);
а не вышеописанное умножение "unsigned long int"-ов на месте
или размещение 48-разрядных двоичных чисел в трёх
"unsigned short int"-ах, которые могут в один прекрасный день
оказаться вдвое короче, чем надо.
Кстати, про структурное программирование на Прологе расскажи.
А то я как-то плохо представляю себе, что это такое.
---
...Я работаю антинаучным аферистом...
Если такое добавить, то на тех компьютерах, на которых такого нет, придется делать эмуляцию.
Что же это будет за ассемблер - если он требует для работы "эмулирующую прослойку".
В противном случае люди писали бы на связке as+m4,
а не на cc+cpp.
Встроить арифметику большей точности, чем имеющаяся
разрядность,--- это не такая уж большая забота.
Вон, на К580-ых есть плавающая запятая и ничего.
Никто от этого не умер.
---
...Я работаю антинаучным аферистом...
Позволил себе отметить курсивом, на мой взгляд, важный для понимания отрывок.
Дао С++
С++ — язык, который изучается постепенно. Лишь после того, как будет сделан последний шаг,
разрозненные приемы и фрагменты синтаксиса начинают складываться в общую картину. По-моему,
изучение С++ чем-то напоминает подъем на лифте. Дзынь! Второй этаж. С++ — это
усовершенствованный вариант С, с сильной типизацией (которую, впрочем, при желании можно
обойти) и удобными комментариями //. Любой программист на С, если он не хочет подаваться в
менеджеры, должен двигаться дальше… а Бьярн Страуструп (Господи, благослови его) придумал для
этого отличную возможность.
Дзынь! Третий этаж. С++ — хороший, хотя и не потрясающий объектно-ориентированный язык
программирования. Не 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».
Ты выделил курсивом именно это.
В продолжнение темы:
литературный журнал компьютерра недавно
опубликовал очередное творение P.Graham'а.
Как всегда про хаккиров и правильные языки.
http://www.computerra.ru/think/35350/
http://www.computerra.ru/think/35404/
> С++ --- это на самом деле не столько язык, сколько инструмент
> для создания ваших собственных языков.
Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
> Проблема решается так же элегантно, как это сделал бы
> настоящий язык типа Smalltalk или Lisp, но при этом ваш
> процессор не дымится от напряжения, а на Уолл-Стрит не растут
> акции производителей чипов памяти.
Как насчёт Си++ на 8-разрядных машинах?
А вот смолтолковские были.
> С++ --- вообще не язык. Это мировоззрение или наркотик,
> меняющий способ мышления.
Императивный стиль мышления настолько не нов, что менять его
надо именно с помощью императивного языка.
Кстати, ты хоть раз пробовал создавать на основе Си какой-нибудь
язык?
> Вы можете создать свой собственный тип данных и подсунуть его
> компилятору так, чтобы он принял этот тип за встроенный.
Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
до "BINARY(48)", чтобы подсунуть его вместо встроенного
неизвестной разрядности.
Заодно расскажи, как средствами языка Си замерить собственную
разрядность и сразу же использовать её в своей программе.
Да, очередное "Real Programmers Don't Use Pascal" не надо.
В подобных случаях некто Луговский предлагает отправлять в
биореактор.
Последнее время я склоняюсь к тому, чтобы с ним согласиться.
---
...Я работаю антинаучным аферистом...
функцию pow уже отменили?
> Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
функциональную парадигму же сделали, да и lazy-вычисления тоже.
> Как насчёт Си++ на 8-разрядных машинах?
и в чем проблема?
C++ и сейчас используется на 8-битных процессорах
> Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
> до "BINARY(48)", чтобы подсунуть его вместо встроенного
> неизвестной разрядности.
Берешь любой класс LargeNumber и используешь. http://www.codeproject.com/cpp/largenumber.asp
> Заодно расскажи, как средствами языка Си замерить собственную разрядность
sizeof
> и сразу же использовать её в своей программе
int q[sizeof(long)];
Кажись даже легендарный Z80 был 16-битным..
8-битные процессоры сейчас активно используются в промышленных контроллерах, бытовой технике и т.д.
Название хоть одного?
PS насчёт z80 тебя обманули
intel-8080
motorola M68HC08
8051/8052 MCU
Если ты не любишь С++ — не пиши на нем. Зачем его чернить на форуме? Тебе не нравиться, что большинство его приемлет, если не любит? Тогда создай свой, настолько хороший, что все на него перейдут.
Всем, надеюсь, понятно, что С++ Лиспом или Перлом не заменишь — так нехрен их постоянно сравнивать. Они для разных целей и разных людей.
P. S. Ах да, насчет мух. Если ты больше мухи, расскажи, пожалуйста, что такого великого написал ты? Достаточно великого, чтобы отбрасывать тень среди толпы С++-программистов.
> функцию pow уже отменили?
static unsigned long int buf[pow(2,12)];
>> Попробуй создать на нём DSL хоть сколько-то отличающийся от
>> процедурного.
> функциональную парадигму же сделали,
> да и lazy-вычисления тоже.
DSL --- это не только парадигма.
Из "живого" проекта:> C++ и сейчас используется на 8-битных процессорах
ПЛОСКОСТЬ Базовая
ПРЯМАЯ Прямая1
ПРЯМАЯ Прямая2
УГОЛ МЕЖДУ Прямая1 И Прямая2 БАЗА Базовая
HОМИHАЛЬHО 18
+ДОПУСК 0.1
-ДОПУСК -0.1
Hosted?
>> Заодно расскажи, как средствами языка Си замерить собственную разрядность
> sizeof
И что, для sizeof(int) оно покажет 32?
---
...Я работаю антинаучным аферистом...
И выгоды от этой замены очевидны.
Это понятно любому, кто достаточно с ним знаком.
---
...Я работаю антинаучным аферистом...
Заменить "(unsigned) (long) int" я могу?
Или придётся везде перебивать "(unsigned) (long) int" в
"(UL)Int"?
И где, после этого, хвалёная переносимость?
---
...Я работаю антинаучным аферистом...
Можно вопрос? Это ж как, например, написать Doom3 на ЛИСПе? И какие от этого будут выгоды?
Во-вторых появится распараллеливаемость на сколько есть
процессоров, и этим будет заниматься компилятор.
Наверняка появится ещё что-нибудь.
---
...Я работаю антинаучным аферистом...
P. S . бесконечно мощный вычислитель =)
---
...Я работаю антинаучным аферистом...
Прошу простить, счет на Интернет опустел полчаса назад. И как, работает?
Ага, и сколько эта твоя переносимость оставит от FPS? И кто купит такую игру, если у большинства стоит винда, и им эта переносимость никуда не впилась - они думают о динамичности игры. И потом, я слабо понимаю, как всё-таки его написать на ЛИСПе?
Кстати, объяснишь, почему DoD выбрала в качестве стандартных
языков для СРВ Аду и Лисп?
Можешь задуматься.
---
...Я работаю антинаучным аферистом...
Учи матчасть.
---
...Я работаю антинаучным аферистом...
Их легко может оказаться даже больше.Я в этом ОЧЕНЬ сильно сомневаюсь.
Учи матчасть.Ответ-отмазка. Я всё понял, спасибо за коментарии.
ну да, конечно
сразу сделал недостающие выводы, чтобы воспринять всё как личное оскорбление.
И где, после этого, хвалёная переносимость?
если ты пишешь не переносимый код - это твои проблемы, а не плюсов
Задуматься почему кто-то, пусть, скажем, Microsoft, пользуется VB... Потому что им нужен он. Но это не значит, что он нужен везде и всегда.
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
Нет уж, дудки. Считай, что я ничего не писал. Эсли вспылил лишнего — прости, но за «мух» обидно.
Для того, чтобы знать, нужно знать.
А пересказывать учебник по общему шёпоту я считаю занятием
бесполезным. Захочешь --- сам прочитаешь.
---
...Я работаю антинаучным аферистом...
Не хватает препроцессора --- возьми препроцессор помощнее.
Заметь, что у тебя появилось две разных конструкции, для
компиляции и для исполнения, имеющих один и тот же смысл.
Кстати, в другом месте встречал нехватку возможностей вычислений
в ходе компиляции. Вроде заполнения простенькой таблички.
Что-то такое:
CREATE Table szTable ALLOT
MARKER forget-it
: fill-table ... ;
fill-table
forget-it
Я знаю, что это обходится через make,
но опять же --- это от бедности.
---
...Я работаю антинаучным аферистом...
Совсем не согласен.
Препроцессор - это зло: препроцессор работает с текстом, а не с программой.
Только почему-то твой pow для компиляции имеет сильно
отличающийся от обычного синтаксис.
Хотя выполняет, казалось бы, не очень-то сложное действие.
---
...Я работаю антинаучным аферистом...
C суть Assembler, переносимый за счет макроопределения команд процессора.
С++ суть C, удобный за счет макроопределения всего остального =)
Вот перегрузка — добро? Добро!
А шаблоны? Ого-го-го!
Если язык должен хорошо транслироваться в машинный код, то он должен, ну просто обязан, быть макро...макроассеблером.
> то он должен, ну просто обязан, быть макро...макроассеблером.
Он должен быть как можно больше непохож на машинный код.
Иначе ты проиграешь как на разнице в уровнях абстракции,
так и на переносимости.
---
...Я работаю антинаучным аферистом...
Потому что в переносимом коде могут и должны быть написаны
требования к среде исполнения.
Плюсы этого не позволяют сделать никак.
---
...Я работаю антинаучным аферистом...
> С++ --- это Cobol 90-х, политически выдержанный язык, который
> гарантирует финансирование вашего проекта высшим руководством.
Ты видел хотя бы одну программу на Коболе?
В ней обязательно, обязательно описываются требования к
инструментальной и целевой машинам.
Сможешь ты в Си написать требования к разрядности слова,
на которую расчитана программа?
Кстати, Кобол использовался раньше для того, для чего сейчас
используется SQL.
Да, и сравнения наподобие "Кобол наших дней" употребляется после
некоторых событий исключительно в отрицательном смысле.
---
...Я работаю антинаучным аферистом...
не, твоя
>Плюсы этого не позволяют сделать никак.
учи матчасть
>> то он должен, ну просто обязан, быть макро...макроассеблером.
>Он должен быть как можно больше непохож на машинный код.
>Иначе ты проиграешь как на разнице в уровнях абстракции,
>так и на переносимости.
Это опровержение или подтверждение?
А за Джеффа говорить не буду.
Переведи на плюсы следующее:
X: digits 30;
N: INTEGER range 0..2**48;
Хотя бы это.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Я же тебе уже давал ссылку на класс largeNumber
я правильно понял, что digits - это десятичные цифры?
Будет:
largeNumber<log<pow<10, 30>::value, 2>::value > x;
largeNumber<48> y;
ps
Задачи ты ставишь немножко некорретные, ты берешь то, что уже встроено в язык, и предлагаешь - это сделать на другом языке - конечно, другой язык проиграет, если это в него не встроенно.
Интересннее сравнивать на тех задачах, которые и там, и там не вcтроенны.
1. Вот допустим, как будет выглядеть реализация complex-ного числа повышенной точности на твоем любимом языке? интересует тот случай, если такие числа не встроены в сам язык.
2. Или реализация разреженной матрицы? Причем желательно, чтобы способ работы отличался незначительно от обычной матрицы(массива).
Например, так:
: * 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
Надо уметь выбирать любимые языки.
---
...Я работаю антинаучным аферистом...
Ты не уходи от задачи.
Приведи, плиз, пример, который позволяет использовать complex-ные числа произвольной точности.
Особенно подчеркиваю слово complex-ные, и особенно подчеркиваю слово "произвольной".
(define (* x y) (if (and (= x y) (= x 2 5 (old-* x y
но в этом языке полиморфизма не видать, как своих ушей, я правильно понял?
Состыковывать (кроме командной строки) - ты свои любимые языки умеешь?
number? и прочие есть.
Так что всё в порядке.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Точно так же определяешь нужные операции для твоих чисел и вперёд.
---
NON PLVS VLTRA
Пример приведи, плиз.
ЧТо значит "встраиваемый"? Встраеваемый куда?
Приведи пример, плиз, иначе - это голословное утверждение. Или хотя бы идею примера.
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." расширение языка.
---
...Я работаю антинаучным аферистом...
IAR Systems имеет немного урезанный (по сравнению со стандартом) Embedded C++, который замечательно пашет примерно на двух десятках архитектур различных 8-битных контроллеров, процессоров и DSP.
Их очень много. Выпускают практически все крупные производители микросхем, научившиеся делать flash-память, и многие другие. А к вопросу сущестования C++ на них - например, Как это делается?
Как обычно.
А для чего, иначе, нужны IMMEDIATE и POSTPONE/COMPILE/[COMPILE]?
---
...Я работаю антинаучным аферистом...
А пример по полиморфизму?
(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 ...
В другом случае, есть очень хорошие средства управления
областями видимости, а потому всё обеспечивается простым их
переключением.
---
...Я работаю антинаучным аферистом...
Сие есть не что иное, как идиотизм.
Предложи решение сравнимой сложности для Си.
Плюсы уже могут вылететь по несравнимо большей сложности их самих.
---
...Я работаю антинаучным аферистом...
При полиморфизме решение о том, что надо делать, делается на стороне вызываемомого, а не на стороне вызывающего.
На том же уровне сложности.
Кстати, ты ещё различай относящееся к реализации расширения
языка и расширенному языку.
Оба решения допускают задание требуемой наименьшей точности.
Причём в рамках самих языков: с тем же синтаксисом, скрывающим
особенности реализации.
Основная мысль.
Отсутствие средства в исходном языке достаточно просто
уравновешивается возможностями развития языка:
при отсутствии готового решения возможно создание чуть более
дорогого заместителя, не требующего существенной переработки
исходного текста.
При отсутствии прямого, непосредственного решения, обходное
решение получается заполнением разрыва между требованиями
программы и возможностями инструмента, а не существенной
переработкой программы в расчёте на меньшие требования.
Вот это и понимается под переносимостью.
---
...Я работаю антинаучным аферистом...
"сказки от КОНТРЫ" ч.2
Основную мысль
#define add old_add
#include "something.h"
#undef add
void add (Data data)
{
if (isNumber(data
old_add(data);
else
...
}
обозначаемыми такими привычными "+", "-", "*" и тому подобными?
---
...Я работаю антинаучным аферистом...
В плюсах будет и это.
2.0M /mnt/distfiles/scheme48-1.1.tgz
Полностью соответствует R5RS.
Пример столь же сложных компиляторов приплюснутых сей,
соответсвующих последнему принятому стандарту языка?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Почему ты считаешь, что это создает какую-то серьезную проблему?
Или ты предлагаешь "#define"?
---
...Я работаю антинаучным аферистом...
чем плох MyInt?
Причём автомагически сделать это не получится из-за "func(...)" и "unsigned".
---
...Я работаю антинаучным аферистом...
replace "unsigned\b+int" "MyInt<Unsigned>"
а мне на сложность компилятора плевать, это одноразовая сложность
кстати, интересно вдруг стало, в чём ты меряешь сложность?
"...; f(...){...}"?
"unsigned /* .... */ int"?
Видишь, тебе уже приходится заморачиваться для того, чтобы всего
лишь заменить встроенный целый тип новым целым типом.
Хотя особых препятствий к этому быть не должно.
А как замерять имеющуюся разрядность?
Что, если заголовочных файлов не будет?
Здравствуй, напильник?
---
...Я работаю антинаучным аферистом...
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.
В битах.
В качестве первого приближения использую исключение повторений
посредством кодирования gzip-ом (LZ77+Huff, что ли?).
---
...Я работаю антинаучным аферистом...
Тем не менее, даже использование самого навороченного
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.
тавтология какая-то
>В битах
>В качестве первого приближения использую исключение повторений
и какой смысл несёт такое "определение" сложности в применении к вот этому:
Плюсы уже могут вылететь по несравнимо большей сложности их самих.?
Вот Вы тут много говорили про выразительность. А можно вопрос поставить ребром? Что вы сможете сделать такого на Лиспе(или другом языке) чего я не смогу сделать на C++? Да, Вы не должны мне указывать КАК это сделать(ЭТО не будет похоже на Лисп ) ). Вот когда Вы мне представите такую задачу, я признаю что C++ менее выразителен чем выбранный Вами для демонстрации язык.
Так что утверждение про то, что С++ для 8-битных процессоров нет - неверно
Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь.
Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил.
Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.
---
...Я работаю антинаучным аферистом...
Могу достать за относительно обозримое время: 6809, 6811, Z80A, 8051, PIC-16XX.
Как, кстати, с поддержкой платформ большей разрядности?
Всё так же будете перемножать 48-разрядные числа кусками по 16 разрядов?
А 22-разрядные --- по 11?
---
...Я работаю антинаучным аферистом...
>Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь
ты что-то не то там вычитал, выше. может. перечитай
>Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил
КОНТРА, твои беды/непонимания от заблуждения, что плюсы - диалект сей это не так, почитай вышеприведённого Элджера на досуге. много нового узнаешь о плюсах и сказках
>Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
опс, опять "сложность" всплыла. я правильно тебя понял, что это означает, что решение большей части задач на Си занимает больше битов чем на Лиспе?
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.
уже писал, в чём твоя беда в плюсах ты всегда можешь добиться, чтобы твои объекты были равноправны с встроенными
Тем не менее, ограничения простых сей в приплюснутых не преодолены.
Добиться можно чего угодно, только какой ценой?
Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
То есть, чтобы писалось "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;
с двумя умножениями и условным переходом.
---
...Я работаю антинаучным аферистом...
Ты не понял. Мне не нужна задача по обработке кода(заменить чего-то там на что-то там). Ты приведи мне полную постановку задачи как заказчик: входные данные, выходные данные, интерфейс, etc... Тогда и поговорим. А то что ты говоришь доказывает только то что Лисп(например) работает лучше чем С++ в качестве препроцессора и не более. Вот так.
Если "как заказчик" --- это никак не относится к
> входные данные, выходные данные, интерфейс, etc...
> А то что ты говоришь доказывает только то что Лисп (например)
> работает лучше чем С++ в качестве препроцессора и не более.
Это доказывает только то, что ты не знаком ни с чем, кроме С++.
> Вот так.
---
...Я работаю антинаучным аферистом...
Делать такие поспешные выводы на основании всего одной фразы... Это признак недалекого ума. Во первых, я знаю не только C++. Во вторых, я знаком с некоторыми функциональными языками программирования(например Lisp(как часть(и основа) emacs ocaml, очень мало - Haskell). Конечно я знаком с ними меньше чем ты, но моих знаний хватает для того чтобы делать о них некоторые выводы. Функциональные языки не универсальны - я не представляю себе базу данных, созданную на Lisp. C++ же универсален. На нем можно решить ЛЮБУЮ задачу(может быть и с большими затратами труда нежели чем не Lisp(к примеру. Следовательно, он более выразителен(чтобы не было вопросов, под выразительностью я понимаю возможность ВЫРАЗИТЬ ту или иную программу на конкретном языке). Да, ты так и не привел задачу, о которой я тебя просил
Ты видешь большую разницу между "x = (a*x) % m;" , "x = BernulliShift(x, a, m)", "x = mod(a*x, m)"?
1. Вся разница между этими записями только "в привычке".
2. Расчетные задачи сегодня составляюь очень маленькую долю от ПО, которое пишется, поэтому реально очень редко возникает потребность в перекрытии операций.
то есть у тебя больше не осталось сказок о непереносимости плюсов? это хорошо
>Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
довольно бессмысленное требование, с учётом того, что ты вкладываешь в понятие "тот_же_синтаксис"
внимание, вопрос: а зачем это всё? кому это нужно?
я считаю, что запись MyInt A(pow(2,14; - это запись в том_же_синтаксисе. тем паче, что с А далее везде можно обращаться так же, как с переменной встроенного типа
>И чтобы сдвиг Бернулли (или как оно называется) записывался через
ДА! И чтобы эти изверги не смели писать if(a=b)
p.s. надуманные у тебя проблемы какие-то любители SmallTalk-а хоть к более интересным вещам придираются, типа сборки мусора
Обращаю внимание, что это недостаток исключительно твоего
воображения и ни в коем случае не лиспа.
> C++ же универсален. На нем можно решить ЛЮБУЮ задачу [...]
> Следовательно, он более выразителен.
Нихуя не "следовательно".
Данная импликация взята из воздуха (м.б. это "признак недалекого ума"?).
Возможность решить с помощью языка любую задачу называется алгоритмической
полнотой, если ты не в курсе. Кроме лиспа и плюсов таким свойством обладает ещё,
например, машина тьюринга.
"Следовательно, машина тьюринга более выразительна."
Говоря проще, "LOL, бля!"
Для меня интересна не просто возможность решить задачу, а решить ее за приемлимое время/деньги/etc. Так вот, если ты не понял, то я имел в виду что на C++ можно решить любую задачу за приемлимое время/деньги/etc, чего нельзя сказать про Lisp/.../... В конце концов, почему императивные языки общеприняты, а функциональными пользуются только небольшим количеством разработчиков? Единственная достойная область для функциональных языков - вычисления и искуственный интеллект. Все. Да, в догонку, - некоторые люди считают что функциональные языки прощают огрехи проектирования(да вот к примеру КОНТРА тут все пытался выспросить как int заменить на нечто другое - при правильном проектировании такой задачи даже не возникнет). А это не есть хорошо, потому что эти огрехи вылезут рано или поздно, и починить программу уже будет намного сложнее.
> а решить ее за приемлимое время/деньги/etc.
Обращаю внимание ещё раз: решить задачу твоими силами
или понятными тебе методами.
> В конце концов, почему императивные языки общеприняты,
> а функциональными пользуются только небольшим количеством разработчиков?
Опять "миллионы мух"... Почитай Graham'а чтоли, он как раз про это рассказывает.
Впрочем, просветление вряд ли наступит, но об этом в другой умной книжке написано.
> Единственная достойная область для функциональных
> языков - вычисления и искуственный интеллект. Все.
Ты о классической музыке по телефонным напевам судишь?
Вот когда научишься "любую задачу" решать и на ФЯ, и на ИЯ,
то я даже тебя послушаю относительно областей применения
того и другого.
> Да, в догонку, - некоторые люди считают что функциональные языки прощают
> огрехи проектирования...
Я не знаю, что именно утверждает контра, но огрехи проектирования не прощает никто.
Однако рефакторинг проги на плюсах производить гораздо сложнее, чем на ФЯ
(доводилось заниматься и тем, и другим).
А "правильное проектирование" -- это отображение функционального представления
в голове архитектора на код проекта ("как оно должно работать" в "что именно оно
должно для этого делать").
2) Человек - не муха. Поэтому аналогии с мухами здесь абсолютно неуместны(кстати и не с мухами вовсе, а с леммингами). Программисты в основе своей довольно неглупые люди. Поэтому если большинство программистов предпочитает императивные языки...
4) Классическую музыку я предпочитаю просто слушать. Вот сейчас в моем playlist'е как раз Вивальди заиграл
5) Уметь решать и решать с приемлимыми трудозатрами - понятия никак не связанные. Ну покажи мне хоть одну базу данных, написанную на Lisp.
6) Вот еще что интересно, я просто пытаюсь высказать свое мнение по техническим вопросам, а моих глубокоуважаемых оппонентов все время почему-то тянет переходить на личности...
а следовательно сам переводишь разговор на свою личность
(надеюсь, ты не считаешь его суперобъективным и единстенно верным?).
Показывать и доказывать я ничего не собираюсь, так как уже сейчас вижу,
что это будет впустую (переубедить человека невозможно, если он этого
сам не хочет а вот указать на недостатки аргументации и элементы
фанатизма могу (так же, как и заметить подобные вещи за собой,
но в меньшей степени, т.к. со стороны наблюдать гораздо проще).
Просто представь возможность того, что мир может быть устроен чуть иначе,
чем тебе кажется сейчас, тогда ты сам найдёшь необходимые доказательства
или опровержения (вдруг я тебя обманываю? или всё-таки не обманываю?).
Само наличие людей, у которых после знакомства с ФП изменилось представление
о программировании (даже если они по-прежнему пишут на плюсах) или даже
об устройстве мира, должно свидетельствовать, что здесь, как минимум, не всё просто.
А программисты в первую очередь -- обычные люди, поэтому им свойственно
человеческое поведение, которое далеко не всегда является "умным".
Чаще всего оно подвержено первобытным инстинктам выживания
и членства в иерархии стада, нежели интеллекту, да и сам интеллект
от программистов требуется не всегда.
2) Ты не хочешь показывать и доказывать по другим причинам. Прежде всего потому что таких проектов сейчас нет. Раньше - были(тот же Symbolics. Но где он сейчас?). Сейчас специально прошвырнулся в Гугле. И действительно, есть проекты, написанные на Лиспе(или других ФЯ) - но это только системы вычислений(Maxima например) и AI.
3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация. Каковой я до сих пор не увидел
4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более )
5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление о программировании( я например) тоже много о чем говорит.
6) Может все-таки кинешь несколько ссылок?
Между этими записями есть громадная разница.
Если в первой и третьей у тебя записано одно умножение и одно деление,
то во второй неизвестно, сколько действий и каких.
И в сях имеет громадное значение способ записи, который ты используешь.
Я хорошо знаю, что такое переполнение.
Про нерасчётные задачи я потом расскажу, не волнуйся.
Там тоже есть, о чём поговорить.
Например, о bzero, memcpy и т. п.
---
...Я работаю антинаучным аферистом...
И язык запросов там не надо отдельный наворачивать.
"Почему императивные языки общеприняты, а функциональными пользуется
только небольшое количество разработчиков?"
Ну так! "...Миллионы мух не могут ошибаться!"
Ты, кстати, не понял, к чему относилась часть про "int."
Думай дальше.
И Ада, и ПЛ-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
Ещё можно какую-нибудь философию почитать типа Поппер/Кун/Лакатос/Фейерабенд,
философия науки очень хорошо отображается на философию программизма.
Самые интересные вопросы в области сопоставления парадигм как раз относятся к философии и психологии,
нежели идиотизм "какой язык лучше?", так упорно развиваемый в этом треде.
Товарищ зачинщик, не пора ли в заголовок добавить «о ослиспленных счастьем функционального программирования»?
Есть математики геометры, а есть алгеброиды. Могут решить одну и туже задачу подходя к ней с разных сторон. Они принципиально мыслят по разному. Также различием в мышлении отличаются математики от физиков или скажем инженеров. Математические рассуждения - рассуждения на уровне абстракций.
ФЯ - математики
математики - абстрактное мышление.
Понятно, что большенству инженеров сложно мыслить в рамках ФЯ. А людей с инженерным мышлением гораздо больше, чем с математическим. Отсюда прямо следует тот факт, что ФЯ не распространены в массах. Просто большенству проще научиться мыслить в рамках ИЯ. Но поскольку в ФЯ заложен больший уровень абстракции, то очевидно, что этоти языки более красивы и гибки (с точки зрения математика ).
Из этого превосходства вытекает минус - большая отдаленность от современных аппаратных средств и медленная скорость работы. Это вторая причина непопулярности. Но если аппаратно-техническая база принципиально изменится...?
Во-вторых куча специфичных 8bit risc архитектур, типа того же Atmel AVR (для него, кстати, поддержка C++ ожидается даже вскоре в компиляторе GCC. поддержка C для архитектуры avr в gcc уже есть давно, и вполне конкурентноспособная с коммерческими компиляторами).
> долго, дожидаясь эффективной реализации, а некоторым такое
> представление оказывается ненужным.
А как ты оцениваешь будущее МЛ-ов?
---
...Я работаю антинаучным аферистом...
> от современных аппаратных средств и медленная скорость работы.
Вот как ты объяснишь такое дело, что "Эриксон," насколько помню,
для программирования СРВ предлагает Эрланг?
---
...Я работаю антинаучным аферистом...
наводит на мысль, о том, что скорость работы перестаёт быть критичным параметром,
уступая переносимости, автоматической сборке мусора и прочим высокоуровневым полезностям.
(Разумеется, не везде такое верно.)
При такой тенденции, вероятно, можно ожидать сравнения характеристик языков
(если оно ещё не наступило а также продолжения заимствования императивными
языками свойств функциональных. Растущая сложность, например, приводит
к вопросу полуавтоматической проверки корректности, а для этого нужна матмодель
системы с хорошими свойствами. Ключевое свойство ФЯ - прозрачность по ссылкам -
здесь оказывается чуть ли не единственным спасением: если доказана корректность
(безопасность итп) работы модуля или шаблона приложения, то можно не опасаться
побочных эффектов при его использовании.
То же самое свойство позволяет избежать часть проблем при параллельном исполнении.
Впрочем, я не верю, что переворот в сознании сможет произойти быстро,
но свойства ФЯ будут являться востребованными ещё очень долго.
Нынешняя популярность мультипарадигмальных языков отчасти объясняется этим.
Что касается конкретных предсказаний, то OCaml в виде F# продвигается микрософтом,
так что шансы у него есть, сказать что-либо более конкретное про ML я вряд ли сейчас смогу.
Never you have enough clock cycles."
Для императивных языков с хорошей блочной структурой отсутствие
побочных эффектов легко проверить и (полу)автоматически.
В отличие от возможности перестановки порядка вычислений.
Последнее, кстати, для оптимизации по скорости очень даже важно.
Про переносимость языков, в которых не описывается требуемая
разрядность, указано выше.
Да, в сторону увеличения разрядности переносить проще
(у меня здесь есть перенесённый код времён, наверное,
ПДП-8, с умножением 22-разрядных чисел кусками по 11 разрядов
но и тогда тоже есть пространство для игры: некоторый код
существенно использует ограничение по разрядности или
представление чисел дополнением до двух.
---
...Я работаю антинаучным аферистом...
> побочных эффектов легко проверить и (полу)автоматически.
Да, именно. Речь шла не о самих ФЯ, а о полезном свойстве ФЯ.
Гон. И подтасовка фактов.
Ты же только, что приводил код, который запросто подменяет стандартные операции.
Соответственно, хоть в коде написанно одно умножение и одно деление - реально их вызов может выливаться, например, в форматирование винчестера - что является довольно ресурсоемкой операцией.
> то во второй неизвестно, сколько действий и каких.
Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
> Например, о bzero, memcpy и т. п.
Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ. Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
> гибкость.
Зачем переписывают все? Почему не переписывают только критические участки кода? Как, например, поступают при использовании высокоуровневых языков.
> для программирования СРВ предлагает Эрланг?
Тем, что на ФЯ проще натягивается мат. аппарат, соответственно проще делаются всякие автоматические фичи.
Обращаю внимание на то, что фактически делается уступке машине, а не в сторону человека. Т.е. упрощается работа машины, но не человека.
Из того факта, что на ФЯ проще натягивается мат. аппарат никак не следует, что программы на ФЯ пишутся проще, и получаются лучше - никак не следует.
> Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
В "реальных условиях" есть требования заказчика и необходимость поддержки кода.
Поддерживать код на ФЯ сейчас сложно, но не потому, что язык для этого не предназначен,
а потому, что некому. Возможностей ФЯ достаточно для реализации многих проектов.
> т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ.
> Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
Откуда взялся такой вывод?
> Гон. И подтасовка фактов.
Ты думаешь, что компилятор сей всегда проверяет на переполнение?
Или он после умножения оставляет промежуточный итог двойной разрядности?
>> то во второй неизвестно, сколько действий и каких.
> Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
Да, если машина не имеет встроенного умножения,
то компилятор должен будет вставлять сложения и сдвиги.
В действительности же, происходит отсечение старших разрядов.
>> Например, о bzero, memcpy и т. п.
> Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
Хорошо.
strcmp, strcpy.
Да, а почему, кстати, остаток находится поразрядным "и"?
---
...Я работаю антинаучным аферистом...
>> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
>> гибкость.
> Зачем переписывают все? Почему не переписывают только критические участки кода?
Переписывают всё, когда возникает необходимость переписать всё.
Про требования заказчиков и поддержку я уже написал.
> Как, например, поступают при использовании высокоуровневых языков.
ФЯ -- высокоуровневые. И они всё это делать позволяют.
настолько уж и сложно.
Ада, конечно, не Си, но является императивным языком.
Может, всё-таки, дело в другом?
---
...Я работаю антинаучным аферистом...
> Или он после умножения оставляет промежуточный итог двойной разрядности?
1. Замечание важно только в контексте расчетных задач. В реальных задачах, даже в бухгалтерии - таких проблем нет.
2. Да, C-компилятор не отслеживает ошибки переполнения. И что дальше? Как из этого следует, что программы на ФЯ пишутся проще?
> strcmp, strcpy.
хм... Это тоже низкоуровневые команды. И в реальных прикладных программах опять же обычно не используются, и не рекомендуются для использования.
> Да, а почему, кстати, остаток находится поразрядным "и"?
Низкая квалификация (привычка) данного конкретного программиста?
Да, в другом. Потому что C - априори является низкоуровневым языком.
Позже была предпринята очень удачная попытка добавления высокоуровневых средств, что привело к созданию языка - C++.
Но дальнейшее развитие C++ было подорвано тем, что в C++ так и не устранили ряд существенных недостатков C (отсутствие модулей, отсутствие безопасного режима, отсутствие метаданных и т.д.)
for (s = 1; s < ULONG_MAX; s++)
if x = s & 0xffffffffUL) == 0)
printf("Found: %lu\a\n", s);
All works
Это всё равно, что попробовать сделать такой цикл:
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, то бишь ничего не печатается
sizeof(long) == ?
Потому что был он шестнадцатиразрядным."
#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}, два в тридцать второй степени, равно нулю?
---
...Я работаю антинаучным аферистом...
А также я верю в то, что 1e200*1e200 равно INF для double, или вывалит программу с FPE (зависит от настроек ядра).
Зря веришь, на 64-битной машине - long скорее всего будет 64-разрядным
Здесь "uname -prs" выдаёт "FreeBSD 5.2.1-RELEASE i386".
При этом программы на такой системе могут компилироваться и работать в 64-битном режиме.
---
...Я работаю антинаучным аферистом
стандарт требует, только то, что тип unsigned long должен быть достаточно большим, чтобы вмещать числа 0..4294967295, а уж его реальный размер - внутреннее дело компилятора, хоть 33-х битный.
вполне законно использовать константу ULONG_MAX, которая и определяет, какое максимальное значение может принимать переменная типа unsigned long. глупо ожидать от переменной такого типа, что она превзойдёт эту константу.
2КОНТРА: в заголовке ничего не понял. нормальная конструкция, нормальная проверка. монопенисуально проверять s на входе или x на выходе, если после этого места s не используется.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
Совершенно ясно следующее:
- тебе чем-то не нравится С++, (это товё имхо)
- утверждается что он не будет жить в тех средах, где живёт скажем лисп, (что не верно. эта КР580ИК80 - в каком году сделана? Какие устройства на ней работают? Когда стандарт на С++ появился? Не кажется ли что это что-то вроде утверждения: "А вот алгол круче, потому что на нём мы могли писать для ЕС1033" ? - кстати, этот МПК использовался в ЭВМ этих серий)
- и что вроде как на твоём любимом языке арифметика будет выглядеть красивее.
Исходя из тех данных, что данны в первом сообщения тот же кусок кода из первого сообщения содержит ошибку.
Ощибка следующая: при компиляции кода под 64-битную платформу x на выходе может принимать значение 0, что противоречит требованию x не должно принимать значение 0.
Но при этом КОНТРА так и не показал какие средства в "других" языках позволят избежать данной ошибки, т.е. никак не показал, что тот же самый программист (еще раз подчеркиваю - тот же самый) не допустит такой же ошибки на других языках.
Некоторым упёртым, слепо верящим в неотличимость 32-й степени двойки от нуля,
надо бы попереносить кучу обычного, казалось бы, кода на 16 разрядов и на 64 разряда.
Ибо нефиг машинозависимый код называть переносимым.
---
...Я работаю антинаучным аферистом...
Основания:
а) двойное представление целых чисел в виде собственно чисел,
и в виде цепочек двоичных разрядов, с соответствующими
допустимыми действиями над ними;
б) поощрение использования представления целых чисел в виде дополнения до двух;
в) полное отсутствие средств управления переполнением в действиях,
производимых над целыми числами.
Легко встретить другие языки, где:
а) нет легкодоступного представления чисел в виде цепочек двоичных разрядов;
б) надо отдельно объяснить компилятору, что ты хакер
и собираешься работать напрямую с машинным представлением данных;
в) есть возможность явного задания требуемых границ для целых значений;
г) поощряется явное задание этих границ;
д) можно получить границы по умолчания в рамках самого языка,
а не языка текстового препроцессора;
е) есть встроенные средства борьбы с переполнением;
ё) есть возведение в степень.
А ещё в этих языках разделено взятия остатка от деления
с округлением к нулю и с округлением вниз.
Насильники разницы в этих действиях, очевидно, не усматривают.
---
...Я работаю антинаучным аферистом...
нефиг собственные ошибки и заблуждения ретранслировать на других
плюсы допускают написание машинонезависимого кода, а некоторые спешат сделать вывод, что любой подсунутый им код на плюсах тут же становится платформонезависимым
то ли дело химики, которые не только усматривают таковую разницу, но ещё и производят умозаключения вроде этого
1. ANSI X3.215-1994, ISO/IEC 15145:1997.
2. ANSI/MIL-STD-1815A-1983, ISO/IEC 8652:1995.
---
...Я работаю антинаучным аферистом...
Да, можно написать переносимый код.
Его можно написать на чём угодно.
У меня есть образец замечательно переносимого кода,
расчитанного на не менее, чем 12-разрядные машины.
---
...Я работаю антинаучным аферистом...
> а) двойное представление целых чисел в виде собственно чисел,
> и в виде цепочек двоичных разрядов, с соответствующими
> допустимыми действиями над ними;
> б) поощрение использования представления целых чисел в виде дополнения до двух;
> в) полное отсутствие средств управления переполнением в действиях,
> производимых над целыми числами.
Еще раз повторю: C - изначально создавался именно, как "переносимый ассемблер".
Все добавления в C вызваны как раз тем, что C - это ассемблер.
Процессор по-разному работает с большими и маленькими числами, различает signed и unsigned => соответственно все тоже самое появилось в C.
процессор умеет оптимальнее работать с числами дополненных до двух => в C также добавлены эти же команды
Процессор умеет сообщать об ошибке переполнения, но это не получается встроить в процедурную модель "много входных данных->один(или меньше) результат" =>- значит нафиг такую ошибку.
Процессор умеет проводить битые операции => Ок, их тоже добавляют в C
Процессор не умеет возводить в степень - нафиг такую функциональность
Процессор не умеет оперировать числами с произвольной разрядностью - нафиг такую функциональность
Процессор не умеет оперировать ограниченными числами - нафиг такую функциональность
Т.е. при разработке языка в первую очередь руководствовались лозунгом "Что умеет машина?", а не "что хочет человек?".
Соответственно получился хороший язык, но удобный, в первую очередь, для системных программистов, но т.к. в то время большое число программистов - даже решающих прикладные задачи, приходилось писать системный код, то язык был очень востребован.
> "переносимый ассемблер".
...Для PDP-11.
> Процессор по-разному работает с большими и маленькими числами,
> различает signed и unsigned => соответственно все тоже самое
> появилось в C.
Одновременно со следующим?
> процессор умеет оптимальнее работать с числами дополненных до
> двух => в C также добавлены эти же команды
> Процессор умеет сообщать об ошибке переполнения, но это не
> получается встроить в процедурную модель "много входных
> данных->один(или меньше) результат" =>- значит нафиг такую
> ошибку.
В ещё более простом ПЛ/М есть "CARRY".
> Процессор не умеет возводить в степень - нафиг такую функциональность
LSI-11 ещё и умножать не умеет.
> Процессор не умеет оперировать числами с произвольной
> разрядностью - нафиг такую функциональность
В отличие от умножения, сложение с переносом
есть в фон-неймановских машинах всегда.
Сложение чисел двойной, тройной и т. д. разрядности
сделать куда проще, чем умножение.
Ада тоже разработан как "переносимый ассемблер."
Причём разработан именно как переносимый.
И разработан с учётом программирования систем.
Однако, таких извратов с двойным представлением нет.
Ещё тебе никто не мешает использовать подмножества языка.
Например, так, как это делали с ПЛ/1.
В котором тоже давно есть объявление разрядности чисел.
---
...Я работаю антинаучным аферистом...
Это к слову о системности (низкоуровности) языка.
ps
Все основные операционки написаны на C/C++.
ззы
MacOs (как старый, так и новый) интересно тоже на C/C++ написан?
что именно в данных документах тебя так заинтересовало?
попробуй написать его на асме потом приходи, обсудим, позапускаем
У меня есть образец замечательно переносимого кода,
расчитанного на не менее, чем 12-разрядные машины.
повезло тебе
написанное на ПЛ-1 ещё в действии.
---
"Narrowness of experience leads to narrowness of imagination."
Rob Pike
Оставить комментарий
Ivan8209
Переменные s и x объявлены как "unsigned long int."Переменная s предполагается берущейся произвольно.
Например, считыванием показаний часов.
Она принимает произвольные допустимые значения.
Переменная x ни при каких условиях не должна оказаться нулевой.
"Ни при каких" означает именно "ни при каких" и ничего более.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek