Осваиваем Си по-быстрому
Модератор: Olej
Осваиваем Си по-быстрому
Добрый день!
Что бы вы могли порекомендовать чтобы начать быстро осваивать Си с прицелом на системное программирование под Linux?
Например:
Какие из ваших книг и в какой последовательности?
Какие книгу других авторов на эту тему почитать и в какой последовательности?
Возможно какие-то видео или каналы на youtube есть на эту тему?
Ну и вообще как наиболее эффективно организовать свое обучение в данной теме?
Что бы вы могли порекомендовать чтобы начать быстро осваивать Си с прицелом на системное программирование под Linux?
Например:
Какие из ваших книг и в какой последовательности?
Какие книгу других авторов на эту тему почитать и в какой последовательности?
Возможно какие-то видео или каналы на youtube есть на эту тему?
Ну и вообще как наиболее эффективно организовать свое обучение в данной теме?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Осваиваем Си по-быстрому
Отвечаю по порядку ... как я это понимаю:
С одной стороны, не зная C - нельзя толком знать и понимать Linux/UNIX, его API, библиотеки. (Я уже не говорю о ядре Linux, которое пишется и анализируется исключительно на C ... но ядра - это особая песня, и это всем не нужно.)
Т.е. понимать C, и глубоко, нужно обязательно!
С другой стороны, C - не лучший выбор на сегодня, даже для системного программирования в Linux. Почему? Потому что а). трудоёмкость разработки низкая, б). скорость разработки медленная, в). огромное количество ошибок и масса тестироваия и отладки.
Вопрос: а на чём же тогда писать системные утилиты Linux?
Ответ: во многих случаях это - Python. Иногда, и в некоторых областях это может быть Java. Из новых языков для этого - Go, как продолжение развития линии C/C++.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Осваиваем Си по-быстрому
Вообще то, для "крутого" программирования на 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: Осваиваем Си по-быстрому
Из того, что я написал - это не принципиально для изучения программирования 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:
P.S. Мне иногда пишут с вопросом: "Это часть 1. А где же часть 2?". Ответ: часть 2 - это такой же задачник но по языку C++.Задач с примерами на сегодня представлено 102
Я много участвовал в реальных внедрённых проектах и на C и на C++ ... и моё личное мнение, что это не 2 разных языка, а C++ это естественное, объектное развитие C (Б.Страуструп, автор, первоначально и называл язык не C++ а "C с классами").
Re: Осваиваем Си по-быстрому
Спасибо большое за обстоятельный ответ.
Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?
Возможно вы имели в виду что трудоемкость разработки высокая?
Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?
Re: Осваиваем Си по-быстрому
Спасибо большое за обстоятельный ответ.
Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?
А что вы скажете по поводу языка Rust для системного программирования?
Возможно вы имели в виду что трудоемкость разработки высокая?
Книгу "UNIX. разработка сетевых приложений" нашел только 2007 года. Были новее издания?
А что вы скажете по поводу языка Rust для системного программирования?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Осваиваем Си по-быстрому
Да, я хотел сказать что скорость разработки низкая. Скорость разработки эквивалентных программ на Python, например, может быть до 10 раз выше! То что потребует на Python написать за час, на C потребует полтора дня работы.
Книги Стивенса написаны во 2-й половине 90-х, сам Стивенс умер в молодом возрасте, в 96-м, кажется, году, но книги актуальности не потеряли. Поэтому перевод 2007 гола - самое то.
Хороший, новый язык, со строгой семантикой. См. код на Rust.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Осваиваем Си по-быстрому
В продолжение темы, чтобы не плодить новые темы...
В компиляторе GCC есть достаточно много малоизвестных расширений языка C. Часть из них местами используется по ходу кода ядра Linux. Те, кто не знают о таких расширений, столкнувшись с написанными такими конструкциями, теряются ... потому что очень мало написано информации по таким расширениям.
Вот из числа лучших описаний: 4. Расширения Семейства Языка C
В компиляторе 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: Осваиваем Си по-быстрому
Меня больше всего интересовало (с пользой использовал) возможность встроенных определений функций (локальные функции в функции).
Я, например, писал об этом расширении в нескольких своих статьях:
Язык 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 байт) 66 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Осваиваем Си по-быстрому
Характерно, что это именно расширение 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.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей