Асамблея все ще актуальна? [зачинено]


18

Чи існують великі відмінності між мовою складання та мовами вищого рівня, що стосується кодування та / або управління проектами? Очевидно, що для виконання певної операції потрібно більше заяв на мові збірки, ніж у більшості інших мов, але чи існують відмінності, які впливають на те, як проект потрібно (або повинен) виконувати на основі орієнтації на мову складання (конкретно x86 / x64 мова збірки) ?

Наскільки існують відмінності між мовою складання та іншими мовами, здається розумним здогадатися, що принаймні деякі з них є перевагами для інших мов. Чи може хтось вказати на конкретні недоліки мови складання та способи їх усунення?

Одним із конкретних прикладів може бути наявність персоналу. У кого-небудь виникли проблеми з пошуку досвідчених програмістів з мовної збірки, і якщо так, то які заходи можна вжити для усунення цієї проблеми?


Чому хтось сьогодні пише повний проект виключно мовою складання? Або ви питаєте про змішане мовне середовище, яким чином зазвичай використовується збірка сьогодні?
Мартін Вілканс

6
Зауважте, що є області non-[PC|web|enterprise]програмування, де складання є переважаючим або дуже популярним. Я кажу про мікроконтролери, промислову автоматику або робототехніку. Звичайно, в цих областях є і мови високого рівня, але ви бачите багато складання.
Mchl

1
@Mchl: Чи не ці проекти зроблені на C (або навіть C ++) і, можливо, збірки? Я б здогадався, що виключно використовувати збірку виключно нечасто.
Мартін Вілканс

1
Насправді в промисловій автоматизації ви можете зустріти цілу галузь мов, які просто не існують поза цим полем. Частина цього пов'язана з відмінностями в апараті (Гарвардська архітектура на відміну від архітектури фон Неймана, до якої ми звикли). а також з історії надання цих контролерів доступними для електриків, які використовувались для роботи з вимикачами та реле. Ось як LD ( en.wikipedia.org/wiki/Ladder_logic ) потрапляє в існування, що насправді є графічною інтерпретацією складання. Дивіться пов’язану статтю для деяких інших мов, що використовуються в автоматизації.
Mchl

2
У мене є невеликий інсталятор, який я підтримую зараз, що знаходиться в зборі. Писати в збірці (з API Windows) було так само просто, як і все інше, так чому б і ні? У мене також є інтерфейс перемикача кредитних карт, написаний у зборі. Почав з мов високого рівня, але в мене було так багато труднощів, щоб він працював, і я переписав на зборах, щоб краще контролювати всі біти, що протікають ...
Брайан Ноблеуч,

Відповіді:


25

Так - але не часто.

В одному сенсі збирання насправді є лише проксі-сервером для машинної мови, тому, звичайно, ви можете зробити все, що ви хочете, мовлячи з мовою вищого рівня.

Не завжди буває навпаки. Наприклад, кілька років тому я працював над процесором ARM, який мав кілька прикольних варіантів зміни графічних станів, які можна було використовувати лише в режимі ядра. У них не було б прямого еквівалента мовою вищого рівня, і я впевнений, що функція драйвера ядра Linux для зміни цих станів включала деяку збірку.

На мікропроцесорах ще в 80-х та на початку середини 90-х, якщо у вас був якийсь код, який потрібно було запустити дуже швидко, ви часто писали його в зборах, тому що кваліфікована людина може легко написати більш оптимізовану збірку, ніж більшість C компілятори можуть генерувати. Деякі програми раннього Mac були написані повністю на зборах, і вони були надзвичайно швидкими для епохи. Навіть не записуючи всю програму в зборі, я, безумовно, зробив свою частку оптимізації внутрішніх циклів в C через вбудовану збірку.

Але все почало змінюватися в середині 1990-х. Процесори почали включати такі функції, як конвеєрне планування та передбачення галузей, тому найбільш ефективне впорядкування інструкцій не завжди було очевидним для людини. Гірше того, що найефективніше замовлення варіювало серед процесорів однієї сім'ї; наприклад, компілятори PowerPC зазвичай пропонують цільові комутатори для серій G3, G4 та G5. Той самий об'єктний код буде працювати на всіх них, але він буде працювати на одній із цих серій більш ефективно.

Відтоді впорядкування інструкцій стало прогресивніше, особливо на більш складних архітектурно процесорах, таких як x86, PowerPC та SPARC. (Я вважаю, що ARM все ще досить простий.) Великим доданим фактором є розмір коду - код, який використовує більше циклів процесора, але може залишатися в кеш-процесорі, часто запускається набагато швидше, ніж код, який використовує меншу кількість процесорних циклів, але запускає повільну кількість пам'яті . Основні сучасні компілятори можуть зробити набагато кращу роботу з оптимізації коду на цих процесорах, ніж люди, які розумно можуть.

Я не знайшов вагомих причин писати збірку принаймні 15 років. Я думаю, що в 2011 році основними способами для складання були:

  • Щоб прочитати демпінг-накопичувачі при налагодженні, що я періодично роблю навіть сьогодні.
  • Робота з нестандартними функціями процесора, як, наприклад, цей прикольний графічний режим.
  • Набір компілятора - він забезпечує проміжний, читаний людиною формат для перекладу мов вищого рівня на.

1
І навіть ваша причина №3 починає зникати з компіляторів, націлених або на компілятор високого рівня, такий як LLVM, nanojit або libjit, або щось на зразок байт-коду JVM, CIL, Parrot, Rubinius або Neko.
Jörg W Mittag

Досі іноді потрібно зробити трохи SSE2 в роботі з графікою / відео. Хоча перший показник проти TBB / OMP!
Мартін Бекетт

