Ralph William Gosper, Jr 의 인용문 은 다음과 같습니다.
데이터 구조는 바보 같은 프로그래밍 언어입니다.
그는 이것으로 무엇을 의미 했습니까? 아아, 내가 구글에서 찾을 수있는 것은 문맥없이 끊임없는 견적 자체의 사본 / 붙여 넣기입니다.
Ralph William Gosper, Jr 의 인용문 은 다음과 같습니다.
데이터 구조는 바보 같은 프로그래밍 언어입니다.
그는 이것으로 무엇을 의미 했습니까? 아아, 내가 구글에서 찾을 수있는 것은 문맥없이 끊임없는 견적 자체의 사본 / 붙여 넣기입니다.
답변:
글의 핵심은 다음과 같습니다.
데이터 구조는 단지 ... 프로그래밍 언어
당신이 그것에 대해 생각한다면 이것은 사실입니다. 결국, 컴파일러는 항상이 전이성에 의존합니다. 프로그래밍 언어를 사용하여 데이터 구조로 변환하고 해당 데이터를 일부 변환 한 다음 결과를 다른 프로그래밍 언어로 바꿉니다.
사실, 원한다면 C 데이터 구조와 같은 무언가를 미치게 만들 수도 있습니다. 예를 들어 다양한 메서드를 호출하여 C 코드를 작성할 수 있습니다.
var C = new HorribleCObject (); C. 함수 <int> ( "main", typeof (char [] []), typeof (int)) . 가변 ( "i", typeof (int), 0) . ( "i", Func (i) => i <10)) 동안 .Call ( "printf", "% d", "i") .PostIncrement ( "i") .EndWhile (); 반품 (0) .EndFunction ();
이제 전체 인용문에 관해서 : 왜 C와 같은 글을 쓰는 것과 비교할 때 왜 그런 말이 바보일까요? 이것은 장황하고 C에서와 거의 비슷하지 않으며 (실제로 C가 할 수있는 모든 범위를 지원하지 않을 수도 있습니다-typedefs는 까다로울 것입니다); 따라서이 데이터 구조는 "실제"프로그래밍 언어에 포함 된 "멍청한"프로그래밍 언어 일뿐입니다. 동일한 논리를 생각할 수있는 모든 데이터 구조에 일반화 할 수 있습니다. 링크 된리스트는 Lisp의 "stupid"버전이며, hash map은 이론적 인 Hash Programming Language (Hasp?)의 "stupid"버전입니다.
그러나 해시 맵과 상호 작용하기 위해 항상 Hasp를 작성하고 싶지는 않습니다. 그것은 모든 문제의 도메인 특정 언어가 이 - 한 손에 잘 구현 DSL은 기본 모델이 할 수있는 모든 것을 표현하는 강력한 충분히이다; 반면에, 먼저 DSL을 구현 한 다음 다른 사람들이이를 배우어야합니다. 그들이 보내고 싶지 않은 시간과 노력이 필요합니다. 결국, 나는 해시 맵에 물건을 넣고 다른 것들이 있는지 확인하고 싶습니다. 해시 지향 프로그래밍의 모든 복잡한 점을 배우고 싶지 않습니다.
따라서 우리는 그것에 대해 전혀 생각하지 않고 이론적으로 매우 구체적이고 매우 똑똑한 프로그래밍 언어를 취하여 데이터 구조에 구현 된 몇 가지 어리석은 조작으로 분류합니다. 연결된 목록에는 간단한 방법 모음이 하나 있습니다. 해시 맵에는 다른 것들이 있습니다. 데이터 구조에 대해 잠재적으로 수행 할 수있는 더 강력한 다른 작업은 무시합니다 (예를 들어 대부분의 LinkedList 구현에는 .Map 또는 .ForEach 함수가 없으며 Hasp에서 수행 할 작업을 상상조차 할 수 없습니다). 부모 프로그래밍 언어로 명시 적으로 구현하는 것을 선호합니다. 대부분의 프로그래머가 익숙 할 것입니다.
데이터 구조는 본질적으로 개념적으로 나타내는 문제 공간으로 부모 언어의 어리석은 확장입니다. 충분히 똑똑한 확장에는 새로운 특정 프로그래밍 언어가 필요하며 대부분의 사람들은 그것을 배우기를 원하지 않을 것입니다.
데이터 구조는 프로그래밍 언어의 표현입니다. 그러나 특히 "날카로운"것은 아닙니다.
이것은 아래 위키 기사의 "노드 다이어그램"에서 볼 수 있습니다.
http://en.wikipedia.org/wiki/Root_node#Terminology
그럼에도 불구하고, 데이터 구조는 프로그래머에게 이해하기 어려운 구문과 완전한 생각이 없기 때문에 프로그래밍 언어로서 완전하지 않습니다. 데이터 구조의 "언어"는 "Me, cold. Get coat"와 같은 말을 한 아이와 비교할 수 있습니다.
"언어"는 깨져 있지만 이해할 수 있습니다. 아이는 "차가워서 더 많은 옷을 덮고 싶어한다"고 말합니다. 아이의 발화는 영어의 "멍청한"버전이며, 마찬가지로 프로그래밍 언어와 관련된 데이터 구조입니다.
Bill Gosper가 의도 한 것은 모든 데이터 구조가 적용 가능성이 제한된 프로그래밍 구조 일 뿐이라고 생각합니다 . 이것은 "언어 디자인은 도서관 디자인이고 도서관 디자인은 언어 디자인" 이라는 생각과도 관련이있다 [1].
이 문제에 대해 생각하는 한 가지 방법은 데이터 구조를 단지 알고리즘 기반으로 고려하는 것입니다. 스토리지 요구 사항이나 유형 주석은 단순히 부수적이므로 잊어 버리십시오.
예를 들어, map
두 가지 방법으로 연관 배열 ( 일부 언어에서 a라고 함)을 코드화 할 수 있습니다.
Haskell에서는 연관 배열을 데이터 구조로 체계화 할 수 있습니다 ...
let assocArray = [("a", 1),("b", 2),("c", 3)]
let key = "b"
lookup key assocArray
... 또는 케이스 표현식을 사용하여 ...
let key = "b"
case key of
"a" -> 1
"b" -> 2
"c" -> 3
... 또는 더 직접적으로 ...
let key = "b"
if key == "a"
then 1
else if key == "b"
then 2
else if key == "c"
then 3
else undefined
람다 미적분학을 보면 데이터 구조와 코드 사이의 이러한 미러링이 가능하다는 것을 쉽게 알 수 있습니다. 모든 값은 람다 미적분의 함수로 나타낼 수 있으며 미적분 자체는 보편적입니다 (투어링 완료).
[1] Bjarne Stroustrup에게 감사의 말을 전합니다.
모든 데이터가 코드 인 Javascript를 고려하십시오. 모든 데이터는 코드이고 모든 코드는 데이터 인 LISP를 고려하십시오.
처음부터 끝까지 그리고 그 사이의 모든 곳에서 데이터는 단지 비트입니다. 텍스트와 기호로 비트를 로그온하여 사람이 쉽게 읽을 수 있고 사람이 변형 할 수 있도록하는 것은 a) 정의 언어를 배우고 b) 추상화의 누출을 배우는 추상화 계층입니다.
예를 들어 C #에서 구조체와 클래스의 차이점을 배우려면 값 형식과 참조 형식의 동등 비교 차이를 알아야합니다. 모든 데이터 온톨로지에는 배우고 준수해야하는 고유 한 규칙 세트가 필요합니다. 다른 언어와 마찬가지로 일반적인 아이디어에 빠르게 접근 할 수 있지만 문제의 실제 진실에 더 가까이 다가 가려면 이진을 직접 살펴보아야합니다.
마지막으로, B- 트리 또는 유사한 데이터 구조를 고려할 때 트리의 구조를 탐색하고 트리에서 다른 종류의 작업을 수행하려면 트리, 구조 또는 언어간에 반드시 전송할 수있는 특수한 종류의 구문이 필요합니다.