데이터 구조를 언어로 통합해야합니까 (파이썬 에서처럼) 표준 라이브러리에서 제공해야합니까 (Java에서와 같이)?


21

파이썬과 대부분의 다른 프로그래밍 언어에서 일반적인 데이터 구조는 고유 한 전용 구문 을 사용하여 핵심 언어 의 통합 부분으로 찾을 수 있습니다 . LISP의 통합 목록 구문을 제쳐두면 배열 위에 어떤 종류의 데이터 구조를 구문의 통합 부분으로 제공하는 다른 언어를 생각할 수는 없지만 모든 언어 (그러나 C는 추측합니다) 표준 라이브러리에 제공하는 것 같습니다.

언어 설계 관점에서 핵심 언어의 데이터 구조에 대한 특정 구문을 갖는 것에 대한 귀하의 의견은 무엇입니까? 좋은 생각입니까, 언어 등의 목적이 이것이 얼마나 좋은지를 바꾸는가?

편집 : 내가 의미하는 데이터 구조에 대해 약간의 혼동을 일으킨 것에 대해 유감스럽게 생각합니다. 나는 기본적이고 일반적으로 사용되는 것들에 대해 이야기하지만 여전히 가장 기본적인 것들에 대해서는 이야기하지 않습니다. 이것은 트리 (너무 복잡하고 드문 경우), 스택 (너무 드물게 사용됨), 배열 (너무 단순함)은 제외하지만 세트, 목록 및 해시 맵을 포함합니다.


1
객체와 해시 맵을 제외하고 있습니까?
Orbling

3
@Anto : 많은 언어가 연관 배열, Perl, PHP, JS (기술적으로 여기에있는 객체) 등의
해시 맵을 가지고 있습니다

1
아마도 배열, 목록, 해시 맵 / 연관 배열을 제외하고 생각하고있는 데이터 구조에 대해 더 구체적 일 수 있습니까?
FrustratedWithFormsDesigner

1
"복잡한 데이터 구조"처럼 해시 맵, 목록 및 고급 기능을 포함하고 너무 간단한 배열을 버리십시오.
Anto

1
보다 합리적인 제목은 "언어에 어떤 데이터 구조가 포함되어야하고 라이브러리에 무엇이 포함되어야 하는가"라고 생각합니다. 의미있는 대답은 언어에 따라 크게 달라집니다. 라이브러리가 언어에 더 깨끗하게 통합 될수록 구조를 라이브러리로 옮기는 것이 더 합리적입니다.
Jerry Coffin

답변:


13

언어가 무엇인지에 달려 있습니다.

몇 가지 예 (다른 답변에서 도난당한 것) :

  • Perl은 해시 테이블, 배열, 문자열을위한 특별한 구문을 가지고 있습니다. Perl은 종종 스크립팅에 사용되며, 스크립팅에 유용합니다.
  • Matlab에는 목록, 행렬, 구조에 대한 특별한 구문이 있습니다. Matlab은 엔지니어링을위한 행렬 및 벡터 수학을 수행하는 데 사용됩니다.
  • Java / .NET은 문자열 및 배열을 지원합니다. 이것들은 배열과 문자열이 자주 사용되는 범용 언어입니다 (새로운 컬렉션 클래스를 사용하면 그 이하)
  • C / C ++는 배열을 지원합니다. 이들은 하드웨어를 숨기지 않는 언어입니다. 문자열이 부분적으로 지원됩니다 (연결 없음, strcpy 사용 등).

언어의 목적 / 정신 / 청중이 무엇인지에 달려 있다고 생각합니다. 하드웨어에서 얼마나 추상적이며 얼마나 멀리 떨어져 있는지 일반적으로리스트를 기본 요소로 지원하는 언어를 사용하면 무한히 긴리스트를 작성할 수 있습니다. C / C ++와 같은 저수준은 이러한 언어를 가지지 않을 것입니다. 왜냐하면 그것은 언어의 목표가 아니기 때문입니다.

저에게 가비지 수집은 동일한 논리를 따릅니다. 언어 청중은 메모리가 할당되거나 해제되는 시점과시기를 정확히 아는가? 그렇다면 malloc / free; 그렇지 않으면 가비지 콜렉션입니다.


6
C ++에서 고급 템플릿 유형이 존재하는 것이 두 언어 의 주요 차이점 이기 때문에 "C / C ++"라는 용어를 사용하는 것은 좋지 않습니다 .
dan04

가비지 콜렉션은 결정 론적 방식으로 수행 할 수 있습니다. 선형 유형 (또는 가난한 사람의 대체 : RAII) 만 있으면됩니다.
pyon

당신이 결정 시점에서 가비지 컬렉션을 호출 할 수 있지만 EduardoLeón @, 나는 그것이 (그 같은 이유로 결정적 동안 실행 얼마나 오래 생각하지 않는다 mallocnewC / C ++에서 비 결정적이다).
earlNameless

@earlNameless : 리소스 사용과 관련하여 결정적입니다. 선형 유형 (또는 유사한 고유 유형)은 자원을 해제하지 않도록 유형 오류 (따라서 컴파일 오류)로 만듭니다 (모듈로 캡처되지 않은 가능성) 시스템이 비정상적으로 종료 된 경우) 또는 폐기 한 후 사용하십시오.
pyon

5

펄 HashMaps을하고 PL / SQL 지원 기록을 가지고 있으며, 나는이 일에 대해 잘못 될 수 있고이 될 수 있지만 나는 모든 다른 차원의 지원 벡터와 행렬 (에 구문을 가진 MATLAB의 매우 안개 기억을 가지고 이러한 데이터 것을 주장 유형 되지 않은 데이터가 structures ) ... 매우 일반적인 구조를 기본적으로 지원하는 것이 좋습니다. 일반적으로 배열과 해시 맵 / 연관 배열은 가장 일반적으로 지원되는 구조이며 아마도 가장 일반적으로 사용되는 것으로 보입니다.

바이너리 트리와 같은 다른 구조에 대해 기본 구문 지원을 추가하는 경우 해당 구조는 언어의 지원 도구 (컴파일러 / 런타임 등)에 의해 구현 된 것임을 잊지 마십시오. 몇 개의 구조를 지원하고 싶습니까?

덜 일반적으로 지원되는 구조에 대한 새로운 표기법을 개발해야합니다 ... Keep It Simple !.


예를 들어 나무를위한 리터럴 구문을 만들 필요가 없습니다. 드문 경우이지만, 많은 언어의 표준 언어조차도 없습니다! 같은 주장으로, "덜 일반적으로 사용되는 작업에 대해 새로운 표기법을 개발해야하기 때문에"연산자 포함에 반대 할 수 있습니다.

@delnan : 새로운 언어를 디자인하고 배열 이외의 데이터 구조 가 기본적으로 새로운 구문에 의해 지원되어야 하는지 아닌지 또는 라이브러리를 포함하여 지원되어야 하는지 궁금한 관점에서 이해했습니다 .
FrustratedWithFormsDesigner

첫 번째 문장은 "공통 데이터 구조"에 대해 명시 적으로 언급하고 있으므로 OP는 발명 된 모든 모호한 데이터 구조에 대해 특별한 구문을 추가하기에 충분 하지 않다고 가정 합니다.

@delnan : ... 그리고 OP는 LISP 목록과 배열을 배제하려고합니다 (일반적으로) "... LISP의 통합 목록 구문을 제쳐두고, 어떤 종류의 언어를 제공하는지 알고있는 다른 언어는 생각할 수 없습니다 "구문의 통합 된 부분으로 배열 위의 데이터 구조 "... ... 그래서 배열 / 목록보다 더 이국적인 데이터 구조를 숙고하고 있다고 생각했습니다 ...
FrustratedWithFormsDesigner

예 ( "배열 위"를 "다른 공통 데이터 구조"로 해석), "우리가 가진 모든 단일 데이터 구조에 대한 리터럴을 만들자"라는 질문에 대한 힌트는 없습니다. 이것이 합리적인 것으로 제한되어야한다고 언급하는 것이 좋지만이 가정 때문에 "나쁜 생각"이라고 말할 수는 없다고 생각 합니다.

5

여기서 가장 좋아하는 예는 Lua 입니다. Lua에는 내장 된 데이터 유형 인 " 테이블 "이 하나 뿐이지 만 유연성과 속도는 일반 배열, 링크 된 목록, 대기열, 맵 대신 실제로 사용하며 Lua의 객체 지향 기능의 기초이기도합니다. (예 : 수업).

루아 (Lua)는 놀랍도록 간단한 언어이지만 테이블 데이터 구조의 유연성으로 인해 매우 강력합니다.


2
JavaScript 객체는 실제로 같은 방식입니다. 예를 들어 배열은 숫자 속성과 길이를 가진 객체 일뿐입니다.
Tikhon Jelvis

1
루아 테이블은 자바 스크립트 객체와 다릅니다. 자바 스크립트 {}는 그렇지 않습니다 []. 루아 {}에서는 둘 다 가지고 있습니다. 루아 테이블은 Lisp의 목록과 비교하는 것이 좋습니다.
Jakob

JavaScript에서는 배열을 포함하여 "모든 것이 객체입니다"라고 생각하지만 모든 것이 배열 인 것은 아닙니다. 루아에서는 모든 것이 테이블입니다.
Dean Harding

3

모든 고급 데이터 유형에 대해 전용 구문을 사용할 필요는 없습니다 . 예를 들어 set([1, 2, 3])(Python 2.x와 마찬가지로) 대신을 사용할 수 {1, 2, 3}있습니다.

