Основы программирования. Предисловие.

Основы программирования. Предисловие.

Andrew Kovacz

Содержание:

Предисловие.

Двоичная система. 

Биты. Булевы операции.

Хранение битов.

Оперативная память.

Оперативная память. Часть 2.


Всем привет, дорогие друзья!

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

На кого это рассчитано?

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

И так, зачем вам знать это все?

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

И парочка слов о твоем будущем.

Зная все это хотя бы на элементарном уровне, ты сможешь без проблемно проходить собеседования во многие компании, можешь мне поверить. Изучив все это и хотя бы частично отпрактиковав, ты будешь значим для рынка. Таких ребят любят. Любят тех, кто действительно заинтересован в сфере + знает и хочет знать больше других. Недостаток опыта ты будешь компенсировать обширными знаниями фундаментальных вещей. Ребят, с подобными навыками намного легче втягивать в активный продакшен и что-то объяснять. Т.е тебя легче будет приспособить. Это как в сериале, Во все тяжкие. Уолтеру было легко втянуться в продакшен мета, потому что у него были отличные фундаментальные знания химии.

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

Компьютеры.

Компьютеры — это универсальные машины. Чтобы правильно программировать, тебе нужно понимать, какой универсальной машиной является ваш компьютер. Если взять конкретно процессор, это поможет понять, почему, скажем, операции с плавающей точкой медленнее, чем над целыми числами, почему умножение медленнее, чем сложение. Понимание работы кеша помогает понять, почему некоторые реализации, например, умножение матриц происходят быстрее, чем другие, когда математически кажется, что они производят одинаковое количество операций, почему важно важно научиться писать т.н. "cache-friendly", дружественный с кешем код. Иерархия памяти, в общем, очень важна для понимания того, как реализовать более быстрые программы, а понимание того, на какие низкоуровневые инструкции переводится ваша программа высокого уровня очень помогает в разработке эффективных и элегантных программ.

А что насчет программирования?

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

int main() {
    printf("Hello, world!");
}

Наверное, каждый знает, что произошло за эти несколько секунд на уровне был исходный код, он превратился в машинный и после некой магии на уровне железок у вас получился какой-то вменяемый вывод, например, в терминале. Где-то один из ста знает, что произошло с точки зрения посредственного программиста, а именно инструкции лежат где-то в памяти, счетчик программы (PC) указывает на адрес в памяти конкретной инструкции, чтобы ее оттуда прочитать, далее процессор делает что-то с регистрами, записывает разные значения, производит какие-то вычисления и получается вывод. И только примерно один из тысячи знает о ISA, Конвейерах, Виртуальной памяти, разнице в наборах инструкций (RISC, CISC) и т.д.

Итог.

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

Еще в конце хочу привести пример одного моего знакомого, который работает в одной компании со мной уже 3-ий год, правда занимается он фронт-энд разработкой и последний год пытается переквалифицироваться типа в бэк-энд разработчика на интересный проект от Cisco, но безуспешно. Причин тут несколько. Мало знаний, недостаток опыта, особенно отсутствие понимания фундаментальных принципов и так далее. Т.е. желание — это конечно хорошо, но тут есть и объективная основа. Ваши знания не должны ограничиваться базой какого-нибудь языка + фреймворка, я говорю про более фундаментальные вещи, которые берут свои истоки в Computer Science.

Оффтоп. Так, а что дальше?
И все же люди часто задают вопросы, которые подтверждают их интерес к внутреннему устройству компьютера. Один из них: «В чем разница между оперативной и постоянной памятью?». Это, без сомнения, очень важный вопрос. На этот вопрос часто отвечают, используя такую аналогию: «Считайте, что оперативная память — это ваш рабочий стол, а постоянная — шкаф с папками». И думают, что это прекрасное сравнение! Но я его таковым не считаю: создается впечатление, что архитектура компьютера срисована с обычной конторы. Правда же заключается в том, что различие между постоянной и оперативной памятью искусственно и существует лишь потому, что нам до сих пор не удалось создать накопитель данных, который был бы одновременно быстрым, объемным и способным хранить информацию в течение долгого времени.  Я бы хотел, чтобы эти статьи помогли тебе разобраться в подобных вещах, причем не абстрактно, а более глубоко. Компьютеры наших дней сложнее тех, что появились полвека назад, но в основе своей они остались теми же. Вот почему сначала мы погрузимся в историю, в не такое уж и далекое прошлое, чтобы прежде чем идти далее в дебри у вас было представление того почему сегодня компьютеры работают именно так, а не иначе и почему принимались те или иные решения в развитии Computer Science.

Есть вопрос?
Задай его в нашем ламповом чате https://t.me/ProgrammingFAchat












Report Page