LINUX.ORG.RU

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

 , , ,

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

4

5

Тихо и незаметно 30 апреля 2026 года вышло издание 2.92, которое наконец включает в себя читаемый текстовый слой.

Исправлены опечатки и ошибки, обнаруженные в предыдущих изданиях, в частности 2.91 (где введена кликабельная навигация) и 2.9 (первое чисто электронное издание).

Книга предназначена для самообучения основам программирования и в отличии от многих других изданий предполагает фундаментальный подход — вначале основы дискретной математики и использования GNU/Linux или BSD с командной строкой, затем паскаль, потом ассемблер и только потом Си, системное программирование и альтернативные парадигмы (функциональное, логическое и так далее).

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

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

>>> Ссылка на страницу издания

>>> Альтернативные способы скачивания

>>> Новость на сайте автора

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 10)
Ответ на: комментарий от liksys

Убирание указателей и упрощение синтаксиса - это усложнение, так и запишем.

В питоне синтаксис сложнее чем в паскале. Уменьшение количества необходимых слов — это не упрощение синтаксиса. Выделение блока кода выравниванием — это всё равно операторные скобки по сути, как и begin / end.

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

С питоном понятно: на нем легко писать высокоуровневые алгоритмы со сложной логикий, многопоточность и прочее, но он медленный для процессороемких задач.

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

Что ты будешь делать с миллиардом простых чисел в консоли, скажи мне пожалуйста?

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

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

Но зачем? Чем тебе вообще сдался этот питон?

Никто в здравом уме не пишет числодробилки на чистом питоне.

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

Xenius ★★★★★
() автор топика
Ответ на: комментарий от monk

Затем, что это нынче используется практически во всех языках. От JS до Scala.

И что? Зачем это студенту, который пока не знает, чем отличается if от while? Чтобы у него совсем каша была в голове?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Понятно, что это не надо первой конструкцией. Но это надо до конца курса. То есть или выкидывать Паскаль сразу после указателей и учить синтаксис Питона или всё-таки изначально выбирать язык, на котором можно показать все часто используемые концепции.

monk ★★★★★
()
Ответ на: комментарий от liksys

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

Не предлагает. У него указатели ближе к концу паскалевской части, а побочные эффекты в середине. И ничего сложного в них нет.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от vM

Или расширить учебное подмножество Паскаля замыканиями и async’ами.

Кстати, хорошая идея. В конце концов сделали же американцы Racket из Scheme именно для учебных целей, напихав в него весь Computer Science.

monk ★★★★★
()
Ответ на: комментарий от monk

Понятно, что это не надо первой конструкцией. Но это надо до конца курса.

Смысл? Ну понятно, «ну вот ещё так можно», но какую это практическую задачу решает?

Вот твоя эта фигня например, возвращает процедуру которая выдаёт значение указанной переменной плюс один. И смысл в этом какой?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Вот твоя эта фигня например, возвращает процедуру которая выдаёт значение указанной переменной плюс один. И смысл в этом какой?

В том, что это на Паскале непредставимо.

monk ★★★★★
()
Ответ на: комментарий от Xenius

возвращает процедуру которая выдаёт значение указанной переменной плюс один. И смысл в этом какой?

Одноразовый генератор натуральных чисел

>>> def inc(a):
...     def f():
...             nonlocal a
...             a += 1
...             return a
...     return f
...
>>> g = inc(8)
>>> g()
9
>>> g()
10
>>> g()
11
>>>

Реалистичным примером мог быть генератор псевдослучайных чисел с заданными параметрами распределения.

vM ★★★
()
Ответ на: комментарий от liksys

То есть - уже достаточно мощные, хотя и мертвые ныне языки. Уже на этом этапе можно задуматься, что лучше использовать что-то другое, если тебе всё равно не хватает классическо-академического паскаля.

Не пойму зачем бы надо было учить на классически-академическом? Как раз, чтобы иметь возможность решать практические задачи и нужно что-то более совремённое, если так можно сказать про подмножество 30-летней давности в противовес 50-летней.

Но насколько можно назвать мёртвыми - вопрос. Совсем не мейнстрим явно, но последняя коммерческая (притом совсем не дешёвая) версия Embarcadero Delphi 13 была выпущена менее года назад. FreePascal тоже развивается и выпускаются регулярно версии, как и GUI конструктор к нему - Lazarus.

