Асамблея як перша мова програмування? [зачинено]


12

Наскільки гарна ідея, на вашу думку, було б навчити людей збиратись (якийсь варіант) як першої мови програмування? Це займе набагато більше зусиль, ніж вивчення, наприклад, Java або Python, але можна було б добре розуміти машину більш-менш з "дня програмування" (принаймні порівняно з багатьма мовами вищого рівня). Що ти думаєш? Чи реальна ідея, принаймні для тих, хто готовий докласти додаткових зусиль? Переваги і недоліки?

Примітка: я не вчитель, просто цікаво


5
Я думаю, що це краще підходить людям, які вивчають інформатику, а не інженерію та розробку програмного забезпечення
Імран Омар Бухш

1
@Imran Я погоджуюся в принципі, але кожна програма коледжу, яку я можу придумати, має ступінь з інформатики, які заробляють люди, які в основному продовжують працювати в програмуванні. (Я припускаю, що це питання стосується серйозної основи для кар’єри програмування, а не, наприклад, про опитування середньої школи)
G__

7
@Imran - Я виявив, що це трохи дивно. Інформатика, напевно, більше схиляється до математики та теорії? Більше цікавлять набори, абстрактні алгебри та асимптотичні позначення, ніж у біт-перекруті та написанні нескінченних повторень руху-бла-бла.
Steve314

2
Інформатика, безумовно, має тематику рефератів, але в деяких аспектах вона також дуже "близька до апаратних засобів". Я колись відвідував LICS, конференцію з інформатики. Я пам’ятаю, в ній були статті про локалізацію даних різних алгоритмів сортування, які, на мою думку, дають теоретичні основи для вивчення практичної ефективності алгоритмів. Що стосується збірки, я особисто вважаю , це має деяку схожість з деякими теоретичними моделями обчислень (машини Тьюринга, лічильник машини ...)
Joh

1
Кожен програміст повинен хоча б прочитати про те, як працює збірка, IMO. Це дало мені багато розуміння, і я, як правило, не так близько до хрому, як ви можете отримати. Мова зборів Джеффа Дантемана «Крок за кроком» - це цікаве читання для початківців.
Erik Reppen

Відповіді:


14

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

Я пам’ятаю, що мої курси раннього програмування викладалися в «Схемі», і я в основному був розчарований, що не міг легко просто скомпілювати файл до .exe і «запустити» свою програму (я вважав, що MS Visual Basic закінчився програмуванням) Тільки через роки я дійсно зрозумів, яким потужним інструментом я грав. Я думаю, що я би це більше оцінив і отримав би ці уроки краще, якби я мав якийсь ранній досвід чогось трохи більш прагматичного.


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

1
@Whatsisname +1, це зробить приємну вражаючу демонстрацію, якщо це можна зробити, не захоплюючись електронікою. Звичайно, це можна зробити і з мовою вищого рівня, тобто злом Roomba, якби "драйвер" був чорним ящиком, забезпеченим інструктором.
G__

1
Дуже багато нових програмістів були натхненні складанням на VIC20, C = 64 та подібних машинах.
Гай

2
@Gaius Не спочатку! Ви включаєте ці машини і перебуваєте в перекладачі. Асамблея приходить після неабиякого досвіду та досягнень меж того, що може зробити базове ...
G__

1
@whatsisname, але ви можете використовувати щось на зразок Arduino для блимання світлодіодів та переміщення двигунів, не вивчаючи складання
Кен Лю

12

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

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

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


3
Як піаніст, мені, звичайно, було б цікавіше застрибнути прямо з якимись піснями, але щоб стати пристойним, потрібно практикувати арпеджіо, ваги тощо. І тоді робити справді новаторські речі (граючи з «підготовленими фортепіано» та подібне) вам потрібно знати, як працює фортепіано зсередини. Все як добре ви хочете знати своє ремесло.
Іван

