Детали реализации декларативных языков, по сути обязательных

Я читаю 'Функциональное программирование' Tomas Petricek & Jon Skeet, и я понимаю различие между декларативным и императивным программированием.

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

Удачи

AWC

5
задан Vivin Paliath 8 February 2010 в 21:16
поделиться

4 ответа

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

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

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

Как интересный исторический момент, LISP был полностью теоретической конструкцией; это была математическая нотация компьютерных языков. Это оставалось теоретическим до тех пор, пока функция LISP eval не была реализована в машинном коде Стивом Расселом на IBM 704:

Согласно сообщениям Пола Грэма в Hackers & Painters, p. 185, Маккарти сказал: «Стив Рассел сказал, послушайте, почему бы мне не запрограммировать этот eval ..., и я сказал ему, хо-хо, вы путаете теорию с практикой , это eval предназначен для чтения, а не для вычислений . Но он пошел дальше и сделал это. То есть он скомпилировал eval в моей статье в машинный код IBM 704, исправив ошибку, а затем объявил это как интерпретатор Лиспа. , что, безусловно, было. Итак, на тот момент Лисп имел, по сути, ту форму, которую он имеет сегодня ..." (выделено мной)

Итак, еще раз, тонкости между теорией и практикой. :)

6
ответ дан 18 December 2019 в 14:45
поделиться

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

Как ни странно, большинство императивных языков проходят фазу, когда весь код преобразуется в более декларативный:

Вот пример компиляции схемы (функциональной) непосредственно в код C (обязательно) :

3
ответ дан 18 December 2019 в 14:45
поделиться

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

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

2
ответ дан 18 December 2019 в 14:45
поделиться

Построены ли декларативные языки из императивных операторов и функций?

Иногда. Это свойство реализации , а не языка .

В 1980-х годах многие компилировали функциональные программы на графы, затем переписывали графы на более простые. Эти вычисления обычно включали в себя обновление графов на месте, но в остальном это было примерно так, как вам хотелось бы. Чтобы узнать больше, посмотрите "Уменьшение графов" или прочитайте "Четырехтактный механизм уменьшения" Криса Клака и Саймона Пейтона Джонса.

В конце концов, авторы компиляторов придумали способы получить более высокую производительность, компилируя функциональные программы непосредственно в исходный машинный код. Если нативная машина является типичной товарной машиной, то это означает типичные императивные операции. Однако, если взглянуть на новаторскую работу профессора Арвинда в MIT, его группа спроектировала и построила машины потока данных , где фундаментальные вычислительные операции носят более декларативный характер. Это была отличная работа, но все специализированные архитектуры, которые процветали в 1980-х годах, были выведены из строя благодаря великому виртуозному циклу Microsoft/Intel (больше программного обеспечения -> больше компьютеров продается -> дешевле процессоров -> больше нетбуков продается -> ... -> $300, которые делают действительно классные вещи).

2
ответ дан 18 December 2019 в 14:45
поделиться