Форум программистов, компьютерный форум CyberForum.ru

Assembler или C++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
09.06.2013, 22:05     Assembler или C++ #1
Вечер добрый.

Подскажите, завязался тут такой "спор".

В блоге, программист из Латвии, который пишет свою ОС, привёл два примера работы на C/C++ и Assembler:

The C function:
C
1
2
3
4
// In C all the functions that are not marked as static are global
int cfunct(int a, int b, int c){
  return a + b + c;
}
Called from assembly:

Assembler
1
2
3
4
5
6
7
8
9
10
11
[extern cfunct]   ; import the C function
call_cfunct:
  push 3          ; c
  push 2          ; b
  push 1          ; a
  call cfunct     ; call the C function
                  ; now eax holds the return value
  add esp, 12     ; stack cleanup, we did the mess,
                  ; so we clean it up and remember
                  ; we pushed 3 integers (32bit, dwords)
                  ; that means it's 12 bytes

Но некоторые программисты пишут, что нужно на assembler.

Так как быть и на чём начать писать и в какой стороне двигаться -- С++ или Assembler, для ядра, хотя бы.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2013, 22:05     Assembler или C++
Посмотрите здесь:

C++&Assembler. C++
Ребят C++ и Assembler(совместное) C++
C++ Inline Assembler & C++
Eclipse, c++, assembler C++
Нужен-ли assembler C++ программисту? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
09.06.2013, 23:16     Assembler или C++ #2
Это смотря на каком уровне вы владеете этими языками. Ядро бы я лично писал бы на асме.

Добавлено через 29 секунд
а модули, на чистом С. Без ++)
IronnMann
 Аватар для IronnMann
6 / 6 / 1
Регистрация: 21.05.2013
Сообщений: 36
10.06.2013, 00:08     Assembler или C++ #3
YYwww,

Не по теме:

зачем изобретать велосипед?


я за асм (для ядра), он всё таки побыстрее будет
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
10.06.2013, 00:11     Assembler или C++ #4
IronnMann, это как написать)) можно и на asm завернуть.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.06.2013, 00:19     Assembler или C++ #5
Цитата Сообщение от YYwww Посмотреть сообщение
два примера работы на C/C++ и Assembler
и что эти примеры иллюстрируют?
пишите на том что лучше знаете, если ничего не знаете, то изучите асм и опосля с толком пишите С/С++
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.06.2013, 08:45     Assembler или C++ #6
Цитата Сообщение от YYwww Посмотреть сообщение
привёл два примера работы на C/C++ и Assembler:
Примеры демонстрируют совершенно разные вещи - пример на Си показывает функцию, а на асме - вызов этой функции. В связи с этим вопрос - в чем собственно вопрос?

Добавлено через 1 минуту
Цитата Сообщение от YYwww Посмотреть сообщение
для ядра, хотя бы.
Если имеется ввиду ядро ОС, то тот же линух на Си написан. Там есть ассемблер, но его ничтожно мало по сравнению с объемом Си кода.

Добавлено через 2 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
call_cfunct:
  push 3          ; c
  push 2          ; b
  push 1          ; a
  call cfunct     ; call the C function
                  ; now eax holds the return value
  add esp, 12     ; stack cleanup, we did the mess,
                  ; so we clean it up and remember
                  ; we pushed 3 integers (32bit, dwords)
                  ; that means it's 12 bytes
если написать это на ассемблере, то код так и останется в таком виде, а если написать на Си, то современные оптимизирующие компиляторы (gcc например) могут сделать из этого кода такой
Assembler
1
mov eax, 6
поэтому утверждение, что на ассемблере лучше довольно спорно.

Добавлено через 12 минут
Вот проверил в MinGW. Из такого кода
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int foo (int a1, int a2, int a3)
{
    return a1 + a2 + a3;
}
 
int main()
{
    std::cout << foo(1, 2, 3);
}
компилятор сделал
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
_main:
LFB984:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    ___main
    movl    $6, 4(%esp)
    movl    $__ZSt4cout, (%esp)
    call    __ZNSolsEi
    xorl    %eax, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
