язык C: неизвестное о известном
Добавлено: 21 ноя 2013, 16:50
Вот ненароком, не планируемо и попутно сложилась любопытная тема: язык C в Linux: вопросы начального уровня.
Началось обсуждение как подборка некоторых учебных примеров кода, обращающих внимание на всякие тонкости языка C, на которые хотелось бы обратить внимание начинающих ... напимер:
- различные представления одних и тех же данных в RAM когда на них накладываются предположения различной типизации;
- запись бесконечных циклов (в разной форме) и предпочтительность бесконечных циклов традиционным с условиями в заголовках;
- запись циклов без тела (когда все действия записаны в условиях);
и т.п.
Т.е., это отчасти элементы трюков ... но их хорошо бы научиться видеть, замечать, и понимать в коде.
Но дальше этот набор ... "задрочек", простите за выражение, расширялся, обсуждение уже перевалило за 6 страниц форума, и начало дополняться такими подробностями, что не всегда упоминаются в широкой литературе...
Так что и название темы "вопросы начального уровня" уже перестало соответствовать наполнению ... но не менять же название?
Теперь это уже ... что-то типа: "реализация на C всяких тонких возможностей".
Ну что ещё вообще можно сказать нового про язык C???, которого год рождения - 1969г., год зрелости - 1973г., на котором написано кода больше чем на любом другом языке отдельно взятом (все UNIX-like OS + весь GNU софт + множество свободных проектов + ...)
Оказывается - можно ... т.е. не то, чтобы "нового", а:
- ... такого, что появилось в более поздних стандартах (C99): complex и long double типы значений и др. - что не упоминается в учебниках 20-30 летней давности и 10-го издания, по которым все и учатся ... и о том как эти типы можно использовать куда более широко - тот же complex как представление 2D-координат точек ... чем, по существу, числа complex и являются;
- ... того, что сложилось как "тенденция" последних лет ... например использование циклических двухсвязных списков везде в ядре Linux, вместо самых разнообразных (линейных односвязных и др.) списков, которые и описываются везде в книгах ... и это (из kernel Linux) очень здоровая тенденция, строить на таких списковых структурах любые ссылочные (динамические) структуры;
- ... то, что не является какой-то спецификой С, а есть свойством (почти) любого языка программирования - это уже уже из области алгоритмики ... но на что недостаточно обращают внимание излагая C: использование рекурсии, нисходящая и восходящая рекурсии, оценка достижимой погрешности при итерационных вычислениях и т.п.
В теме их 6-ти страниц обсуждения множество примеров кода на все эти случаи ... большинство из этих примеров достаточно детально там обсуждается.
Рекомендую поглядеть в тему язык C в Linux: вопросы начального уровня.
... и указать на ещё какие тонкие моменты (как языка так и алгоритмики), которые следовало бы иллюстрировать показательными примерами кода.
Началось обсуждение как подборка некоторых учебных примеров кода, обращающих внимание на всякие тонкости языка C, на которые хотелось бы обратить внимание начинающих ... напимер:
- различные представления одних и тех же данных в RAM когда на них накладываются предположения различной типизации;
- запись бесконечных циклов (в разной форме) и предпочтительность бесконечных циклов традиционным с условиями в заголовках;
- запись циклов без тела (когда все действия записаны в условиях);
и т.п.
Т.е., это отчасти элементы трюков ... но их хорошо бы научиться видеть, замечать, и понимать в коде.
Но дальше этот набор ... "задрочек", простите за выражение, расширялся, обсуждение уже перевалило за 6 страниц форума, и начало дополняться такими подробностями, что не всегда упоминаются в широкой литературе...
Так что и название темы "вопросы начального уровня" уже перестало соответствовать наполнению ... но не менять же название?
Теперь это уже ... что-то типа: "реализация на C всяких тонких возможностей".
Ну что ещё вообще можно сказать нового про язык C???, которого год рождения - 1969г., год зрелости - 1973г., на котором написано кода больше чем на любом другом языке отдельно взятом (все UNIX-like OS + весь GNU софт + множество свободных проектов + ...)
Оказывается - можно ... т.е. не то, чтобы "нового", а:
- ... такого, что появилось в более поздних стандартах (C99): complex и long double типы значений и др. - что не упоминается в учебниках 20-30 летней давности и 10-го издания, по которым все и учатся ... и о том как эти типы можно использовать куда более широко - тот же complex как представление 2D-координат точек ... чем, по существу, числа complex и являются;
- ... того, что сложилось как "тенденция" последних лет ... например использование циклических двухсвязных списков везде в ядре Linux, вместо самых разнообразных (линейных односвязных и др.) списков, которые и описываются везде в книгах ... и это (из kernel Linux) очень здоровая тенденция, строить на таких списковых структурах любые ссылочные (динамические) структуры;
- ... то, что не является какой-то спецификой С, а есть свойством (почти) любого языка программирования - это уже уже из области алгоритмики ... но на что недостаточно обращают внимание излагая C: использование рекурсии, нисходящая и восходящая рекурсии, оценка достижимой погрешности при итерационных вычислениях и т.п.
В теме их 6-ти страниц обсуждения множество примеров кода на все эти случаи ... большинство из этих примеров достаточно детально там обсуждается.
Рекомендую поглядеть в тему язык C в Linux: вопросы начального уровня.
... и указать на ещё какие тонкие моменты (как языка так и алгоритмики), которые следовало бы иллюстрировать показательными примерами кода.