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

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

нет. в идеологии, где «все является строкой», это будут или 18 часов, или 18 минут. ибо строки между собой неразличимы. а выбор - часы или минуты, будет делаться в зависимости от времени суток

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

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

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

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

А потом надо написать fopen и какой тип ставить? Или делать две версии fopen? Или передавать вариантный тип?

в fopen параметр вообще строка. если вы хотите использовать fopen «as is». то просто конвертируете любой из типов в строку, явным образом, во имя сильной типизации.

а если проектировать с нуля, тo fopen должен принимать абсолютный путь. использование тут относительного должно предусматривать явное преобразование в абсолютный(ну или неявное относительно некой текущей базы - это предмет соглашения).

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

Будь я психиатром и услышь: „Три часа плюс пятнадцать минут будет 18 часов или 18 минут, в зависимости от времени суток“, то в дурку я бы вас может и не отправил, а вот справку на допуск к автоправам или разрешению на оружие вы бы у меня не получили. Кто его знает, может вы потом людей начнёте давить или в школе сводить счёты с хулиганами. Не хочу брать грех на душу.

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

То есть если этой проверки не будет, я внезапно захочу это сделать?

Можете сделать нечаянно и не заметить, пока ракета не упадёт или химический завод не взорвётся. У вас, в сущности, есть два пути: а) переучить США с фаренгейта на цельсии, с галлонов на литры, и с фунтов на квадратный дюйм в паскали; б) как-то программными средствами исключить возможность обработки неправильных данных в неожиданном месте.

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

так это ваши проблемы. у вас все данные - просто строки (найти пост?) которые преобразуются туда-сюда в зависимости от контекста или трактовки. и типы вам не нужны совсем. и потому не нужны никому другому. и вообще вы девопс

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

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

так это ваши проблемы

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

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

в fopen параметр вообще строка. если вы хотите использовать fopen «as is». то просто конвертируете любой из типов в строку, явным образом, во имя сильной типизации.

Я правильно понял, что вы предлагаете следующий путь исполнения:

  1. Взять строку path-to-a-file.
  2. В зависимости от, сконструировать объект AbsolutePath(path-to-file) или RelativePath(path-to-file).
  3. Носиться потом с этими AbsolutePath и RelativePath ни дай Боже им смешаться.
  4. Скастовать из Абсолютного/Относительного пути обратно исходную строку.
  5. Передать её fopen.

?

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

то есть, по-твоему, выражение (лопаты+землекопы)/ температура - корректное выражение. так? ну если все есть строка.

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

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

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

ну вот пусть есть функция add_hour_min(hour, min)… «сложить минуты и часы».

и вы перепутали местами часы и минуты при вызове. что дальше? в дело вступает отряд тестеров или что?

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

А почему феликса нельзя,а счеты можно? В чем принципиальная разница?

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

Вот и в ОП главное слово "обучение" а не "программирование".

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

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

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

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

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

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

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

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

Так это вопрос объема кода. Что-то небольшое можно написать и отладить даже на ассемблере. Но попробуйте не сделать ни одной ошибки в программе размером хотябы в несколько десятков килобайтов исходного кода. Для избежания человеческих ошибок типизация и придумана. Процессору-то всё равно что означают загруженые в его регистры числа.

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

В многих диалектах задается размер переменной db, dd и ее нельзя положить просто так в регистр другого размера без каста. Даже в таких низкоуровневых языках думают о типах!

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

Кхе-кхе zig:

    const file = try std.fs.openFileAbsolute(path, .{ .read = true });
anonymous
()
Ответ на: комментарий от rebforce

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

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

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

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

Есть только мааааленькая проблема: чтобы придумать красивый дизайн, надо знать как язык внутри работает. Потому что «плохой дизайн» это на 90% попытки идти поперек того, как в языке принято что-то делать. Чуваку, которому «A = B + C» сложно понять, это тупо не под силу.

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

а как вы узнали, где часы, а где минуты?

Это уже другой вопрос. Главное, что логически, с точки зрения логики предметной области, сложение часов и минут оправдано. Даже сложение лопат с землекопами оправдано и имеет смысл. Лопата + землеком = один готовый к работе землекоп *). А Лопата + землекоп + бутылка водки = один землекоп, которому нужно получить нагоняй от бригадира. Такая вот арифметика.


  • обратите внимания, результат вычисления выражения тут стоит справа от знака =. Потому что это удобно и наглядно.
ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Можете сделать нечаянно и не заметить

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

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

грамотная архитектура приложения

Это сложно. А жизнь и так сложная. Хотелось бы помогайку какую, в конце концов IT должно облегчать жизнь людям, разве нет?

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

Это уже другой вопрос.

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

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

Это сложно.

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

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

а что за сущьность вообще складывает

это часы бампять себя минутами

али минуты вливаются в часы

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

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

ааааа?

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

Лопата + землеком = один готовый к работе землекоп

то есть 1 + 1 = 1. занимательная арифметика. дело приняло еще более мутный оборот…

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

ну допустим обеденный перерыв наступает в час дня и длится 45 минут. вопрос к знатокам - в какое время закончится обеденный перерыв?

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

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

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

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

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

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

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

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

ващет это вариант реализации

где землекоп владеет лопатой

и тем отличается от землекопа без владения лопатой

ибо «готовый к работе» в этом тезаурусе отличается от свеженанятого землероя

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

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

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

обеденный перерыв не обладает субьектностью

следует отличать всёж язык профанов и шорткаты в нём от настоящий_речиТМ

и да наступить оп не может ножек нет

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

Может протащить скобкоту в большой мир

Там вон выше возмущались что в паскале надо длинные и неудобные begin/end писать. А чуть ли не десятки скобок в каждой строчке Лиспоподобных - это значит нормальный и правильный синтаксис.

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

то есть у нас стало три типа - землекоп без лопаты, лопата и землекоп с лопатой.

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

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

«Вы и так будете постоянно падать с велосипеда, поэтому советуем маленькие колёсики оставить навсегда».

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

это тот самый вопрос.

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

> (defn clock-calc-for-alysnix [h m]
    (format "%s:%sPM" h m))
> (clock-calc-for-alysnix "3" "15")
"3:15PM"

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

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

Существует чёткий алгоритм трансляции относительного имени файла в абсолютное.

Причем в виндах с их C:,D: и так далее - он отличается от линуксового. Или вы всё еще не мультиплатформенный софт?

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

то есть 1 + 1 = 1. занимательная арифметика

Вас же в реальной жизни не смущает, что один мужчина и одна женщина образуют одну семью?

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

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

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

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

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

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

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

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

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

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

А должна ждать reader, который уже автоматом преобразует путь к файлу (не важно асолютный или относительный) в поток символов.

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

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

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