프로그래밍 언어 분석


10

에서 SICP , 저자 상태 ( 1.1 절 프로그래밍 언어의 세 가지 기본 "메커니즘"이 있음) :

  • 언어가 관련된 가장 간단한 엔티티를 나타내는 기본 표현식

  • 복합 요소가 더 간단한 요소로 만들어지는 조합 수단

  • 복합 요소를 단위로 명명하고 조작 할 수있는 추상화 수단

이러한 요소 또는 메커니즘으로 주류 프로그래밍 언어 (예 : Java)를 어떻게 분석 할 수 있습니까?


EBNF 확장 Backus-Naur 양식 또는 BNF Backus-Naur 양식 을 본 적이 있습니까? 이 세 가지 개념과 비슷한 문법을 ​​세분화 할 수는 있지만, 의도가 무엇인지 확실하지 않으므로 도움이되는지 여부를 알 수 없습니다.
Jetti

@Jetti-그래, 나는 가지고 있고, 아니, 내가 관심있는 것은 아니다. 나는 프로그래밍 언어의 의미 (질문 : 실제로 내가 찾고있는 단어입니까?)를 분석하려고합니다. 그들의 서면 양식 (구문).

답변:


1

원시 표현, 조합 수단 및 추상화 수단의 구별은 프로그래밍 언어를 모델링 할 때 유용합니다. 이것은 언어의 본질적인 속성이 아닙니다. 언어 정의를 가리킬 수 없으며“이 기능은 명백한 기본 표현입니다.이 기능은 명백하게 조합 수단”입니다. 구별은 모델의 속성이며 복잡한 모델은 분류에 저항 할 수 있습니다.

이 세 가지 개념의 교과서 예제는 lambda calculus 입니다.

  • 변수 x , y ,…는 유일한 기본 표현식입니다.
  • 기능 적용 MN 은 하나의 조합 수단입니다.
  • Lambda 추상화 λx.M 은 추상화 의 한 가지 수단입니다.

더 많은 기능을 가진 언어에 도달하면 모델링이 더 모호해질 수 있습니다. 일반적으로 기본 표현은 기본 구성 요소로 분류 할 수 없거나 분리 할 수없는 표현입니다. 그러나 그것은 원자와 같습니다. 그것은 과학이 행진 할 때까지 원시적입니다. 예를 들어, 변수가 이름 대신 숫자를 사용하는 람다 미적분의 변형이 있습니다 ( de Bruijn indices ). 컴퓨터 증명을 위해 람다 용어를 모델링 할 때 특히 편리합니다. 컴퓨터 증명에서 정수는 구성 부분으로 나뉩니다 . 따라서이 모델에서 변수는 결국 원시 표현식이 아닙니다.

Java의 (일반적인 모델) 기본 표현은 주로 상수와 변수입니다. 조합 수단에는 수많은 연산자가 포함됩니다. 더 정확하게 말하면, "가산 식"은 A + BA - B를 모두 포함하는 경우 두 개의 슬롯 (왼쪽과 오른쪽) 또는 세 개의 슬롯 (양쪽과 연산자)을 조합 한 수단입니다. 그 이름으로 (이 경우 연산자 +-그 자체로 원시 구조가됩니다). 결합 수단은 다른 명령 시퀀스를 포함 I ; J 루프 구조를while (…) {…}, 등등. 그런 다음 변수 선언, 함수 정의, 클래스 정의 등과 같은 조합 (모수 이름과 유형, 본문, 초기화 프로그램 등을 결합)과 추상화 수단 (재사용을 위해 이름을 정의하기 때문에) 등의 구성이 있습니다. 실제로 추상화 수단도 결합 수단이라는 것이 매우 일반적입니다. 이름과 정의를 결합한 것입니다.


좋은 답변; 당신은 내가 어려움을 겪고있는 문제에

"가변"이란 정확히 무엇을 의미합니까? 그것들은 이름이 있기 때문에 추상화의 수단으로 설명 될 수 없습니까?
morbidCode

@morbidCode 변수의 개념은 복잡한 개념으로, 단어는 람다 미적분학과 Java에서 서로 다르지만 관련된 의미를 갖습니다. 변수는 지정되지 않은 값을 참조하므로 "추상화"로 간주 될 수 있습니다. 그러나 이것은 추상화 의 수단 이 아닙니다. 참조를 생성하지 않고 단지 기존 추상화를 사용하는 방법 일뿐입니다. 람다 추상화는 조작 할 수있는 객체로 코드 블록을 사용하는 방법을 만듭니다.
질 'SO- 악마 그만'

4

거친 찌르기 :

표현은 바로 그 것입니다. Java에서 표현을 구성하는 것. 그것이 진술을 포함하도록 확장 될지 모르겠습니다.

조합에는 복합 표현식, (변수?,) 명령문, 메소드, 클래스 메커니즘 및 패키지가 포함됩니다. 일단 언어에 들어가면 모듈도 마찬가지입니다.

Java에서 가장 간단한 추상화 방법은 클래스입니다. 클래스 외부에는 아무것도 존재할 수 없습니다. 추상화의 "계층"이있을 수 있습니다. 정적 메서드는 인스턴스가 필요하지 않기 때문에 인스턴스 메서드보다 간단합니다.

제네릭은 추가 추상화 계층과 좌절감을 제공합니다.


@MattFenwick 표현식은 하나의 프리미티브로 구성 될 수 있습니다. 프리미티브와 다른 엔티티의 조합은 복합 표현식을 만듭니다 (여전히 표현식이지만 명령문은 아닙니다).
Dave Newton

@MattFenwick 저는 표현 프리미티브가 아니라 표현이 단일 프리미티브로만 구성 될 수 있습니다. 즉각적인 문자열과 그것이 생성하는 참조를 구별하고 싶지 않다면 언어가 구문 설탕을 제공하기 때문에 문자열이 원시적 인 방법은 없습니다. +는 어떤 식 으로든 행동 할 수 없기 때문에 +라고 말하고 싶습니다.
Dave Newton

제쳐두고 : Java의 제네릭 구현에 문제가 있습니까?
Steven Evers

2

기본 분류는 다음과 같습니다. LISP와 함께 병렬을 그리려고합니다.

기본 표현

  • 모든 기본 값, 리터럴 (숫자, 부울 등)을 사용하여 나타낼 수있는 것

LISP와 평행 : 원자, 숫자 및 목록.

조합 수단 (복합 데이터 구조를 구축 할 수있는 방법)

  • 배열
  • 객체 / 구조체.

LISP의 병렬 : 단점 셀, 목록

추상화 수단

  • 모든 제어 흐름 구문 (있는 경우)
  • 모든 내장 연산자 ( +, -, *, /, ...)
  • 모든 함수 (이 범주에는 클래스와 메소드가 포함됨)

LISP에서 병렬 : 함수와 같은 문법 설탕 let,define


좋은 대답입니다! 그래도 제어 흐름 구조 중 일부는 조합 수단에 적합 할 것이라고 생각했습니다. LISP와 비슷한 점은 많은 도움이됩니다.

좀 빠지는. 배열과 객체는 다른 수준에서 재생되며 언어 자체가 아닌 데이터 표현의 일부입니다. 배열 이니셜 라이저는 언어의 일부이며 조합의 수단입니다. 운영자와 제어 흐름 구성은 재사용을 위해 아무것도 "저장하지"않기 때문에 추상화 수단이 아닙니다. 추상화 수단은 일반적으로 해당 이름으로 향후 재사용 할 수 있도록 엔티티에 이름을 부여합니다.
Gilles 'SO- 악마 그만

0

프로그래밍 언어는 일반적으로 구문의미로 정의됩니다 . 이 두 가지 모두 언어 표준에 정의되어 있습니다.

구문은 유효한 프로그램을 작성하는 방법을 요약하고 의미는 해당 유효한 프로그램의 의미를 정의합니다.

귀하의 경우, 구문은 프리미티브가 무엇인지, 조합하는 방법 및 추상화 방법을 알려줍니다. 시맨틱은 조합과 추상화의 의미를 알려줍니다.

예를 들어 구문은 유효한 작성 방법을 알려줍니다. for 루프 . 시맨틱은 for 루프의 기능을 알려줍니다.

프로그래밍 언어를 실제로 분석하기 시작하려면 표준의 사본을 들고 무엇이 들어 있는지 확인하십시오. Java를 탐구하기 전에 C와 같은 간단한 언어로 시작하겠습니다. 나는 또한 책의 나머지 부분을 읽을 것입니다. 프로그래밍 언어가 작동하는 방식을 배우는 이유를 배우면 컴파일러를 구현하지 않아도 더 나은 프로그래머가되었습니다.


1
무엇을 기다립니다? "자바로 파고 들기 전에 C처럼 간단하다." "Simple like C"에서 날 잃었 어
corsiKa

맷, 그때 네가 뭘하는지 이해하지 못하는 것 같아 저자가 명시 적으로 구문과 의미론을 호출하는지 여부에 관계없이 두 가지에 대해 이야기합니다.
mpdonadio

실제로, "구문"은 언어에서 "가장 간단한"것들을 정확하게 묘사하며, 그 원자가 구성됩니다.
Ira Baxter

구문은 유효한 프로그램이 무엇인지 완전히 파악하지 못합니다. 예를 들어, 구문 상 올바른 프로그램은 유형 검사에 실패 할 수 있습니다. 명령문을 실행하는 AC 프로그램 x = ++x;은 일반적인 컴파일러가 명령문 을 승인하더라도 유효하지 않습니다.
Gilles 'SO- 악마 그만

0

올바른지 모르겠지만 부서를 이해하는 방법은 다음과 같습니다.

기본 표현 , >>, +, *, /, int, boolean, 변수, 메소드 등

조합의 수단은 이 논쟁의 여지가있을 수 있으며, 하나 + 및 concact, 또는 구성 대 상속과 방법 등의 이야기에 대한 자세한 고급 아이디어 같은 그 일이 그렇게 할 수 있습니다. 주입, 새로운 작업자, 확장 등

추상화 수단, 이것은 변수, 메소드의 이름을 지정하는 데 사용되는 구문 일뿐만 아니라 인터페이스, 클래스, 정적 클래스, 오버로드 메소드 등을 작성하는 수단입니다.

그러나 책에서 더 많은 정보를 제공해야 그 의미를 정확히 알 수 있습니다.


이 책은 온라인에서 무료입니다. OP에 링크가 제공됩니다. 나는 means of combination그것에 대해 같은 방식으로 느꼈습니다 . 정확히 거기에 속하는 것을 알아내는 것이 어렵다는 것입니다. 그래도 좋은 대답입니다.

그래도 조합과 추상화에 관해 다른 장을 알고 있습니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.