Функциональное программирование и решатели уравнений - PullRequest
3 голосов
/ 11 августа 2009

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

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

Полагаю, меня интересует, есть ли другие языки, на которые мне стоит обратить внимание, или любые нефункциональные языки, в которых есть библиотеки или программы, которые пытаются делать похожие вещи, чтобы я мог лучше понять, что Я собираюсь сделать?

Кроме того, есть ли хорошие рекомендации для написания переводчиков и т. Д.?

Спасибо.

P.S. О, и я знаю, что могу и должен использовать Google. Я на стороне. Больше всего я ищу коллектив «вторых мнений» о том, что хорошо, и что люди использовали раньше. Кроме того, я пытаюсь узнать сообщество немного лучше, так как я новичок здесь. Спасибо за ваше терпение: -)

Ответы [ 2 ]

4 голосов
/ 11 августа 2009

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

Я думаю, что есть несколько вопросов в одном:

1) Решатели уравнений.

если вы имеете в виду символическое «решение для неизвестных» - это довольно большая куча работы, с которой вы собираетесь начать, ИМХО :-) Вы собираетесь приступить к созданию системы компьютерной алгебры .

Переписывание терминов - довольно большая тема сама по себе. Если вам особенно интересны манипуляции на этом уровне, возможно, с C будет не так легко работать - вам, вероятно, будет легче с Lisp для этой задачи.

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

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

2) Функциональное программирование в целом.

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

И, конечно, вы можете легко написать функциональный стиль на Ruby и Python. Очень интересно наблюдать, как изучение новых языков в целом меняет ваши шаблоны программирования на «основном» языке. Итак, теория языка или нет - чем больше языков вы касаетесь, тем лучше.

3) Написание переводчиков и т. Д.

Я подозреваю, что с учетом сути вопроса наиболее интересным практическим приложением для того, что вы хотели бы сделать, был бы не интерпретатор, а код оптимизации в компиляторе. Для этого - Книга Дракона и Курс компьютерной инженерии MIT , на мой взгляд, было бы полезно начать с. Тогда вы можете взять, например, копия TCC и игра с ней. Если вы хотите повозиться с чем-то менее традиционным, взгляните на potion - очень интересный языковой эксперимент, в котором в качестве «байт-кода» используется машинный код x86 (следовательно, производительность на машинах x86 довольно впечатляющая). 1037 *

Этот вопрос по SO на самом деле ссылается на большинство ссылок из (3) выше и еще несколько.

2 голосов
/ 11 августа 2009

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

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

Я догадываюсь, что ваш вопрос о переводчиках заключается в том, как прыгнуть из пистолета, и это вытекает из Десятого правила Гринспуна , которое

Любая достаточно сложная программа на C или Fortran содержит специальную, неофициально заданную, подверженную ошибкам, медленную реализацию половины Common Lisp.

где вы можете заменить «Common Lisp» на «функциональный язык программирования».

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

Мой личный фаворит среди функциональных языков - Haskell. Для новичков у Haskell есть преимущество, позволяющее вам признать - через статическую типизацию - когда вы все еще настоятельно программируете.

...