Компьютеры понимают только очень ограниченный набор инструкций, и чтобы заставить их что-то делать, нужно четко сформулировать задание, используя эти же инструкции. Программа (также «приложение» или «программное обеспечение», или «софт») — это набор инструкций, которые указывают компьютеру, что ему нужно делать. Физическая часть компьютера, которая выполняет эти инструкции, называется «железом» или аппаратной частью (например, процессор, материнская плата и т.д.). Данный урок является началом серии уроков по программированию на языке С++ для начинающих.
Машинный язык
Процессор компьютера не способен понимать напрямую языки программирования, такие как C++, Java, Python и т.д. Очень ограниченный набор инструкций, которые изначально понимает процессор, называется машинным кодом (или «машинным языком»). То, как эти инструкции организованы, выходит за рамки данного введения, но стоит отметить две вещи.
Во-первых, каждая команда (инструкция) состоит только из определенной последовательности (набора) цифр: 0
и 1
. Эти числа называются битами (сокр. от «binary digit») или двоичным кодом.
Например, одна команда машинного кода архитектуры ×86 выглядит следующим образом:
10110000 01100001
Во-вторых, каждый набор бит переводится процессором в инструкции для выполнения определенного задания (например, сравнить два числа или переместить число в определенную ячейку памяти). Разные типы процессоров обычно имеют разные наборы инструкций, поэтому инструкции, которые будут работать на процессорах Intel (используются в персональных компьютерах), с большей долей вероятности, не будут работать на процессорах Xenon (используются в игровых приставках Xbox). Раньше, когда компьютеры только начинали массово распространяться, программисты должны были писать программы непосредственно на машинном языке, что было очень неудобно, сложно и занимало намного больше времени, чем сейчас.
Язык ассемблера
Так как программировать на машинном языке — удовольствие специфическое, то программисты изобрели язык ассемблера. В этом языке каждая команда идентифицируется коротким именем (а не набором единиц с нулями), и переменными можно управлять через их имена. Таким образом, писать/читать код стало гораздо легче. Тем не менее, процессор все равно не понимает язык ассемблера напрямую. Его также нужно переводить, с помощью ассемблера, в машинный код. Ассемблер — это транслятор (переводчик), который переводит код, написанный на языке ассемблера, в машинный язык. В Интернете язык ассемблера часто называют просто «Ассемблер».
Преимуществом Ассемблера является его производительность (точнее скорость выполнения) и он до сих пор используется, когда это имеет решающее значение. Тем не менее, причина подобного преимущества заключается в том, что программирование на этом языке адаптируется к конкретному процессору. Программы, адаптированные под один процессор, не будут работать с другим. Кроме того, чтобы программировать на Ассемблере, по-прежнему нужно знать очень много не очень читабельных инструкций для выполнения даже простого задания.
Например, вот вышеприведенная команда, но уже на языке ассемблера:
Высокоуровневые языки программирования
Для решения проблем читабельности кода и чрезмерной сложности были разработаны высокоуровневые языки программирования. C, C++, Pascal, Java, JavaScript и Perl — это всё языки высокого уровня. Они позволяют писать и выполнять программы, не переживая о совместимости кода с разными архитектурами процессоров. Программы, написанные на языках высокого уровня, также должны быть переведены в машинный код перед выполнением. Есть два варианта:
компиляция, которая выполняется компилятором;
интерпретация, которая выполняется интерпретатором.
Компилятор — это программа, которая читает код и создает автономную (способную работать независимо от другого аппаратного или программного обеспечения) исполняемую программу, которую процессор понимает напрямую. При запуске программы весь код компилируется целиком, а затем создается исполняемый файл и уже при повторном запуске программы компиляция не выполняется.
Проще говоря, процесс компиляции выглядит следующим образом:
Интерпретатор — это программа, которая напрямую выполняет код, без его предыдущей компиляции в исполняемый файл. Интерпретаторы более гибкие, но менее эффективные, так как процесс интерпретации выполняется повторно при каждом запуске программы.
Процесс интерпретации:
Любой язык программирования может быть компилируемым или интерпретируемым, однако, такие языки, как C, C++ и Pascal — компилируются, в то время как «скриптовые» языки, такие, как Perl и JavaScript — интерпретируются. Некоторые языки программирования (например, Java) могут как компилироваться, так и интерпретироваться.
Преимущества высокоуровневых языков программирования
Преимущество №1: Легче писать/читать код. Вот вышеприведенная команда, но уже на языке C++:
а = 97;
Преимущество №2: Требуется меньше инструкций для выполнения определенного задания. В языке C++ вы можете сделать что-то вроде а = Ь * 2 + 5;
в одной строке. В языке ассемблера вам пришлось бы использовать 5 или 6 инструкций.
Преимущество №3: Вы не должны заботиться о таких деталях, как загрузка переменных в регистры процессора. Компилятор или интерпретатор берёт это на себя.
Преимущество №4: Высокоуровневые языки программирования более портируемые под различные архитектуры (но есть один нюанс).Нюанс заключается в том, что многие платформы, такие как Microsoft Windows, имеют свои собственные специфические функции, с помощью которых писать код намного легче. Но в таком случае приходится жертвовать портируемостью, так как функции, специфические для одной платформы, с большей долей вероятности, не будут работать на другой платформе. Обо всем этом мы детально поговорим на следующих уроках.
Добрый день, подскажите пожалуйста, не до конца понял жизненный цикл кода. Сперва мы пишем код на высокоуровневом языке, затем компилируем его и компилятор создает исполняемый файл(это машинный код кстати?), этот файл обращается к процессору и нам выводят результат. В уроке сказано, что после компиляция больше не происходит, и запускается только исполняемый файл. Но мы же часто меняем код, не так ли? Что происходит когда мы его меняем? Компиляция происходит заново? Или что-то происходит с исполняемым файлом?
Да, так и есть
Каждый раз меняя код, проходит компиляция, и только после повторного исполнения этого же кода не будет компилироваться
Даже малейшое изминение приведет к компиляции
теперь я знаю на что регулярно буду тратить время
200+ уроков + практические задания
…эх хочется сразу взять и как хакер шпарить в слепую код НО ничего не даётся просто так и начну с основ для объективно понимания
-а что есть программирование?
учится практиковать и ещё раз учится и практиковать ааа!
повторение мать учения!
ну что матросы, в путь! Pogнали
p.s. надеюсь переживу выгорание..
Как твои успехи, воин?
Это действительно неплохая статья по обучению по программированию, вот только есть один из самых главных нюансов,который тут не упоминается — МОТИВАЦИЯ и ВЫГОРАНИЕ.
Без или при очень слабой мотивации мало кто будет в состоянии учиться дальше.
А выгорание это очень страшный враг для программистов,который и говорит за тебя по типу:
"Меня это задолбало,лучше что нибудь ещё сделаю."
Я тому пример,я где то два раза конкретно прекращал учиться по этому курсу(хотя бы перерывы между этими попытками обучаться были гораздо меньше)
Просто добавьте страницу о МОТИВАЦИИ(какие именно и какие влияют сильнее) и ВЫГОРАНИИ(и как с этим бороться) чтобы полностью дополнить обучение по программированию.
Чувак, на эту тему можно столько всего расписать.
Какая-то html страничка с мотивационной речью не поможет.
На эту тему можно прочитать много различной литературы, например "Как научиться учиться" (Бозер У.) и ещё кучу психологической литературы. Из "лёгкой" и научно-популярной рекомендую посмотреть в сторону Курпатова и Даниела Ка́немана, например "Думай медленно решай быстро".
P.S. Осталось придумать, как заставить себя читать что-то. Верно?)) Хотя на эту проблему отвечает книга того же Курпатова "Красная таблетка".
Совершенно верно
мотивационный анекдот for over9000: один из одноклассников (добившийся успеха) устроил к себе водилой другого (лузера) за просто фантастическую зп (тот расчитался с долгами и т.д. и т.п.) … как-то раз сидят они в ресторане, а у лузера лицо чего-то жутко не довольное, ну друг его и спрашивает, мол, я ж тебе всё в жизни порешал, а тот ему и говорит, мол, таки, да, но, если б ещё кто-то за меня работал:-( 🙂
Я не совсем понял один момент.
Как я понял, 10110000 и mov al это вообще одно и тоже, просто по разному написано. Это значит, что мы записываем значение (пусть это будет 97d, 61h или 01100001) в регистр al. А вот в случае "а =" это значение тоже записывается в этот регистр, или в этом случае мы не знаем точно, куда оно записывается?
Как я понимаю, запись в зависимости от компилятора.
В fasm :
A dw 65535 — объявление 2-байтной переменной(именованного участка памяти ) и присвоение 65535
mov A, 32767 — присвоение A 32767
mov ax, [A] — перемещение в регистр значения A (32767), если просто A или ptr A — то её адреса
1. Байт «10110000» (или 0xb0 в шестнадцатеричной) — это код, который будучи выполненным на процессоре x86 приведет к записи в регистр al константы хранящейся в следующих байтах.
2. «mov al» — это целая строка из 6 байт, будучи скормленной ассемблеру он превратит её в тот самый «10110000» внутри исполняемой программы
3. С-шная строка «a = ..» — компилятором С превратится в итоге в целый набор команд процессора.
Например
Или даже
Переменная «а» здесь — набор ячеек в оперативной памяти, компилятор ранее, при обявлении переменной выделил из доступных ресурсов такой кусочек памяти, и будет далее хранить там значении некое значение, и в меру понимания его использовать и обрабатывать.
Спасибо за уроки
Добрый день, Юрий.
Задам вопрос, который наверняка интересует многих.
На сколько условных часов (дней, недель) рассчитан ваш курс при, допустим, пятидневной учебной неделе.
Понятно, что это очень условно и индивидуально, но я думаю такая статистика или что-то, типа "учебного плана", возможно у вас есть.
С уважением.
Здравствуйте! Как вы уже подметили, это очень условно и индивидуально, зависит от учащегося, его опыта и скорости прогрессирования, поэтому могу сказать только в общих чертах — без опыта за полгода-год можно пройти не спеша (1-2 урока в день). А то, как человек усваивает материал, сколько раз ему нужно перечитать то, что он не понял, делает ли он самостоятельно задания после уроков и проходит ли итоговые тесты — это всё также нужно учитывать.
Скажите пожалуйста, а будет-ли статья по написанию компилятора для своего языка программирования? Какие инструменты при этом нужно использовать? Какую литературу почитать? И т.д. А то до меня все никак не доходит как создаются языки программирования. Читал на других сайтах, но так ничего и не понял, ибо пишут поверхностно. Собственно хотелось-бы лучше узнать как это все взаимодействует между собой на практике…
Эта тема довольно сложная. Наилучший вариант — найти "Книгу дракона" (она так и называется). Там подробно описано, как создаются языки, и как под них делаются компиляторы или интерпретаторы.
Да, всё супер! Ни разу не программист, но читается легко и интересно!
🙂
Как я рад что существует такой великолепный сайт, как Ravesli.com, где можно черпать глубокие знания по изучению С++. Это лучший сайт из всех которые я когда-либо находил. Единственное, есть только один небольшой минус, — это отсутствие других языков программирования. Хотелось-бы увидеть другие языки, к примеру — Java. Прошу курсы по Java добавить, т.к. нигде такой детально-изложенной информации по изучению не нашел…
Пока что по Java ничего не планируется)
Поделюсь. На усвоение базового курса ушло 3 месяца и 330 часов (по 3 часа в день). Информация подана отлично и в базовых концепциях я теперь разбираюсь. Спасибо Юрию за перевод. Ничего более путного и сжатого в рунете нет по сабжу.
наконец-то, я увидел свет. спасибо!
Здравствуйте Юрий! Прочитал все комментарии, благодарю вас за самоотверженность и желание учиться и учить. Уже больше года изучаю программирование на вашем сайте и понимаю что ещё не всё освоил и не во всём разобрался. Вы большой мостак в этом деле. Мне ещё работать и работать. И впрямь как будто не початый край. Снова с нуля. Творите У вас хорошо получается!
Спасибо, мне очень приятно 😉
да статья правда хорошая мне нравится все понятно
Сайт отличный. Помогает расширять свои знания в IT
Очень надеюсь, что так и есть.
Привет! Очень интересная статья, благодарю за потраченое время и подробное разъяснение профанам.
Особенно понравилось, упоминания Assembler. Было бы неплохо объяснить начинающим, что компьютер понимает только цифры, то что мы видим — является GUI, тоесть графической оболочкой. Самым лучшим примером, того как на самом деле должен выглядеть рабочий стол — является дистрибутив Arch.
Спасибо огромное! Теперь буду учится)))))
Здравствуйте Юра! Я хотел бы научиться написать 3D игровой движок какие уроки прочитать по этой теме? Спасибо за ответ заранее.
Подскажите как вставлять код в комментарии, чтобы он сохранял структуру как в IDE(как примеры на сайте)? Использую Visual Studio.
Форматирование кода задаётся специальным плагином — просто загружайте обычный код, а дальше я отформатирую его самостоятельно.
Здраствуйте. Спасибо за такой понятный урок, но не совсем поняла, что значит таблица в конце. Спасибо.
Привет. Это всего лишь начало — продолжайте обучение 🙂
Спасибо автору!!!
Все предельно ясно разжовано.
Спасибо, что читаешь 🙂
Юра, значит мы вводим инструкции на высокоуровневом языке, компилятор переводит их в двоичный код, а процессор из этого двоичного кода еще какие-то инструкции ваяет? Просто из любопытства, если знаешь, напиши как они выглядят.
Микрокоманды для АЛУ, которое собсно и выполняет действия над битами данных.
Подскажите пожалуйста стоит мне начинать учить с c++ или лучше начать попроще изучить язык для понимания, до этого не занимался программированием. Спасибо!
Попробуйте и то, и другое. Затем и определите, что вам лучше подходит.
Помогите — не понял.
Машинный код 10110000 01100001 получается в результате инструкции a = 97;
10110000 == 176
01100001 == 97
'a' == 97
'=' == 61
'пробел' == 32
';' == 59
Как формируется машинный код ?
Спасибо.
Олег, а ты выдели свой вопрос и спроси у Гугла — прозреешь!
Отличный урок !
Кажется, на просторах интернета я откопала сокровище) Такое понятное изложение информации на вес золота.
Спасибо 🙂
Просто великолепно ! Я скажу очень бонально : я тоже искал , что-то подобное , находил , но обучение там шло очень не поэтапно . Например , тоже же самый St***k ( не буду рекламировать ) , который на одном уроке давал действительные числа и в тоже время множество функций , таже самая break …..
Но вот я нашел вас …. Сам тоже изучаю английский язык и совмещать полезно . У вас очень хорошая манера излагаться и главное : поэтапная подача . Пусть даже первая часть ( глава ) , которой даже опытные IT -специалисты крайне мало уделяют внимание . Ещё бы слепому набор научится
Сам люблю технологии , новинки и т.д , но вот только в 16-17 лет дошли руки до обучения программ.Но в тоже самое время считаю , что возраст 16-20 лет как раз для этого подходит , но учится не когда не поздно .
Огромное спасибо , добавился б в друзья , но вы не горите какой у вас name user в ВК .
Ещё раз огромное спасибо … Путь начался ⚡⚡⚡⭐⭐
Я в свои 17-18 лет тоже, когда нужно было уже что-то учить по C++ (в колледже этот язык программирования был основным) — пытался искать на просторах Рунета годные уроки. Нашел несколько сайтов, и как вы тоже говорите, сегодня учим "Hello, World!", завтра ООП, послезавтра паттерны проектирования и всё в этом роде. Так и задумался, что нет одного сайта в Рунете по изучению C++, где всё было бы поэтапно, с самых мелочей и уже до базовых вещей.
Насчет учиться — учиться никогда не поздно, но чем раньше, тем лучше 🙂
Спасибо, что читаете.
Успехов и удачи во всём !
Спасибо 🙂
Спасибо тебе, человечище! Хочу попробовать себя фрилансером после этого курса.
Привет, а практика будет? Тесты, задания и всё такое.
Всё есть в следующих уроках.
Хорошо, спасибо
Здравствуйте. Приятно удивлён способом изложения материала. Начало курса очень хорошее. Неделю искал по этой теме и склонился к мысли, что люди либо не умеют изложить суть понятно, либо у них совсем другие цели.
Большой плюс, что вы рассматриваете решение задачи при помощи разных программ.
Так же заслуживает внимания мысль одновременного изучения английского со слепым методом печатания. Всё к одному.
Что там получится у меня, не важно, мне на работу уже не надо, но ради интереса попробую.
Успехов в достойной профессии. Спасибо.
Здравствуйте. Приятно, что моя работа приносит кому-то пользу. Программирование и английский идут друг с другом (это не значит, что первое не может быть без второго) и, как по мне, отличный способ изучая программирование, подтягивать английский. Слепой набор очень экономит время при работе с компьютером вообще. Надеюсь, ваше желание не угаснет изучать программирование и дальше. Если есть к этому желание, то это довольно-таки интересное занятие.
Здравствуйте. Мне 16 и дело в том что я вообще не много знаю о компьютерах, о языках и обо всем этом можно сказать даже ничего не знаю. Я начал учить английский и хочу научиться языкам программирования подскажите что делать я с правильного сайта начал?
Привет, попробуй. Увидишь, есть ли польза или нет.
Учитель!!!! А задачки будут?
Спасибо тебе за труд!!!
Да, вот первая часть задачек по C++, дальше больше)
Добрый вечер! Я читаю ваши уроки и меня увлекает и нравится, хочу научиться программировать, сначаля для общего развития, а потом как пойдёт, вдруг по этой сфере пойду вперёд. Я хочу спросить у вас, сам результат той программы или игры, как мне его видеть в конечном результате. Я имею в виду, например пишу игру какую-нибудь, написал алгоритмы и для себя видеть результат, области карты которой написал, цвет, фон, герой которого написал и т.д. Подскажите пожалуйста, спасибо!
Привет. Вам её нужно скомпилировать и запустить. Смотрите ‘Урок 5. Компиляция вашей первой программы‘.
Наконец-то снова появилось желание учится по программиста. Третий год учусь уже на эту специальности и руки совсем начали опускаться. Потому что всё я слышу эти 3 года — мышка с шариком, монитор монохромный, таблицы в эксель.
И тут этот сайт просто как глоток свежего воздуха!
Поверьте, руки у вас ещё не раз опустятся. Но это нормально 😉
Спасибо большое брат, 2 месяца искал что-то похожее на это, век не забуду!
Мне всего 16, неплохо знаю PascalABC.NET (пробовал написать небольшую игру, кое-что вышло, но до ума не довел из-за тормозов то ли языка, то ли железа, то ли кривости моих рук), HTML 5 и CSS 3 (пробовал сайт писать из интереса). В общем, кодить — моё хобби. Есть мечта (написать игру с какой-нибудь командой) и желание учиться, чтобы писать годные вещи, а не кучу говнокода, а ты пишешь такие уроки! Большое спасибо тебе, Юра!)
16 лет — как раз золотое время для изучения программирования. Больше практики, своих проектов и всё обязательно получиться!)
спасибо за ресурс. начну свое самообучение…
Спасибо!
Благодаря тебе у меня вернулось желание обучаться на программиста.
Поступаю на второй курс, надеюсь, не слишком поздно начал)
Поверь, никогда не поздно, лишь бы нравилось.