Сборка как первый язык программирования? [закрыто]

12

Как вы думаете, насколько хороша идея научить людей ассемблеру (какой-то вариант) в качестве первого языка программирования? Это потребовало бы гораздо больше усилий, чем изучение, например, Java или Python, но можно было бы лучше понять машину более или менее с «первого дня программирования» (по крайней мере, по сравнению со многими языками более высокого уровня). Как вы думаете? Это реалистичная идея, по крайней мере, для тех, кто готов приложить дополнительные усилия? Преимущества и недостатки?

Примечание: я не учитель, просто любопытно

Anto
источник
5
Я думаю, что он лучше подходит для людей, изучающих информатику, а не разработку программного обеспечения
Имран Омар Бухш
1
@Imran Я согласен в принципе, но каждая программа на уровне колледжа, о которой я могу думать, имеет степени в области компьютерных наук, которые получают люди, которые в основном продолжают работать в области программной инженерии. (Я предполагаю, что этот вопрос о серьезной основе для карьеры программиста, а не, например, об опросе в старшей школе)
G__
7
@ Имран - я обнаружил, что это немного удивительно. Информатика, безусловно, больше склоняется к математике и теории? Больше интересуются множествами, абстрактными алгебрами и асимптотическими обозначениями, чем потрохами и написанием бесконечных повторений движения бла-бла-бла.
Steve314
2
Информатика, безусловно, имеет абстрактные темы, но в некоторых отношениях она также очень «близка к аппаратному обеспечению». Однажды я посетил конференцию по компьютерным наукам LICS. Я помню, что в нем были статьи о локальности данных различных алгоритмов сортировки, которые, как мне кажется, дают теоретические основы для изучения практической эффективности алгоритмов. Что касается сборки, я лично нахожу, что она имеет некоторое сходство с некоторыми теоретическими моделями вычислений (машины Тьюринга, встречные машины ...)
Joh
1
Каждый программист должен хотя бы прочитать о том, как работает сборка, IMO. Это дало мне много понимания, и я, как правило, не настолько близко к хрому, как вы можете себе представить. «Языки ассемблера» Джеффа Дюнтемана «Step by Step» - это увлекательное чтение для начинающих
Эрик Реппен

Ответы:

14

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

Я помню, что мои ранние курсы по программированию преподавались на Scheme, и я был в основном разочарован тем, что не мог просто скомпилировать в .exe и «запустить» мою программу (я думал, что MS Visual Basic - это конец программирования). Лишь спустя годы я действительно осознал, каким мощным инструментом я играл. Я думаю, что я оценил бы это больше и усвоил бы эти уроки лучше, если бы у меня был некоторый ранний опыт в чем-то немного более прагматичном вначале.

ГРАММ__
источник
20
Я видел много студентов, которые были гораздо более поражены миганием светодиода и движением двигателя.
whatsisname
1
@Whatsisname +1, это было бы замечательным впечатляющим демо, если это можно сделать, не увлекаясь электроникой. Конечно, это можно сделать и на языке более высокого уровня, например, на взломе Roomba, если бы «водителем» был черный ящик, предоставленный инструктором.
G__
1
Множество новых программистов были вдохновлены сборкой на VIC20, C = 64 и подобных машинах.
Гай
2
@ Гай Не сначала! Вы включаете эти машины, и вы в основном переводчик. Сборка начинается после того, как накоплен достаточный опыт и достигнут предел того, что может сделать базовый ...
G__
1
@whatsisname, но вы можете использовать что-то вроде Arduino, чтобы мигать светодиодами и двигать двигатели, не изучая сборку
Кен Ли
12

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

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

Что звучит интереснее: написание быстрого прототипа для простой игры и игра с вариациями алгоритма, или борьба с регистрами и вещами низкого уровня?

Андрес Ф.
источник
3
Будучи пианистом, я бы, конечно, посчитал более интересным сразу же начать играть с некоторыми песнями, но чтобы стать приличным, нужно попрактиковаться в арпеджио, гаммах и т. Д. А потом делать действительно революционные вещи (играть на «подготовленных фортепиано» и вроде) нужно знать, как пианино работает изнутри. Это все, как хорошо вы хотите знать свое ремесло.
Джон
10
@ Джон в CashCommons: плохая аналогия. Начинать с ассемблера - все равно, что начинать молотки, клавиатуру, гири и амортизаторы. А затем перейдем к теории музыки (круг пятых), чтобы объяснить бизнес с черными и белыми ключами. Затем перейдем к еще большей теории музыки, прежде чем играть в масштабе.
S.Lott
3
@ S.Lott: Эххххх ... не совсем купить это. Я могу написать программу типа «привет мир» в сборке, не беспокоясь о транзисторах. Не нужно быть чип-дизайнером, чтобы быть программистом. Знания, о которых вы говорите, послужат основой для создания или ремонта пианино, которое лишь нарочно связано с игрой на нем.
Джон
3
@Джон в CashCommons: «сборка или ремонт пианино». Это аналогия с ассемблером. Тривиальный «привет мир» на ассемблере может быть написан, но это всего лишь вызовы OS API - фактически игнорируя все ужасающие детали ассемблера. Для написания драйверов ввода / вывода необходим ассемблер. Точно так же молотки и амортизаторы предназначены для строительства и обслуживания, а не для выполнения.
S.Lott
1
@ S.Lott: Хммммм ... Я думаю, конкретный набор команд зависит от чипа, не так ли? Хорошая точка зрения.
Джон
7

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

Кроме того, какой язык ассемблера? Я немного напоминаю, что в MIPS было относительно легко работать, и я думаю, что он работает в эмуляторе, поэтому нет опасности создать проблемы для реальной машины, хотя инструменты могут быть лучше, чем сейчас.

Это может хорошо работать, если все сделано правильно. Просто будь осторожен...

FrustratedWithFormsDesigner
источник
+1 за сложность проблемы вещь. Мой голос должен был бы противопоставить несколько реализаций ассемблера и реализации языка более высокого уровня. И, возможно, использовать, например, ассемблер 68000 в эмуляторе, а не в x86 - я не знаю, как эволюционировал ассемблер x86 / amd64, но 68000 был намного чище и с ним проще работать, чем в 8086 году. Также возможно стоит подумать - ассемблер виртуальной машины, такой как вы можете получить с помощью LLVM. Не то же самое, что настоящий ассемблер, но в нем много схожих принципов, и, вероятно, он более актуален.
Steve314
Обучение ASM одновременно с C звучит как хорошая идея
Anto
@ Steve314: я не знаком с х86 ассемблером, но похоже, что он стал более сложным, чем 8086.
Дэвид Торнли
@ Дэвид - я ожидаю, но, возможно, в некоторых отношениях все стало проще. В течение 8086 дней диапазон доступных адресных режимов зависел от того, какой конкретный регистр вы использовали, а также от инструкции. На 68000 были (для большинства целей) регистры данных и адресные регистры, причем каждый тип использовался довольно равномерно, без проблем типа «это индекс» или «базовый указатель или что». Со временем, может быть, это изменилось? 68000 также имел больше регистров, экономя на некотором перемещении входящей и исходящей памяти. В любом случае, вам не нужно изучать SIMD, чтобы получить основные принципы ассемблера.
Steve314
@ Дэвид - я не могу поверить, что я забыл (подавил) сегментированную адресацию. Это было достаточно плохо на языке высокого уровня. Теперь снова есть сегментированная адресация, но это другая вещь, касающаяся виртуальной памяти и т. Д., О которой программистам уровня приложений не нужно беспокоиться.
Steve314
7

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

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

Билл Ящерица
источник
7

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

Это напоминает мне о том, когда я научился водить. Моя мама настояла

Учитесь на автоматическом автомобиле, пока не обретете уверенность, и тогда вы сможете водить наши автомобили с ручным управлением.

Причина в том, что она не хотела, чтобы я отвлекался на большее, чем мне нужно, все сразу.

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

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

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

CrazyPenguin
источник
1
Я думаю, что это хороший и здравый совет. В какой-то момент важно знать о битах и ​​байтах и ​​о том, что процессор делает с ними, но начинать с них - чрезвычайно расточительное начинание, потому что у нас есть такие языки, как ruby ​​и python, которые идеально подходят для начинающих и поддерживают отличные принципы разработки программного обеспечения.
davidk01
1
Рассматривали ли вы возможность того, что инструктор сделал менее чем звездную работу по обучению на языке ассемблера?
Джон Р. Штром
Я думаю, что он проделал потрясающую работу.
CrazyPenguin
3

