프로그래밍 언어에서 첫 번째 / 두 번째 / 세 번째 클래스 값에 대한 수학 기초는 무엇입니까?


19

추가

두 가지 관련 질문을 찾았습니다.

/math//q/1759680/1281

/programming//a/2582804/156458


프로그래밍 언어에서 Michael Scott의 프로그래밍 언어 실용

일반적으로 프로그래밍 언어의 값은 매개 변수로 전달되거나 서브 루틴에서 리턴되거나 변수에 지정 될 수있는 경우 최우선 상태라고합니다. 정수 및 문자와 같은 간단한 유형은 대부분의 프로그래밍 언어에서 최고의 가치입니다. 반대로 “두 번째 클래스”값 은 매개 변수로 전달 될 수 있지만 서브 루틴에서 반환되거나 변수에 할당 될 수 없으며 “세 번째 클래스”값 은 매개 변수로 전달 될 수도 없습니다.

레이블 은 대부분의 프로그래밍 언어에서는 3 급 값이지만 Algol에서는 2 급 값입니다. 서브 루틴 이 가장 많이 나타납니다. 모든 기능 프로그래밍 언어와 대부분의 스크립팅 언어에서 최고의 가치입니다. 또한 C #에서 최고 수준의 값이며 Fortran, Modula-2 및 -3, Ada 95, C 및 C ++를 포함한 몇 가지 다른 필수 언어로 제한됩니다. 11 그것들은 대부분의 다른 명령형 언어의 2 급 값이며 Ada 83의 3 급 값입니다.

  1. 프로그래밍 언어에서 첫 번째 / 두 번째 / 세 번째 클래스 값에 대한 수학 기초는 무엇입니까?

    이 용어는 1 차 / 2 차 논리를 생각 나게하지만 관련이 있습니까?

  2. 그들 사이의 차이점은 값을 사용할 수있는 특정 사례 인 것 같습니다.

    • 매개 변수로 전달
    • 서브 루틴에서 반환되거나
    • 변수에 할당됩니다.

    특정 사례는 왜 중요하지만 다른 사례는 언급되지 않습니까?

감사.


23
1 등석 / 2 등석으로 가치를 분류하는 것은 언어를 패러다임으로 분류하는 것만 큼 유익하지 않습니다. 결국에는 그림을 어지럽히는 모호한 일반화가 끝납니다. 이것은 프로그래밍 언어를 이해하는 올바른 방법이 아닙니다. 중요한 언어의 구문, 정적 및 역학을 이해하는, 그러나 그 코멘트에에 가서 너무 큰입니다
gardenhead

3
따로 : PL / I는 일류 레이블의 예입니다. PL / I에서 레이블이 지정된 변수를 선언하고 변수에 코드 위치를 지정하고 변수를 이동할 수 있습니다. 매개 변수로 전달할 수도 있고 배열을 작성할 수도 있습니다.
Theraot

@ Theraot : 아마도 내가 데이트하고 있지만 FORTRAN에서 할당 및 계산 된 GOTO를 처리해야했던 유일한 사람입니까? 그리고 아니요, @ $ %를 쓰지 않았습니다! 코드를 다시 엔지니어링해야했습니다.
jamesqf

@jamesqf FORTRAN 및 COBOL의 레이블에 할당하는 것을 알고 있습니다. 아니요, 사용하지 않았습니다. 레이블을 분류하는 방법을 잘 모르겠습니다. 그러나 내가 읽은 것 (설명서가 있음)에 대해 PL / I는 그 이상을 넘어서며 레이블이 일류라고 확신합니다.
Theraot

답변:


45

아무것도 없으며 꽤 임의적입니다.

유일하게 유용한 차이점은 퍼스트 클래스와 다른 클래스 사이입니다. "기타"괄호 안에있는 모든 사례는 각 사례마다 고유 한 규칙 세트를 가지고 있으며 모두 함께 묶는 것은 그리 도움이되지 않습니다. "일등석"은 "규칙을 찾을 필요가 없습니다"를 의미하며 "기타"는 "규칙을 배워야합니다"입니다.

예를 들어 C ++에서 개별 함수는 상태가없는 한 일류 값입니다. 과부하 세트는 아니지만 람다입니다. C #에서 함수는 일반적으로 일류 값이지만 모든 경우에 유형 유추를 방지하는 유형 유추를 처리 할 때 발생하는 어색한 경우가 있습니다.


