Этапы компиляции: предобработка, трансляция, компоновка. Компилятор GCC. Компиляция в консоли. Курс молодого бойца по информатике (Язык Си). cs.mipt.ru/c_intro
Ни одного препода в ВУЗе не было, которые так объясняли бы! Обидно, что на такую большую страну приходится так мало профессионалов (именно в сфере преподавания). Спасибо, Тимофей!
Иван, спасибо за отзыв. Благодарность можно перечислять в FSF.org, именно они воодушевляют меня на максимальное в моей жизни использование свободных лицензий для контента.
Один этап пропущен - перевод программы с текста на Си в текст на языке ассемблера, а уже потом ассемблерный код транслируется в объектный в двоичном виде.
Спасибо за уроки по языку Си! В интернете более-менее приемлимые уроки только по С++, а вот по Си люди такие видео делают, что можно уснуть. У вас все очень понятно, не скучно, лаконично. Мне 30 лет я и решил только сейчас начать программирование изучать.
Мне почти 40, нормально! К 40-ка будешь на 5 ЯПах в уме задачи щёлкать, если не оставишь упражнения. Могу рекомендовать сразу для Ведроидов по-мелочи что-то собирать -- вход в тему несколько утомительный, но в этом будущее.
Переменная PATH сбросится если закрыть консоль и заново открыть. Поэтому лучше уж сразу в переменные среды вписать через графический интерфейс. Точнее в переменных среды найти PATH и отредактировать
эхх пришла в школу 21 в бассейн, а незнание таких элементарных вещей заступорило, в результате утонула во второй день и утопила мечты(. Спасибо большое за уроки!
Пока что лучшее видео в ютубе на данную тему, очень наглядно, понятно и четко, остальные видео либо совсем для тех, кто самостоятельно компьютер включить не может, либо абы что и абы как. Спасибо.
Спасибо за видео, скажите пожалуйста при компиляции берётся только те функции из библиотек что использовали в коде или вся библиотека копулируется в конечной exe файл.
добрый день, Тимофей. мне не совсем понятно как выделять вручную файл препроцессинга. файл .с компилируется и работает, но когда я перенаправляю вручную x.c >prep_x.c компилятор мне сообщает о синтаксической ошибке. типа нету аргументов в функции main(), но я сейчас на том этапе обучения, когда еще оставляю там пусто, поскольку не понимаю что туда писать когда в самой функции уже есть все необходимые данные для работы такой примитивной программы как принтф. спасибо.
Подскажите пожалуйста, почему в видео файле hello_preprocessed.o код не на языке ассемблера? Увидел puts, но то что в блакноте не похоже на язык ассемблера, какие то символы, или это зависит от того, где открывать объектный файл? Я новичок в программировании, никогда ранее не изучал вопрос, что происходит после того, как я запускаю программу на языке высокого уровня. Большое спасибо за видео! Заранее спасибо за помощь!
Почему у меня через терминал не получается "Hello World" открыть ? У меня и близко нет там ничего такого что тут рассматривается . В "Build log " у меня тоже ничего связанного с mingv32-gcc.exe нет. Почему у меня этого всего нет ?
Вот такое я пропустил, при первичном изучении. Мне и без этого было очень тяжело это все понимать. Сам СИ. Я тогда пропустил все это, руками еще писать, и все эти процессы - там О файлы... Я тогда не стал это изучать. Сейчас зато вот посмотрел как это делается. Что это такое.
немного не понятно, почему на этапе компоновки нужно связаться со стандартной библиотекой? разве препроцессор не копирует ее в файл? зачем тогда еще раз к ней подключаться?
Как я понимаю препроцессор копирует весь файл стандартной библиотеки, а на этапе компоновки в исполняемый файл добавляются только те функции из стандартной библиотеки, которые будут вызыватся в самой программе
@@user-rr7tl7hf7q Есть заголовочные файлы, а есть библиотеки и это не одно и то же (мне раньше это было не очевидно). Заголовочный файл - это просто ОБЪЯВЛЕНИЯ функций, просто список как бы, что вот такие функции есть в программе. Библиотека - это файл, который содержит ОПРЕДЕЛЕНИЕ этих функций, то есть код, где написано, что делает функция. Заголовочных файлов может быть много. Библиотек может быть много. Препроцессор копирует текст из заголовочных файлов в код программы, теперь программа знает, какие функции в ней будут использоваться, но еще не знает, как они устроены. Компоновщик соединяет файлы с кодом и библиотеки (библиотека тоже файл), теперь, программа знает как работают функции, которые были объявлены в заголовочном файле. нигде не могла найти доступное объяснение, пришлось основательно изучать этот вопрос, тогда-то и стало понятно. надеюсь, поможет))
Подскажите пожалуйста. Ведь после препроцессинга файла, инклюд вставляет исходный код библиотеки в код нашей программы. Тогда куда пропадает код библиотеки при трансляции в объектный файл? И тогда зачем нужен линкер, если на этапе препроцессинга код библиотеки или другого файла при помощи инклюда вставляется в наш файл?
Код пропадает, скорее всего, потому что у компиляторов есть такая оптимизация как Dead Code Elimination, которая убирает из исходников/промежуточного представления код, который нигде не используется
Неверное утверждение, что при препроцессинге вставляется код. Вставляются прототипы, и константы. Т.е. это лишь позволяет компилятору корректно оформить вызовы функций. А код вставляется уже при компоновке, и при этом вместо мнемонических символов проставляются реальные адреса (это и есть связывание, поэтому его еще называют линковщик)
А представьте, что вы в блокноте открыли исходники hello world, поменяли букву и случайно написали программу, раскрывающую секреты мироздания. Надо было сохранить и в виртуалке запустить!
А можно как-то обойтись без библиотек? Они же много весят и перегружены лишними функциями, которые нам могут вообще не пригодиться. Я думал в Си этого будет меньше и он сам по себе самодостаточен. В принципе я же могу сам написать нужные мне функции? Зачем тогда библиотеки, если я знаю что именно мне нужно?
Коллега, давайте без фанатизма. Вы не напишете вывод без стандартных либ, а если напишете быстро поймете, что это было вам не нужно. И с чего вы взяли, что лишние функции, которые есть в либе попадают к вам исполнимый файл?
Чем больше пользуюсь Линуксом, тем больше понимаю : "хочешь научиться программировать - сначала поставь себе на комп какую-нибудь Ubuntu, чтобы потом не испытывать гемора..." Просто Линукс в принципе "заточен" под это.