LINUX.ORG.RU

Язык для обучения программированию


1

7

Понятно, что Java - наверное самый мэйнстрим на текущий момент, ну с C#(Mono)(я не рассматриваю здесь пыхпых, джаваскрипт и прочий веб), но мне известна(как и большинству местных) статья, что изучение с Явы вредно для мозгов.
И вот, столкнувшись с тем, что отданные под моё руководство студенты 3го курса не сильно способны заниматься программированием на С++, задумался, как решить эту проблему, избегая 2х тупиков - делать всё за них, и выгнать их.
Допуская, что производительность языка не нужна(хотя, ввиду того, что делаем мы в основном числодробилки, это очень сильно допущение) и вообще у нас под рукой кластер, какой язык посоветует ЛОР, помогающий развить мозг молодых учёных до уровня С/С++? Да и вообще, список годных для обучения, и негодных соответственно. Думал было python, но тем не в нём производительность недостаточная, а самому реализовывать затратные вещи на С пока не хочется.
Update: vb и delphi не Ъ ввиду того, что я то под линуксом сижу. Update 2: всё, наработанное за время использование предложенного языка, не хочется терять, поэтому хорошо бы, если б можно было соединять уже готовые вещи с C/C++. Насчёт pascal я просто никогда такого не желал, там такое есть?

★★★★

Последнее исправление: aptyp (всего исправлений: 2)

Ответ на: комментарий от aptyp

А может с другой стороны тут скорость написания важнее

Тут важна не скорость написания, а сам факт написания понятного и работающего кода. А работа химика-экспериментатора (а кому ещё программу писать нужно?) может и месяц готовиться. Лишний час там ничего не сделает :)

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

«Последовательность».

Ну и где в определении-то указано, что эта «последовательность» не может зависеть от времени?

Нет, конечно. Интерпретируется одинаково, но на вход поступают разные данные.

Какие разные-то? В обоих случаях на вход поступает твое фото. И это все данные, которые поступают на вход.

Программа на ЛЮБОМ языке имеет право делать IO и менять своё поведение соответственно.

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

Любой программе, делающей IO, оно нужно. На CL или не на CL.

Нет, не нужно. Если задан ЯП с фиксированной семантикой, то не важно есть ИО или нету ИО - нам нужна только сама программа. И по ней мы можем совершенно точно определить, что эта программа будет делать. Кроме программы ничего не нужно.

Состояние лисп-машины — часть данных, естественно.

Ты ответь-таки на вопрос: «что значит есть все данные»?

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

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

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

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

И по старой памяти, у нас химики, как раз, очень эффективно на Бейсике писали. Все поголовно. А вот когда на Паскаль перешли — сразу облом, народ программировать прикладные задачи разучился.

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

А речь идёт о сравнении C с хаскелем.

Ну ок, пусть будет сравнение. Итак - ты сказал, что в си есть неестественные вещи. Я указал, что в хаскеле есть вещи еще более неестественные (отсутствие индуктивных типов). Дальше что?

При желании-то можно из хаскеля вообще бейсик сделать.

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

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

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

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

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

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

Да нынешние химики тоже жгут, правда в маткаде(или что там), математику лучше нас знают, молодцы.

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

Ну и где в определении-то указано, что эта «последовательность» не может зависеть от времени?

Как раз наоборот — она существует во времени.

Какие разные-то?

Фаза луны. Она разная. Это разные внешние данные. Что непонятно?

Программа может менять _свое поведение_ но не может меняться семантика ЯП (то есть алгоритм работы вычислителя). В данном случае именно алгоритм работы вычислителя и меняется.

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

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

Ещё раз напомню: никакой тьюринг-полный язык не позволяет определить, что будет делать программа, кроме как запустив её.

Ты ответь-таки на вопрос: «что значит есть все данные»?

Какое слово непонятно?

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

Итак - ты сказал, что в си есть неестественные вещи. Я указал, что в хаскеле есть вещи еще более неестественные (отсутствие индуктивных типов). Дальше что?

Ну, вещь, указанная тобой, в C тоже присутствует. А раз так, то для сравнения она не имеет значения. Всё.

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

Дык бейсик-то из хаскеля сделали.

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

Я про математику, в хаскелле то понятно.

В математике циклов тоже нет.

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

Нет, всё логично. В конце-концов лично моим рабочим языком стал Си. Другой вопрос, что прямо с сентября да на первом-то курсе «грузить» Сями...

ЗЫ Делфей (к счастью) в те дикие времена ещё не было))

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

Ну, вещь, указанная тобой, в C тоже присутствует.

Нет, не присутствует, си - энергичный язык, а не ленивый.

Дык бейсик-то из хаскеля сделали.

Ну это по сути интерпретатор, нет?

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

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

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

Как раз наоборот — она существует во времени.

То есть она именно «в данный конкретный момент времени»? Но ты же как раз говорил, что это не так.

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

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

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

а если это Charset и String или Real и Float? А если вы сами создаете два новых типа от Root_Integer и от Integer? Ада запрещает действия между этими типами без явного преобразования, по моему это наоборот дисциплинирует и дает понимае о типах данных. Зря вы так сразу Аду отбросили.

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

это кто вам сказал фигню про полгода?

первая половина PCL (именно с основами) читается неспешно за пару недель(а то и быстрее) и позволяет также начать клепать поделки

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

семантика в хаскеле ленивая

-- non-strict:
Prelude> let f = 1 : f
Prelude> take 5 f
[1,1,1,1,1]

-- strict:
Prelude> let g = g `seq` 1 : g
Prelude> take 5 g
^CInterrupted.

отсутствие индуктивных типов

-- non-strict:
data N = Z | S N

-- strict:
data N = Z | S !N
quasimoto ★★★★
()
Ответ на: комментарий от splinter

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

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

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

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

Как для типа data Nat = Zero | Succ Nat, так и для типа Nat = Zero | Succ !Nat бесконечность (f = Succ f) будет натуральным числом. Не бывает в хаскеле индуктивных типов, ну нет их :)

Аналогично, в энергичных языках не бывает коиндуктивных типов. Это одна из двойственностей strict/lazy.

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

Нет, не присутствует, си - энергичный язык, а не ленивый.

Напоминаю, речь шла о «возможности определить тип натуральных чисел». Где это в C?

Ну это по сути интерпретатор, нет?

Э... это почему, собственно?

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

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

Конечно. В общем-то, и сделано (всякие mapM_ и пр.)

Вот только безумного «x = x+1» там всё одно не будет.

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

То есть она именно «в данный конкретный момент времени»?

То есть она протяжённая, дурик.

В твоем же представлении, как я понял, лисп-машина - сама является входными данными.

Почему «входными»? Где я это сказал?

По сути, семантика Лиспа — это старая добрая машина Тьюринга, где вместо ленты идёт обладающая более богатой структурой лисп-машина. Вот и всё.

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

Мне кажется сразу дисциплина и не нужна

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

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

В альтернативной реальности

Не знаю, не был.

Miguel ★★★★★
()

Ruby, Pure C, Pascal

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

Напоминаю, речь шла о «возможности определить тип натуральных чисел». Где это в C?

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

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

То есть она протяжённая, дурик.

Ты давай не увиливай. Она может зависеть от конкретного момента времени? Да или нет?

Почему «входными»? Где я это сказал?

Не входными? А какими?

По сути, семантика Лиспа — это старая добрая машина Тьюринга, где вместо ленты идёт обладающая более богатой структурой лисп-машина. Вот и всё.

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

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

Вот только безумного «x = x+1» там всё одно не будет.

Ну почему же не будет? Разве мы не можем внутри ИО описать вычисление «инкрементировать значение по данной ссылке»?

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

Она может зависеть от конкретного момента времени? Да или нет?

Что означают эти слова?

Функция f(x)=x^2 зависит от конкретного значения x? Или всё-таки существует сама по себе, для всех x одновременно?

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

т.е. динамические языки не приемлите?

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

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

Так в хаскеле нет разделения на данные/коданные - и те и другие можно делать с помощью data (поэтому они и ленивые/бесконечные, т.к. это требуется для коданных). В agda в одно врёмя были codata, но сейчас коданные опять определяются обычным data с использованием примитива INFINITY (который никак на рантайм не влияет).

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

Разве мы не можем внутри ИО описать вычисление «инкрементировать значение по данной ссылке»?

Можем. И будет это выглядеть как \x -> x+1.

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

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

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.