Какие проекты (помимо очевидного материала ОС) используют язык ассемблера?
По-видимому, теперь никто не использует сборку, кроме разработки драйверов устройств или самого ядра ядер ОС и т.д. Кто-нибудь знает, что он в настоящее время используется для других вещей?
Я имею в виду компьютерный стиль и большее аппаратное обеспечение, а не встроенный материал с крошечными крошечными процессорами.
Ответы
Ответ 1
Boost, будучи современным С++, как он есть, использует встроенную сборку для низкоуровневых критических по производительности бит, таких как атомные общие счетчики.
Изменить: поскольку @TokenMacGuy правильно отмечает, "производительность" - неправильное слово здесь. Boost использует язык ассемблера для вещей, которые не могут быть выполнены в стандартном С++, таком как атоматика (и по какой-либо причине встроенные функции компилятора недоступны).
Ответ 2
Более или менее очевидно, что программирование сборки требуется для компиляторов и связанных с ними технологий, таких как динамическая перекомпиляция симуляторов CPU.
Программирование языка ассемблера также используется с некоторой частотой для программирования видеоигр, чтобы использовать преимущества новых функций процессора, которые пока не поддерживаются текущими компиляторами. Однако в наши дни это редкость, особенно потому, что на ПК есть так много разных процессоров для поддержки. Я ожидаю, что это немного более часто встречается на консолях с однородным оборудованием.
Изменить: В наши дни игры выполняют большинство своих вычислений на графическом процессоре. Получение максимальной отдачи от этих вычислительных ресурсов не всегда возможно, используя только OpenGL или DirectX, а поставщики для этих процессоров предоставляют множество инструментов для сжатия большего количества своего оборудования. Хотя Cuda или OpenCL - хорошо известные термины, они все еще находятся на относительно высоком уровне абстракции над оборудованием GPU, заполняя роль, которая очень похожа на роль C на типичных (Von Neuman) процессорах. Посмотрите на developer pages для этих продуктов и вы найдете десятки способов оптимального использования вычислительных ресурсов графического процессора и на каждом уровне абстракции.
Ответ 3
Я считаю, что проект параллельных вычислений Folding @Home использует оптимизированный ассемблерный код для максимальной скорости. *
* Примечание: это не означает, что сборка всегда быстрее, чем C/С++.
Ответ 4
Точно так же, как анекдот: Tycoon Roller Coaster Tycoon был написан полностью (или почти) в сборке x86 Крисом Сойером (ссылка на wikipedia).
Ответ 5
Кто-то использовал сборку для этого кода для изменения чисел в словах.
Ответ 6
В прошлый раз, когда я сталкивался с ассемблером, я использовал, чтобы взломать исходный код Quake I. Все математические библиотеки (особенно все для точечных продуктов) были написаны в MASM Джоном Кармаком. Этот материал был интенсивным с плавающей запятой, и в то время C не был столь же хорош, как умело созданный вручную ASM для плавающих операций. Кроме того, поскольку компьютеры были гораздо более ограниченными по цене, и поскольку Quake использовал процессор для рендеринга, каждая отдельная операция имела значение, поэтому ASM работал лучше всего.
Ответ 7
Если вы тратите много времени на сборку вашего источника C/С++, вы очень быстро заметите, что большинство хороших оптимизирующих компиляторов делают сборку лучше, чем даже хорошие программисты сборки. Решения о том, когда нужно встроить функцию, как обрабатывать циклы, post и pre increment (которые многие компиляторы решают, как обращаться с вами сейчас) и т.д. Удачи, перехитрив компилятор с большим сообществом, развивающим его, и гораздо лучшей способностью для управления адресами и определениями, чем вы, по крайней мере, при нормальных обстоятельствах.
Даже драйверы устройств и ядра ОС обычно не записываются с использованием большого количества сборок. Малопроизводительные критические разделы программ реального времени - это то, где вы найдете сборку в сегодняшних приложениях.
Становится еще хуже, когда вы начинаете говорить о сборке RISC, которая, как правило, чрезвычайно эффективна для инструкций по оптимизации, таких как ветка и обмен, а также десятки регистров общего назначения. Большинство людей не умнее оптимизирующего компилятора. Те, кто, как правило, пишут оптимизирующие компиляторы.
Ответ 8
В C на фундаментальном уровне довольно легко увидеть, как набор инструкций становится сборщиком (если вы понимаете базовую архитектуру). Но иногда ассемблеру нельзя бить. Обратите внимание, что можно писать дрянной, неэффективный ассемблерный код так же легко, как писать дрянные C-коды. И ассемблер менее удобен в обслуживании. И он нигде не переносится.
И все зависит от качества компилятора C, который вы используете. Некоторые делают лучше, чем другие. Большинство компиляторов позволяют видеть код ассемблера, который они генерируют. Если вы считаете, что можете сделать лучше, а сегмент кода имеет решающее значение, сделайте это. В противном случае избегайте этого. Тщательно обработанный C может быть очень близок к металлу, учитывая достойный компилятор.
Ответ 9
Утилиты, которые не поддерживали язык более высокого уровня. Старый пример - с того момента, когда я пытался получить некоторые из тонкостей, предоставленных C и Unix во время работы с Fortran на RSX-11M. Я хотел передать строки форматирования и использовать более простой стиль C. Printf() необходимо выполнить некоторые операции с подобным типом. У Fortran не было этой концепции, поэтому icast() и rcast() были написаны на ассемблере. Другие реализованные функции - move() и clone(). Это было сделано не столько для эффективности, сколько для расширения концепций вне мышления Фортрана.
Ответ 10
Говоря по опыту, он широко используется при тестировании и проверке новых конструкций процессоров. Набор инструкций должен быть подчеркнут с использованием кода, который компилятор не обязательно будет генерировать. Вместо того, чтобы писать на каком-то языке более высокого уровня, который может компилироваться или не компилироваться с инструкциями, которые требуется проверить, проще написать сборку вручную.
Ответ 11
Я знаю, что сборка используется для очень большого кода для игр. Например, пиксельные шейдеры имеют очень жесткий бюджет команд; чтобы получить нужные вам эффекты, вам в значительной степени приходится записывать код на металл.
Ответ 12
Я думаю, что наиболее известными программами, в которых используется ассемблер, является загрузчик.
Ответ 13
Я написал ассемблер IBM 370 в тот же день, для большого приложения (проданного продукта поставщика, используемого крупными компаниями), который собирал информацию с крючков в операционной системе. Тем не менее, я занимался простым программированием jane: экранами, отчетами и т.д. На ассемблере. Он работал удивительно быстро, но был полностью в ассемблере. Я уверен, что он все еще работает и продается сегодня по ценам, значительно превышающим то, что типично для программного обеспечения для платформ Windows и Linux.
Ответ 14
По словам Кнута, изучение эффективности алгоритмов. Он упоминает в своих книгах, что нет лучшего способа изучить, как работает алгоритм, чем писать в сборке.
Ответ 15
Иногда некоторые функции не реализуются на языке высокого уровня, а вместо этого используется встроенная сборка. Например, в С++-библиотеке Qt есть встроенная сборка; Я считаю, что он использовался для части системы самоанализа объектов.
Кроме того, glibc (библиотека C для gcc) использует сборку для оптимизации. IIRC - одна из математических реализаций с плавающей запятой, основанная на программном обеспечении, имеет значительные фрагменты, записанные в сборке.
Одной из основных причин обучения сбору, однако, является отладка. В некоторых случаях я попал в ситуации, когда незнание сборки не помешало бы мне отладить особенно липкую проблему.
Ответ 16
Одним из кода определения скорости (после того, как требуется динамическое управление памятью) почти на каждом языке является процедура, используемая средой выполнения (-библиотека) для перемещения памяти. Move(), memcpy и т.д., А также примитивы, такие как поиск байта (strchr) и т.д.
Это довольно часто написано на ассемблере, а также специальный выделенный код для использования выравнивания.