10
@John в CashCommons: погана аналогія. Починати з асемблера - це як запустити молотки, клавіатуру, ваги та демпфери. А потім перейдемо до теорії музики (коло п'ятих), щоб пояснити чорно-білого бізнесу. Потім переходимо до ще більшої теорії музики, перш ніж грати на шкалі.
S.Lott

3
@ S.Lott: Ehhhhh ... не зовсім це купую. Я можу написати програму типу "привіт світ" у зборі, не переживаючи про транзистори. Не потрібно бути дизайнером чіпів, щоб бути програмістом. Знання, про які ви говорите, були б основою для побудови чи ремонту фортепіано, яка лише пов'язана з грою на гри.
Іван

3
@John в CashCommons: "будівництво або ремонт піаніно". Це аналогія з асемблером. Тривіальний "привіт світ" в асемблері можна записати, але це лише заклики API OS - фактично ігнорування всіх жахливих деталей асемблера. Для написання драйверів вводу / виводу асемблер є важливим. Так само, як молотки та демпфери стосуються будівництва та обслуговування, а не виконання.
S.Lott

1
@ S.Lott: Хмммм ... Я думаю, конкретний набір інструкцій залежить від чіпа, чи не так? Гарна думка.
Джон

7

Я не думаю, що це страшна ідея, але наскільки складною програмою ви збираєтесь дати цих студентів? Складання займає набагато більше роботи. Можливо, добре почати їх із найпростіших речей, а потім перенести їх на щось легше працювати, як тільки вони отримають вдячність за роботу на нижчому рівні. Студенти-початківці іноді отримують ідеї в голові, вони кодують наступний ореол, або MS Office, або AutoCAD або щось подібне, і коли вони побачать, як багато роботи переходить на просту мову складання, вони можуть злякатися, тож дайте зрозуміти що є кращі речі, ніж збірка, а потім перемістіть їх до того, як тільки вони побачили ці поняття. Ви також можете спробувати викладати асамблей одночасно з чимось іншим, як C.

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

Це може спрацювати добре, якщо це зробити правильно. Тільки будьте обережні ...


+1 за складність проблемної речі. Моє голосування було б протиставити кілька реалізацій асемблера проти мовних програм більш високого рівня. І, можливо, використовуйте, наприклад, асемблер 68000 в емуляторі, а не x86 - я не знаю, як еволюціонував асемблер x86 / amd64, але 68000 був набагато чистішим та легшим для роботи, ніж тоді 8086. Також, можливо, варто подумати - асемблер віртуальної машини, такий як ви можете отримати з LLVM. Не те саме, що справжній асемблер, але він поділяє безліч подібних принципів і, мабуть, більш актуальний.
Steve314

Навчання ASM одночасно з C звучить як дуже гарна ідея
Анто

@ Steve314: Я не працюю на асемблері x86, але, схоже, це стає складніше, ніж 8086.
Девід Торнлі

@David - Я очікую, що так, але, можливо, у деяких відношеннях стало простіше. За 8086 днів діапазон доступних режимів адреси залежав від конкретного регістра, який ви використовували, а також від інструкції. На 68000 було (для більшості цілей) регістри даних та регістри адрес, причому кожен тип використовувався досить рівномірно, без жодних клопотів - це - не-індекс - або - база-вказівник - чи що. З часом, може, це змінилося? У 68000 також було більше регістрів, що економило на деякій переміщенні в пам'ять. У будь-якому випадку вам не потрібно вивчати речі SIMD, щоб отримати основні принципи асемблера.
Steve314

@David - Я не можу повірити, що забув (репресовано) сегментовану адресацію. Це було досить погано мовою високого рівня. Зараз знову є сегментоване адресація, але інша річ, що стосується віртуальної пам’яті тощо, про те, що програмістам на рівні додатків не потрібно турбуватися.
Steve314

7

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

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


7

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

Це мені нагадує, коли я навчився керувати автомобілем. Моя мама наполягала

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

Причиною того, що вона не хотіла, щоб я відволікався більше, ніж мені потрібно, і все.

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

Більше половини мого класу зазнав невдачі в нашому монтажному класі, і це була група людей, які в той час вважали себе знаючими програмування протягом 2+ років.

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


1
Я думаю, що це гарна і обґрунтована порада. У якийсь момент важливо бути обізнаним про біти та байти, а також, що процесор робить з ними, але починати з них - це дуже марно, бо у нас є такі мови, як рубін і пітон, які ідеально підходять для початківців і підтримують чудові принципи інженерії програмного забезпечення.
davidk01

1
Ви розглядали можливість того, що викладач робив не менш зіркове завдання викладання мовного класу монтажу?
Джон Р. Стром

Я думаю, що він зробив дивовижну роботу.
CrazyPenguin

3

Чи реальна ідея, принаймні для тих, хто готовий докласти додаткових зусиль?

Немає

але можна було б добре розуміти машину

Чому це вигідно? Чи можете ви надати приклад чи підказку, як це може мати будь-яку цінність?

Переваги і недоліки?

Переваги: ​​Немає.

Недоліки:

  • Скупчення випадкових дрібниць про прапори та стани та регістри та складні схеми адресації пам’яті та пристроїв вводу / виводу та DMA та переривань та циклів та ін. Жодне з яких не допомагає зрозуміти сучасні мови на основі ВМ та обчислення.

  • Відключення від фактичного вирішення проблем, до яких комп'ютери реально застосовані.

  • Розлучення з кінцевими споживачами та практичні дані та проблеми обробки, які вони потребують вирішення.

  • Потрібний пояснення пояснень машинної та віртуальної машини, компілятора та інтерпретатора, а також усієї черепахи, що тримає світ.

  • Багато детального "це фізична реалізація об'єкта" мовою вищого рівня, до якої вони в кінцевому підсумку.

  • Багато детального "це, як функції методу розсилаються" мовою вищого рівня, до якої вони з часом потрапляють.

  • Багато пояснень "це не стосується 80386, але стосується чіпсет 80586".

  • Дуже багато дзвінків API OS для того, щоб змусити програму ASM робити все, що здається схожим на користь комусь.

Сенс першої мови програмування - не оволодіння чіпсетом.

Суть першої мови програмування - це

  1. Зрозумійте, як думати про обчислення.

  2. Зрозумійте, як зробити корисну обробку даних.

  3. Зрозумійте, як щось зробити. Дизайн - код - тест.


1
@ S.Lott - Звичайно, це не суть мого початкового запитання, але це може бути вигідним, перш ніж перейти на мови вищого рівня. Не зрозумійте мене неправильно, ви зробите правильну думку.
Анто

3
-1 Дуже багато ваших недоліків я вважаю перевагами. Краще знати, як працює низький рівень, перш ніж використовувати його зверху. Основи важливі.
Орлінг

1
Ассемблер як мова програмування набагато краще піддає вам структуру даних, логіку та основи більш низького рівня, ніж мови більш високого рівня. В обох є місце, асемблер цілком може бути простішим для розуміння, ніж мови вищого рівня, за умови, що ви не намагалися досягти нічого надто складного. Люди спочатку не повинні намагатися робити складні речі.
Орблінг

4
Перевага асемблера полягає в тому, що він демонструє, як працює справжній комп'ютер. Ти знаєш. Те, що все насправді працює .
Пол Натан

1
@ S.Lott - Ні, але це означає, що ви можете дуже добре використовувати більшість старих знань, які ви зібрали, і додавати нові знання з часом. Подивіться, мови високого рівня, такі як Python, із часом одержують нові версії, але старі знання все ще використовуються (і насправді Python зламав зворотну сумісність з v3)
Анто,

3

Якби мені було доручено розробити навчальну програму, я мав би два курси одночасно виконувати перший семестр: asm + основна комп'ютерна організація / архітектура та курс, заснований на SICP, заснований у схемі. Другий семестр буде орієнтований на структури даних та елементарні алгоритми в схемі.

Другий рік буде цілорічним проектом із використанням одного з Delphi, C ++ або C #, орієнтованого на сучасний дизайн програмного забезпечення (дизайн OO, деякий функціональний дизайн, інженерія програмного забезпечення, контроль версій тощо).

Ефект повинен полягати в тому, щоб дати інтенсивне обґрунтування як абстрактного, так і практичного, що призведе до поглиблених курсів на третьому та четвертому курсах.


3

Я звик до вступних занять з інформатики ТА, і вважаю це поганою ідеєю.

  1. Асамблея використовує як логіку (якщо це перейти до цього), так і дуже складні переклади між поняттями і числами. Студенти Intro CS часто борються лише з логікою (цикли, якщо / ще, булеві вирази), і їм справді потрібно просто розібратися з цим, перш ніж вони також переймаються, які числа означають, які логічні вирази. Використання мов вищого рівня абстрагує цю логіку для студентів, які раніше не мали жодних підстав думати про це.
  2. Вступні CS-класи не обов'язково приймають лише спеціалісти CS, які продовжуватимуть роботу з CS. Часто їх приймають і інші інженерні спеціальності та не-спеціалісти, які просто «гастролюють» цікавим предметом для факультативу. Асамблея чудово підходить для фундаментальних завзятіх, відданих студентам CS, але не дає дуже хорошого огляду того, що програмування часто є для студентів, які вважають мажором, або які ніколи не збираються взяти мажор, але хочуть ознайомлення з полем ; а також не є страшно корисним самостійно в більшості сфер.
  3. Мови вищого рівня роблять серцевину фактичної роботи з програмування більш прозорою. Асамблея зачіпає основні основоположні теми - основні концепції пам'яті, основні концепції продуктивності тощо -, але насправді не вдається створити ретельний, читабельний дизайн, що важливіше в ці дні IMO. Студенти раннього віку, здається, часто мають старомодні ідеї "Реальні програмісти пишуть код, з ким більше ніхто не впорається", а викладання мови вищого рівня допомагає навчити, що кодування є спільним завданням, а не просто геніальним.

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


Дуже добре сказано - я згоден. На першому курсі потрібно дійти до суті, показати цілісність корисності навичок, що вивчаються, і розпалити уяву: "Блажіть! Я можу програмувати? Тепер що ще я можу зробити з цією новою майстерністю ..." Погодьтеся також, що найкращий час для мови складання - це після однієї мови вищого рівня. Це спонукає дивитися "під капотом" на те, як комп'ютер насправді розуміє речі вищого рівня. Вперше побачення мови мовлення після мови вищого рівня залишає ще один потужний вплив: студент стикається з електронікою, мікросхемами, датчиками тощо
Асад Ебрагім

3

Асамблея була моєю другою мовою, відразу після BASIC. Однак, коли я вчився, це був інший час. У My Commodore 64 були доступні інші мови, але якщо ви хотіли, щоб щось здавалося швидким, або хотіли робити кілька справ за один раз, вам потрібно було вивчити мову монтажу та роботу з перервами. Графічна середовище Операційна система (GEOS), яка давала Commodore віконну систему, також була вся збірка. Це був за великим рахунком найкращий API збірки, який я коли-небудь бачив. Це була і єдина платформа, яку я використовував, де можна було викласти свій код. Правильно, ви можете використовувати курсив та різні розміри шрифту - те, що виявилося корисним для читання коментарів.

Я багато дізнався про те, як працював Commodore, але чіп Motorolla мав дуже простий набір коду. Не менш складно тримати менше 255 опкодів окремо один від одного. Я не зміг донести свій досвід роботи з мікросхемою Motorolla 6510 до програмування для Intel 8086. Чіпи та архітектура системи були занадто різними. Я думаю, у мене виникли б ті ж проблеми, коли йти до мікросхеми Motorola 68000 Amiga.

Коротше кажучи, я мушу від усієї думки не погодитися з тим, хто каже, що Асамблея повинна бути хорошою першою мовою. Ось чому:

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

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


1

Я зібрався на старшому курсі середньої школи. Я вже брав заняття на Java, Pascal, C і C ++, і не мав жодного з них, і я дуже втягся в Асамблею - був єдиним, хто брав клас за програмою дистанційного навчання в коледжі громади, взяв мене місяць-два, перш ніж хтось навіть міг змусити компілятора працювати на мене.

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


0

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


0

Я думаю, що мова монтажу має сенс лише в тому випадку, якщо ви зосередьтесь на таких речах, як:

  • Методи управління пам’яттю
  • HW IO (особливо проблеми, пов'язані з термінами та результатами)
  • Особливості процесора - зокрема, функції безпеки

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

Я хотів би когось зацікавити мовою вищого рівня. Потім викладайте С ++; потім складання з акцентом на те, як компілятори C ++ генерують код складання. Розуміння v-таблиць та інших можливостей мови вищого рівня допоможе розробнику задуматися про те, як справді працюють мови, ніж просто подавати інформацію під "магією".

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