OSDev

для всех
Текущее время: 04 май 2024, 21:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 73 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 12:55 

Зарегистрирован: 04 май 2011, 18:13
Сообщения: 121
Иногда забавно все это читать.
Кроме этого, здесь, в этом тексте есть голос мудрости.
Yoda писал(а):
Как ассемблерщик с очень большим стажем работы на ассемблерах i8080, Z80, PDP-11, VAX-11, x86, i8048/51, PIC, никак не могу согласиться с утверждением, что на ассемблере программировать не сложней, чем на ЯВУ.
1. Нет проверки типов, - больше вероятность тонких ошибок.
2. Нет проверки адресов, в т.ч. содержимого стека, - больше вероятность тонких ошибок.
3. Нет контроля зависимости данных со стороны компилятора, - больше вероятность тонких ошибок.
3. Нет гибких языковых конструкций (операторов), - низкая продуктивность.
4. Имеются явные ограничения по аппаратным ресурсам (количество регистров и способы их использования), приходится держать в голове потоки данных, - низкая продуктивность.
5. Нет наглядности и структурности, - низкая продуктивность.
6. Нет объектной ориентированности, - низкая продуктивность.
Конечно хорошая система команд (например, VAX-11) существенно облегчает работу, но даже в этом случае до ЯВУ далеко.

SII, ты с PICами работал? Вот где наматеришься, - работа на x86 блаженством покажется :D.


Но все равно, забавно. Я не слышу здесь о 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 - от "нечего делать".


Последний раз редактировалось JSON 29 май 2012, 13:48, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 13:06 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Да, компиляция под такое -- та ещё задача. Полагаю, это одна из причин, почему мэйнфреймы CDC в конечном итоге сошли со сцены: архитектура процессоров, подобных описанных Вами, в первом приближении соответствует архитектуре именно тех древних машин. Естественно, компиляторы там были (Фортран, во всяком случае, точно), но не думаю, что отличались высоким качеством кода. Вот под более традиционные машины и тогда компилировали хорошо (и уж точно лучше, чем GCC, если говорить об уровне процедур -- всяких LTO и прочих глобальных оптимизаций тогда не было в принципе из-за малых объёмов памяти).

Но программирование под подобный процессор в определённом смысле сродни упомянутой Yoda задачей с базой данных: оба случая очень и очень специфичны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 14:00 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Мой стаж в ассемблере не велик по сравнению с другими. Но я видил что безобразного кода на ассмблере пруд пруди, а правильно оформленный я не видел ещё никогда.
Языки разные. На любом можно писать хорошо и плохо.

Но когда вы поймете как на ассемблере писать правильно, то он у вас привратся в ЯВУ. Так почему бы не начать с него.
Си похой язык. За примерами далико ходить небуду один умник написал FFT но комплексные числа передал как указать на массив действительных. С тех пор 99% кто пробует использовать этот код делают ошибку.
Если код оформлен правильно, то скорость вхождения нвого человека в ваш проект возврастатает.

Меня вот другое смущает почему приложения рассчитанные на непрерывную работу пишут на Си. Когда как рациональнее писать на бесике на крайней случай на java.

Лично я в свое время решил доказать что делфи всемогучь поэтому и начал писать на нём. Хотя в последствие первичный загрузчик TASM вточиный Borland Pascal и ядро на Delphi

SII, а чем вам Unix так ненравится?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 15:04 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
pavia писал(а):
SII, а чем вам Unix так ненравится?


Всем :) Начиная с fork и навязывания синхронного ввода-вывода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 15:40 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Цитата:
phantom-84 » Вчера, 22:04
Регистры на асме можно использовать также, как в оптимизирующих компиляторах, т.е. как переменные не очень большого радиуса действия, ну и естественно сохранять их значения от разрушения (нек. ассемблеры даже поддерживают переименование регистров для этого).


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

Цитата:
phantom-84 » Сегодня, 09:24

Многие понимают несовершенство Си, но боятся в этом признаться. Но опять-таки что лучше подходит для написания ядра: Си или Паскаль/Ада? Думаю, будет лучше, если каждый сам для себя ответит на этот вопрос, без отстаивания своего мнения как единственно правильного.


Мне в Си больше всего не хватает конструкций наподобии:
import javax.servlet.http.HttpServlet;

и вместо имени javax.servlet.http.HttpServlet servlet можно было бы писать коротко HttpServlet. Отсутствие возможности разбиения имен функций по каким-нибудь категориям хотя бы.

