Подтвердить что ты не робот

Что означает "чистое" в контексте языков программирования и парадигм?

Другими словами, что делает язык чистым?

Например, Smalltalk считается чисто объектно-ориентированным языком. Haskell и Lisp, как известно, являются чисто функциональными языками.

Когда мы говорим "чистый", означает ли это, что они не способны к другим парадигмам программирования (что далеко от истины), или это означает, что они были предназначены для использования в этой "чисто" X-парадигме?

4b9b3361

Ответ 1

Слово pure имеет разные значения в разных контекстах.

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

Когда люди говорят о том, что Haskell является чистым языком, они означают, что он имеет ссылочную прозрачность. То есть вы можете заменить любое выражение его значением без изменения значения программы. Например, в Haskell:

square :: Int -> Int
square x = x * x

main = print (square 4)

выражение square 4 может быть заменено его значением (16) без изменения значения программы. С другой стороны, в этом Java-коде:

public int square(int x) {
    System.out.println("Done!");
    return (x*x);
}

public static void main(String [] args) {
   System.out.println(square(4));
}

вы не можете заменить square(4) своим значением (16), потому что это изменит значение программы - оно больше не будет печатать Done! в stdout. В Haskell невозможно, чтобы функции имели побочные эффекты, такие как печать на stdout или изменение мест памяти, поэтому применяется ссылочная прозрачность.

Обратите внимание, что с этим значением pure, Lisp не является чистым функциональным языком, так как его функции могут иметь побочные эффекты (если вы хотите получить придирчивость, Haskell не является чистым функциональным языком из-за существования unsafePerformIO, но всем известно, что вы отправлены в один из самых ожесточенных кругов ада, если вы когда-либо используете эту функцию).

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

Примеры чисто функциональных языков включают Haskell, Clean и Miranda. Примеры нечистых функциональных языков включают OCaml, F # и Scheme.

Объектно-ориентированное программирование

Когда люди говорят о Smalltalk или Ruby, являющемся чистым объектно-ориентированным языком, они означают, что нет никакого различия между объектами и примитивными значениями. В Smalltalk и Ruby значения, такие как целые числа, булевы и символы, также являются объектами, в том смысле, что они могут получать сообщения (Smalltalk) или иметь методы (Ruby). Например, вы можете сделать

1.to_s

в Ruby, то есть вызовите метод integer 1, который преобразует его в строку. Сравните это с "нечистым" языком OO, например Java, в котором есть объекты (которые являются экземплярами классов, могут иметь методы и т.д.) И примитивными значениями (например, int, double, bool), что может У меня есть методы).

Когда язык OO чист, люди часто говорят, что "все является объектом", что не является строго истинным (например, оператор if не является объектом), но верно, что "каждое значение является объектом".

Примеры чистых объектно-ориентированных языков включают Ruby и Smalltalk. Примеры нечистых объектно-ориентированных языков включают Java и С++.

Ответ 2

Слово "чистый" в функциональном языке возможно "без гражданства", выход не зависит от состояний.

Для императивных языков вы назначаете x: = 0, но вы можете переназначить значение переменной x позже. Значение x зависит от текущего состояния.

Но для чистых функциональных языков, если f (x) = 1, то результат всегда будет равен 1.