튜링 완전성 이외의 힘 측정


18

원래 StackOverflow에서 이것을 요청했지만 너무 주관적이었습니다 :-(. 프로그래밍 언어의 힘을 정의하는 방법에 관심이 있습니다. 실제로 사용되는 프로그래밍 언어를 구별하는 힘 측정 예를 들어, 누구나 어셈블리와 Java를 구별하는 비 주관적인 방법을 제안 할 수 있습니까?

튜링 완성도는 언어가 출력 할 수있는 것에서 최대로 강력하다는 것을 의미합니다 (실제로 비 시각적으로 수행 할 수있는 것을 의미 함). 따라서 더 강력한 힘을 정의하려면 다른 접근 방식을 취해야합니다. 원래의 질문에서 부족함이 제안되었지만 전혀 정의하기가 쉽지 않습니다. 다른 제안이 있습니까?

답변:


24

찾고있는 개념을 표현력 이라고 하며 Matthias Felleisen은 수학적으로 엄격한 정의를 가지고 있습니다.

" 프로그래밍 언어의 표현력 "

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz(Postscript 버전)

아이디어의 직관은 두 개의 다른 언어로 된 두 개의 동등한 프로그램 (예 : 언어 X의 프로그램 A와 언어 Y의 프로그램 B)이 있고 B에 대한 전역 변경이 필요한 A를 로컬로 변경하는 경우 X는 Y보다 표현력이 좋습니다.

Felleisen이 제공하는 한 가지 예는 대입입니다. Scheme 프로그래밍 언어에서 대입 연산자를 제거하고 Turing 완료 언어를 계속 사용할 수 있습니다. 그러나 이러한 제한된 언어에서 할당이 허용 된 경우 지역화 된 기능을 추가하려면 할당없이 프로그램을 전체적으로 변경해야합니다.

저의 토론은 몇 가지 세부 사항을 단순화했으며 전체 계정에 대한 논문 자체를 읽어야합니다.

다른 질문에 대답하려면 Java 프로그램에 새 클래스를 추가 한 다음 프로그램의 다른 부분이 전역 수정없이 메소드를 호출하도록하여 다형성의 이점을 얻을 수 있기 때문에 Java가 어셈블리보다 표현력이 우수하다고 말할 수 있습니다. 예외 처리는 Java가 어셈블리보다 표현력이 좋은 또 다른 예 throw입니다. 스택에 대한 제어를 이전하기 위해 단일 명령문을 작성하면 됩니다. 좀 더 기초적인 수준에서 a case의 시작 부분 근처에 새 문장을 추가 할 수도 switch있으며 손으로 점프 오프셋을 다시 계산하는 것에 대해 걱정할 필요가 없습니다.


대단히 감사합니다! 이것이 바로 내가 찾던 것입니다!
Casebash

6

그래도 귀하의 질문을 올바르게 이해하면 주관적인 판단 요청이 아니라 상대적으로 측정 가능한 것을 찾고 있습니다. 그렇다면 개인적으로 특정 문제 (모든 문제와 모든 프로그래머에 대한 평균) 를 해결하는 데 걸리는 시간을 선호 합니다 . 이 측정에서는 언어 자체뿐만 아니라 함께 사용되는 프레임 워크 / API도 고려해야합니다. 간결한 구문은 매우 작은 요소입니다. 훨씬 더 중요한 것은 가장 일반적으로 필요한 기능에 쉽게 액세스 할 수 있다는 것입니다.

더 주관적인 것을 찾고 있다면 그것이 얼마나 재미 있는지 말하고 싶습니다 . 프로그래머는 문제 해결을 원하는 사람들 인 경향이 있으므로 프로그래머가 사용하기에 재미있는 프로그래밍 언어는 필연적으로 가장 큰 문제를 해결할 언어가 될 것입니다. 이 측정법은 사람들마다 사용 방법에 대한 선호도가 다르기 때문에“최고의”프로그래밍 언어가 가장 광범위한 프로그래머에게 가장 매력적인 언어가 될 것입니다. 그러나 여기에서는 프로그래밍 언어 및 API뿐만 아니라 프로그래머가 실제로 상호 작용하는 환경 (IDE)도 고려해야합니다.


시간을 측정하는 것도 주관적이라고 말하고 싶습니다. 어느 프로그래머가 시간이 걸렸습니까? 같은 프로그래머로 두 언어를 테스트하면 어떤 언어를 더 잘 알았습니까? 이것을 처리하는 통계적 방법이 있지만 사람이 혼자서는 할 수 없었습니다.
John Fisher

1
@ 존 : 통계적으로 만 분석 할 수 있다고해서 주관적인 것은 아닙니다.
David Thornley

@David : 그건 내 요점이 아니 었습니다. 요점은 기존의 연구가 없었다면, 어커는 자신이 관심을 갖고있는 언어의 "능력"을 비교할 수 없어서 큰 그룹에 대해 통계적으로 분석하지 않으면 주관적으로 남겨둔다는 점입니다.
John Fisher

1

언어를 얼마나 강력하게 사용할 수 있는지에 따라 언어가 얼마나 강력한 지 정의하겠습니다. 많은 사람들이 코드 작성 측면에서 생산성에 대해 이야기하는 경향이 있지만, 프로그램 수명주기의 대부분은 개발이 아니라 유지 관리이기 때문에 코드를 읽고 디버깅 할 수있는 방법, 특히 누군가가 작성한 코드를보다 쉽게 ​​측정 할 수 있습니다 그밖에. 가장 강력한 언어는 읽고 유지 관리하기 쉬운 언어입니다.


2
이것의 어려움은 언어를 아는 사람이 언어를 아는 것이 더 쉽다는 것입니다. 따라서이 측정 값은 주관적입니다.
John Fisher

1

용어를 더 잘 정의해야합니다.

튜링 완전성은 아마도 당신이 의미하는 의미에서 "힘"에 관한 것이 아닙니다. 오히려 그것은 계산 가능성에 관한 것입니다. 즉, 주어진 언어가 튜링 머신을 사용하여 구현할 수있는 모든 프로그램을 표현할 수 있는지 여부. 거의 모든 프로그래밍 언어가 Turing complete라는 것이 밝혀졌습니다.

아마도 당신이 뒤 따르는 것은 프로그래밍 언어 "표현"이라고 불리는 것의 척도입니다. 그러한 조치가 있는지 또는 유용한 지 여부가 확실하지 않습니다. 근본적으로, 다른 프로그래밍 언어는 다른 유형의 문제에 대한 솔루션을 표현하는 데 더 좋습니다.

편집하다

간단히 말해서, 프로그래밍 언어에는 "파워"라는 속성이 없습니다. 프로그래밍 언어의 "표현성"또는 "표현력"으로 일반적으로 알려진 개념이 있습니다. 표현력은 특정 문제를 해결하기 위해 간결한 프로그램을 작성하는 것이 얼마나 쉬운 지에 대한 부분입니다. 그러나 프로그램을 읽고 쓰는 것이 얼마나 쉬운 지에 대한 상당한 척도가 있습니다. 일종의 "아름다움"과 같습니다. 나는 그것을 볼 때 그것을 알 수 있지만 그것을 정의하도록 요구하지 마십시오.

문자 수를 비교하는 것만으로는 표현력을 충분히 측정 할 수 없습니다. 그렇지 않으면 소스 코드를 압축하여 언어를보다 표현력있게 만들 수 있습니다 ... 사실, 나는 표현력에 대한 객관적인 척도를 모른다. 효과적으로 특성을 쓸모없고 흥미롭지 않게 만듭니다.


1
Turing 완전성은 계산 가능성에 관한 것임을 알고 있습니다. 우리는 유한 상태 기계와 같은 계산의 규모에 대한 측정이 적다는 것을 알고 있습니다. 그러나 우리는 완전성을 튜링 것은 계산 가능성의 측면에서 최대한 강력하다,이 위의 전력의 수준을 정의하는 계산 가능성을 사용할 수 없습니다
Casebash

@Casebash-당신은 여전히 ​​"전력"이 무엇인지 말하지 않았습니다.
Stephen C

2
내가 모르기 때문에 이것이이 질문의 요점입니다!
Casebash

그렇다면 당신의 대답의 요점은 무엇입니까? 코멘트 였어야했다.
reinierpost

@reinerpost- 대답 의 요점은 질문이 의미가 없으며 그 이유를 자세히 설명하는 것입니다. 기본적으로 질문은 " '표현력'이라는 것이 있습니다. 그것이 무엇인지 모르겠지만 어떻게 측정하는지 말해 줄 수 있습니다." 그리고 내 대답의 마비는 '표현력'이 정의되지 않은 개념 / 속성이며, 측정 가능하고 정량화 가능한 것은 아닙니다. (그리고 그것은 분명히 대답이며 의견이 아닙니다. 아마도 당신은 내가 말하려는 것을 이해하지 못했을까요?)
Stephen C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.