ML vs. Lisp

Ivan8209

Постановка задачи.
1. Удобство программирования.
Си и проч. диалекты отметаем.
2. Скорость.
Предполагаются численные расчёты.
3. Изменчивость.
Лучше, если возможна пересборка (частей) на лету.
Всвязи с этим, хочу узнать мнения на примере вышеупомянутых семейств языков.
1. Scheme vs. Common Lisp.
Являются ли в Схеме функции лямбда-выражениями (то есть, списками) или как?
Или функции получаются из лямбд путём (eval (lambda ...?
Я подозреваю второе. Я прав?
2. SML vs. (O)Caml.
Чем они различаются? Все трое.
Имеются ли в наличии хорощие компиляторы SML? Caml?
Какие?
3. Scheme vs. SML.
Скорость против изменчивости?
Насколько неудобно будет пересобирать SML на лету.
4. Common Lisp vs. Scheme.
Скорость? В т.ч. среди существующих свободно доступных реализаций.
5. П. 2 в отношении скорости работы собранных программ.
Вообще, кто-либо здесь есть из функциональщиков?
Дополнительный вопрос: Haskell и проч. против всех вышеупомянутых.
В том же духе.
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

1234554321

Haskell forever (ты уверен, что здесь есть кто-то знакомый непонаслышке со всем перечисленным?)

Ivan8209

Я не уверен.
Ты знаком с Хаскеллом?
Можешь прокомментировать?
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

Chupa

Слово знакомое увидел?
Вам замечание (+). Флуд в тематическом разделе.

1234554321

я с остальным не знаком, о чём собственно и писал выше

smnikiforov

лол. ты смешной.
Вам замечание (+). Флуд в тематическом разделе.

Ivan8209

Сможешь обсудить возможности Хаскелла в области численных расчётов?
Можно ли добиться скорости менее, чем на порядок ниже чем на Фортране или Си? Менее, чем вдвое?
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

Chupa

На Haskell'е вряд ли.
Попробуй Ocaml.

Ivan8209

Мне нужны ответы не "попробуй", а сравнения или отзывы.
Пробовать и так придётся, а сократить область перебора не вредно.
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

1234554321

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

Chupa

Откуда я могу знать, как оно поведёт себя в _твоей_конкретной_задаче_ ?
У Ocaml компилер честный (в native code) и поддерживает раздельную сборку модулей.
Сравнение с C где-то в форуме уже было для задачи поиска простых чисел. Был с ним на равных.

Ivan8209

Тогда, боюсь, на Хаскелл придётся пока забить.
А на сколько сам оцениваешь увеличение времени работы?
Втрое? Впятеро? На порядок?
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

abrek

Некоторые компиляторы CL считаются хорошими для численных расчётов, какие именно, я не запомнил. С динамической генерацией кода всё хорошо, естественно.
Реализация OCaml одна, нативный компилятор считается хорошим. Динамическая генерация кода противоречит идее строгой типизации, поэтому в лучшем случае будут неудобства, типа вызывания компилятора, генерирования и подгрузки DLL.
Компиляторы scheme и sml скорее всего менее эффективны.

Ivan8209

Так ведь, и я не знаю, как он поведёт себя на моей задаче.
А что у него с действительными числами?
Там ведь не разгонишься логику оптимизировать.
То, что у него компилятор в маш.код, это очень хорошо.
Глупый такой вопрос, а persistency на языке сложно организовывать?
Вроде того, гоняюсь я по кругу, сохраняю время от времени своё состояние...
Бац! Свет вырубили.
Свет включили --- сделал переход и вперёд, с последнего сохранения.
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

1234554321

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

Ivan8209

А нигде у тебя не записано?
Не запомнил, они в свободном доступе есть?
Дело в том, что с Лиспом я знаком лучше, чем со всеми остальными, и выучить КЛ для меня проще, нежели МЛ и пр.
А в чём засада в Схеме?
Какое отличие мешает иметь сравнимую производительность с КЛ?
Или просто нет таких компиляторов?
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

abrek

поищи в архивах comp.lang.functional
не найдёшь - спрашивай там же, ответят 100пудово и гораздо лучше, чем здесь
нароешь что-нибудь про это persistency - обязательно здесь покажи, очень интересно
я вижу два подхода
1. реализовать сохранение/восстановление состояния как фичу рантайма данного языка. не слышал, чтобы это где-то было реализовано.
2. автоматически преобразовывать "обычную" программу (в том числе и в функциональном стиле, с распространённого языка либо с придуманного для этой цели) в такую, которая будет уметь сохранять и восстанавливать состояние. соответственно нужен будет транслятор и целевой автомат для выполнения результата трансляции (библиотека какая-нибудь, скорее всего)

Ivan8209

> 1. реализовать сохранение/восстановление состояния как фичу рантайма
Проще будет установить orthogonally persistant OS.
Но это другой разговор.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

Chupa

> А что у него с действительными числами?
Есть такие. Native, считаются на FPU.
Ещё есть оптимизированные массивы для хранения чисел (наподобие сишных).

abrek

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

Aleksei66

Ни в коем случае не Хаскель, хоть он и шедевр. Но увы по скорости Call-by-name языки в жопе, по сравнению c call-by-value. Чистая функциональность так просто не дается. Кроме того, в Хаскеле IO связано с монадами - концепцией достаточно сложной для понимания.
SML и OCaml (Caml, вроде, уже давно не поддерживается и на него можно забить) отличаются, как С и С++. В OCaml много дополнительных полезных и не очень фишек, он вроде как быстрее и мне больше нравится.
OCaml компилируется в native код, поэтому скорость у него большая. SML - не помню.

Chupa

> в Хаскеле IO связано с монадами - концепцией достаточно сложной для понимания.
Сёдня весь день это втыкал гыгы
Оказалось, простые вещи сложными словами написаны.
Кста, кто-нить знает, где можно http://research.microsoft.com/~adg/Publications/fpio.html найти?
Functional Programming and Input/Output. Andrew D. Gordon. - дисер мужика, который это придумал.

Aleksei66

Сравнение OCAML vs Others, закончившееся сокрушительной победой первого над всеми остальными, кроме, конечно, С, можно найти у них на сайте. Задачи там были как раз численные.

Aleksei66

Это можно найти в Categories, Triples and Theories. M. Barr, C. Wells. Я пока дочитал до монад охренел и поэтому монады так и не понял

Ivan8209

Ясно.
Пока, вопрос "SML vs. OCaml" решён в пользу последнего, из-за скорости.
А по поводу сравнения с Лиспами ничего не можешь сказать?
Или ещё какие ФЯ есть разумные?
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

Aleksei66

Чего не знаю, того не знаю. Но для численных рассчетов, мне кажется, Lisp мало подходит. Ведь не для этого его придумывали.
Если это не слишком нескромно, то почему ты хочешь писать на ФЯ? Из любви к исскуству?

Ivan8209

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

Ivan8209

Лисп, я знаю, не для расчётов придумывали, но с другой стороны:
а) почему-то он является стандартом минобороны Штатов, причём для СРВ;
б) я знаю, как устроено (lambda ...);
в) я могу менять это (lambda ...) не отрываясь от работы, а прога от этого не пострадает, потому что расчитана не на столько-то параметров у функции F,
а на то, что есть у F есть своё (lambda ... у которого я могу взять cadr.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

Aleksei66

Да уж. Функциональность можно оценить только попробовав, что это такое.

Ivan8209

Хм. Как интересна-а...
http://www.smlnj.org//doc/FAQ/usage.html#saveImage
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
How do I save an SML image?
To save a heap-image of the SML/NJ interactive system, use the function
exportML: string -> bool
which is defined in the SMLofNJ structure. A call such as
exportML "image"
causes a heap image to be saved as image.arch-opsys where arch-opsys designates the architecture and operating system (e.g. image.sparc-solaris). The original call of exportML returns false.
How do I run a saved SML image?
Having created a heap image file, say image.arch-opsys with the exportML function, you can run the image, resuming the interactive loop from the point where exportML was called by executing
sml @SMLload=image.arch-opsys
(where arch-opsys will be a particular architecture, operating system combination like "sparc-solaris" or just
sml @SMLload=image
since sml can figure out the right arch-opsys suffix. Execution will resume at the point where exportML returned, with the return value being true to indicate that we are in the resumed image.
How do I create a stand-alone SML application?
To create a stand-alone application, use the function
exportFn: (string * string * string list) -> OS.Process.status -> unit
which is defined in the SMLofNJ structure. This function also produces a heap image file that must be passed as an @SMLload parameter to sml to be run. If you want to create a simple executable image, see the following question.
How do I create an executable image for an SML/NJ application?
It is possible to combine a heap image with the SML/NJ runtime to create a normal executable file by using Lorenz Huelsbergen's heap2exec utility.
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

abrek

тоже в целом низкоуровневый хак, увы

Ivan8209

А вот в Poly/ML сохраняемость встроена:
http://www.polyml.org/docs/Intro1.html#Intro1
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
1.6 Persistence
Persistence means that values created in one Poly/ML session may be accessed in subsequent Poly/ML sessions without the need to explicitly reload them and without the need for recompilation.
When Poly/ML values are initially created, they are transient (non-persistent). Transient values are stored in the local heap and vanish at the end of the Poly/ML session which created them. By contrast, persistent values are stored in a disk file called a database and are accessible by all future Poly/ML sessions. When a persistent value is used during a Poly/ML session, it is paged into memory using the Unix demand paging mechanism. The function PolyML.commit causes transient values to become persistent, by copying them from the local heap to the database.
If a Poly/ML session attempts to modify a persistent object, the database is not updated directly. Instead, a copy of the modified object is made in the local heap. This means that the modification itself is transient - the current Poly/ML session will use the modified value, but subsequent sessions will see the old value, unless the database is updated using PolyML. commit. Once a modification has been committed, it is permanent; there is no way to revert to the earlier state of the database.
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
Оставить комментарий
Имя или ник:
Комментарий: