it-юмор :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

it-юмор geek 
it-юмор,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор
Подробнее

it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор
Еще на тему
Развернуть
Вам смешно, а у меня gcc говно генерит на ассемблерных вставках
Просто ты забыл ему сказать, какие регистры ты портишь.
phlush phlush 21.03.201901:37 ответить ссылка 1.1
Чего все асма так боятся - не понимаю. Небольшое количество примитивных команд, простая и понятная логика, примитивный синтаксис. Немного ебанины было со всякой интеловской сегментацией памяти, но в целом тоже все несложно.

Меня гораздо больше пугают новомодные фреймворки с охулиардом инклюдов, у всех свои глюки и ебанистический стоэтажный DOM.
cityrat cityrat 20.03.201923:01 ответить ссылка 9.3
Неистово плюсую!
bear4862 bear4862 20.03.201923:19 ответить ссылка -1.5
Это не так работает. Мемы порой, никак не связаны с реальностью, но все прикидываются, словно в них верят, чтобы можно было иронически как-то это обыграть. Ассемблер - простейший язык, но в мемах он самый сложный. У ActionScript репутация тормозного, глючного и недоделанного языка, хотя HTML5 до сих пор глючнее, тормознее и недоделаннее. В Питере за год всего на 4 (четыре) солнечных дня меньше, чем в Мск, но принято его считать городом-где-всегда-дождь. И т.д. и т.п.
Hellsy Hellsy 20.03.201923:24 ответить ссылка 7.0
А ну пиздуй отсюда со своей логикой.
isami510 isami510 21.03.201900:36 ответить ссылка -5.7
Ну как знать, простой. А теперь напиши Hello World на асме без либ :)
Это не так сложно, самое сложное это оформить системный вызов вывода на stdout, команд десять
Не-не-не, с системными вызовами любой дурак может, это почти как на C писать. А вот без.
А ты напиши что-нибудь на C, без std* ;-)
Hellsy Hellsy 21.03.201913:40 ответить ссылка 0.0
Ну в асме не всегда есть std*. А если он есть, то и смысл писать на асме теряется.
Мне нравилась возможность использовать ассемблерные вставки. Она давала мощь ассемблера там, где это реально нужно и при этом избавляла от необходимости писать на ассемблере все.

Многие языки высокого уровня до сих пор поддерживают эту красивую традицию.
Hellsy Hellsy 21.03.201914:27 ответить ссылка 0.0
Основной минус ассемблерных вставок в их непортабельности. А так кто же спорит.
В реальном режиме на голом железе можно дернуть биос, int 10H (если про x86 говорим). Если же речь про ОС, то ничего, кроме как дергать системный вызов, не остается, это единственный механизм взаимодействия с миром.
Объявляешь массив символов через db, копируешь его в видеопамять по адресу 0B800h + нужное смещение. В текстовом режиме VGA, разумеется.
Hellsy Hellsy 21.03.201913:38 ответить ссылка -0.1
Ну вот не чувствуешь подвоха? Синтаксис-то простой и действия примитивные, а зато сколько специальных знаний надо.
Гхм, а ты попробуй без "специальных знаний" написать hello world на С. Получишь полсотни ошибок и тысячу предупреждений :-)
Hellsy Hellsy 21.03.201914:23 ответить ссылка 0.0
Все же специальных знаний там будет поменьше. Можно не знать про архитектуру машины (фон Неймон или Гарвард), можно не знать про регистры и их назначение (аккумулятор, счетчик и т.п.), можно не запариваться по видам адресации. Ну и т.д.
Зато придется узнать про потоки, пайпы, коммуникацию между процессами, библиотеки. Да один синтаксис printf-а потянет на большую статью с десятками примеров. Если же дело дойдет до С++, то еще и в ООП нырнуть можно.

Но IRL все это не надо на начальном этапе и сводится к "посмотри как сделано и повтори заклинание". И в этом плане ассемблер проще, а не сложнее.
Hellsy Hellsy 21.03.201915:58 ответить ссылка 0.1
Пайпы, потоки и printf это просто магия, которую на самом деле не прям обязательно понимать как оно внутри работает. А вот с асмом у тебя выбора нет, все примитивы надо делать с нуля, либо использовать библиотеки, но опять же а зачем тогда асм если ты его используешь для вызова сюшных библиотек?

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

Что касается вопроса "зачем", то все определяется задачей. Если ты работаешь со слабеньким MCU и забивать его пару килобайт оперативки на 80% всякой сранью от С тебе кажется неприемлемым - ассемблер отлично подходит. Написание шейдеров хоть сейчас и представлено множеством вариантов, но по сути вынуждает работать с "ассемблером для видеокарт". Для реверс-инжиниринга ассемблер зачастую - единственный вариант. И т.д.

Разумеется, я не буду писать вывод на экран на ассемблере. Но я и на С его писать не буду. И на С++. И даже на Яве не буду. Это не значит, что Ассемблер, С, С++ и Ява сложнее современных интерпретаторов, это значит, что оптимизация не стоит потраченного на нее времени.
Hellsy Hellsy 21.03.201916:18 ответить ссылка 0.0
Регистр не особо магия, это примитив, чуть ли не самый базовый. Причем довольно понятный, массив триггеров со стробированием по тактовому генератору. Со всякими АЛУ и прочими тоже все практически в схемотехнику раскладывается. Ассемблер максимально близок к железу и заставляет мыслить очень примитивными категориями, чтобы добраться до чего-то уровня "пайп" или "поток" придется очень много всего сделать.

Короче, тупая аналогия. Буквы это просто, их всего 33. Но писать на русском от этого не становится легко.
1. Базовых команд немного, логика простая, да. Но ведь проблема не в самом языке ассемблера, а в том, что программы на нем куда более громоздкие, с многочисленными переходами туда-сюда, локальные переменные вида rbp+8 (это больше справедливо для чтения сгенерированного кода, самому писать, особенно на masm, можно читаемо) вместо читаемого названия итп итд. Все это делает ассемблерный код более сложным для написания, чтения и модификации. И от этого никуда не деться. Ассемблерный листинг функции (даже на C) всегда длиннее.
2. А теперь я поспорю про небольшое количество примитивных команд. Если мы говорим об x86-64, то команд овер дохуя, за многими стоят километры мануалов, потому что это хитрые железо-специфичные вещи.
+1. Ассемблер действительно берет не своей сложностью, а многословностью.

Например, взять какой-нибудь LINQ запрос из .NET array.Select(x=>x+1).OrderBy(x=>x).Last() - страшно подумать во что этот запрос развернется в ассемблере(P.S запрос носит характер примера и в нем может отсутствовать логика)
Чем выше уровень абстракции, тем больше портянка. Ассемблер LINQ (ну, я в курсе, что там сначала IL, а потом JIT) будет на километры. Да даже чтобы реализовать это на C, придется реализовать небольшое подмножество .NET Framework, ведь там классы, итераторы, коллекции, динамическое выделение памяти (про сборщик мусора вообще молчу).

Но даже код на C, который ближе некуда к железу, разворачивается в портянки. Вот пример простейшей функции и ее ассемблер. Точнее, я привел objdump объектника, потому что листинг, выдаваемый gcc просто нечитаемый из-за обилия макросов, которые он туда навтыкал.
Да блять.
	casrr	_test.s		•	\			
1	0000000000000000 <					fib>:		
2	0	55					push	%rbp
3	1	48	89	e5			mov	%rsp,%rbp
4	4	53					push	%rbx
5	5	48	83	ec	18		sub	$0x18,%rsp
6	9	89	7d	ec			mov	%edi,-0xl4(%rbp)
7	с	83	7d	ec	00		cmpl	SÖX0,-0xl4(%rbp)
8	10	75	07				j ne	19 <fib+0xl9>
9	12	b8	00	00	00	00
P.S. На всякий случай уточню, что GCC использует AT&T синтаксис, поэтому
мож дело в настройках компилятора? порой отключение оптимизации выдает неплохие результаты.
b.o.g b.o.g 21.03.201901:17 ответить ссылка -0.3
Код выше получен с помощью:
gcc -O0 -c c_asm_test.c
objdump -S c_asm_test.o > c_asm_test.s

Листинг, выданный gcc тут. Он напихал всяких макросов, типа .loc.
gcc -g -O0 -Wa,-adhln c_asm_test.c > c_asm_test_2.s
Может дело в ключе -g и в обилии отладочной информации?
Релокации забыл показать. Без них все call'ы — в никуда.
phlush phlush 21.03.201901:42 ответить ссылка 0.0
Так-то да, однако, компиляторы достаточно умные и сгенерированный код достаточно шустро работает.
Писать код на чистом ассемблере- это извращение.

Другое дело- это оптимизировать небольшие участки с помощью вставок после того, как нашел проблемное место с помощью профилировщика.
Иногда еще вставки нужны не для того, чтобы оптимизировать производительность, а чтобы дергать хардвар.
Точно. Ассемблер прост до тех пор, пока не смотреть на векторные инструкции. Встретишь так какие-нибудь vp4dpwssds, vpcmpgtb и vcvtuqq2pd (вполне реальные мнемоники) — и сразу приуныть хочется. А потом открываешь мануал (осторожно, страница реально гигантская и сильно тормозит) — и понимаешь, что лучше учиться на сварщика.
Spring Spring 21.03.201900:56 ответить ссылка 1.5
О, интринсики.
Ну так и С прост, пока тебе не надо работать с многомерными динамическими ассоциативными массивами. И то, что на перле у тебя займет одну строку, на Си легко потянет на сотню невыносимо трудочитаемого кода. А языки высокого уровня просты, пока тебе не нужен реалтайм или прямой доступ к чему-либо, там сразу же оказывается, что они это все умеют делать только очень медленно и очень хуево.
Hellsy Hellsy 21.03.201913:46 ответить ссылка 0.5
Но в C для работы с многомерными динамическими ассоциативными массивами тебе не нужно будет учить эдак под тысячу новых языковых конструкций или функций. Да и насчёт сложности я бы поспорил — хорошо написанный C-код без «божественных функций» на пару тысяч строк кода и с вменяемыми наименованиями читается куда лучше большинства векторных мнемоник асма.
Spring Spring 21.03.201913:56 ответить ссылка 0.0
Ну, я начинал вообще с машинных кодов - тяжелое детство, медленная "Микроша" и толстая книжка с инструкциями. Через месяц чтение машинного кода не представляло никакой проблемы, но очень геморройно было помнить и исправлять все относительные переходы и вызовы, если вдруг возникала потребность что-то добавить. Поэтому я перешел на ассемблер и в целом не вижу особой сложности в чтении ассемблера, тем более, что количество типовых конструкций в нем относительно невелико, пусть они и занимают много строк, но довольно быстро начинаешь читать код как бы блоками.

И это... я не понимаю этой проблемы с наименованиями - ассемблеры, как правило, позволяют оставлять комментарии, давать мнемонические названия "переменным" и подпрограммам.
Hellsy Hellsy 21.03.201914:05 ответить ссылка 0.0
Ну, я и говорю, что ассемблер простой, пока в нём используются только типовые конструкции и наиболее распространённые инструкции. Но в настоящее время писать на ассемблере для ПК (какие-нибудь железяки, существующие в единственном экземпляре — другое дело), не используя векторных операций — абсолютно неэффективно. Поэтому практический смысл имеется только в ассемблере с SSE/AVX, а в них инструкций — сотни, и у каждой — совершенно невменяемые мнемоники. А ещё ведь скоро AVX-512 более-менее массовым станет, а в нём уже что-то около тысячи-двух инструкций (на глазок)…

А с наименованиями, на мой взгляд, две проблемы: во-первых, современный разработчик с ассемблером сталкивается в основном тогда, когда надо что-то дизассемблировать/отреверсить (в таком случае никаких комментариев, естественно, не будет), а во-вторых — размер подпрограмм: то, что на C умещается в пару десятков строк и чему можно дать краткое и ёмкое название, на ассемблере уже будет иметь длину в пару экранов, что достаточно осложняет грамотное разбиение кода на блоки.
Spring Spring 21.03.201914:28 ответить ссылка 0.0
Да, с этим я в основном согласен. Ну, кроме момента с неэффективностью. Можно использовать ассемблерные вставки в языках высокого уровня для нетипичных операций с массивами, например.
Hellsy Hellsy 21.03.201914:31 ответить ссылка 0.1
1. Ну так используй глобальные переменные и макросы. Делов-то.

2. Базовых команд, покрывающих 99% случаев - несколько десятков. Один список базовых функций в каком-нибудь C легко потянет на полтысячи.
Hellsy Hellsy 21.03.201913:42 ответить ссылка 0.0
1. Я могу использовать, но если надо не писать, а читать то, что сгенерировал компилятор, то ебись конем.
2. Почему Вы так упорно настаиваете именно на простоте синтаксиса и команд? Ясно-понятно, что синтаксис асма примитивный, большинство базовых инструкций предельно простые (0-1-2 операнда). Сам код сложнее. Чем более высокоуровненвый язык, тем код проще. Не надо пугать мифическими тысячами функций, если бы их использование было бы сложнее, чем писать на асме, они бы не появились. Я могу на питоне написать в одну (и не очень сложную) строку то, что на C займет сотни. А на асме еще больше.

Кроме того, даже если упарываться по асму, все равно есть сисколы, а без них - никуда.
Потому что именно предельная простота синтаксиса и команд определяет простоту использования. Ассемблер - это как кирпич. Все предельно просто и понятно, можно построить здание почти любой формы. Разумеется, панельное строительство быстрее, но панелей много разновидностей, не все из них совместимы, а если нужно что-то отличное от стандартов, то все будет очень плохо. А кирпич, повторюсь, интуитивно прост и предельно понятен. Никто же не говорит, что кирпич сам по себе - это очень сложно, потому что небоскреб из него строить придется черти-сколько.
Hellsy Hellsy 21.03.201923:25 ответить ссылка 0.5
Возможно, я не понимаю, что вы вкладываете в понятие "простоты использования". В моем понимании, это реализовать то, что мне надо, быстрее и с меньшими усилиями.
Написать на C выражение для вычисления в приближенной к математической нотации чего-то проще, чем делать это в несколько шагов, раскладывать по регистрам и держать в голове, чтобы не перезатереть то, что еще нужно.
Использовать библиотечную функцию для поиска подстроки проще и быстрее, чем писать самому (и вычислительно быстрее, там векторные инструкции часто).
Использовать RAII для управления ресурсами проще и надежнее, чем делать это вручную.
Использовать LINQ для какого-то запроса проще и читаемее, чем проитерировать коллекцию вручную.
Сборщик мусора проще, чем управление памятью вручную.
Слайсы в питоне проще и читаемее, чем нагромождение библиотечных функций.
И так далее.

В среднем, при повышении уровня абстракции, писать код становится проще, меньше думаешь о реализации блоков, больше о своем коде, да и в целом уже не так многабукоф. Конечно, есть задачи, которые проще сделать на C, чем на Python.

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

За лаконичностью языков высокого уровня часто стоят знания и высокий порог вхождения.
Вот я напишу на Перле:

print join("\n", map {"$_=$h{$_}"} sort {$h{$b} <=> $h{$a} || $a cmp $b} map {chomp; chomp; $h{$_}++; $_} <>);

Эта конструкция берет указанный в качестве входного параметра файл, читает его и выводит только уникальные строки с указанием количества их копий, отсортировав их по этому количеству в порядке убывания и по алфавиту при равном количестве. На ассемблере схожая программа будет огромной и громоздкой. На С тоже. И даже на Яве легко и просто ее сделать не получится. Но сможет ли новичок, познакомившийся с Перлом пару часов назад, прочитать код и понять, что именно он делает?
Hellsy Hellsy 22.03.201900:20 ответить ссылка 0.9
Про порог вхождения (точнее, кривую обучения) не спорю. Ну вот тут как раз - дольше учить, чтобы потом быстрее решать задачи.
А с этим уже я не буду спорить. Тем более, что люди ошибаются, а сложность отладки растет от размера экспоненциально, так что большие проекты писать на ассемблере точно не стоит.
Hellsy Hellsy 22.03.201900:47 ответить ссылка 0.0
Писал на ASM x86, потом как Win 95 появилась с Api и тп, забил )) Слишком коротка жизнь, что бы писать на ASM.
AlexVi AlexVi 21.03.201902:07 ответить ссылка 0.4
— Не лезь, блять.
— Она тебя сожрет!
L_S_ L_S_ 21.03.201900:23 ответить ссылка 0.3
скорее всего будет так, где ассемблер - зубастик
пожирающий неокрепшие мозги молодых, неискушенных и оч амбициозных программеров
b.o.g b.o.g 21.03.201901:14 ответить ссылка -0.5
То есть вы все хотите сказать что вот прям на серъезных щах говнокодите на ассемблере ?
Да таких монстров своего дела единицы в живых нынче осталось :)
Хотя чего еще можно ожидать от лжецов и девственников.
Истинный бог из машины говорит на машинном языке (только нолики и единички, чистый абсолют для избранных, никакого лишнего дерьма, загружающего бесценные ресурсы :) )
Все что вы тут понавыкладывали это машинно-ориентированное упрощение не что иное как порождения наших затуманенных сознаний которые мы ошибочно называем "упрощениями, понятными для человека"
Resetnik Resetnik 21.03.201901:45 ответить ссылка 0.1
Все пишут на ассемблере, не говори ерунды
Я не пишу на ассемблере. И не заставите.
"Да таких монстров своего дела единицы в живых нынче осталось :)"
а тогда те кто разрабатывают процессоры кто? это же уровень ниже даже машинных кодов и даже понятия 0 и 1 ибо там аналоговые и филосовские величины есть типа Z
Mirn Mirn 21.03.201914:51 ответить ссылка 0.0
> а тогда те кто разрабатывают процессоры кто?
Относительно популяции их реально единицы.
Современный сложный кремний составляют из блоков на языках описания аппаратуры вроде VHDL. А вот есть те, кто уже опускается на физический уровень, собственно, к тому, как реализуются всякие логические вентили из транзисторов, и как реализуются транзисторы.
000011100010110000011101000011100010111000011001000101000000111000101111
0010000000001110001011110001101100001110001011100010111000010100000011100
0101111001000000000111000101110000111100000111000101111000110010000111000
1011110001101100010100000011100010111000011011000011100010111000101110000
0111000101110001000000000111000101111001011000000111000101110001011000000
1110001011100010000100010100000011100010111100011011000011100010111100101
0110001010000001110001011110001101100001110001011100001100100001110001011
1000101010000011100010111000101110000011100010111000011110000101000000111
0001011100010110100001110001011100001111000001110001011110001101000001110
0010111000011110000011100010111100100001000011100010111100101100
Resetnik Resetnik 21.03.201907:34 ответить ссылка 0.1
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
One morning you wake up find out you have access to God’s developer console. What’s the first thing you do with this power?
Discussion
♦ 154 +	W 479	& Share
^ BEST COMMENTS ▼
I like forks • 5h
hehe3301 • 7h
sudo rm -rf oceans/*/contents/
*.plástic
sudo rm -rf people/*/*.cáncer sudo rm -rf v
подробнее»

it-юмор geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор без перевода it humor geek it юмор

One morning you wake up find out you have access to God’s developer console. What’s the first thing you do with this power? Discussion ♦ 154 + W 479 & Share ^ BEST COMMENTS ▼ I like forks • 5h hehe3301 • 7h sudo rm -rf oceans/*/contents/ *.plástic sudo rm -rf people/*/*.cáncer sudo rm -rf v
¿i
OR IS IT TESTING ME?
Й The WannaCry-like cryptor Ransomware Pandemic