Осваиваем Си по-быстрому

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
c0dER
Интересующийся
Сообщения: 3
Зарегистрирован: 20 фев 2020, 18:29
Контактная информация:

Осваиваем Си по-быстрому

Непрочитанное сообщение c0dER » 21 фев 2020, 09:54

Добрый день!
Что бы вы могли порекомендовать чтобы начать быстро осваивать Си с прицелом на системное программирование под Linux?

Например:
Какие из ваших книг и в какой последовательности?
Какие книгу других авторов на эту тему почитать и в какой последовательности?
Возможно какие-то видео или каналы на youtube есть на эту тему?

Ну и вообще как наиболее эффективно организовать свое обучение в данной теме?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 21 фев 2020, 17:45

c0dER писал(а):
21 фев 2020, 09:54
Ну и вообще как наиболее эффективно организовать свое обучение в данной т
Отвечаю по порядку ... как я это понимаю:
c0dER писал(а):
21 фев 2020, 09:54
Что бы вы могли порекомендовать чтобы начать быстро осваивать Си с прицелом на системное программирование под Linux?
С одной стороны, не зная C - нельзя толком знать и понимать Linux/UNIX, его API, библиотеки. (Я уже не говорю о ядре Linux, которое пишется и анализируется исключительно на C ... но ядра - это особая песня, и это всем не нужно.)
Т.е. понимать C, и глубоко, нужно обязательно!
С другой стороны, C - не лучший выбор на сегодня, даже для системного программирования в Linux. Почему? Потому что а). трудоёмкость разработки низкая, б). скорость разработки медленная, в). огромное количество ошибок и масса тестироваия и отладки.
Вопрос: а на чём же тогда писать системные утилиты Linux?
Ответ: во многих случаях это - Python. Иногда, и в некоторых областях это может быть Java. Из новых языков для этого - Go, как продолжение развития линии C/C++.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 21 фев 2020, 17:56

c0dER писал(а):
21 фев 2020, 09:54
Какие книгу других авторов на эту тему почитать и в какой последовательности?
Вообще то, для "крутого" программирования на C в Linux вам нужна одна-единственная книжка, вот она:
Изображение
(я даже некоторым образом, в малой части текста, был научным редактором издания в издательстве "Символ-Плююс")

Есть более свежее издание (но я его в руках не держал - книга весьма дорогая):
Изображение
У. Ричард Стивенс Стивен Раго
UNIX. Профессиональное программирование, 3-е издание
ISBN: 978-5-93286-216-2
1104 страницы
декабрь 2013
Символ-Плюс, С.-Петербург
Может быть ещё дополнительно книги того же автора:
Изображение

Изображение

Больше вам по API Linux/UNIX/POSIX ничего не нужно, всё остальное будет попусту потраченное время!

P.S. Все эти книги можно свободно скачать по Интернет. Если не найдёте ссылок - спросите, я вам найду. ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 21 фев 2020, 18:25

c0dER писал(а):
21 фев 2020, 09:54
Какие из ваших книг и в какой последовательности?
Из того, что я написал - это не принципиально для изучения программирования C... не по этому нужно изучать язык.

Но там есть вещи, c которыми нужно ознакомиться для шлифовки своих представлений о C (тексты в формате .odt LibreOffice, и число страниц указано в этом формате A4):

- Язык C: заметки на полях, 115 стр. - дело в том, что все учебники описывают старый C (переписывают классический учебник K&R), но после этого были стандарты C89 и C99 (годы, соответственно), которые сильно расширяют возможности синтаксиса C. И наш компилятор GCC поддерживает эти новые возможности без дополнительных усилий!

- Языковая локализация C/C++, стр. 22 + Регулярные выражения C/C++, стр. 13 - это о русском языке с литералах C, то о чём иностранные авторы ничего не пишут + о обработке тестовой информации на C. Я не видел внятных описаний на этот счёт, поэтому пришлось сделать собственное исследование на этот счёт.

И большой помощью, для проверки, может стать: Задачи по программированию на языке C, часть 1, стр. 106:
Задач с примерами на сегодня представлено 102
P.S. Мне иногда пишут с вопросом: "Это часть 1. А где же часть 2?". Ответ: часть 2 - это такой же задачник но по языку C++.
Я много участвовал в реальных внедрённых проектах и на C и на C++ ... и моё личное мнение, что это не 2 разных языка, а C++ это естественное, объектное развитие C (Б.Страуструп, автор, первоначально и называл язык не C++ а "C с классами").

Аватара пользователя
c0dER
Интересующийся
Сообщения: 3
Зарегистрирован: 20 фев 2020, 18:29
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение c0dER » 25 фев 2020, 12:21

Спасибо большое за обстоятельный ответ.
Olej писал(а):
21 фев 2020, 17:45
С другой стороны, C - не лучший выбор на сегодня, даже для системного программирования в Linux. Почему? Потому что а). трудоёмкость разработки низкая
Возможно вы имели в виду что трудоемкость разработки высокая?

Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?

Аватара пользователя
c0dER
Интересующийся
Сообщения: 3
Зарегистрирован: 20 фев 2020, 18:29
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение c0dER » 25 фев 2020, 12:32