Это реалистичная идея, по крайней мере, для тех, кто готов приложить дополнительные усилия?

нет

но можно было бы хорошо разбираться в машине

Почему это выгодно? Можете ли вы привести пример или подсказку о том, как это может иметь какое-либо значение?

Преимущества и недостатки?

Преимущества: нет.

Недостатки:

  • Беспорядок случайных пустяков о флагах и состояниях и регистрах и сложных схемах адресации памяти и устройствах ввода-вывода и DMA и прерываниях и тактовых циклах и прочем. Ни один из них не помогает понять современные языки и вычисления на основе виртуальных машин.

  • Отключение от фактического решения проблем, к которым фактически применяются компьютеры.

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

  • Бесполезный поток объяснений о машине, виртуальной машине, компиляторе и интерпретаторе, а также о всей совокупности черепах, удерживающих мир.

  • Много подробного «это физическая реализация« объекта »» на языке более высокого уровня, к которому они в итоге приходят.

  • Много подробного «это то, как функции метода отправляются» на языке более высокого уровня, к которому они в конечном итоге приходят.

  • Многочисленные объяснения «это не относится к 80386, но применимо к чипсету 80586».

  • Многие низкоуровневые API-вызовы ОС заставляют программу ASM делать все, что кажется кому-то полезным.

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

Смысл первого языка программирования заключается в

  1. Понять, как думать о компьютерах.

  2. Понять, как сделать полезную обработку данных.

  3. Понять, как сделать что-то. Дизайн - код - тест.

С. Лотт
источник
1
@ S.Lott - Конечно, это не главное в моем первоначальном вопросе, но было бы полезно иметь их, прежде чем переходить на языки более высокого уровня. Не поймите меня неправильно, вы делаете правильное замечание.
Anto
3
-1 Многие твои недостатки я считаю достоинствами. Лучше знать, как работает низкий уровень, прежде чем использовать его сверху. Основы важны.
Orbling
1
Ассемблер, как язык программирования, гораздо лучше раскрывает структуру данных, логику и основы более низкого уровня, чем языки более высокого уровня. У обоих есть место, ассемблер может быть проще для понимания, чем языки более высокого уровня, если вы не пытаетесь достичь чего-то слишком сложного. Сначала люди не должны пытаться делать сложные вещи.
Orbling
4
Преимущество ассемблера в том, что он демонстрирует, как работает настоящий компьютер. Вы знаете. Дело в том, что на самом деле все работает .
Пол Натан
1
@ S.Lott - Нет, но это означает, что вы можете очень хорошо использовать большую часть старых знаний, которые вы собрали, и со временем добавлять новые знания. Посмотрите, языки высокого уровня, такие как Python, приходят с новыми версиями с течением времени, но старые знания все еще пригодны для использования (и фактически Python нарушил обратную совместимость с v3)
Anto
3

Если бы мне было поручено разработать учебный план, в первом семестре у меня было бы одновременно два курса: asm + базовая компьютерная организация / архитектура и курс на основе SICP, основанный в Scheme. Второй семестр будет ориентирован на структуры данных и элементарные алгоритмы в схеме.

Второй год - это годовой проект с использованием Delphi, C ++ или C #, ориентированный на современный дизайн программного обеспечения (дизайн ОО, некоторый функциональный дизайн, разработка программного обеспечения, контроль версий и т. Д.).

Эффект должен дать интенсивное обоснование как абстрактного, так и практического, что приведет к углубленным курсам в третий и четвертый годы.

Пол Натан
источник
3

Я привык к вводным курсам ТА по информатике, и я думаю, что это плохая идея.

  1. Сборка использует как логику (если это так), так и очень сложные переводы между понятиями и числами. Студенты, изучающие введение в CS, часто борются только с логикой (циклы, если / иначе, логические выражения), и им действительно нужно просто разобраться с этим, прежде чем они также будут беспокоиться о том, какие числа означают какие логические выражения. Использование языков более высокого уровня абстрагирует эту логику для студентов, у которых не было никаких оснований так думать раньше.
  2. Вступительные классы CS не обязательно принимаются только основными специалистами CS, которые продолжат обучение CS. Зачастую их также принимают другие инженерные и не крупные специальности, которые просто «путешествуют» по интересной теме для факультативного обучения. Сборка является отличной основой для опытных, преданных делу студентов CS, но не дает очень хорошего обзора того, что программирование часто предназначено для студентов, изучающих специальность, или которые никогда не собираются брать специальность, но хотят введения в поле. ; и при этом он не очень полезен сам по себе в большинстве областей.
  3. Языки высокого уровня делают ядро ​​реальной работы программирования более прозрачным. Сборка затрагивает некоторые ключевые фундаментальные темы - базовые концепции памяти, базовые концепции производительности и т. Д. - но на самом деле не занимается созданием удобного для чтения, удобного для чтения проекта, который в наши дни важнее, IMO. Ранние студенты, кажется, часто имеют старомодные идеи «Настоящие программисты пишут код, с которым никто другой не справится», а преподавание языка более высокого уровня помогает понять, что кодирование - это совместная задача, а не просто блестящая работа.

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

Этель Эванс
источник
Очень хорошо сказано - я согласен. Первый курс должен дойти до сути, показать сквозную полезность изучаемых навыков и запустить воображение: «Черт возьми! Я могу программировать? Теперь, что еще я могу сделать с этим новым навыком ...» Согласитесь также, что лучшее время для языка ассемблера - после одного языка более высокого уровня. Это побуждает смотреть «под капот» на то, как компьютер на самом деле понимает вещи более высокого уровня. Первое знакомство с языком ассемблера после того, как язык более высокого уровня оставляет еще одно сильное влияние: студент сталкивается с электроникой, чипами, датчиками и т. Д.
Асад Эбрахим
3

Сборка была моим вторым языком, сразу после Бейсика. Однако, когда я учился, было другое время. В моем Commodore 64 были доступны другие языки, но если вы хотели, чтобы что-то казалось быстрым, или хотели делать больше, чем одно за раз, вам нужно было изучать ассемблер и как работать с прерываниями. Операционная система графической среды (GEOS), которая дала Commodore систему управления окнами, также была в сборе. По большому счету это был лучший сборочный API, который я когда-либо видел. Это была также единственная платформа, которую я использовал, где вы могли стилизовать свой код. Правильно, вы можете использовать курсив и разные размеры шрифта - что оказалось полезным для чтения комментариев.

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

Короче говоря, я должен искренне не соглашаться со всеми, кто говорит, что Ассамблея должна быть хорошим родным языком. Вот почему:

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

В наши дни язык ассемблера используется для ускорения определенных конечных действий, когда сборка, созданная вручную, будет быстрее, чем сборка, созданная компилятором. Основная структура приложения выполняется на языке более высокого уровня, таком как C, C ++ и т. Д. Конечно, программирование на ассемблере станет очень важным, если вы начнете писать компиляторы. Сколько из нас это делает?

Берин Лорич
источник
1

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

Я не думаю, что нужно или мудро сначала изучать язык ассемблера, но разумно выучить материал, которому вас учат в первые несколько недель сборки, о том, как работает процессор, и некоторые приемы отладки. Этот материал мне показался очень интересным и поучительным, как неофит.

Питер Тернер
источник
0

Я не понимаю, почему этого нельзя было сделать, хотя насколько хороша идея, это полностью зависит от толпы, которой бы вы ее тоже научили. Кто-то, чья конечная цель - стать веб-разработчиком, вероятно, надоест и может уйти, потому что это не даст им немедленного удовлетворения от создания чего-то, что сделали бы Python, Ruby и т. Д. Если они захотят со временем поработать над аппаратным обеспечением или другими низкоуровневыми проектами, то я думаю, что это будет хорошим началом (при условии, что вы достаточно разберетесь в архитектуре компьютера, чтобы это имело смысл). Я думаю, что это могло бы помочь людям писать лучший код в будущем, хотя я думаю, что это будет более трудным, чем изучение других языков для начала.

Jetti
источник
0

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

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

Без акцента в этой области, это просто упрощенный язык, который, как правило, учит плохим организационным привычкам. Кодирование машинного уровня полезно иметь в наборе инструментов, чтобы знать, как все работает, но это не очень хороший родной язык.

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

Джим Раш
источник