ключевое место здесь это
Assembler
1
movl    $6, 4(%esp)
о чем я и писал выше.
Для тех, кто ничего не понял, поясню, компилятор сделал такой код
C++
1
2
3
4
int main()
{
    std::cout << 6;
}
Хотя я сути вопроса до сих пор не понял, может вопрос не в этом?
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,361
Завершенные тесты: 1
10.06.2013, 11:24     Assembler или C++ #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от YYwww Посмотреть сообщение
Так как быть и на чём начать писать и в какой стороне двигаться -- С++ или Assembler, для ядра, хотя бы.
* Ассемблер жестко привязан к платформе.
Написав программу под одну платформу, вы делаете ее почти непортируемой на другие.
Даже между "родственными" платформами, такими как, например, IA-32 и AMD64, существует
много принципиальных различий - разные размеры указателей, разные наборы регистров,
разные соглашения о передаче параметров и т.д. Это значит, что для поддержки 32-битной и
64-битной версий программы придется иметь две кодовые базы.

С++ эта проблема тоже затрагивает, но не в такой степени, и многие программы, написанные
на C++, могут быть успешно портированы на другие платформы простой перекомпиляцией кода.

* Ассемблер практически не развивается как отдельный язык и лишен библиотечной поддержки.
Сталкиваясь с некоторыми, пусть даже и типовыми задачами, вам с большой вероятностью
придется писать свое решение с нуля, а это может оказаться очень и очень затратным.

Для С++, напротив, имеется огромное количество библиотек на все случаи жизни,
используя которые, вы экономите значительное количество времени и сил.

* Ассемблер, по своей натуре, имеет очень слабую поддержку языка в плане обеспечения
корректности и безопасности кода. Фактически, все что есть - это макросы, да и
то не везде. Все остальное необходимо будет изобретать самому.

С++, в противовес, имеет встроенные языковые средства, с помощью которых можно
контролировать надежность кода и обеспечивать различные гарантии.

* Вопреки распостраненному мнению, использование ассемблера в 99% не сделает вашу
программу быстрее. Современные компиляторы достаточно умны и умеют оптимизировать
код значительно лучше человека, не говоря уже о том, что делают они это намного
быстрее и точнее. Некоторые компиляторы, такие как Intel C++ Compiler, умеют
оптимизировать код под конкретную модель процессора, существует также двухпроходная
оптимизация (Profile-Guided Optimization), рассчитанная на сбор информации о
конкретных сценариях использования программы и улучшения по максимуму критических
участков кода, а еще масса различных инструментов профилирования и т.п., доступных
только для C, C++ и других языков высокого уровня.

Все это говорит отнюдь не в пользу ассемблера.
И многим программистам, деятельность которых сводится к сборке программ из готовых
библиотечных компонентов, от знания ассемблера ни жарко, ни холодно.

С другой стороны, в некоторых прикладных областях знание ассемблера не просто прихоть, а
жизненно важная необходимость, я могу сходу назвать, как минимум, три такие области:
системное программирование, обработка цифровых сигналов, встраиваемые системы.

Также существует мнение, что школу ассемблера, или другого низкоуровневого языка, в
любом случае нужно пройти. Человек, который это сделал, лучше понимает происходящее
"за кадром", да и вообще ему потом "сам черт не страшен". Я с этим полностью согласен.
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 12:06  [ТС]     Assembler или C++ #8
Цитата Сообщение от Wolkodav Посмотреть сообщение
Это смотря на каком уровне вы владеете этими языками. Ядро бы я лично писал бы на асме.
Я совершенствую знания С++, думаю, что от С++ до С не такая большая пропасть, как С++ и Pascal, например.
Assembler я ещё не знаю, но эту проблему легко решить, так как всё равно придётся его учить. Университет.

Просто я читаю статьи кто и как что пишет, но кто-то пишет, что "если написать ОС полностью на Ass, то это просто чудо! Пример тому ОС Minuet". Если я не ошибаюсь, то там приводили пример почему Ass лучше C ядра\ОС, т.е., ошибок компиляции или что-то там, не буду врать, не внимательно прочитал и не углублялся в вопрос разницы.

Вот, получается, мне нужен вопрос "разницы", что лучше, как лучше, где лучше, на чём лучше?


IronnMann,

Не по теме:

затем, что нужна особая ОС для специальных нужд, не думаю, что коммерческого плана, распространения на десятки-сотни-тысячи-миллионы компов -- только для одной программы, только для 1 компьютера. Ну и для практики, разве нет?




Цитата Сообщение от Kastaneda Посмотреть сообщение
Хотя я сути вопроса до сих пор не понял, может вопрос не в этом?
Вопрос именно в этом -- длина кода, как написал в той блоге программист, его не то чтобы поразила, а даже удивила. И ведь для простой такой строчки на С, как много надо на Asm, да?

Так вот и вопрос -- при каком языке работа ОС будет наилучшим образом быстрее. Даже не зависимо от длины кода.

