표현력은 구체적으로 무엇을 의미합니까?


34

표현력 은 Wikipedia에 의해 다음과 같이 정의됩니다.

.. 그 언어로 표현되고 전달 될 수있는 폭 넓은 아이디어.

"아이디어" 는 기계와 통신 할 수있는 것들 (작업, 구조, 알고리즘 등) 을 나타 냅 니까? 아니면 다른 사람에게 언어로 포착되고 전달 될 수있는 "인간"개념을 가리키는가?

표현력은 어떻게 평가되고 측정됩니까?

예를 들어, JavaScript와 같은 언어를 사용하고 변수와 같이 변수/^_[0-9]{8}$/ 이름에 이상한 제한을 가한 경우 variable과 같이 밑줄 (밑줄)이 앞에 오는 8 자리 숫자 여야합니다. 표현력이 떨어지겠습니까?

또는 그 것이다 단지 불합리하고 성가신?


명확히하기 위해 :

표현력 은 언어 고유 의 일반적인 아이디어로 측정 됩니다.

  • 정수와 문자열
  • 루프
  • 조건부

또는 언어가 표현할 수있는 구체적 이고 독특한 아이디어의 수 :

  • 정수 1, 2 ... 2 ^ 32
  • "여우는 무엇을 말합니까?"를 포함하는 문자열 "화파 파파 파파 파우"
  • 내 개구리 컬렉션의개구리 에 대해
  • 경우에 개구리 입니다 녹색 또는 뭔가 다음 일을 할

3
주어진 범위에서 프로그램을 최대 1 억 개의 변수로 제한하면 표현력에 약간의 제한이 따릅니다. 예를 들어 Firefox를 구현하지 못할 수 있습니다. ;-)
R ..

1
이 "프로그래밍 언어"에 태그를 달았지만 프로그래밍 언어는 표현력에 대해 논의 할 수있는 유일한 컴퓨터 언어는 아닙니다. 실제로, 귀하가 링크하는 페이지는 Web Ontology Language를 첫 번째 예로 사용합니다.
Jon Hanna

답변:


39

표현력에 대한 획기적인 논문은 Matthias Felleisen (1991) 의 프로그래밍 언어의 표현력 에 관한 것이다. 그것은 언어 표현의 수학적으로 엄격한 정의를 포함합니다.

직관적으로 언어 A 로 작성할 수있는 모든 프로그램을 로컬 변환만으로 언어 B 로 작성할 수 있지만 언어 B로 작성된 일부 프로그램이 있으며 전역 구조를 변경하지 않고 언어 A 로 작성할 수없는 경우가 있습니다 (예 : 순전히 지역 변환), 언어 B 는 언어 A 보다 표현력이 좋습니다 .

이 정의의 하나 개의 좋은 속성이있는 프로그램이 있습니다 언어 쌍의가 있다는 가능성을 인정하지 않는다는 것이다 X 표현할 수없는 Y 와의 프로그램을 Y 로 표현 될 수없는 X를 , 따라서 언어가 서로 다른, 그러나 어느 쪽도 언어는 다른 언어보다 표현력이 좋습니다. 이것은 어떤 언어에는 다른 언어에는 능숙하고 다른 언어에는 능숙하지 않은 언어가 있다는 실제 경험과 잘 맞습니다.


따라서 (종이를 보지 않은) 표현력은 소스의 독자가 아닌 기계에 표현할 수있는 것에 관한 것 입니다 . 하드웨어에 지시 할 수있는 조치입니다. 코드에서 보존하거나 의사 소통 할 수있는 "인간"아이디어의 수를 측정하지 않습니까? ... 다른 질문을해야 할 수도 있습니다. 그러나 그 경우에 우리가 말하는 "기능"과 어떻게 다릅니 까?
svidgen

어쩌면 OP의 나의 예가 잘못되었을 수도 있습니다. 배열 A와 B를 모두 고려하십시오. 그러나 언어 A에도 구조체가 있습니다. 어느 언어 Point로든 2D 배열을 사용하여 일련의을 나타낼 수 있습니다. 그러나 APoint좀 더 사람이 읽을 수있는 개념으로 표현할 수있는 장점이 있습니다. 가 A는 더 표현?
svidgen

@svidgen 모든 Turing-complete 언어는 계산 상 동일하므로 작성할 수있는 가능한 프로그램 세트는 이론적으로 모두 동일합니다. 위의 정의에 따르면 B로 작성된 프로그램을 A에 맞게 재구성해야하는 경우 언어 B는 A보다 표현력이 뛰어납니다. 사용의 람다는 것을 자바 7에서 프로그램 map, filter일류 유형 / 방법 / 기능, 어쩌면 약간의 eval단독 메타 클래스의 마법 또는 동적으로 생성 유형 등하자
marczellm

@marczellm, 그래서 표현성이 가리키는 "아이디어"는 언어 구성 자체입니까? 예를 들어 조건은 아이디어입니까? 루프는 아이디어입니까? 끈? 번호? 기타.?
svidgen

1
@ Jörg 당신의 대답에 예를 들어 줄 수 있습니까? 그것은 귀여운 정의이지만 실제로 질문에 대답하는 데별로 도움이되지 않습니다.
svidgen

10

표현력 은 Wikipedia에 의해 다음과 같이 정의됩니다.

해당 페이지를 다시 읽도록하겠습니다. 주목해야 할 첫 번째 사항은 "프로그래밍 언어"가 아닌 "언어"라고 말하고 대부분의 예제는 프로그래밍 언어가 아니라는 것입니다. 예를 들어 첫 번째 예제는 온톨로지 인 OWL2 EL과 OWL2 RL의 비교입니다. 언어.

프로그래밍 언어뿐만 아니라 패턴 일치 언어, 마크 업 언어, 쿼리 언어, 비주얼 스타일 시트 언어, 정규 표현식 (및 참조하는 모든 일반 언어) 등에 개념을 적용 할 수 있습니다. 영어와 같은 자연 언어의 표현력을 언급 할 수도 있는데, 이는 종종 매우 비공식적으로 이루어 지지만 자연 언어 처리와 관련된 문제를 고려할 때 더 심각합니다.

"아이디어"는 기계와 통신 할 수있는 것들 (작업, 구조, 알고리즘 등)을 의미합니까? 아니면 다른 사람에게 언어로 포착되고 전달 될 수있는 "인간"개념을 가리키는가?

그것은 그 언어로 표현 될 수있는 것을 말하며, 순전히 그 자체로 간주됩니다.

예를 들어, (예제 전체에서 자바 스크립트를 사용하겠습니다. 질문에 해당 언어 중 하나가 아는 언어가 표시되므로) 자바 스크립트 문을 고려하십시오.

var x = 3 + 4;

이는 3과 4의 값 합계가 계산되고 x지정된 네임 스페이스 범위 내의 레이블과 연관된 값을 나타냅니다 .

만약 우리가 세상의 모든 컴퓨터를 파괴하고 그 코드를 종이에 썼다면, 자바 스크립트에서도 여전히 같은 의미를 가졌을 것입니다. 우리는 어떤 코드에서도 그러한 코드를 실행할 수 없지만 언어의 추상 정의는 여전히 우리가 이야기 할 수있는 것입니다.

이것은 현명한 것처럼 보이지만 실제로는 실제 컴퓨터를 고려하지 않고 언어가 추상적으로 추론 할 수있는 것들이라는 것이 매우 중요합니다. 첫째, 아직 실현 불가능한 컴퓨터 언어의 이론적 요점에 대해 추론하는 사람들은 오늘날 우리가있는 곳 중 하나입니다. 컴퓨터에는 컴퓨터 과학이 필요하지만 컴퓨터 과학에는 컴퓨터가 필요하지 않으며 계산이라는 개념 만 있습니다.

물론, 우리는 현실 세계에서 컴퓨터를 사용하고 있으며, 요즘에는 몇몇 전문가들이 이론적으로 논의하기보다는 실제로 컴퓨터를 사용하는 사람들이 많습니다. 당신이 연결 한 페이지는 말합니다 :

표현력이라는 용어는 다양한 의미로 사용될 수있다. 해당 언어로 표현할 수있는 아이디어의 척도를 의미 할 수 있습니다.

  • 용이성에 상관없이 (이론적 표현성)

  • 간결하고 쉽게 (실제 표현력)

첫 번째 의미는 공식 언어 이론, 수학 논리 및 대수와 같은 언어에 대한 공식 설명과 그 의미를 다루는 수학 및 논리 영역에서 지배적입니다.

비공식 토론에서이 용어는 종종 두 번째 의미 또는 둘 다를 의미합니다. 프로그래밍 언어를 논의 할 때 종종 그렇습니다. 이러한 비공식적 인 용어 사용을 공식화하기 위해 노력했습니다

이 용어의 두 가지 용도 중 첫 번째의 실제 영향은 전적으로 컴퓨터로 전달할 수있는 것과 관련 이 있습니다.