중요한 것은하는 것입니다 몇 가지 높은 수준의 데이터 구조를 구성하는 편리한 방법을. 피하고 싶은 것은 다음과 같은 코드입니다.

s = set()
s.add(1)
s.add(2)
s.add(3)

이는 내가 사용할 때 크게 날 귀찮게 std::vector, std::setstd::mapC ++로. 고맙게도 새로운 표준은 다음과 같습니다 std::initializer_list.


3

내 의견으로는, 그것은주의 깊게 수행되는 경우, 즉 잘 알려진 리터럴이있는 튜플, 목록,지도 및 세트에 대해 적어도 놀랍게도 자주 쓸 수있는 놀랍도록 간단한 추가입니다.

  • 언어를 추가하는 것이 저렴합니다. 귀중한 복잡성 예산의 많은 비용이 들지 않습니다.
    • 선택적인 후행 쉼표와 같은 것을 원하면 문법은 기본적으로 someBracket {expr ','} someBracket또는 someBracket {expr ':' expr ','} someBracket입니다. 부동 소수점 리터럴은 쉽게 문법에 이상이 될 수 있습니다.
    • 많은 언어에서 인기있는 리터럴 중 어느 것도 기존 구문과 충돌하지 않습니다 (내가 생각할 수있는 예외는 중괄호와 같은 블록을 표현식으로 사용하고 쉼표 연산자로 세미콜론을 사용하지 않는 언어입니다 {1, 2})
    • 시맨틱 미만 다섯 개 문장으로 정의 할 수 있습니다, 비공식 버전 인 "인스턴스화 새로운 $ 수집, 다음 전화 .add/ .append/ .setItem그 (것) 식 (들) 인수로와 주어진 식을 한 번씩".
  • 이전 세 번째 요점으로 인해 구현하기도 매우 쉽습니다.
  • 필요할 때 매우 유용하며 다른 요소의 구문에 영향을 미치지 않아야합니다. 즉, 사용하지 않을 때 "지불"하지 않습니다.

3

Clojure는 lisp이지만 지원합니다

Lists: (x1 x2)
Vectors: [x1 x2]
Maps: {k1 v1 k2 v2}
Sets: #{x1 x2}

2

언어 자체의 데이터 구조가 많을수록 언어를 배우기가 더 어려워집니다. 개인적인 취향 일 수도 있지만 더 간단한 언어를 선호하는 경향이 있으며 라이브러리에서 추가 기능을 제공 할 수 있습니다.

특정 필드 용으로 설계된 언어는 Matlab과 같은 언어에 특정 데이터 구조가 내장되어있는 경우가 있습니다. 그러나 너무 많은 사람들이 당신을 압도 할 수 있습니다.


2

언어가 실제로 유용하려면 어느 정도의 작업을 수행해야합니다. 실제 일상 프로그래밍에는 일반적인 수준에서 문제를 해결하는 도구가 필요하기 때문입니다. 미니멀리즘은 작고 멋지게 보이지만 크고 반복되는 문제를 해결하기 위해 사용을 시작하려면 그 위에 구축 할 수있는 추상화 수준이 필요합니다.

따라서 프로그래밍 언어는 가장 일반적으로 사용되는 데이터 구조에 대한 지원을 언어가 설계된 작업에 대한 구문으로 제공해야한다고 생각합니다.


2

일반적으로 목록, 집합 등에 리터럴을 사용하는 것이 편리합니다. 그러나 때로는 파이썬 목록이나 자바 스크립트 배열의 실제 구현에 대해 아무것도 모르는 경우가 있습니다. 내가 확신 할 수있는 것은 주어진 인터페이스를 노출한다는 것입니다.

나는 언어 표현력의 벤치 마크로 자신의 데이터 구조를 라이브러리로 얼마나 잘 작성할 수 있으며, 그것을 사용하는 것이 얼마나 편리한 지에 대해 설명합니다.

예를 들어 Scala는 구현 및 성능이 다른 다양한 컬렉션을 제공합니다. 그것들은 모두 스칼라 자체에서 구현되며, 그것들을 사용하는 구문은 내장되어 있고 런타임을 지원하는 경우보다 약간 더 복잡합니다.

적어도 관리되는 언어로 런타임 자체에서 실제로 지원이 필요한 유일한 기본 구조는 배열입니다. 메모리를 관리하지 않으면 인접한 바이트를 얻는 데 어려움을 겪을 수 있습니다. 다른 모든 구조는 배열과 포인터 (또는 참조)로 만들 수 있습니다.


1

APL (및 관련 현대 변형, A +, J 및 K)은 일류 데이터 구조로 스칼라, 벡터 및 행렬을 갖습니다.

예, 배열의 변형으로 더 이상 사용되지 않을 수 있습니다. 그러나 또한 복잡한 선언이 없으며 별도의 라이브러리에서 제공되지 않으며 언어의 최고급 부분 인 복잡한 데이터 구조처럼 느껴집니다.


APL에는 또한 중첩 배열이 있으며 배열에는 동종의 데이터 형식이 없어도 매우 강력한 데이터 구조가 만들어집니다.
RFlack

1

언어 설계 관점에서 핵심 언어의 데이터 구조에 대한 특정 구문을 갖는 것에 대한 귀하의 의견은 무엇입니까? 좋은 생각입니까, 언어 등의 목적이 이것이 얼마나 좋은지를 바꾸는가?

리터럴 목록 및 맵과 편리한 클로저 구문은 고급 언어의 필수 기능입니다.

이 Java 코드의 차이점 :

Thing t = new Thing();
t.setFoo(3);
t.setBar(6.3);
t.setBaz(true);

이 Groovy 코드는 다음과 같습니다.

t = new Thing(foo: 3, bar: 6.3, baz: true)

엄청나 다. 40,000 라인 프로그램과 10,000 라인 프로그램의 차이점입니다. 구문이 중요합니다.


C #에서는 다음을 수행 할 수 있습니다. var t = new Thing(foo: 3, bar: 6.3, baz: true);-4 자만 추가 할 수 있습니다 .
Job

실제로는 같은 숫자입니다. Groovy 코드는 'def t = ...'를 읽어야합니다.
kevin cline

1

물론 그것은 프로그래밍 언어의 응용에 달려 있지만, 고급 언어의 경우 일반적인 데이터 구조로 작업하는 것이 가능한 한 편리해야합니다. 예를 들어 Wikipedia 의 추상 데이터 유형 목록을 살펴보십시오 . 다음과 같은 기본 원칙이 가장 일반적이라는 것을 알았습니다 (그러나 다른 의견도 듣고 싶습니다).

  • 정렬 된 순서 (1 차원) : 배열, 대기열, 스택, 목록 ...
  • 정렬 된 다차원 구조 : 테이블, 벡터, 행렬
  • 지도 : 해시 맵, 사전, 세트, ​​멀티 맵 ... (1 차원)
  • 다차원지도 : 기능,지도의지도 ...
  • 그래프 유형 : 나무, 유 방향 그래프 ...

다른 구조를 사용하여 구조를 에뮬레이션 수 있습니다. 프로그래밍 언어가 허용하는 쉽고 명확한 방법에만 의존합니다. 예를 들어 :

  • 대기열 및 스택은 배열 또는 목록으로 에뮬레이션하기 쉽고 후자는 푸시, 팝, 시프트 등과 같은 작업을 제공합니다.
  • 순서가 지정된 시퀀스는 숫자 키가있는 맵으로 에뮬레이션 할 수 있습니다
  • 값을 부울에 맵핑하는 맵으로 세트를 에뮬레이트 할 수 있습니다.
  • 중첩 시퀀스 또는 맵으로 대부분의 그래프 유형을 에뮬레이션 할 수 있습니다.
  • 정의를 쉽게 수정할 수있는 경우 함수를 사용하여 맵을 에뮬레이션 할 수 있습니다.

대부분의 언어는 순서가 지정된 시퀀스, 1 차원 맵, 다차원 맵에 대해 하나 이상의 유형을 제공합니다 (함수로 제한). 개인적으로, 나는 Perl, PHP, JavaScript, Lua와 같은 언어에서 집합과 순서가있는 다차원 구조를 종종 그리워합니다.


1

특수 구문을 얻는 특권 데이터 유형이 너무 많으면 좋지 않습니다. 이로 인해 언어 구문이 불필요하게 복잡해져 코드를 읽기가 어려워 초보자가 배우기 어렵고 언어 도구를 개발하기가 더 어려워집니다.

소수의 매우 일반적인 데이터 구조 유형에 대한 예외는 괜찮습니다. 아마 최대로 허용 할 것입니다 :

  • 고정 길이 배열
  • 세트
  • 해시 맵
  • 시퀀스 /리스트
  • 레코드 / 구조체 / 클래스

그보다 더 정교한 것은 사용자 정의 데이터 유형에 대한 언어의 일반 구문을 사용하여 처리 할 라이브러리에 맡겨야합니다.

특히 Red / Black 트리, Priority Queues 등과 같은 것들에는 구현 옵션이 상당히 많으므로 특정 구현을 핵심 언어로 구워내는 것이 현명하지 않습니다. 사람들이 자신의 상황에 가장 적합한 구현을 선택하도록하는 것이 좋습니다. 언어 디자이너가 내 선택을 제한하기를 원하지 않는 구현 선택의 예 :

  • 가변 또는 불변?
  • null을 허용합니까?
  • 동기화 여부
  • 영구 저장소로 지원됩니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.