Ассемблер хорош для понимания сути программирования, осознания того, что происходит "там внутри". То есть, именно для обучения - лабораторных работ (циклы, ветвления, и т. д.). Но писать на ассемблере программы - это либо "хобби" (ну есть же люди, которые сами миниатюрные шестерёнки из яичной скорлупы вытачивают и из них часы делают), либо мазохизм.
А главное - это ведь страшно неэффективно с точки зрения рабочего времени. Любую программу на ассемблере писать долго и нудно, и страшно подумать, если потребуется порт на другую архитектуру.
А я так и делаю ;)
на самом деле куча хейта языка С++ (Go, Java, Javascript, <любой достаточно популярный>) зачастую просто от непонимания целей языка. У С++ были вполне последовательные цели и путь развития, и он развивался так, как хотел его автор. То что его идея оказалась полезной сотням крупных компаний с нереально большим объемом кода и кучей легаси - прекрасно. Но то что люди начинают писать проект для себя и сразу ощущают БОЛЬ - ну, простите, язык и не постулировал нигде что он для этого хорошо годится.
"вот я в языке попробовал сделать такое, и получилось херня" - не делайте так :)
ругать С++ за то что он не дружественный новичкам - на мой взгляд, тупо. Ругать нужно за такие вещи, когда язык развивается вопреки постулатам. Например, обещали "не платишь за то что не используешь, а если используешь - плата не отличается от эффективной реализации ручками", а на деле имеешь жирные исключения (я в курсе, над этим активно ведется работа, static exceptions должны уменьшить боль), ну есть и другие примеры тоже.
p.s. особенно радуют люди (тролли?) которые кричат "проблемы в С++ от совместимости с С, выкиньте ее и сделайте нормальный язык", нет, совместимость это цель №1, никому нахер не будет нужен такой С++, ну или получится просто еще один C#, который опять же второй уже не нужен)
Я не связал свою жизнь с программированием, да и в целом был довольно нерадивым студентом, но до сих пор не понимаю страданий по поводу ASM и C++
Достаточно в них немного въехать - как они становятся удобным и податливым инструментом.
Если применять их не по назначению - конечно результат будет говно - как и с любым другим инструментом, от молотка до коллайдера.
Я уже третью версию комментария пытаюсь написать с нуля))
Вы все правы про назначение, молоток и пилу, и все дела, но я недаром акцент ставил на "целях". Область применения языка понять легко. Это можно сделать прочитав страничку в Википедии, да примеры кода посмотреть, ну может 1-2 проекта еще типичных.
Чтобы понять дух, идеологию, цели языка, нужно гораааздо больше времени.
Вот пример, недавно была статья на хабре, про то как хреново С++ подходит для гейм-индустрии (риальне?). Ладно, что там ставится в претензии к С++? Овердохера абстракции? дыры из-за совместимости с С? Может быть дебильный ADL? Ну или классика с препроцессором и хидер файлами? Да не, всего лишь "ой если подключить Boost, все долго компилится" (это все равно что за монструозный ZF кто-то ругал PHP например) и "я использую <algorithm> в дебаге и оно торомозит, а если оптимизацию включаю, то трейсится не очень, ощущения не те". Т.е. претензия уже к конкретному тулчейну и конкретному поставщику стандартной библиотеки) Вспоминается "Volvo, fix it please!".
да, проблема решается простановкой директив отрубающих оптимизации в интересующих тебя местах, но кого это волнует, хайп-то уже поднят, язык С++ это говно. Говно-то говно, но вы критикуете совсем не то, ребята)C++ нужен только если нужна компиляция в машинный код.
В остальном он проигрывает современным языкам.
Если у тебя какая-нибудь attiny10, а ты туда решил прикрутить, например, i2c или вообще уарт, то лучше на ассемблере. Если ты будешь писать на сях, код не будет оптимизирован и вылизан, собственно, поэтому у тебя только уарт туда и поместится (в 1кб), да и то не факт.
Ну не скажи. Я за 100шт 13-х тинек на алике отдаю 1.5к рублей. А вот за 100шт атмег 238п на том же алике просят 8,3к рубля. Не знаю как у тебя с деньгами, а я при такой разнице лучше мозг напрягу.
У меня возникает законный вопрос:
А что будете делать если упрётесь в даже на асме в свой килобайт памяти? Из-за необходимости добавить плюшку, либо исправить косяк, не важно. А я скажу что. Будете переразводить плату чтобы поставить аттини24. Если это серийная разработка, а не гаражная поделка, это потянет за собой изменение конструкторской и технологической документации, необходимость новых испытаний и т.д., да всё пойдёт по пизде. А вот если бы изначально не жадничали и поставили камень всего лишь в 2 раза дороже, этого бы не случилось. Я так легко говорю про увеличение цены МК в 2 раза потому что цена изделия это не цена МК в нём и даже не себестоимость всех запчастей. Там ещё куча статей добавляется. И вот смысл экономить на начинке в таком случае?
Вот скажи мне, мил человек. Если мне требуется уравлять шим одного канала, при этом, получать данные по уарт и по сенсорной кнопке, при этом, саму плату желательно сделать как можно мельче, скажи, на кой хер я буду ставить туда хотя бы даже 24-ю тиньку? Может туда вообще воткнуть какой-нибудь at90usb1287? Для такого проекта, очевидно, что 13 тиньки будет предостаточно. Если ты изначально предполагаешь, что схема может усложниться, нет ограничений по размерам, то да, ставишь мк покузявее, заодно сразу разводя дорожки под весь возможный фунционал.
А если ты делаешь простейший датчик, который тебе должен потом по уарт инфу слать - там из задач только уарт и обработка adc. Все. Нахрена там крутой мк?
Согласен с тобой, у нас на работе куча программистов микроконтроллеров и никто на асме не пишет, при том что пишут для ПЛИС код, а не под навороченные процы.
ATmega — это очень дорого. Если ты такие контроллеры как в Ардуино будешь ставить в свой товар, то разоришься быстро. Есть товары, которые вообще стоят 300 рублей, там такие дорогие чипы просто непозволительны, а экономить надо каждый байт и такт. И тут без АСМ никуда. При этом кроссархитектура не нужна ибо ты пишешь под конкретный контроллер и конкретную задачу. Люди забывают, что помимо их этих Core i9 есть и другие места, где нужно программировать.
Это вам объясняли те, кто учился сам очень давно. Современный компилятор по качеству оптимизации машинного кода в 99 случаях из 100 побьёт любого программиста с его вставками.
Подтверждаю, в нескольких игровых движках (в которых довелось копаться) ассемблерных вставок имеется пара десятков. Но надо понимать что все они из тех времен когда оптимизация в компиляторах была так себе и скорее всего сейчас только мешают компилятору увидеть всю картину.
Баловство это всё. Берется godbolt и сразу видно, что генерится в результате. На ассемблере. И вообще, есть дядя Mike Acton, он уже всё объяснял.
Речь шла о полезности асм вставок а не о том как дизасм посмотреть... Да и тулзовин для этого сторонних не надо, в любую нормальную ide встроено.
Как вариант под конкретные модели железок при наличии в них весьма специфичных модулей с завязкой на их логику работы по типу MMX/SSE и прочего.
Есть много сфер где эффективнее использовать ассемблер, но для начинающего программиста это и правда нонсенс.
разве в друвах для железа и всяких билсах/уефи не юзаются значительные фрагменты кода на асме?
Сомневаюсь, по сути "дрова", это та же программа получающая от ОС какие-то данные и пихающая их в железку, и наоборот, получающая с железки данные и сообщающая эти сведения ОС. Их вообще можно писать на любом языке, поддерживающем компиляцию в "нативный" код.
Что же касается BIOS/UEFI, поскольку никогда не задумывался, погуглил.
https://softwareengineering.stackexchange.com/questions/2986...
Нашёл обсуждение, из которого код BIOS с начала 90-х писали уже на С (не ++). Сейчас, наверное и на плюсах пишут. Если и остались там ручные ассемблерные вставки, то это "наследие тяжёлого прошлого".
просто юзая готовые функции и библиотеки
Есть ещё клавиатура специальная для молодых программистов:
Ну тут скорее к тому, что очень часто тянут готовые библиотеки ради одной функции. Если брать веб, то такая херня с jquery меня просто вымораживает :D
Ну если функция на чистом JS займёт пару строчек, то согласись глупо тянуть 30 килобайт (а если совсем упоротый, то все 255)
Дело не в том, чтобы писать на asm
Изучение ассемблера помогает узнать, как работает железо и проц.
Кстати, в курсе, что защиту от трассировки сделать на asm - как два пальца? Именно за счет архитектуры проца.
Именно! Первое, что я говорю студентам на лабах по "Архитектуре ЭВМ" - "Мы НЕ изучаем ассемблер, нам не хватит на это времени. Мы изучаем базовые принципы построения вычислительной техники с помощью простейших примеров на ассемблере". И то, в 20 командах буксуют, бывает. Сразу становится видно, кто понимает, что такое "алгоритм", а кто ищет библиотеку на любой чих.
Может, я и не прав, но человек, который знает, как создать модуль корзины, очень часто не может написать простейший FizzBuzz. Да, не нужны, наверное, веб-программисту разработчику все эти ассемблеры, вы правы.
Читал на хабре статью, где FizzBuzz предлагали написать соискателям на собеседовании. Удивительно, но факт, очень многие не справлялись.
(я же не про вас лично сейчас говорю, вы, возможно, и не забыли, но кто-то мог и не знать никогда).
Я уверен в другом - программист, знающий ассемблер, вполне сможет за минимум времени переквалифицироваться в веб-разработчика, разработчика приложений для мобильных платформ и десктопов, программистом микроконтроллеров, и вообще переключиться на любую специализацию в разработке ПО, связанную с программированием, да и на любой язык программирования. Обратное - не факт.
Я пробовал "на зуб", Хаскель, в нём есть своя прелесть, однако я так и не смог найти среди задач, которые лично мне приходилось решать, достойного ему применения. При желании (и мотивации), его вполне можно освоить.
Элементы же функционального программирования в виде анонимных функций в той же Java или C#, или в моём любимом Питоне осваиваются уже даже, по-моему, школьниками.
Анонимные функции ≠ функциональное программирование. Наиболее показательный пример функционального ЯП - это SQL, в котором не фиксирован порядок выполнения независимых операций.
Анонимные функции ≠ функциональное программирование.
Я этого и не говорил. Я сказал "элементы функционального программирования"
пример функционального ЯП - это SQL
По-моему, вы в определениях запутались. SQL всю жизнь считался декларативным языком. Функциональное программирование это вообще не про порядок выполнения операций.
Это не "дрочка", а задачка на смекалку. Написать можно хоть на Си, хоть на Питоне, хоть на JS. Но для реализации нужны базовые знания ассемблера или архитектуры процессора.
А насчёт оптимизаций, иногда на том же C++ их можно сделать и эффективно, и понятно.
В том же PHP, при обработке древовидных структур или связных списков в памяти, приходится использовать ссылочные переменные, что тоже я бы назвал "смекалкой". Если у вас вся разработка состоит из перекладывания данных из БД в output и обратно с небольшой арифметикой, то да, вам не нужно задумываться о сложности алгоритмов и пользоваться хитрыми структурами данных, которые на порядок позволяют ускорить выполнение. Всегда же можно купить больше железа и не париться, верно?
Вы не представляете, насколько хорошим средством оптимизации может оказаться знание битовых операций, простая наблюдательность и смекалка.
Вот к примеру - на первом курсе универа у нас была задача - написать на си функцию, которая возвращает 3 последних цифры числа 2^n, где n - некое здоровое значение.
И вот мои одногрупники (которым нахер побитовые операции, и проще мощное железо купить) решали эту задачу брутфорсом (+ и % в цикле). На вызов функции для 1 значения тратилась примерно секунда с большими n.
Моя же реализация за секунду находит 88 000 000 значений этой функции.
Т.е грубо говоря прирост перформанса не какие-то тысячные доли, а вполне ощутимые миллионы раз.
Вот так то.
Я считаю так - он в первую очередь нужен для того, чтобы показать, как различными способами можно решить одну и ту же задачу, показать студентам, что внутри никакой магии нет, и всё довольно логично, если на это спокойно взгнянуть.
Плюс показать, что знание о данных может дать программеру пути дальнейшей оптимизации.
Например, если возможно - не использовать if, т.к это тормозит конвейер.
Показать, что данные можно выложить в памяти особым образом, и получить ускорение за счет векторных инструкций.
Показать, что число со знаком, и число без знака для компа одно и то же на уровне инструкций, а всё зависит от того, как эти данные интерпретировать.
Короче, такие фундаментальные знания о комп. архитектуре.
Не спорю, asm in depth скорее всего не нужен, но базовые вещи надо знать.
Собственно, я сам сейчас студент, и не особо понимаю бомбёжки по поводу асма. Я с ним за пару вечеров разобрался до уровня достаточного для написания лабы (конвертацию строки из символов цифр в их двоичное представление), а захочу углубиться - ну у меня интернет есть, чё.
Вы же понимаете, что за синтаксисом любого языка стоит тот же машинный код, и там условия по-любому проверяются?
Можно написать FizzBuzz, где явно не будет использован switch или if, но нельзя скомпилировать код так, чтобы в ассемблерном коде не было cmp с последующим переходом?
Или не понимаете?
Вы же понимаете, что одно и то же действие можно написать по-разному на Ассемблере? Например, вместо одиночных команд перехода можно использовать таблицу переходов, вместо отдельной проверки cmp можно использовать флаги от операции div, вместо cmp edx,0 => test edx,edx и ещё много разных приёмов.
Поэтому FizzBuzz в ассемблерном коде можно написать вообще без cmp, как и на более высокоуровневом языке -
без if/?:/switch/while (x) { y; break; }
Пригодятся, когда double во float и обратно начнёшь конвертировать. Когда с суффиксными деревьями начнёшь работать и их оптимизацией по памяти. А так квадратный корень я на ассемблере тоже в одну команду посчитать могу (FSQRT).
Мой посыл был в том, что конвертация float в double и обратно даёт погрешность, а в математических расчётах, чтобы её посчитать, нужно знать IEEE 754 и как представлены вещественные числа в памяти, а это уже низкоуровненые, "ассемблерные" знания.
Скорее всего, ассемблер был во втором семестре, т.к. сразу объяснять ассемблер людям, которые вообще могли не видеть программирования, слишком сложно - не поймут.
У вас ведь нет профильного образования, так ведь?
Без знаний базовых принципов аппаратной части многие вещи приходится объяснять на "религиозном" уровне. Например, утечки памяти или многопоточное/параллельное выполнение. Если человек тупо кодит конфы в 1С или лендинги на пыхе, то ему, наверное, и не надо. Но как только нужно что-то большее, тут сразу же - "приплыли".
Нет, не пойдёт. Вы поймете, как писать алгоритмы, но не будете понимать, как работает процессор.
Тут наоборот. Для того, чтобы программировать на ассемблере, нужно знать, как работает процессор. Если не знаешь - программы не напишешь. А написание программ - закрепляет знание (хотя бы набор инструкций в памяти отложится).
А никто и не говорит, что знать обязательно. Но знаний лишних не бывает. Я лишь написал - ассемблер полезен когда учишься программировать.
IT-юмор
5.6K постов52.4K подписчиков
Правила сообщества
Не публикуем посты:
1) с большим количеством мата
2) с просьбами о помощи
3) не относящиеся к IT-юмору