Иногда забавно все это читать.
Кроме этого, здесь, в этом тексте есть голос мудрости.
Yoda писал(а):
Как ассемблерщик с очень большим стажем работы на ассемблерах i8080, Z80, PDP-11, VAX-11, x86, i8048/51, PIC, никак не могу согласиться с утверждением, что на ассемблере программировать не сложней, чем на ЯВУ.
1. Нет проверки типов, - больше вероятность тонких ошибок.
2. Нет проверки адресов, в т.ч. содержимого стека, - больше вероятность тонких ошибок.
3. Нет контроля зависимости данных со стороны компилятора, - больше вероятность тонких ошибок.
3. Нет гибких языковых конструкций (операторов), - низкая продуктивность.
4. Имеются явные ограничения по аппаратным ресурсам (количество регистров и способы их использования), приходится держать в голове потоки данных, - низкая продуктивность.
5. Нет наглядности и структурности, - низкая продуктивность.
6. Нет объектной ориентированности, - низкая продуктивность.
Конечно хорошая система команд (например, VAX-11) существенно облегчает работу, но даже в этом случае до ЯВУ далеко.
SII, ты с PICами работал? Вот где наматеришься, - работа на x86 блаженством покажется
.
Но все равно, забавно. Я не слышу здесь о VLIW архитектуре, которая тоже является целой областью и целый рынок. Имеет и свое весомое применении в жизни.
Вот ее и нужно брать как самый эпичный пример. А верно говоря, ассемблер под подобную архитектуру. Например, TMS320C от Texas Instrument.
i386 по сравнению с этим ассемблером - так себе, упражнения для детей.
Процессор и подобные ему имеют 32 40-битных регистров общего назначения, 32 32-битных аккумуляторных регистров, 16 256-битных векторных регистров, около 16 32-битных контролирующих регистров, 2 блока сложения/умножения, 2 блока логических операций, 4 предикатных регистров и всякие регистры памяти, стека, задач, регистры маски.
500 команд с >4 вариаций, для каждой команды есть еще столько же вариаций свитчей.
листинг
Код:
xor{4op} a0, g0, a26 ?Pr0
|| nop
|| nop
это значит что команды могут выполняются за один такт, а знак "||" означит параллельность - то есть за один цикл конвеера.
В таком случае возникает понятие - microthreading. Микропоточность на уровне конвеера.
Первая команда может значить, что мы выполняем операцию XOR с регистрами a0 и g0, помещаем результат в регистр a26. Rоманды выполниться при условии что в предикатном регистре ?Pr0 лежит булевское значение true.
4op это свитч который говорит, что команда должна выполняться на серией последовательности регистров, а именно
Код:
if(Pr0)
{
a0 ^ g0 -> a26
a1 ^ g1 -> a27
a2 ^ g2 -> a28
a3 ^ g3 -> a29
}
И ЭТО НЕ ВЕКТОРНАЯ ОПЕРАЦИЯ. Это как бы еще не SIMD. При этом еще выполняются операции nop.Вместо них может быть любые совместимые операции. Благодаря тому, что есть, к примеру, 2 арифметических блока, можно одним махом умножать или сумировать в 2-х командах. Есть также операции умножения-сложения mac. Команды типа cmp, jne, jnz, test не нужны, так как "условие" можно поставить под любую операцию. Например, для аналогичных есть команда br(jmp).
Есть команды перемножения матриц для четных номеров регистров - так назвать, "сеточка".
Теперь сложность в том, что программист должен учитывать все особенности архитектуры, следить за работой конвейера команд(а он работает в ручном режиме), следить как минимум, за 64 регистрами(читай переменными) и держать их все в голове, следить за микропоточностью(это когда в одном потоке команд выполняетя 2 разных алгоритма по цене одного), следить за свитчами.
Компиляторов немного. В основном для С и их мало, и они почти не используются, так как неэффективны. Поэтому все пишется ручками.А программы, типа: разжатие и обработка формата MPEG. Это непросто вставочки как в шейдерах первой версии для графического процессора, например, ATI 2001 года, а целое полотнище кода.
И это пример дешевенького, простенького процессора. Не лучший из своего типа. Это как 80386 на фоне Core i7.
А теперь представьте четырехядерного монстра, с 4-х блочным конвеером, на тактовой частоте 2,4 Гц., с набором команд >500, и целым зоопарков регистров самых немыслимых назначений. И это весьма полноценный процессор, несмотря на специфичность их приминения. На нем есть порты ввода/вывода, аппаратное переключение контекста, страничная организация памяти.
Так много в него влазит за счет, того, что ненужно засовывать кучу лишних блоков, которые выполняют автоматически рутинные задачи.
Единственный недостаток таких процессор - сложность разработок.
Даже энергопотребление у них мизерное, потому их и используют в каждом мобильном телефоне, планшете, плеере, портативной DVD видеостанции.
Имеет мощь не хуже Core i3, но пожирает в 20 раз меньше ресурсов. Даже изготовление их, очень мало затратно и просто, за счет чего и цена ниже.
Теперь подытоживая вышесказанное, программировать на ASM - это не каприз, не замашки на производительность, а жизненная необходимость.
P.S. Почему забавно?! Потому, что вы берете в пример процессоры, которые делают для ленивых детей. Которые не могут "освоит школьный материал". Это для всяких там "жадных" процов, даже дворник может написать, не то что на АСМ, а сам АСМ и компилятор для этого АСМ, на этом же языке, еще и в придачу компилятор для C - от "нечего делать".