Стоит ли изучить С для понимания как все работает?

Привет.

Изучал web разработку, потом попал в QA, пишу selenium тесты на Java. Собираюсь снова заняться web разработкой, освоить php на хорошем уровне.

Но я не чувствую... уверенности что ли. Все что я изучал, кроме основ, это функции языка, api и т.д. Нет понимания как это работает на более низком уровне. Память там, адреса в памяти, потоки, процессы и т.п.

В общем стоит ли изучить С чтобы понять как все работает?
Интересует как память работает, что такое потоки, часто встречаю упоминания о том что какая-то программа работает в несколько потоков.

Также интересно взаимодействие между компьютерами по сети на уровне tcp/ip или вроде того, например как http серверы работают.

С чего начать?
  • Вопрос задан
  • 446 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Память работает просто - туда можно писать и читать из нее. Еще она плоская и одномерная. Еще она виртуальная, но для прикладного программиста - это не важно, виртуальностью занимается ОС. Нужна она для того чтоб один процесс не видел что делается в другом процессе (например, в MS-DOS не было виртуальной памяти и любая программа могла запросто уронить ОС просто записав что-нибудь не нужное в память занимаемую системой), чтоб каждый процесс имел 4 Гб (для х32 приложений) адресуемой памяти не зависимо от физического наличия этой памяти.
Кроме самой памяти есть еще регистры процессора, но о них вспоминают только переходя к ассемблеру, т.к. даже Си не умеет ими манипулировать (оно и не нужно на самом деле).
Процессы и потоки - это сущности ОС предназначенные для параллельного выполнения кода. Реально выполняются потоки, а процесс - это оболочка для объединения нескольких потоков в одном адресном пространстве. В любом процессе есть хотя бы 1 поток.
Реальную параллельность можно достичь только тогда когда физических ядер процессора >1. Причем, обычно, вы никак не можете регулировать когда у вашего потока ОС отберет процессорное время, а когда снова даст. Это можно делать только выставляя уровень приоритета потока/процесса.
Поток отличается от процесса тем, что у двух разных процессов разные адресные пространства (виртуальная память в действии) и им для общения нужно использовать какие-либо механизмы межпроцессорного взаимодействия (сокеты, pipe, shared memory, файлы, ...) предоставляемые ОС. Потоки одного процесса работают в одном адресном пространстве, поэтому для взаимодействия им ничего изобретать не нужно, т.к. они просто могут обращаться к одной и той же переменной. Но тут сразу возникает состояние "гонки" и все что с этим связано. Чтоб как-то упорядочить одновременное обращение к участкам памяти или кода нужны мьютексы и т.п. средства. Между тем, в простых случаях, можно запросто обходится и без мьютексов просто грамотно структурировав код и в правильном порядке обращаясь к "общим" участкам памяти. Если это понимать, то писать многопоточные приложения становится не сильно сложно.
Думаю можно начать с прочтения какой-нибудь толстой книги про теорию построения ОС, например Таненбаума.
А Си - да полезно, но если вы этим денег не зарабатываете, то скорее всего не нужно.
WEB, PHP, JS, CSS и т.п. питоны, как правило, далеки от железа и ОС, на которых это все функционирует.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@rodion11
php dev
В начале пути изучения PHP, считаю что учить С ни к чему.
Время ограниченный ресурс и эффективнее потратить его на сам PHP.
Прикладной протокол HTTP можно изучить, а все что ниже разве что для саморазвития.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Базовое понимание HTTP и основы сети в любом случае не помешают.

Пара недель* изучения C дадут такое понимание низкоуровневых процессов, которое при изучении php появится только через пару лет (может быть). При этом пара лет изучения С дадут вам скилл, который очень сложно применить где-либо помимо микроконтроллеров, драйверов, и некоторых древних проектов. Ну и взлом всяких штук еще, да. То есть штука полезная, но надо вовремя остановиться, если вы конечно не собираетесь заниматься именно С.

И да, лучше пара недель C и пара недель ассемблера, чем пол года С.

А потоки и в высокоуровневых языках есть.
--------------------
* пара недель изучения - это плотное такое изучение, с чтением хороших учебников, решанием примерчиков, и ковырянием каких-то низкоуровневых штук. И это значительно больше материала, чем усваивают троечники в ПТУ за семестр.
Ответ написан
Комментировать
Profi_GMan
@Profi_GMan
Имхо С - нет. Надо учить с++. Ты всё равно пройдёшь все низкоуровневые моменты, но с++ можно потом будет с удобством использовать в прикладной разработке, а с только в системном (ну почти).
А вообще, если хочешь узнать, как всё работает, учи ассемблер. Рекомендую flat assembler
Ответ написан
Комментировать
@potan
Функциональный программист
Смысла нет.
Современные системы очень многоуровнемые, а C даст представление об узкой области одного из уровней где-то по середине всего стека. К тому же предстваление 30-летней давности - не совсем неактеальное, но слегка морально устаревшее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы