"데이터는 멍청한 코드일 뿐이고, 코드는 스마트 데이터일 뿐이다"라는 말은 무슨 뜻인가요?[닫은]

StackOverflow https://stackoverflow.com/questions/871833

  •  22-08-2019
  •  | 
  •  

문제

방금 아이디어가 하나 떠올랐어요 컴퓨터 프로그램의 구조와 해석:

데이터는 멍청한 코드일 뿐이고, 코드는 스마트 데이터일 뿐이다

나는 그것이 무엇을 의미하는지 이해하지 못합니다.누군가 내가 그것을 더 잘 이해하도록 도와줄 수 있습니까?

도움이 되었습니까?

해결책

이것은 SICP의 기본 교훈 중 하나이며 컴퓨터 과학의 가장 강력한 아이디어 중 하나입니다. 다음과 같이 작동합니다.

우리가 "코드"라고 생각하는 것은 실제로 그 자체로 아무것도 할 수있는 힘이 없습니다. 코드는 해석의 맥락에서만 프로그램을 정의합니다. 해당 맥락 이외의 외관은 문자의 흐름 일뿐입니다. (실제로 전기 충동의 흐름 인 비트의 흐름. 그러나 간단하게 유지합시다.) 의미 코드의 코드는 당신이 그것을 실행하는 시스템에 의해 정의되며,이 시스템은 코드를 당신이 원하는 것을 알려주는 데이터로 취급합니다. C 소스 코드는 C 컴파일러에 의해 생성하려는 객체 파일을 설명하는 데이터로 해석됩니다. 객체 파일은 로더에 의해 실행을 위해 대기열을하려는 일부 기계 지침을 설명하는 데이터로 처리됩니다. 기계 지침은 CPU에 의해 겪어야하는 상태 전환 순서를 정의하는 데이터로 해석됩니다.

해석 된 언어에는 종종 데이터를 코드로 처리하기위한 메커니즘이 포함되어 있으므로 코드를 일부 형식으로 함수로 전달한 다음 실행 시간에 코드를 생성 할 수 있습니다.

#!/usr/bin/perl
# Note that the above line explicitly defines the interpretive context for the
# rest of this file.  Without the context of a Perl interpreter, this script
# doesn't do anything.
sub foo {
    my ($expression) = @_;
    # $expression is just a string that happens to be valid Perl

    print "$expression = " . eval("$expression") . "\n";
}

foo("1 + 1 + 2 + 3 + 5 + 8");              # sum of first six Fibonacci numbers
foo(join(' + ', map { $_ * $_ } (1..10))); # sum of first ten squares

체계와 같은 일부 언어에는 "일류 기능"이라는 개념이 있습니다. 즉, 기능을 데이터로 취급하여 실제로 원하는까지 평가하지 않고 전달할 수 있습니다.

상향은 "코드"와 "데이터"사이의 분할이 거의 임의적이며 관점의 함수라는 것입니다. 추상화 수준이 낮을수록 코드는 "더 똑똑한"이어야합니다. 실행 방법에 대한 자세한 정보가 포함되어야합니다. 다른 한편으로, 통역사가 공급하는 정보가 많을수록 코드가 전혀 스마트하지 않은 데이터처럼 보이기 시작할 때까지 코드가 더 멍청 할 수 있습니다.

코드를 작성하는 가장 강력한 방법 중 하나는 필요한 내용에 대한 간단한 설명입니다. 데이터는 해석 적 컨텍스트에서 필요한 것을 얻는 방법을 설명하는 코드로 전환됩니다. 우리는 이것을 부릅니다 "선언적인 프로그래밍".

구체적인 예를 들어 HTML을 고려하십시오. HTML은 Turing-Complete 프로그래밍 언어를 설명하지 않습니다. 그것은 단지 구조화 된 데이터 일뿐입니다. 그 구조에는 해석 적 맥락의 행동을 제어 할 수있는 일부 똑똑한 부분이 포함되어 있지만 많은 똑똑한 것은 아닙니다. 반면, 평균 웹 페이지에 나타나는 텍스트 단락보다 더 똑똑한 것이 포함되어 있습니다.

다른 팁

보안의 맥락에서 : 버퍼 오버 플로우로 인해, 데이터로 생각한 것과 해로운 (이미지와 같은)는 코드로 실행되고 컴퓨터가 P0wn을 실행할 수 있습니다.

소프트웨어 개발의 맥락에서 : 많은 개발자들은 "하드 코딩"을 매우 두려워하고 구성 파일로 변경 해야하는 매개 변수를 추출하는 데 매우 관심이 있습니다. 이는 종종 구성 파일이 단지 "데이터"라는 아이디어를 기반으로하므로 코드의 모든 것을 변경하는 문제 (컴파일, 배포, 테스트)를 제기하지 않고 쉽게 변경할 수 있습니다 (고객이 고객이 쉽게 변경) 할 수 있습니다.

이 개발자들이 깨닫지 못하는 것은이 "데이터"가 프로그램의 동작에 영향을 미치기 때문에 실제로 코드라는 것입니다. 프로그램을 중단 할 수 있으며 그러한 변경 후에 완전한 테스트가 필요하지 않은 유일한 이유는 올바르게 수행하면 구성 가능한 값이 매우 구체적이고 잘 문서화 된 효과가 있고 유효하지 않은 값 또는 파일 구조가 잡히기 때문입니다. 프로그램.

그러나 너무 자주 발생하는 것은 구성 파일 구조가 자체적으로 프로그래밍 언어가되고 제어 흐름과 모든 것이 완성된다는 것입니다. 애플리케이션을 완전히 깨뜨리지 않고 터치 할 수 있습니다.

따라서 Scheme과 같은 언어에서는 코드조차도 일급 데이터로 취급됩니다.다른 코드를 처리하는 것처럼 함수와 람다 식을 처리할 수 있습니다. 즉, 다른 함수와 람다 식에 전달할 수 있습니다.이 내용이 모두 명확해 지므로 계속해서 텍스트를 읽으실 것을 권장합니다.

이것은 컴파일러에 글을 쓰면서 이해해야 할 것입니다.

컴파일러의 일반적인 단계 중 하나는 프로그램을 추상 구문 트리로 변환하는 것입니다. 표현은 종종 [ +, 2, 3]와 같은 나무와 같으며 여기서 +는 뿌리이고 2, 3은 어린이입니다.

LISP 언어는 단순히 이것을 데이터로 취급합니다. 따라서 데이터와 코드 사이에는 AST 나무처럼 보이는 목록이 없습니다.

코드는 확실히 데이터이지만 데이터는 확실히입니다 항상 그런 것은 아닙니다 암호. 기본적인 예를 들어 고객 이름을 작성합시다. 코드와는 아무 관련이 없습니다. 기능의 (필수), a 전문인 (우발적) 응용 프로그램의 측면.

기술적/우발적 인 데이터는 코드이며 기능/필수 데이터가 아니라고 말할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top