[holy war] Big-Endians vs. Little-Endians
Ниасилил. Резюмируй конспективно, предлагает ли автор какой-нибудь способ решения проблемы, и если да - то какой.
если одной фразой, то
How about tossing a coin ?
А, так это очень разумное предложение, только кто на него пойдет? Разве что монетку бросит какая-нибудь ИСО.
My BIG-endian will eat your little-endian (c)
чото всё никак
Дата у документа своеобразная...
специально придумывались "высокоуровневые языки" программирования. вот и пусть их используют не думая об аппаратном обеспечении.
а аппаратчики будут делать так, как удобно в конкретном месте для реализации архитектуры. и проблемы преобразования лягут на компиляторописателей....
а определяющим фактором все равно будут аппаратчики...
Не правда.
Им не понять, они не различают указатели и ссылки.
---
...Я работаю антинаучным аферистом...
где есть различие между 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.
Дык все равно надо в машинное представление переводить.
будешь складывать.
Да и кроме общения со внешними устройствами есть места,
где надо будет учитывать порядок в памяти.
---
...Я работаю антинаучным аферистом...
так оно и отдает готовый, только он может быть записан c правильным расположением байт, а может и нет.
Да и кроме общения со внешними устройствами есть места,Да, вот в sys/ata.h встречались #if BYTE_ORDER ==.
где надо будет учитывать порядок в памяти.
2. в 4.11 этого нет. значит это ЗАЧЕМ-ТО придумали в 5.
что, мол, порядок октетов в слове такой-то.
---
...Я работаю антинаучным аферистом...
устройство отдаст тебе уже готовые байт или слово.Есть такая вещь как DMA. Ты даешь устройству void * (ну не совсем, на самом деле ты даешь ему _физический_ адрес, но сейчас это не важно а оно в память по этому адресу выкладывает данные. И этот адаптер работает в некотором byte-sex, и может быть совершенно не в курсе, какой процессор вставлен.
для программистов на С - это пох.Ну пипец! Это Си-то высокоуровневый?! Там типа арифметика на указателях есть...
Что ты доказать то вообще хочешь? Что проблемы с порядком байтов в принципе разрешимы? Это и так всем понятно. Что программист может вообще не знать о существовании этих проблем? Очевидно, что это не так...
UInt8* он и в африке UInt8*
можно из памяти читать октеты, бывает так, что можно читать
только полные слова.
---
...Я работаю антинаучным аферистом...
( однокристалки не в счет у них кеша нету )
а байтовые операции есть у всех...
в пнях вроде в кэше строка 32байта
да
дайте пример кто-нить
а байтовые операции есть у всехУ всех, которые ты знаешь... Чему вообще противоречит отсутствие такой операции - записать байт? Бит же нельзя записать - никто не страдает...
в каком случае это принципиальноТы не понимаешь при чем тут sys/ata.h или вообще не понимаешь?
PS. Ваще не в курсе, что такое sys/ata.h
объясни почему там возникает ситуация, что код должен быть разным
вопрос: сдвигом пользоваться вместо умн на 2 можно в любом случае?
сдвиг влево всегда означает умножение. Вне зависимости от платформы.
тогда в чем разничаца между Big-Endians и Little--Endians, только как проц из памяти в регистры загружает?
Для того, чтобы принять 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]
Другие от нех делать... так что всё что слева то младше
а самое что интересное вы что об этом паритесь?
обычное программирование на С/С++ не ведает что у него
А на счет процессоров... предложи пример процессора у которого нет считать байт? я искренне буду рад, посмотреть на то что ещё не видел ... с меня даже сок
Это смотря опять на каком процессоре
в смысле?
на 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 первые три раза...
ищем в гугле 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.
:Р и ещё скажи что байт нельзя загрузить
А по твоей логике получается, что в 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. это стыковка с конкретной железкой, и знания программиста тут не причем.
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
---
...Я работаю антинаучным аферистом...
я просил привести кусок кода, который НЕВОЗМОЖНО сделать иначечто прямо таки НЕВОЗМОЖНО?
Любую программу можно написать на машине Тьюринга, а потом написать на С интерпретатор машины Тьюринга. Так и надо делать? Ну, для платформонезависимости
И в чём двусмысленность?ты не знаешь конечный результат.
В том, что ты не знаешь, прочитается октет или нет?
Или в том, что ты не знаешь порядок выполнения действий?
если тебе нужен 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 же может быть обязан быть выровненым.
---
...Я работаю антинаучным аферистом...
Ссылку на два положения из стандарта, которые описывают
правильное, но различное толкование приведённого кода.
Ты не путай двусмысленность, которая является свойством языка,
с аппаратной зависимостью.
---
...Я работаю антинаучным аферистом...
Значит С - архитектурно зависимый язык. чтд.в С есть возможность писать архитектурно-независимы код. все остальное - ихержки программистов.
---
...Я работаю антинаучным аферистом...
Ты не путай двусмысленность, которая является свойством языка,хех, вот ты сам и ответил, что для программиста на С не важно LSB или MSB. потому что языку С, до этого нет дела, хотя он и позволяет сделать код, в котором об этой проблеме придется задуматься. Но так же позволяет писать код не думая о такой проблеме. причем даже на различных архитектурах.
с аппаратной зависимостью.
так, что или мы теоретизируем об абстрактном языке С в вакууме с абстрактными кусками кода, которые написаны, только для того чтобы быть написаными. или все-таки разговариваем о реальной проблеме LSB/MSB.
И что он сможет, этот твой архитектурно-независимый код?тоже самое, что и архитектурно зависимый, только на разных архитектурах.
Плюс, большая читабельность кода.
И именно поэтому и существуют все эти заморочки с порядком октетов.
---
...Я работаю антинаучным аферистом...
А ты когда-нибудь писал этот архитектурно-независимый код?
---
...Я работаю антинаучным аферистом...
функцию htonl можешь реализовать без знания о том, какая архитектура используется?
---
...Я работаю антинаучным аферистом...
в первую очередь она нужна для общения с другими программами, а потом уже для общения с железом.
программами сделан тем же, что и способ общения с аппаратурой.
Если идти более разумным путём, то для общения с другими
программами надо использовать более простые и быстрые способы.
---
...Я работаю антинаучным аферистом...
А ты когда-нибудь писал этот архитектурно-независимый код?у меня специфика работы такая, что я пишу архитектурно-зависимый.
но, все-таки, я считаю, что использование высокоуровневых языков наклфдывает обязательства по написанию "высокоуровневого кода".
---
...Я работаю антинаучным аферистом...
Но так же позволяет писать код не думая о такой проблеме.Ну чего глупости то говорить? Может еще скажешь, не зная о такой проблеме?
Си не является таким уж высокоуровневым."Таким уж" он вообще никаким высокоуровневым не является...
Низкоуровневости?
---
...Я работаю антинаучным аферистом...
asm < (Си, Fortran, Pascal) < С++ < (Java, .NET, Python, ...) < Lisp < (SML, Haskell, ...) < Пролог
Ну остальные можно по желанию вписывать, и по всей видимости правильнее не линейную структуру, а деревянную, но точно не знаю какую.
Только из-за поддержки одной структуры данных?
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?
Интерпретацией? Псевдокодом?
Так UCSD-p не самое новое изобретение.
Про язык ".NET" вообще не знаю.
Шо це таке?
---
...Я работаю антинаучным аферистом...
А из каких соображений Лисп расположен ниже МЛей?нетипизированый
И чем всякие Питоны и Явы так сильно отличаются от Паскаля?сборкой мусора
Про язык ".NET" вообще не знаю.Ну для меня все .NET языки на одно лицо. C#, J#, VB, ... только декоративный отличия в синтаксисе, а выразительность одинаковая.
Я повторяю, тема субъективная, у меня нет цели тебя в чем-то убедить.
Кто тебе такое сказал?
> Ну для меня все .NET языки на одно лицо.
Даже их байт-код?
---
...Я работаю антинаучным аферистом...
байт-код - это то, что от них останется, если лицо содрать
IL.
---
...Я работаю...
> нетипизированныйНу ладно, остановимся на том, что я на lisp-ах никогда ничего не писал.
Кто тебе такое сказал?
> Ну для меня все .NET языки на одно лицо.В данном контексте, да. То есть высокоуровневость IL такая же, как скажем у C#. Он оперирует настолько же высокоуровневыми понятиями как "объект", "поле", "виртуальный метод", вместо низкоуровневых "байт", "смещение"...
Даже их байт-код?
"Disjointness of types."
Говорят, под .NET Хаскелл есть. Или я что-то путаю?
---
...Я работаю антинаучным аферистом...
PS. не тред а помойка
То есть распознаются только простые типы и ссылки на объекты, а более осмысленные проверки - только в рантайме.
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 уж очень далеко от потребностей программистов.Тебе не кажется, что ты (опять) ушел от темы треда, и начал (опять) поливать грязью С?
Например, как будет выглядить эффективный динамический массив булов? как будет выглядить его написание? его использование?
как будет выглядеть работа с длинными числами?
твоя программа. Да только много ли ты разных машин видел?
Кроме LSI/KS-11 и семейства x86-x88 есть много других машин.
---
...Я работаю антинаучным аферистом...
простой пример int в BCC3 = 2 байта, в других 4 (где-то может и иначе).
хотя регистры процессора и там и там 32 разрядные (386). ты же не знаешь об особенностях архитектуры. и мало того, даже не задумываешься о них.
конечно до тех пор пока не начинается жесткая оптимизация на скорость/размер. но язык то сделан для отвлечения от особенностей архитектуры. то есть написание программы переведено на "более высокий уровень" относительно железки.
Хотя бы потому, что знаком не только с семейством Intel x86/x88.
И я бы не сказал, что даже во времена 8088 не использовал
машинозависимых особенностей.
В частности, при сравнении указателей.
"Более высокий уровень относительно железки" может быть,
например, связкой m4+gas.
А что? Тоже можно скрыть некоторые особенности железки.
---
...Я работаю антинаучным аферистом...
это все к чему? к тому что Си низкоуровневый язык?
или ты просто со мной не согласен?
В особенности --- в настоящее время, когда алголоиды считаются
слишком низкоуровневыми для некоторых задач.
А Си, пожалуй, один из самых низкоуровневых среди алголоидов,
в чём можно легко убедиться, взглянув на Аду или Алгол-68.
И даже, страшно сказать, Алгол-60.
---
...Я работаю антинаучным аферистом...
и что самое главное под все почти есть С компиляторы.
и я когда пишу код, его можно перенести с одной платформы на другую поменяв примерно 20 процентов кода, а если использовать "низкоуровневость" С, то переписывать придется заново. но дело даже не в этом. а в том, что С ОТВЯЗАН от особенностей архитектуры, но до них можно добраться. но язык это высокоуровневый! язык низкого уровня - ассемблер.
ведь написав программу на Си, ты не имеешь никакого представления, что получится в машинном коде.
конечно использование знаний архитектуры может оптимизировать код, и я когда-то занимался потактовой оптимизацией и т.п. но в большинстве случаев это бессмыслено, потму что компиляторы умеют генерировать достаточно быстрый код, который еще к тому же и будет работать.
Языки высокого уровня отражают потребности программиста, но не возможности системы обработки данных.Согласись, что програмист на Си предполагает, что в системе обработки данных
- есть процессор. Из-за чего например Си-подобный язык практически невозможно скомпилировать в ПЛИС, компилятор получается громоздкий, а программа неэффективной. С функциональными языками дело обстоит на порядок лучше.
- этот процессор один. То есть программист пользуется понятием "current control point", которое применимо далеко не ко всем архитектурам. Компиляция Си программы под SMP архитектуру (= автоматическое распараллеливание) - неподъемная задача над которой бьются уже десятки лет. Про системы с распределенной памятью я вообще молчу. Функциональные же языки с автоматическим распараллеливанием существуют. Тот же Erlang.
То есть, эта пятая часть очень даже неслабо зависит от машины,
на которой программист собирается выполнять программу.
---
...Я работаю антинаучным аферистом...
С функциональными языками дело обстоит на порядок лучше.Кстати да, вот этот момент меня очень интересует: а есть ли достойные реализации функциональных языков для однокристалок?
Основные проблемы (судя по остальным реализациям ФЯ) будут на стыке ФЯ <-> окружение.
Основные проблемы (судя по остальным реализациям ФЯ) будут на стыке ФЯ <-> окружение.Ну никто не утверждал, что ФЯ на однокристалке обязан быть чистым.
Компиляция Си программы под 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 закончит и уснёт процессор будет отдан другому процессу.
Когда-то языки программирования высокого уровня тоже считались
бредом, поскольку человеку лучше, чем компилятору видно,
где можно оптимизировать, а где не надо.
---
...Я работаю антинаучным аферистом...
так в гугле набрал - там то же самое говорят
Да не знаю я об этом ничего Просто сказал, потому что сомнения не вызывает... Вот ... Implement a robust design language for FPGA design ... The Functional nature of the language is important ...
Что я делаю не так?Ты пользуешься (вынужден пользоваться) знаниями о "возможностях системы обработки данных", потому что язык Си в недостаточной мере "отражает потребности программиста"...
Это скорее кандидат на векторизацию. Распараллеливание тут не катит, по причинам которые изложил Глеб. Кстати, компилятор от Интела скорее всего сумеет векторизовать этот цикл(под рукой сейчас нет, позже проверю).
Кстати, распараллеливание, которое предложил , использует ассоциативность операции сложения,
что уже не будет выполняться в случае с числами с плавающей точкой.
Такой "сложный" цикл он сможет по твоей терминалогии и векторизовать (= уложить на SSE) и распараллелить (= уложить на HyperThreading). Но все автоматическое распараллеливания ограничивается линейными выражениями в индексах. Стоит написать A[B[ i ]] и привет
Если долго считать - то конечно. Но я говорил про конкретный пример Кстати если там нужно будет что-то считать, то скорее всего и распараллелить(автоматически) не выйдет. Компилятор не сможет гарантировать отсутствие side effects при выполнении рассчета.
В том-то все и дело, что распараллелить может быть очень дорого. Может там всего 10 итераций в среднем. Тогда создание/завершение треда съест весь выиигрыш.
не будет выполняться в случае с числами с плавающей точкойНу, с помощью соответствующих опций компилятор можно убедить в чем угодно в том числе в ассоциативности операций с плавающей точкой
По-моему в компиляторах даже более типична опция типа -preserve-float-presision, то есть по умолчанию он на такие тонкости кладет.
К тому же я уже гже-то писал, что SSE регистры короче чем регистры в стеке сопроцессора, так что потери точности будут даже если сохранить порядок операций.
Intel предоставляет средства для автоматического профилирования с последующим автоматическим адекватным распараллеливанием.
Поэтому тут и упомянули функциональную парадигму, в которой их отсутствие - нормальная ситуация,
а наличие нужно оформлять специальными конструкциями.
1) Написанную на С/С++ на одном проце
2) На функциональном языке, распараллеленную(автоматически) на 4 таких же процах
То кто победит? В общем, существуют ли эффективные оптимизирующие компиляторы для функциональных языков?
А если это неизвестно заранее? То есть некоторые элементы считаются очень быстро, а некоторые очень медленно.
Ну один тред сможет начать помогать другому. Но тогда уже не обойтись без блокировок. А это уже не очень хорошо.
Кроме использования функциональных языков, есть гибридные подходы:
тело чистой функции реализуется на низкоуровневом языке типа C/С++,
и отсутствие побочных эффектов гарантирует программист;
программа в функциональном стиле состоит из вызова таких функций,
и распараллеливается автоматически. Таким образом можно получить
эффективные микрооптимизации и автоматическое распараллеливание одновременно.
Вот это уже интереснее А есть ли проекты(желательно опенсурс построенные на подобной технологии? Было бы интересно поглядеть.
Ключевые слова: "поменяв примерно 20 процентов кода."особенности программирования однокристалок. и даже при этом код остается портируемым! при том что он будет выполнятся на совершенно другой архитектуре.
То есть, эта пятая часть очень даже неслабо зависит от машины,
на которой программист собирается выполнять программу.
Здесь может помочь автоматическое динамическое распараллеливание, когда отдельные блоки
раскидываются между процессорами по мере надобности.
Здесь может помочь автоматическое динамическое распараллеливание, когда отдельные блокиТы это знаешь. Знает ли об этом компилятор?
раскидываются между процессорами по мере надобности.
Согласись, что програмист на Си предполагает, что в системе обработки данных
есть процессор.а на Java не предполагает?
Из-за чего например Си-подобный язык практически невозможно скомпилировать в ПЛИС, компилятор получается громоздкий, а программа неэффективной.причем тут ПЛИС? ты когда-нибудь писал модель для ПЛИС? это не программа - это описание модели.
а программирование на Си именно написание программы - последовательности команд. которая, да будет исполнятся на процессоре, но программа на Java будет исполняться на Java-машине - суть процессоре.
этот процессор одинкое-какой код распаралеливать сейчас умеют (это тут уже обсуждают). впрочем это даже не важно. на пресловутой Java у тебя тоже одна Java-машина, из-за этого Java становится низкоуровневым языком?
Например, для OCaml и SML.
---
...Я работаю антинаучным аферистом...
А они точно эффективные? Например перемножение матриц на С и OCaml как будет сравнимо по скорости?
Да, если поработать напильником, то, наверное, много чего
можно перенести.
В частности, если понавставлять в код "#ifdef"/"#ifndef",
как это любят делать насильники.
---
...Я работаю антинаучным аферистом...
По крайней мере, так говорят. И такое вполне даже возможно.
---
...Я работаю антинаучным аферистом...
переписывание 20 процентов кода, который, по мнению большинства обязан быть "машинозависимым" для переделки на другую платформу - это не написание программы с нуля. #ifndef - Не считаем написанием одной программы.
можно подойти иначе - если у тебя есть примерное описание архитектур с некоторыми различиями, то на С ты можешь написать программу которая скомпилируется в разных средах под разные архитектуры.
образом сочетается с восторженными криками о переносимости.
Вот, к примеру, программу, написанную на Схеме (например, R5RS
можно переносить куда угодно без исправлений.
У меня на компьютере стоит мелкий схемоподобный Лисп, где мне
потребовалось лишь доопределить несколько слов из R5RS, чтобы
всё сразу заработало.
И никакой одной пятой.
---
...Я работаю антинаучным аферистом...
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 кода
и он будет полностью переносим. просто я так не делаю, потому что скорее всего не понадобится...
НО! это не означает, что Си низкоуровневый язык.
к низкому уровню из Си добраться можно, как и из С++, но почему-то С++ поднимают по "уровням" выше. из С# тоже можно писать непосредственно в регистры процессора? так почему же это не низкоуровневый язык?
написание программы - последовательности командне лечится...
откомпилированный код - это что?
?
du -kd 1 arch/* | awk '{ sum+=$1;}
END { print sum/NR;}
А то так мало что ясно.
---
...Я работаю антинаучным аферистом...
частности, быстрое БПФ переносилось на Си компиляцией с ОКамла.Если ты про fftw.org, то там на каком то фя (возможно и ОКамль) был написан _генератор_ Си программы, так что это немного не то.
По крайней мере, так говорят. И такое вполне даже возможно.
написание программы - последовательности командпо отношению к программированию ПЛИС - программирование на С именно написание последовательности команд.
Сишная же программа не была создана человеком?
---
...Я работаю антинаучным аферистом...
откомпилированный код - это что?Ну раз у нас тред (теперь уже) на тему "Низко/Высоко-уровневые языки программирования", то я готов обсуждать лишь _теорию языков программирования_, так что я не знаю, что такое "код" Компилятор преобразует программу на одном языке в программу на другом языке. Природа этих языков может быть произвольной.
по отношению к программированию ПЛИС - программирование на С именно написание последовательности командЯзыки, в которых программа является в той или иной степени последовательностью комманд - называются императивными. Такими языками многообразие языков программирования не ограничивается. Если ты не знаешь про функциональное программирование, то уж по крайней мере слышал про Пролог или про SQL.
Ну раз у нас тред (теперь уже) на тему "Низко/Высоко-уровневые языки программирования",наконец-то.
давайте определимся о чем этот тред...
то я готов обсуждать лишь _теорию языков программирования_, так что я не знаю, что такое "код" Компилятор преобразует программу на одном языке в программу на другом языке.предлагаю отделить машинный код, который непосредственно исполняется на железке, от эмуляций, рантаймов и прочего. тогда есть программа на языке, а есть реальный код исполняемый процессором.
кажется именно для того чтобы не писать программы единичками и ноликами и были придуманы сначала ассемблер, который является только семантической интерпретацией машинного кода, а потом иные языки более высокого уровня.
а есть реальный код исполняемый процессоромДа отстань ты со своим процессором , 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 для языков программирования.
А общий размер?
Или без arch.
Чтобы было с чем сравнить.
---
...Я работаю антинаучным аферистом...
Тогда -d 0
> А общий размер?
> Или без arch.
В первой цитате в самом начале был размер с arch.
---
...Я работаю антинаучным аферистом...
при некотором уровне абстракции Java-машина - суть процессорА вот и нет. Ты постоянно думаешь _как_ будет происходить вычисление, а Java-машина лишь специфицирует _что_ является правильным результатом вычисления, а _как_ он будет получен - не обсуждается. Да, чтобы объяснить или понять семантику байткода удобно представить себе стековый вычислитель у которого есть последовательность состояний и т.д., но не более чем _удобно представить себе_.
об уровнях "высоты" языков нельзя отвязываться от аппаратного обеспеченияПочему? Нормальная математическая (ну и немного философская ) теория. Языки программирования вполне можно обсуждать, проектировать, писать интерпретаторы одних языков на других, писать компиляторы одного языка в другой на третьем - и все это вообще не имея компьютера... Компьютер конечно помогает убедиться в отсутствии ошибок, но не является необходимым.
LSB/MSBА про это уже в середине треда забыли
У тебя локаль русская, что ли, стоит? Запятая разделителем.
Да, команда "Нет ЛСД" постаралась.
Только я сомневаюсь, что внутри того кода, который не "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) зажигают.
В последнее время мне почему-то очень часто эту ссылку кидают В общем это не тесты, а ерунда. Для разных языков их пишут разные люди. С разным опытом и уровнем. Причем тесты очень примитивные и следовательно нерепрезентативные. Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).
Он должен побыстрее gforth-а быть.
---
...Я работаю антинаучным аферистом...
а потому будет быстрее, чем во многих других.
Вывод: не показатель.
---
...Я работаю антинаучным аферистом...
А что мешает тебе реализовать перемножение внутриязыковым образом? Именно для оценки оптимизатора.
Компилятор может быть очень хорошо машинозависимым.
Как интеловский сишный, например.
---
...Я работаю антинаучным аферистом...
Посмотрел, сразу нашёл несколько мест, где очевиден способ ускорить.
---
VARIABLE 1
Cilk
Sisal
Glasgow Parallel Haskell
это что сразу нашлось
Для разных языков их пишут разные люди. С разным опытом и уровнем.Говноаргумент. Исходники всех тестов выложены, если ты считаешь, что существуют более эффективные реализации этого же решения на данном языке, то напиши свою и отошли авторам тестов.
и следовательно нерепрезентативные.Какой тест считать репрезентативным? Dhrystone? Whetstone? SPECint? SPECfloat?
Кстати перемножение матриц - это очень хороший критерий качества оптимизатора(векторизация цикла, развертывание цикла, итд).Нет. Существуют задачи, которые эффективнее решать на алгоритмических языках. Существуют задачи, которые эффективнее решать на функциональных. Перемножение матриц относится к первой категории.
2) SPECint, SPECfloat - весьма уважаемые тесты. ИМХО на них и нужно ориентироваться
3) Какие же задачи относятся ко второй категории?
Соответственно на ФЯ пишутся эффективнее сложные задачки - которые требует большое число мелких оптимизаций.
например, ленивые вычисления.
SPECint, SPECfloat - весьма уважаемые тесты.Возможно, они и уважаемые, но их исходники недоступны. Или я что-то путаю?
Оставить комментарий
psihodog