Спасибо большое за обстоятельный ответ.
Olej писал(а):
21 фев 2020, 17:45
С другой стороны, C - не лучший выбор на сегодня, даже для системного программирования в Linux. Почему? Потому что а). трудоёмкость разработки низкая
Возможно вы имели в виду что трудоемкость разработки высокая?

Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?

А что вы скажете по поводу языка Rust для системного программирования?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 25 фев 2020, 17:46

c0dER писал(а):
25 фев 2020, 12:32
Возможно вы имели в виду что трудоемкость разработки высокая?
Да, я хотел сказать что скорость разработки низкая. Скорость разработки эквивалентных программ на Python, например, может быть до 10 раз выше! То что потребует на Python написать за час, на C потребует полтора дня работы. :-?
c0dER писал(а):
25 фев 2020, 12:32
Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?
Книги Стивенса написаны во 2-й половине 90-х, сам Стивенс умер в молодом возрасте, в 96-м, кажется, году, но книги актуальности не потеряли. Поэтому перевод 2007 гола - самое то.
c0dER писал(а):
25 фев 2020, 12:32
А что вы скажете по поводу языка Rust для системного программирования?
Хороший, новый язык, со строгой семантикой. См. код на Rust.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 05 дек 2020, 22:06

В продолжение темы, чтобы не плодить новые темы...
В компиляторе GCC есть достаточно много малоизвестных расширений языка C. Часть из них местами используется по ходу кода ядра Linux. Те, кто не знают о таких расширений, столкнувшись с написанными такими конструкциями, теряются ... потому что очень мало написано информации по таким расширениям.

Вот из числа лучших описаний: 4. Расширения Семейства Языка C
GNU C обеспечивает некоторые языковые свойства, отсутствующие в стандарте ANSI C. (Опция `-pedantic` указывает GNU CC печатать предупреждающее сообщение, если какое-нибудь из этих свойств используется.) Чтобы проверить доступность этих свойств в условной компиляции, проверьте предопределенный макрос __GNUC__, который всегда определен под GNU CC.

Эти расширения доступны в C и в Objective C. Большая часть из них также доступна в C++.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 05 дек 2020, 22:54

Olej писал(а):
05 дек 2020, 22:06
В компиляторе GCC есть достаточно много малоизвестных расширений языка C.
Меня больше всего интересовало (с пользой использовал) возможность встроенных определений функций (локальные функции в функции).
Я, например, писал об этом расширении в нескольких своих статьях:
Язык C: заметки на полях
Задачи по программированию на языке C, часть 1 (обновление)
Там же пример кода:

Код: Выделить всё

#include <stdio.h>

void nested( void ) {         // вложенные функции 
   int array[] = { 1, -2, 3, -4, 5, -6, 7 },
       size = sizeof( array ) / sizeof( *array ), i;
   void pow2( void ) {        // вложенное 1-го уровня описание функции pow2() 
      int decr( int arg ) {   // ещё один 2-й уровень вложенности функции decr() 
         return arg - 1;
      }
      for( i = 0; i < size; i++ )
         array[ i ] = decr( array[ i ] ) * decr( array[ i ] );
   }
   printf( "вложенные функции GCC:\n" );
   printf( "до\t:" );
   for( i = 0; i < size; i++ )
      printf( "%2d%s", array[ i ], ( i == size - 1 ? "\n" : " , " ) );
   pow2();
   printf( "после\t:" );
   for( i = 0; i < size; i++ )
      printf( "%2d%s", array[ i ], ( i == size - 1 ? "\n" : " , " ) );
}

int main( int argc, char **argv, char **envp ) {
   nested();
}
И его выполнение:

Код: Выделить всё

olej@nvidia:~/2020_WORK/Zodiac_Systems/OWN-DRAFT-TESTs$ gcc -Wall -O nested.c -o nested

olej@nvidia:~/2020_WORK/Zodiac_Systems/OWN-DRAFT-TESTs$ ./nested 
вложенные функции GCC:
до	: 1 , -2 ,  3 , -4 ,  5 , -6 ,  7
после	: 0 ,  9 ,  4 , 25 , 16 , 49 , 36
Вложения
nested.c
(957 байт) 58 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Осваиваем Си по-быстрому

Непрочитанное сообщение Olej » 05 дек 2020, 22:56

Olej писал(а):
05 дек 2020, 22:54
Там же пример кода:
Характерно, что это именно расширение GCC!
Вот что будет в компиляторе Clang:

Код: Выделить всё

olej@nvidia:~/2020_WORK/Zodiac_Systems/OWN-DRAFT-TESTs$ clang --version
clang version 10.0.0-4ubuntu1 
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

Код: Выделить всё

olej@nvidia:~/2020_WORK/Zodiac_Systems/OWN-DRAFT-TESTs$ clang -xc -Wall -O nested.c -o nested
nested.c:7:22: error: function definition is not allowed here
   void pow2( void ) {        // вложенное 1-го уровня описание функции pow2() 
                     ^
nested.c:18:4: warning: implicit declaration of function 'pow2' is invalid in C99 [-Wimplicit-function-declaration]
   pow2(); 
   ^
1 warning and 1 error generated.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей