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

Многовато приседаний.

Да не особо.

Кроме того, числа в строки это боксинг на коленке. Т.е. вместо int ты получаешь Integer, который Object и умеет себя печатать.

Ну вот абсолютно не имел в виду какие-то там объекты! Просто функцию,которая принимает на вход само число, две цифры которые указывают сколько цифр печатать всего и сколько из них после десятичной точки,ну и строку куда результат положить. В микроконтроллерном софте так и делают. Потому что тащить в прошивку громоздкий универсальный printf и форматные строки к нему - слишком расточительно. (а десятичная точка нужна потому что считать могут как 1500 милливольт,а выводить как 1.500 вольт) Вот микроконтроллерный народ пишет про преобразование чисел в строку,да еще и с указанием размеров и тестами скорости: http://we.easyelectronics.ru/Soft/preobrazuem-v-stroku-chast-1-celye-chisla.html

А еще форматные строки для printf оказываются зависимыми от разрядности системы и если нужна переносимость то требуют вставления макросов типа

printf("%" PRIu32 "\n", n);

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

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

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

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

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

Императивщина как-то калечит мозги

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

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

функцию для символьного дифференцирования — это задача, которую дают в самом начале учебника для начинающих

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

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

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

любое иррациональное число содержат запись всех иррациональных чисел внутри себя.

число 0,212112111211112111112… не может быть рациональным и может содержать запись только чисел, у которых дробная часть записывается только цифрами 1 и 2

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

Как операторный шум в программе дает понятности?

Потому что человеку более свойственно понимать слова,а не «закорючки»,например скобки. И если блок операторов после if состоит не из одного printf,а из многих строчек кода - то «крупно» выделить его начало и конец весьма полезно. В том же Си нередко комментариями выделяют возле скобки. В ваших терминах - когда «полезных» операторов много то соотношение сигнал/шум вполне приемлимо.

На COBOL еще программы есть, я думаю это более полезный язык

Сам только один раз в начале 90х видел на персоналке программу на Коболе,причем транслятор вроде даже от Микрософта был. Однако говорят что в США где традиции программирования поддерживаются с 50-60х годов, спрос на программистов на Коболе вполне стабильный. Это у нас в начале 90х вычислительные центры развалили, ЭВМ сдали на цветной металл,программисты массово уехали в Израиль,следующему поколению пришлось начинать с около нуля.

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

всякое трансцендентное иррациональное

хм представим число .10100100010000и_т_д т/е 1цы с линейно(скажет натуральные) растущим количеством нулей между единицами - это двоичная запись

очевидно у этого иррационального не все иррациональные в подстроке

ой

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

Потому что человеку более свойственно понимать слова

Точно ЗАПЯТАЯ уверен ВОПРОСИТЕЛЬНЫЙ ЗНАК Имена однозначно лучше словами ЗАПЯТАЯ а вот для частых вспомогательных вещей сокращающие знаки вполне подходят ТОЧКА

И если блок операторов после if состоит не из одного printf,а из многих строчек кода - то «крупно» выделить его начало и конец весьма полезно.

Этим лучше занимается отступ, а еще лучше EndIf, EndFor, EndSub что бы понимать где конец чего. В Pascal/Ada этого нету, верно? Просто end ничем не отличается от } для меня, кроме того что его набирать неудобнее.

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

Веб это будущее и настоящее, так что ориентация на веб явно более правильная

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

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

Из каких соображений?

Динамическая типизация.

Питону явно не хватает строгости

Можно взять TypeScript. Зато Python учит правильно ставить отступы, а Pascal нет.

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

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

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

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

Они бодро писали на лиспе и форте, пока это было модным.

Кстати, руководства по обслуживанию и эксплуатации любой техники пишут именно что в императивном стиле,в виде последовательности действий

Бездумно исполнять проще программу в императивном стиле. описывать необходимое для результата решение в функциональном: «Чтобы максимально раскрыть вкус чая, необходимо ориентироваться на тип сырья. Сорта из свежего и мягкого листа лучше заваривать проливом, при этом использовать воду температурой 85–90 °С. Для более старого и грубого листа лучше взять воду температурой 90–95 °С и использовать настаивание.». В императивном варианте пришлось бы использовать условия и состояния (типа «выбран вариант 1»).

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

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

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

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

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

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

Это по Муру основная черта Forth.

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

это уже «функциональное мышление»

Смотря что внутри. Если вызов max от чуть меньшего количества, то функциональное. Если состояние, которое меняется в процессе перебора элементов, то нет.

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

без текста вряд ли поймут.

Жуть:( Как им только удается науку развивать с такими коммуникационными проблемами…

Будет очередная красавица Икуку.

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

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

Она не принуждает использовать сложные для понимания

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

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

Это по Муру основная черта Forth.

У Forth они короткие, но совсем не легко тестируемые. Потому что любая функция может менять что угодно и это никак не ограничено синтаксически. В Haskell для чистой функции вообще можно писать случайно генерируемые тесты, если результат проверяем. Типа

prop> \xs -> sort xs == (sort . sort) (xs :: [Int])
monk ★★★★★
()
Ответ на: комментарий от watchcat382

Жуть:( Как им только удается науку развивать с такими коммуникационными проблемами…

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

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

Но освоить это способны только начинающие из будущих академиков

Вы сейчас спорите об упраженении, которое вы не решали, из учебника, который вы не читали. С человеком, который решал и читал. Не надо так.

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

фортан всегда был быстрее С.

Есть такой миф, да.

Не миф. На вычислительных задачах где-то до конца 90х именно что был.

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

Потому что любая функция может менять что угодно и это никак не ограничено синтаксически.

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

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

За счет каких свойств? Я смотрел некоторые научные библиотеки которые были у SGI, там C/C++. OpenBLAS это если не считать ассемблера почти полностью С библиотека, хотя это уже начало 2000.

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

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

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

И ещё в форте есть засада: если в документации функции указано, что она кладёт три слова на стек, а на самом деле иногда два, то узнаешь про ошибку не при вызове этой функции, а при вызове той функции, которая хотела получить данные после результата этой. Это, конечно, не UB С++, но отлаживать тоже очень муторно.

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

И ещё в форте есть засада: если в документации функции указано, что она кладёт три слова на стек, а на самом деле иногда два

А в Haskell такого не может быть, что иногда в списке возвращается 3 значения, а иногда 2? Или это выводится сразу? В Factor входные выходные данные четко задаются с типом и там такого быть не может. Но в Forth слова обычно достаточно маленькие что бы это заметить.

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

Точно ЗАПЯТАЯ уверен ВОПРОСИТЕЛЬНЫЙ ЗНАК

Обратите внимание,что в старом телеграфе,где ошибки при передаче могли существенно затруднить понимание сообщения («казнить нельзя помиловать») именно так и писали - «ЗПТ»,«ТЧК»,«ВСКЛ». Своеобразное помехоустойчивое кодирование с избыточностью. Так что если бы писали это мне лет так сорок назад по телеграфу то оно бы так и выглядело. Я успел застать такие телеграммы в 80х.

Этим лучше занимается отступ

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

а еще лучше EndIf, EndFor, EndSub

Полностью с вами согласен. Поэтому в Аде есть «end if» и после end в конце процедуры/функции повторяется ее название. Вот EndFor нету.

А у сишников часто в коде пишут комментарии примерно так:

void Foo(void)
{
    if(condition)
    {
        // a lot of code...
    } // if
} // Foo

Просто end ничем не отличается от } для меня

Конечно это вопрос личных предпочтений,но есть немало людей которые предпочитают end (и я в их числе). Он более заметный, особенно если кода на экране много и мелким шрифтом(иначе не лезет).

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

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

куда-то все наши бесконечники подевались. не хотят обсуждать.

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

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

Так хорошо ли это? Нужны ли нам

SUM VARIABLE a AND VARIABLE b MOVE RESULT TO c

Этим лучше занимается отступ

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

Любой современный редактор показывает вертикальную линию, и лучше ли вместо этого считать begin, end? По моему нету. Вложенности большой быть не должно, в Linux долгое время стандарт был 80 символов в ширину, отступ 8 пробелов.

Он более заметный, особенно если кода на экране много и мелким шрифтом(иначе не лезет).

Кроме вертикальной линии можно выбрать другие способы визуализации, подсветка всего блока фоном, или более яркая линия активного блока https://raw.githubusercontent.com/leodevbro/vscode-blockman/main/demo-media/v...

Полностью с вами согласен. Поэтому в Аде есть «end if» и после end в конце процедуры/функции повторяется ее название. Вот EndFor нету.

Недоработка. Если есть вложенные функции, то еще неплохо было бы EndSub SubName

А у сишников часто в коде пишут комментарии примерно так:

Мне кажется эта та же болезнь что и «красиво оформленный» раздел кода, надо для этих людей Emoji колонны добавить %) А то сейчас все что есть это 🏛️

/********************************
🏛️                             🏛️
🏛️ [[BY VASYA ADD(int, int)]]  🏛️
🏛️                             🏛️
🏛️                             🏛️
********************************/
int add(int, int);
Не смотрится совсем.

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

А в Haskell такого не может быть, что иногда в списке возвращается 3 значения, а иногда 2? Или это выводится сразу?

В Haskell это не влияет на соседние команды. То есть если

MYVAR MYWORD DUP + -

программист ожидает от MYWORD одно значение и результат на стеке после как (MYVAR - (MYWORD + MYWORD)), а в нём два значения (лишний DUP) и на стеке MYVAR, -MYWORD, но никакой ошибки.

В Factor входные выходные данные четко задаются с типом

Да, но Factor уже не Forth. Гибкости на порядок меньше.

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

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

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

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

Что само по себе является говнокодом.

считаю, что уже при уровне вложенности 3 питон должен ругаться, и требовать денег.

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

В Haskell это не влияет на соседние команды

Да. Хотя такой код на Forth скорее всего очень быстро упадет.

Да, но Factor уже не Forth. Гибкости на порядок меньше.

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

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

при уровне вложенности 3, питон встал попрек программы, раскинул руки, и закричал полным голосом - не пущщуууу, там скоромное!

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

руководства по обслуживанию и эксплуатации любой техники пишут именно что в императивном стиле … Потому что это понятно для обслуживающего персонала

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

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

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

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

Просто говоришь жене: а давай яишенки? И всё.

ты какой-то цыганский математик. постоянно уходишь от ответа.

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

ответь на мой вопрос-то

Тяжела и неказиста, наверное, жызнь человека, который задаётся подобными вопросами в пятницу вечером %)

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

Ну 3 часто встречается, те же x y ź. И вот как тут без вложенности? Разбивать на функции каждую мелочь что ли? https://github.com/OpenRadioss/OpenRadioss/blob/main/engine/source/coupling/r...

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

а императивное описание можно взять в любой поваренной книге на третьей странице.

Негодное там описание. Сказано, возьмите три яйца, а переменная непроинициализирована. Может у меня в настоящий момент уже есть яйцо, или сто яиц, или минус три яйца, или true яиц. Так только core dump’ы со stack trace’ами готовить, а не яичницу.

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

Да. Хотя такой код на Forth скорее всего очень быстро упадет.

Проблема в том, что он падает не там, где ошибка, в произвольном месте после.

Суть форта в стеке и маленьких словах.

Ага. Маленьких словах на 130 строк.

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

цыганский математик

Жена в этой притче была интерпретатором декларативных описаний, а ты — императивным изготовителем горелой яичницы по тупым рецептам (с последующим мытьём посуды).

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA
(map do-something-with-a-point-in-3d-space (space-is-a-set x y z))

и никаких тебе вложенностей!

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

Жена в этой притче была интерпретатором декларативных описаний,

я чужих жен не обсуждаю.

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

просто опиши декларативно приготовление яишницы

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

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

Ага. Маленьких словах на 130 строк.

Извратится можно по всякому, в Haskell наверное есть InlineC модуль? Я тоже могу скинуть и сказать вот она ваша функциональщина %) За хорошим кодом в OpenSource к Чарльзу Муру, Factor мне не особо нравится, я его никогда не читал и не рекомендовал к чтению.

Проблема в том, что он падает не там, где ошибка, в произвольном месте после.

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

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

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

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