C++ и статическая типизация это прошлый век
Отщеплен от топика Функции с переменным количеством параметров
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Функции с фиксированным количеством параметров и их строгой типизацией — прошлый век, отстой )))))
В нормальных языках уже давно используется переменное, точнее, не определённое заранее количество параметров в функциях. И при этом каждый фактический параметр знает свой тип и имеет набор методов, которые применимы к этому типу.
Вы намекаете, что
C
иC++
уже не нормальные языки, которые ушли в прошлое? А что скажите про ассемблер? :)будущее за c# и Java, со временем все низкоуровневое уйдет в прошлое, потому что черезчур утомительно кодить.
на чистом ассемблере щас мало кодят, в основном он генерируется компиляторами из c и c++.
Maydan, а как же микроконтроллеры?
большинство современных микроконтроллеров можно программировать на C.
Можно, но есть задачи с которыми
C
не справиться, да и код на ассемблере гораздо компактнее( если у вас под память программы отведено 1 кб, то невольно задумаешься над размером, и С тут явно не выигрывает ) и быстрее выполняется( 3 — 20 раз чем С ).современные компиляторы оптимизируют код лучше программиста средней руки на ассемблере.
для кодинга таких узких мест нужно юзать вставки через asm {}, а не писать все в машинных командах. Если кому-то это нравится, то он сам себе мазохист))
Никакой компилятор не сможет оптимизировать код на С так, чтобы он был меньше по размеру чем код на ассемблере, попытайтесь создать программу мигания светодиодом на С и на ассемблере, а затем сравните размеры.
Пока существуют процессоры, будет существовать и ассемблер.(с)
а теперь напиши тот же код на си и сравни скорость работы твоего варианта и варианта, сгенерированного машиной.
ты, кстати можешь посмотреть, какой ассемблерный код генерирует компилятор из кода на C, указав флаг
-S
для gcc.и да, известно ли тебе, что производительность кода совсем не прямо пропорциональна его размеру? Очень часто совсем наоборот.
Да, известно.
Хорошо, сравниваем:
Код, сгенерированный компилятором
C
:На самом деле перед этим кодом был ещё код, но в основном это были макросы и определения.
И код написанный на ассемблере:
Думаю, результат предсказуем, единственное что нужно оговорить, скорость работы на этом примере не проверить, зато можно проверить оптимизацию кода «суперсовременными» компиляторами.
Это смотря откуда руки растут :). Ясно что в неумелых руках даже программа написанная на языке ассемблера не будет оптимальной и быстрой в плане времени выполнения. Но если руки растут из плеч, то никакая машина не сможет оптимизировать код лучше программиста, так как компилятор не знает чего хочет программист.
с какими флагами собирал исходник на C? -O2 и -DNDebug включал? покажи сам сишный код.)
также я вижу, больше половины кода, сгенерированного комилилятором занимает сброс контроллера и очистка памяти в нем.
разницы, собственно, в функциональном коде почти нет. а теперь собери все это с флагами оптимизации.
Вот:
Тем не менее это ненужные действия, мне они не нужны, но компилятор создаёт их.
ты уверен, что эти действия не нужны?
суть в том, что функциональная часть программы, сгенерированая компилятором почти такая же по размеру, как написанная тобой вручную.
только времени потрачено намного меньше на написание сишного кода. И переносимость сохраняется на другие платформы.
с какими флагами собирал свой код?
и что у тебя лежит в
.include "d:\avr\avrasm\appnotes\2313def.inc"
?Без них же прекрасно работает.
Уже стоит оптимизация по размеру.
Те же макросы и определения, что я пропустил в коде, сгенерированном компилятором(см.выше ).
в конкретно взятом случае, да. Но я не думаю, что оно просто так там стоит. да и суть не в этом.
писать что-то большое на ассемблере практически лишено смысла. поддержка такого кода очень трудоемка, код не переносим на другие платформы, трудозатраты на разработку неоправданы.
сегодня хорошо знать все фишки ассемблера (под конкретную платформу) нужно разве только что разрабочикам компиляторов.
Согласен, но всё же есть случаи, когда без ассемблера не обойтись( например, программирование ядра ОС ).
все, что можно сделать на ASM можно сделать и на C. ядро, написанное на asm заебешься портировать на другие архитектуры.
Не всё, что можно сделать на asm можно сделать на С.
Сможешь сделать такое на С?:
Как вы думаете, будет ли показано сообщение «Hello, World!»?
ОС семейства
UNIX
вроде написаны наполовину на С, наполовину на asm, и ничего, вроде нормально везде работают.linux написан на c полностью. freebsd тоже.. Именно поэтому они так хорошо портируются на новые платформы.
более того, идеология unix призывает жертвовать производительностью в пользу переносимости.
да, в C мы можем обратиться к любой области памяти и выполнить код оттуда, если ОС позволит это сделать. но зачем так делать, скажи? в реальных проектах подобных неявных вещей должно быть минимум.