namespace-ы из C++ гораздо менее удобные. Или вообще как в хml:

Код:
<t:tag xmlns:t="http://www.foobar.com">
 <t:file>name</t:file>
</t:tag>


В данном случае описан namespace c именем "http://www.foobar.com" и алиасом t. В другом случае может быть xmlns:x="http://www.foobar.com", при этом namespace будет тем же, хотя и алиас другим. Но это слегка из другой оперы. Просто иллюстрация концепции.

Вот насчет контроля над регистрами в ассемблере интересно.

Цитата:
SII » 29 минут назад

pavia писал(а):
SII, а чем вам Unix так ненравится?


Всем Начиная с fork и навязывания синхронного ввода-вывода.


С fork() понятно о чём речь. Хотя не совсем. fork() - представляет из себя основу межпроцессного взаимодействия под UNIX-ом. Конвейеры между процессами организуются на базе наследованных дочерним процессом файловых дескрипторов.

Начет "навязывания синхронного ввода-вывода". Хотелось бы расшифровать подробнее, если возможно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 15:57 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
achesnokov писал(а):
С fork() понятно о чём речь. Хотя не совсем. fork() - представляет из себя основу межпроцессного взаимодействия под UNIX-ом. Конвейеры между процессами организуются на базе наследованных дочерним процессом файловых дескрипторов.


fork -- средство запуска нового процесса (задачи), причём, насколько знаю, единственное (в классическом Унихе). Вместо того, чтобы просто сделать хорошее явное управление памятью (которым будут пользоваться те задачи, которым оно нужно), обычный запуск нового процесса (с необязательной возможностью передать ему все или часть дескрипторов -- это далеко не всегда нужно) и обычную же многопоточность, родили этот изврат.

Цитата:
Начет "навязывания синхронного ввода-вывода". Хотелось бы расшифровать подробнее, если возможно.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 16:35 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Цитата:
fork -- средство запуска нового процесса (задачи), причём, насколько знаю, единственное (в классическом Унихе). Вместо того, чтобы просто сделать хорошее явное управление памятью (которым будут пользоваться те задачи, которым оно нужно), обычный запуск нового процесса (с необязательной возможностью передать ему все или часть дескрипторов -- это далеко не всегда нужно) и обычную же многопоточность, родили этот изврат.


В классическом единственное. Дескрипторы наследуются все. Дочерний процесс ненужные дескрипторы закрывает. Так как это происходит в коде одной по-сути программы, то выглядит это достаточно удобно.

if (fork() > 0) {
// parent code
} else {
// child code
}

После закрытия лишних дескрипторов в child ветке для запуска другой программы используется exec(). У дочернего процесса копируется сегменты данных и стека. Вот это не сильно красиво - ведёт к разрастанию размеров дочерних процессов. Я на эту тему писал как-то статейку: http://dev64.wordpress.com/2011/12/17/%D1%8D%D0%BA%D1%81%D0%BF%D0%B5%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D1%82-%D1%81-fork-2/. Однако в более поздних реализациях систем есть tfork() или что-то наподобии, что не копирует дескрипторов...

Насчет синхронного ввода вывода. В UNIX универсальной функцией для реализации асинхронного ввода-вывода является select(), в более поздних версиях poll(). select() позволяет организовать такой функционал. В классическом юниксе работает select на любом типе файловых дескрипторов. А дескриптором является любой файл, сокет или устройство.

В частности с помощью select() на классическом UNIX, не имеющем тредов, можно реализовать треды пользовательского уровня. select() работает в том числе и в WinSock библиотеке под Windows, что позволяет писать переносимые программы с использованием сокетов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 16:51 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Не путайте неблокирующий ввод-вывод и асинхронный. Неблокирующий позволяет не ожидать готовности к выполнению операции (например, read из сокета не будет ждать появления данных в буфере ОС), а асинхронный - ее завершения. Например, нельзя использовать select на файле на диске - файл всегда готов к чтению. Но если вы отправите запрос на, например, чтение 4 гигабайт данных с диска, то поток будет остановлен до завершения чтения, которое займет достаточно много времени. Асинхронный же read вернет выполнение немедленно, а когда операция будет завершена - уведомит задачу каким-либо способом.

В POSIX есть асинхронный ввод-вывод - расширение AIO - но нормальных реализаций я еще не встречал. Ядерная реализация в линуксе не поддерживает кеширование, что убивает производительность, а реализация в glibc использует пул потоков, что жрет кучу ресурсов зря.

Fork же плох тем, что в обычном сценарии - fork с последующим exec - ядро делает много лишней работы, сначала копируя таблицы страниц и дескрипторов, а затем уничтожает их и заменяет на таблицы нового процесса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM vs ЯВУ
СообщениеДобавлено: 29 май 2012, 17:09 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Цитата:
Не путайте неблокирующий ввод-вывод и асинхронный.


Собственно неблокирующего ввода обычно достаточно. 4 гигабайта с диска просто так читать не будешь, все равно скорее всего куда-то все будет писаться. Появится та или иная буферизация.

Цитата:
Fork же плох тем, что в обычном сценарии - fork с последующим exec - ядро делает много лишней работы, сначала копируя таблицы страниц и дескрипторов, а затем уничтожает их и заменяет на таблицы нового процесса.


С другой стороны API такой оказался простым и понятным для прикладных программистов.

Для асинхронного ввода-вывода нужны потоки. В классическом юниксе их и не было. Практика разработки показала, что системы, реализованные на базе классической однотредовой реализации, в разы надежнее, чем аналогичные более поздние реализации. Так например случилось с QNX4 и QNX6. QNX конечно своеобразная операционная система. QNX6 от QNX4 отличается прежде всего многотредовостью от природы. В QNX4 все было однотредовым. Системы на базе QNX4 намного надежнее, чем на базе QNX6.

Другой надежной однотредовой системой был SCO UNIX. В нем тоже не было никаких тредов. SCO UNIX в то время как у FreeBSD был аптайм пол месяца, не перегружался годами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ответы на вопросы
СообщениеДобавлено: 30 май 2012, 17:33 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
SII писал(а):
Это, кстати, ещё одна причина, почему я не использую Си и иже с ним: читабельность очень плохая, если сравнивать с Паскалем/Адой.

Мы ведь здесь сравниваем не Аду с С, а ассемблер с ЯВУ.
По поводу читаемости. Можно написать хороший или плохой код на ЯВУ и хороший или плохой код на ассемблере. Но в любом случае читаемость хорошего кода на ЯВУ лучше, чем хорошего кода на ассемблере.

SII писал(а):
Yoda писал(а):
Я вот посмотрел сейчас, коммерческая база данных по учёту всего, которую я написал для своего предприятия...

Ну дык это типично прикладная программа, а не ядро ОС.

Не вижу принципиальной разницы. Разница между прикладным и системным ПО в первую очередь в целях использования, а не в способах кодирования.

SII писал(а):
Просто я не согласен вообще с использованием Си хоть для каких-нибудь задач: я не вижу для него и Си++ ну никакой вообще ниши, где применение этих языков можно было бы считать оправданным. Вот преступлением -- таких ниш полно :)

Ты, как всегда, слишком категоричен, причём абсолютно несправедлив в отношении этих двух замечательных языков :).

SII писал(а):
Пы.Сы. На Си наезжаю не ради холивара

Ну конечно, так все и поверили :D.

SII писал(а):
а для пояснения собственных критериев выбора языка: либо очень высокая надёжность и читабельность (Ада или, на худой конец, Паскаль), либо уже ассемблер.

А о таком понятии, как "золотая середина", слышал? :D

phantom-84 писал(а):
Многие понимают несовершенство Си, но боятся в этом признаться.

Почему же боятся? Я не боюсь и честно говорю, С/С++ устарели и требуют несовместимого обновления. У меня есть чёткое видение нового языка, поэтому одним из пунктов своей программы я вижу создание компилятора с нового ЯВУ.

SII писал(а):
А вообще, единственный минус, и то относительный и прямо проистекающий из плюсов, той же Ады -- необходимость довольно частого использования явного приведения типов.

Это далеко не единственный минус и, может быть даже не самый главный. Самые противный минус Паскаля, Модулы и Ады (я перечислил те языки общего класса, на которых имел несчастье выполнять проекты) - это слишкам-много-букав и, как следствие, ужасная читаемость. Та мысль, которую можно выразить в двух очевидных строках, в них необходимо расписывать на целый абзац мутного текста, содержащего кучу лишних слов. Чего только стоят эти begin/end!
Вот видишь, SII, холивар разгорается. Ты всё-таки этого добился ;).

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 73 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 8  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB