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

Привет.

Изучал 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-летней давности - не совсем неактеальное, но слегка морально устаревшее.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ФЛАЙ НЭТ Москва
от 70 000 до 70 000 ₽
IXORA Нижний Новгород
от 115 000 ₽
Wanted. Москва
от 60 000 до 120 000 ₽
02 нояб. 2024, в 23:04
80000 руб./за проект
02 нояб. 2024, в 21:08
2000000 руб./за проект