Друзья, постоянно слышу, что программы на ассемблере работают быстрее программ на C, C++, Python, etc. С последним все понятно, интерпритатор сначала переводит код, в байт код, потом его компилирует, только затем выполняет. Но почему ассемблер, быстрее например программ на С. Понятно дело, что он может быть и медленнее, если руки кривые. Но возьмем сферического в вакууме программиста который точно знает что делает, пишет идеальные, быстрые программы. И вот ему нужно ускорить программу. Он решает написать некуд функцию вставкой на асме в программе на си. За счет чего увеличится скорость программы? Для примера будем считать, что она точно увеличится. Когда мы скомпилируем программу исполняемый файл будет уже представлять из себя машинный код, разве нет? Короче вопрос из заголовка, почему это так?
Язык С в свое время был разработан с оглядкой на машинный код семейства PDP-11 если мне память не изменяет и тогда действительно сферический в вакууме пограмист мог писать на нем "быстрые" программы.
Расскажи это Линусу Торвальдсу, который выкидывал код на асме и писал более быстрый на Си. Компилятор может делать оптимизации гораздо лучше, чем человек.
Любое преобразование языка высокого уровня в машинный код приводит к издержкам. Ассемблер работает быстрее, потому что программист не пишет ничего лишнего, а чтобы обеспечить универсальность применения языковых конструкций, все машинные коды, созданные трансляторами, избыточны.
Денис Загаевский, ничего что по факту си очень быстрый?
Он считается языком 'среднеуровневым', если так корректно говорить. Но любой универсальный инструмент будет работать всегда чуть хуже, чем специализированный, и поэтому машинные коды транслятора чуть хуже чем ассемблер-код эксперта для конкретной задачи.
Денис Загаевский, вы тратите свое время на меня так, как будто нам вместе проект писать и я продвигаю написание на ассемблере, а вы отстаиваете си. Вопрос был задан касательно ассемблерных вставок и причин, по которым эта практика применяется. Вы спорите, что ассемблерные вставки в некоторых ситуациях дают выигрыш в производительности?
Естественно, в реальном мире написание трансляторов сделало большой шаг вперед, а программирование на ассемблере скисло. Конечно, то, что пишет человек, в большинстве случаев медленное и уродливое, ибо кушать хочется сейчас а мечты о хорошем коде присущи не каждому.
Но вы говорите вещи, подобные "шаблонизатор лучше самописного" и "вордпресс лучше разработанного вручную" на полном серьёзе. Любая автоматизация создания кода (если её выполняет не искусcтвенный интеллект или экспертная система) будет хуже, чем то, что напишет эксперт, когда посидит и подумает. Это причина, по которой у нас всё ещё есть работа.
Потому что человек умеет думать и устранять ошибки, а оптимизатор просто "делает нашу жизнь лучше без привлечения специалиста".
Просто эксперт это долго, дорого и бессмысленно - выигрыш незначительный, а затраты колоссальны.
Или вы говорите о Линусе, который выкидывал ассемблер - господи, ну и что? он выкидывал плохой код на ассемблере, и не любил на нем писать, потому что быстрее будет написать на си, чем оптимизировать тонны ассемблера.
Не тратьте время на такие разговоры : )
Decadal, я, пожалуй, сам как-нибудь разберусь, на что мне тратить своё время, ок? Не знаю про шаблонизаторы, судьба миловала остаться в стороне от вордпресса, так что пример мимо.
нужно ускорить программу. Он решает написать некуд функцию вставкой на асме в программе на си
Не, нифига не так программы оптимизируют. Обычно запускают профилировщик и находят функцию которая занимает больше всего времени, анализируют её и меняют алгоритм с экспоненциальной сложностью на алгоритм с квадратичной или линейной, а если повезёт -- с константной сложностью. Не меняя язык.
НЕ ВСЕГДА !!
все зависит от качества написанного кода, т.е. умений погромиста. как в принципе и в любом языке.
ассемблер прост наиболее близок к двоичному исполняемому коду, который непосредственно исполняется в процессоре.
соотвественно есть огромная куча возможностей как сделать сделать идеально подходящий к данному процессору код и соответственно самый быстрый. ты разговариваешь с процом практически на его языке.
но, вполне естественно, вариантов сделать гавно тоже больше чем в любом ином языке, что требует огромных познаний.
компилятор более высокого чем ассемблер языка выбирает для некоторого выражения на языке высокого уровня подходящий набор команд процессора и вставляет в конечный исполняемый файл. и этот подбор может быть не всегда идеальный.
плюс программист, в силу более вариативного обзора всей программы, может применить нестандартные решения, называемые в народе "хак", которые в данном месте сработают быстрее или с меньшим потреблением ресурсов.
Это все равно ничего не обьясняет. Компилятор из исходников на сях тоже делает машинный код, который может быть прочтен в представлении асма например флагом -S. Он генерирует те же инструкции, что написал бы человек,а не какие то свои недоступные программисту, ни в каком виде.
В теории да, на практике - нет. Если человек идеально знает определённую платформу и ассемблер под неё и вообще бог в этом, то да, он напишет максимально эффективную по скорости и по памяти программу, правильно используя машинные инструкции этой платформы, но на практике таких людей нет или очень мало.
Это просто миф.
Но у него, как и у любого другого мифа есть основа: на ассемблере не пишут сложные программы - это очень трудоёмко, а простые программы работают быстро, обычно. =)
На самом деле, теоретически, можно какие-то части кода оптимизировать вручную и и получить более хороший результат, не обязательно в скорости, кстати, чем у какого-то компилятора языка высокого уровня. Но современные компиляторы достаточно хороши, а труд программиста достаточно дорог, чтобы это имело хоть какой то смысл, уже даже в разработке встраиваемых решений.