В течение многих лет я размышлял над тем, что я считаю языками "низкого уровня". Для меня это означает С и сборку. Однако у меня еще не было на это времени, и при этом он никогда не был необходим.
Теперь, когда я не вижу никакой необходимости, я чувствую, что должен либо просто запланировать какой-то момент времени, когда я буду изучать предмет, либо отказаться от плана навсегда.
Моя позиция
Последние 4 года я сосредоточился на «веб-технологиях», которые могут измениться, и я являюсь разработчиком приложений, который вряд ли изменится.
В разработке приложений, я думаю, что удобство использования является наиболее важной вещью. Вы пишете приложения, которые будут «потребляться» пользователями. Чем полезнее эти приложения, тем большую ценность вы получили.
Для достижения хорошего юзабилити, я считаю, что следующие вещи являются жизнеспособными
- Хороший дизайн : хорошо продуманные функции, доступные через продуманный пользовательский интерфейс.
- Правильность : лучший дизайн ничего не стоит, если не реализован правильно.
- Гибкость : приложение A должно постоянно развиваться, так что его пользователям не нужно переключаться на другое приложение B, которое имеет новые функции, которые A может реализовать. Приложения, решающие одну и ту же проблему, должны отличаться не по функциям, а по философии.
- Производительность : Производительность способствует хорошему пользовательскому опыту. Приложение идеально всегда отзывчиво и выполняет свои задачи достаточно быстро (в зависимости от их частоты). Значение оптимизации производительности за пределами точки, в которой это заметно для пользователя, сомнительно.
Я думаю, что низкоуровневое программирование не поможет мне в этом, кроме производительности. Но писать целое приложение на низкоуровневом языке ради производительности для меня преждевременно.
Мой вопрос
Чему может научить низкоуровневое программирование, чему не научат другие языки? Я что-то упустил, или это просто навык, который очень мало полезен для разработки приложений? Пожалуйста, поймите, что я не ставлю под сомнение значение C и сборки. Просто в моей повседневной жизни я очень счастлив, что все тонкости этого мира отделены и управляются для меня (в основном, слоями, написанными на C / C ++ и самими сборками). Я просто не вижу никаких концепций, которые могли бы быть новыми для меня, только детали, которыми я должен был бы наполнить мою голову. Так что в этом для меня?
Мой вывод
Спасибо всем за ответы. Должен сказать, что меня никто не удивил, но, по крайней мере, теперь я совершенно уверен, что оставлю эту область интересов до тех пор, пока она не возникнет.
Насколько я понимаю, написание сборок в наши дни для процессоров, поскольку они используются в современных процессорах, не только излишне сложно, но и может привести к более низкой производительности во время выполнения, чем аналог C. Оптимизация вручную практически невозможна из-за OOE, в то время как вы не получаете все виды оптимизаций, которые компилятор может делать автоматически. Кроме того, код является переносимым, поскольку он использует небольшое подмножество доступных команд, или он оптимизирован, но тогда он, вероятно, работает только на одной архитектуре.
Написание C уже не так необходимо, как это было в прошлом. Если бы я написал приложение на C, я бы с таким же успехом использовал бы проверенные и созданные библиотеки и фреймворки, что избавило бы меня от реализации подпрограмм копирования строк, алгоритмов сортировки и других вещей, используемых в качестве упражнения в университете. Мой собственный код будет выполняться быстрее за счет безопасности типов. Я не заинтересован ни в том, чтобы заново изобретать колесо в ходе обычной разработки приложений, ни в том, что касается отладки, просматривая дампы ядра: D В
настоящее время я экспериментирую с языками и интерпретаторами, поэтому, если есть что-то, что я хотел бы опубликовать, я полагаю, портирую рабочую концепцию на C, хотя C ++ может с тем же успехом сделать свое дело.
Еще раз спасибо всем за ваши ответы и понимание.
Ответы:
Низкоуровневое программирование предназначено для тех случаев, когда на обычных настольных компьютерах есть требование, которое не сразу присутствует. Это может быть узкое место в скорости, узкое место в памяти или что-то совершенно другое, и очень часто очень интересно посмотреть, что можно сделать с учетом этих требований.
Думайте об этом как Haikus или Limericks, где ограничения делают это интересным.
Чтобы дать вам представление о том, что возможно в том, что сегодня кажется невозможным, вот один из величайших хаков за всю историю. Шахматы в 1 Кб ОЗУ! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/
источник
Я просто думал об этом недавно. В настоящее время я считаю себя разработчиком на C #, что отлично подходит для моей карьеры.
Однако, очень часто я пропускаю действительно низкоуровневые вещи (по сути, «пачкаю руки», выполняя ассемблер или драйверы устройств на C). Я просто скучаю по программированию. Я не ожидаю, что это поможет мне в моей карьере. Если вам нужны драйверы устройств или встроенные системы, то это может сильно помочь.
Чем больше я программирую на абстрактных языках, тем больше я скучаю по тому, что привело меня к компьютерам: ковыряться в компьютере и видеть, что дергается. Ассемблер и С очень подходят для тыкания :)
Используя старые языки, я думаю, что вы вынуждены делать почти все самостоятельно. В C # я могу сделать что-то вроде
myArray.SortBy(x=>x.Name)
. Ни в коем случае я не смогу сделать это в C. Я признаю, что язык сделает лучшую сортировку для меня. Если бы я делал это в C, я мог бы вернуться к временам моих университетских модулей и пересмотреть мои разные алгоритмы сортировки и поиска.Итак, я думаю, что языки нижнего уровня помогут вам пересмотреть любой из давно забытых фрагментов, которые все абстрагируются. Это скорее личный вызов, чем карьера.
источник
Мое предложение состоит в том, чтобы поиграть с C как интеллектуальное любопытство. Не вкладывайте много времени, потому что оно того не стоит.
Предлагаемые цели:
источник
если вы хотите понять, как работает машина , а не только виртуальная машина, от которой зависит ваш язык высокого уровня, то Assembly научит вас этому
если у вас нет причин для беспокойства - а большинство программистов действительно не заботятся в эти дни - тогда не беспокойтесь об этом.
это улучшит ваш фундамент, но, вероятно, не улучшит ваши веб-приложения
источник
Каждый язык программирования немного меняет то, как вы думаете о программировании в целом. Конкретный пример, который я могу привести, - это когда я начал изучать haskell, и внезапно функциональные фрагменты javascript, ruby и python стали намного более понятными. Я никогда раньше не использовал foldl ни в одном из моих кодов, но после haskell я почти везде вижу его, когда вижу массивы. Таким образом, высоки шансы, что если вы изучите некоторый C, вы станете намного лучше осведомлены об относительных характеристиках производительности различных конструкций на вашем любимом языке. Несколько минут назад я слушал разговор о написании быстрого и оптимизированного javascript, и оратор сказал: «Если это сложно сделать в C, то в javascript будет очень медленно». Его намерение состоит в том, что javascript является интерпретируемым языком, а интерпретатор написан на C или C ++.
источник
Если вы не делаете это просто для удовольствия, потому что гики действительно любят иметь полный контроль над своим оборудованием, вы, по крайней мере, можете лучше понять, насколько быстрее может стать программа, когда она написана на C вместо, скажем, Java. Вы также можете научиться по-настоящему ценить возможности языков высокого уровня, таких как сборка мусора.
источник
Ура для любопытства!
Очень хорошо иметь представление о том, что на самом деле происходит на самых низких уровнях сложной системы, даже если нет никакой логической необходимости знать свои повседневные обязанности. Безусловно, лучший способ добиться успеха на битовом уровне - это создать свой собственный процессор. Вы должны подумать о кодах операций на уровне машинного языка, понять, почему наборы ортогональных команд так хороши, сложности обработки прерываний, компромиссы между сложными схемами и микрокодами (например, в единицах умножения) и много другого веселья!
Но это, очевидно, требует ноу-хау электроники и отнимает много времени, поэтому следующая лучшая вещь - это игрушка с 8-битным процессором в античном стиле. Микроконтроллеры, такие как 8051, все еще широко используются и доступны для любителей. Это все еще требует некоторых ноу-хау в скотоводстве и производстве светодиодов, которые светятся без курения, и стоит $$, если вы еще не оснащены электроникой.
Следующая лучшая вещь после этого: поиграть в симуляторе ЦП (эмулятор? Я перепутал эти термины) - они существуют для Z80, 6502, 8086 ... все старые 8-битные. Это может быть наиболее познавательно и забавно для программиста приложений, который не знает, какой конец паяльника держать (хотя достаточно быстро это узнает :) Как текст записывается в видеопамять, как трюки с ассемблерным кодом помогают повысить производительность. .. есть много интересных вещей, чтобы исследовать на этом уровне.
Я не уверен в том, что изучение C - это просто другой язык, без начального понимания внутренней работы процессора. Знание того, как биты передаются между регистрами ЦП и как осуществляется доступ к памяти, чрезвычайно помогает в правильном получении указателей и других концепций языка Си.
источник
Одним словом, весело. Когда я играл с ассемблером (работая с VB до C ++, C и т. Д.), Было просто здорово перемещать данные из одной части процессора в другую. Было очень приятно точно знать , что происходит внутри процессора, не беспокоясь о том, что происходит под тем, о чем вы не знали. Плюс отличное чувство свободы - вы можете делать все что угодно, потому что нет встроенных ограничений, которые вы найдете в языках более высокого уровня.
Кроме того, возможность обращаться к любому, кто программирует на любом другом языке, и говорить «хорошо, если вы не достаточно хардкорны…», было детским, детским развлечением.
источник
Есть ли веские основания для изучения / практики низкоуровневого программирования? У меня есть различные ответы в зависимости от контекста.
Во-первых, я преподаю программирование на C (но также и на OCaml и Java), и мотивация учащегося изучать программирование с трудной стороны, вероятно, самая трудная часть задачи. Лучший аргумент, который я нашел до сих пор, это «понимание»: языки более высокого уровня скрывают множество базовых механизмов, а иногда и не навсегда, они также подталкивают вас оставаться на более высоком уровне, даже когда некоторые трюки низкого уровня действительно могут быть полезны ( в большинстве случаев.) Понимание того, что вы используете, действительно может помочь лучше его использовать. Мой опыт преподавания доказывает, что студенты, которые изучают программирование более низкого уровня (и другие, не ориентированные на пользователя, такие как компиляторы), более адаптируемы и быстрее изучают новые концепции или инструменты более высокого уровня.
Во-вторых, как вы заявляете, производительность является частью пользовательского опыта. В большинстве случаев производительность рассматривается как сложная задача, близкая к машинному коду. Это не всегда так, производительность гораздо больше зависит от алгоритмов и структур данных, но также от взаимодействия между алгоритмом и данными. Я использую специальный проект на эту тему, в основном это простой поиск пути, но реальная проблема заключается в размере данных: график бесконечен. Единственный способ достичь производительности спуска и вписаться в память - это написать выделенный распределитель памяти (фактически два, распределитель пула и распределитель повторного использования). Это то, чего вы не можете сделать в большинстве языков более высокого уровня. На самом деле, большинство языков с мусором будут иметь проблемы с производительностью и памятью.
Вероятно, существует гораздо больше аргументов, таких как стабильность (в смысле истории и долговечности) языков более низкого уровня по сравнению с «шумихой» (тот факт, что язык, рассматриваемый в качестве будущей ссылки на программирование, может исчезнуть через несколько лет, является долгим история, никто не может предсказать долговечность нового материала, но этот аргумент остается верным для более старых языков ...), конечно, есть также вопрос вкуса или тот факт, что то, что может быть сделано в большинстве языков высокого уровня, также может быть сделано на языках более низкого уровня, но не наоборот (но, учитывая, что мы все должны кодировать только на ассемблере ...)
Я сам в ловушке обоих миров (совершенно по-разному), я провожу несколько лет, работая над концепцией теоретического программирования, проектированием и проверкой систем типов, и поэтому я использую и изучаю только языки очень высокого уровня (в основном функциональные, но также и чистые). объектно-ориентированный.) В последнее время я возвращаюсь на другую сторону (в основном системное и программирование ядра) и чувствую себя довольно свободно в этой области, мне очень весело! Для меня следующий шаг - найти точку соприкосновения: возможности языка более высокого уровня для программирования более низкого уровня! Итак, пока для этого нет языка (возможно, Google использует системное программирование для пользователей), и я рассматриваю идею создания своего собственного языка, но это другая история.
источник
Я бы сказал, что в вашем домене нет особых причин, однако, если бы вы занимались высокопроизводительными вычислениями (например, играми, наукой и т. Д.), Это было бы оправдано.
источник
Я думаю, что в настоящее время программирование на низком и высоком уровнях может быть совершенно разным В основном это означает, что вы можете прожить всю свою профессиональную жизнь, не зная Си и ассемблер без проблем вообще. Тем не менее, язык программирования C не может многому научить вас с точки зрения программирования и дизайна.
Просто из любопытства вы можете узнать, как все работает на более низком уровне. Например, когда я учился в университете, мне нравилось использовать gcc для генерации ассемблерного кода из C ++. Было полезно понять, как реализуются полиморфизм и исключение. Но кроме этого единственные вещи, которые вы можете извлечь из C в настоящее время:
1) грязные уловки памяти. C - лучший способ понять, что в безумии программистов нет дна :)
2) GOTO фактически используются (и полезны) для отката ошибок
3) лучше узнать, как работает распределение памяти (разница между кучей и стеком?).
В общем, мой тезис таков: если вы уже закончили университет и вам по-прежнему не нужен C, не учите его :)
источник
Вам не нужно понимать языки низкого уровня, но вы должны понимать, что происходит под обложками выбранного вами языка высокого уровня. Использование языка низкого уровня научит вас этому, но это не единственный способ.
Вот несколько примеров понятий низкого уровня, которые могут повлиять на языки высокого уровня.
указатели:
Строки:
Списки:
Когда вы используете список против связанного списка? (Практически невозможно узнать это, не понимая на довольно низком уровне, как работает список)
-
Нужно ли знать все это? Нет, но это может оказать влияние, и если вы хотите стать мастером языка высокого уровня, вам нужно иметь довольно хорошее представление о внутренней работе.
источник
В частности, он научит вас, как на самом деле работают компьютеры. Нет другого способа узнать это, чем через низкоуровневое программирование. Независимо от того, какие приложения вы программируете, это всегда поможет. Вы действительно поймете, что происходит в глубине всего этого веб-материала. А если вы работаете с Windows, весь API написан на C, поэтому знание этого языка позволит вам напрямую взаимодействовать с ОС, когда вам потребуется использовать функцию, которой нет у ваших текущих языков и их библиотек.
Конечно, низкоуровневое программирование позволит вам работать с совершенно другими вещами, такими как встроенное программирование и программирование в реальном времени, где asm / C / C ++ является обязательным. Если вас не интересуют подобные приложения, вам не нужно много изучать asm / C / C ++.
Также вы узнаете биты и байты. Битовые манипуляции, шестнадцатеричные и т. Д. С этими вещами вы можете столкнуться время от времени даже при веб-программировании. Алгоритмы шифрования - один из таких примеров, где он используется.
источник