Я программирую на c++ и то давно уже не программирую. И я не знаю зачем я вообще смотрю лекцию про си, особенно с учетом того, что мне через 4 часа на работу вставать. Но очень залипательно! Лайк, подписка и с нетерпением жду ещё Ваших лекций!
Очень признателен за вашу работу и эту публикацию. Она мне как философу поможет обосновать решение проблемы субъектности и связи математики с социальной философией. Спасибо!
я не читал и не слушал ещё, но сама постановка проблемы очень обрадовала, это то, о чём я давненько думал, но не знал, как подступиться. Чуть освобожусь - и стану читать и вникать, спасибо огромное автору ❤
@olgapavlova я-то уже 5 лет как полюбил, руководитель в крупном банке в 26. А мог прям со школы, тогда в 18 можно было бы уже выходить на рынок труда сразу на достойные условия. Так что школота - мотайте на ус.
За 10 лет кодинга так и не столкнулся с ситуацией, где бы этот полиморфизм был прям нужен-нужен. Но для учебных целей, понимать, какую хрень тянет за собой всё это .... ДА, ЭТО ПОЛЕЗНО!
Да, дней через 10 сделаю про произвольное количество аргументов. Кодогенерацию в некоторых объёмах можно, постараюсь чуть позже показать основные штуки там.
Был на ютубе канал "си от эксперта", не обновлялся уже давно. Будете ли Вы рассматривать "тонкие" моменты при программировании в Си ( появление "утечек памяти", откуда они берутся, если в явном виде выделения не происходило и подобные моменты )?
А это тонкие? Я просто пребываю в счастливом заблуждении, что утечки памяти - это ого-го какие толстые моменты :) Наберу материала - расскажу, конечно. Спасибо за мысль!
2:00 В Си для мелочи-встройки или при очень строгих требованиях по быстродействию лучше переписать алгоритм под нативные для железки форматы данных, а сам язык позволяет удобно писать не выходя за рамки возможностей железа. 19:20 NULL - это не значение "ноль", это указатель (!!!) типа void, указывающий на нулевой адрес. При чтении такого указателя без разыменования будет считываться ноль, но тип такой "переменной" будет приводиться к типу, используемому в данной аппаратуре для указателей, как и при чтении любого другого указателя. В большинстве случаев это будет int. Но не всегда. ... В целом - жуть. Зашёл на заголовок про полиморфизм в Си, на деле тут вводная о том как написать макросы для реализации перегрузки в Си.
Может быть, язык и позволяет, а вот образовательные материалы по нему - нет. Вы правы, NULL - это _в большинстве случаев_ (но не всегда) void*. Знаете, я, пожалуй, продолжу ориентироваться не на вас, а на свою аудиторию и свои задачи. Правкам в комментах буду рада, могут пригодиться (а могут и нет).
@@olgapavlova Си как язык по сути является человекочитаемым аппаратно-независимым ассемблером, об этом часто забывают. Заходить в Си без знаний о регистрах, разрядности, ширине слов, АЛУ и прочих базовых понятий довольно странно. Все похожие на С++, C#, Java и других языков фокусы были введены в язык для того чтобы в компиляторах были одни и те же ассемблерные определения и поэтому рантаймы библиотеки написанные на разных языках в принципе можно было использовать совместно. Ну хорошо, не всегда на void. В любом случае, в Си и плюсах при начале работы на новой платформе и/или новом компиляторе всегда надо смотреть хотя бы в содержимое stddef, а не удивляться приведению к типу, указанному в макросе стандартного заголовочного файла. На тему ориентирования на аудиторию - в названии слово полиморфизм, а не деле всё не выходит за рамки самописного велосипеда для перегрузки имён функций. Это по сути введение в заблуждение. Нужен высокоуровневый язык с прямым доступом к памяти - берите плюсы. Си нужен там, где программист проверяет в дизассемблере вывод тулчейна, для чего в свою очередь нужно чтобы символы в дизассемблере и символы в исходнике всегда совпадали. Правки комментов - смотрю видео, по ходу дела пишу и дописываю комментарий. Так и получаются правки.
Ответственный подход, спасибо. Вообще я очень рада, что в комменты пришли люди, лучше меня (гораздо лучше!) разбирающиеся в предмете. Вы правы насчёт того, что без базовых понятий заходить в Си странно. Однако перед нами реальность: Си массово используют как первый язык. Да, в надежде на то, что человечество отвлечётся от Python и заметит, что программирует на железненьком таком компьютере, а не на Всемогущей Универсальной Шайтан-Машине с GUI-интерфейсом :-) Но, увы, это приводит к тому, к чему приводит: «Слушай, а программа - это вообще что?» Приходится объяснять. Разным людям разное. Заходите ещё :) Можно чуть позже, когда с драйверами будем развлекаться (точно будем).
Здравствуйте. Спасибо лекцию. После просмотра сразу возникли вопросы. 1) Как макрос _Generic реагирует на наличие модификаторов const, volatile, restrict у управляющего выражения? Он их отбрасывает, или нужно писать "реализацию" под каждый вариант/варианты? Или явно кастовать в тип без модификаторов? 2) Если передать NULL напрямую (без посредников-указателей) в управляющую конструкцию, то разве весь макрос не раскроется по ветке с int, ведь NULL = 0 по факту?
Прекрасные вопросы, спасибо. Отвечу в двух словах. 1. Все верхнеуровневые квалификаторы типа отвалятся перед сравнением. То есть тип const int в вариантах задавать нет смысла, достаточно int. И отличить тип с квалификатором от типа без квалификатора (верхнеуровневого) нельзя всё по той же причине: cvr-квалификаторы не доживают до момента сравнения, отваливаются. 2. В большинстве компиляторов конкретно для Си NULL - это макрос для сущности с типом (void *). Так что он чаще всего и опознаётся как void *. Что до равенства нулю, то это, скажем так, встречается, но далеко не повсеместно. Вообще тут не устоялась норма, насколько я знаю. Если ошибаюсь, буду рада об этом узнать.
Поскольку во freepascal(да, я патологоанатом) одинаково названные функции, но с разными аргументами считаются разными и ошибок компиляции не вызывают, я по наивности своей предполагал, что в в С тоже самое))) а оказывается необходимо женерик городить, но всё равно прикольно. А людей "боящихся" точку-с-запятой предлагаю в программисты не брать)))
Для процессора вообще нет таких понятий как переменная и тип данных. Существует только понятие данных и размера этих данных (byte, word, dword, qword). А остальное - это уже высокоуровневая интерпретация.
Ещё два шага - и мы доберёмся до того, что нет никаких нулей и единиц, а есть только по соглашению высокий и по тому же соглашению низкий уровень напряжения. И между ними кое-что внезапно вполне осязаемое :) Короче, каждой истории свой уровень абстракции.
Я не очень разобрался, но скорее всего проблема в том, что макрос подставлял не название функции, а её вызов. По всей видимости нужен более хитрый способ для подмены переменных для случая, когда типы меняются местами.
@@olgapavlova Обычно я его использовал, когда требовалось что-то разобрать на байты, или собрать обратно. Очень удобный инструмент при разборе, например, сетевых пакетов.
Я от не понимаю любителей С... ну ведь уже ж есть шаблоны в С++ :) Уже все изобрели и оттестировали. И виртуальность всякая есть. Нет, продолжают изобретать С++ в частных случаях.
@@olgapavlova Думаю, для линукса пропихнули. Я код ядра как-то глянул - случайный файл - и сразу увидел, как они там С++ /виртуальные функции изобретают. Зато все вручную, с "полным контролем". Я этого "контроля" наелся на МК-61 :))
так пусть изобретают, если есть желание. Всегда можно изобрести что-то новое. Если бы было таких людей, то, возможно, до сих пор на велосипеде ездили бы ногами от земли отталкиваясь :) Однако ж педали крутим.
Есть программы которые действительно хуже работают если написаны на с++ а не с. Это RT (реал тайм) приложения. Си код более поозрачен и главное более предсказуем по времени выполнения любого участка кода. Полной предсказуемости нет всё равно но всё гораздо более предсказуемо чем в Си++ программе где STL используется. Другая крайность это Си# там есть уборка мусора и любой деструктор не предсказуем. То есть время выполнения мало зависит от кода если объекты там создаются или удаляются а вот количество и фрагментированность свободной памяти на момент выполнения этого кода очень даже сильно влияют. Насчёт прозрачности тоже на голом Си как-то проще. В отладчике зайти в функцию это действительно зайти в одну функцию а в Си++ зачастую пока зайдёшь прийдется зайти и выйти в кучу функций преобразования для аргументов желаемой функции. Отладка в Си прозрачнее.
Я думаю изобретают, потому что С++ используют те кто пишет на С++, а вот С часто бывает мостом для других языков через FFI. Он проще как раз сопрягается с другими языками и поэтому ценен сам без С++.
Я программирую на c++ и то давно уже не программирую. И я не знаю зачем я вообще смотрю лекцию про си, особенно с учетом того, что мне через 4 часа на работу вставать. Но очень залипательно! Лайк, подписка и с нетерпением жду ещё Ваших лекций!
Очень признателен за вашу работу и эту публикацию. Она мне как философу поможет обосновать решение проблемы субъектности и связи математики с социальной философией. Спасибо!
Коммент в поддержку канала ❤❤❤
Мне прям очень^2 нравиться как Вы рассказываете.
я не читал и не слушал ещё, но сама постановка проблемы очень обрадовала, это то, о чём я давненько думал, но не знал, как подступиться. Чуть освобожусь - и стану читать и вникать, спасибо огромное автору ❤
Очень кртая лекция и не менее крутая лектор. Большое спасибо за понятное объяснение и интересную тему.
С моей подпиской к Вам придёт много народа. Так держать!
Женщина в Си это конечно удивительно и интересно, если бы у меня был такой учитель информатики думаю я бы полюбил программирование ещё в школе
Удивительно - это слон в 3D-принтере :) А женщины - они где только не, чего б и не в Си.
Сейчас-то полюбили? Надеюсь, да!
@olgapavlova я-то уже 5 лет как полюбил, руководитель в крупном банке в 26. А мог прям со школы, тогда в 18 можно было бы уже выходить на рынок труда сразу на достойные условия. Так что школота - мотайте на ус.
какая кринжатина всё-таки, и оно ж даже не понимает что пишет емое
За 10 лет кодинга так и не столкнулся с ситуацией, где бы этот полиморфизм был прям нужен-нужен. Но для учебных целей, понимать, какую хрень тянет за собой всё это .... ДА, ЭТО ПОЛЕЗНО!
Си прост, но нужно быть гением, чтобы понять его простоту.
И нужно быть PhD, чтобы понять, что там, где действительно нужна была простота, имеем...
Сам пишу на Python, но поскольку он написан на С, то однозначно лайк
30:25 Ещё хорошей практикой для макросов является использование конструкции do{}while(0)
Ждём видео про произвольное количество аргументов!! Возможно кстати можно кодогенерацию как-то настроить?
Да, дней через 10 сделаю про произвольное количество аргументов.
Кодогенерацию в некоторых объёмах можно, постараюсь чуть позже показать основные штуки там.
опять питон🙃🪱🪱. Благодарю Вас, много нового узнал👍🤝
Был на ютубе канал "си от эксперта", не обновлялся уже давно. Будете ли Вы рассматривать "тонкие" моменты при программировании в Си ( появление "утечек памяти", откуда они берутся, если в явном виде выделения не происходило и подобные моменты )?
А это тонкие? Я просто пребываю в счастливом заблуждении, что утечки памяти - это ого-го какие толстые моменты :) Наберу материала - расскажу, конечно. Спасибо за мысль!
2:00
В Си для мелочи-встройки или при очень строгих требованиях по быстродействию лучше переписать алгоритм под нативные для железки форматы данных, а сам язык позволяет удобно писать не выходя за рамки возможностей железа.
19:20
NULL - это не значение "ноль", это указатель (!!!) типа void, указывающий на нулевой адрес. При чтении такого указателя без разыменования будет считываться ноль, но тип такой "переменной" будет приводиться к типу, используемому в данной аппаратуре для указателей, как и при чтении любого другого указателя. В большинстве случаев это будет int. Но не всегда.
...
В целом - жуть. Зашёл на заголовок про полиморфизм в Си, на деле тут вводная о том как написать макросы для реализации перегрузки в Си.
Может быть, язык и позволяет, а вот образовательные материалы по нему - нет.
Вы правы, NULL - это _в большинстве случаев_ (но не всегда) void*.
Знаете, я, пожалуй, продолжу ориентироваться не на вас, а на свою аудиторию и свои задачи.
Правкам в комментах буду рада, могут пригодиться (а могут и нет).
@@olgapavlova
Си как язык по сути является человекочитаемым аппаратно-независимым ассемблером, об этом часто забывают. Заходить в Си без знаний о регистрах, разрядности, ширине слов, АЛУ и прочих базовых понятий довольно странно. Все похожие на С++, C#, Java и других языков фокусы были введены в язык для того чтобы в компиляторах были одни и те же ассемблерные определения и поэтому рантаймы библиотеки написанные на разных языках в принципе можно было использовать совместно.
Ну хорошо, не всегда на void. В любом случае, в Си и плюсах при начале работы на новой платформе и/или новом компиляторе всегда надо смотреть хотя бы в содержимое stddef, а не удивляться приведению к типу, указанному в макросе стандартного заголовочного файла.
На тему ориентирования на аудиторию - в названии слово полиморфизм, а не деле всё не выходит за рамки самописного велосипеда для перегрузки имён функций. Это по сути введение в заблуждение.
Нужен высокоуровневый язык с прямым доступом к памяти - берите плюсы. Си нужен там, где программист проверяет в дизассемблере вывод тулчейна, для чего в свою очередь нужно чтобы символы в дизассемблере и символы в исходнике всегда совпадали.
Правки комментов - смотрю видео, по ходу дела пишу и дописываю комментарий. Так и получаются правки.
Ответственный подход, спасибо.
Вообще я очень рада, что в комменты пришли люди, лучше меня (гораздо лучше!) разбирающиеся в предмете.
Вы правы насчёт того, что без базовых понятий заходить в Си странно. Однако перед нами реальность: Си массово используют как первый язык. Да, в надежде на то, что человечество отвлечётся от Python и заметит, что программирует на железненьком таком компьютере, а не на Всемогущей Универсальной Шайтан-Машине с GUI-интерфейсом :-) Но, увы, это приводит к тому, к чему приводит: «Слушай, а программа - это вообще что?» Приходится объяснять.
Разным людям разное. Заходите ещё :) Можно чуть позже, когда с драйверами будем развлекаться (точно будем).
Здравствуйте, а в рамках чего проходят данные стримы? Есть какой-то курс по си?
Да просто рассказываю что кажется интересным, никаких формальностей :)
Здравствуйте. Спасибо лекцию. После просмотра сразу возникли вопросы. 1) Как макрос _Generic реагирует на наличие модификаторов const, volatile, restrict у управляющего выражения? Он их отбрасывает, или нужно писать "реализацию" под каждый вариант/варианты? Или явно кастовать в тип без модификаторов? 2) Если передать NULL напрямую (без посредников-указателей) в управляющую конструкцию, то разве весь макрос не раскроется по ветке с int, ведь NULL = 0 по факту?
Прекрасные вопросы, спасибо.
Отвечу в двух словах.
1. Все верхнеуровневые квалификаторы типа отвалятся перед сравнением. То есть тип const int в вариантах задавать нет смысла, достаточно int. И отличить тип с квалификатором от типа без квалификатора (верхнеуровневого) нельзя всё по той же причине: cvr-квалификаторы не доживают до момента сравнения, отваливаются.
2. В большинстве компиляторов конкретно для Си NULL - это макрос для сущности с типом (void *). Так что он чаще всего и опознаётся как void *. Что до равенства нулю, то это, скажем так, встречается, но далеко не повсеместно. Вообще тут не устоялась норма, насколько я знаю.
Если ошибаюсь, буду рада об этом узнать.
Оооо!!!! Шикарная тема!
Познавательно очень! Расскажите какой стек применяете на работе? В каком области работаете?
Моя компания автоматизирует дизайн интерфейсов. От Си это очень, очень далеко.
@@olgapavlova что востребовано знать и уметь чтобы работать в eduhund?
@@tuksser TypeScript + React + общая эрудиция по фронтенду и сетям - ваши верные друзья :) Но мы пока не нанимаем.
А где можно посмотреть расписание будущих стримов?
Хорошая идея, спасибо. Вывешу в описание канала.
Ближайший - про ошибки как часть дизайна программы на C (Си).
@@olgapavlova это просто великолепно!
Ольга, а вы знате плюсы (C++)? Если да, то будут видео по нему?
Ага, будут видео по C++ - примерно через полгода.
Поскольку во freepascal(да, я патологоанатом) одинаково названные функции, но с разными аргументами считаются разными и ошибок компиляции не вызывают, я по наивности своей предполагал, что в в С тоже самое))) а оказывается необходимо женерик городить, но всё равно прикольно. А людей "боящихся" точку-с-запятой предлагаю в программисты не брать)))
1:14:33 офигенный пример
Просто апплодирую стоя😊
Ждём продолжение
Для процессора вообще нет таких понятий как переменная и тип данных. Существует только понятие данных и размера этих данных (byte, word, dword, qword). А остальное - это уже высокоуровневая интерпретация.
Ещё два шага - и мы доберёмся до того, что нет никаких нулей и единиц, а есть только по соглашению высокий и по тому же соглашению низкий уровень напряжения. И между ними кое-что внезапно вполне осязаемое :)
Короче, каждой истории свой уровень абстракции.
Отличный канал, как получить ваши замечательные настройки vim?
Спасибо за вопрос. Выложу. К сожалению, не обещаю, что скоро.
Я не очень разобрался, но скорее всего проблема в том, что макрос подставлял не название функции, а её вызов. По всей видимости нужен более хитрый способ для подмены переменных для случая, когда типы меняются местами.
Добью вопрос, ага. Спасибо за идею!
В каком редакторе происходит написание кода?
vim
Ольга вы очень обаятельная и грамотная женщина.
Почему бы вам не записать видео где вы рассказываете о себе, о занятиях и увлечениях?
@@Retro_Botanik Спасибо за идею!
@@olgapavlova Наш человек!!! Самый лучший редактор ( настроил под себя, с остальными только мучался месяцами ).
А как вам Zig?
О, вы уже второй, кто спрашивает :) Определённого мнения пока нет, но это временно. Расскажу, как будет что.
С таким применением union не согласен, а остальное - отлично.
А как вы его обычно используете?
@@olgapavlova Обычно я его использовал, когда требовалось что-то разобрать на байты, или собрать обратно. Очень удобный инструмент при разборе, например, сетевых пакетов.
Зачем это все чтобы напечатать одну строчку. Джависты: и это всё?
"Зловещая пауза" (с) 😊
Кто понял, тот понял
То есть на Си надо написать целую библиотеку чтобы сделать аналог паскалевского WriteLn(); ?) Эх, отсталый язык!)
И не говорите! Дикие люди, дети гор :)
У нас есть WriteLn дома (printf)
Я от не понимаю любителей С... ну ведь уже ж есть шаблоны в С++ :) Уже все изобрели и оттестировали. И виртуальность всякая есть. Нет, продолжают изобретать С++ в частных случаях.
Насамперед це iграшка. Як на мене, дуже цикава.
@@olgapavlova Думаю, для линукса пропихнули. Я код ядра как-то глянул - случайный файл - и сразу увидел, как они там С++ /виртуальные функции изобретают. Зато все вручную, с "полным контролем". Я этого "контроля" наелся на МК-61 :))
так пусть изобретают, если есть желание. Всегда можно изобрести что-то новое. Если бы было таких людей, то, возможно, до сих пор на велосипеде ездили бы ногами от земли отталкиваясь :) Однако ж педали крутим.
Есть программы которые действительно хуже работают если написаны на с++ а не с. Это RT (реал тайм) приложения. Си код более поозрачен и главное более предсказуем по времени выполнения любого участка кода. Полной предсказуемости нет всё равно но всё гораздо более предсказуемо чем в Си++ программе где STL используется. Другая крайность это Си# там есть уборка мусора и любой деструктор не предсказуем. То есть время выполнения мало зависит от кода если объекты там создаются или удаляются а вот количество и фрагментированность свободной памяти на момент выполнения этого кода очень даже сильно влияют. Насчёт прозрачности тоже на голом Си как-то проще. В отладчике зайти в функцию это действительно зайти в одну функцию а в Си++ зачастую пока зайдёшь прийдется зайти и выйти в кучу функций преобразования для аргументов желаемой функции. Отладка в Си прозрачнее.
Я думаю изобретают, потому что С++ используют те кто пишет на С++, а вот С часто бывает мостом для других языков через FFI. Он проще как раз сопрягается с другими языками и поэтому ценен сам без С++.
Типобезопасность в С - это просто ну конечно нужен не дедушкин С а какой-то более современный модификант или С3 на худой конец
Дорастём - разберём, ага.