[holy war] Big-Endians vs. Little-Endians
Ниасилил. Резюмируй конспективно, предлагает ли автор какой-нибудь способ решения проблемы, и если да - то какой.
прокрути на два экрана вверх... там специально есть conclusion. 
если одной фразой, то


если одной фразой, то
How about tossing a coin ?

А, так это очень разумное предложение, только кто на него пойдет? Разве что монетку бросит какая-нибудь ИСО.
My BIG-endian will eat your little-endian (c)
> will eat
чото всё никак
чото всё никак
Дата у документа своеобразная...
для программистов на С - это пох.
специально придумывались "высокоуровневые языки" программирования. вот и пусть их используют не думая об аппаратном обеспечении.
а аппаратчики будут делать так, как удобно в конкретном месте для реализации архитектуры. и проблемы преобразования лягут на компиляторописателей....
а определяющим фактором все равно будут аппаратчики...
специально придумывались "высокоуровневые языки" программирования. вот и пусть их используют не думая об аппаратном обеспечении.
а аппаратчики будут делать так, как удобно в конкретном месте для реализации архитектуры. и проблемы преобразования лягут на компиляторописателей....
а определяющим фактором все равно будут аппаратчики...
> для программистов на С - это пох.
Не правда.
Не правда.
Здесь это слово пишется слитно: "неправда."
Им не понять, они не различают указатели и ссылки.
---
...Я работаю антинаучным аферистом...
Им не понять, они не различают указатели и ссылки.
---
...Я работаю антинаучным аферистом...
пример.
где есть различие между LSB и MSB.
причем такой пример, который нельзя разрешить не зная принципы устройства архитектуры.
где есть различие между LSB и MSB.
причем такой пример, который нельзя разрешить не зная принципы устройства архитектуры.
Если данные принимаются с железки, с другого компьютера, из другой программы - то важно знать используется big-endian или little-endian.
Посмотри /usr/include/machine/endian.h. Дефайны определенные в этом файле применяются повсюду в различных примитивах. Конечно большая часть проблем скрыта от разработчика, но это не заслуга языка C.
Если данные принимаются с железки, с другого компьютера, из другой программы - то важно знать используется big-endian или little-endian.Автономные устройства обязаны общаться друг с другом в net byte order.
Если данные принимаются с железки, с другого компьютера, из другой программы - то важно знать используется big-endian или little-endian.неважно. устройство отдаст тебе уже готовые байт или слово.
если конечно ты не пишешь низкоуровневый драйвер.
а что в коде "высокоуровневого" языка делают вставки на ассемблере? 
пример не считается...
пример не считается...
Из этого файла включается sys/_types.h. Обрати внимание на то, что многие стандартные типы данных будут разными на архитектурах с различным endianness.
> Автономные устройства обязаны общаться друг с другом в net byte order.
Дык все равно надо в машинное представление переводить.
Дык все равно надо в машинное представление переводить.
Устройство может отдавать тебе октеты, а вот в слова ты их сам
будешь складывать.
Да и кроме общения со внешними устройствами есть места,
где надо будет учитывать порядок в памяти.
---
...Я работаю антинаучным аферистом...
будешь складывать.
Да и кроме общения со внешними устройствами есть места,
где надо будет учитывать порядок в памяти.
---
...Я работаю антинаучным аферистом...
> устройство отдаст тебе уже готовые байт или слово
так оно и отдает готовый, только он может быть записан c правильным расположением байт, а может и нет.
так оно и отдает готовый, только он может быть записан c правильным расположением байт, а может и нет.
Да и кроме общения со внешними устройствами есть места,Да, вот в sys/ata.h встречались #if BYTE_ORDER ==.
где надо будет учитывать порядок в памяти.
1. это именно общение со внешним устройством.
2. в 4.11 этого нет. значит это ЗАЧЕМ-ТО придумали в 5.
2. в 4.11 этого нет. значит это ЗАЧЕМ-ТО придумали в 5.
Очевидно, ранее это было просто зашито в код без объявления,
что, мол, порядок октетов в слове такой-то.
---
...Я работаю антинаучным аферистом...
что, мол, порядок октетов в слове такой-то.
---
...Я работаю антинаучным аферистом...
устройство отдаст тебе уже готовые байт или слово.Есть такая вещь как DMA. Ты даешь устройству void * (ну не совсем, на самом деле ты даешь ему _физический_ адрес, но сейчас это не важно а оно в память по этому адресу выкладывает данные. И этот адаптер работает в некотором byte-sex, и может быть совершенно не в курсе, какой процессор вставлен.
для программистов на С - это пох.Ну пипец! Это Си-то высокоуровневый?!
 Там типа арифметика на указателях есть...
 Там типа арифметика на указателях есть... Что ты доказать то вообще хочешь? Что проблемы с порядком байтов в принципе разрешимы? Это и так всем понятно. Что программист может вообще не знать о существовании этих проблем? Очевидно, что это не так...
Пофигу... разницы между ними никакой 
UInt8* он и в африке UInt8*

UInt8* он и в африке UInt8*
Если ты ещё не в курсе, то сообщаю: не на всех архитектурах
можно из памяти читать октеты, бывает так, что можно читать
только полные слова.
---
...Я работаю антинаучным аферистом...
можно из памяти читать октеты, бывает так, что можно читать
только полные слова.
---
...Я работаю антинаучным аферистом...
Для тех кто с бронепоезда, из памяти всегда читается строка обычно 64 байта...
( однокристалки не в счет у них кеша нету )
 )
а байтовые операции есть у всех...
( однокристалки не в счет у них кеша нету
 )
 )а байтовые операции есть у всех...

в пнях вроде в кэше строка 32байта
да
я вот что-то не догоняю, в каком случае это принципиально и код должен быть разный?
дайте пример кто-нить
дайте пример кто-нить
а байтовые операции есть у всехУ всех, которые ты знаешь...
 Чему вообще противоречит отсутствие такой операции - записать байт? Бит же нельзя записать - никто не страдает...
 Чему вообще противоречит отсутствие такой операции - записать байт? Бит же нельзя записать - никто не страдает...в каком случае это принципиальноТы не понимаешь при чем тут sys/ata.h или вообще не понимаешь?
PS. Ваще не в курсе, что такое sys/ata.h

нет, не в курсе
объясни почему там возникает ситуация, что код должен быть разным
объясни почему там возникает ситуация, что код должен быть разным
просто я не очень ясно представляю чем они друг от друга отличаются
вопрос: сдвигом пользоваться вместо умн на 2 можно в любом случае?
вопрос: сдвигом пользоваться вместо умн на 2 можно в любом случае?
> вопрос: сдвигом пользоваться вместо умн на 2 можно в любом случае? 
сдвиг влево всегда означает умножение. Вне зависимости от платформы.
сдвиг влево всегда означает умножение. Вне зависимости от платформы.
тогда в чем разничаца между Big-Endians и Little--Endians, только как проц из памяти в регистры загружает?
Есть шняга с которой приходят байты.
Для того, чтобы принять int - на одной платформе надо делать:
на другой:
можно, конечно, делать:
Для того, чтобы принять int - на одной платформе надо делать:
BYTE data[4];
data[0] = ReadByte;
data[1] = ReadByte;
data[2] = ReadByte;
data[3] = ReadByte;
int *i = (int*)data;
на другой:
BYTE data[4];
data[3] = ReadByte;
data[2] = ReadByte;
data[1] = ReadByte;
data[0] = ReadByte;
int *i = (int*)data;
можно, конечно, делать:
но это будет менее оптимально
int i = ReadByte << 8) + ReadByte << 8) + ReadByte<<8) + ReadByte;
да, зависит, как числа хранятся в памяти.
По большому счету тебе всё равно ... 
по принципу что в память записал что и считал, тут LE BE без разницы
да и вообще всё пофигу... просто сидели мужики и думали как им проще смотреть на мир
мир линеен с лева на право
0 1 2 3 4 5 6 7 8 ...
по-этому в регистры так и записывается eax [0 1 2 3]
 eax [0 1 2 3]
Другие от нех делать... так что всё что слева то младше
а самое что интересное вы что об этом паритесь?
обычное программирование на С/С++ не ведает что у него
А на счет процессоров... предложи пример процессора у которого нет считать байт? я искренне буду рад, посмотреть на то что ещё не видел ... с меня даже сок
по принципу что в память записал что и считал, тут LE BE без разницы

да и вообще всё пофигу... просто сидели мужики и думали как им проще смотреть на мир
мир линеен с лева на право
0 1 2 3 4 5 6 7 8 ...
по-этому в регистры так и записывается
 eax [0 1 2 3]
 eax [0 1 2 3]Другие от нех делать... так что всё что слева то младше
а самое что интересное вы что об этом паритесь?
обычное программирование на С/С++ не ведает что у него
А на счет процессоров... предложи пример процессора у которого нет считать байт? я искренне буду рад, посмотреть на то что ещё не видел ... с меня даже сок

Это смотря опять на каком процессоре 

> Это смотря опять на каком процессоре 
в смысле?
в смысле?
на х86 это так 
на TM130x или Gx быстрее последний вариант

на TM130x или Gx быстрее последний вариант

ага, понятно, спасибо
Вроде слышал, что есть архитектуры, где можно считывать слова только по выровненному адресу, а в x86 иначе будет медленнее. Хотя к байтам это наверно не относится.
int i = ReadByte << 8) + ReadByte << 8) + ReadByte<<8) + ReadByte;Так вообще писать нельзя - Си не гарантирует, что вызовы ReadByte в выражении будут происходить слева направо (Причем на LE тебе вообще-то надо как раз справа налево!
 )
  )А вообще разумный пример на byte-sex проблему - это именно передача данных _между_ разными архитектурами. Если написать скажем
//общий header
struct packet_format_t
{
int x;
int y;
short int z;
};
//на одной машине
struct packet_format_t packet;
provide(&packet);
write(socket_descr, &packet);
//на другой машине
struct packet_format_t packet;
read(socket_descr, &packet);
use(&packet);
то ничего не будет работать. Те же проблемы с форматами файлов, BMP там какой-нибудь и т.д...
с меня даже сокДавай!
 
   
 ...The Alpha AXP architecture has no byte load or store instructions, and no implicithttp://www.google.ru/search?hl=ru&q=Architecture+"has+no+byte"&lr=
unaligned accesses...
Вторая ссылка
PS Фиг знает чего с ubb? Он мне " заменяет на " ? Причем в Preview все ок, а постит неправильно...
Не, ну вообще финиш!   В предыдущем посте знак " нужно заменить на %<нет пробела>22  первые три раза...
 В предыдущем посте знак " нужно заменить на %<нет пробела>22  первые три раза...
 В предыдущем посте знак " нужно заменить на %<нет пробела>22  первые три раза...
 В предыдущем посте знак " нужно заменить на %<нет пробела>22  первые три раза...да вроде нормально делается ссылка:
ищем в гугле Architecture 'has no byte'
ищем в гугле Architecture 'has no byte'
ага только читай дальше 
Instead of including byte load/store, we followed the RISC philosophy
of exposing hidden computation as a sequence of many simple, fast
instructions. In the Alpha AXP architecture, a byte load is done as an
explicit load/shift sequence; a byte store as an explicit load/modify/store
sequence. We tuned the instruction set to keep these sequences short. The
instructions in these sequences can be intermixed, scheduled, and issued as
multiples with other computation, as can the rest of the instructions in
the architecture. Table 1 gives a summary of the Alpha AXP instruction set.
:Р и ещё скажи что байт нельзя загрузить

Instead of including byte load/store, we followed the RISC philosophy
of exposing hidden computation as a sequence of many simple, fast
instructions. In the Alpha AXP architecture, a byte load is done as an
explicit load/shift sequence; a byte store as an explicit load/modify/store
sequence. We tuned the instruction set to keep these sequences short. The
instructions in these sequences can be intermixed, scheduled, and issued as
multiples with other computation, as can the rest of the instructions in
the architecture. Table 1 gives a summary of the Alpha AXP instruction set.
:Р и ещё скажи что байт нельзя загрузить

Я не знаю, что тебе ответить.   В этом процессоре (и многих других) нет инструкций побайтного доступа к памяти. То что такой доступ можно выразить с помощью других инструкций как то не вызывало сомнения.
 В этом процессоре (и многих других) нет инструкций побайтного доступа к памяти. То что такой доступ можно выразить с помощью других инструкций как то не вызывало сомнения.
А по твоей логике получается, что в Pentium-e есть инструкции побитного обращения в память, или скажем инструкции возведения в степень? Ну раз эти действия можно записать через имеющиеся команды...
 В этом процессоре (и многих других) нет инструкций побайтного доступа к памяти. То что такой доступ можно выразить с помощью других инструкций как то не вызывало сомнения.
 В этом процессоре (и многих других) нет инструкций побайтного доступа к памяти. То что такой доступ можно выразить с помощью других инструкций как то не вызывало сомнения.А по твоей логике получается, что в Pentium-e есть инструкции побитного обращения в память, или скажем инструкции возведения в степень? Ну раз эти действия можно записать через имеющиеся команды...
обычное программирование на С/С++ не ведает что у него
Тут я по всей видимости нечто необычное закодировал...
void main
{
int x = 0x12345678;
char * p = (char *)&x;
if(*p == 0x12)
printf("BE\n");
else if(*p == 0x78)
printf("LE\n");
else
printf("mistery...\n");
}

Тут я по всей видимости нечто необычное закодировал...некорректно. зачем выдирать кусок ИНТа?
если тебе нужно обращение к кускам ИНТа, то делай сдвиг или умножение/деление или используй 4 переменных типа byte.
а такой код будет ambiguous
некорректно. зачем выдирать кусок ИНТа?А что для тебя означает слово "некорректно"? Заодно расскажи, если знаешь, что называет "обычным программированием"...
Что значит "некорректно?"
Ссылку на нарушенное положение стандарта языка, пожалуйста!
---
...Я работаю антинаучным аферистом...
Ссылку на нарушенное положение стандарта языка, пожалуйста!
---
...Я работаю антинаучным аферистом...
код двусмысленный.
теряется читабельность, появляется архитектуро-зависисимость.
еще в самом начале я просил привести кусок кода, который НЕВОЗМОЖНО сделать иначе, чем опираясь на знания о LSB MSB.
пока нормальным примером был только Ata.h
но надо читать код! и это вовсе не тот случай когда при написании программы на С необходимо знать LSB/MSB. это стыковка с конкретной железкой, и знания программиста тут не причем.
теряется читабельность, появляется архитектуро-зависисимость.
еще в самом начале я просил привести кусок кода, который НЕВОЗМОЖНО сделать иначе, чем опираясь на знания о LSB MSB.
пока нормальным примером был только Ata.h
но надо читать код! и это вовсе не тот случай когда при написании программы на С необходимо знать LSB/MSB. это стыковка с конкретной железкой, и знания программиста тут не причем.
И в чём двусмысленность?
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
---
...Я работаю антинаучным аферистом...
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
---
...Я работаю антинаучным аферистом...
я просил привести кусок кода, который НЕВОЗМОЖНО сделать иначе
 что прямо таки НЕВОЗМОЖНО?
 что прямо таки НЕВОЗМОЖНО?   
 Любую программу можно написать на машине Тьюринга, а потом написать на С интерпретатор машины Тьюринга. Так и надо делать? Ну, для платформонезависимости

И в чём двусмысленность?ты не знаешь конечный результат.
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
если тебе нужен MSB прочитай полностью ИНТ и раздели его на (нет не на 4 а на 256*sizeof(int) и это будет правильным. а если ты читаешь какой-то байт из какой-то структуры и не понимаешь что прочитал, потому что кто-то завел структуру не так как ты привык - это уже никак не связано с проблемами LSB/MSB
что прямо таки НЕВОЗМОЖНО?ну естественно в пределах разумного.
как переписать твой код - я пример привел.
Так и надо делать? Ну, для платформонезависимостиа платформонезависимость - это тот идеал к которому и стремятся все программисты и языко-компиляторо-писатели (конечно, для языков "высокого" уровня).
С к низкоуровневым языкам отношения не имеет.
BYTE data[4];А вот за такой код убивать надо. На месте.
data[0] = ReadByte;
data[1] = ReadByte;
data[2] = ReadByte;
data[3] = ReadByte;
int *i = (int*)data;
PS:
1 вариант):
для общения с оборудованием еще может понадобиться attribute__packed__ (или его замена)
union
{
int val;
BYTE bytes[ sizeof( int ) ];
} data;
2 вариант):
union
{
uint32_t val;
BYTE bytes[ 4 ];
} data;
и раздели его на (нет не на 4 а на 256*sizeof(int)На что, простите?
:Значит С - архитектурно зависимый язык. чтд.
появляется архитектуро-зависисимость
А вот за такой код убивать надо. На месте.А за что именно?
А за то. BYTE a[4] не обязан быть выровненым. int же может быть обязан быть выровненым.
LSI-11 не требует выравнивания.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
И что?
Ссылку на два положения из стандарта, которые описывают
правильное, но различное толкование приведённого кода.
Ты не путай двусмысленность, которая является свойством языка,
с аппаратной зависимостью.
---
...Я работаю антинаучным аферистом...
Ссылку на два положения из стандарта, которые описывают
правильное, но различное толкование приведённого кода.
Ты не путай двусмысленность, которая является свойством языка,
с аппаратной зависимостью.
---
...Я работаю антинаучным аферистом...
Значит С - архитектурно зависимый язык. чтд.в С есть возможность писать архитектурно-независимы код. все остальное - ихержки программистов.
И что он сможет, этот твой архитектурно-независимый код?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Ты не путай двусмысленность, которая является свойством языка,хех, вот ты сам и ответил, что для программиста на С не важно LSB или MSB. потому что языку С, до этого нет дела, хотя он и позволяет сделать код, в котором об этой проблеме придется задуматься. Но так же позволяет писать код не думая о такой проблеме. причем даже на различных архитектурах.
с аппаратной зависимостью.
так, что или мы теоретизируем об абстрактном языке С в вакууме с абстрактными кусками кода, которые написаны, только для того чтобы быть написаными. или все-таки разговариваем о реальной проблеме LSB/MSB.
И что он сможет, этот твой архитектурно-независимый код?тоже самое, что и архитектурно зависимый, только на разных архитектурах.
Плюс, большая читабельность кода.
Для программиста на Си очень важно, на какой именно машине он работает.
И именно поэтому и существуют все эти заморочки с порядком октетов.
---
...Я работаю антинаучным аферистом...
И именно поэтому и существуют все эти заморочки с порядком октетов.
---
...Я работаю антинаучным аферистом...
Хм.
А ты когда-нибудь писал этот архитектурно-независимый код?
---
...Я работаю антинаучным аферистом...
А ты когда-нибудь писал этот архитектурно-независимый код?
---
...Я работаю антинаучным аферистом...
функцию htonl можешь реализовать без знания о том, какая архитектура используется?
Она тоже нужна для общения с аппаратурой.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
в первую очередь она нужна для общения с другими программами, а потом уже для общения с железом.
Это лишь постольку, поскольку один из способов общения с другими
программами сделан тем же, что и способ общения с аппаратурой.
Если идти более разумным путём, то для общения с другими
программами надо использовать более простые и быстрые способы.
---
...Я работаю антинаучным аферистом...
программами сделан тем же, что и способ общения с аппаратурой.
Если идти более разумным путём, то для общения с другими
программами надо использовать более простые и быстрые способы.
---
...Я работаю антинаучным аферистом...
А ты когда-нибудь писал этот архитектурно-независимый код?у меня специфика работы такая, что я пишу архитектурно-зависимый.
но, все-таки, я считаю, что использование высокоуровневых языков наклфдывает обязательства по написанию "высокоуровневого кода".
Си не является таким уж высокоуровневым.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Но так же позволяет писать код не думая о такой проблеме.Ну чего глупости то говорить?
 Может еще скажешь, не зная о такой проблеме?
 Может еще скажешь, не зная о такой проблеме?Си не является таким уж высокоуровневым."Таким уж"
 он вообще никаким высокоуровневым не является...
 он вообще никаким высокоуровневым не является...Твои признаки высокоуровневости?
Низкоуровневости?
---
...Я работаю антинаучным аферистом...
Низкоуровневости?
---
...Я работаю антинаучным аферистом...
То, что все относительно и субъективно, это конечно понятно. Но мне картина примерно вот так видится:
asm < (Си, Fortran, Pascal) < С++ < (Java, .NET, Python, ...) < Lisp < (SML, Haskell, ...) < Пролог
Ну остальные можно по желанию вписывать, и по всей видимости правильнее не линейную структуру, а деревянную, но точно не знаю какую.
asm < (Си, Fortran, Pascal) < С++ < (Java, .NET, Python, ...) < Lisp < (SML, Haskell, ...) < Пролог
Ну остальные можно по желанию вписывать, и по всей видимости правильнее не линейную структуру, а деревянную, но точно не знаю какую.
А из каких соображений Лисп расположен ниже МЛей?
Только из-за поддержки одной структуры данных?
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?
Интерпретацией? Псевдокодом?
Так UCSD-p не самое новое изобретение.
Про язык ".NET" вообще не знаю.
Шо це таке?
---
...Я работаю антинаучным аферистом...
Только из-за поддержки одной структуры данных?
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?
Интерпретацией? Псевдокодом?
Так UCSD-p не самое новое изобретение.
Про язык ".NET" вообще не знаю.
Шо це таке?
---
...Я работаю антинаучным аферистом...
А из каких соображений Лисп расположен ниже МЛей?нетипизированый
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?сборкой мусора
Про язык ".NET" вообще не знаю.Ну для меня все .NET языки на одно лицо. C#, J#, VB, ... только декоративный отличия в синтаксисе, а выразительность одинаковая.
Я повторяю, тема субъективная, у меня нет цели тебя в чем-то убедить.
> нетипизированный
Кто тебе такое сказал?
> Ну для меня все .NET языки на одно лицо.
Даже их байт-код?
---
...Я работаю антинаучным аферистом...
Кто тебе такое сказал?
> Ну для меня все .NET языки на одно лицо.
Даже их байт-код?
---
...Я работаю антинаучным аферистом...
байт-код - это то, что от них останется, если лицо содрать 

Пофиг.
IL.
---
...Я работаю...
IL.
---
...Я работаю...
> нетипизированныйНу ладно, остановимся на том, что я на lisp-ах никогда ничего не писал.
Кто тебе такое сказал?
> Ну для меня все .NET языки на одно лицо.В данном контексте, да. То есть высокоуровневость IL такая же, как скажем у C#. Он оперирует настолько же высокоуровневыми понятиями как "объект", "поле", "виртуальный метод", вместо низкоуровневых "байт", "смещение"...
Даже их байт-код?
В RnRS можно встретить примерно такой заголовок:
"Disjointness of types."
Говорят, под .NET Хаскелл есть. Или я что-то путаю?
---
...Я работаю антинаучным аферистом...
"Disjointness of types."
Говорят, под .NET Хаскелл есть. Или я что-то путаю?
---
...Я работаю антинаучным аферистом...
SML.NET есть. Наверное его нужно считать и выше SML и выше .NET Правда он сыроват, его не в microsoft, а в microsoft research делали... А так - крутой язык, наверное: SML + виртуальные вызовы методов  Никогда не пользовал...
 Никогда не пользовал...  
PS. не тред а помойка
 Никогда не пользовал...
 Никогда не пользовал...  PS. не тред а помойка

Насколько я знаю, у всех "неродных" языков там проблемы сопряжения систем типов.
То есть распознаются только простые типы и ссылки на объекты, а более осмысленные проверки - только в рантайме.
То есть распознаются только простые типы и ссылки на объекты, а более осмысленные проверки - только в рантайме.
Вот про SML.NET: Limitations:
Only CLR types at boundaries of compiled code
The exposed interfaces of applications or DLLs compiled by SML.NET may only refer to CLR types (classes, interfaces, delegates, etc.). They may not expose SML-specific types (functions, datatypes, records, etc.). In particular, this restriction means that one cannot compile an arbitrary SML module into a DLL for consumption even by other SML.NET programs: the module must be either linked into the client program at compile-time or use only CLR types at its interface.
То есть есть родные языки, которые все на одно лицо, и есть остальные, которые сбоку.
Only CLR types at boundaries of compiled code
The exposed interfaces of applications or DLLs compiled by SML.NET may only refer to CLR types (classes, interfaces, delegates, etc.). They may not expose SML-specific types (functions, datatypes, records, etc.). In particular, this restriction means that one cannot compile an arbitrary SML module into a DLL for consumption even by other SML.NET programs: the module must be either linked into the client program at compile-time or use only CLR types at its interface.
То есть есть родные языки, которые все на одно лицо, и есть остальные, которые сбоку.
Таким уж" он вообще никаким высокоуровневым не является...бред.
он именно высокоуровневый.
Язык высокого уровня - согласно ГОСТ 19781-90 - язык программирования, понятия и структура которого удобны для восприятия человеком.
Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данных.
A programming language such as C, FORTRAN, or Pascal that enables a programmer to write programs that are more or less independent of a particular type of computer. Such languages are considered high-level because they are closer to human languages and further from machine languages. In contrast, assembly languages are considered low-level because they are very close to machine languages.
Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данныхСам все сказал...

вот именно.
в Си когда ты пишешь ты не знаешь (только предполагаешь) на каком проце это будет исполнятся и в какой МАШИННЫЙ код это преобразуется. и как выглядят операции с памятью и регистрами ты тоже не знаешь. ты просто пишешь программу.
в Си когда ты пишешь ты не знаешь (только предполагаешь) на каком проце это будет исполнятся и в какой МАШИННЫЙ код это преобразуется. и как выглядят операции с памятью и регистрами ты тоже не знаешь. ты просто пишешь программу.
> в Си когда ты пишешь ты не знаешь
может быть C чуть-чуть скрывает особенности железки, но C уж очень далеко от потребностей программистов.
Например, как будет выглядить эффективный динамический массив булов? как будет выглядить его написание? его использование?
как будет выглядеть работа с длинными числами?
может быть C чуть-чуть скрывает особенности железки, но C уж очень далеко от потребностей программистов.
Например, как будет выглядить эффективный динамический массив булов? как будет выглядить его написание? его использование?
как будет выглядеть работа с длинными числами?
может быть C чуть-чуть скрывает особенности железки, но C уж очень далеко от потребностей программистов.Тебе не кажется, что ты (опять) ушел от темы треда, и начал (опять) поливать грязью С?
Например, как будет выглядить эффективный динамический массив булов? как будет выглядить его написание? его использование?
как будет выглядеть работа с длинными числами?
Может быть, ты и не знаешь, на какой машине будет исполняться
твоя программа. Да только много ли ты разных машин видел?
Кроме LSI/KS-11 и семейства x86-x88 есть много других машин.
---
...Я работаю антинаучным аферистом...
твоя программа. Да только много ли ты разных машин видел?
Кроме LSI/KS-11 и семейства x86-x88 есть много других машин.
---
...Я работаю антинаучным аферистом...
машин не много, а среда компиляции?
простой пример int в BCC3 = 2 байта, в других 4 (где-то может и иначе).
хотя регистры процессора и там и там 32 разрядные (386). ты же не знаешь об особенностях архитектуры. и мало того, даже не задумываешься о них.
конечно до тех пор пока не начинается жесткая оптимизация на скорость/размер. но язык то сделан для отвлечения от особенностей архитектуры. то есть написание программы переведено на "более высокий уровень" относительно железки.
простой пример int в BCC3 = 2 байта, в других 4 (где-то может и иначе).
хотя регистры процессора и там и там 32 разрядные (386). ты же не знаешь об особенностях архитектуры. и мало того, даже не задумываешься о них.
конечно до тех пор пока не начинается жесткая оптимизация на скорость/размер. но язык то сделан для отвлечения от особенностей архитектуры. то есть написание программы переведено на "более высокий уровень" относительно железки.
Я знаю об особенностях архитектуры.
Хотя бы потому, что знаком не только с семейством Intel x86/x88.
И я бы не сказал, что даже во времена 8088 не использовал
машинозависимых особенностей.
В частности, при сравнении указателей.
"Более высокий уровень относительно железки" может быть,
например, связкой m4+gas.
А что? Тоже можно скрыть некоторые особенности железки.
---
...Я работаю антинаучным аферистом...
Хотя бы потому, что знаком не только с семейством Intel x86/x88.
И я бы не сказал, что даже во времена 8088 не использовал
машинозависимых особенностей.
В частности, при сравнении указателей.
"Более высокий уровень относительно железки" может быть,
например, связкой m4+gas.
А что? Тоже можно скрыть некоторые особенности железки.
---
...Я работаю антинаучным аферистом...
что-то я уже не улавливаю сути....
это все к чему? к тому что Си низкоуровневый язык?
или ты просто со мной не согласен?
это все к чему? к тому что Си низкоуровневый язык?
или ты просто со мной не согласен?
К тому, что Си куда ближе к низкоуровневым языкам, чем к высокоуровневым.
В особенности --- в настоящее время, когда алголоиды считаются
слишком низкоуровневыми для некоторых задач.
А Си, пожалуй, один из самых низкоуровневых среди алголоидов,
в чём можно легко убедиться, взглянув на Аду или Алгол-68.
И даже, страшно сказать, Алгол-60.
---
...Я работаю антинаучным аферистом...
В особенности --- в настоящее время, когда алголоиды считаются
слишком низкоуровневыми для некоторых задач.
А Си, пожалуй, один из самых низкоуровневых среди алголоидов,
в чём можно легко убедиться, взглянув на Аду или Алгол-68.
И даже, страшно сказать, Алгол-60.
---
...Я работаю антинаучным аферистом...
сразу не сообразил, что много ли я знаю машин кроме x86. да много: MSP430, AVR, i8051, PIC, TMS320.
и что самое главное под все почти есть С компиляторы.
и я когда пишу код, его можно перенести с одной платформы на другую поменяв примерно 20 процентов кода, а если использовать "низкоуровневость" С, то переписывать придется заново. но дело даже не в этом. а в том, что С ОТВЯЗАН от особенностей архитектуры, но до них можно добраться. но язык это высокоуровневый! язык низкого уровня - ассемблер.
ведь написав программу на Си, ты не имеешь никакого представления, что получится в машинном коде.
конечно использование знаний архитектуры может оптимизировать код, и я когда-то занимался потактовой оптимизацией и т.п. но в большинстве случаев это бессмыслено, потму что компиляторы умеют генерировать достаточно быстрый код, который еще к тому же и будет работать.
и что самое главное под все почти есть С компиляторы.
и я когда пишу код, его можно перенести с одной платформы на другую поменяв примерно 20 процентов кода, а если использовать "низкоуровневость" С, то переписывать придется заново. но дело даже не в этом. а в том, что С ОТВЯЗАН от особенностей архитектуры, но до них можно добраться. но язык это высокоуровневый! язык низкого уровня - ассемблер.
ведь написав программу на Си, ты не имеешь никакого представления, что получится в машинном коде.
конечно использование знаний архитектуры может оптимизировать код, и я когда-то занимался потактовой оптимизацией и т.п. но в большинстве случаев это бессмыслено, потму что компиляторы умеют генерировать достаточно быстрый код, который еще к тому же и будет работать.
Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данных.Согласись, что програмист на Си предполагает, что в системе обработки данных
-  есть процессор. Из-за чего например Си-подобный язык практически невозможно скомпилировать в ПЛИС, компилятор получается громоздкий, а программа неэффективной. С функциональными языками дело обстоит на порядок лучше.
 
-  этот процессор один. То есть программист пользуется понятием "current control point", которое применимо далеко не ко всем архитектурам. Компиляция Си программы под SMP архитектуру (= автоматическое распараллеливание) - неподъемная задача над которой бьются уже десятки лет. Про системы с распределенной памятью я вообще молчу. Функциональные же языки с автоматическим распараллеливанием существуют. Тот же Erlang.
 
Ключевые слова: "поменяв примерно 20 процентов кода."
То есть, эта пятая часть очень даже неслабо зависит от машины,
на которой программист собирается выполнять программу.
---
...Я работаю антинаучным аферистом...
То есть, эта пятая часть очень даже неслабо зависит от машины,
на которой программист собирается выполнять программу.
---
...Я работаю антинаучным аферистом...
С функциональными языками дело обстоит на порядок лучше.Кстати да, вот этот момент меня очень интересует: а есть ли достойные реализации функциональных языков для однокристалок?
Основные проблемы (судя по остальным реализациям ФЯ) будут на стыке ФЯ <-> окружение.
Основные проблемы (судя по остальным реализациям ФЯ) будут на стыке ФЯ <-> окружение.Ну никто не утверждал, что ФЯ на однокристалке обязан быть чистым.
Компиляция Си программы под SMP архитектуру (= автоматическое распараллеливание) - неподъемная задача над которой бьются уже десятки лет.У меня работают мультитредовые программы на C. Что я делаю не так?
Конечно, ты скажешь, что там распараллеливание не автоматическое. Тогда расскажи как по-твоему выглядит автоматическое.
Автоматическое - это что-то такое:
есть код суммирование массива:
Далее говорим - хотим, чтобы этот код выполнялся на двух процессорах причем быстро.
В итоге код сам превращается в:
есть код суммирование массива:
int sum = 0;
for (int i= 0; i < array.Length; ++i)\
sum += array[i];
Далее говорим - хотим, чтобы этот код выполнялся на двух процессорах причем быстро.
В итоге код сам превращается в:
//thread1
int sum1 = 0;
for (int i = 0; i < array.Length/2; ++i)
sum1 += array[i];
//thread2
int sum2 = 0;
for (int i = array.Length/2; i < array.Length; ++i)
sum2 += array[i];
int sum = sum1 + sum2;
Предположим, что такой волшебный компилятор существует.
Во-первых, не все примеры будут такие простые, как этот. Не всегда под силу компилятору найти возможность распараллелить там, где найдет человек.
Во-вторых, если тупо параллелить всё участки кода, где это возможно, то могут быть следующие препятствия. Цена создания треда не равна нулю, иногда выгоднее обойтись без разпараллеливания. Треды не выполняются с одинаковой скоростью. Например в приведенном тобой примере, тред1 может быстро завершить свою половину работы, а тред2 не получит процессора, потому что все процессоры заняты. Поэтому тред2 сразу уснет, а тред1 завершит свою половину работы и уснет, отдав при этом процессор. В лучшем случае процессор получит тред2 и завершит свою половину работы. Задача выполнена, но сколько лишний переключений было! А еще может случиться так, что когда тред1 закончит и уснёт процессор будет отдан другому процессу.
Во-первых, не все примеры будут такие простые, как этот. Не всегда под силу компилятору найти возможность распараллелить там, где найдет человек.
Во-вторых, если тупо параллелить всё участки кода, где это возможно, то могут быть следующие препятствия. Цена создания треда не равна нулю, иногда выгоднее обойтись без разпараллеливания. Треды не выполняются с одинаковой скоростью. Например в приведенном тобой примере, тред1 может быстро завершить свою половину работы, а тред2 не получит процессора, потому что все процессоры заняты. Поэтому тред2 сразу уснет, а тред1 завершит свою половину работы и уснет, отдав при этом процессор. В лучшем случае процессор получит тред2 и завершит свою половину работы. Задача выполнена, но сколько лишний переключений было! А еще может случиться так, что когда тред1 закончит и уснёт процессор будет отдан другому процессу.
Оптимизация распараллеливания --- это уже совершенно другой вопрос.
Когда-то языки программирования высокого уровня тоже считались
бредом, поскольку человеку лучше, чем компилятору видно,
где можно оптимизировать, а где не надо.
---
...Я работаю антинаучным аферистом...
Когда-то языки программирования высокого уровня тоже считались
бредом, поскольку человеку лучше, чем компилятору видно,
где можно оптимизировать, а где не надо.
---
...Я работаю антинаучным аферистом...
Да не знаю я об этом ничего  
  Просто сказал, потому что сомнения не вызывает... Вот  так в гугле набрал - там то же самое говорят
  Просто сказал, потому что сомнения не вызывает... Вот  так в гугле набрал - там то же самое говорят 
 
  Просто сказал, потому что сомнения не вызывает... Вот  так в гугле набрал - там то же самое говорят
  Просто сказал, потому что сомнения не вызывает... Вот  так в гугле набрал - там то же самое говорят 
... Implement a robust design language for FPGA design ... The Functional nature of the language is important ...
Что я делаю не так?Ты пользуешься (вынужден пользоваться) знаниями о "возможностях системы обработки данных", потому что язык Си в недостаточной мере "отражает потребности программиста"...
Это скорее кандидат на векторизацию. Распараллеливание тут не катит, по причинам которые изложил Глеб. Кстати, компилятор от Интела скорее всего сумеет векторизовать этот цикл(под рукой сейчас нет, позже проверю).
Распараллеливание покатит, если каждый элемент массива нужно сначала долго-долго считать.
Кстати, распараллеливание, которое предложил , использует ассоциативность операции сложения,
что уже не будет выполняться в случае с числами с плавающей точкой.
Кстати, распараллеливание, которое предложил , использует ассоциативность операции сложения,
что уже не будет выполняться в случае с числами с плавающей точкой.
Такой "сложный" цикл он сможет по твоей терминалогии и векторизовать (= уложить на SSE) и распараллелить (= уложить на HyperThreading). Но все автоматическое распараллеливания ограничивается линейными выражениями в индексах. Стоит написать A[B[ i ]] и привет  

Если долго считать - то конечно. Но я говорил про конкретный пример  Кстати если там нужно будет что-то считать, то скорее всего и распараллелить(автоматически) не выйдет. Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.
 Кстати если там нужно будет что-то считать, то скорее всего и распараллелить(автоматически) не выйдет. Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.
 Кстати если там нужно будет что-то считать, то скорее всего и распараллелить(автоматически) не выйдет. Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.
 Кстати если там нужно будет что-то считать, то скорее всего и распараллелить(автоматически) не выйдет. Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.В том-то все и дело, что распараллелить может быть очень дорого. Может там всего 10 итераций в среднем. Тогда создание/завершение треда съест весь выиигрыш.
не будет выполняться в случае с числами с плавающей точкойНу, с помощью соответствующих опций компилятор можно убедить в чем угодно
 в том числе в ассоциативности операций с плавающей точкой
 в том числе в ассоциативности операций с плавающей точкой  
 По-моему в компиляторах даже более типична опция типа -preserve-float-presision, то есть по умолчанию он на такие тонкости кладет.
К тому же я уже гже-то писал, что SSE регистры короче чем регистры в стеке сопроцессора, так что потери точности будут даже если сохранить порядок операций.
Intel предоставляет средства для автоматического профилирования с последующим автоматическим адекватным распараллеливанием.
> Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.
Поэтому тут и упомянули функциональную парадигму, в которой их отсутствие - нормальная ситуация,
а наличие нужно оформлять специальными конструкциями.
Поэтому тут и упомянули функциональную парадигму, в которой их отсутствие - нормальная ситуация,
а наличие нужно оформлять специальными конструкциями.
Функциональное программирование - это конечно хорошо. Но вот вопрос: если запустить одну и ту же задачу:
1) Написанную на С/С++ на одном проце
2) На функциональном языке, распараллеленную(автоматически) на 4 таких же процах
То кто победит? В общем, существуют ли эффективные оптимизирующие компиляторы для функциональных языков?
1) Написанную на С/С++ на одном проце
2) На функциональном языке, распараллеленную(автоматически) на 4 таких же процах
То кто победит? В общем, существуют ли эффективные оптимизирующие компиляторы для функциональных языков?
> Распараллеливание покатит, если каждый элемент массива нужно сначала долго-долго считать.
А если это неизвестно заранее? То есть некоторые элементы считаются очень быстро, а некоторые очень медленно.
А если это неизвестно заранее? То есть некоторые элементы считаются очень быстро, а некоторые очень медленно.
Ну один тред сможет начать помогать другому. Но тогда уже не обойтись без блокировок. А это уже не очень хорошо.
Насколько я знаю, это сильно зависит от конкретной задачи.
Кроме использования функциональных языков, есть гибридные подходы:
тело чистой функции реализуется на низкоуровневом языке типа C/С++,
и отсутствие побочных эффектов гарантирует программист;
программа в функциональном стиле состоит из вызова таких функций,
и распараллеливается автоматически. Таким образом можно получить
эффективные микрооптимизации и автоматическое распараллеливание одновременно.
Кроме использования функциональных языков, есть гибридные подходы:
тело чистой функции реализуется на низкоуровневом языке типа C/С++,
и отсутствие побочных эффектов гарантирует программист;
программа в функциональном стиле состоит из вызова таких функций,
и распараллеливается автоматически. Таким образом можно получить
эффективные микрооптимизации и автоматическое распараллеливание одновременно.
Вот это уже интереснее  А есть ли проекты(желательно опенсурс построенные на подобной технологии? Было бы интересно поглядеть.
 А есть ли проекты(желательно опенсурс построенные на подобной технологии? Было бы интересно поглядеть.
 А есть ли проекты(желательно опенсурс построенные на подобной технологии? Было бы интересно поглядеть.
 А есть ли проекты(желательно опенсурс построенные на подобной технологии? Было бы интересно поглядеть.Ключевые слова: "поменяв примерно 20 процентов кода."особенности программирования однокристалок. и даже при этом код остается портируемым! при том что он будет выполнятся на совершенно другой архитектуре.
То есть, эта пятая часть очень даже неслабо зависит от машины,
на которой программист собирается выполнять программу.
> А если это неизвестно заранее? То есть некоторые элементы считаются очень быстро, а некоторые очень медленно.
Здесь может помочь автоматическое динамическое распараллеливание, когда отдельные блоки
раскидываются между процессорами по мере надобности.
Здесь может помочь автоматическое динамическое распараллеливание, когда отдельные блоки
раскидываются между процессорами по мере надобности.
Здесь может помочь автоматическое динамическое распараллеливание, когда отдельные блокиТы это знаешь. Знает ли об этом компилятор?
раскидываются между процессорами по мере надобности.
Согласись, что програмист на Си предполагает, что в системе обработки данных
есть процессор.а на Java не предполагает?
Из-за чего например Си-подобный язык практически невозможно скомпилировать в ПЛИС, компилятор получается громоздкий, а программа неэффективной.причем тут ПЛИС? ты когда-нибудь писал модель для ПЛИС? это не программа - это описание модели.
а программирование на Си именно написание программы - последовательности команд. которая, да будет исполнятся на процессоре, но программа на Java будет исполняться на Java-машине - суть процессоре.
этот процессор одинкое-какой код распаралеливать сейчас умеют (это тут уже обсуждают). впрочем это даже не важно. на пресловутой Java у тебя тоже одна Java-машина, из-за этого Java становится низкоуровневым языком?
Существуют.
Например, для OCaml и SML.
---
...Я работаю антинаучным аферистом...
Например, для OCaml и SML.
---
...Я работаю антинаучным аферистом...
А они точно эффективные? Например перемножение матриц на С и OCaml как будет сравнимо по скорости?
Я не знаю, что такое "портируемый."
Да, если поработать напильником, то, наверное, много чего
можно перенести.
В частности, если понавставлять в код "#ifdef"/"#ifndef",
как это любят делать насильники.
---
...Я работаю антинаучным аферистом...
Да, если поработать напильником, то, наверное, много чего
можно перенести.
В частности, если понавставлять в код "#ifdef"/"#ifndef",
как это любят делать насильники.
---
...Я работаю антинаучным аферистом...
В частности, быстрое БПФ переносилось на Си компиляцией с ОКамла.
По крайней мере, так говорят. И такое вполне даже возможно.
---
...Я работаю антинаучным аферистом...
По крайней мере, так говорят. И такое вполне даже возможно.
---
...Я работаю антинаучным аферистом...
хорошо, не нравится портируемый - скажем так.
переписывание 20 процентов кода, который, по мнению большинства обязан быть "машинозависимым" для переделки на другую платформу - это не написание программы с нуля. #ifndef - Не считаем написанием одной программы.
можно подойти иначе - если у тебя есть примерное описание архитектур с некоторыми различиями, то на С ты можешь написать программу которая скомпилируется в разных средах под разные архитектуры.
переписывание 20 процентов кода, который, по мнению большинства обязан быть "машинозависимым" для переделки на другую платформу - это не написание программы с нуля. #ifndef - Не считаем написанием одной программы.
можно подойти иначе - если у тебя есть примерное описание архитектур с некоторыми различиями, то на С ты можешь написать программу которая скомпилируется в разных средах под разные архитектуры.
Необходимость переписывания пятой части кода --- весьма странным
образом сочетается с восторженными криками о переносимости.
Вот, к примеру, программу, написанную на Схеме (например, R5RS
можно переносить куда угодно без исправлений.
У меня на компьютере стоит мелкий схемоподобный Лисп, где мне
потребовалось лишь доопределить несколько слов из R5RS, чтобы
всё сразу заработало.
И никакой одной пятой.
---
...Я работаю антинаучным аферистом...
образом сочетается с восторженными криками о переносимости.
Вот, к примеру, программу, написанную на Схеме (например, R5RS
можно переносить куда угодно без исправлений.
У меня на компьютере стоит мелкий схемоподобный Лисп, где мне
потребовалось лишь доопределить несколько слов из R5RS, чтобы
всё сразу заработало.
И никакой одной пятой.
---
...Я работаю антинаучным аферистом...
Я Мишино мнение и упорство не поддерживаю, но замечу, что цифра 20% завышена. Например:
think:~/NetBSD/src/sys:|>du -ksh .
150M .
think:~/NetBSD/src/sys:|>du -ksh arch/*
8,0K arch/CVS
2,0K arch/Makefile
6,0K arch/README
806K arch/acorn26
1,3M arch/acorn32
662K arch/algor
3,1M arch/alpha
1,0M arch/amd64
3,7M arch/amiga
292K arch/amigappc
1,2M arch/arc
3,7M arch/arm
2,6M arch/atari
794K arch/bebox
276K arch/cats
372K arch/cesfic
516K arch/cobalt
600K arch/dreamcast
1,7M arch/evbarm
546K arch/evbmips
620K arch/evbppc
234K arch/evbsh3
312K arch/evbsh5
1,8M arch/hp300
1,1M arch/hp700
2,1M arch/hpc
454K arch/hpcarm
3,1M arch/hpcmips
622K arch/hpcsh
1,0M arch/hppa
3,7M arch/i386
348K arch/ibmnws
262K arch/iyonix
494K arch/luna68k
4,3M arch/m68k
1,6M arch/mac68k
1,2M arch/macppc
2,1M arch/mips
656K arch/mipsco
362K arch/mmeye
1,2M arch/mvme68k
482K arch/mvmeppc
252K arch/netwinder
640K arch/news68k
788K arch/newsmips
854K arch/next68k
548K arch/ofppc
12K arch/openblocks405
988K arch/pc532
320K arch/pdp10
586K arch/playstation2
1,4M arch/pmax
358K arch/pmppc
1,8M arch/powerpc
906K arch/prep
390K arch/sandpoint
504K arch/sbmips
1,2M arch/sgimips
802K arch/sh3
1,1M arch/sh5
1,2M arch/shark
2,7M arch/sparc
1,9M arch/sparc64
750K arch/sun2
1,6M arch/sun3
476K arch/sun68k
1,9M arch/vax
1,8M arch/x68k
538K arch/x86
994K arch/xen
одна пятая - потому что я так пишу.
можно написать так, что придется только переопределить физические порты и ножки (10-20 #define + инициализация ножек (строк 50 кода
и он будет полностью переносим. просто я так не делаю, потому что скорее всего не понадобится...
НО! это не означает, что Си низкоуровневый язык.
к низкому уровню из Си добраться можно, как и из С++, но почему-то С++ поднимают по "уровням" выше. из С# тоже можно писать непосредственно в регистры процессора? так почему же это не низкоуровневый язык?
можно написать так, что придется только переопределить физические порты и ножки (10-20 #define + инициализация ножек (строк 50 кода
и он будет полностью переносим. просто я так не делаю, потому что скорее всего не понадобится...
НО! это не означает, что Си низкоуровневый язык.
к низкому уровню из Си добраться можно, как и из С++, но почему-то С++ поднимают по "уровням" выше. из С# тоже можно писать непосредственно в регистры процессора? так почему же это не низкоуровневый язык?
написание программы - последовательности командне лечится...
откомпилированный код - это что?
А можно сделать такое:
А то так мало что ясно.
---
...Я работаю антинаучным аферистом...
?
du -kd 1 arch/* | awk '{ sum+=$1;}
END { print sum/NR;}
А то так мало что ясно.
---
...Я работаю антинаучным аферистом...
частности, быстрое БПФ переносилось на Си компиляцией с ОКамла.Если ты про fftw.org, то там на каком то фя (возможно и ОКамль) был написан _генератор_ Си программы, так что это немного не то.
По крайней мере, так говорят. И такое вполне даже возможно.
написание программы - последовательности командпо отношению к программированию ПЛИС - программирование на С именно написание последовательности команд.
Это то же самое.
Сишная же программа не была создана человеком?
---
...Я работаю антинаучным аферистом...
Сишная же программа не была создана человеком?
---
...Я работаю антинаучным аферистом...
откомпилированный код - это что?Ну раз у нас тред (теперь уже) на тему "Низко/Высоко-уровневые языки программирования", то я готов обсуждать лишь _теорию языков программирования_, так что я не знаю, что такое "код"
 Компилятор преобразует программу на одном языке в программу на другом языке. Природа этих языков может быть произвольной.
 Компилятор преобразует программу на одном языке в программу на другом языке. Природа этих языков может быть произвольной.по отношению к программированию ПЛИС - программирование на С именно написание последовательности командЯзыки, в которых программа является в той или иной степени последовательностью комманд - называются императивными. Такими языками многообразие языков программирования не ограничивается. Если ты не знаешь про функциональное программирование, то уж по крайней мере слышал про Пролог или про SQL.
Ну раз у нас тред (теперь уже) на тему "Низко/Высоко-уровневые языки программирования",наконец-то.
давайте определимся о чем этот тред...
то я готов обсуждать лишь _теорию языков программирования_, так что я не знаю, что такое "код" Компилятор преобразует программу на одном языке в программу на другом языке.предлагаю отделить машинный код, который непосредственно исполняется на железке, от эмуляций, рантаймов и прочего. тогда есть программа на языке, а есть реальный код исполняемый процессором.
кажется именно для того чтобы не писать программы единичками и ноликами и были придуманы сначала ассемблер, который является только семантической интерпретацией машинного кода, а потом иные языки более высокого уровня.
а есть реальный код исполняемый процессоромДа отстань ты со своим процессором
 , dataflow архитектуры например есть.
 , dataflow архитектуры например есть.Языки, в которых программа является в той или иной степени последовательностью комманд - называются императивными. Такими языками многообразие языков программирования не ограничивается. Если ты не знаешь про функциональное программирование, то уж по крайней мере слышал про Пролог или про SQL.хорошо, моя фраза про "программа - последовательность команд" сильно отстает от жизни... когда-то это имело право на существование...
про функциональое я только слышал общие слова, но
не уверен, что это все имеет какое-то отношение к BE/LE (MSB/LSB или к низко-высоко-уровневости програмирования на С. (или же о чем тред?)
du -kd 1 arch/* | awk '{ sum+=$1;} END { print sum/NR;}'Не вижу смысла в -d 1. Если ты хотел узнать среднее арифметическое, то так:
think:~/NetBSD/src/sys:|>du -ks arch/* | grep -v CVS | awk '{ sum+=$1;}
END { print sum/NR;}'
1157,07
think:~/NetBSD/src/sys:|>
Да отстань ты со своим процессоромпервым про процессор вспомнил ты

dataflow архитектуры например есть.при некотором уровне абстракции Java-машина - суть процессор, то есть исполняющий модуль.
все-таки разговаривая о LSB/MSB или об уровнях "высоты" языков нельзя отвязываться от аппаратного обеспечения. это точка отсчета.
низко-высоко-уровневости програмирования на С.Ну, язык программирования не может быть каким-то-уровневым сам по себе, он может быть каким-то-уровневым по сравнению с другим языком. Когда ты говоришь "Си - высокоуровневый", как бы подразумевается, что по сравнению с большинством языков. Вот я тебе и пытаюсь доказать, что "большинство" как раз по другую сторону...
 Ниже Си - только различные ассемблеры, а выше - навалом всего
 Ниже Си - только различные ассемблеры, а выше - навалом всегоНу, язык программирования не может быть каким-то-уровневым сам по себе, он может быть каким-то-уровневым по сравнению с другим языком.неа

есть точка отсчета - аппаратное обеспечение.
и вот низкоуровневым будет ассемблер.
все остальное - абстракции. вот там уже можно строить иные зависимости уровней, конечно Си будет лежать ниже многих. но он уже отвязан от нижнего уровня.
Надо поискать, может есть что то вроде модели OSI для языков программирования.
Это вместо -s.
А общий размер?
Или без arch.
Чтобы было с чем сравнить.
---
...Я работаю антинаучным аферистом...
А общий размер?
Или без arch.
Чтобы было с чем сравнить.
---
...Я работаю антинаучным аферистом...
> Это вместо -s.
Тогда -d 0
> А общий размер?
> Или без arch.
В первой цитате в самом начале был размер с arch.
Тогда -d 0
> А общий размер?
> Или без arch.
В первой цитате в самом начале был размер с arch.
А что насчёт детища разных там Symbolics?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
при некотором уровне абстракции Java-машина - суть процессорА вот и нет. Ты постоянно думаешь _как_ будет происходить вычисление, а Java-машина лишь специфицирует _что_ является правильным результатом вычисления, а _как_ он будет получен - не обсуждается. Да, чтобы объяснить или понять семантику байткода удобно представить себе стековый вычислитель у которого есть последовательность состояний и т.д., но не более чем _удобно представить себе_.
об уровнях "высоты" языков нельзя отвязываться от аппаратного обеспеченияПочему? Нормальная математическая (ну и немного философская
 ) теория. Языки программирования вполне можно обсуждать, проектировать, писать интерпретаторы одних языков на других, писать компиляторы одного языка в другой на третьем - и все это вообще не имея компьютера... Компьютер конечно помогает убедиться в отсутствии ошибок, но не является необходимым.
  ) теория. Языки программирования вполне можно обсуждать, проектировать, писать интерпретаторы одних языков на других, писать компиляторы одного языка в другой на третьем - и все это вообще не имея компьютера... Компьютер конечно помогает убедиться в отсутствии ошибок, но не является необходимым.LSB/MSBА про это уже в середине треда забыли

Потерял бдительность.
У тебя локаль русская, что ли, стоит? Запятая разделителем.
Да, команда "Нет ЛСД" постаралась.
Только я сомневаюсь, что внутри того кода, который не "arch",
нет так любимых насильниками "#ifdef"/"#ifndef".
---
...Я работаю антинаучным аферистом...
У тебя локаль русская, что ли, стоит? Запятая разделителем.
Да, команда "Нет ЛСД" постаралась.
Только я сомневаюсь, что внутри того кода, который не "arch",
нет так любимых насильниками "#ifdef"/"#ifndef".
---
...Я работаю антинаучным аферистом...

80-е годы...
убедил программа - это не последовательность команд.
это описание того что программист хочет от некой виртуально-абстрактной машины? или как?
Ты постоянно думаешь _как_ будет происходить вычисление, а Java-машина лишь специфицирует _что_ является правильным результатом вычисления, а _как_ он будет получен - не обсуждается.потому что я не абстрагируюсь от аппаратной части.
ведь пока обсуждался программно-аппаратный комплекс

Почему? Нормальная математическая (ну и немного философская ) теория. Языки программирования вполне можно обсуждать, проектировать, писать интерпретаторы одних языков на других, писать компиляторы одного языка в другой на третьем - и все это вообще не имея компьютера...кроме ассемблера! нет компьютера - нет ассемблера.
уровень 1. далее пошло остальное

Да, команда "Нет ЛСД" постаралась.Совершенно верно. NetBSD очень постаралась. Например в sys/kern, sys/uvm, sys/netinet вообще нет архитектурных ifdef. Именно поэтому им удается так быстро писать порт под очередную платформу.
Только я сомневаюсь, что внутри того кода, который не "arch",
нет так любимых насильниками "#ifdef"/"#ifndef".
программа - [...] это описание того что программист хочет от некой виртуально-абстрактной машины? или как?Ну давай разведем теорию
 
 -   Определение. Языком программирования называется тройка L = (D,S,F где 
-  D - некоторое множество, называемое "доменом" языка, по смыслу это множество данных с которыми могут оперировать программы языка L. Множество D считается достаточно богатым, чтобы вмещать в себя в том или ином виде тексты программ языка L. Множество D предполагается заданым конструктивно.
 
-   S - разрешимый предикат на D называемый "синтаксисом" языка. Если для некоторого p<-D выполнено S(p то p называется программой языка L. Обозначим множество всех программ через P = { p<-D | S(p) }
 
-  F - вычислимая частично определенная функция P x D -> D, называемая "семантикой" языка.
 
Что-то вроде того...

Хм.
Ну надо же!
Тогда перехожу на "НетЛСД."
Если правда.
---
<<Скажи "нет" наркотикам!>>
Ну надо же!
Тогда перехожу на "НетЛСД."
Если правда.
---
<<Скажи "нет" наркотикам!>>
А они точно эффективные? Например перемножение матриц на С и OCaml как будет сравнимо по скорости?Перемножением матриц задачи не исчерпываются. Конкретно на этой задаче - нет. А вообще, http://shootout.alioth.debian.org/
OCaml и MLton (SML compiler) зажигают.
В последнее время мне почему-то очень часто эту ссылку кидают  В общем это не тесты, а ерунда. Для разных языков их пишут разные люди. С разным опытом и уровнем. Причем тесты очень примитивные и следовательно нерепрезентативные. Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).
 В общем это не тесты, а ерунда. Для разных языков их пишут разные люди. С разным опытом и уровнем. Причем тесты очень примитивные и следовательно нерепрезентативные. Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).
 В общем это не тесты, а ерунда. Для разных языков их пишут разные люди. С разным опытом и уровнем. Причем тесты очень примитивные и следовательно нерепрезентативные. Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).
 В общем это не тесты, а ерунда. Для разных языков их пишут разные люди. С разным опытом и уровнем. Причем тесты очень примитивные и следовательно нерепрезентативные. Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).Тебе может быть любопытно, но удивительно отсутствие bigForth-а.
Он должен побыстрее gforth-а быть.
---
...Я работаю антинаучным аферистом...
Он должен побыстрее gforth-а быть.
---
...Я работаю антинаучным аферистом...
В некоторых языках оно является примитивом,
а потому будет быстрее, чем во многих других.
Вывод: не показатель.
---
...Я работаю антинаучным аферистом...
а потому будет быстрее, чем во многих других.
Вывод: не показатель.
---
...Я работаю антинаучным аферистом...
А что мешает тебе реализовать перемножение внутриязыковым образом? Именно для оценки оптимизатора.
Например, размер компилятора, сложность его.
Компилятор может быть очень хорошо машинозависимым.
Как интеловский сишный, например.
---
...Я работаю антинаучным аферистом...
Компилятор может быть очень хорошо машинозависимым.
Как интеловский сишный, например.
---
...Я работаю антинаучным аферистом...
Поизвращаться, что ли, попытаться поднять своих?
Посмотрел, сразу нашёл несколько мест, где очевиден способ ускорить.
---
VARIABLE 1
Посмотрел, сразу нашёл несколько мест, где очевиден способ ускорить.
---
VARIABLE 1
Т-cистема
Cilk
Sisal
Glasgow Parallel Haskell
это что сразу нашлось
Cilk
Sisal
Glasgow Parallel Haskell
это что сразу нашлось
Для разных языков их пишут разные люди. С разным опытом и уровнем.Говноаргумент. Исходники всех тестов выложены, если ты считаешь, что существуют более эффективные реализации этого же решения на данном языке, то напиши свою и отошли авторам тестов.
и следовательно нерепрезентативные.Какой тест считать репрезентативным? Dhrystone? Whetstone? SPECint? SPECfloat?
Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).Нет. Существуют задачи, которые эффективнее решать на алгоритмических языках. Существуют задачи, которые эффективнее решать на функциональных. Перемножение матриц относится к первой категории.
1) Ничего подобного. Ерунду ты какую-то написал. ИМХО. 
2) SPECint, SPECfloat - весьма уважаемые тесты. ИМХО на них и нужно ориентироваться
3) Какие же задачи относятся ко второй категории?

2) SPECint, SPECfloat - весьма уважаемые тесты. ИМХО на них и нужно ориентироваться
3) Какие же задачи относятся ко второй категории?
В некоторым смысле, ФЯ чуть выше, чем алго-языки. 
Соответственно на ФЯ пишутся эффективнее сложные задачки - которые требует большое число мелких оптимизаций.
например, ленивые вычисления.
Соответственно на ФЯ пишутся эффективнее сложные задачки - которые требует большое число мелких оптимизаций.
например, ленивые вычисления.
SPECint, SPECfloat - весьма уважаемые тесты.Возможно, они и уважаемые, но их исходники недоступны. Или я что-то путаю?
Оставить комментарий
						
			
psihodog