Нужен ли асм для программирования на Си
- Войдите на сайт для отправки комментариев
Поскольку baby_on_arduino что-то никак тему не заведет. то я решил открыть ее сам.
Напомню, вот тут и далее по той теме он утверждает, что невозможно научится писать на Си, не зная ассемблера. В качестве примера приведена задача написания некоего "адресно-независимого кода" на си, которую якобы невозможно решить без разглядывания машинного кода в окне отладчика.
Мне кажется, что baby_on_arduino что-то путает. Насколько я могу судить , Си - это ведь язык ВЫСОКОГО уровня и как следствие - любой код, написанный на Си - является адресно-независимым, если только сам программист не "испортил" его прямой привязкой к конкретным адресам в памяти.
Мне интересно. что о об этом думают более опытные члены сообщества. Как я уже писал - я не горжусь тем, что не знаю асма - но вот как-то так сложилось. что за 25 лет программирования он мне ни разу не понадобился.
Язык программирования C тем и завоевал свою популярность, что позволяет писать код, который очень близок к ассемблеру, и программисту не нужно задумываться об этом.
Гениальный программист Билл Гейтс выбрал для создания Windows язык программирования С, и это изменило мир IBM PC-совместимых компьютеров.
Его примеру последовал и гениальный программист Линус Торвальдс, выбравший язык программирования C для создания операционной системы Linux.
Не говоря уже и про операционную систему Macintosh, написанную на диалекте C++ - Objective-C.
В общем, у C можно назвать только один недостаток - это компилируемый язык, а во многих случаях интерпретатор гораздо предпочтительнее.
ASM нужен иногда (очень редко) для ассемблерных вставок, когда нужно быстродействие. Пример - генератор частоты от dimax (здесь и здесь).
ASM нужен иногда (очень редко) для ассемблерных вставок, когда нужно быстродействие. Пример - генератор частоты от dimax (здесь и здесь).
это понятно, другой пример - работа с адресной лентой W2812
но я не хотел бы. чтоб дискуссия сваливалась в тупой треп "нужен ли асм" - у меня нет никаких сомнений. что нужен.
Меня больше интересует конкретный вопрос. что такое адресно-независимый код и зачем он нужен в Си?
я не говорил что нельзя писать на Си не зная ассемблера)) можно но это типа блондинки за рулем))
я не говорил что нельзя писать на Си не зная ассемблера)) можно но это типа блондинки за рулем))
лучше приведите пример конкретной задачи. которая требует "адресно-независимого кода"
лучше приведите пример конкретной задачи. которая требует "адресно-независимого кода"
в контексте ардуино это не актуально) а вот в операционных системах на пк множетство адресных простанств виртуальных есть одновременно, и можно код скомпилированный для одного адресного пространства записать в другое АП по другому базовому адресу и надо чтоб он там правильно выполнялся
как вы это сделаете если не знаете во что компилируется ваш Си код?)
тут придется и в отладчике посидеть и код написать правильно
ну и вообще знать что генерирует компилятор из твоего Си кода это сила, ты например будешь понимать почему выход за границы буфера на стеке приводит к выходу из функции черт знает куда)
в операционных системах на пк множетство адресных простанств виртуальных есть одновременно, и можно код скомпилированный для одного адресного пространства записать в другое АП по другому базовому адресу и надо чтоб он там правильно выполнялся
простите, но какое отношение перенос машинного кода имеет к исходному коду на Си? исходный код на Си ВСЕГДА адресно-независим, для того чтобы получить из него код для нужного адресного пространства - не надо никаких ассемблерных штучек, достаточно лишь скомпилировать код под нужное АП.
а если вы говорите про перенос машинного кода в другое АП БЕЗ КОМПИЛЯЦИИ - то это сродни асм-овским вставкам в скетче :) и никакого отношения к программированию на Си не имеет
простите, но какое отношение перенос машинного кода имеет к исходному коду на Си? исходный код на Си ВСЕГДА адресно-независим, для того чтобы получить из него код для нужного адресного пространства - не надо никаких ассемблерных штучек, достаточно лишь скомпилировать код под нужное АП.
а если вы говорите про перенос машинного кода в другое АП БЕЗ КОМПИЛЯЦИИ - то это сродни асм-овским вставкам в скетче :) и никакого отношения к программированию на Си не имеет
исходный код на Си эти буковки в текстовом редакторе и словечки естественно адресно-независим)) пока мы его не скомпилируем задав при компиляции некий базовый адрес загрузки кода))
и больше ты этот скомпилированный машинный код не загрузишь ни по какому другому адресу)
а я говорю что можно так составить код на Си что однажды его скомпилировав ты можешь загружать этот машинный код по любому базовому адресу) но для этого как минимум надо не бояться отладчика и знать хоть немного ассемблер
и больше ты этот скомпилированный машинный код не загрузишь ни по какому другому адресу)
удивительно, правда? :)
так я и спрашиваю - нафига это надо?
на мой взгляд это в чем-то сродни желанию написать прошивку под АВР, которая без перекомпиляции запустится в СТМ32 :) понятно, что пример не вполне удачный - но зато передает мою мыстль , а именно - нафига эти пляски с бубном. если можно просто перекомпилировать код под нужную архитектуру или нужный адрес?
ну вот представь твоя программа хочет запустить кусочек кода в другой программе, хранит она этот кусочек кода у себя в данных в виде адресно-независмого кода) берет и записывает по любым адресам свой код в чужую программу и запускает
понятно что если у тебя есть исходник то ты тупо можешь создать файл программы который запустит загрузчик операционной системы в своем адресном пространстве и там такие штучки дрючки просто не нужны
ну вот представь твоя программа хочет запустить кусочек кода в другой программе, хранит она этот кусочек кода у себя в данных в виде адресно-независмого кода) берет и записывает по любым адресам свой код в чужую программу и запускает
я ничего не понял, но могу согласится. что для написания подобных вещей необходимо изучать ассемблерный листинг.
Вопрос только, причем тут "умение программировать на СИ"?
Возвращаясь к аналогии с блондинкой за рулем - да, большинство блондинок не подозревают, как устроена коробка передач. Однако так ли это необходимо для умения водить машину? Я подозреваю. что и большинсво гонщиков ралли вряд ли справятся самостоятельно с переборкой АКПП, что не мешает им брать призы в гонках.
Шел 8ой день карантина... Пипец какой-то!!!
707ой, дорогой! Ну ты то хоть не подыгрывал бы! Пациент явно парацетамолу переел, а ты то зачем? Просто 8ой день и состояние общего афигения??? ;)))
К нам забрался вирусописатель.
ну вот представь твоя программа хочет запустить кусочек кода в другой программе, хранит она этот кусочек кода у себя в данных в виде адресно-независмого кода) берет и записывает по любым адресам свой код в чужую программу и запускает
понятно что если у тебя есть исходник то ты тупо можешь создать файл программы который запустит загрузчик операционной системы в своем адресном пространстве и там такие штучки дрючки просто не нужны
Ау! Ты где? Это форум про микроконтроллеры. Какие кусочки в другой программе? В микроконтроллере крутится одна программа. Она жестко привязана к адресам периферии. А в частности для микроконтроллеров AVR если нет long jamp в куске программы, то компилятор СИ генерит код, который может исполняться с любого адреса памяти. Абсолютно адресно независимый код. Что ещё надо? Пиши короткие циклы и будет адресно независимое счастье.
на вас не угодишь, сэры!
пишу про вирус в соседней теме - Женя одергивает "неужели больше поговорить не о чем?" - начинаю про программирование - теперь ты недоволен :) о чем говорить-то тогда? :)
На самом деле я задал вопрос вполне серьезно - и получил устраивающий меня ответ. а дальше флеймите сами. это вам на карнтине делать нечего :) а я на работе.
Вопрос только, причем тут "умение программировать на СИ"?
В том-то и парадокс, что под умением программировать на C обычно понимается умение создавать код, близкий к ассемблерному. Нужно ли для этого знать ассемблер? Непременно.
я ничего не понял, но могу согласится. что для написания подобных вещей необходимо изучать ассемблерный листинг.
Вопрос только, причем тут "умение программировать на СИ"?
Возвращаясь к аналогии с блондинкой за рулем - да, большинство блондинок не подозревают, как устроена коробка передач. Однако так ли это необходимо для умения водить машину? Я подозреваю. что и большинсво гонщиков ралли вряд ли справятся самостоятельно с переборкой АКПП, что не мешает им брать призы в гонках.
к умению программировать в целом наверно не относится, а вот если к умению программировать на Си добавляется еще кое что, как говорил Брайан Керниган — это инструмент, острый как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво.
неплохо бы понимать чем обернется например выход за пределы массива и почему это происходит
или вот аналогия, чтобы ездить на советстком мотоцикле нужно быть не просто водителем а водителем-механиком)) иначе не ты на нем а он на тебе ездить будет))
или вот аналогия, чтобы ездить на советстком мотоцикле нужно быть не просто водителем а водителем-механиком)) иначе не ты на нем а он на тебе ездить будет))
хороший пример. Когда судьба заставит ездить на советском мотоцикле - тогда и буду учиться :)
Да-а-а: «… а другой доказывал, что внутри земного шара имеется другой шар, значительно больше наружного. В сумасшедшем доме каждый мог говорить все, что взбредет ему в голову, словно в парламенте» (Ярослав Гашек. «Похождения бравого солдата Швейка», глава IV)
Влад, смотри ширше. Вспомни Игоря Губермана:
Влад, смотри ширше. Вспомни Игоря Губермана:
Как всегда, гениально.
Игорь - он такой.
Кстати, этот гарик у меня лично сильно перекликается с "Пейзажем" Галича помнишь, там: "Не всё напрасно в этом мире, хотя и грош ему цена ... ", а жена считает, что ничего общего. Ты не замечал тут сходства? Вплоть до того, что Губерман под сильным влиянием Галича писал?
Игорь - он такой.
Кстати, этот гарик у меня лично сильно перекликается с "Пейзажем" Галича помнишь, там: "Не всё напрасно в этом мире, хотя и грош ему цена ... ", а жена считает, что ничего общего. Ты не замечал тут сходства? Вплоть до того, что Губерман под сильным влиянием Галича писал?
Тут не все просто! Оба автора со щемящим реализмом видят несовершенство окружающего мира и его пороки. Но выход, не побоюсь сказать - источник возможного катарсиса, видят в разном. Если Игорю Губерману приносит покой стабильность в важных для него (что греха таить - и для меня!) социальных ритуалах, то Александр Галич полагает важным неизменность возможности коллективной оценки "уровня говна", что очевидно является аллюзией на Кантовский "Категорический Императив".
.....
Уффффффф..... Выдохнул. При цитировании ссылка обязательна! ;))
Для начала - реакция на утверждение бейби о том, что невозможно научиться программировать без отладчика (бедная Ада Аугуста Байрон графиня Лавлейс!), дизассемблера и IDE:
Это бред!
Выше - эмоциональная характеристика, ниже - более рациональная.
Указанное утверждение есть не что иное, как логическая ошибка: если до появления первых отладчика, дизассемблера и интегрированной среды не могло быть ни одного программиста, кто же тогда написал первые отладчик, дизассемблер и среду?
Помню время, когда не было ни отладчика, ни дизассемблера, ни сред программирования, а интерфейс командной строки воспринимался как истинный прорыв в будущее. Еще бы, по сравнению с перфокартами то...
По поводу применения языка Ассемблера, из личного опыта:
1. Когда больше ничего нет. Пример - Радио-РК 86.
2. Когда возможности ЯВУ сильно ограничены. Пример - какой-то из 16-разрядных компиляторов Фортрана, в котором в принципе не было ни средств работы с экраном, ни доступа к функциям BIOS, ни доступа по абсолютным адресам (например, адресам видеопамяти). Пришлось написать все недостающее на Ассемблере и пристыковывать в виде объектных файлов.
3. Когда ЯВУ ничего не известно о новых командах процессора. Пример - использование RDTSC, MMX, SSE в компиляторе, разработка которого была заморожена.
4. Для скорости. Возвращаясь к 2 - когда вышла следующая версия Фортрана, в ней уже была графическая библиотека, но оказалось, что она работает существенно медленнее моей самописной и поддерживает гораздо меньше видеомод, чем моя. Так что продолжал использовать самописную.
4а. Ну и, опять же, компиляторы далеко не всегда были оптимизирующими, а для таких генерируемый код ВСЕГДА был медленнее самописного ассемблерного.
Но как бы прогресс имеет место быть. И если для Intel8080 я не использовал ничего кроме Ассемблера, то последние лет 10 вообще ни разу на Ассемблере писать не приходилось.
Тем не менее, знание, во что может откомпилироваться код на ЯВУ, мне кажется, весьма полезным.
Пример: после того, как в Делфи появился оператор изменения длины массива (SetLength) как-то видел фрагмент кода: нужно было добавить в массив некоторое количество элементов. Горе-программист не нашел ничего лучшего, как внутри цикла добавлять к массиву по одному элементу, сразу записывая в него очередное число. Ему в голову не пришло, что каждое изменение длины массива - это не единичная операция, а выделение-освобождение памяти с копированием всего массива. Т.е. там, где задача изначально была сложности O(N), программист, неумело воспользовавшись "вкусностями" ЯВУ, превратил ее в задачу сложности O(N^2).
Кроме того, иногда с точки зрения достижения максимальной скорости нужно представлять себе набор команд конкретного процессора и примерную скорость их выполнения. Просто для того, чтобы выбрать оптимальный в данном случае алгоритм из нескольких вариантов. Классический пример: попытка использовать float для AVR в случаях, где в этом нет никакой необходимости.
Ну и в заключение: я периодически просматриваю дизассемблерные листинги тех программ, что я пишу для AVR или ARM, и убедился, что современные оптимизаторы, не смотря на заметный прогресс, еще не достигли совершенства. Так что знание хотя бы основ ассемблера и машинных кодов в ряде случаев оказывается полезным, хотя и не обязательным.
И для баланса: многие из моих коллег не имеют ни малейшего представления о языке Ассемблера, но, тем не менее, пишут весьма серьезные вещи. Действительно серьезные, не далее как 2 месяца один из их получил "За заслуги перед Отечеством".
Оба автора говорят о том, что всегда, а особенно, когда всё хреново, в мире должно хоть что-то идти правильно. Должны быть какие-то абсолютные, независимые ни от чего, смыслы и именно они являются спасательным кругом, когда всё валится в бездну.
Эта мысль, кстати, встречается много где, даже в попсе. Вспомните, ... мир кругом рушится ... зацепиться не за что ... "а я иду такая вся, в дольче габана". Как видите осталась константа, которая не подвела и за неё можно ухватиться посреди хаоса.
P.S.
Господа эстеты, попрошу не наезжать на мою параллель между Галичем/Губерманом и Веркой, если не хотите, чтобы я процитировал Вам Гашека "о сущности эстетизма" :-)
Пришел поручик... И все свёл к сущности эстетизма!
:-)
Указанное утверждение есть не что иное, как логическая ошибка: если до появления первых отладчика, дизассемблера и интегрированной среды не могло быть ни одного программиста, кто же тогда написал первые отладчик, дизассемблер и среду?
Та не совсем тут ошибка по сути вопроса. В тот момент когда не было перечисленного знание ассемблера и/или машинных кодов было нормой. Назвать себя програмером без этого никто не решился бы.
Кроме того, иногда с точки зрения достижения максимальной скорости нужно представлять себе набор команд конкретного процессора и примерную скорость их выполнения. Просто для того, чтобы выбрать оптимальный в данном случае алгоритм из нескольких вариантов.
Вот это и имеется в виду при утверждении нужен ли асм. Хелоуворд без него можно писать. А раскрыть потенциал проца полностью, вытянуть по максимуму возможного - нет. А с остальными пунктами разумеется нельзя не согласится, они в общем и очевидны.
Указанное утверждение есть не что иное, как логическая ошибка: если до появления первых отладчика, дизассемблера и интегрированной среды не могло быть ни одного программиста, кто же тогда написал первые отладчик, дизассемблер и среду?
Та не совсем тут ошибка по сути вопроса. В тот момент когда не было перечисленного знание ассемблера и/или машинных кодов было нормой. Назвать себя програмером без этого никто не решился бы.
Кроме того, иногда с точки зрения достижения максимальной скорости нужно представлять себе набор команд конкретного процессора и примерную скорость их выполнения. Просто для того, чтобы выбрать оптимальный в данном случае алгоритм из нескольких вариантов.
Это когда выбор МК изначально был на грани фола...
Классический пример: попытка использовать float для AVR в случаях, где в этом нет никакой необходимости.
Это по незнанию... и к АСМу никакого отношения не имеет...
Ну и в заключение: я периодически просматриваю дизассемблерные листинги тех программ, что я пишу для AVR или ARM, и убедился, что современные оптимизаторы, не смотря на заметный прогресс, еще не достигли совершенства. Так что знание хотя бы основ ассемблера и машинных кодов в ряде случаев оказывается полезным, хотя и не обязательным.
Или оптимизаторы не достигли совершенства... или вы...
Если всё работает... то и нехрен там смотреть... если начинаете считать такты - двойка с минусом вам... как разработчику...
И для баланса: многие из моих коллег не имеют ни малейшего представления о языке Ассемблера, но, тем не менее, пишут весьма серьезные вещи. Действительно серьезные, не далее как 2 месяца один из их получил "За заслуги перед Отечеством".
Даже в виде совы... на глобус не натягивается... ))))))))))
В том-то и парадокс, что под умением программировать на C обычно понимается умение создавать код, близкий к ассемблерному. Нужно ли для этого знать ассемблер? Непременно.
Кто сказал... где прочитали ??? И насколько глубоко нужно знать этот АСМ ???
Кроме того, иногда с точки зрения достижения максимальной скорости нужно представлять себе набор команд конкретного процессора и примерную скорость их выполнения. Просто для того, чтобы выбрать оптимальный в данном случае алгоритм из нескольких вариантов.
Это когда выбор МК изначально был на грани фола...
А кто вообще говорит про МК?
Если последний писк - это 386 на 33 МГц, то особенно выбирать не приходится. Выбор только в том, предусматривать ли вариант, который будет работать на 286, или нет.
Классический пример: попытка использовать float для AVR в случаях, где в этом нет никакой необходимости.
Это по незнанию... и к АСМу никакого отношения не имеет...
Естественно, все упирается в знание. Например, знать Ассемблер ли не знать.
Или оптимизаторы не достигли совершенства... или вы...
Ну, одно другого не исключает.
Если всё работает... то и нехрен там смотреть... если начинаете считать такты - двойка с минусом вам... как разработчику...
Блестящая аргументация!
Если всё работает... то и нехрен там смотреть... если начинаете считать такты - двойка с минусом вам... как разработчику...
Блестящая аргументация!
Сергей! Тут речь, как мне кажется о том, что если ты достиг нормального уровня в программировании и задача решена, то никакого смысла в дальнейшей оптимизации кода нет. Грубо - в МК поместилось и работает - не надо туда лезть. Все таки перфекционизм - психическое заболевание, не стоит этого забывать. Ну и бессмертное от Клапауция: "Сэкономленную память детям завещать станешь?".
я сам иногда грешен. Благо, что в дельфи это сделано для людей, всё проще простого. :)
Как я уже писал - я не горжусь тем, что не знаю асма - но вот как-то так сложилось. что за 25 лет программирования он мне ни разу не понадобился.
Интересно спросить, а на чем ты таком 25 лет назад писал под avr? Я помню avr studio 2.0 была исключительно на асме, уже в двухтысячных прикрутили к нему winavr. Да и для пиков была та же ситуация. 2020-25 = 1995, где ты тогда взял си для avr?
Интересно спросить, а на чем ты таком 25 лет назад писал под avr?
разве я где-то указывал, что речь про авр? - авр, как и другие МК - я впервые увидел менее 3х лет назад.
разве я где-то указывал, что речь про авр? - авр, как и другие МК - я впервые увидел менее 3х лет назад.
А, ну тогда вопросов больше нет, я ж думал про другое.
я сам иногда грешен. Благо, что в дельфи это сделано для людей, всё проще простого. :)
Вот-вот.
Именно это я и имел в виду в п.3 поста №25.
Интересно спросить, а на чем ты таком 25 лет назад писал под avr?
А давайте ещё откопаем каменный микроскоп... и будем им забивать этот кал мамонта как гвозди... Не??? ))))))
При нынешнем раскладе... если только основательно не юзать DSP... смысла в АСМе... особого и нет... Такова реальность... ибо нынче нет никакого смысла биться за каждый такт и каждый байт... во избежание хронического когнитивного диссонанса...
Навеяло... Вспомнился старенький рассказик времён первых МК... если не изменяет память... назывался "История одного байта"... Нашёлся...
http://we.easyelectronics.ru/Asticon/istoriya-odnogo-bayta.html
хороший рассказ однако
При нынешнем раскладе... если только основательно не юзать DSP... смысла в АСМе... особого и нет... Такова реальность... ибо нынче нет никакого смысла биться за каждый такт и каждый байт...
Я даже больше скажу, современные компиляторы уже настолько удачно оптимизируют код, что написанный руками код на асме может получится даже больше по объему и медленней в работе. ))
Я даже больше скажу, современные компиляторы уже настолько удачно оптимизируют код, что написанный руками код на асме может получится даже больше по объему и медленней в работе. ))
Это ты прям сильно погорячился.
Это ты прям сильно погорячился.
Ну первые сишные точно таким качеством не обладали, потому и сверяли с листингом в асме "как он разложил и как бы сам написал". Зачастую было видно что можно спокойно несколько команд вырезать или заменить меньшим количеством.
Ну первые сишные точно таким качеством не обладали, потому и сверяли с листингом в асме "как он разложил и как бы сам написал". Зачастую было видно что можно спокойно несколько команд вырезать или заменить меньшим количеством.
С тех пор не изменилось ровным счётом нихрена.
С тех пор не изменилось ровным счётом нихрена.
Ну как сказать, алгоритмы оптимизации на месте ж не стоят и не зря за хорошую среду разработки берут огромные деньги.
Не знаю как сейчас, но лет семь назад видел одну разницу в CVAVR от наших хваленых gcc и всяких iar. Дело в том, что CVAVR начинал размещение переменных в регистрах общего назначения (R16-R31) и уж только потом лез в память, gcc же и iar нифига подобного не делали, а сразу размещали в памяти, для которой надо три операции, считать, изменить, записать, когда для работы с регистрами не нужны команды чтения и сохранения, работаем на прямую. Причем память использовалась всегда, даже если программа на сложение двух переменных.
Я даже больше скажу, современные компиляторы уже настолько удачно оптимизируют код, что написанный руками код на асме может получится даже больше по объему и медленней в работе. ))
Это ты прям сильно погорячился.
А чонитак? От квалификации программиста зависит, нет? Если я напишу код, Ворота, Женя, ты.. и т.д., то возможно(!) он будет не хуже откомпилированного, а если Алегир или Архар то не очевидно. ;)))
----------------
Ну и да - возьми любой свой проект и посмотри разницу в размере и скорости кода, откомпилированного с оптимизатором и без.
От квалификации код зависит больше, чем от самого крутого оптимизатора
Это ты прям сильно погорячился.
Пачиму? Сморя кто писать будет. Форумы забиты гавриками, которые не знают как мигать двумя светодиодами, но уверены, что создадут "суперпрогу", если только доберутся до
священного Грааля"волшебного асма".