10
+1, 많은 언어 에서 많은 수의 구문을 비교하고 유사점과 차이점 및 깊이를 분석하는 Programming Language Pragmatics 와 같은 책의 맥락 에서 이러한 종류의 속기는 유용 할 수 있다고 생각합니다. (다른 사람들이 "중고"와 "제삼자"를 특정한 의미로 이해하도록 기대하지 마십시오.)
ruakh

(어, "초침"과 "
삼등

3
중고 함수와 거래하고 싶다면 함수가 일류 시민 인 언어로하는 것이 좋습니다. ^^
5gon12eder

@ 5gon12eder : "중고 함수"는 타사 라이브러리에서 호출하는 함수입니다.
jamesqf

11

저는 DeadMG에 동의합니다. 중요한 차이점은 일류와 "다른 것"입니다. 그러나 차이를 분류하는 더 친숙한 방법이 있습니다.

일급 값은 데이터이고 다른 값은 코드입니다. (거의 말하기 : 예외가 있다고 확신합니다. 그러나 이것은 실제 언어에 적용되는 정말 좋은 근사치입니다.)

일부 언어에서는 코드를 데이터로 취급 할 수 있습니다. 기능적 언어는 이것으로 유명합니다. 그중 일부는 프로그램이 실행될 때 ( 유전자 프로그래밍 의 기초) 프로그램 코드를 변경할 수있게합니다 .

C 및 C ++와 같은 언어를 사용하면 함수의 주소를 사용할 수 있습니다. 수정할 수는 없지만 함수를 매개 변수로 다른 함수에 전달할 수 있습니다. C ++는 또한 functors 의 구문 설탕을 가지고 있습니다. 표면상에서 함수처럼 행동하고 마치 마치 데이터처럼 전달 될 수있는 전체 객체를 생성하는 아이디어가 있습니다. 그렇지 않으면 하위 등급의 가치는 일류 가치로 취급 될 수 있습니다.

수학적으로 가장 좋은 방법은 프로그램의 AST 를 생각하는 것입니다 . 일반적으로 각 토큰에는 다른 유형과 호환되거나 호환되지 않는 특정 유형이 있습니다. C ++에서 l-value, r-value 및 기타 값 유형의 혼란을 생각해보십시오 . 그런 다음 키워드, 함수 등의 기호를 추가하십시오. 이들 중 일부는 언어에 따라 1, 2 또는 3 클래스 값일 수 있습니다.

나는 학업 환경을 제외하고 가치의 "클래스"가 중요하다는 것을 확신하지 못한다. 현실에서 알아야 할 중요한 점은 코드를 전달하여 데이터처럼 처리하는 방법입니다 (펑터, 람다 / 클로저, 함수 포인터 등).


2
비 코드 비 일류 클래스 값의 예 : Lua에는 ...vararg 함수 매개 변수를 나타내는 데 사용되는 특수한 "변수"가 있습니다. 값 목록 (예 : print(...)또는 local args = {...}) 인 것처럼 많은 표현식에서 사용할 수 있지만 클로저 ( function(...) return function() return ... end end) 에서 참조하는 것과 같이 할 수없는 일이 있습니다 .
대령 삼십이

8

Dentational Semantics 는 값과 변수가 프로그래밍 언어에서 작동하는 방식을 설명하기위한 수학 기반을 제공합니다. 그것은 내 컴퓨터 과학 학위에서 잘 설명되어 Denotational Semantics 시험에서 최고 점수를 얻은 후 대부분을 잊어 버렸으며 프로그래머로서 20 년 동안 그것을 사용할 필요가 없었습니다.

잘 정의 된 수학적 기초를 사용하도록 선택하거나 "일류 상태"와 같은 비공식 용어를 사용할 수 있습니다. 코스가 Scott의 Programming Language Pragmatics 기반이라면 더 많은 것을 배웠을 것입니다. 그러나 프로그래밍 언어 디자인에서 PHd를 할 사람에게는 공식적인 수학이 필요합니다.

대부분의 프로그래밍 언어에 대한 사양을 읽으면 Denotational Semantics의 불일치가 부족한 것을 알 수 있지만 가장 잘 설계된 언어에는 프로그래밍 언어 디자인 전문가 인 팀원이 있었으므로 Denotational Semantics를 잘 이해합니다.

따라서 Michearl Scott은 공식 수학과 관련이있는 비공식 용어를 사용하면서 대부분의 프로그래머가 혜택을 볼 수있는 방식으로 주제를 제시합니다. 그의 용어는 다른 사람들이 사용하지 않기 때문에 의사 소통에 유용하지 않지만 처음으로 새로운 프로그래밍 언어를 볼 때 물어보아야 할 질문에 대한 훌륭한 토대를 제공합니다.

Michael L. Scott은 Computer Sci의 선임 연구원이므로 공식 수학을 사용하여 이해하고 매우 기뻐할 것입니다. 그러나 최고의 연구원처럼 그는 연구의 나머지 부분을 우리에게 설명하는 데 능숙합니다.


감사. 수업에 어떤 책이 사용 되었습니까? 지금 어떤 책을 추천 하시겠습니까? 나는 자기 학습자입니다
Tim

@ 팀, 저는 20 년 전에 수업을 했어요! Michearl Scott의 책이 최고 중 하나이며 PHd 수준의 연구를 수행하지 않는 한 필요한 것 이상을 다룰 것입니다.
Ian

3

아닙니다. "일등"과 "일차"에서 "first"라는 단어는 다른 것을 의미합니다.

그러나 "일류"와 "일차"의 개념은 서로 관련이 있습니다. 두 언어 모두 언어가 어떤 언어를 묘사 할 수있는 개념을 추상화 할 수 있는지에 관한 분류입니다.

언어의 일반적인 추상화 메커니즘이 해당 개념을 추상화 할 수 있다면 개념은 일류 입니다.

예를 들어, Java 프로그래밍 언어는 정수를 설명 할 수 있으며 정수를 추상화 (정수 매개 변수로 허용, 함수 결과로 리턴, 데이터 구조에 저장 등)하기위한 모든 일반적인 메커니즘은 정수에 대해 작동합니다.

개념 자체를 추상화하는 데 사용할 수없는 경우 1 차 개념입니다 .

예를 들어, 다시 Java에서 메소드를 사용하여 특정 사항을 추상화 할 수 있습니다. 그러나 메소드 이름을 메소드 매개 변수로 전달할 수 없기 때문에 메소드를 추상화하기 위해 메소드를 사용할 수 없습니다. 이것은 JavaScript에서 다릅니다. 대괄호 표기법을 사용하여 객체의 이름으로 문자열을 통해 객체의 속성에 액세스 할 수 있으며 문자열을 추상화 할 수 있습니다.

개념이 2 차 사용이 아닌 1 차 사용에 대해서는 추상화하는 데 사용될 수있는 경우 2 차입니다.

예를 들어, Java에서 제네릭을 사용하여 유형을 추상화 할 수 있습니다 (처럼 class Foo<T> { public List<T> content; }). 그러나 ()에서와 같이 제네릭을 사용하여 제네릭을 추상화 할 수는 없습니다 class Bar<T> { public T<Int> content; }. 스칼라에서는 다릅니다.

개념이 1 차 및 2 차 사용에 대해서는 추상화 할 수 있지만 2 차 사용에는 적용되지 않는 경우 개념은 3 차입니다.

등등.

마지막으로, 임의의 사용 자체를 추상화하는 데 사용할 수 있는 개념은 고차 입니다.

요약 : 추상화 기능이 일류 인 경우에는 높은 차수입니다. 그리고 추상화 기능이 1 차라면, 일류가 될 수 없습니다.


1
당신은 할 수 있습니다 할 수 List<List>있지만, 자바. 그 부분에서 당신이 의미하는 바를 분명히 할 수 있습니까?
Polygnome

1
좋은 지적. 내 말은 : class Foo<A> { A<Int> ... }. 즉, 제네릭 형식 매개 변수를 제네릭 클래스로 사용하는 것을 의미합니다. 그런 다음 to를 Foo<List>인스턴스화합니다 . Java에서는 불가능합니다. 나중에 답변을 수정하려고합니다. A<Int>List<Int>
Toxaris

실제로는 불가능합니다.
Polygnome

나는 이제 잘못된 List<List>예를 대체했습니다 . @Polygnome 문제를 지적 해 주셔서 감사합니다.
Toxaris

@Toxaris 나는 이것이 당신이 스스로 구성한 특유의 용어라고 생각합니다. '개념'은 1 차 또는 2 차가 아니라 논리 수량 자입니다.
Miles Rout

2

프로그래밍 언어에서 첫 번째 / 두 번째 / 세 번째 클래스 값에 대한 수학 기초는 무엇입니까?

내가 아는 것은 없습니다.

이 용어는 1 차 / 2 차 논리를 생각 나게하지만 관련이 있습니까?

실제로는 아닙니다.

프로그래밍 언어 요소의 "클래스" 는 내 언어 사용자가 프로그래밍 방식으로 조작하기를 원하는 질문에 대한 간단한 생각입니다 . 예를 들어, C #은 을 조작하기위한 풍부한 조작 세트 , 유형 을 조작하는 덜 부유 한 세트 및 레이블 을 조작하는 조작을 제공하지 않습니다 .

그러나 여기에 연결이 있다는 직관이 완전히 잘못 된 것은 아닙니다. 1 차 로직에서 절차 적 프로그래밍으로, 고차 로직에서 기능적 프로그래밍으로 비유 할 수 있습니다. 1 차 로직은 값의 논리적 조작에 관한 것입니다. 절차 적 프로그래밍은 프로그램 방식의 값 조작에 관한 것입니다. 고차 논리는 ​​논리 문의 논리적 조작에 관한 것이고 , 기능적 프로그래밍은 함수의 프로그램 적 조작에 관한 입니다.

특정 사례는 왜 중요하지만 다른 사례는 언급되지 않습니까?

저자에게 명확한 답변을 요청해야합니다.

나는이 "클래스"개념에 너무 매달리지 않을 것이다. 공식적으로 정의 된 것은 아닙니다. 언어 디자이너가 프로그래밍 방식으로 조작 할 수있는 작업에 대해 이야기하는 데 사용하는 약어입니다.


2

이러한 맥락에서“일류 가치”는 프로그래밍 언어 이론의 표준 용어입니다. 일급 값은 언어에서 일반 값으로 조작 할 수있는 값으로 런타임에 계산할 수있는 값입니다. 물론, 그것은 언어에 대한 의미를 정의 할 때까지 팽팽한 정의입니다. 그리고 그 의미가 값으로 정의하는 것은 값입니다. 개념의 요점은 간접적으로 만 액세스하는 것이 아니라 직접 조작 할 수있는 것을 식별하는 것입니다.

예를 들어, 거의 모든 프로그래밍 언어에서 경계 크기의 기계 정수 (예 : 8 비트 정수 또는 32 비트 정수 또는 64 비트 정수 등)는 일류 값입니다. 변수에 변수를 저장하고 전달하여 함수 등으로 반환 할 수 있습니다. 대부분의 언어에서는 어셈블리 나 C와 같은 저수준 언어가 아닌 문자열은 일류 값이지만 C에서는 그렇지 않습니다. 문자열에 대한 포인터를 가져옵니다. C에서 문자열과 배열은 일류 값이 아닙니다. 예를 들어 배열을 함수에 전달할 수없고 배열 변수에 배열을 지정할 수 없습니다. C에서 함수는 일류 값이 아닙니다. 둘 중 하나 : 함수를 변수에 저장할 수 없으며 함수에 대한 포인터 만 저장할 수 있습니다. 반대로 문자열과 함수는 대부분의 고급 프로그래밍 언어에서 일류 값입니다. 문자열 등에 저장할 수 있습니다.

컴파일되도록 설계된 많은 프로그래밍 언어에서 일류가 아닌 개념의 예는 유형입니다. C 또는 Java와 같은 언어에서는 형식이 컴파일 타임에 존재하므로 언어 ​​구문을 사용하여 형식을 조작 할 수 없습니다. (자바에는 클래스를 기반으로 한 동적 유형 시스템도 있습니다. 클래스는 리플렉션을 통해 일류 값입니다.) 반면 Python과 같은 언어에는 type인수의 유형을 나타내는 값을 반환하는 함수가 있습니다.

표준 용어에서 "일류 가치"의 부정은 "일류 가치가 아닙니다". “제 2 류 가치”라는 용어는 일반적으로 사용되지 않으며“제 3 류 가치”는 훨씬 적습니다. 이 책 이외의 내용을 기대하지 마십시오. "두 번째"를 "매개 변수로 전달할 수 있음"으로 정의하고 "세 번째"를 "매개 변수로 전달할 수 없음"으로 정의 할 근거는 전혀 없으며 의미있는 번호를 매길 수있는 항목의 규모는 없습니다. 함수에 매개 변수로 전달할 수있는 값과 변수에 할당 할 수있는 값간에 차이가있는 언어는 거의 없으므로이 개념의 이름을 정의하는 것은 유용하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.