Си или не Си для начинающего? [re: Подскажите пособие для начинающего]

Werdna

что можно хорошего почитать учащего программированию с нуля на питоне? Писать я собираюсь только под линухом так что учебник начинающийся фразой "установите майкрософт визуал студию" (или что-нить в таком духе) не покатит.
Ты сделал абсолютно правильный выбор, но следует сразу определиться:
— ты собираешься программировать для себя, писать маленькие программы-поделки и не углубляться в предмет;
— ты хочешь заняться этим профессионально;
Если для тебя программирование — хобби, то бери любой опенсорсный проект и улучшай его. Просто возьми программу которой ты пользуешься, и реализуй в ней что-то. Сделай полезное себе и людям, и быть может потом эту программу улучшать тебя будут просить другие.
Если же ты хочешь сделать программирование своей профессией, то обязательно надо научиться писать на Си, это как тренажерный зал для спортсмена. Нужно понять как вообще работает компьютер и операционная система, и учиться лучше по первоисточникам.

YUAL

следует сразу определиться:
— ты собираешься программировать для себя, писать маленькие программы-поделки и не углубляться в предмет;
— ты хочешь заняться этим профессионально;
так я вроде в самом начале написал.

pilot

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

Helga87

Чушь какая.
почему? мне нравится фраза, услышанная от моего одногруппника:
Не выйдет хороший программист, да и алгоритмист из человека, у которого в «черной коробке» живут «волшебные гномики», которые его несчастного спасут от злых утечек памяти. Я по крайней мере не видел. Когда хорошо знаешь, что у всей этой индустрии под капотом, несравненно проще осваивать новые абстракции. Когда же база выстроена на высокоуровневых абстракциях, разорвать этот шаблон и спуститься вниз в тысячи раз сложнее, чем увидеть общность среди примитивных процессорных опкодов и поняться наверх.

pilot

Не выйдет хороший программист, да и алгоритмист из человека, у которого в «черной коробке» живут «волшебные гномики», которые его несчастного спасут от злых утечек памяти.
Поэтому хороших программистов-виндузятников не бывает?
Когда хорошо знаешь, что у всей этой индустрии под капотом, несравненно проще осваивать новые абстракции.
Проще "за деревьями не видеть леса" когда хорошо знаешь что там под капотом. И как раз C-программисты этим отличаются.
Когда же база выстроена на высокоуровневых абстракциях, разорвать этот шаблон и спуститься вниз в тысячи раз сложнее, чем увидеть общность среди примитивных процессорных опкодов и поняться наверх.

Доказать можешь?

Serab

почему? мне нравится фраза, услышанная от моего одногруппника:
Да, C знать надо, но вот по поводу первого языка есть вопросы. Недавно со мной поделились интересным мнением А. В. Столярова (преподавателя ВМК) по этому вопросу. Автор треда может сам его прочитать и прикинуть, являются ли указанные в нем барьеры для него серьезными.

YUAL

Как я ожидал всё сваливается в срач. О си разговор завёл ни к сели ни к городу пианист а остальные повелись как малые дети.

Helga87

А. В. Столярова
Столяров — ваще не аргумент. У меня за время учебы на ВМК сложилось строго негативное мнение об этом деятеле (в отличие от Чернова, который жог, как мог, объясняя как программировать на C).

Serab

Я его вообще не знаю лично, не сталкивался, но с изложенным в эссе согласен на 100%

Serab

Ну и давай тогда укажи авторитета, думающего иначе. Т.е. именно считающего, что первым же языком в жизни должен быть C.

Helga87

Ответ на это "эссе" читал? http://avchernov.livejournal.com/312.html

salamander

Столяров действительно не аргумент. Он - автор. А уж в эссе аргументы содержатся.
PS: с аргументами изложенными в эссе я согласен

Serab

Интересное мнение, тоже имеет право на жизнь. Понятно, что не существует лучших путей во всех случаях.
Про больше практики — согласен, про то, что машина Тьюринга и тем более алгоритмы Маркова на первых занятиях — туфта, тоже. Но вот он ничего не говорит про абстракции, которые на C приходится реализовывать самому (передача параметров по значению, массивы это мне не нравится.

Helga87

Я учился у него на втором курсе. Он как раз рассказывал C и потом C++. Приходилось писать довольно сложные задания и все необходимые абстракции в коде появлялись (он объяснял еще очень хорошо). Не могу сказать, что до этого я не умел программировать, но многое стало яснее (он убил во мне несколько гномиков)
Если писался калькулятор, на вход он мог подать мегабайтное выражение, сгененированное perl -e прямо при студенте. Требовал, чтобы работало корректно.
Если задачей было реализовать моделирование системы массового обслуживания (супермаркета подавал на вход 200 Мб и надо было добиться, чтобы программа не падала по segfault из-за нехватки памяти (был 2002 год и на машине стояло 192 Мб).
То, что он не обо всем пишет в том блог-посте, ну так там и так простыня.

Dasar

Если писался калькулятор, на вход он мог подать мегабайтное выражение, сгененированное perl -e прямо при студенте. Требовал, чтобы работало корректно.
Если задачей было реализовать моделирование системы массового обслуживания (супермаркета подавал на вход 200 Мб и надо было добиться, чтобы программа не падала по segfault из-за нехватки памяти (был 2002 год и на машине стояло 192 Мб).
и зачем для первого и второго - нужен C?

Helga87

была цель - изучить C. Для этого доходили до предела комфортности — т.е. такие вещи еще можно за несколько дней написать, но уже видны проблемы C. Показать эти проблемы было еще одной целью Чернова. В частности, именно после его курса, я достаточно нормально пишу на C, и крайне негативно отношусь к плюсам. Последнее сложилось после десятка занятий, начинавшихся с "что выведет эта программа", где давалась программа на 5 строчек и никто не мог понять, что именно она выведет. Просто из-за слишком сложных правил инициализации в C++, а также кривой реализации множественного наследования.
По результатам курса хорошо ясно, как работают программы, но также люди начинают с особой тягой изучать python/java/C# и другие языки с плюшками, которых так не хватает в C/C++.

Dasar

все равно нет ответа - почему именно C? почему тоже самое нельзя делать на более удобном языке?

salamander

Вот ты опять судишь об эссе оп автору, вместо того, чтобы судить об авторе по эссе. :)
В части посвященной ответу на эссе, он в основном возражает против потери целого семестра на паскаль. Против того, что у C в качестве первого языка программирования есть некоторые проблемы, он ничего не высказывает. Ну а далее уже вопрос к преподавателю: достаточно ли он хороший педагог, чтобы с этими проблемами разобраться? Если да - то можно сэкономить семестр. Если нет - то, видимо, лучше пойти более длинным путем. Автор треда сам себе преподаватель.
Автор треда может сам его прочитать и прикинуть, являются ли указанные в нем барьеры для него серьезными.
Если убрать контекст "оставить ли на первом курсе ВМК паскаль", то эссе Столярова и пост Чернова друг другу не противоречат.

Helga87

все равно нет ответа - почему именно C? почему тоже самое нельзя делать на более удобном языке?
ответ: чтобы понимать, как это будет работать, будучи написанным на более удобным языке. Тот же шарп нам преподавали на третьем курсе.

Helga87

Если убрать контекст "оставить ли на первом курсе ВМК паскаль", то эссе Столярова и пост Чернова друг другу не противоречат.
отлично, я даже готов согласиться. Только вот Столяров хочет оставить паскаль, и это былинный бред. Я даже, наверное, не столько против Паскаля, сколько против того, как это преподается: изучается сферический стандартный паскаль, в методичках описано как и что там работает, при этом в мое время не было даже интерпретатора, который бы работал, как написано в методичках. В результате те, кто уже вполне был знаком с Turbo Pascal или Free Pascal, были вынуждены тупо зазубривать что там понаписали в методичках. Меня это весьма раздражало!
И да, с 1997 по 2002 годы, паскаль и дельфи были моими любимыми языками программирования. Т.е. против языка ничего не имею, подчеркиваю.

Dasar

ответ: чтобы понимать, как это будет работать, будучи написанным на более удобным языке. Тот же шарп нам преподавали на третьем курсе.
почему тогда не машинный код? еще более понятно будет, разве нет?
ps
я намекаю на то, что в зависимости от языка - какие-то аспекты более понятны, какие-то менее.
и я считаю - что более важны аспекты связанные с работой с абстракциями, чем с тем как устроен компьютер.
потому что в итоге 90% программистов - будут иметь большие проблемы от непонимания абстракций, и лишь в лучшем случае 10% программистов будут больше волновать проблема - а как там устроен компьютер.

pilot

и я считаю - что более важны аспекты связанные с работой с абстракциями, чем с тем как устроен компьютер.
Согласен.
И вот ссылочка для любителей C про 1975 programming (Кстати, отвлекаясь от троллинга, реально приходилось давать C-программистам эту ссылочку чтобы отвлечь их наконец от считания байтиков в пользу продуктивной работы).
Еще, похоже, любители С какого-нибудь Лиспа в глаза не видели.

Helga87

почему тогда не машинный код? еще более понятно будет, разве нет?
Потому что это уже было на первом курсе, все хорошо.
ps
я намекаю на то, что в зависимости от языка - какие-то аспекты более понятны, какие-то менее.
и я считаю - что более важны аспекты связанные с работой с абстракциями, чем с тем как устроен компьютер.
потому что в итоге 90% программистов - будут иметь большие проблемы от непонимания абстракций, и лишь в лучшем случае 10% программистов будут больше волновать проблема - а как там устроен компьютер.
Т.е. ты хочешь сказать, что только 10% программистов не будут писать O(n^2) код, потому что не будут понимать, что происходит при:

s := ""
for i := 0; i < 10000; i++ {
s += "lala "
}

Отлично, давайте эти 10% программистов будут обучены на ВМК.

asvsergey

потому что в итоге 90% программистов - будут иметь большие проблемы от непонимания абстракций

Хочется верить, что на ВМК все же меньше чем у 90% студентов проблемы с непониманием абстракций.

Dasar

Т.е. ты хочешь сказать, что только 10% программистов не будут писать O(n^2) код, потому что не будут понимать, что происходит при:
code:
s := ""
for i := 0; i < 10000; i++ {
s += "lala "
}
для того, чтобы продемонстрировать, и объяснить эту проблему - нужна хорошая методичка, а не C.
прозрачная виртуальная машинка - которая демонстрирует что внутри нее происходит, была бы еще более полезна.
если бы легко можно было видеть, что память забивается осколками строк - это было бы намного нагляднее и поучительнее, чем использование ограниченных низкоуровневых языков.
для обучения всегда лучше повышать прозрачность, чем понижать мощность инструмента.

Dasar

Хочется верить, что на ВМК все же меньше чем у 90% студентов проблемы с непониманием абстракций.
те же самые монады - я думаю в лучшем случае 1% понимает (особенно, если учесть что их особо не преподают)
написать инвариант для реальной задачи (хотя бы для работы текстового редактора) - еще меньше.

kokoc88

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

Maurog


s := ""
for i := 0; i < 10000; i++ {
s += "lala "
}

тут наблюдается проблема не в алгоритме, а в языке, который тормозит на данном коде

Dasar

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

asvsergey

разве в компьютере есть что-то кроме - исполнителя и памяти?

В абстрактном компьютере? :)

Dasar

В абстрактном компьютере?
в реальном?

Helga87

тут наблюдается проблема не в алгоритме, а в языке, который тормозит на данном коде
да с чего бы? Строки во многих языках immutable для того, чтобы можно было их передавать в другой поток. Указанный код производит на свет кучу строк, занимаясь тупым копированием. Что делать? Какой из языков не тормозит на таком коде?

asvsergey

В реальном электричество бегает, оно исполнитель или память?

kokoc88

разве в компьютере есть что-то кроме - исполнителя и памяти?
Это отдельный вопрос. Представь, что вместо "вот у нас компьютер, в нём есть процессор и память" тебе будут втирать "вон у нас виртуальная машина, называется МУРАВЕЙ, вот у неё тут ячейки памяти, и вот в этой программе на языке АЛГО-МУРАВЕЙ в этих ячейках памяти обнаруживается мусор".

Helga87

разве в компьютере есть что-то кроме - исполнителя и памяти?
конечно, хотя это и выглядит офтопиком.
даже по памяти - есть кеш-память. Если задача помещается в кеш второго уровня, она работает быстро, если нет — просасывает раз в 10.
Кстати, именно поэтому вычислительные программы на С могут работать сильно быстрее — на ряде задач код умещается в кеш первого уровня, а все данные, к которым доступ непоследователен - в кеш второго.
А у java/c# такого не выходит почему-то.
Если человек не знает, как устроен компьютер, для него это будет откровением. Узнав об этом, у него в мозгу заведется еще один гномик, но понимания не наступит.

Dasar

В реальном электричество бегает, оно исполнитель или память?
в реальном компьютере - еще звук жужит, и пыль собирается - это тоже важно знать для написания программы?
можно еще, конечно, реальный компьютер до уровня кварков разобрать...
но речь-то о том, о чем важно знать, а о чем не очень важно знать при написании программы...

kokoc88

А у java/c# такого не выходит почему-то.
Если человек не знает, как устроен компьютер, для него это будет откровением. Узнав об этом, у него в мозгу заведется еще один гномик, но понимания не наступит.
Да, да, и ещё есть своп и релокация. Меня тут недавно один из бывших падаванов спрашивал, почему код на C# иногда немножко подтормаживает. Написали систему с требованиями real time на C#, в лоб.

Dasar

даже по памяти - есть кеш-память. Если задача помещается в кеш второго уровня, она работает быстро, если нет — просасывает раз в 10.
сколько этих кэшей, какого он размера?
еще кстати своп есть, из-за которого тоже может все тормозить.
и я всё к тому, что это все память: и кэш, и озу, и винт, и т.д. - но с разным временем доступа.
и дальше без всяких гномиков объясняется и показывается, что на каждом компьютере - виды и размеры памяти свои, что программа не влезшая в определенную память - начинает тормозить и т.д.
Кстати, именно поэтому вычислительные программы на С могут работать сильно быстрее — на ряде задач код умещается в кеш первого уровня, а все данные, к которым доступ непоследователен - в кеш второго.
А у java/c# такого не выходит почему-то.
пруфлинк, пожалуйста.
по задачам на топкодере - это не так, там хорошо видно, что программы победители на C# и Java - большую часть времени живут в кэше, и именно поэтому работают быстрее.

Dasar

Представь, что вместо "вот у нас компьютер, в нём есть процессор и память" тебе будут втирать "вон у нас виртуальная машина, называется МУРАВЕЙ, вот у неё тут ячейки памяти, и вот в этой программе на языке АЛГО-МУРАВЕЙ в этих ячейках памяти обнаруживается мусор".
по мне лучше брать реальную платформу: java/.net/python/javascript и т.д. и на ней все это показывать.
чем обманывать себя, что понимание того, что у компьютера есть регистры - хоть как-то влияет на работу среднестатичной программы.

Helga87

и я всё к тому, что это все память: и кэш, и озу, и винт, и т.д. - но с разным временем доступа.
и дальше без всяких гномиков объясняется и показывается, что на каждом компьютере - виды и размеры памяти свои, что программа не влезшая в определенную память - начинает тормозить и т.д.
ты сам себе противоречишь. В твоей системе приходится это объяснять, рассказывая дополнительные факты, дополняющие высокоуровневую абстракцию (гномик а в системе обучения снизу-вверх, такие факты легко выводятся самостоятельно.
А вот ты знаешь, что в процессорах ARM кеш память устроена так, что можно залочить какие-то части памяти в кеше первого уровня и после этого работать с этой памятью как с регистрами? Как твоя высокоуровневая абстракция справится с этим фактом (если встретится задача, где этот факт важен).

Helga87

понимание того, что у компьютера есть регистры - хоть как-то влияет на работу среднестатичной программы.
все же я против того, чтобы на ВМК учили людей, которые будут программировать GUI и верстать сайты.
А вот для задач backend-а, такое понимание уже оказывает заметное влияние.

Helga87

пруфлинк, пожалуйста.
я не уверен, что смогу быстро его предоставить. Вернусь в тред, когда вспомню источник.

Dasar

А вот ты знаешь, что в процессорах ARM кеш память устроена так, что можно залочить какие-то части памяти в кеше первого уровня и после этого работать с этой памятью как с регистрами? Как твоя высокоуровневая абстракция справится с этим фактом (если встретится задача, где этот факт важен).
добавлю этот факт в модель, что у памяти вот такого вида бывает еще вот такая херотень (особенности, ограничения и т.д.).
зы
ты серьезно пытаешься меня убедить, что ты про кэш первого уровня знаешь что-то больше и полезнее, чем то, что это "такая особая быстрая память, вот с такими-то ограничениями"?

Dasar

Как твоя высокоуровневая абстракция справится с этим фактом (если встретится задача, где этот факт важен).
 В твоей системе приходится это объяснять, рассказывая дополнительные факты, дополняющие высокоуровневую абстракцию (гномик а в системе обучения снизу-вверх, такие факты легко выводятся самостоятельно.
для вмк - напомню теорию информации (а то я вижу, что про компьютеры рассказали, а про природу абстракций забыли) - перейти от низкоуровневой абстракции к более высокоуровневой абстракции - это творческая задача (и часто даже не помогает полный перебор всех вариантов, в общем случае - полный перебор вариантов - это O(N^бесконечность и по памяти там все хреново перейти от более высокоуровневой абстракции к более низкоуровневой абстракции - это алгоритмическая задач (часто с мощностью вида - O(log N.

Helga87

для того, чтобы помнить основные факты, а остальные генерить нужно O(log N) памяти, где N - число фактов. В случае, если спускаться сверху вниз, помнить надо N.
Т.е. мы опять приходим к ситуации: человеку с мозгом проще выводить факты, человеку без него — помнить.

Dasar

для того, чтобы помнить основные факты, а остальные генерить нужно O(log N) памяти, где N - число фактов. В случае, если спускаться сверху вниз, помнить надо N.
Т.е. мы опять приходим к ситуации: человеку с мозгом проще выводить факты, человеку без него — помнить.
о, как ты хитро себя обманываешь.
во-первых: как только ты зафиксировал, что есть основные факты, а есть не основные - ты уже ввел неявную высокоуровневую абстракцию на основе которой факты поделил на основные и нет.
во-вторых: "для того, чтобы помнить основные факты, а остальные генерить" - это есть алгоритм - спуска от высокоуровневой абстракции к низкоуровневым - обычно реализуется через разложение пространства фактов на независимые оси

kokoc88

ты уже ввел неявную высокоуровневую абстракцию на основе которой факты поделил на основные и нет
Мне просто интересно, ты в курсе, что больше 80% аудитории впадало в транс, когда Смелянский говорил "инвариант" и "предикат"? А ведь он преподавал паскаль. Интересно, какой процент аудитории будет впадать в транс при словах "неявная высокоуровневая абстракция"? :smirk: Ещё интересно, как они будут отличать неявную и явную высокоуровневые абстракции? :crazy:

Dasar

Мне просто интересно, ты в курсе, что больше 80% аудитории впадало в транс, когда Смелянский говорил "инвариант" и "предикат"? А ведь он преподавал паскаль. Интересно, какой процент аудитории будет впадать в транс при словах "неявная высокоуровневая абстракция"? Ещё интересно, как они будут отличать неявную и явную высокоуровневые абстракции?
столько же впадает в транс, когда первый раз слышит слово: интеграл, дифур, матрица и т.д., а потом ничего втягивается....
Ps
смелянский - плохо рассказывал про инварианты и предикаты: он очень мало рассказывал о пользе данного подхода, и вводил инварианты и предикаты очень механистично.

Dasar

Ещё интересно, как они будут отличать неявную и явную высокоуровневые абстракции?
простой встречный вопрос: чем понятия "явный" и "неявный" отличаются друг от друга?

kokoc88

простой встречный вопрос: чем понятия "явный" и "неявный" отличаются друг от друга?
Ой, ведь есть ещё явные низкоуровневые абстракции, неявные низкоуровневые абстракции, явные низкоуровневые конкретизации, неявные низкоуровневые конкретизации, явные высокоуровневые конкретизации и неявные высокоуровневые конкретизации. :o
*удаляется втыкать на Hello World в машинных кодах*

salamander

Я даже, наверное, не столько против Паскаля, сколько против того, как это преподается: изучается сферический стандартный паскаль, в методичках описано как и что там работает, при этом в мое время не было даже интерпретатора, который бы работал, как написано в методичках. В результате те, кто уже вполне был знаком с Turbo Pascal или Free Pascal, были вынуждены тупо зазубривать что там понаписали в методичках. Меня это весьма раздражало!
О да, с паскалем они конечно полный бред развели: на одном паскале нужно задания писать в машзале и совсем другой паскаль нужно сдавать на экзамене. Но дело тут не в паскале. С C можно обойтись не лучше: взять, и начать рассказывать язык в том виде, в котором он был изложен в первой редакции K&R.
Меня всегда интересовал вопрос: почему так получилось, что мы учим какой-то никому не известный "стандарт паскаль", а во втором семестре пишем на богом забытом 16-битном ассемблере, который без досбокса уже и не запустишь на современных машинах. Единственный осмысленный ответ, которой мне удалось найти: лень переписывать курс лекций и методички.

Serab

С C можно обойтись не лучше: взять, и начать рассказывать язык в том виде, в котором он был изложен в первой редакции K&R.
С C++ и по сей день стандарт — это одно, Visual C++ — это другое, gcc — третье.

procenkotanya

gcc — третье.
но когда g++ -std=c++98 -pedantic отклоняется от стандарта, можно слать багрепорты )

elenangel

*удаляется втыкать на Hello World в машинных кодах
 
 33 C0 B4 09 BA 0A 01 CD 21 C3 Hello, world!$ 

Marinavo_0507

И вот ссылочка для любителей C про 1975 programming (Кстати, отвлекаясь от троллинга, реально приходилось давать C-программистам эту ссылочку чтобы отвлечь их наконец от считания байтиков в пользу продуктивной работы).
Странно чел пишет, зачем-то хвастается, что у него всего 18 системных вызовов, в то время тормоза-то будут при обращении к диску, которое у него в основном идёт не через системные вызовы.
Ему нужно считать промахи мимо кэша.

apl13

Недавно со мной поделились интересным мнением А. В. Столярова
Он там передергивает регулярно.

elenangel

насколько я понял, автор пишет о том, что он сделал свою реализацию файлов, проецируемых в память и свой менеджер памяти, учитывающий многопоточность. вроде бы первое и так было написано, и не в 2006 году даже (в винде во всяком случае такое есть наверно с вин2к, если не с NT насчет второго не знаю, но кажется и тут есть аналог. в чем смысл-то? кто про это знал и хотел - и так использовал, а кому лень или не знает - тот и теперь не будет.
Оставить комментарий
Имя или ник:
Комментарий: