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)

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

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

Первый урок по программированию.

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

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

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

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

– Чем, чем он лучше-то??

  1. Выбор операции по классу типа, а не по содержимому переменной. Для CL есть lisp-interface-library, но она плохо сочетается со стандартной библиотекой. Позволяет писать нормальные обобщённые алгоритмы типа той же монады. Позволяет определять алгоритмы на уже существующие типы отнесением типа к классу, а не перечислением всех типов в реализациях метода (попробуйте в лиспе сделать функцию, объединяющую любые две коллекции, например).

  2. Нормальные типы. В CL даже типизированный список или хеш описать нельзя. И даже те типы, что есть, ненадёжны: это баг в SBCL или я что-то не понял?

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

  4. Нет нескольких сотен запретных слов для имён (потому что они в пакете CL).

  5. Ленивость позволяет сократить описание алгоритма, позволяет описывать бесконечные структуры. И писать, как математики привыкли, «возьмём первые 20 простых чисел» = take 20 primes, «просуммируем первые 10 чётных чисел» = sum $ take 10 $ filter even [1..].

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

начать с Паскаля, не вдаваться в глубокие особенности диалектов

fpc -Miso ?

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

В haskell начинающий утонет в борьбе с типами (тайпчекреом). И для борьбы с тайпчекером надо всерьез погрузиться в теорию.

В начальном этапе изучение хаскеля ничем не отличается от зубрежки без понимания.

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

не понял

Это ты не понял. В ЛИСПе a = b + c может значит вообще что угодно, в т.ч. например if a then b else c. А в крестах нет, каким бы начленоверченым не был там синтаксис. Его можно изучить от корки до корки и на этом закрыть тему. Если «новичку» непонятно как работает это выражение, значит он «не изучил».

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от Nervous

функции, знаете ли, тоже бывают такие, которые значения не возвращают

Тогда что угодно будет «функцией». Даже небо, даже Аллах. Такое определение является вырожденным и не представляет интереса.

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

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

Но зачем, опять же? Я вот си учил в школьные годы самостоятельно вместо опостылевшего паскаля, и когда дело дошло до указателей, первым же действием было передать туда тот адрес, который хочу я. Естественно, программа упала. Какого чёрта? Потом я узнал, что адреса, которые видит программа, совершенно не соответствуют физическим адресам в раме. Какого чёрта (×2)? Чем не магия? Почему так? Зачем? Уже отобрали контроль над памятью, а рассказывают, что си что-то там даёт в плане низкоуровневого доступа. А хер на рыло, как оказалось.

Поэтому людям можно (и нужно) не заморачиваться над такими вещами и выбирать инструменты, которые позволяют, как завещал грязный Билли, write less code to get the same things done.

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

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

но передать то, что хотелось, удалось.

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

например слишком вольно обращающийся с типами данных.

Да похер на типы данных. Абсолютно. Носитесь с этими типами, как с писаной торбой. Например, там, где нужно целое/дробное число, об этом должен заботиться тот код, который принимает только целое/дробное число. В этом плане тикль, опять же, красавец: ты можешь сколько угодно гонять 42 по строкам, но expr примет только 42 и не примет 42ololo, например. Передашь туда не-число — expr упадёт. Другое место, где в тикле важны типы — binary scan и binary format (как и в питоне struct.unpack и struct.pack соответственно), но это касается взаимодействия с внешним миром при чтении/писании бинарных пакетов или файлов. Для программирования без такового взаимодействия достаточно подхода «всё есть строка»: встроенные средства самого ЯП позволяют при необходимости интерпретировать эти строки как списки, хэшмапы и прочее. Мне такой гибкости даже в питоне порой не хватает без явного приведения типов с мотором.

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

В ЛИСПе a = b + c может значит вообще что угодно, в т.ч. например if a then b else c. А в крестах нет, каким бы начленоверченым не был там синтаксис.

В С++ возможна любая наркомания.

#include <iostream>

template <typename T>
struct X {
	T val; const T *link;
 	X(T x, const T *y = nullptr) : val(x), link(y) {}
	T operator=(const X& other) {
		return val || !other.link ? other.val : *other.link;
	}
	X operator+(const X& rhs) { return X(val, &rhs.val); }
};

int main() {
	X<int> a = false, b = 123, c = 456;
	std::cout << (a = b + c) << "\n";
}
jpegqs
()
Ответ на: комментарий от alysnix

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

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

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

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

если есть необходимость людь наизусть библиотеки цитируют

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

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

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

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

ответ - типы нужны только трусам! сразу отметаем как дурацкий

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

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

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

возможна любая наркомания

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

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

Какой вопрос, такой и ответ. Миллионы скриптов в мире вполне работают без языковых подпорок в виде типизации.

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

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

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

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

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

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

Интересно, на чем написаны всякие популярные социалочки?

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

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

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

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

Это ты из своего опыта? Потому как в мире есть наглядные примеры обратного.

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

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

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

Интересно, на чем написаны всякие популярные социалочки?

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

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

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

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

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

так приведи их!…

В педивикии забанили?

Она, кстати, вообще на пыхе написана. Там всё плохо не только и не столько с типами. Но тем не менее.

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

Это теперь мода такая — при отсутствии вменяемых практических аргументов на чатгопоту ссылаться?

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

я даже не поленился и погуглил на чем написаны «всякие социалочки»

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

https://tproger.ru/articles/na-chem-piwut-sovremennye-socseti--sposobnye-vyderzhat-ogromnyj-potok-lyudej?ysclid=m488du5h1v370693708

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

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

https://tproger.ru/articles/na-chem-piwut-sovremennye-socseti--sposobnye-vyderzhat-ogromnyj-potok-lyudej?ysclid=m488du5h1v370693708

Интеренсные выводы сделаны из отсутствующих фактов (в приведенной ссылке)

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

Это теперь мода такая — при отсутствии вменяемых практических аргументов на чатгопоту ссылаться?

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

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

45X по фаренгиту

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

ща нейролинк докрутят ваще слюни не переставая будут

qulinxao3 ★★
()

Изучай то, чьи действия будешь записывать в программу. Например, USB порт, как он работает, как к нему обращаться. Или как работает СУБД, как к ней обращаться. Но сейчас модно быть крутым поисковиком библиотек ЯП. Собственно, поэтому и популярен Python и не популярен Lua.

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

есть разница между хинтами «компилятору»

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

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

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

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

А с чего бы, для начала, кто-то начал вообще их складывать?

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

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

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

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

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

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

ты разраб одиночка? мало ли что ты там знаешь. вот как ты считаешь - относительный путь к файлу и абсолютный - совместимы по присваиванию?

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

так ты хацкел с милнерами обороняешь

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

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

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

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

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

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

В-четвёртых (и, как бы, не главное), не хватает библиотек

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

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

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

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

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

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

ты разраб одиночка?

Я вообще девопс.

мало ли что ты там знаешь.

Достаточно.

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

Естественно. А код, который сам явно не резолвит имя файла перед использованием — говнокод.

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