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)
Ответ на: комментарий от qulinxao3

пытон это скриптуха. это не ЯП в хорошем смысле этого слова. об этом уже тут писали.

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

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

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

пытон это скриптуха. это не ЯП в хорошем смысле этого слова.

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

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

А как связаны Java и понимание организации памяти, прости пожалуйста? Там целая виртуальная машина между твоим кодом и памятью.

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

пытон это скриптуха. это не ЯП в хорошем смысле этого слова. об этом уже тут писали.

Сейчас каждый уважающий себя язык умеет REPL, так что на счет скиптов мимо. Но и питон неявно компилируется в байт-код, никогда не интересовался, что за *.pyc файлы лежат pycache?

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

ловко перепрыгнули со схемы на общелисп

В схеме тоже есть реализации loop и всякого такого.

чтоб java-код читать, нужно знать назубок всю стандартую библиотеку и Spring, как-минимум

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

Тоже самое с ЛИСПом: по виду выражения невозможно его прочитать, т.е. понять семантику.

Не открывайте такой код вашим студентам, пока они к нему не готовы

А в ЛИСПе невозможно быть готовым. Каждый раз как первый, нужно сидеть изучать новый DSL.

Я вообще не понимаю о чём вы спорите

Я спорю с утверждением, что у ЛИСПа простой синтаксис. У ЛИСПа наоборот бесконечно сложный синтаксис, потому что он в принципе не ограничен.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Я спорю с утверждением, что у ЛИСПа простой синтаксис. У ЛИСПа наоборот бесконечно сложный синтаксис, потому что он в принципе не ограничен.

Когда говорят «простой синтаксис», кажется имеют в виду то, что изначально вкладывали в это понятие – он простой для машины, которая его разбирает. Только вот к человеку это не имеет никакого отношения.

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

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

Ну тогда надо Брейнфак для обучения советовать. Там тоже простой синтаксис.

no-such-file ★★★★★
()
Ответ на: комментарий от anonymous

семантика

Синтаксис. То что для ЛИСПа является словом, для языка определённого в терминах ЛИСПа может является произвольным синтаксическим элементом.

no-such-file ★★★★★
()
Ответ на: комментарий от amm

Сейчас каждый уважающий себя язык умеет REPL

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

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

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

тебе недаёт питон понять ....

соболезную

qulinxao3 ★★
()
Ответ на: комментарий от no-such-file

Тоже самое с ЛИСПом: по виду выражения невозможно его прочитать, т.е. понять семантику.

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

А в ЛИСПе невозможно быть готовым. Каждый раз как первый, нужно сидеть изучать новый DSL.

Как и в любом другом ЯП, внезапно. Вооброзите студента, который выучил синтаксис жабы или C# (но только синтаксис) и его внезапно бросили в крупный проект. Он же ничего не поймём. Вообще ничего, пока не разберётся как тут всё устроено и зачем.

Естественно, к задаче обучения программированию это не имеет никакого отношения.

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

пытон не дает возможности понять типизацию

Здесь рекомендовали mypy. Выглядит норм. Точно лучше аннотаций.

организацию памяти

Вы имеете ввиду списки, отсутствие ссылок/указателей или что-то ещё?

понять основные принципы программирования

Какие именно принципы?

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

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

по факту у плюсовиков заместо полноценного repl какой быстро набранный файл где проверяется(перебирается) тот или иной синтаксический коркодил -

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

repl это иследования по горячему - gdb вот что у сяплюснутых за repl

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

Это удобно: отладка, написание скриптов, блокноты jupyter. Если в твоем основном языке его нет, то это конечно же «не нужно» :)

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

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

Затем же, зачем REPL для Erlang, на котором тоже пишут миллионы строк. Это удобно для дебага. Ну, чтобы не разбирать лапшу коредампа через мутные дебагеры, работающие на шаманстве.

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

Любой фреймворк для любого ЯП - это DSL.

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

no-such-file ★★★★★
()
Ответ на: комментарий от anonymous

Основным (для меня) аргументом против Паскаля является то, что Паскаль забракован своим же собственным автором. Если уж уважать труд Вирта, то надо и брать его последнюю разработку: Active Oberon.

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

Разговор про макросы и гомоиконность?

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

Вчера advent of code начался. На турбо паскальке под дос пройдёшь?

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

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

(define (range n)
  (define (build-list* n)
    (if (zero? n) '(0)
      (cons n (build-list* (- n 1)))))
  (reverse (build-list* n)))
def my_list(n):
  l = []
  i = 0
  while i <= n:
    l.append(i)
    i = i +1
  return l
anonymous
()
Ответ на: комментарий от anonymous

Питоновая версия стала еще более очевидной.

anonymous
()
Ответ на: комментарий от no-such-file

Не любой, таких вообще мало

Здравствуйте. Я учу С++. Уже выучил синтаксис, но встретил малопонятный участок кода

A = B + C

Расскажите, пожалуйста, новичку, что здесь происходит?

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

Вот так надо:

(define (range n)
  (define (range* n acc)
    (if (< n 0) acc
	(range* (- n 1) (cons n acc))))
  (range* n '()))
ugoday ★★★★★
()
Ответ на: комментарий от kaldeon

Вы имеете ввиду списки, отсутствие ссылок/указателей или что-то ещё?

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

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

Расскажите, пожалуйста, новичку, что здесь происходит?

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

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

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

А чего из этого нет в питоне? Ну кроме указателей, ладно.

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

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

Переменная? В третьем классе? Удивительно!

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

в началке арифметика

математика с первого года средней

вот к 6 году у*ёбы и 3 классу математики добираются до переменных k12

к12!

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

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

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

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

Эээ. Ну на вот, посмотри: https://www.youtube.com/watch?v=BJKEYGBdabo

Крокодил Гена с Чебурашкой тебе объяснят что такое переменная.

anonymous
()

Я вот заметила, что любая тема про Паскаль вызывает на ЛОРе бурные обсуждения. Порой даже более бурные, чем темы про Rust или Systemd.

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

Вас не смущает, что математические символы это совсем не то же самое, что переменные в программировании?

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

Ну кроме указателей, ладно.

как можно двусвязный список сделать без указателей? и не надо там списки заменять массивами. это совершенно разные структуры

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

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

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

храним только дельту между соседями - вот и без указателей двухсвязный списОк - как деды без памяти завещали

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

Вас не смущает, что математические символы это совсем не то же самое, что переменные в программировании?

Для понимания что происходит в том куске кода это не играет роли. Там написано что A это результат сложения B и C. Это понимает третьеклассник, лол. А вот ту срань на лишпе даже я не сразу вспомнил как читать, хотя на лишпе я писал, и даже не один раз.

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

в пытоне кстати нет идеи

Почему нет? Есть. Затрахать учеников расстановкой отступов чтобы это стало рефлексом как у собаки Павлова.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Уже выучил синтаксис, но встретил малопонятный участок кода

Значит не выучил.

Не скажи… Я вот русский вроде с детства знаю в качестве родного, то есть должен всё понимать. А читаю сообщения @qulinxao3, так через одно ничего вообще не понимаю. Хотя, казалось бы, каждое из написанных слов по отдельности понимаю, как они построены в предложения формально — тоже. А смысл всё равно ускользает…

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

А смысл всё равно ускользает…

Так он пишет на китайском, просто вместо иероглифов слова.

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

Переменная? В третьем классе? Удивительно!

Переменные в третьем классе есть. И даже смысл по сути тот же.

Чего в третьем классе не объясняют, так это операции присваивания. Только уравления. А уравнение — это совсем не то же, что присваивание. Проблема в этом.

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