LINUX.ORG.RU

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

 , , ,


0

3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

вполне возможно. но не в результате суммы нетипизированных значений. :)

В моём мире обычно в ЗАГС идут, потом, возможно в Церкви венчаются.

и актуальный вопрос - два мужчины дают семью?

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

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

Это то, чему надо обучать при обучении программированию (тема-то о нём) вместо всяких public static void main.

Современный Hello World на Java кстати выглядит так (весь файл):

void main() {
  System.out.println("Hello, World!");
}
Небывалый прогресс я считаю!

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

Это не заумь, это упрощение. Задача прочитать содержимое файла состоит из нескольких этапов: 1. Понять откуда читать; 2. Прочитать оттуда сырые байты; 3. Как-то проинтерпретировать эти данные и положить их в структуру данных нужного формата. Логично, чтобы за каждый этап отвечала своя функция, реализующая соответствующий интерфейс.

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

Это вообще никак не верифицируется, разве что предельные диапазоны задать.

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

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

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

Ada позволяет задать предельные диапазоны для типов

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

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

Путь к файлу в распространенных ОС это строка заканчивающаяся нулём.

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

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

Я знаю, где у меня число, а где строка

иногда в команде насчитывается больше одного человека.

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

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

Иногда всё-таки команда не состоит из не умеющих читать и писать документацию

Именно что иногда. И на это еще накладывается типичный дефицит времени на ее написание и поддержание актуальности.

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

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

У меня есть число 20.

Если это «просто число» (int или float) то да, его можно передать ошибочно в функцию которая принимает int или float.

А вот если это Ada то там такого можно избежать. Подробные объяснения (на русском!) и с примерами можно почитать тут: https://reznikmm.github.io/learn/courses/safe-secure-software-ru/chapters/chapter_02.html

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

а юзер их так же будет вводить? 10.0_F и 10.0_C?

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

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

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

Это цитирования моего работающего примера на С++, там используется подчеркивание.

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

temp = 10.0_F;

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

Sub-enums и ограниченные float значения хранимые в виде целых чисел выглядят очень вкусно, в других языках такого не видел. Полезно было бы везде.

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

Тогда что угодно будет «функцией»

То есть отображение в пустое множество уже и за о отображение не считаем, да? %)

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

Полезно было бы везде.

Возможно вам будет интересно взглянуть на clojure.spec. Можно использовать любые предикаты для проверки допустимости значения:

(s/def :num/big-even (s/and int? even? #(> % 1000)))
(s/valid? :num/big-even :foo) ;; false
(s/valid? :num/big-even 10) ;; false
(s/valid? :num/big-even 100000) ;; true
ugoday ★★★★★
()
Ответ на: комментарий от ugoday

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

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

программистам дай волю,так они изобретут нечто жутко объектное, решающее задачу преобразования путей для всех ОС,существующих в мире

Ага. Вот в CL у пути должно быть 6 компонентов: файловая система, устройство, каталог, имя, тип, версия.

(make-pathname :host "KATHY"
               :directory "CHAPMAN" 
               :name "LOGIN" :type "COM"))
=>  #P"KATHY::[CHAPMAN]LOGIN.COM"

И каталог может быть абсолютный как в примере выше или относительный:

(make-pathname :directory '(:absolute "foo" "bar") :name "baz")
#P"/foo/bar/baz"
(make-pathname :directory '(:relative "foo" "bar") :name "baz")
#P"foo/bar/baz"
monk ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Например?

day = 1
print(day)
day = "monday"
print(day)

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

И ладно бы оно принимало тип переменной (числовой/строковый) по первому прсваиванию и дальше всегда считало его таким. Так нет, позволяет переопределить на ходу. Я ни разу не знаток Питона,но когда сталкиваюсь вот с таким в чужих скриптах это может создавать проблемы. Именно потому что я не знаток Питона, а использую его в качестве «маленького скриптового языка»,лишь слегка подрихтовывая чужие скрипты под свои надобности.

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

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

В питоне нету классических переменных из С, там есть связывание имен с объектами.

>>> a = 5
>>> b = a
>>> id(a) == id(b)
True

А типы он различает очень строго:

>>> abs('1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

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

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

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

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

А ведь жизненная задача-то. Обмазалиь вы типами со всех сторон, реализовали тип-«Мужчина», у которого в качестве обязательного параметра — длинна члена в дюймах, для сортировки или чем вы там ещё грязные извращенцы занимаетесь. Продали значит, свой рыночный продукт к нам в ЕС, а тут, внезапно, у мужчины члена не может быть вообще. И что теперь?

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

Ага. Вот в CL у пути должно быть 6 компонентов: файловая система, устройство, каталог, имя, тип, версия.

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

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

Вы, наверное, и русские буквы в именах файлов не используете

Естественно не использую. Ибо имя файла это идентификатор,а в идентификаторах допустимы только буквы ascii,цифры и знак подчеркивания. Вот например что микрософт про правила именования идентификаторов пишет.https://learn.microsoft.com/ru-ru/cpp/c-language/c-identifiers?view=msvc-170

Всё остальное - нарушение стандарта. Если ваша цель сделать какой-нибудь трюк то конечно можете пользоваться. Но в обычном случае лучше бы не надо.

В настоящее время велика вероятность что файл придется выложить в интернет или переслать по почте. И у пользователей из других стран русские буквы в имени вызовут ровно те же проблемы что файл с именем из иероглифов на вашем компе. Для большей части мира кириллические буквы это такие же неведомые закорючки как для вас иероглифы или санскрит какой-нибудь. Они не то что ввести их не смогут (например в командной строке), они даже не знают как большая часть из них читаются. А еще есть флэшки на которых файловая система обычно fat32. И на компе без установленной русификации в линуксе будут «вопросики» вместо букв,а в виндах подчеркивания и/или те же вопросики. А также есть общеупотребительный архиватор zip,который не хранит внутри архивов информацию о кодировке имен файлов. А еще есть компьютеры от Apple у которых мнение о внутреннем представлении составных юникодных символов не совпадает с линуксовым. Напомню,что буквы с точками и «крышками» могут кодироваться как один символ,а могут как буква отдельно и точка/крышка отдельно,объединенные в лигатуру. Так что не пихайте в имена файлов русскую букву Ёё даже если русские имена любите. То же самое с Йй.

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

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

А ведь жизненная задача-то. Обмазалиь вы типами со всех сторон, реализовали тип-«Мужчина»,

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

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

то есть тип «семья» у вас определен неточно. отсюда и проблемы.

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

Естественно не использую.

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

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

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

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

Если на вопрос: „Ты за Сталина или за Троцкого“, вы ответите it depends, то вас гарантированно расстреляют. Есть вопросы, на которые нужно отвечать твёрдо и чётко, мужественно смотря в глаза товарищу гендеркомисару.

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

Если на вопрос: „Ты за Сталина или за Троцкого“, вы ответите it depends, то вас гарантированно расстреляют.

дожили…неужели в ваших европах все так страшно?

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

Три часа плюс пятнадцать минут будет три часа пятнадцать минут.

Так как часы и минуты не подчиняются правилам десятичной системы счисления то просто сложив 3(часа) и 15(минут) вы получите бессмысленное число 18 непонятно чего. Для правильной работы с часами и минутами надо создать специальный тип который будет хранить в себе числа минут и часов и специальные функции для сложения-вычитания времени. Бывает весьма актуально для всяких административно-бухгалтерских расчетов.

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

В стандартной поставке есть jshell, поэтому можно сократить:

% cat main.java 
System.out.println("Hello World");

% jshell main.java
Hello World

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

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

Хранить проще в unix time. Время вычитать наверное никому особо и не надо, вот работа с датой это полезно, тут лучше взять готовое.

В PHP отличная работа с датой и временем, понимает даже некоторый человеческий ввод:

new DateTime("last day of next month")

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

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

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

Удивительно, как половина отписавшихся в этом треде не пишет из собственноручно написанного браузера на собственноручно написанной ОС

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

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

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

Да разве ж это страшно, «Зольдатен, фойер!» и всё, капут. Даже больно не будет. Но это не точно конечно. Хуже, если вашим делом займётся берлинская полиция.

Но, ладно, это уже политота пошла. А вопрос хрупкости системы типов — серьёзный. Вы, вот, были уверены, что люди делятся на мужчин и женщин, заложились на это, а потом вжух — новые бизнес требования. И всё по новой рефакторь. Обидно.

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

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

Как это произошло? Использование boolean? Ну это как минимум не интуитивно, кто true а кто false?

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

про правила именования идентификаторов пишет.https://learn.microsoft.com/ru-ru/cpp/c-language/c-identifiers?view=msvc-170

Не правила именования идентификаторов, а правила именования идентификаторов Си. А ссылаться здесь на Микрософт…

Вот правила именования идентификаторов от Оракула: https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8

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

Я предпочту, чтобы скачанный файл назывался 世遗之城.txt, а не shiweizhicheng.txt. Так хоть сразу понятно, что в файле.

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

Если они не знают русский язык, зачем им файл с русским именем и, очевидно, русским содержанием?

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

С таким же успехом можно рекомендовать избегать в именах файлов l, I, 1, O, 0. Они тоже у некоторых выглядят неотличимо. Русские буквы й и ё не являются лигатурами.

Кстати, если избегать всех, которые неоднозначны в юникоде, то надо также избегать i, a, b, k, c, e, x, y, p, n.

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

а) переучить США с фаренгейта на цельсии, с галлонов на литры, и с фунтов на квадратный дюйм в паскали;

Пока что я вижу что Россия постепенно переходит на имперскую систему мер. Дюймовые стандарты уже вообще на каждом шагу от водопроводных труб до колёсных дисков на машинах. Авиация вот не так давно с метров на футы высоты перешла. На манометрах PSI регулярно встречаются.Да и вообще английская система мер более ориентирована именно на повседневное употребление,а не на расчеты в теоретический физике.

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

Хранить проще в unix time.

Дополнительная секунда добавляется по астрономическим наблюдениям в конце суток по всемирному времени 30 июня или 31 декабря так, чтобы время UTC не отличалось от UT1 более, чем на ±0,9 секунды. Считается, что в такие дни после времени 23:59:59 идёт 23:59:60[8].

Время вычитать наверное никому особо и не надо,

В смысле? А как, например, начало Страстной Седмицы определять? С вычитанием получается легко и изящно: $ДатаПасхи - 7 дней.

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

Как это произошло?

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

Использование boolean?

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

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

Вы, вот, были уверены, что люди делятся на мужчин и женщин, заложились на это, а потом вжух — новые бизнес требования. И всё по новой рефакторь.

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

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

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

cooperative1519
()
Ответ на: комментарий от ya-betmen

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

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

Зачем на физике проводят опыты и лабораторные,

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

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

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

Встречаются два приятеля:
— Ты, я слышал, машину купил?
— Да, хорошая вещь, теперь везде успеваю. Сегодня за день успел сменить
масло в двигателе, купить новые покрышки, съездить на авторынок за
крыльями, сгонять в автосервис, заехать в автомагазин за тосолом... И
как бы я все это без машины успел?
ugoday ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Сейчас проще назвать языки которые такое не позволяют

Ада эти фокусы с типами и операциями для них умеет с 1983 года.

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