Си или не Си для начинающего? [re: Подскажите пособие для начинающего]
следует сразу определиться:так я вроде в самом начале написал.
— ты собираешься программировать для себя, писать маленькие программы-поделки и не углубляться в предмет;
— ты хочешь заняться этим профессионально;
Если же ты хочешь сделать программирование своей профессией, то обязательно надо научиться писать на Си, это как тренажерный зал для спортсмена. Нужно понять как вообще работает компьютер и операционная система, и учиться лучше по первоисточникам.Чушь какая.
Чушь какая.почему? мне нравится фраза, услышанная от моего одногруппника:
Не выйдет хороший программист, да и алгоритмист из человека, у которого в «черной коробке» живут «волшебные гномики», которые его несчастного спасут от злых утечек памяти. Я по крайней мере не видел. Когда хорошо знаешь, что у всей этой индустрии под капотом, несравненно проще осваивать новые абстракции. Когда же база выстроена на высокоуровневых абстракциях, разорвать этот шаблон и спуститься вниз в тысячи раз сложнее, чем увидеть общность среди примитивных процессорных опкодов и поняться наверх.
Не выйдет хороший программист, да и алгоритмист из человека, у которого в «черной коробке» живут «волшебные гномики», которые его несчастного спасут от злых утечек памяти.Поэтому хороших программистов-виндузятников не бывает?
Когда хорошо знаешь, что у всей этой индустрии под капотом, несравненно проще осваивать новые абстракции.Проще "за деревьями не видеть леса" когда хорошо знаешь что там под капотом. И как раз C-программисты этим отличаются.
Когда же база выстроена на высокоуровневых абстракциях, разорвать этот шаблон и спуститься вниз в тысячи раз сложнее, чем увидеть общность среди примитивных процессорных опкодов и поняться наверх.
Доказать можешь?
почему? мне нравится фраза, услышанная от моего одногруппника:Да, C знать надо, но вот по поводу первого языка есть вопросы. Недавно со мной поделились интересным мнением А. В. Столярова (преподавателя ВМК) по этому вопросу. Автор треда может сам его прочитать и прикинуть, являются ли указанные в нем барьеры для него серьезными.
Как я ожидал всё сваливается в срач. О си разговор завёл ни к сели ни к городу пианист а остальные повелись как малые дети.
А. В. СтоляроваСтоляров — ваще не аргумент. У меня за время учебы на ВМК сложилось строго негативное мнение об этом деятеле (в отличие от Чернова, который жог, как мог, объясняя как программировать на C).
Я его вообще не знаю лично, не сталкивался, но с изложенным в эссе согласен на 100%
Ну и давай тогда укажи авторитета, думающего иначе. Т.е. именно считающего, что первым же языком в жизни должен быть C.
Ответ на это "эссе" читал?
PS: с аргументами изложенными в эссе я согласен
Про больше практики — согласен, про то, что машина Тьюринга и тем более алгоритмы Маркова на первых занятиях — туфта, тоже. Но вот он ничего не говорит про абстракции, которые на C приходится реализовывать самому (передача параметров по значению, массивы это мне не нравится.
Если писался калькулятор, на вход он мог подать мегабайтное выражение, сгененированное perl -e прямо при студенте. Требовал, чтобы работало корректно.
Если задачей было реализовать моделирование системы массового обслуживания (супермаркета подавал на вход 200 Мб и надо было добиться, чтобы программа не падала по segfault из-за нехватки памяти (был 2002 год и на машине стояло 192 Мб).
То, что он не обо всем пишет в том блог-посте, ну так там и так простыня.
Если писался калькулятор, на вход он мог подать мегабайтное выражение, сгененированное perl -e прямо при студенте. Требовал, чтобы работало корректно.и зачем для первого и второго - нужен C?
Если задачей было реализовать моделирование системы массового обслуживания (супермаркета подавал на вход 200 Мб и надо было добиться, чтобы программа не падала по segfault из-за нехватки памяти (был 2002 год и на машине стояло 192 Мб).
По результатам курса хорошо ясно, как работают программы, но также люди начинают с особой тягой изучать python/java/C# и другие языки с плюшками, которых так не хватает в C/C++.
все равно нет ответа - почему именно C? почему тоже самое нельзя делать на более удобном языке?
В части посвященной ответу на эссе, он в основном возражает против потери целого семестра на паскаль. Против того, что у C в качестве первого языка программирования есть некоторые проблемы, он ничего не высказывает. Ну а далее уже вопрос к преподавателю: достаточно ли он хороший педагог, чтобы с этими проблемами разобраться? Если да - то можно сэкономить семестр. Если нет - то, видимо, лучше пойти более длинным путем. Автор треда сам себе преподаватель.
Автор треда может сам его прочитать и прикинуть, являются ли указанные в нем барьеры для него серьезными.Если убрать контекст "оставить ли на первом курсе ВМК паскаль", то эссе Столярова и пост Чернова друг другу не противоречат.
все равно нет ответа - почему именно C? почему тоже самое нельзя делать на более удобном языке?ответ: чтобы понимать, как это будет работать, будучи написанным на более удобным языке. Тот же шарп нам преподавали на третьем курсе.
Если убрать контекст "оставить ли на первом курсе ВМК паскаль", то эссе Столярова и пост Чернова друг другу не противоречат.отлично, я даже готов согласиться. Только вот Столяров хочет оставить паскаль, и это былинный бред. Я даже, наверное, не столько против Паскаля, сколько против того, как это преподается: изучается сферический стандартный паскаль, в методичках описано как и что там работает, при этом в мое время не было даже интерпретатора, который бы работал, как написано в методичках. В результате те, кто уже вполне был знаком с Turbo Pascal или Free Pascal, были вынуждены тупо зазубривать что там понаписали в методичках. Меня это весьма раздражало!
И да, с 1997 по 2002 годы, паскаль и дельфи были моими любимыми языками программирования. Т.е. против языка ничего не имею, подчеркиваю.
ответ: чтобы понимать, как это будет работать, будучи написанным на более удобным языке. Тот же шарп нам преподавали на третьем курсе.почему тогда не машинный код? еще более понятно будет, разве нет?
ps
я намекаю на то, что в зависимости от языка - какие-то аспекты более понятны, какие-то менее.
и я считаю - что более важны аспекты связанные с работой с абстракциями, чем с тем как устроен компьютер.
потому что в итоге 90% программистов - будут иметь большие проблемы от непонимания абстракций, и лишь в лучшем случае 10% программистов будут больше волновать проблема - а как там устроен компьютер.
и я считаю - что более важны аспекты связанные с работой с абстракциями, чем с тем как устроен компьютер.Согласен.
И вот ссылочка для любителей C про 1975 programming (Кстати, отвлекаясь от троллинга, реально приходилось давать C-программистам эту ссылочку чтобы отвлечь их наконец от считания байтиков в пользу продуктивной работы).
Еще, похоже, любители С какого-нибудь Лиспа в глаза не видели.
почему тогда не машинный код? еще более понятно будет, разве нет?Потому что это уже было на первом курсе, все хорошо.
psТ.е. ты хочешь сказать, что только 10% программистов не будут писать O(n^2) код, потому что не будут понимать, что происходит при:
я намекаю на то, что в зависимости от языка - какие-то аспекты более понятны, какие-то менее.
и я считаю - что более важны аспекты связанные с работой с абстракциями, чем с тем как устроен компьютер.
потому что в итоге 90% программистов - будут иметь большие проблемы от непонимания абстракций, и лишь в лучшем случае 10% программистов будут больше волновать проблема - а как там устроен компьютер.
s := ""
for i := 0; i < 10000; i++ {
s += "lala "
}
Отлично, давайте эти 10% программистов будут обучены на ВМК.
потому что в итоге 90% программистов - будут иметь большие проблемы от непонимания абстракций
Хочется верить, что на ВМК все же меньше чем у 90% студентов проблемы с непониманием абстракций.
Т.е. ты хочешь сказать, что только 10% программистов не будут писать O(n^2) код, потому что не будут понимать, что происходит при:для того, чтобы продемонстрировать, и объяснить эту проблему - нужна хорошая методичка, а не C.
code:
s := ""
for i := 0; i < 10000; i++ {
s += "lala "
}
прозрачная виртуальная машинка - которая демонстрирует что внутри нее происходит, была бы еще более полезна.
если бы легко можно было видеть, что память забивается осколками строк - это было бы намного нагляднее и поучительнее, чем использование ограниченных низкоуровневых языков.
для обучения всегда лучше повышать прозрачность, чем понижать мощность инструмента.
Хочется верить, что на ВМК все же меньше чем у 90% студентов проблемы с непониманием абстракций.те же самые монады - я думаю в лучшем случае 1% понимает (особенно, если учесть что их особо не преподают)
написать инвариант для реальной задачи (хотя бы для работы текстового редактора) - еще меньше.
если бы легко можно было видеть, что память забивается осколками строк - это было бы намного нагляднее и поучительнее, чем использование ограниченных низкоуровневых языковДа с ума можно сойти, кроме конкретного внутреннего устройства компа рюхать ещё какие-то абстрактные виртуальные машины. Конкретика всегда проще для понимания, чем абстракция. Явное лучше неявного и всё такое...
s := ""
for i := 0; i < 10000; i++ {
s += "lala "
}
тут наблюдается проблема не в алгоритме, а в языке, который тормозит на данном коде
Да с ума можно сойти, кроме конкретного внутреннего устройства компа рюхать ещё какие-то абстрактные виртуальные машины. Конкретика всегда проще для понимания, чем абстракция. Явное лучше неявного и всё такое...разве в компьютере есть что-то кроме - исполнителя и памяти?
разве в компьютере есть что-то кроме - исполнителя и памяти?
В абстрактном компьютере?
В абстрактном компьютере?в реальном?
тут наблюдается проблема не в алгоритме, а в языке, который тормозит на данном кодеда с чего бы? Строки во многих языках immutable для того, чтобы можно было их передавать в другой поток. Указанный код производит на свет кучу строк, занимаясь тупым копированием. Что делать? Какой из языков не тормозит на таком коде?
В реальном электричество бегает, оно исполнитель или память?
разве в компьютере есть что-то кроме - исполнителя и памяти?Это отдельный вопрос. Представь, что вместо "вот у нас компьютер, в нём есть процессор и память" тебе будут втирать "вон у нас виртуальная машина, называется МУРАВЕЙ, вот у неё тут ячейки памяти, и вот в этой программе на языке АЛГО-МУРАВЕЙ в этих ячейках памяти обнаруживается мусор".
разве в компьютере есть что-то кроме - исполнителя и памяти?конечно, хотя это и выглядит офтопиком.
даже по памяти - есть кеш-память. Если задача помещается в кеш второго уровня, она работает быстро, если нет — просасывает раз в 10.
Кстати, именно поэтому вычислительные программы на С могут работать сильно быстрее — на ряде задач код умещается в кеш первого уровня, а все данные, к которым доступ непоследователен - в кеш второго.
А у java/c# такого не выходит почему-то.
Если человек не знает, как устроен компьютер, для него это будет откровением. Узнав об этом, у него в мозгу заведется еще один гномик, но понимания не наступит.
В реальном электричество бегает, оно исполнитель или память?в реальном компьютере - еще звук жужит, и пыль собирается - это тоже важно знать для написания программы?
можно еще, конечно, реальный компьютер до уровня кварков разобрать...
но речь-то о том, о чем важно знать, а о чем не очень важно знать при написании программы...
А у java/c# такого не выходит почему-то.Да, да, и ещё есть своп и релокация. Меня тут недавно один из бывших падаванов спрашивал, почему код на C# иногда немножко подтормаживает. Написали систему с требованиями real time на C#, в лоб.
Если человек не знает, как устроен компьютер, для него это будет откровением. Узнав об этом, у него в мозгу заведется еще один гномик, но понимания не наступит.
даже по памяти - есть кеш-память. Если задача помещается в кеш второго уровня, она работает быстро, если нет — просасывает раз в 10.сколько этих кэшей, какого он размера?
еще кстати своп есть, из-за которого тоже может все тормозить.
и я всё к тому, что это все память: и кэш, и озу, и винт, и т.д. - но с разным временем доступа.
и дальше без всяких гномиков объясняется и показывается, что на каждом компьютере - виды и размеры памяти свои, что программа не влезшая в определенную память - начинает тормозить и т.д.
Кстати, именно поэтому вычислительные программы на С могут работать сильно быстрее — на ряде задач код умещается в кеш первого уровня, а все данные, к которым доступ непоследователен - в кеш второго.пруфлинк, пожалуйста.
А у java/c# такого не выходит почему-то.
по задачам на топкодере - это не так, там хорошо видно, что программы победители на C# и Java - большую часть времени живут в кэше, и именно поэтому работают быстрее.
Представь, что вместо "вот у нас компьютер, в нём есть процессор и память" тебе будут втирать "вон у нас виртуальная машина, называется МУРАВЕЙ, вот у неё тут ячейки памяти, и вот в этой программе на языке АЛГО-МУРАВЕЙ в этих ячейках памяти обнаруживается мусор".по мне лучше брать реальную платформу: java/.net/python/javascript и т.д. и на ней все это показывать.
чем обманывать себя, что понимание того, что у компьютера есть регистры - хоть как-то влияет на работу среднестатичной программы.
и я всё к тому, что это все память: и кэш, и озу, и винт, и т.д. - но с разным временем доступа.ты сам себе противоречишь. В твоей системе приходится это объяснять, рассказывая дополнительные факты, дополняющие высокоуровневую абстракцию (гномик а в системе обучения снизу-вверх, такие факты легко выводятся самостоятельно.
и дальше без всяких гномиков объясняется и показывается, что на каждом компьютере - виды и размеры памяти свои, что программа не влезшая в определенную память - начинает тормозить и т.д.
А вот ты знаешь, что в процессорах ARM кеш память устроена так, что можно залочить какие-то части памяти в кеше первого уровня и после этого работать с этой памятью как с регистрами? Как твоя высокоуровневая абстракция справится с этим фактом (если встретится задача, где этот факт важен).
понимание того, что у компьютера есть регистры - хоть как-то влияет на работу среднестатичной программы.все же я против того, чтобы на ВМК учили людей, которые будут программировать GUI и верстать сайты.
А вот для задач backend-а, такое понимание уже оказывает заметное влияние.
пруфлинк, пожалуйста.я не уверен, что смогу быстро его предоставить. Вернусь в тред, когда вспомню источник.
А вот ты знаешь, что в процессорах ARM кеш память устроена так, что можно залочить какие-то части памяти в кеше первого уровня и после этого работать с этой памятью как с регистрами? Как твоя высокоуровневая абстракция справится с этим фактом (если встретится задача, где этот факт важен).добавлю этот факт в модель, что у памяти вот такого вида бывает еще вот такая херотень (особенности, ограничения и т.д.).
зы
ты серьезно пытаешься меня убедить, что ты про кэш первого уровня знаешь что-то больше и полезнее, чем то, что это "такая особая быстрая память, вот с такими-то ограничениями"?
Как твоя высокоуровневая абстракция справится с этим фактом (если встретится задача, где этот факт важен).
В твоей системе приходится это объяснять, рассказывая дополнительные факты, дополняющие высокоуровневую абстракцию (гномик а в системе обучения снизу-вверх, такие факты легко выводятся самостоятельно.для вмк - напомню теорию информации (а то я вижу, что про компьютеры рассказали, а про природу абстракций забыли) - перейти от низкоуровневой абстракции к более высокоуровневой абстракции - это творческая задача (и часто даже не помогает полный перебор всех вариантов, в общем случае - полный перебор вариантов - это O(N^бесконечность и по памяти там все хреново перейти от более высокоуровневой абстракции к более низкоуровневой абстракции - это алгоритмическая задач (часто с мощностью вида - O(log N.
Т.е. мы опять приходим к ситуации: человеку с мозгом проще выводить факты, человеку без него — помнить.
для того, чтобы помнить основные факты, а остальные генерить нужно O(log N) памяти, где N - число фактов. В случае, если спускаться сверху вниз, помнить надо N.о, как ты хитро себя обманываешь.
Т.е. мы опять приходим к ситуации: человеку с мозгом проще выводить факты, человеку без него — помнить.
во-первых: как только ты зафиксировал, что есть основные факты, а есть не основные - ты уже ввел неявную высокоуровневую абстракцию на основе которой факты поделил на основные и нет.
во-вторых: "для того, чтобы помнить основные факты, а остальные генерить" - это есть алгоритм - спуска от высокоуровневой абстракции к низкоуровневым - обычно реализуется через разложение пространства фактов на независимые оси
ты уже ввел неявную высокоуровневую абстракцию на основе которой факты поделил на основные и нетМне просто интересно, ты в курсе, что больше 80% аудитории впадало в транс, когда Смелянский говорил "инвариант" и "предикат"? А ведь он преподавал паскаль. Интересно, какой процент аудитории будет впадать в транс при словах "неявная высокоуровневая абстракция"? Ещё интересно, как они будут отличать неявную и явную высокоуровневые абстракции?
Мне просто интересно, ты в курсе, что больше 80% аудитории впадало в транс, когда Смелянский говорил "инвариант" и "предикат"? А ведь он преподавал паскаль. Интересно, какой процент аудитории будет впадать в транс при словах "неявная высокоуровневая абстракция"? Ещё интересно, как они будут отличать неявную и явную высокоуровневые абстракции?столько же впадает в транс, когда первый раз слышит слово: интеграл, дифур, матрица и т.д., а потом ничего втягивается....
Ps
смелянский - плохо рассказывал про инварианты и предикаты: он очень мало рассказывал о пользе данного подхода, и вводил инварианты и предикаты очень механистично.
Ещё интересно, как они будут отличать неявную и явную высокоуровневые абстракции?простой встречный вопрос: чем понятия "явный" и "неявный" отличаются друг от друга?
простой встречный вопрос: чем понятия "явный" и "неявный" отличаются друг от друга?Ой, ведь есть ещё явные низкоуровневые абстракции, неявные низкоуровневые абстракции, явные низкоуровневые конкретизации, неявные низкоуровневые конкретизации, явные высокоуровневые конкретизации и неявные высокоуровневые конкретизации.
*удаляется втыкать на Hello World в машинных кодах*
Я даже, наверное, не столько против Паскаля, сколько против того, как это преподается: изучается сферический стандартный паскаль, в методичках описано как и что там работает, при этом в мое время не было даже интерпретатора, который бы работал, как написано в методичках. В результате те, кто уже вполне был знаком с Turbo Pascal или Free Pascal, были вынуждены тупо зазубривать что там понаписали в методичках. Меня это весьма раздражало!О да, с паскалем они конечно полный бред развели: на одном паскале нужно задания писать в машзале и совсем другой паскаль нужно сдавать на экзамене. Но дело тут не в паскале. С C можно обойтись не лучше: взять, и начать рассказывать язык в том виде, в котором он был изложен в первой редакции K&R.
Меня всегда интересовал вопрос: почему так получилось, что мы учим какой-то никому не известный "стандарт паскаль", а во втором семестре пишем на богом забытом 16-битном ассемблере, который без досбокса уже и не запустишь на современных машинах. Единственный осмысленный ответ, которой мне удалось найти: лень переписывать курс лекций и методички.
С C можно обойтись не лучше: взять, и начать рассказывать язык в том виде, в котором он был изложен в первой редакции K&R.С C++ и по сей день стандарт — это одно, Visual C++ — это другое, gcc — третье.
gcc — третье.но когда g++ -std=c++98 -pedantic отклоняется от стандарта, можно слать багрепорты )
*удаляется втыкать на Hello World в машинных кодах
33 C0 B4 09 BA 0A 01 CD 21 C3 Hello, world!$
И вот ссылочка для любителей C про 1975 programming (Кстати, отвлекаясь от троллинга, реально приходилось давать C-программистам эту ссылочку чтобы отвлечь их наконец от считания байтиков в пользу продуктивной работы).Странно чел пишет, зачем-то хвастается, что у него всего 18 системных вызовов, в то время тормоза-то будут при обращении к диску, которое у него в основном идёт не через системные вызовы.
Ему нужно считать промахи мимо кэша.
Недавно со мной поделились интересным мнением А. В. СтоляроваОн там передергивает регулярно.
насколько я понял, автор пишет о том, что он сделал свою реализацию файлов, проецируемых в память и свой менеджер памяти, учитывающий многопоточность. вроде бы первое и так было написано, и не в 2006 году даже (в винде во всяком случае такое есть наверно с вин2к, если не с NT насчет второго не знаю, но кажется и тут есть аналог. в чем смысл-то? кто про это знал и хотел - и так использовал, а кому лень или не знает - тот и теперь не будет.
Оставить комментарий
Werdna
Ты сделал абсолютно правильный выбор, но следует сразу определиться:— ты собираешься программировать для себя, писать маленькие программы-поделки и не углубляться в предмет;
— ты хочешь заняться этим профессионально;
Если для тебя программирование — хобби, то бери любой опенсорсный проект и улучшай его. Просто возьми программу которой ты пользуешься, и реализуй в ней что-то. Сделай полезное себе и людям, и быть может потом эту программу улучшать тебя будут просить другие.
Если же ты хочешь сделать программирование своей профессией, то обязательно надо научиться писать на Си, это как тренажерный зал для спортсмена. Нужно понять как вообще работает компьютер и операционная система, и учиться лучше по первоисточникам.