@Martin: OMP є ортогональним для SSE2. (якщо припустити, що
правила

@rwong - але процес все-таки 1, вияви, що це занадто повільно. 2, сподіваємось, OMP / TBB прискорить його досить. 3, вдайтеся до написання SSE2 версії! (в порядку болю)
Мартін Бекетт

2
Як приклад, ціла частина американських гірок Тайкун була написана в зборі (за вирахуванням графіки, яка була зроблена в c) і була надзвичайно потужною для свого часу. Сотні індивідуальних ШІ діють незалежно, майже безперешкодно, коли в більшості гри було кілька спрайтів 16х16 пікселів, роблячи заздалегідь задані рухи. Мені завжди подобається використовувати це, щоб показати силу монтажу.
квітня

19

Спробуйте запрограмувати мікроконтролер на "невеликий вбудований" - пульт дистанційного автосигналізації, монітор акумулятора телефону, клавіатурний контролер, регулятор швидкості вентилятора без використання складання.

Поки кордон рухається, завжди є місце для збирання.

15 років тому ваш велосипедний одометр був механічним, мікрохвильова піч була в аналоговій схемі, пульт телевізора був у цифровій схемі, тюнер Sat TV був написаний у зборі, прошивка телефону в C та комп'ютерний аплет на Java.

7 років тому мікрохвильова піч була в цифровій схемі, телевізор дистанційного телебачення був записаний на зборах, телевізор-телевізор написаний на С, у вашому телефоні працює інтерфейс на базі Java.

Сьогодні велосипедний одометр є в цифровій схемі, мікрохвильова піч отримує прошивку в зборі, на пульті телевізора є вбудована програма на C, у телевізорі працює Java, у вас телефон Linux.

Хочете зробити ставку на наступні 7 років? Оскільки більше технологій набуває вдосконалених мов управління, збірка набуває нових підстав, і вона продовжує отримувати їх. Подивіться, що робиться сьогодні з механічними або аналоговими схемами. Ви можете зробити ставку на збірку там за кілька років. Ваш вимикач світла? Ваш водопровідний кран? Ваш чайник? Ваша зубна щітка?

Завжди буде новий прилад, прилад, іграшка, предмет звичайного життя, який буде запрограмовано в зборі.


3
гарна відповідь. Скільки людей вважають за краще платити вдвічі більше за те, що батареї вистачають наполовину довше лише тому, що в якості платформи для розробки використовується Java або щось таке? Подивіться на групову та всі інші способи, як люди намагаються заощадити гроші, погляньте на зелений рух, що економить ресурси. Навіщо сприяти збільшенню витрат і потужності на всіх вбудованих продуктах, щоб уникнути складання?
old_timer

1
Ви забули додати, що зараз на комп’ютерах працює Javascript (Chromebook). Для мене цей прогрес досить сумний, але правдивий.
Хоукен

З 2017 року ЦРУ потрапляє на ваш телевізор під управлінням Linux, сигнали від Java, які працюють на ключах автомобіля, можуть бути підробленими, кожен може підключити через WIFI до C ++ прошивку відеокамери фаллоімітатора , зубна щітка отримала віддалений експлуатацію в 2013 році, але, на щастя, все ж навушники з шумозаглушення, створене в монтажних роботах. Хоча збірка втрачає позиції в якості контролера верхнього рівня що - або , рухаючись в подкомпонентов замість цього. Ваші жалюзі вже керують Java, але ця контрольна плата Java розмовляє з жалюзі контролером двигуна, який працює зі складанням.
СФ.

8

Я ґрунтуюсь на цьому, перш за все, на моїх асемблерах - насамперед MASM, NASM та (меншою мірою) TASM. Деякі з пізніших версій TASM мали (мають?) Деякі функції для підтримки ОО, але я їх не дуже використовував і не намагаюся коментувати їх.

По-перше: більшість мов перемістилися до структури, яка принаймні дещо нагадує дерево. Незалежно від того, чи орієнтована на об'єкт, або на об'єкті, або саме те, що стосується між різними частинами системи, є зовсім небагато. Існує також зовсім небагато, щоб "захистити" одну частину системи від випадкового "втручання", але інших частин (навіть якщо захист, як правило, можна обійти). Навпаки, мова складання є відносно «плоскою» - більшість взаємозв'язків між кодом (та даними) в різних частинах системи встановлюються насамперед документацією та меншою мірою називанням конвенцій.

Результатом цього є те, що часто набагато простіше парувати код набагато щільніше, ніж було б ідеально. Вимоги, які спричинили вибір мови збірки для початку (більш висока продуктивність, менший розмір тощо), часто також це винагороджують - минаючи схвалені інтерфейси, і таким чином ви часто можете отримати код, який менший і швидший (хоча зазвичай не багато краще в будь-якому вимірі). Мова та інструменти самі по собі роблять набагато менше, щоб обмежити те, що ви робите (добре чи погано), що покладає набагато більше навантаження на менеджерів для запобігання проблем. Я б не сказав, що це якісно інше, але в кількісному відношенні воно є - тобто керівництво повинно працювати над тим, щоб запобігти проблемам в будь-якому випадку, але у випадку мови монтажу воно зазвичай приймає більше (і часто жорсткіші) рекомендації щодо того, що є чи ні " t прийнятно.

Пом'якшення цього питання значною мірою є предметом більш ретельних вказівок, більш керівних принципів більш досвідченого персоналу та більш конкретних, ретельно застосовуваних конвенцій про іменування.

Кадровий склад - це чимала проблема. Однак проблеми, з якими я стикався, де не в першу чергу ті, які я очікував. Знайти хлопців, які мали трохи "винищувальної роботи", які із задоволенням заскочили у мовний код збірки, було досить просто. Більшість зробили цілком розумну роботу, незважаючи на майже повну відсутність попереднього досвіду використання мови складання.

Складність, з якою я стикався, полягала в пошуку більш старшого персоналу - людей, які могли тримати проект хоча б певним чином, і не були повністю звикли до мов, які б забезпечували (і значною мірою виконували) вказівки, необхідні для правильного збереження коду. ремонтопридатним і зрозумілим.

Озираючись назад, я, можливо, був / спричинив найбільшу проблему в цьому відношенні. Я бачу два джерела проблем зі свого боку. По-перше, до моменту проекту, про який я замислююсь, я кодував головним чином мови вищого рівня досить довгий час, і використовував лише мову монтажув крайньому випадку. Як такий, коли я його використовував, майже кожен можливий трюк для отримання продуктивності був не лише чесною грою, а й очікуваною. По-друге, тоді, коли я працював над деякими системами, написаними повністю (або в першу чергу) мовою складання, це було під деякими досить залізними керівниками проектів. У той час я був відносно молодим і відверто обурювався тим, як вони керували справами, тому прагнув робити навпаки. Зрештою, те, що вони робили, насправді було важливим, а не зробленим лише тому, що вони були старими і негнучкими (що, я впевнений, було, як я бачив речі в той час).


У мене є приємні спогади про збирачів TASM та Orca / M =)
Патрік Х'юз

0

