2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Как выучить язык С?
Сообщение01.03.2021, 00:21 


01/03/21
6
Как изучили язык программирования С Вы?
Как посоветуете изучать С?
Это мой второй язык программирования, первым был Python, программировал на нём плотно около полугода, хотел бы изучить С так как на нём написано ядро GNU/Linux.
Заранее спасибо

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 02:03 
Заслуженный участник


09/05/12
25179
А в чем, собственно, проблема? Брать и учить, C не относится к числу языков с какой-то особо сложной идеологией и т.п. Так что лучше задавайте конкретные вопросы.
Viete в сообщении #1507059 писал(а):
Это мой второй язык программирования, первым был Python, программировал на нём плотно около полугода, хотел бы изучить С так как на нём написано ядро GNU/Linux.
Но вот мотивировку стоило бы дополнительно обдумать. Если у вас нет конкретной задачи, ради которой надо потрошить ядро Linux, то она достаточно сомнительна.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 14:21 


27/08/16
11088
С - самый низкоуровневый из широко используемых ныне языков высокго уровня. Его используют сейчас только если нужно программировать железо или что-то около него. Ядро операционки, например, драйвера. Для остальных задач он слишком примитивен. В этих околожелезячных областях также нечего делать без понимания, как работает процессор на нижнем уровне: что такое адресное пространство, что такое регистры, какие у процессора существуют команды? Вот с этого и начните, иначе, вам понять идеологию С после питона будет сложно.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 15:16 


01/03/21
6
Pphantom в сообщении #1507079 писал(а):
А в чем, собственно, проблема? Брать и учить, C не относится к числу языков с какой-то особо сложной идеологией и т.п. Так что лучше задавайте конкретные вопросы.
Viete в сообщении #1507059 писал(а):
Это мой второй язык программирования, первым был Python, программировал на нём плотно около полугода, хотел бы изучить С так как на нём написано ядро GNU/Linux.
Но вот мотивировку стоило бы дополнительно обдумать. Если у вас нет конкретной задачи, ради которой надо потрошить ядро Linux, то она достаточно сомнительна.

Да, я как-раз хочу посмотреть и отредактировать систему под свои нужды, для этого и требуется знание С, какие-либо книги есть по данному языку?

-- 01.03.2021, 15:17 --

realeugene в сообщении #1507137 писал(а):
С - самый низкоуровневый из широко используемых ныне языков высокго уровня. Его используют сейчас только если нужно программировать железо или что-то около него. Ядро операционки, например, драйвера. Для остальных задач он слишком примитивен. В этих околожелезячных областях также нечего делать без понимания, как работает процессор на нижнем уровне: что такое адресное пространство, что такое регистры, какие у процессора существуют команды? Вот с этого и начните, иначе, вам понять идеологию С после питона будет сложно.

Есть какие-то книги про темы которые вы упомянули, в каких есть информация о работе компьютера и т.п?

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 15:31 


27/08/16
11088
Viete в сообщении #1507147 писал(а):
Да, я как-раз хочу посмотреть и отредактировать систему под свои нужды
Это не для начинающих.

Viete в сообщении #1507147 писал(а):
Есть какие-то книги про темы которые вы упомянули, в каких есть информация о работе компьютера и т.п?
Море. Весь интернет перед вами.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 15:43 
Заслуженный участник


09/05/12
25179
realeugene в сообщении #1507137 писал(а):
Его используют сейчас только если нужно программировать железо или что-то около него. Ядро операционки, например, драйвера. Для остальных задач он слишком примитивен.
Пожалуй, все-таки есть еще одна ниша - вычислительное программирование, в нем C довольно активно используется.
Viete в сообщении #1507147 писал(а):
Да, я как-раз хочу посмотреть и отредактировать систему под свои нужды, для этого и требуется знание С
Кхм... боюсь, вы несколько переоцениваете собственные потребности (да и возможности). :-)
realeugene в сообщении #1507149 писал(а):
Это не для начинающих.
Да и не для 99% продолжающих. Даже не потому что слишком сложно, а просто совершенно незачем.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 16:12 


27/08/16
11088
Pphantom в сообщении #1507151 писал(а):
Пожалуй, все-таки есть еще одна ниша - вычислительное программирование, в нем C довольно активно используется.
От безысходности, видимо. Сишная арифметика указателей сильно мешает оптимизации. С другой стороны, машинное обучение сейчас почти всё на питоне в качестве скриптового языка верхнего уровня с сишными низкоуровневыми библиотеками. Которые развивают отдельные люди. А Comsol написан на джаве, вызывающей матричные алгоритмы для собственно перемалывания цифр.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 16:44 
Заслуженный участник


09/05/12
25179
realeugene в сообщении #1507156 писал(а):
От безысходности, видимо. Сишная арифметика указателей сильно мешает оптимизации.
Отчасти да (если очень хочется не пользоваться Фортраном :-)), но действительно хорошие оптимизирующие компиляторы, пожалуй, делаются только для троицы Fortran/C/C++, а по сравнению с последним C в этом качестве все-таки заметно лучше, и языковые средства для решения проблем с побочными эффектами из-за указателей (вроде restrict) в нем теперь есть.
realeugene в сообщении #1507156 писал(а):
С другой стороны, машинное обучение сейчас почти всё на питоне в качестве скриптового языка верхнего уровня с сишными низкоуровневыми библиотеками. Которые развивают отдельные люди. А Comsol написан на джаве, вызывающей матричные алгоритмы для собственно перемалывания цифр.
Да, но это в любом случае пища из полуфабрикатов, которые кто-то другой должен был изготовить. А сами полуфабрикаты делают почти исключительно на Фортране или Си (да и их последующее использование с другими языками скорее обусловлено незнанием этих, чем необходимостью в использовании других).

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 16:56 


27/08/16
11088
Pphantom в сообщении #1507161 писал(а):
а по сравнению с последним C в этом качестве все-таки заметно лучше

Ну да, в плюсах рестрикт существует только как нестандартное расширение. Тем не менее, оптимизатор скорее всего у них один с сями.

Pphantom в сообщении #1507161 писал(а):
А сами полуфабрикаты делают почти исключительно на Фортране или Си (да и их последующее использование с другими языками скорее обусловлено незнанием этих, чем необходимостью в использовании других).

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

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 17:01 
Заслуженный участник


09/05/12
25179
realeugene в сообщении #1507163 писал(а):
Нет конечно же. Не полуфабрикаты, а законченные и высоко оптимизироавнные библиотеки примитивов нижнего уровня.
Ну какая разница? Их же все равно кто-то должен писать.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 17:04 


27/08/16
11088
Pphantom в сообщении #1507165 писал(а):
Ну какая разница? Их же все равно кто-то должен писать.
Кто-то пишет MKL, кто-то пишет на HDL синтезируемые блоки процессоров, а кто-то вообще разрабатывает техпроцессы производства микросхем. У каждого свой профессиональный инструментарий.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 18:11 


10/04/12
706
realeugene в сообщении #1507156 писал(а):
От безысходности, видимо. Сишная арифметика указателей сильно мешает оптимизации.
Оптимизация такая вещь, что ей всегла что-нибудь да мешает. Поэтому находить альтернативу достаточно проблематично, арифметика указателей не самая большая проблема. Куда больше влияет cache friendly и т. п.

realeugene в сообщении #1507163 писал(а):
Ну да, в плюсах рестрикт существует только как нестандартное расширение. Тем не менее, оптимизатор скорее всего у них один с сями.
Ну... по стандарту, в C++ запись по указателю одного типа не инвалидирует указатели другого типа. А это уже частичный restrict, посему есть веротяность, что он реализован.

Ну и проверка
Используется синтаксис C
void f(int *a, int *b, int *x) {
  *a += *x;
  *b += *x;
}
void fr(int *restrict a, int *restrict b, int *restrict x) {
  *a += *x;
  *b += *x;
}
 
Далее
Используется синтаксис Bash
gcc -g -std=c99 -O3 -c main.c
objdump -S main.o
 
Получаем
Используется синтаксис Text
void f(int *a, int *b, int *x) {
    *a += *x;
   0:   8b 02                   mov    (%rdx),%eax
   2:   01 07                   add    %eax,(%rdi)
    *b += *x;
   4:   8b 02                   mov    (%rdx),%eax
   6:   01 06                   add    %eax,(%rsi)  

void fr(int *restrict a, int *restrict b, int *restrict x) {
    *a += *x;
  10:   8b 02                   mov    (%rdx),%eax
  12:   01 07                   add    %eax,(%rdi)
    *b += *x;
  14:   01 06                   add    %eax,(%rsi)
инструкцию наварили.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 18:23 


27/08/16
11088
mustitz в сообщении #1507175 писал(а):
Оптимизация такая вещь, что ей всегла что-нибудь да мешает.
Не "всегда". В данном случае, арифметика указателей убивает анализ потоков данных.

mustitz в сообщении #1507175 писал(а):
Ну... по стандарту, в C++ запись по указателю одного типа не инвалидирует указатели другого типа.
А вычислительный алгоритм работает с матрицами интов или даблов. То есть идёт активные чтение и запись одинаковых типов. Рестрикт в сях позволяет подсказать компилятору, что алиасинга не будет. Но вычислить по коду это сам компилятор не может, если ему недоступен код всей программы сразу. И скорее всего далеко не всегда может при глобальной оптимизации кода на уровне всей программы. Отсутствие алиасинга аргументов - это часть внешней семантики функции.

-- 01.03.2021, 18:35 --

mustitz в сообщении #1507175 писал(а):
инструкцию наварили.

Может и не одну. Оптимизация переставляет строки кода с комментариями, содержащими исходный код. Ваши куски ассемблерного кода не соответствуют сишным исходникам. Скорее всего, вы что-то отрезали.

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 19:38 


10/04/12
706
realeugene в сообщении #1507178 писал(а):
То есть идёт активные чтение и запись одинаковых типов. Рестрикт в сях позволяет подсказать компилятору, что алиасинга не будет.


Запись обычно идёт по одному указателю, а чтение часто идёт из const указателей. Даже если и будет, несколько избыточных операций чтения из кэша на фоне кэш промахов и TLB промахов вряд ли сильно скажутся на производительности. Если бы это действительно сильно аффектило производительность, то это проблему давно бы активно решали. На сегодня есть restrict, есть аналогичных расширения в С++, но его использование достаточно пассивное, и больше теоретическое.

-- 01.03.2021, 18:39 --

realeugene в сообщении #1507178 писал(а):
Ваши куски ассемблерного кода не соответствуют сишным исходникам. Скорее всего, вы что-то отрезали.


В каком месте?

 Профиль  
                  
 
 Re: Как выучить язык С?
Сообщение01.03.2021, 19:43 


27/08/16
11088
mustitz в сообщении #1507201 писал(а):
Запись обычно идёт по одному указателю, а чтение часто идёт из const указателей.
const не влияет на оптимизацию: как раз из-за алиасинга объект по константному указателю может изменяться при записи через неконстантный указатель. Повышение локальности обращений требует игр с представлениями данных в памяти и с указателями не связано никак.

mustitz в сообщении #1507201 писал(а):
но его использование достаточно пассивное, и больше теоретическое.
Я использовал.

mustitz в сообщении #1507201 писал(а):
В каком месте?
По краям, наверное.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

Сейчас этот форум просматривают: Dmitriy40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group