LINUX.ORG.RU

Как оптимизировали программу на Ocaml

 , , ,


2

0

По ссылке приведены примеры программ с соревнований на ICFPC'09 (кстати, самим по себе интересными тем, что участники соревновались в управлении космическими аппаратами) которые демонстрируют как оптимизационные возможности, свойственные функциональным языкам (в частности хвостовая рекурсия), позволяют написанной на нём программе-интерпретатору некоего языка управления двигателем космического аппарата обогнать по скорости работы аналогичную на C/C++.

>>> Подробности

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

> FM, которые я R, говорят, что gcc умеет оптимизировать хвостовые вызовы с существенными ограничения.

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

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

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

>> выведение типов зло, и везде где только можно его стоит пресекать

> нужен только local type inference и его вариации

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

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

> FM, которые я R, говорят, что gcc умеет оптимизировать хвостовые вызовы с существенными ограничения.

Ну вот, сам признался.

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

Повторяю это не реализация, это проект. Разжёвываю. Реализовать можно зарегистрированный стандарт. До этого всё является проектом(draft). Де-юре. Де-факто оно может и круто, но в конце можно обламаться.

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

> Не понимаю необходимости такого средства и вопрошаю умудрённых.

Пример: мы представим конечный автомат в виде класса, функции перехода в виде функций. Допустим, нас интересует только конечное состояние. Тогда нужна эта фича компилятора (sibling call optimization).

Почему конечный автомат в виде класса, а не кучи goto-шек? потому, что наследование дает другой автомат, а с goto-шками не прокатит.

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

> е мое, не имеет значение язык

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

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

> Повторяю это не реализация, это проект. Разжёвываю. Реализовать можно зарегистрированный стандарт. До этого всё является проектом(draft). Де-юре. Де-факто оно может и круто, но в конце можно обламаться.

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

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

>потому, что наследование дает другой автомат, а с goto-шками не прокатит.

Если добавить к нему ещё одно возможное состояние при наследовании, то даже при незначительных отличиях наследованных функций перехода, те из них, которые должны теперь учитывать ещё один вариант, надо будет писать заново?

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

>нет ничего читабельнее грамотно оформленных и откомментаренных интерфейсов и фабрик :)

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

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

>ЛОЛ, типа нельзя было прочитать по другому, читайте про auto - и дрожите от ненависти

о, да тут круче чем в цирке!

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

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


а... ты тот самый, который две недели решал баг с неправильными ключами сборки, все-никак не простишь, что я с тебя простебался? :)

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

>ты тот самый, который две недели решал баг с неправильными ключами сборки, все-никак не простишь, что я с тебя простебался? :)

ну хоть память у тебя хорошая :) жаль, остальной частью мозга обидели

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

> ну хоть память у тебя хорошая :) жаль, остальной частью мозга обидели

да - память хорошая и думаю быстро ;)

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

>две недели... ОМГ, ну тоооормоооз

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

нет, ну это же невероятно прекрасно. браво! бис!

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

> вот ты злишься, а я например пришёл выразить искреннюю благодарность - ты породил прекрасный, благодатный и показательный топик. растащу на цитаты
> нет, ну это же невероятно прекрасно. браво! бис!


(раскланиваюсь)

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

Надеюсь, Вы не пропустили мимо глаз слово "конкретный" ;)

Вот один из конкретных аналогов:
int f(int x){return x + 1;}
int g(int x){return x * 2;}

int concrete_composition(int z){return f(g(z));}

Но выйдет ли сделать то же самое, что и на ocaml-е ?

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

если через пару часов/дней/недель надумаешь - создавай отдельный топик, не факт, что я потом найду( буду искать ) твой ответ здесь

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

> слабо посоревноваться в написании тестовой задачи, чтоб определить кто лучше программирует? ;)

Я пытался замерить твоё ЧСВ стандартным измерителем, купленным в магазине, но он перед тем, как пустить дым и издохнуть, что-то написал про деление на нуль...

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

> Я пытался замерить твоё ЧСВ стандартным измерителем, купленным в магазине, но он перед тем, как пустить дым и издохнуть, что-то написал про деление на нуль...

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

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

> Надеюсь, Вы не пропустили мимо глаз слово "конкретный" ;)

Не пропустил, но у слова "конкретный" много значений.

>Вот один из конкретных аналогов:

> int f(int x){return x + 1;}

> int g(int x){return x * 2;}

> int concrete_composition(int z){return f(g(z));}

Это не аналог, даже со скидкой на "конкретность". "Конкретный" аналог должен принимать указатели на функции как аргументы, но "конкретность" делает пример банальным.

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

> Я пытался замерить твоё ЧСВ стандартным измерителем, купленным в магазине, но он перед тем, как пустить дым и издохнуть, что-то написал про деление на нуль...

Ах, да... Прочитал в инструкции, что клоунов им замерять категорически воспрещается.

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

> Ах, да... Прочитал в инструкции, что клоунов им замерять категорически воспрещается.

а вот вы все серьезно воспринимаете, зря - это про ваше ЧСВ говорит, а не мое

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

>ну давай, дууумааай....

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

предлагаю слегка изменить условия (горький опыт предметного спора на ЛОРе) - каждый сформулирует по задачке, и каждый предоставит два решения; ну да я надеюсь, что ты не сачковал курс теории игр :)

если согласен - давай задачку

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

> предлагаю слегка изменить условия (горький опыт предметного спора на ЛОРе) - каждый сформулирует по задачке, и каждый предоставит два решения; ну да я надеюсь, что ты не сачковал курс теории игр :)

предлагаю одну задачу на выбор ЛОР'ев - две задачи дольше решать

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

> что ж ты такой дёрганный-то, ну? :)

на себя посмотри ;)

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

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

Задача: есть орбитальный комплекс, собирающий данные. К сожалению, в известной специалистам функции закралась очепятка, необратимо искажающая данные. Нужно обновить код дефектной функции, не прерывая работы всего комплекса. Комплекс доступен по tcp/ip.

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

сейчас топик создам с предложением написать задание

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

Сорри за словесную неточность :)
"Но выйдет ли сделать то же самое, что и на ocaml-е ?"
читать как
"Но выйдет ли сделать абсолютно то же самое, что и на ocaml-е ?"

ps ...и какими силами?

impfp
()

А самыми быстрыми были не реализации машин, а интерпретаторы команд этой виртуальной машины в байткод...

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

Если бы результаты выполнения compose / concrete_composition для указанных функций были бы различными, то, может, аналог и должен был бы.:)

Однако, реализовать именно полный аналог кода вида:
let compose f g = function x -> f(g(x));;

что нам можно было бы сделать в Си? Что-то вроде:
void* compose(void* (*f)(void*), void* (*g)(void*), void* x)
{
return f(g(x));
}
императивное. Но вычислит то что надо; или даже как-нить пострашнее:
void* (*)(void*) compose(void* (*f)(void* (*)(void*)), void* (*g)(void*))
{
return f(g); /*а вообще эта скомпилируется?*/
}

Чего-то в Си по сранению даже с окамлом определенно не хватает :)

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

>Задача: есть орбитальный комплекс, собирающий данные. К сожалению, в известной специалистам функции закралась очепятка, необратимо искажающая данные. Нужно обновить код дефектной функции, не прерывая работы всего комплекса. Комплекс доступен по tcp/ip.

Хм. Вполне стандартная фича лиспа. Исторический пример: http://www.flownet.com/gat/jpl-lisp.html >The Remote Agent software, running on a custom port of Harlequin Common Lisp, flew aboard Deep Space 1 (DS1), the first mission of NASA's New Millennium program. Remote Agent controlled DS1 for two days in May of 1999. During that time we were able to debug and fix a race condition that had not shown up during ground testing. (Debugging a program running on a $100M piece of hardware that is 100 million miles away is an interesting experience. Having a read-eval-print loop running on the spacecraft proved invaluable in finding and fixing the problem. The story of the Remote Agent bug is an interesting one in and of itself.)

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

> Чего-то в Си по сранению даже с окамлом определенно не хватает :)

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

Комбинаций f(...(f(x))...) бесконечно много, соответственно compose должна выдавать бесконечно много адресов функций, а у тебя в сишной программе функций, от которых можно взять адрес, только конечное число :-)

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

> Нужно обновить код дефектной функции, не прерывая работы всего комплекса. Комплекс доступен по tcp/ip.

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

------------

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

Ну и радостно утверждать, что OCaml или Lisp могут полностью заменить C++ довольно глупо. В ряде задач - да, в ряде - нет. Но это очевидная банальность.

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

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

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

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

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

Извиняюсь за серость - это наверху, на спутниках работает?

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

> Извиняюсь за серость - это наверху, на спутниках работает?

Не знаю. Вряд ли.

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

> Нужно обновить код дефектной функции, не прерывая работы всего комплекса. Комплекс доступен по tcp/ip.

Банальщина какая.

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

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