LINUX.ORG.RU

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


1

7

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



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

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

Значит мы с коллегами эти самые избранные мазохисты. Тока один пример - программа для газодинамики горения (Эрика Эриксона, 1995г), 4000 строк на фортране. 1000 строк скажем там интерфейс, то что я на питоне делаю в 40 строк, ладно. Но числ ядро 3000 строк, это против 420 строк на С++ уже моего кода по моделированию многофазной фильтрации (сравнение не вполне корректно, все таки разные методы, у меня неявная схема для давления, но горение и там и там есть, и таки многофазная фильтрация погеморней будет). Ну и примеров таких масса...

Фортран выигрывает за счет предельной простоты и огромного кол-ва библиотек. Но возможности С++ куда шире все таки... и наконец, у меня есть железобетонный аргумент (который я на ЛОРе каюсь уже тыщу раз приводил) - самые быстрые в мире коды для моделирования довольно широкого класса задач пишутся сейчас нами именно на связке Python/С++, и на фортране это вряд ли вопроизводимо... подробнее тут www.linux.org.ru/wiki/en/User:AIv/LRnLA

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

Да что-то не сильно шлифовавшийся лет на 20 больше Фортран быстрее С

O_O? Шутите?

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

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

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

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

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

Если первое - семантика зависит от времени. Если второе - очевидно, нет.

Ну вот, ты и ответил на свой вопрос сам.

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

А что, Portage, deluge,mercurial и проч - мелкая скриптня?

Depends. Бывают коллекции (пусть и большие) никак не связанных друг с другом мелких скриптов. Бывают большие программы, сделанные при помощи негодных инструментов.

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

Ты всерьёз считаешь, что это C?

Это не Си, это тип, который можно выразить в Си. U - юнионы, произведения - структуры с поинтерами.

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

Ну вот, ты и ответил на свой вопрос сам.

Согласно твоему определению - первое. То есть зависит от времени. Но в самом начале ты сказал, что семантика от времени не зависит. Как быть?

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

Там вопрос не в ЯП а в кривизне рук программиста. На самом деле разницы никакой нет наск я понимаю, все различия в производительности связаны с различиями в традициях реализации алгоритма. «Фортран быстрее С» это такой же бред как и «C быстрее С++».

Послал.

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

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

ADT могут быть обычными данными либо коданными только по отношению к стратегии вычисления кода который с ними работает. В хаскеле реализованы обе стратегии - и строгая и нестрогая, так что можно использовать хаскельный РТД лениво (точнее, нестрого) и тем добиваться инфинитности данных, но можно и строго (с помощью seq, ($!)), тогда данные будут финитны. В си РТД вида:

typedef struct nat {
    struct nat *succ;
} nat;

может быть обработан только строго (ну, без VM games если), и поэтому может служить только для финитных данных.

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

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

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

не понял, что?

Твой предыдущий вопрос не был посвящён деталям функционирования IORef. Поэтому, естественно, я опустил вызов modifyIORef.

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

Ну как с чего? вот определение твое:

Под операционной семантикой — интерпретацию валидной программы как последовательности элементарных операций.

«интерпретация», а не «функция, которая каждому моменту времени сопоставляет интерпретацию».

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

Я уже написал, как выражать (юнионы, структуры и поинтеры).

Ещё раз: попробуй СДЕЛАТЬ. Или ты хочешь сказать, что это больше десятка строк?

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

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

«интерпретация», а не «функция, которая каждому моменту времени сопоставляет интерпретацию».

«Валидная программа» — это свободная переменная. Терм со свободной переменной означает именно что функцию.

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

«Валидная программа» — это свободная переменная. Терм со свободной переменной означает именно что функцию.

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

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

А, я знаю. Сейчас окажется, что программа - это, на самом деле, не сам программный код, а программный код*текущий момент времени, лол.

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

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

Принял, спасибо.

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

Если твоему Nat принадлежит бесконечность - это нихрена не данные.

Ещё раз:

data N = Z | S N
  deriving Show

infinite :: N
infinite = S infinite

-- infinite
-- > (S (S (S (S (S (Interrupted.

finite :: N
finite = S $! finite

-- finite
-- C-c C-cInterrupted.

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

#include <stdlib.h>

typedef struct nat {
    struct nat *succ;
} nat;

nat *inf(void)
{
    nat *x = malloc(sizeof(nat));
    x->succ = inf();
    return x;
}

и тоже infinite loop, первому прямого аналога нет.

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

что хочешь

Что значит что хочешь? У тебя есть конкретный тип - этому типу соответствует конкретное множество значений. Если у тебя там сидят бесконечности - это коиндуктивный тип.

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

Можно просто struct list { struct list* tail; int head; }; и выявлять конец списка по tail == NULL.

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

А что такое нельзя делать на фортране, а можно на питоне то?

Графики рисовать, например, гораздо удобнее на питоне.

и я так понял все эти десять лет газодинамикой занимаешься?

Научкой разной.

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

Ну ладно, я хотел сказать, что если нужны финитные строгие / инфинитные ленивые данные, то есть выбор и перепутать одно с другим сложно. Что там терминологически это уже не так важно (а то тогда можно потребовать язык в котором есть прямые data и codata определения).

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

1000 строк скажем там интерфейс, то что я на питоне делаю в 40 строк, ладно. Но числ ядро 3000 строк, это против 420 строк на С++

Чего-то вы как-то не так фортран используете.

На нём не надо писать интерфейс, он не для этого. Первый раз слышу чтобы аналогичный вычислительный код на фортране был в 10 раз длиннее, чем на c++. В фортране, в отличии от c++, есть нормальные операции с многомерными массивами, ими надо пользоваться. Там где на c++ надо делать несколько вложеных циклов, на фортране часто можно одним выражением обойтись. Операции с массивами в фортране работают очень быстро.

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

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

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

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

Но числ ядро 3000 строк, это против 420 строк на С++

Типичная разностная схема на фортране это вот:

u(1:n-2, 1:m-2) = ((u(0:n-3, 1:m-2) + u(2:n-1, 1:m-2))*dy2 + &
(u(1:n-2,0:m-3) + u(1:n-2, 2:m-1))*dx2)*dnr_inv

одна строка.

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

Вот я примерно об этом.

Как альтернатива - выводить «этот код использует ленивую стратегию» и «этот код - строгую» как особые типы?

Можно сделать два типа и две разных реализации, на честном слове - что для одного типа делаем одну стратегию, для другого - другую, сейчас так обычно и делаю (Strict.ByteString и Lazy.BiteString, например), так удаётся избегать конфликтов строгих и ленивых данных (типы-то разные).

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

nuff said :)

Я верую, я верую, что Strict.ByteString работает строго, ммм...

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

Чего-то вы как-то не так фортран используете.

Это не мы, мы его вообще не используем.

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

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

Операции с массивами в фортране работают очень быстро.

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

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

Типичная разностная схема на фортране это одна строка.

Есть довольно много всяких шняг в плюсах, позволяющих делать аналогичные вещи. Напр foreach в stl... более того, это работает не только для трад массивов но и для особо извращенных.

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

На с++ аналогичные операции делаются по мере необходимости, как и многое другое.

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

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

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

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

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

Если ты пишешь на плюсах и тебе нужно что то для работы с многомерными массивами напр. - ты не делаешь это сам а берешь нужную библиотеку;-). Хотя я вот сам сделал...

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

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

Даже в приведенном примере схема неск странная, там часом не += ли нужно? И как это реализуется, без явного создания пользователем временной переменной (массива)? Временная переменная (массив) создается автоматически? А насколько это оптимально? Потому что если в лоб сделать, оно будет ес-но неправильно...

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