Сейчас сделал небольшой поиск на предмет Top10 активных проектов на Pascal на гитхабе. PeaZip, Double Commander, PascalABC.NET, Castle Game Engine, Cheat Engine, HeidiSQL , HedgeWars, mORMot Framework, NewPascal, Graphics32

Дело, конечно, ещё в том, что исторически Delphi/Borland Pascal не очень популярна была для OpenSource, т.к. проприетарные. Но, например, на sql.ru до его закрытия, соответствующая ветка форума была очень популярна.

Я не фанат паскаля, но в принципе, если кому хочется, можно даже новый проект на нём начать. Сейчас поискал, даже нашёл не заброшенные фреймворки (хотя и уступающие PyTorch) для ML и DL и инференса. Кое-что даже заинтересовало настолько, что пожалуй попробую на днях https://github.com/joaopauloschuler/neural-api - кроссплатформенный (Win/Lin), поддерживает ускорения с SIMD-инструкциями(AVX2, AVX512), а также OpenCL - у PyTorch, между прочим, с этим некоторые проблемы есть. Плюс сразу GUI в Lazarus.

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

P.S. Хотя действительно серьёзный проект начинать на FreePascal я бы поостерёгся, как-то поддержка FreePascal зыбко выглядит, а у Delphi своя коммерческая экосистема и тоже более на легаси заточенная. Да и программистов найти сложно. Но как хобби не стал бы отговаривать.

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 1)
Ответ на: комментарий от monk

На словаре можно арифметику алфавитного дерева порядка - что несколько освобождает от перевёрнутой нотации привитой личинкам на не рефлексирующей стадии

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

В указателях реально мало сложного. Основная сложность в импеданс сишной нотации и массовым не различении имени и именуемого.

qulinxao3 ★☆
()
Ответ на: комментарий от vM

Хз как ваш оппонент ,есть достаточно проработанный подход у Северенса python зачем частности в сяшке

И есть Уорен(Грег кадацен там и Орен) который воркшом Карпентер - у него питон забавно пригоутавляетя

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

Сорян , но ты реально( а не для красного словца) не отдупляешь интенции Вирта vs Опоссума?!

При этом обр. Уровень популуса разный межу 50 оборотами земли

qulinxao3 ★☆
()
Ответ на: комментарий от anonymous_incognito

Но насколько можно назвать мёртвыми - вопрос. Совсем не мейнстрим явно, но последняя коммерческая (притом совсем не дешёвая) версия Embarcadero Delphi 13 была выпущена менее года назад. FreePascal тоже развивается и выпускаются регулярно версии, как и GUI конструктор к нему - Lazarus.

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

Учитывая, что индустрия давно от него отказалась, и решение любой проблемы ты скорее всего найдешь на чем угодно, но не на паскале - смысл учить паскаль нет никакого. А живость языка оценить очень легко: по количеству открытых вакансий. В одном из прошлых срачей я сравнивал по рынку даже в РФ (где традиционно любят всякую обскурщину из древних времен): около нуля вакансий против тысяч на питоне.

Так что паскаль просто не нужен. Юзкейса нет, база знаний сравнительно ничтожна. Смысла изучать его нет.

liksys ★★★★
()
Ответ на: комментарий от Xenius

Не предлагает. У него указатели ближе к концу паскалевской части, а побочные эффекты в середине.

Предлагает. Именно это и предлагает, и ты сам это только что подтвердил.

И ничего сложного в них нет.

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

liksys ★★★★
()
Ответ на: комментарий от liksys

Если эффекты это сложно, то зачем предлагать питон? Лучше взять хаскель или хотя бы схему.

PS: https://htdp.org/ как раз схему и берёт, только режет её ещё на учебные фрагменты.

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от Xenius

В питоне синтаксис сложнее чем в паскале.

Нет.

А указатели в паскале вводятся не сразу, а когда ученик уже привык к программированию.

В случае с питоном и си, указатели вводятся на стадии «си», когда ученик уже привык к программированию.

Ну и нафига он нужен, если он медленный, но в остальном ничем не лучше паскаля?

Еще раз для особо тугих и не умеющих читать: на питоне проще писать алгоритмы и изучать проектирование. Всё, про что ты скулишь со своим «нинужно» - на самом деле нужно на поздних этапах, и именно на питоне это изучается лучше всего.

Встроенные структуры данных в самом начале не нужны, а потом скорее вредны.

Опять мнение о программировании от того, кто программировать не умеет, спешите видеть. Встроенные структуры данных ему не нужны, лол.

Но зачем? Чем тебе вообще сдался этот питон?

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

liksys ★★★★
()
Ответ на: комментарий от quantum-troll

У хаскеля слишком инопланетный синтаксис. И потом, императивное программирование сильно проще для понимания на старте, чем функциональное. Схема - того же поля ягода.

liksys ★★★★
()
Ответ на: комментарий от liksys

при всей простоте указателей (котодые просто адреса адресов ) у сяшки прелестный синтаксис a[ b ] === *(a+b*size_of) == b[a] - ибо сяшка изначальна упрощение компилятора фортрана в 4Кслов памяти(Кену верить!) - именно хитровывернутый синтакис сяшки в части оперирования указателями и есть существенная доля когнитивной нагрузки для неофитов

само по себе оперирование адресами адресов не рокет сцнс

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от liksys

в хаскеле очень нашатырно прикручивается последовательность исполнения императивщины

и ваще real programmer может писать на разном разное.

qulinxao3 ★☆
()
Ответ на: комментарий от quantum-troll

Потому что в хаскеле невозможно рассуждать о time complexity и memory complexity.

Какое memory complexity у этой программы (как функция от введённого n)?

main = do
    s_n <- getLine
    let n = (read s_n :: Int)
    print $ foldl (+) 0 [1..n]

(Ответ: зависит от желания и флагов ghc.)

И умение в многопоточность на хаскеле не транслируется в умение в многопоточность на императивных ЯП.

shdown ★★
()
Ответ на: комментарий от liksys

Но по удобству формошлёпия (как в хорошем, так и в плохом значении этого слова) к Delphi пока никто даже близко не приблизился. Стоит признать, как факт, что это, пожалуй, единственная полноценная RAD среда.

SkyMaverick ★★★★★
()
Ответ на: комментарий от liksys

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

Я про побочные эффекты — ничего сложного нет. Если в выражении (включая правую часть присваивания, заголовки if/while/until) происходит что-то кроме вычисления его значения — это побочный эффект.

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

Ты предлагаешь изучать два языка вместо одного для той же задачи.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

Ты предлагаешь изучать два языка вместо одного для той же задачи.

Ты заблуждаешься именно в том, что это одна задача. Именно это и не так. Сначала нужно научить укладывать мысли в алгоритм. На этом этапе указатели, побочные эффекты и прочий пердолинг - это излишняя ерунда.

Когда человек более-менее ознакомился с императивным программированием, можно рассказать ему и про ООП - оно на самом деле концептуально очень простое. И это нужно для того, чтобы писать хороший код даже на не-ООП языках, потому что весь современный код, даже на сях, пишется в стиле операций над объектами.

И только после того, как человек поймет всё вышеперечисленное, можно давать си и указатели.

liksys ★★★★
()
Ответ на: комментарий от liksys

Указатели ваще не заметны после школьной начал алгебры где появляются имена чисел тобиш переменные(именно в школьном смысле) - т.е проблема «не понимающих в указатели» - что они софтскилами как-то проскочили в школе 5-7 классов предметы математики и физики - что в очередной раз подтверждает в насколько гуммано время мы живём

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

Вопрос в слоях абстракции

Ваще у Айверсона(который A Programming Language) есть годная статья лекция : нотация как твоя мыслов.

Сложно в рамках одного синтаксиса( дерево хавмана да) сохранять лаконичность в разноуровневвых абстракциях без протечек да и с ортоганальностью(как свойства минимизации)

qulinxao3 ★☆
()
Ответ на: комментарий от shdown

Потому что в хаскеле невозможно рассуждать о time complexity и memory complexity.

Не больше и не меньше, чем в Си. Эквивалентная программа gcc с оптимизацией компилируется в O(1), так как суммирование заменяется умножением.

Какое memory complexity у этой программы (как функция от введённого n)?

По семантике должно быть O(1), так как foldl всегда работает только с головой последовательности, а после foldl эта голова нигде не используется.

monk ★★★★★
()
Ответ на: комментарий от monk

Не больше и не меньше, чем в Си. Эквивалентная программа gcc с оптимизацией компилируется в O(1), так как суммирование заменяется умножением.

В Си можно рассуждать, поскольку можно рассуждать о худшем случае и «по семантике». Да, оптимизации могут сработать, но это просто плюшки.

По семантике должно быть O(1), так как foldl всегда работает только с головой последовательности, а после foldl эта голова нигде не используется.

А почему ghc без флагов компилирует не «по семантике» и получается O(n)?

[~]-[%] ghc test.hs
[1 of 2] Compiling Main             ( test.hs, test.o ) [Missing object file]
[2 of 2] Linking test
[~]-[%] echo 100000000 | ./test
zsh: done       echo 100000000 | 
zsh: killed     ./test

[~]-[%] ghc -O2 test.hs
[1 of 2] Compiling Main             ( test.hs, test.o ) [Flags changed]
[2 of 2] Linking test [Objects changed]
[~]-[%] echo 100000000 | ./test
5000000050000000
[~]-[%] 
shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от shdown

В Си можно рассуждать, поскольку можно рассуждать о худшем случае и «по семантике».

На Си она тоже в худшем случае O(n).

А почему ghc без флагов компилирует не «по семантике» и получается O(n)?

Потому что сборщик мусора не обязан отрабатывать сразу.

Это примерно эквивалентно следующему коду на Java

for (int i = 0; i < n; i++) {
    int[] myArray = new int[1];
}

Здесь О(1) или О(n)? По семантике О(1), так как каждый массив живёт одну итерацию, а по факту может быть O(n).

monk ★★★★★
()
Ответ на: комментарий от liksys

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

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

А указатели и побочные эффекты можно и нужно показать уже после этого и на том же паскале. И Столяров как раз так и делает. То есть фактически ты топишь за метод Столярова, только на другом языке и другими словами.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от monk

Потому что сборщик мусора не обязан отрабатывать сразу.

Получается, сборщик мусора ни разу не запускается до того, как программа отожрёт 3 Gb+?

Нет, он отрабатывает огромное число раз. Он уверен, что эти все данные — живые:

[~]-[%] ghc -rtsopts test.hs
[1 of 2] Compiling Main             ( test.hs, test.o ) [Missing object file]
[2 of 2] Linking test
[~]-[%] echo 100000000 | ./test +RTS -Sstderr -RTS
    Alloc    Copied     Live     GC     GC      TOT      TOT  Page Flts
    bytes     bytes     bytes   user   elap     user     elap
  4163816   2054440   2095496  0.001  0.001    0.005    0.005    0    0  (Gen:  0)
  4128768   4117512   4159880  0.002  0.002    0.008    0.008    0    0  (Gen:  0)
  4128768   6183064   6224128  0.003  0.003    0.011    0.011    0    0  (Gen:  1)
  4125968   4126648   8286352  0.001  0.001    0.013    0.012    0    0  (Gen:  0)
  4128768   4126080  10350736  0.002  0.002    0.015    0.015    0    0  (Gen:  0)
  4128768  12372808  12397440  0.006  0.006    0.022    0.022    0    0  (Gen:  1)
  4128768   4128800  14461824  0.001  0.001    0.024    0.024    0    0  (Gen:  0)
  4128768   4128800  16526208  0.001  0.001    0.025    0.025    0    0  (Gen:  0)
[•••]
  4128768   4128800 2968593312  0.001  0.001    3.855    3.856    0    0  (Gen:  0)
  4128768   4128800 2970657696  0.001  0.001    3.857    3.858    0    0  (Gen:  0)
zsh: done       echo 100000000 | 
zsh: killed     ./test +RTS -Sstderr -RTS 2>&1 | 

Здесь О(1) или О(n)? По семантике О(1), так как каждый массив живёт одну итерацию, а по факту может быть O(n).

Давай проверим на практике.

[~]-[%] cat MyMain.java
public class MyMain
{
    public static void main(String []args)
    {
        int n = Integer.parseInt(args[0]);
        int ptrXor = 0;
        long maxMemoryUsage = 0;

        for (int i = 0; i < n; ++i) {
            int[] myArray = new int[1];
            ptrXor ^= System.identityHashCode(myArray);

            long memoryUsage = Runtime.getRuntime().totalMemory();
            if (memoryUsage > maxMemoryUsage) {
                maxMemoryUsage = memoryUsage;
            }
        }

        System.out.println("maxMemoryUsage: " + maxMemoryUsage);
        System.out.println("ptrXor: " + ptrXor);
    }
}
[~]-[%] javac MyMain.java
[~]-[%] java MyMain 100000000
maxMemoryUsage: 130023424
ptrXor: 1285191720
[~]-[%]

В нормальных языках full scan запускается, когда программа сожрала a * N, где a > 1 — фиксированный коэффициент, N — потребление памяти после последнего full scan.

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 3)
Ответ на: комментарий от liksys

Так что паскаль просто не нужен. Юзкейса нет, база знаний сравнительно ничтожна. Смысла изучать его нет.

Я немного выше привёл пример, что если даже захотеть в нейросети (куда ещё совремённее), где стандартный язык сейчас - это Python, можно найти рабочие варианты с FreePascal. Более простые вещи там накоплены в огромном количестве ещё с 90-х даже. Есть модули для работы с таблицами Excel, для построения графиков и тд. Для числовых расчётов много чего есть, даже адаптации и биндинги таких вещей как OpenBLAS и OpenCV имеются.

Так что тут вопрос сугубо педагогический. Есть те, кто считают, что Паскаль как первый ЯП проще и прививает правильные вкусы в программировании. При этом, в варианте FreePascal - это достаточно мощный и ЯП и экосистема вокруг него, чтобы не страдать от академичности.

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

Особенно, вот ты в другом сообщении написал про изучение сначала ООП даже прежде Си и указателей. Но штука в том, что выучить-то можно много чего, в том числе и ООП, но понимание зачем оно нужно останется каким-то очень абстрактным. Типа сказали, что так правильно. Ну он и будет потом лепить это ООП там, где оно избыточно. Потому что, чтобы почувствовать полезность ООП, нужно для начала самому набить шишки на плохо структурированном коде в около 2000 строк хотя бы.

Есть риск, что изучение Си после Python покажется совсем странным, потому что то, что на Python писалось в пару строчек, на Си может потребовать десятков строчек и язык просто отвращение вызовет. В этом смысле может даже ассемблер лучше зайдёт - он ещё конечно многострочнее, но там, хотя бы будет понимание, что это изначальные кирпичики.

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 1)
Ответ на: комментарий от Xenius

я уж точно осилил паскаль, си и питон и могу без проблем на них написать решения учебных задач и небольших реальных

Ты понимаешь разницу между «осилил для учебных задач» и «осилил для масштабной разработки»?

То есть фактически ты топишь за метод Столярова, только на другом языке и другими словами.

Фундаментально нет. Ты вообще всё воспринимаешь через призму столяровских бредней. Живая иллюстрация пословицы: когда в руках молоток - все задачи кажутся гвоздями.

liksys ★★★★
()
Ответ на: комментарий от anonymous_incognito

можно найти рабочие варианты с FreePascal

Никому не нужные, кроме кучки энтузиастов. Язык от этого более живым не стал. Всё, что ты перечисляешь, есть в питоне, и в гораздо большем количестве.

есть сильное опасение, что у новичка мозг может быть перегружен в этом случае абстракциями языка

Это исключительно проблема учебного материала. Именно базовые типы - очень простые и понятные, и всё что тебе нужно - не закапываться в дебри реализации именно питона.

Потому что, чтобы почувствовать полезность ООП, нужно для начала самому набить шишки на плохо структурированном коде в около 2000 строк хотя бы.

Именно поэтому я настаиваю на питоне. ООП - исключительно понятная концепция, которую люди просто не осиляют нормально объяснить. И на питоне проще всего написать что-то, что обладает какой-то достаточно сложной логикой, на которой можно продемонстрировать все плюсы ООП.

Есть риск, что изучение Си после Python покажется совсем странным, потому что то, что на Python писалось в пару строчек, на Си может потребовать десятков строчек и язык просто отвращение вызовет.

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

liksys ★★★★
()
Ответ на: комментарий от liksys

поэтому я настаиваю на питоне

на каком подмножестве питона на начальном этапе?

vM ★★★
()
Ответ на: комментарий от liksys

Никому не нужные, кроме кучки энтузиастов. Язык от этого более живым не стал. Всё, что ты перечисляешь, есть в питоне, и в гораздо большем количестве.

Да вот знаешь, фреймворк для нейросетей на котором можно делать не только инференс, но и обучение и чтобы он поддерживал OpenCL, а ещё и просто SIMD-инструкции, включая AVX512 ещё поискать. В ходе общения с тобой я такой случайно нагуглил на FreePascal, на Python похоже нет, во всяком случае, самый массовый и известный PyTorch не умеет. На других языках, вроде TNN от Tencent или MNN (от Alibaba) - это всё для инференса. С точки зрения индустрии тут проблем нет: учим модель на GPU в PyTorch, деплоим для инференса потом подо что-то более конкретное, но для студентов и разных экспериментов может хотеться и обучения с OpenCL, а в некоторых случаях (сочетания GPU/CPU) ещё вопрос на чём быстрее будет.

Надо конечно пощупать будет, а то звучит хорошо, но как на практике выйдет?

Это исключительно проблема учебного материала. Именно базовые типы - очень простые и понятные, и всё что тебе нужно - не закапываться в дебри реализации именно питона.

Использование понятное, хотя семантика обращения с индексами уже не всегда.

Я писал, что си будет изучаться в контексте питона для понимания низкоуровневой сути и производительности.

Но прежде чем они дойдут до низкоуровневой сути может возникнуть ситуация полного непонимания как переменные хранятся в памяти (например, разницу между передачей по значению и по ссылке), парадоксальным образом небрежность в синтаксисе из-за привычки к отступам (из-за привычки к минимализму). Понимание ошибок в программе какое-то отложенное из-за того, что в Python они в ходе работы постепенно проявляются. И тд. Это я погуглил про проблемы Python как первого языка.

Может лучше найти язык, на котором, сразу можно будет приучить к правильному пониманию как устроена работа программы?

anonymous_incognito ★★★★★
()
Ответ на: комментарий от monk

То есть: printf(«%i\n», foldl_int(add, 0, range(1, n)));

Это не идиоматический Си.

shdown ★★
()
Ответ на: комментарий от monk

Я ошибся, нужно вычислять runtime.totalMemory() - runtime.freeMemory() для получения текущего использования.

Но больше 77 MB оно всё равно не выжирает. Поэтому O(1).

[~]-[%] cat MyMain.java
public class MyMain
{
    public static void main(String []args)
    {
        int n = Integer.parseInt(args[0]);
        int ptrXor = 0;
        long maxMemoryUsage = 0;

        Runtime rt = Runtime.getRuntime();

        for (int i = 0; i < n; ++i) {
            int[] myArray = new int[1];
            ptrXor ^= System.identityHashCode(myArray);

            long memoryUsage = rt.totalMemory() - rt.freeMemory();
            if (memoryUsage > maxMemoryUsage) {
                maxMemoryUsage = memoryUsage;
            }
        }

        System.out.println("maxMemoryUsage: " + maxMemoryUsage);
        System.out.println("ptrXor: " + ptrXor);
    }
}
[~]-[%] javac MyMain.java
[~]-[%]
[~]-[%] time java MyMain 10
maxMemoryUsage: 2630216
ptrXor: 1693969300

real	0.04s
user	0.03s
sys	0.02s
[~]-[%] time java MyMain 100000000
maxMemoryUsage: 77717376
ptrXor: 1285191720

real	6.96s
user	6.93s
sys	0.04s
[~]-[%] time java MyMain 500000000
maxMemoryUsage: 77719184
ptrXor: 753865803

real	33.98s
user	33.89s
sys	0.05s
[~]-[%] time java MyMain 900000000
maxMemoryUsage: 77715584
ptrXor: 1969225014

real	60.34s
user	60.29s
sys	0.06s
[~]-[%] 
shdown ★★
()
Последнее исправление: shdown (всего исправлений: 2)
Ответ на: комментарий от anonymous_incognito

Использование понятное, хотя семантика обращения с индексами уже не всегда.

Что не так с индексами в питоне?

Но прежде чем они дойдут до низкоуровневой сути может возникнуть ситуация полного непонимания как переменные хранятся в памяти

Это всё не нужно на этапе алгоритмостроения. Все эти проблемы надуманные и решается корректным составлением учебного материала.

Может лучше найти язык, на котором, сразу можно будет приучить к правильному пониманию как устроена работа программы?

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

liksys ★★★★
()
Ответ на: комментарий от liksys

Что не так с индексами в питоне?

Не то, чтобы не так, но я почему-то слегка спотыкаюсь об ::-1 и тп. Пока используешь всё понятно, очевидно, но через какое-то время уже отчего-то не совсем очевидно.

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

Значит спор по поводу FreePascal только о распространённости?

anonymous_incognito ★★★★★
()
Ответ на: комментарий от shdown

А почему ghc без флагов компилирует не «по семантике» и получается O(n)?

Очистка ненужных ленивых списков, оказывается, оптимизация.

monk ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Не то, чтобы не так, но я почему-то слегка спотыкаюсь об ::-1 и тп.

Это зачем-то нужно на ранних стадиях обучения?

Значит спор по поводу FreePascal только о распространённости?

Нет. Я не понимаю, мы ходим по кругу. Сколько раз можно объяснять одно и то же? Повторяю: язык должен быть живой, распространенный, пригодный для новичков, высокоуровневй достаточно мощный для практических задач и хорошо интегрируемый с сями для дальнейшего обучения.

liksys ★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)