두 번째는 읽기와 쓰기에 대한 인간의 이해와 관련이 있지만, 비공식적이고 엄격하게 정의되지 않았기 때문에 사용하는 정도는 사용마다 크게 다릅니다.

예를 들어, JavaScript와 같은 언어를 사용하고 변수와 같이 변수 이름에 이상한 제한을 가한 경우 variable과 같이 밑줄 (밑줄)이 앞에 오는 8 자리 숫자 여야합니다. /^_[0-9]{8}$/표현력이 떨어지겠습니까?

공식적인 정의에 따르면 표현력을 잃지 않았습니다. 우리는 100,000,000 개의 변수로 제한되어 있지만 실제로 필요한 경우 새로 만든 네임 스페이스 내에 더 많은 변수를 보유 할 개체를 만들어이 문제를 해결할 수 있습니다. 오늘날 자바 스크립트로 작성된 이러한 프로그램은이 새로운 형식으로 다시 작성할 수 있으므로 동일하게 표현됩니다.

비공식적 인 정의에 의해, 우리는 일부를 잃었지만, 우리가 얼마나 비공식적인지에 따라 얼마나 많은가에 달려 있습니다. 다시 말해 정보 사용에 관한 "규칙"이 무엇인지 말할 수 없기 때문입니다. 같은 네임 스페이스에 100,000,000 개 이상의 변수가있는 프로그램을 단순한 대체를 넘어서 다시 작성해야하므로 적은 양을 잃어 버렸다고 말할 수도 있습니다. 좀 더 비공식적으로 다시 사용한다는 것은 그러한 불변의 변수 이름이 인간 종합에 미치는 정신적 영향을 의미합니다.

사람들이 비공식적으로 언어의 일부가 아닌 것을 비공식적으로 고려할 것이라는 점도 주목할 가치가 있습니다. 작성 시점부터 오늘까지 Javascript의 변경 사항을 고려하십시오.

가장 공식적인 정의에 따르면 표현력에는 변함이 없었습니다. 결국 튜링이 완성되었습니다.

보다 비공식적 인 정의에 따르면 배열 조작, 예외 처리 및 (아마도 대부분) 정규 표현식 포함과 같은 특정 사항에서 훨씬 더 표현력이 향상되었습니다. Javascript로 할 수 없었던 작업은 수행하지 않지만 javascript1.0으로 작성하는 데 몇 킬로바이트의 코드가 걸리고 실행하는 데 오랜 시간이 걸리는 몇 줄과 1 초의 실행 시간으로 수행 할 수는 있습니다.

훨씬 더 비공식적 인 정의로 브라우저에서 처음으로 자바 스크립트를 사용했을 때의 변경 (양식 입력 값을 변경할 수 있음) document.write페이지가 먼저 파싱되고 새로운 위치로 이동하거나 역사에서 앞뒤로 이동하지만 꽤 오늘날 (서버 호출의 데이터를 기반으로 포함하여 페이지의 거의 모든 것을 변경할 수 있음)에 대한 것은 아무것도 아닙니다. 대부분 자바 스크립트와 관련이 없지만 객체 모델과 API와 관련이 있습니다. 언어가 아닌 사용 가능합니다 (예 : IE의 vbscript는 이러한 변경으로 동일하게 혜택을 얻음).

내 생각에, 그 마지막 사용은 실제로 정확하지 않을 정도로 비공식적이지만 비공식적 정의의 문제입니다.

공식적인 정의에 의해 실제로는 더 표현력이 높아지지 않았습니다.


2
"컴퓨터는 컴퓨터 과학이 필요하지만, 컴퓨터 과학은 컴퓨터를 필요로하지 않는다"그렇게 I를
chbaker0

변수 명명 제한과 관련하여 언어의 아이디어 표현 능력과 관련이없는 외부 아이디어 (사물에 대한 모국어 이름)를 참조 할 수 있습니까? ... 아마도 그 질문의 근본이 될 수 있습니다. 우리가 이야기 하는 아이디어일반적인 언어 구조 만을 표현하고 있습니까? 예를 들어, 더하기, 빼기, 부정, 배열, 클래스 등? 받는 반대로 특정 아이디어 우리는 언어로 표현할 수 있습니까? 예를 들어, 유형의 배열이 호출되었습니다fishiesFish .
svidgen

더 많은 설명을 위해 편집 내용을 볼 수 있습니다. ... 둘 다 말하는 것처럼 들립니다 (내 편집을 참조). 그러나 첫 번째 목록은 "공식"이고 두 번째 목록은 "비공식"입니다. 이 경우 대화에서 자격없이 사용되는 방법에 대한 표준이 있습니까? 아니면 ... 설명을 요구하는 경향이 있습니까?
svidgen

4

변수 명명 규칙이 실제로 "표현"을 의미하는 것으로 생각하지 않습니다. "표현"은보다 근본적인 것을 의미한다고 생각합니다. 예를 들어 Linq 앞에 Linq가있는 C #과 C #을 고려하십시오. Linq를 추가 한 후 C #에서 SQL과 유사한 쿼리를 직접 작성할 수있게되었습니다. 이는 SQL을 문자열 리터럴에 넣은 다음 서버로 전달하거나 "for"를 사용하여 컬렉션을 반복하는 것과 같은 이전의 대안보다 훨씬 더 우아합니다.

또 다른 좋은 예는 프로토 타입 기반 상속을 사용하는 언어 일 수 있습니다. 이러한 언어에서는 런타임에 인스턴스 나 클래스 ( "클래스"가 주어진 언어로 어떤 이름이든 사용할 수 있음)에 단순히 새로운 메소드를 추가 할 수 있습니다. C ++ 또는 C #에서는 실제로 그렇게 할 수 없습니다. 프로토 타입 기반 언어에 비해 이러한 표현력이 부족합니다. (C #에는 확장 방법의 개념이 있으며 표현 방법을 추가한다고 할 수 있습니다.)


0

Wikipedia 기사에서 언급 한 것처럼 표현력은 언어로 표현할 수있는 프로그램 집합을 나타냅니다. "프로그래밍 언어"(JavaScript, LISP, C #, Perl 등)로 생각하는 모든 것은 본질적으로 Turing complete입니다. 즉, "계산 가능"이라고 말한 것을 표현할 수 있습니다.

그러나 정규 표현식은 정규 프로그래밍 언어만큼 표현 적이 지 않다는 것이 분명합니다. 또한 셸 와일드 카드는 정규식보다 표현력이 다소 떨어집니다.

CTE를 사용하면 달리 표현할 수없는 재귀 쿼리를 SQL로 표현할 수 있기 때문에 공통 테이블식이있는 SQL 버전이없는 버전보다 더 표현력이 좋습니다.


0

표현력을 이해하는 더 간단하고 직접적인 방법이 있지만 먼저 언어의 의미를 확립해야합니다. 언어를 공부하는 두 가지 분야가 있습니다 : 언어학과 자동 과목. 둘 다 언어가 연결을 사용하여 유한 알파벳으로 구성된 단어 집합 (유한 시퀀스)이라는 데 동의합니다. 일반적으로 흥미로운 언어 (흥미롭게도 유용한 방식으로 해석 할 수있는 언어를 의미 함)에는 언어에있는 단어와 그렇지 않은 단어를 결정하는 규칙 세트가 있습니다. 표현력은 해석이있을 때만 존재할 수 있습니다.

해석상 언어에 단어를 부여한 함수가 존재하는 것을 의미합니다 (이것은 분명히 자연어에 대해 논란의 여지가 있습니다).

"단어"를 사용하여 오도하지 마십시오. Java 프로그램은 Java 언어의 단어입니다 (공백으로 구분 된 여러 문자열이 포함 된 여러 파일에 걸쳐있을 수 있음).

상대적으로 간단한 개념을 다루기 위해 현대 프로그래밍 언어와 같은 복잡한 언어를 사용하는 것이 역효과를 낳을 수 있기 때문에 대신 수학 공식을 사용하는 것이 좋습니다.

  • 정수 A를 포함하는 모든 수식이되도록 언어 A를 정의 해 봅시다.

  • 정수 B를 포함하는 모든 수식의 언어로 언어 B를 정의 해 봅시다.

두 경우 모두 identity 요소를 사용할 수 없습니다. 따라서 언어 A에는 단어 "1 + 1", "1 + 2", "1 + 3", "2 + 3"등이 포함됩니다. 언어 B에는 단어 "2 * 2", "2 * 3", "2 * 4", "3 * 4"등이 포함됩니다. 또한 일반적인 해석을 "*"및 "+"(정수 더하기 및 정수 곱하기)에 각 기호에 할당합니다. 따라서 "1 + 1"의 해석은 2이고 "2 * 2"의 해석은 4입니다.

정수 A에서는 곱셈이 반복 더하기로 캐스트 될 수 있지만 일반적으로 곱셈으로 더하기를 표현할 수있는 방법이 없기 때문에 언어 A는 언어 B보다 엄격하게 표현 적입니다.


요약하자면, 언어 A는 통역 기능이 공통 영역을 공유 할 때 언어 B보다 표현력이 뛰어나다 고 말할 수 있지만 B의 통역 함수 이미지는 A 통역 함수 이미지의 적절한 서브 세트입니다.


-1

TLDR : 기능이 누락되었지만 다른 방식으로 표현할 수있는 경우 표현력이 부족하지 않습니다. 알고리즘을 마음에 상상하거나 한 언어로 구현할 수 있지만 다른 언어는 알고리즘을 구현할 수없는 방식으로 구조화되어있어 표현력 문제입니다 *.

변수 이름 지정 제한으로 표현성이 줄어들지 않습니다 (이름이 적어 더 이상 모든 알고리즘을 표현할 수없고 배열 + 색인과 같은 변수로 위조 할 수없는 경우 제외).

표현력이 부족한 간단한 예는 다음 do_homework과 같습니다 bring_down_trash. 이것은 코드로 쉽게 작성됩니다.

do_homework();
bring_down_trash();

이 솔루션은 매우 단순 해 보이지만 실제로 는 순서가 맞지 do_homework않으며 bring_down_trash다음 과 같이 작성할 수도 있습니다.

bring_down_trash();
do_homework();

주문을 집행 할 의도가 없다는 것을 나타내지 않기 때문에 부정확합니다. 또한 쓰레드를 사용하고 싶지 않습니다. 우리는 다음과 같이 말하고 싶습니다 :

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

내가 아는 한 이것은 프로그래밍 언어로 표현하기가 매우 까다 롭습니다.

나를 끝내는 버그의 예는 Java에서 객체 배열을 갖는 것이 불가능하다는 것입니다. 객체에 대한 포인터 배열을 만들 수 있지만 메모리 레이아웃이 동일하지 않습니다 (스피크 효율성).

다른 답변 에서 예를 들면 : C ++은 클래스 나 인스턴스에 메소드를 추가하는 것을 지원하지 않습니다 . 그러나 이것이 C ++의 표현성을 제한하는 것은 아닙니다.

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

인스턴스와 클래스에 대해 임의의 수의 멤버 함수를 추가, 제거 및 호출 할 수있는 클래스입니다. 기술적으로 C ++에서는 실제로이 기능을 지원하는 프로그래밍 언어 보다이 표현에서 더 표현력이 뛰어납니다 .C ++에서는 함수를 저장하는 방법 (벡터 대 배열 대 forward_list)을 선택할 수 있기 때문입니다.

* 일부 언어에는 기능으로 표현력이 부족합니다. 일반적으로 무한 루프를 작성하는 것이 불가능합니다. 이렇게하면 정지 문제를 해결할 수 있고 정확성을 자동으로 증명할 수 있습니다.


2
나는 이것이 정확하지 않다는 것을 확신합니다-적어도 그것이 내가 이해하는 것이 아닙니다. 원시 바이너리를 디스크에 쓰는 것은 이 정의에 의해 표현 됩니다.
Telastyn

1
@Telastyn 왜 터무니없는 것입니까? 물론 원시 바이너리를 디스크에 쓰는 것은 표현력이 없지만 그렇게 할 수있는 언어는 그렇지 않은 언어보다 더 표현력이 뛰어납니다.
nwp

컴퓨터에 원시 비트를 기록하기 위해 하드웨어 인터페이스를 사용하는 "언어"는 컴퓨터가 할 수있는 모든 것을 할 수 있기 때문에 가장 표현력이 좋은 언어의 예입니다. 다른 방법으로 누락 된 기능을 표현할 수 있습니다. 나는 당신의 정의에 의해 표현 언어 라는 것이 터무니없는 것을 발견했습니다 .
Telastyn

@Telastyn 왜 이것이 가장 표현적인 언어일까요? 데이터를 읽거나 무언가를 계산하거나 그래픽 또는 스레드를 표시하는 것을 표현할 수 없습니다. 메모리와 디스크에만 비트를 쓸 수있는 언어는 표현력이 거의 없기 때문에 전혀 사용하지 않을 것입니다.
nwp

1
"일반적으로 그들은 무한 루프를 작성하는 것을 불가능하게합니다. 이것은 정지 문제를 해결할 수 있습니다."– 무한 루프를 가질 수 없다면, 정의에 따라 프로그램이 정지해야합니다.
Patrick Collins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.