LINUX.ORG.RU

ЛОР, помоги выбрать ЯП для обучения

 , , , ,


1

3

Часто слышу просьбу научить программированию. Хотя пока я этим не занимаюсь, мне стало интересно, какой ЯП выбрать для введения в программирование.

Вот к каким мыслям я пришёл:

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

Не Си и не современные коммерческие языки (Java, C#, Go). Си, хотя примитивный в основе, усложнён из-за окружения, в котором используется. Современные коммерческие языки были созданы для решения проблем индустрии. Проблема общая: я хочу преподавать материал по мере нарастания сложности. Если в языке неизбежно приходится использовать классы или printf, то это затруднит объяснение (не хотелось бы слишком часто говорить «потом узнаешь для чего это нужно»), напугает студента (ему придётся писать код, используя возможности, которые он плохо понимает), создаст неправильное восприятие основ (как будто printf — это какая-то важная часть компьютера или ОС).

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

Языки, между которыми я выбираю: Pascal и Python.

Pascal устарел и денег не принесёт (обидно), но это и не является основной целью. Целью является программирование, а не современное окружение.

В частности, я не собираюсь задрачивать студента на Delphi или любой «продвинутый» диалект языка. Это противоречит цели. Я рассчитываю на то, что после должной тренировки “bare bones” нужно перейти на современный язык и это будет легко.

Важно упомянуть, что спека языка Oberon (Виртовский язык, тот же Паскаль, только упрощённый и доработанный) составляет 17 страниц.

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

Если ограничиться императивным подмножеством, без ассоциативных массивов, классов и мета-классов, list comprehensions, HOF, исключений, то выглядит как альтернатива Паскалю. Хотя меня беспокоит динамическая типизация. Типы — очень важная вещь, хотелось бы чтобы язык помог это донести, а не быть типа «ну да, это важно, но ты забей».

Это все мои мысли.

Что касается практики, то я имел несчастье наблюдать как человек впервые знакомился с программированием, изучая Java на javarush. На это было больно смотреть.

Edit: дальнейшие пояснения по теме:

  • Подробнее про то, почему я считаю, что изучение основ и Паскаль хорошо сочетаются: 1
  • Почему не Си и не ассемблер: 1 2
  • Почему Паскаль: 1 2
  • Почему не Питон: 1
  • Целевая аудитория: 1
  • Почему такая размытая аудитория: 1 2
  • Про важность иерархии: 1


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

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

тезис Монка о неполноте декларативного описания. и полноте императивного.

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

Вот только читать и править/дописывать нередко приходится чужой код

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

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

взажгите конфорку, поставьте на нее сковородку, разбейте яйцо на сковородку. - императивное.

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

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

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

большинство попадают в императивщину и там всё, выход нет.

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

Да вся советская техническая интеллигенция состояла из беспомощных идиотов

И много вы видели инженеров,которые не могли сделать дома какой-нибудь мелкий ремонт? Эти как раз обычно отличались те кто занимался теоретической наукой. А среди советских инженеров нередко попадались даже создатели весьма интересных механизмов и транспортных средств,построенных буквально «в гараже».

начальников — дураками.

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

А эти дураки технарей как детей в перестройку ограбили

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

Сейчас с этим кажется по-лучше стало

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

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

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

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

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

Из декларативного описания исполнитель может вывести

это был просто неполный пример, лишь иллюстрирующий связь обоих описаний.

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

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

Так можно и С с Питоном смешать

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

Но вот смешать их с Лиспом и Хаскелем никак не получится.

watchcat382
()
Ответ на: комментарий от alysnix

декларативности. она скрытно подразумевает императивный процесс

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

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

И много вы видели инженеров,которые не могли сделать дома какой-нибудь мелкий ремонт?

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

А среди советских инженеров нередко попадались даже создатели весьма интересных механизмов и транспортных средств,построенных буквально «в гараже».

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

Очевидно что противодействие криминалу не входит к компетенцию инженеров

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

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

полное императивное описание будет содержать

Только если человек сумеет таковое составить. И не накосячит при этом. Люди не очень-то хороши в таких вещах. А в случае декларативности паралельные задачи появляются автоматом.

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

декларативности. она скрытно подразумевает императивный процесс,

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

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

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

Именно это отлично делает компилятор Ады. Чтобы суметь наговнокодить на Аде - надо весьма хорошо владеть программированием. Хотя понятно что приложении достаточных усилий это возможно. Заодно замечу,что если всё же адский говнокод будет порождён то возможные ошибки в нем будут куда более «высокоуровневыми» чем в сишном или питоньем. Написать сортировку пузырьком вместо чего-то более подходящего - можно,и компилятор не будет ругаться. А вот вылезти указателем за границы массива можно только если специально и целенаправленно пытаться это сделать(и это потребует очень хорошего знания и языка и того как компилятор переводит исходник в машинный код).

watchcat382
()
Ответ на: комментарий от ugoday

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

Вы их что,постоянно в руках носите? А если нет то инструкция «возьмите…» как раз подходит.

watchcat382
()
Ответ на: комментарий от ugoday

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

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

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

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

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

watchcat382
()
Ответ на: комментарий от ugoday

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

Водительских прав у меня нет так что в автомобилях я не силен,а вождение велосипеда описанию вполне поддается,хотя описание и будет достаточно длинным. Можно нагуглить что-то типа «как научиться ездить на велосипеде». Также видел в древнесоветской инструкции к грузовому мотороллеру ТГА-200К выпуска 1979 года(был у моего отца) весьма подробное руководство по его правильному вождению,в частности чтобы не угробить кпп без синхронизаторов. Занимало несколько страниц. И описывалась именно последовательность действий что включать, на что нажимать и за чем следить.

вы совершенно зря записали пошаговость в императивность.

Это не я,это традиционное понимание во всякой популярной литературе.

из каждого мира вычисляется следующий.

И чем это отличается в случае если у нас нет неограниченного числа параллельных миров которые плодятся по кадому чиху? (идея встречается в фантастике). Если мир у нас один то вычисляем его следующее состояние,а не новый мир.

watchcat382
()
Ответ на: комментарий от ugoday

Мелкий и прочий ремонт должны осуществлять специально обученные люди.

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

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

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

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

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

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

Никакого криминала не было. Всё было по закону.

Когда законы пишет криминал и он же следит за их исполнением - то конечно все преступления будут «по закону». В крайнем случае - «по понятиям».

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

Вы их что,постоянно в руках носите? А если нет то инструкция «возьмите…» как раз подходит.

Я взял яйца, чтобы пожарить яишницу, для определённости, положим у меня было π + і✓2/2 яиц. Но в процессе понял, что мне нужна инструкция. Открываю инструкцию, а там «возьмите три яйца». И что теперь делать? Инструкция должна была помочь, но в итоге только больше запутала.

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

положим у меня было π + і✓2/2 яиц

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

В больницы и к детям функциональщиков не пускать!

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

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

7xN.....5x0. при (обычно 10 базе) 7.....0

для дробей(в поз нотации) как известно степени в -бес

е пи фи это имена

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

ибо делигированние ответсвенности чревато плодами

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

неа - достаточно обеспечить подвот тепла для «постепенной» выпарки воды с «концов» и денатурации

если нейронкы помнят(провидят) процесс то достаточно выстрелить и вспомнить

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

«крах социума» не лобио покушать

разделение труда и прочая ботва

и как заметил толи Канторович толи квант Планк - возможности человека не больше куба с ребром 2 метра максимально организованного Вентилями Фредкина

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

Идея, алгоритм, решение. Приятие решений и автоматизация Воениздат 1972

1972 ! 1972 ! карл?

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

если алиен с акцентом на общелингве

то общелингва не ок

ну ок!

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

недостаток(их просто много) декларативного:

жёще требования к когнату исполнителя

жёще требования к демиургу декларации

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

социальная беспомощьность локус внутри

попаданец в каменый век локус снаружи

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

Потому что понимать надо как этот мир устроен.

;)

https:/ru.wikipedia.org/wiki/Воображаемые_сообщества +. Источники социальной власти :) https://ru.wikipedia.org/wiki/Манн,_Майкл_(социолог)#Издания_в_России хороших дней!

понимание и инженегрость не тождественны ;(

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

выше уже было trade vs craft

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

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

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

одна из новел римского права

не явка лица в суд лишение эгиды закона

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

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

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

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

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

Есть план действий с действиями А, Б, В, Г, Д, Е. Предположим для простоты, что действия невозможно делать параллельно и они не могут завершиться неудачей. Но у действий может быть неготовность по внешним условиям, которые приводят к ожиданию, если в это время нельзя выполнить другое действие.

Полная декларативная инструкция:

Надо выполнить А, Б, В, Г, Д, Е.
Для Г нужен результат Б. 
Для Д нужен результат А. 
Е нужно сделать как можно раньше после наступления условия Т.

Полная императивная инструкция

1. Если Т, выполнить Е.
2. Выполнить А или Б или В.
3. Если Т и Е не выполнено, выполнить Е.
4. Если выполнено А, выполнить Б, В или Д, 
иначе если выполнено Б, выполнить А, В или Г, 
иначе выполнить А или Б.
5. Если Т и Е не выполнено, выполнить Е.
6. Если выполнены А и Б, выполнить В, Г или Д, 
иначе если выполнены А и В, выполнить Б или Д, 
иначе если выполнены А и Д, выполнить Б или В, 
иначе если выполнены Б и В, выполнить А или Г,
иначе выполнить А или В.
7. Если Т и Е не выполнено, выполнить Е.
8. Если выполнены А, Б и В, выполнить Г или Д,
иначе если выполнены А, Б и Г, выполнить В или Д,
иначе если выполнены А, Б и Д, выполнить В или Г,
иначе если выполнены А, В и Д, выполнить Б,
иначе выполнить А.
9. Если Т и Е не выполнено, выполнить Е.
10. Если выполнены А, Б, В и Г, выполнить Д,
иначе если выполнены А, Б, В и Д, выполнить Г
иначе выполнить В.
11. Если E не выполнено, ждать T.
12. Если E не выполнено, выполнить Е.

На практике, из-за огромной сложности полных императивных инструкций их пишут в урезанном виде

1. Выполнить А.
2. Выполнить Б.
3. Выполнить В.
4. Выполнить Г.
5. Выполнить Д.
6. Ждать Т, если оно ещё не наступило.
7. Выполнить Е.

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

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

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

Так очевидно же: выкинуть те, что есть, и взять новые три.

как программист кипятит воду в чайнике?
1. Набирает воду в чайник
2. Ставит чайник на огонь
3. Ждет пока тот не вскипит

как программист кипятит воду в чайнике если в нем уже есть вода?
1. Выливает воду из чайника что сводит задачу к уже решенной
monk ★★★★★
()
Ответ на: комментарий от watchcat382

Если это единожды написанный и многократно используемый в рамках проекта код - то подробный комментарий в начале функции это абсолютно нормально.

Зачем этот ASCII ART? Комментарий ок, а какое то украшательство? Лучше бы вместо него вставляли #pragma region, которые понимают редакторы.

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

Там может и не быть ASCII например, я считаю что такие ситуации можно игнорировать.

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

Могу только сказать что на примере интерпретируемого языка не получится показать что такое компилятор,линкер,система сборки.

У него есть компилятор, линкер, система сборки. Его еще делал человек разрабатывающий Delphi.

И это ориентирование на веб будет совершенно бесполезно если обучаемого интересуют микроконтроллеры и программирование роботов.

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

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

Я так думаю что истина как всегда где-то посередине. И середина эта зависит от многих причин,в том числе и личных предпочтений тоже.

Середина то у всех разная. Я считаю что С достаточно многословен, для меня даже излишне. В некоторых местах надоедающе:

color_t rgb(uint8_t r, uint8_t g, uint8_t g);

vs

function rgb(r,g,b: uint8_t): color_t;

Так что в середину я бы его поставил. Pascal/Ada для меня ближе к Cobol.

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

И это ориентирование на веб будет совершенно бесполезно

обучение в баскетбол

с паса али с дриблинга?

с нюансов подсистемы надсистемы али с нюансов синергии системы?

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

Я считаю что С достаточно многословен, для меня даже излишне.

Специально для вас есть K&R синтаксис:

color_t rgb(r, g, b) uint8_t r, g, b; {
...
}

Если всё еще кажется, что многословен, то советую почитать исходники J engine.

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

Специально для вас есть K&R синтаксис

Был*

Если всё еще кажется, что многословен, то советую почитать исходники J engine.

Да, кажется. Вообще адекватная смесь Forth + APL это было бы очень здорово.

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

Специально для вас есть K&R синтаксис

Был*

Есть и будет. Убрали только в C23, я до сих пор пользуюсь C99.

GCC компилирует даже на C23, лишь ворнинг показывает. Ворнинг отключается: -std=c23 -Wno-old-style-definition

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

Я про временные рамки стандарта. Ограничение на c89 меня всегда приводило к тому, что приходилось его убирать на файлах где используются заголовочные файлы из библиотек, потому что многие используют c99.

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

никто из бесконечников так, между прочим, и не подтвердил (и не опроверг) мой тезис

Это чтобы ты хорошенько помучился от неопределённости.

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

Напишите мне пошаговую инструкцию как водить автомобиль

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

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

С TypeScript я совсем не знаком так что не могу ничего сказать о степени его пригодности для обучения программированию

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

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

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

Мне думается, в учебных примерах статическая типизация скорее будет мешать, чем помогать.

В How to Design Programs помогает. Фактически, тип позволяет не включая мозг написать половину функции.

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

В How to Design Programs помогает

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

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

Назначение стабильных типов именам (и их статическая проверка) — это уже другая история.

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

alysnix ★★★
()
Ограничение на отправку комментариев: