Чи варто намагатися займатися проблемами в зборах? [зачинено]


9

Я розглядав Проблема проекту Euler 48 :

Серія, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.

Знайдіть останні десять цифр ряду, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .

У Python я можу це зробити одним рядком:

sum((x**x for x in xrange(1,1001))

Але еквівалент цього монтажу складе 100 рядків і справжній виклик.

Чи повинен я робити деякі з цих головоломок на зборах, щоб отримати деяке розуміння програмування низького рівня та зрозуміти, як працює комп’ютер насправді?


2
Якщо ви не знаєте, як працює пам'ять, як можна очікувати, що вона може працювати з такими темами, як покажчики? Якщо ви не розумієте, як працює комп'ютер та операційна система, як можна програмувати програму?
Рамхаунд

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

Якщо ви не отримаєте повну вивірку покажчиків, ви виявите, що це дещо серйозний недолік.
Девід Торнлі

3
Або ваша лінія Python обчислює x ^ 2 для x в 1..1000 (замість x ^ x для x в 1..1000), або python - це навіть частіше, ніж я думав. :)
Інго

Чи є *в Python функція "підняти до сили" ?

Відповіді:


1

Поза навчальним складанням, я вважаю, що вивчення того, як складається мова низького рівня, як C, є дуже цінним. Тож моя відповідь - так, але я знову, мабуть, упереджений, тому що мені подобається програмування низького рівня.

Наприклад, просто розуміння того, як складаються прості заяви. Наступна функція,

int func(int val)
{
  int num = val * 5;
  return num;
}

... стає (принаймні, цікавий біт):

movl    %edi, -20(%rbp)
movl    -20(%rbp), %edx
movl    %edx, %eax
sall    $2, %eax
addl    %edx, %eax

Цей код бере аргумент із стека (val, параметр у функцію), зміщує його вліво на 2 місця (помножимо на 2 ^ 2 або 4) і потім додає вихідне значення до результату. Кінцевим результатом є множення на 5. Такий приклад ілюструє ряд речей, про які слід пам’ятати, наприклад оптимізацію компілятора. Замість того, щоб викликати інструкцію безпосередньо помножити на 5, вона зміщує два місця на множення на 4, а потім додає початкове значення. Я знайшов подібні приклади, які значно покращили моє розуміння речей на нижчому рівні.

Створити вихід асемблера з gcc за допомогою -Sпараметра. Однак майте на увазі, що результати залежать від компілятора та рівня оптимізації.

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


11

Напевно, не потрібно, щоб насправді вміти писати асемблер (більшість з яких є деталями ініціалізації та умовами виклику для вашої системи).

Варто розібратися з деякими, якщо ви намагаєтесь налагодити щось без джерела.

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


Насправді, деякі відносно розумні реалізації не можуть зробити for i in range(1000000): s = s + '.'(не набагато) гіршими, ніж "оптимізовані" версії мого повторного використання s. Аналогічно, кілька інших розробок неправдиві, що є розумним припущенням із знаннями C та припускаючи наївне здійснення. Але загалом це корисніше, ніж шкідливо. Просто майте на увазі, що мовні реалізації іноді розумніші за вас;)

2
@delnan - Мені просто потрібен короткий приклад того, що щось, що виглядає нешкідливим у Java / C #, може бути дуже дорогим для кремнію. Особливо я натрапив на багато людей, які вважають, що великий розподіл пам'яті та копіювання є миттєвим.
Мартін Бекетт

Я ненавиджу вірити , що delnan :-)
Nishant

5

Хороше питання. Навчання Асамблеї , безумовно, добре і варто докласти зусиль.

  1. Таке розуміння на низькому рівні буде корисним у розробці вбудованого програмного забезпечення
  2. Рефакторинг на низькому рівні
  3. Це допоможе вам ефективно використовувати налагоджувач
  4. Дайте зрозуміти розібраному коду, щоб допомогти в таких речах, як печери коду

2
Довелося шукати кодові печери. Я їх дуже багато використовую, але ми зараз їх називаємо "Обходи". research.microsoft.com/en-us/projects/detours
ProdigySim

1

Так і ні.

Хоча це правда, що це дозволить вам краще зрозуміти, що робить ваш код, і чому деякі речі - це лише погана ідея, про яку ви повинні подумати.

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

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


1

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


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

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

1

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

(Коли я говорю про те, що програма хоста записується в HLL, я маю на увазі C або ObjC, коли я намагаюся вивчити x86_64 asm, і BASIC, коли я працюю на Z80, 6502 і 6809 asm).

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