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

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

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

Медики и юристы знают латынь очень ограниченно. Всякую худ.литературу они джаст-фор-фан читать/писать на латыни не будут.

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

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

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

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

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

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

Unit explanation;

{$mode objfpc}{$H+}

Interface

Uses 
  Classes, SysUtils, LResources, Controls, Graphics, Math, Types;
(*{$ifdef WIN32}
  Classes, SysUtils, LResources, Controls, Graphics, Math, Types;
{$endif}
{$ifdef LINUX}
  Classes, SysUtils, LResources, Controls, Graphics, Math, Types;
{$endif}*)

 
Var Message = 'No way I write all this shit in my scripts, every one of them';

Procedure NoWay(message: string);

Implementation

Procedure NoWay(message: string);
begin
    WriteLn(Message);
end 

{ ...more shit like this }

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

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

Смотря каких. Если аппаратных где надо было контроллеру прерывания сказать что обработчик закончился - то да. А если программных то можно и без. Но самое главное,что прерывания это уже про архитектуру ЭВМ,а не про язык программирования. Для какой-нибудь программы складского учета обработчики прерываний не нужны и можно не знать как их писать.

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

минимум возни с типами

Вот это как раз и плохо. Потому что потом случаются ошибки переполнения или килограммы с метрами складывают потому что и одно и другое объявляют одинаково не задумываясь о том что это таки разные типы. В советские времена был даже мультик на тему типизации - это после которого выражение «полтора землекопа» пошло в народ :)

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

И что? Код от этого хуже не пишется. Мне не надо вникать в детали микропитона, чтобы указать ему декоратор @micropython.viper и он скомпилировал функции в нативно оптимизированный вид. Хотя он и указатели поддерживает, можно их явно использовать при необходимости.

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

Бгг. уже и мухлевать начал :)

gcc -o stack stack.c

./stack
&x = 0x7ffcecca9e7c
&y = 0x7ffcecca9e78

clang -o stack stack.c

./stack
&x = 0x7ffe3a816bf8
&y = 0x7ffe3a816bf4

Несите следующего пассажира, этот порвался.

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

Потому что потом случаются ошибки переполнения или килограммы с метрами складывают потому что и одно и другое объявляют одинаково

Ошибки переполнения как раз случаются когда программист определяет тип. Смотрит и думает: значение больше 255 не будет, а потом приходит 300. В Scheme переполнения не бывает, так как целое число там действительно целое, а не «с арифметикой по модулю 2 в степени N». И результат деления целого числа на целое даёт рациональное число, а не целое.

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

В советские времена был даже мультик на тему типизации - это после которого выражение «полтора землекопа» пошло в народ :)

То не про типизацию, а про арифметику. А про типизацию спасло бы Mars Climate Orbiter, если бы для футов и метров использовались разные типы данных.

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

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

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

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

В зависимости от типа объекта может и полная копия создаваться, и ссылка.

Это для какого типа полная копия создаётся? Если речь про число, то на него такая же ссылка, как и на любой другой объект. Только у числа изменяемых свойств нет, поэтому можно думать, что оно копируется.

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

Ну да, с точки зрения поведения параметра функции вообще не важно, 42 там или адрес на какое-то другое место в памяти, где это 42 записано. Функция-то всё равно только 42 видит.

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

Это в Си магия. Когда структура при передаче всегда копируется, а массив всегда по ссылке. Но если массив в поле структуры, то уже по значению.

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

Речь но об этом.

Речь о том, что процессор не работает с абстракциями и абсолютно любая абстракция в итоге всегда превращается в последовательность команд из строго ограниченного набора которые работают только с регистрами и памятью (и портами ввода-вывода если в архитектуре разделены IO и RAM). Процессор в принципе не умеет «читать файлы», «открывать сокеты» и «манипулировать объектами».

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

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

На динамическом массиве можно сделать операцию cons со сложностью O(1)?

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

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

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

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

и язык питон прекрасно для этого подходит.

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

Аллергию на Лисп приобрел на всю жизнь.

Если вас учили навроде «в Лиспе всё есть s-выражение», то ничего удивительного.

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

Обучение программированию должно строится на «живой» работе с кодом, поскольку лучше один раз пощупать, чем сто раз увидеть (Ц). Т.е. уже 2 занятие – это написание программы, даже если это будет «ввести 2 числа и вывести их сумму и разность». Но, упаси ЛММ, не с пресловутого «Прощай, мир», после которой следующую программу пишут после сдачи экзамена за семестр.

P.S. На мой вкус CL лучший выбор для математиков.

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

На мой вкус CL лучший выбор для математиков.

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

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

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

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

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

Так список в питоне не имеет отношения к односвязному списку

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

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

то есть кратко записать obj.field - не позволяют синтаксические правила

Чем (@ obj field subfield (meth arg arg2)) хуже, чем obj.field.subfield.meth(arg, arg2)?

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

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

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

всем хуже. хуже всем. всем только хуже от этого. а должно быть лучше и с каждым днем.

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

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

Некоторых лиспов. В кложе с интеропом с хост-платформами всё хорошо.

(.-field obj)

(.method obj)

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

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

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

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

Поясните, зачем ООП для, например, численных методов? Я имею ввиду приближение функций многочленами Якоби или Чебышева?! Тут хватает FORTRAN IV.

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

Я имею ввиду приближение функций многочленами Якоби или Чебышева?! Тут хватает FORTRAN IV.

вы сами ответили на свой вопрос. все, на что хватает фортана 4, мы не рассматриваем как доказательный пример.

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

На мой вкус CL лучший выбор для математиков.

Вот это ты загнул. Какая связь между математикой и скобчатой мудянкой?

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

Мне не надо вникать в детали микропитона, чтобы указать ему декоратор @micropython.viper

Совсем совсем не самопротиворечивая фраза.

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

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

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

Про третью же половину и говорить соромно.

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

Так магия не в этом, а в том как ты значения меняешь и кому.

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

list.append, list.pop практически O(1), как аналог cons-списков

Только с другой стороны, надо полагать. По сути, это не список, а вектор (индексированный массив).

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

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

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

Какая связь между математикой и скобчатой мудянкой

Хорошее выражение, надо запомнить.

Лямбда-исчисление?

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

Незнание деталей

Не освобождает от ответственности за результат, хехе.

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

У push/append и pop только одна сторона

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

А конец, как известно — и делу венец!

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

Чем начало отличается от конца?

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