Assembler. С чего начать?

farwayer
akorop
Ну на сколько так можно ускорить вычисления? На 20%? Да гори они огнём. Если это офисная задача - подождут: пользователь, который готов секунду (минуту, час, день) ждать, подождёт и 1.2 секунды (минуты, часа, дня). А если это задача реального времени, надо просто мощнее процессор взять и не закладывать бомбу под будущее сопровождение.

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

vasek
Или более приближенная ситуация. Для какого-нибудь устройства выбрали микроконтроллер, спроектировали плату и отправили в производство. А потом выяснилось, что в некоторых ситуациях его мощности немного не хватает. И тут возникает вопрос: отправить партию в брак, взять другой микроконтроллер, который, возможно, потребует перепроектировки платы, или попробовать оптимизировать несколько функций на ассемблере?
Абсолютно фантастическая ситуация. Во-первых, выбран очень уж специальный момент: партию уже изготовили, но ещё не продали. Потому что если раньше, то таки надо перепроектировать, а если позже, то уже поздно менять программу (а предложить пользователям самим перешить контроллер - это антиреклама). Во-вторых, в серьёзном производстве замена программы подразумевает такую кучу затрат, что на этом фоне цена выпущенной партии может и не быть заметной. В общем, если уж посчастливилось заметить такую плюху до того, как пользователи взвыли, то надо или или тихо выкинуть эту партию нафиг, или как-то иначе промаркировать и продавать как "младшую модель". А в основной серии поставить адекватный контроллер.
vasek
Конечно, прогресс на месте не стоит — появляются другие процессоры, другие более приспособленные языки, но в их основе лежит тот же простой ассемблер
Нет, не лежит. Вернее, может и лежать (в смысле, C транслирует не прямо в объектный файл, а в ассемблер), но это недостаток компилятора, и программисту об этом знать совершенно не нужно.
vasek
Не все так просто. Взять хотя бы интерпретируемые языки. Или языки с трансляцией в байт-код. Да, интерпретаторы или виртуальные машины таких языков работают "нативно". Но вот сами программы связаны с процессорными командами уже косвенно. Появляется дополнительный уровень абстракции.
Если уж на то пошло, то программа для современного x86 процессора - это фактически байт-код, только интерпретируется он не программно, а аппаратно. И ручная оптимизация, по-хорошему, должна учитывать тонкие свойства именно этого интерпретатора (прежде всего, что с чем он может параллелить). А свойства эти, к тому же, постоянно меняются от модели к модели. Поэтому если нужна оптимизация под что-то очень конкретное, то надо не дурью маяться с ассесблером, а указать целевой процессор оптимизирующему компилятору.
Вообще, вычислительная эффективность ассемблерных программ - это сказочка для маленьких детей и больших начальников. В реальности даже хорошему программисту при программировании на ассемблере приходится столько времени тратить на мелочи, что серьёзной оптимизацией заниматься уже некогда. А уж программистам пожиже и вовсе не до оптмизации, им бы добиться, чтобы программа не падала.
Повторюсь. Единственное осмысленное использование ассемблера - это крохотные вставки в программе на ЯВУ. И цель этих вставок - не повышение вычислительной эффективности самой вставки, а реализация чего-то такого, что в языке выразить нечем. Следствием может стать и вычислительная эффектиыность, но не за счёт этих команд, а за счёт появившейся возможности упростить программу в целом или использовать более эффективный алгоритм.

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

В общем, ассемлер - зло. Иногда это наименьшее из зол, но очень-очень редко.
akorop - приписал мне высказывания, которые я не делал, нужно быть внимательнее.
Ошибки не исчезают с опытом - они просто умнеют
akorop
(пара страниц текста)
...
ассемлер - зло
Ну надо было так сразу и писать, зачем тянуть кота за хвост? :))

P.S.
Заглянем в код хороших оптимизированных кодеков.
x264 :
$ grep -irl asm 
extras/gas-preprocessor.pl
common/cpu.c
common/sparc/pixel.asm
common/x86/dct-64.asm
common/x86/predict-c.c
common/x86/mc-a.asm
common/x86/pixel-32.asm
common/x86/bitstream-a.asm
common/x86/sad-a.asm
common/x86/pixel-a.asm
common/x86/sad16-a.asm
common/x86/x86util.asm
common/x86/util.h
common/x86/quant-a.asm
common/x86/predict-a.asm
common/x86/deblock-a.asm
common/x86/const-a.asm
common/x86/x86inc.asm
common/x86/cpu-a.asm
common/x86/dct-32.asm
common/x86/trellis-64.asm
common/x86/cabac-a.asm
common/x86/mc-a2.asm
common/x86/dct-a.asm
common/osdep.h
common/cabac.c
common/cabac.h
common/set.c
common/cpu.h
common/arm/deblock-a.S
common/arm/cpu-a.S
common/arm/predict-a.S
common/arm/dct-a.S
common/arm/pixel-a.S
common/arm/mc-a.S
common/arm/asm.S
common/arm/quant-a.S
common/dct.c
common/mc.c
common/pixel.c
common/common.c
x264.c
AUTHORS
tools/checkasm.c
tools/checkasm-a.asm
doc/standards.txt
encoder/encoder.c
encoder/me.c
.gitignore
Makefile
configure

LAME mp3:
$ grep -irl asm 
libmp3lame/fft.c
libmp3lame/quantize_pvt.c
libmp3lame/lame.c
libmp3lame/i386/fftsse.nas
libmp3lame/i386/nasm.h
libmp3lame/i386/ffttbl.nas
libmp3lame/i386/fftfpu.nas
libmp3lame/i386/fft3dn.nas
libmp3lame/i386/fft.nas
libmp3lame/i386/cpu_feat.nas
libmp3lame/i386/Makefile.am
libmp3lame/i386/choose_table.nas
libmp3lame/i386/Makefile.in
libmp3lame/i386/scalar.nas
libmp3lame/util.c
libmp3lame/vector/xmm_quantize_sub.c
libmp3lame/vector/Makefile.in
libmp3lame/vbrquantize.c
libmp3lame/Makefile.am
libmp3lame/quantize.c
libmp3lame/set_get.c
libmp3lame/takehiro.c
libmp3lame/Makefile.in
libmp3lame/quantize_pvt.h
libmp3lame/lame_global_flags.h
configMS.h
doc/html/history.html
doc/html/detailed.html
doc/html/links.html
doc/html/Makefile.in
doc/man/lame.1
doc/man/Makefile.in
doc/Makefile.in
configure.in
frontend/parse.c
frontend/Makefile.in
misc/scalartest.c
misc/Makefile.in
ltmain.sh
include/libmp3lame.sym
include/Makefile.in
include/lame.h
include/lame.def
Dll/Makefile.in
lame.spec
dshow/Makefile.in
INSTALL
vc_solution/vc9_lame_lame.vcproj
vc_solution/vc9_nasm.rules
vc_solution/vc9_lame_clients.sln
vc_solution/vc9_lame_mp3x.vcproj
vc_solution/vc9_lame.sln
vc_solution/vc9_mpglib.vcproj
vc_solution/vc9_libmp3lame.vcproj
vc_solution/arch_nasm.vsprops
vc_solution/vc9_libmp3lame_dll.vcproj
vc_solution/Makefile.in
vc_solution/vc9_lame_mp3rtp.vcproj
ChangeLog
lame.spec.in
DEFINES
debian/changelog
debian/rules
debian/control
debian/Makefile.in
mpglib/Makefile.in
ACM/ddk/Makefile.in
ACM/tinyxml/Makefile.in
ACM/ADbg/Makefile.in
ACM/Makefile.in
Makefile.in
mac/LAME.mcp
mac/Makefile.in
Makefile.unix
config.h.in
macosx/LAME.xcodeproj/Makefile.in
macosx/English.lproj/Makefile.in
macosx/Makefile.in
configure
Makefile.MSVC
Если кто не понял, файлики типа *.asm *.nas *.S – чисто ассемблерные.

Можете также поискать аналогичные файлы в исходниках ядра Linux, особенно в новейших оптимизациях под ARM.

Надо же – на дворе уже давно оптимизирующие компиляторы, а они зачем-то упорно кодят на ассмеблере. Может пойдёте их просвещать? :)
akorop
В общем, ассемлер - зло.
Зря вы так. Писать на нем, может и не нужно. Но знать нелишне.
Natrio
Заглянем в код хороших оптимизированных кодеков.
LAME mp3:
....
Если кто не понял, файлики типа *.asm *.nas *.S – чисто ассемблерные.
Так таки заглянем.
Обнаружил в PKGBUILD ключик --enable-nasm. Убрал и пересобрал. При этом действительно ни один ассемблерный файл не компилировался. Затем я взял от фонаря файл mp3, распаковал в WAV и обратно упаковал в MP3 дважды: при помощи lame из репозитария и при помощи свежесобранной lame без ассемлера. Время в секундах - одинаковое - 21 секунда.
Спасибо за убедительный пример.
Natrio
Надо же – на дворе уже давно оптимизирующие компиляторы, а они зачем-то упорно кодят на ассмеблере. Может пойдёте их просвещать? :)
Не пойду. На ассемблере кодят, чтобы ощутить свою крутость, тут просвещение бессильно.
akorop
На ассемблере кодят, чтобы ощутить свою крутость
Ух ты... А я по простоте своей думал, что все это ради достижения максимально быстродействия, полного доступа к оборудованию и абсолютной компактности кода. Эвоно как... Оказывается я десять лет показывал кому-то (только не понятно кому) свою крутость.
Aivar
akorop
На ассемблере кодят, чтобы ощутить свою крутость
Ух ты... А я по простоте своей думал, что все это ради достижения максимально быстродействия, полного доступа к оборудованию и абсолютной компактности кода.
Что-то всё в одной куче... Компактность и быстродействие - это изрядно противоречащие друг другу требования, а доступ к оборудованию от языка как вообще зависит?
Aivar
Эвоно как... Оказывается я десять лет показывал кому-то (только не понятно кому) свою крутость.
Если не секрет, для каких процессоров, какие задачи и когда пришлось так решать? Если, скажем, для какого-то из первых или убогих микропроцессоров, то куда ж деваться было... Скажем, я тоже для AVR AT90S1200 на ассемблере кодил, бо ничего другого нет.
Да, бывают ситуации, когда ассемблерное программирование оправдано, а то и единственно возможно. Но среди фактически написанных на ассемблере программ это составляет очень малый процент. И этот процент неуклонно снижается. Так что наугад взятая ассемблерная программа почти наверняка окажется абсурдом, пример мы только что видели в lame.
Кто-то покажет пример пользы от ассемблера? Только серьёзный пример, с цифрами или с анализом задачи.
akorop
Компактность и быстродействие - это изрядно противоречащие друг другу требования,
я под столом )))
это ж кто тебе такое сказал?
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Кому то не нужен компьютер. Кому то не нужен ассемблер. Кто то в восторге от рюшечек в дельфи — но, главное, этим не нужен АССЕМБЛЕР.
Но кто то упорно осваивает системное программирование, пишет кодогенераторы к транслятору, разрабатывает новые процессоры с нечеткой логикой (грубо говоря, не все есть четко 0 и 1, true и false - имеются и другие значения), обдумывает разработку процессоров совершенно нового типа, объектно-ориентированных процессоров и т.д. и т.п.
ЭТИМ СПЕЦАМ, ну ни как не обойтись без низкоуровневого языка программирования (пока это ассемблер, в дальнейшем, возможно, он сменит свое название, но низкоуровневый язык программирования будет всегда).
Точные примеры приводить не буду и не собираюсь — поищи сам.
Ошибки не исчезают с опытом - они просто умнеют
Кто-то покажет пример пользы от ассемблера?
Посмотрите и сравните вызовы функций на паскале и на си, посчитайте
 
Зарегистрироваться или войдите чтобы оставить сообщение.