Недавно Стив Клабник написал статью, посвященную изучению C, чтобы понять, как работает компьютер. То, что я планирую обсудить здесь, не обязательно будет прямым ответом на статью, а скорее вдохновлено ею.

На личном уровне изучение C — хороший способ помочь вам понять внутренности языка. В то время как многие языки, такие как Google Go, начинают есть собственную собачью еду с точки зрения компиляции, реализации C довольно распространены в языковых реализациях. Некоторые примеры этого включают:

  • Cython (реализация C Python)
  • MRI (реализация C Ruby)
  • PHP (в частности Zend Engine)

Знание C может помочь вам понять, как эти языки реализуют определенные функции. Это также поможет вам понять ограничения языка в отношении того, что C может и чего не может делать. Когда вы занимаетесь жесткой оптимизацией, знание того, что делают внутренние компоненты языка, может помочь вам найти наиболее оптимальное решение.

Тем не менее, такие языки, как Rust и Google Go, начинают становиться все более заметными в области низкоуровневой разработки. Простое управление указателями и памятью может быть довольно болезненным. Позволить языку сделать всю тяжелую работу за вас предпочтительнее в наши дни. Я считаю, что во многом это связано с рыночными ожиданиями. Ожидания временной шкалы проекта в отношении программного обеспечения, написанного на C, часто представляют собой довольно нишевые области (такие как встроенные устройства, мультимедиа, игры) или невероятно масштабные ситуации (Google, Facebook).

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

Что касается темы обучения, я хотел бы поднять следующий вопрос: образование в области компьютерных наук. Современный мир разработки сильно отличается от эпохи перфокарт и старых DEC Alpha. На самом деле аппаратное обеспечение «голого железа» претерпело довольно заметный переход к облачным средам. Учитывая, что традиционные учебники CS, как правило, сосредоточены в основном на голом железе, это может оставить их неподготовленными для более корпоративных сред, где офисное оборудование для настольных компьютеров / ноутбуков, вероятно, ближе всего к вам. По сути, нам нужно коснуться виртуализации и контейнеров как основного направления современного обучения компьютерным наукам.

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

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