Низкоуровневое программирование - что для меня значит? [закрыто]


32

В течение многих лет я размышлял над тем, что я считаю языками "низкого уровня". Для меня это означает С и сборку. Однако у меня еще не было на это времени, и при этом он никогда не был необходим.

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

Моя позиция

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

В разработке приложений, я думаю, что удобство использования является наиболее важной вещью. Вы пишете приложения, которые будут «потребляться» пользователями. Чем полезнее эти приложения, тем большую ценность вы получили.

Для достижения хорошего юзабилити, я считаю, что следующие вещи являются жизнеспособными

  • Хороший дизайн : хорошо продуманные функции, доступные через продуманный пользовательский интерфейс.
  • Правильность : лучший дизайн ничего не стоит, если не реализован правильно.
  • Гибкость : приложение A должно постоянно развиваться, так что его пользователям не нужно переключаться на другое приложение B, которое имеет новые функции, которые A может реализовать. Приложения, решающие одну и ту же проблему, должны отличаться не по функциям, а по философии.
  • Производительность : Производительность способствует хорошему пользовательскому опыту. Приложение идеально всегда отзывчиво и выполняет свои задачи достаточно быстро (в зависимости от их частоты). Значение оптимизации производительности за пределами точки, в которой это заметно для пользователя, сомнительно.

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

Мой вопрос

Чему может научить низкоуровневое программирование, чему не научат другие языки? Я что-то упустил, или это просто навык, который очень мало полезен для разработки приложений? Пожалуйста, поймите, что я не ставлю под сомнение значение C и сборки. Просто в моей повседневной жизни я очень счастлив, что все тонкости этого мира отделены и управляются для меня (в основном, слоями, написанными на C / C ++ и самими сборками). Я просто не вижу никаких концепций, которые могли бы быть новыми для меня, только детали, которыми я должен был бы наполнить мою голову. Так что в этом для меня?

Мой вывод

Спасибо всем за ответы. Должен сказать, что меня никто не удивил, но, по крайней мере, теперь я совершенно уверен, что оставлю эту область интересов до тех пор, пока она не возникнет.
Насколько я понимаю, написание сборок в наши дни для процессоров, поскольку они используются в современных процессорах, не только излишне сложно, но и может привести к более низкой производительности во время выполнения, чем аналог C. Оптимизация вручную практически невозможна из-за OOE, в то время как вы не получаете все виды оптимизаций, которые компилятор может делать автоматически. Кроме того, код является переносимым, поскольку он использует небольшое подмножество доступных команд, или он оптимизирован, но тогда он, вероятно, работает только на одной архитектуре.
Написание C уже не так необходимо, как это было в прошлом. Если бы я написал приложение на C, я бы с таким же успехом использовал бы проверенные и созданные библиотеки и фреймворки, что избавило бы меня от реализации подпрограмм копирования строк, алгоритмов сортировки и других вещей, используемых в качестве упражнения в университете. Мой собственный код будет выполняться быстрее за счет безопасности типов. Я не заинтересован ни в том, чтобы заново изобретать колесо в ходе обычной разработки приложений, ни в том, что касается отладки, просматривая дампы ядра: D В
настоящее время я экспериментирую с языками и интерпретаторами, поэтому, если есть что-то, что я хотел бы опубликовать, я полагаю, портирую рабочую концепцию на C, хотя C ++ может с тем же успехом сделать свое дело.
Еще раз спасибо всем за ваши ответы и понимание.


6
@TheLQ: мой вопрос не в том, зачем его использовать , а в том , что я могу из него извлечь .
back2dos


Ответы:


9

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

Думайте об этом как Haikus или Limericks, где ограничения делают это интересным.

Чтобы дать вам представление о том, что возможно в том, что сегодня кажется невозможным, вот один из величайших хаков за всю историю. Шахматы в 1 Кб ОЗУ! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


1
Я думаю, что я действительно пойду на "ограничения делают это интересным". Из всех вещей, упомянутых здесь, это, вероятно, лучшее. Еще в школе я программировал игры на своем калькуляторе с памятью 32 КБ и процессором 8 МГц. Это было весело, но я многому не научился.
back2dos

Downvoter, пожалуйста, укажите, почему?

29

Я просто думал об этом недавно. В настоящее время я считаю себя разработчиком на C #, что отлично подходит для моей карьеры.

Однако, очень часто я пропускаю действительно низкоуровневые вещи (по сути, «пачкаю руки», выполняя ассемблер или драйверы устройств на C). Я просто скучаю по программированию. Я не ожидаю, что это поможет мне в моей карьере. Если вам нужны драйверы устройств или встроенные системы, то это может сильно помочь.

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

Используя старые языки, я думаю, что вы вынуждены делать почти все самостоятельно. В C # я могу сделать что-то вроде myArray.SortBy(x=>x.Name). Ни в коем случае я не смогу сделать это в C. Я признаю, что язык сделает лучшую сортировку для меня. Если бы я делал это в C, я мог бы вернуться к временам моих университетских модулей и пересмотреть мои разные алгоритмы сортировки и поиска.

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


15
+1 за то, что озвучил любовь к тому, чтобы ковыряться в железе и видеть, что дергается - настоящий выродок
Гари Роу

2
Вы можете написать функцию сортировки самостоятельно в C #, если хотите. Вы также можете использовать библиотечную функцию для сортировки в C, если хотите: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html. Я бы даже сказал, что используя старые языки, вы должны делать меньше вещей сами. Потому что большинство проблем уже решено. Это не мешает людям заново изобретать колесо:
back2dos

15

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

Предлагаемые цели:

  • Освежите вашу память об основных структурах данных и алгоритмах.
    • Это просто хорошая вещь, которую нужно знать, например, алгебра и геометрия.
    • Попробуйте выполнить некоторые учебные упражнения для колледжа или составить пазлы на языке C.
  • Лучшее понимание иерархии памяти (пропускной способности) на всем пути от кэша ЦП до задержки в трансокеанской сети. Это поможет вашим навыкам разработки приложений на всех уровнях.
    • Самое главное, это хорошо , чтобы узнать о сценариях , в которых небольшая незаметной перегруппировка коды высокого уровня может привести к драматическим улучшению скорости .
      • Иногда причина может быть понята только в низкоуровневой реализации в контексте иерархии памяти.
      • Непонимание естественной причины этой возможности ведет к невежеству , страху и, в конечном итоге, к отрицанию , думая, что разработчикам высокого уровня неправильно использовать этот вид оптимизации. В действительности в этом нет ничего плохого.
  • Цените эстетику программных систем на основе компонентов , которые позволяют низкоуровневым компонентам, разработанным в C / C ++ / Assembly, использоваться системами высокого уровня.
    • Эстетика в точности соответствует удобству использования программного обеспечения:
      • Хороший дизайн (мощный, простой в использовании, продуманный)
      • правильность
      • Гибкость (расширения и новое поведение посредством композиции существующих частей, каждая с четко определенной целью)
      • Производительность (без усложнения юзабилити)
    • Хотя вы можете не создавать собственные низкоуровневые компоненты, ваше понимание поможет вам оценить и выбрать хорошие компоненты для использования в высокоуровневых проектах.
  • Наконец, следует понимать, что низкоуровневые компоненты почти всегда более сложны в своих реализациях , что далеко не просто понять, просто взглянув на интерфейс.
    • Низкий уровень всегда сложен. Хорошая библиотека скрывает сложность, не уменьшая ее мощность.
    • Научитесь читать «технические заметки», написанные разработчиками компонентов, которые являются рекомендациями для пользователей компонентов более высокого уровня о том, как наилучшим образом использовать компоненты.

8

если вы хотите понять, как работает машина , а не только виртуальная машина, от которой зависит ваш язык высокого уровня, то Assembly научит вас этому

если у вас нет причин для беспокойства - а большинство программистов действительно не заботятся в эти дни - тогда не беспокойтесь об этом.

это улучшит ваш фундамент, но, вероятно, не улучшит ваши веб-приложения


6
С работает почти так же хорошо. Большинство С понятий легко переводятся на машинный язык. Изучите C и быстро взгляните на ассемблер, и вы в хорошей форме.
Дэвид Торнли

Я собирался опубликовать аналогичный ответ. Я бы сказал, что C также дает представление о том, как работает машина, особенно когда речь идет об управлении памятью. Кроме того, многие языки, которые описывают сложность машины, написаны на C. По крайней мере, человек получит реальное представление о том, насколько они избалованы :)
Тим Пост

1
@Jorg: интересно. и сколько из этих процессоров находятся в активном коммерческом использовании по сравнению, скажем, с Intel x86 или 6502s?
Стивен А. Лоу

1
@ Йорг, где ты найдешь эти процессоры?

1
@Thor: скорость не вопрос здесь, образование.
Стивен А. Лоу

8

Каждый язык программирования немного меняет то, как вы думаете о программировании в целом. Конкретный пример, который я могу привести, - это когда я начал изучать haskell, и внезапно функциональные фрагменты javascript, ruby ​​и python стали намного более понятными. Я никогда раньше не использовал foldl ни в одном из моих кодов, но после haskell я почти везде вижу его, когда вижу массивы. Таким образом, высоки шансы, что если вы изучите некоторый C, вы станете намного лучше осведомлены об относительных характеристиках производительности различных конструкций на вашем любимом языке. Несколько минут назад я слушал разговор о написании быстрого и оптимизированного javascript, и оратор сказал: «Если это сложно сделать в C, то в javascript будет очень медленно». Его намерение состоит в том, что javascript является интерпретируемым языком, а интерпретатор написан на C или C ++.


2
+1 за представление о том, как каждый язык меняет то, как вы думаете.
Шон

7

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


1
+1 для гика веселья. Хотя я должен сказать, что я не большой фанатик. И я ненавижу аппаратное обеспечение :)
back2dos

1
Разница в скорости, как правило, не имеет значения. Это особенно верно для веб-приложений, где обработка на стороне сервера обычно не является узким местом.
Дэвид Торнли

Дэвид: Я полностью согласен с обычными веб-приложениями. В других доменах разница может быть очень актуальной.
user281377 30.11.10

1
@ back2dos, если идея программирования, близкая к аппаратному, вам не нравится, то я бы сказал, что не беспокойтесь об этом. Это все равно, что заставлять себя учить латынь только потому, что она была основой для многих поздних романских языков.
tcrosley

2
при достаточном

5

Ура для любопытства!

Очень хорошо иметь представление о том, что на самом деле происходит на самых низких уровнях сложной системы, даже если нет никакой логической необходимости знать свои повседневные обязанности. Безусловно, лучший способ добиться успеха на битовом уровне - это создать свой собственный процессор. Вы должны подумать о кодах операций на уровне машинного языка, понять, почему наборы ортогональных команд так хороши, сложности обработки прерываний, компромиссы между сложными схемами и микрокодами (например, в единицах умножения) и много другого веселья!

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

Следующая лучшая вещь после этого: поиграть в симуляторе ЦП (эмулятор? Я перепутал эти термины) - они существуют для Z80, 6502, 8086 ... все старые 8-битные. Это может быть наиболее познавательно и забавно для программиста приложений, который не знает, какой конец паяльника держать (хотя достаточно быстро это узнает :) Как текст записывается в видеопамять, как трюки с ассемблерным кодом помогают повысить производительность. .. есть много интересных вещей, чтобы исследовать на этом уровне.

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


+1, потому что это был единственный ответ, в котором упоминались указатели. Я думал, что это будет № 1 и принял ответ.
Эрик

4

Одним словом, весело. Когда я играл с ассемблером (работая с VB до C ++, C и т. Д.), Было просто здорово перемещать данные из одной части процессора в другую. Было очень приятно точно знать , что происходит внутри процессора, не беспокоясь о том, что происходит под тем, о чем вы не знали. Плюс отличное чувство свободы - вы можете делать все что угодно, потому что нет встроенных ограничений, которые вы найдете в языках более высокого уровня.

Кроме того, возможность обращаться к любому, кто программирует на любом другом языке, и говорить «хорошо, если вы не достаточно хардкорны…», было детским, детским развлечением.


4
На самом деле внутри процессора происходит много чего, чего вы не видите от ассемблера. Такие вещи, как неправильное выполнение, гиперпоточность и кэширование памяти, выполняются процессором автоматически. Вы всегда можете идти на один шаг ниже, пока не достигнете фундаментальных частиц материи. Или материя это просто энергия?
Кевин Панко

Можно избежать любой подобной загадки, создав собственный процессор из транзисторов и логических чипов: D (Одна из моих любимых технических фантазий!) В любом случае +1 за отличный ответ.
DarenW

Честная оценка! Хотя, когда я в последний раз фактически использовал ассемблер, гипертред, скорее всего, чаще воспринимался как относящийся к быстрому шитью, а не к процессорам ...
Дэн О

2

Есть ли веские основания для изучения / практики низкоуровневого программирования? У меня есть различные ответы в зависимости от контекста.

Во-первых, я преподаю программирование на C (но также и на OCaml и Java), и мотивация учащегося изучать программирование с трудной стороны, вероятно, самая трудная часть задачи. Лучший аргумент, который я нашел до сих пор, это «понимание»: языки более высокого уровня скрывают множество базовых механизмов, а иногда и не навсегда, они также подталкивают вас оставаться на более высоком уровне, даже когда некоторые трюки низкого уровня действительно могут быть полезны ( в большинстве случаев.) Понимание того, что вы используете, действительно может помочь лучше его использовать. Мой опыт преподавания доказывает, что студенты, которые изучают программирование более низкого уровня (и другие, не ориентированные на пользователя, такие как компиляторы), более адаптируемы и быстрее изучают новые концепции или инструменты более высокого уровня.

Во-вторых, как вы заявляете, производительность является частью пользовательского опыта. В большинстве случаев производительность рассматривается как сложная задача, близкая к машинному коду. Это не всегда так, производительность гораздо больше зависит от алгоритмов и структур данных, но также от взаимодействия между алгоритмом и данными. Я использую специальный проект на эту тему, в основном это простой поиск пути, но реальная проблема заключается в размере данных: график бесконечен. Единственный способ достичь производительности спуска и вписаться в память - это написать выделенный распределитель памяти (фактически два, распределитель пула и распределитель повторного использования). Это то, чего вы не можете сделать в большинстве языков более высокого уровня. На самом деле, большинство языков с мусором будут иметь проблемы с производительностью и памятью.

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

Я сам в ловушке обоих миров (совершенно по-разному), я провожу несколько лет, работая над концепцией теоретического программирования, проектированием и проверкой систем типов, и поэтому я использую и изучаю только языки очень высокого уровня (в основном функциональные, но также и чистые). объектно-ориентированный.) В последнее время я возвращаюсь на другую сторону (в основном системное и программирование ядра) и чувствую себя довольно свободно в этой области, мне очень весело! Для меня следующий шаг - найти точку соприкосновения: возможности языка более высокого уровня для программирования более низкого уровня! Итак, пока для этого нет языка (возможно, Google использует системное программирование для пользователей), и я рассматриваю идею создания своего собственного языка, но это другая история.


1

Я бы сказал, что в вашем домене нет особых причин, однако, если бы вы занимались высокопроизводительными вычислениями (например, играми, наукой и т. Д.), Это было бы оправдано.


1
Я не уверен, что осталось много областей с высокими показателями. Игры, конечно, не требуют языков низкого уровня. Для игр вы обычно используете движки или, по крайней мере, начинаете с OpenGL или чего-то еще. И для науки распараллеливание очень важна и правильность. Я полагаю, вам будет лучше с OCaml или чем-то еще. Критические области производительности больше не являются областями, которые занимаются большим количеством цифр, но используются чрезвычайно часто, такими как ядра, драйверы, механизмы хранения и так далее. Я предполагаю, что менее 1% всех разработчиков действительно когда-либо касаются их.
back2dos

4
@ back2dos, игровые движки просто не появляются из ниоткуда - кто-то должен их написать. А как вы думаете, в чем написан OpenGL? Не C #. В наши дни не нужно использовать языки низкого уровня для большинства приложений ... но многие люди работают в других областях, где это требуется.
GrandmasterB

1

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

Просто из любопытства вы можете узнать, как все работает на более низком уровне. Например, когда я учился в университете, мне нравилось использовать gcc для генерации ассемблерного кода из C ++. Было полезно понять, как реализуются полиморфизм и исключение. Но кроме этого единственные вещи, которые вы можете извлечь из C в настоящее время:

1) грязные уловки памяти. C - лучший способ понять, что в безумии программистов нет дна :)

2) GOTO фактически используются (и полезны) для отката ошибок

3) лучше узнать, как работает распределение памяти (разница между кучей и стеком?).

В общем, мой тезис таков: если вы уже закончили университет и вам по-прежнему не нужен C, не учите его :)


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

1

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

Вот несколько примеров понятий низкого уровня, которые могут повлиять на языки высокого уровня.

указатели:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Строки:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Списки:

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

-

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


1

Чему может научить низкоуровневое программирование, чему не научат другие языки?

В частности, он научит вас, как на самом деле работают компьютеры. Нет другого способа узнать это, чем через низкоуровневое программирование. Независимо от того, какие приложения вы программируете, это всегда поможет. Вы действительно поймете, что происходит в глубине всего этого веб-материала. А если вы работаете с Windows, весь API написан на C, поэтому знание этого языка позволит вам напрямую взаимодействовать с ОС, когда вам потребуется использовать функцию, которой нет у ваших текущих языков и их библиотек.

Конечно, низкоуровневое программирование позволит вам работать с совершенно другими вещами, такими как встроенное программирование и программирование в реальном времени, где asm / C / C ++ является обязательным. Если вас не интересуют подобные приложения, вам не нужно много изучать asm / C / C ++.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.