на мою думку, складання як платформа для розвитку може не бути актуальною для щоденного використання. Основна причина такої думки може полягати в тому, що кількість обчислювальної потужності, яка вилучається із заданого процесу, порівняно з кількістю часу, необхідного для оптимізації того ж самого процесу, зазвичай не коштує часу та енергії (для цього є конкретний термін .. це звучить як людина / година чи щось таке. Попросіть редагувати, якщо ви знаєте, про що я говорю ..) є очевидні винятки, згадані вище, але, що стосується основного програмування, збирання не використовується часто.

про це йдеться .. збірка є актуальною і сьогодні, коли вивчає програмування в контексті інженерних програм програмного забезпечення, вона вчить, як виглядає і як веде себе мова програмування низького рівня. Я продовжу і наведу приклад того, що ми використовуємо на уроці в наші дні. ми використовуємо збірку pep / 8, розроблену Стенлі Уорфордом (Університет Пеппердіна, США) та її програмне забезпечення з відкритим кодом, наведене тут . в основному використовується, тому що він віртуалізує процесор і показує вміст пам'яті під час переходу коду під час роботи (досить корисно для навчання, налагодження).

Отже, на мою думку, залежно від вашої збірки використання може бути або не бути актуальною.


0

Я думаю, ви запитуєте "чи вантажні автомобілі все ще актуальні, якщо у нас є машини?". Я маю на увазі, збірка має дуже широкий спектр застосувань, але не такий широкий, як програмування високого рівня, так само, як вантажівки набагато менше, ніж автомобілі.

У таких сферах, як оптимізація алгоритмів, ви можете безпосередньо використовувати регістри процесорів для вдосконалення алгоритмів обробки зображень / відео.

У таких сферах, як криптографія, ви можете використовувати її так само.

У нових процесорах з новою архітектурою (пам’ятайте, коли був випущений мікропроцесор Cell), напевно, їм довелося писати завантажувачі завантажувачів і так далі в зборі (і зі старими процесорами теж, але давно використовувані процесори мають дуже стабільну основу і важко вдосконалити це).

І ще багато прикладів можна навести, тому це залежить від сфери, в якій ви зосереджені, якщо ваша компанія присвячена розробці веб / мобільних пристроїв, дуже ймовірно, що вам це не потрібно, але якщо ваша компанія зосереджена на мікроконтролерах, вбудовані системи тощо, цілком ймовірно, що вам це потрібно.

І наявність персоналу, це залежить від того, я думаю, що якщо ви запитаєте в Intel, Qualcomm, ... вони повинні мати великий список програмістів на зборах (це як якщо ви запитаєте на своєму робочому місці "скільки водіїв вантажних автомобілів тут?" думайте не надто, але це не означає, що їх немає в інших місцях. Що станеться, якщо ви запитаєте "скільки водіїв автомобілів тут?").


-3

Якщо ви дійсно хочете дізнатися, чому навчитись складанню - найкраща ставка. Ось причини.

  1. Не потрібно вчитися складанню, якщо ви збираєтеся займатися програмуванням на візуальних базових і тих, що займаються MS.
  2. Не потрібно вчитися складанню, якщо вам не доведеться робити жодних серйозних пристосувань для мікроконтролерів.
  3. Не потрібно вчитися складанню, якщо у вас є нерухомість пам'яті під час роботи над мікроконтролером (Бог допомагає вам при взаємодії пам'яті з мікроконтролером)
  4. Не потрібно вчитися складанню, якщо ви не хочете, щоб Бог любив владу над мікроконтролером / мікропроцесором.
  5. Не знати монтажу - це як знати айсберг. Ви можете бачити 25% від вашої та мікроспроможності, і 75% ви ніколи не дізнаєтесь і не зрозумієте
  6. Спробуйте запустити ОС Kolibris, повністю написану на Асамблеї !!! Ви бачили ОС, яка завантажується менше ніж за 5 секунд, і програма починає працювати з 1 секундою клацання миші.
  7. Сучасні компілятори мають функції загального призначення в бекенде, і, отже, генерований кінцевий код був би важким порівняно з збіркою.

Асамблея - це як Наташа Романов з Месників. Це шарм і магія. По-перше, це вкусить вас, але повірте, ви ніколи не забудете смак.


1
це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у попередніх 5 відповідях
гнат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.