ВНИМАНИЕ: при условии, что это не будет ОС похожа на семейство Unix или iOS, это будет вообще минимализированная "вещь", даже ОС то трудно назвать, которая будет использовать всё устройство компа и несколько программ. Думаю, даже антивируса не будет в этой ОС как программы-приложения или вообще программы.

Минимализм, товарищи, это всё минимализм



Убежденный,
Вы привели хорошие доводы в пользу С\С++, однако:

* Ассемблер практически не развивается как отдельный язык и лишен библиотечной поддержки.
Сталкиваясь с некоторыми, пусть даже и типовыми задачами, вам с большой вероятностью
придется писать свое решение с нуля, а это может оказаться очень и очень затратным.

Для С++, напротив, имеется огромное количество библиотек на все случаи жизни,
используя которые, вы экономите значительное количество времени и сил.
Вот этот момент меня, по сути, нисколько не пугает. Если нужно будет реализовать цикл или какую-то определённую функцию (математическую, графическую), то это меня не сильно пугает. Язык можно английский, ну если только небольшое меню на русском и английском, а так, язык даже не нужен, именно разнообразие и использование. И внешний вид будет, боле вероятно, как консольный. Ну, кубизм, минимализм. Т.е., я упрощаю работу на самом "мелком", что может отягощать её. Мне главное, чтобы все ресурсы компа направлялись на несколько определённых задач, чтоы ОС не забивалась всем, чем не нужно, чтобы ограниченное кол-во ядер работало так, как следовало бы. Чтобы была задействована многопроцесорность.

Вот и всё. Даже не нужно "хранение файлов, картинок, музыки", даже музыку (звуковую карту) не особо нужно.
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,361
Завершенные тесты: 1
10.06.2013, 12:23     Assembler или C++ #9
При решении чисто практических задач на ассемблере Вы сильно потеряете в скорости.

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

Нет, ну если мы рассматриваем такие экзотические области, как написание
своей операционки или программирование своего спутника для отправки на
орбиту Юпитера, то я с Вами согласен - надо, надо использовать ассемблер
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 16:17  [ТС]     Assembler или C++ #10
Убежденный, вот смотрите что будет:

Мне нужно реализовать программу. Эта программа для конкретной задачи. Она, программа, будет обрабатывать данные, выдавать результаты, практически даже не думать. Хотя и "мыслительную" часть процесса планирую сделать.

Эту программу я пишу на С++, так как его пока что я знаю, дабы время не терять.

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


И вот вопрос был связан с этим: на каком языке мне лучше писать ОС, вообще, как бы ОС с нуля нулевого, т.к., эта ОС для конкретной задачи и она должна работать в основном с конкретной задачей, даже не отвлекаясь на что-либо постороннее.

Т.е., взять к примеру Wimdows - рабочий стол загрузи, файловую систему загрузи, антивирус на целое ядро, чтобы систему не грузил, какие-то виджеты, время, календарик, какая-нибудь внутренняя проверка, ещё что-ниубдь, брендмауэр -- это всё, почти всё, конечно, можно отключить, но даже из-за графического интерфейса и большой загруженности в ОС других библиотек, скорость передачи и обработки данных немного ниже, я считаю.

Поэтому, я хочу реализовать свою ОС, которая минимально использует "ресурсы", у которой даже календаря не будет, не говоря уже о файловой систему, максимум часы. И она будет под определённую программу. Т.е., ОС-программа.

И вот тут, мне бы хотелось уточнить: на каком языке лучше начать писать это всё, чтобы получить максимально эффективную работу процессора, скорости обработки информации и тд и тп.

И даже если это будет ассемблер, то в дальнейшем, я не против переписать с С++ на ассемблер программу, которая бы идеально подходила к уже имеющейся ОС (и, в следствии чего, немного переделать ОС).

Вот такие вот дела.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
10.06.2013, 17:11     Assembler или C++ #11
Гвоздь забить можно камнем, молотком и кувалдой. Чем именно выбирать Вам.

Если интерпретировать это на Asm/C/C++. То так:
1. Асм нужно использовать там где надо (для этого и придумали ассемблерные вставки), так как писать крупный проект на асме радости Вам не доставит.
2. Си и С++ стоит использовать с умом. Некоторые вещи вам нужно будет написать на чистом Си, чтобы соблюсти определенную переносимость (POD типы, соглашение вызовов и т.д.). Но в целом использовать С++, чтобы не велосипедить, а решать поставленную задачу.

Есть такое выражение: "Чрезмерная оптимизация вредна". Напишите это на С++, добейтесь стабильной работы, а потом оптимизируйте узкие участки на Си и/или Асме.
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 17:27  [ТС]     Assembler или C++ #12
Т.е., определённой разницы один и тот же код, который выполняет (допустим) 5+2= ??? - хоть на С, С++ или ASM разницы никакой? (ну, кроме кол-ва строк).
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
10.06.2013, 17:32     Assembler или C++ #13
Все более или менее "нормальные" компиляторы смогут оптимизировать код, даже о таком о котором вы и бы не подумали оптимизировать. Но читаемость, а значит в дальнейшем и поддержка, лучше на с/с++, чем на асме.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.06.2013, 17:43     Assembler или C++ #14

Не по теме:

Цитата Сообщение от YYwww Посмотреть сообщение
длина кода, как написал в той блоге программист, его не то чтобы поразила, а даже удивила.
Если программиста удивляет, что один и тот же код на ассемблере занимает больше строк, чем на Си, то скорее всего это и не программист вовсе
Цитата Сообщение от YYwww Посмотреть сообщение
И ведь для простой такой строчки на С, как много надо на Asm, да?
Так в твоем первом посте на Си показана функция, а на асме только ее вызов и очистка стека, т.е. самой функции нет. На сколько я понял ты взял этот код из блога какого-то "программиста", который даже не смог разобраться какой ассемблерный код (идентичный сишному) нужно вставить в свой блог.
Исходя из всего этого могу сказать, что не нужно читать блог этого "программиста из Латвии"



Добавлено через 4 минуты
Цитата Сообщение от YYwww Посмотреть сообщение
Т.е., определённой разницы один и тот же код, который выполняет (допустим) 5+2= ??? - хоть на С, С++ или ASM разницы никакой? (ну, кроме кол-ва строк).
Если 5 и 2 это константы времени компиляции, то сишный компилятор просто стразу посчитает 5+2=7 и вставит ответ в код. А если 5 и 2, например, вводятся с клавиатуры, то разницы нет. Хотя правильней написать, что есть (например переменные будут расположены на стеке, т.е. лишнее время на чтение/запись), НО когда в дело влезет оптимизатор, то он вполне может расположить эти переменные на регистрах, поэтому можно сказать, что разницы нет.
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 19:22  [ТС]     Assembler или C++ #15
stima, получается, ОС на С++ из ваших выводов? (А то чувствую, что всё про программу говорим, которую и так на С++ собираюсь писать, т.к. ASM ещё не знаю).




Kastaneda,

Не по теме:

Верю, тот программист решил полностью на С++, вроде бы, писать свою ОС и она будет там что-то коммерческой. Может быть, это я сам зря на программиста наговарию, он не испугался и не удивился, просто привл несколько вариантов, сколько строчек на С и ассемблере и говорит "мол, вот так вот, мол". Ну раз так, то так.

Он пишет ОС, повторюсь.

stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
10.06.2013, 19:30     Assembler или C++ #16
2YYwww Вы вообще загрузчик писать будете? Или уже Grab использовать? Ну кернел все равно Вам придется писать на Си, а что-то более высокоуровневое можно и на С++.
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 21:23  [ТС]     Assembler или C++ #17
stima,
Ядро хочу своё написать. Для теории и практики, так сказать. Т.е., теоретическая часть, в виде "Таненбаум Современные Операционные Системы" и иже с ним -- это я тоже буду изучать. Причём детально и глобально.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
10.06.2013, 21:51     Assembler или C++ #18
Удачи, многие начинали)) не многие закончили.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.06.2013, 21:54     Assembler или C++ #19
Просто ради любопытства - планируемая ОС, я так понимаю, под х86, а в каком режиме будет работать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2013, 22:47     Assembler или C++
Еще ссылки по теме:

Коды Assembler в C/C++ C++
Что быстрее assembler или c++ C++
Можно ли в С++ встраивать код на Assembler C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
YYwww
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 22:47  [ТС]     Assembler или C++ #20
stima, спасибо, надеюсь, ОС-подобное существо появиться, года так через 3-4. Это дело бросать не хочу, чисто из наглости.


Kastaneda, не совсем понял вопрос. Простите, я ещё нахожусь на стадии "планирование и сбор информации по ОС" и не на всё могу ответить.
Yandex
Объявления
10.06.2013, 22:47     Assembler или C++
Ответ Создать тему
Опции темы

Текущее время: 17:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru