문없이 프로그래밍 언어가 작동 할 수 있습니까?


9

JavaScript로 프로그래밍 할 때 문과 블록으로 수행 할 수있는 모든 것이 식만으로 수행 될 수 있다는 것을 알게되었습니다. 프로그래밍 언어는 표현식만으로도 잘 작동합니까? 그렇다면, 왜 진술이 사용됩니까?


2
그렇습니다. Ruby와 Lisp의 모든 방언과 같은 많은 표현 언어가 있습니다.
amara

@ sparkleshy 내가 알기로는, 그냥 추측 : 그들은 모두 JavaScript의 쉼표와 비슷한 연산자를 가지고 있습니다 (두 개의 문장을 실행하고 마지막 값을 반환합니다)? 이것이 일반적으로 두 명령문을 순차적으로 실행하는 솔루션입니까? CL의 progn을 아날로그로 계산하고 있는데, 그것이 2보다 큰 표현식에서도 작동한다고 생각합니다.
MaiaVictor

1
표현은 모든 것이 평범한 진술 언어와 다르게 보일 필요는 없습니다. 진술은 단지 가치를 가지고 있습니다. 자바 스크립트의 명령문 표현식을 작성 하면 기존의 모든 코드 가 완전히 유효합니다.
amara December

1
CoffeeScript 는 모든 것이 표현 언어이며 JavaScript로 컴파일됩니다.
Spoike

1
관련성 (복제 가능) : 표현이 진술이 아닌 언어에서는 어떤 유용한 표현이 불가능합니까? "답변에 언급 된 것처럼 왜 많은 문법이 expr과 stmt를 구별 하는가?
gnat

답변:


14

확실한. 가장 간단한 방법은 현재 명령문 인 모든 구문에 결과 값을 할당하여 표현식으로 바꾸는 것입니다. 그래도 반드시 유용하거나 의미있는 것은 아닙니다. 유일한 잠재적 이득은 약간의 개념적 단순성입니다. 그러나, 경우에 당신이 다음 세미콜론과 루프 같은 것들을 제거를 진행합니다 (대신 다른 연산자와 함수를 통해 체인이 필요), 프로그램은 많이 사용하는 문은 추한된다.

이 작업을 수행하는보다 급진적하지만 의미있는 방법으로 거의 모든 있도록 언어 설계하는 의미있는 값을, 당신은 거의 항상되지 않은 다른 효과, 의미있는 값을 식을 사용하는 방법을 사용합니다. 함수형 프로그래밍 언어는이를 수행합니다 (예 : Haskell에는 표현식이 아닌 선언이 있음).

명령형 패러다임에는 유용한 결과 값이없는 많은 공통 연산이 있고 계산이 아닌 순차적 명령어 개념이 해당 패러다임에 잘 맞기 때문에 명령문이 사용됩니다 . 프로그램의 많은 부분이 새로운 값을 계산하는 대신 변이 상태 인 경우 값을 생성 해야하는 것은 의미가 없습니다 (for 루프의 결과는 무엇입니까?). 반대로 전체 패러다임 (FP)이 값 계산을 기반으로 구축 된 경우 결과 값이없는 특이 치는 예외를 보증하지 않습니다. 대신 의미가 아닌 센티넬 결과를 제공합니다.


-1 이것은 사실이 아니다
amara

3
@sparkleshy 사실이 아닌 부분은 무엇입니까?

1
첫 번째 단락 : 당신은 진술이 유용한 반환 값을 가지고 있다는 것을 의심하지만 (많은 사람들이), 추악한 것을 제안합니다 (왜?). 두 번째 단락 : 모든 기능적 프로그래밍 언어가이 추악한 프린지 개념을 사용한다고 선언합니다. 세 번째 단락 : 거짓, 우리는 {} 블록에 이미 값이 무시되고 잘못된 문제를 일으키지 않습니다. 당신은 이미 그들에게 공허 가치의 부족을주었습니다. null이 그보다 덜 의미가 있습니까? 전체 : 이것은 사실이 아니다
amara

2
@sparkleshy-명령문에 유용한 리턴 값이 없으므로 명령문 입니다. 그것들은 할당과 같은 유용한 부작용을 가질 수 있지만 같은 것은 아닙니다. 이것은 실제로 프린지 개념이 아닙니다. Nth 학위로 가져 가면 완전히 실용적이지 않은지 잘 알려져 있습니다. 그리고 그 센티넬 값은 null이거나 void가 아니며, 둘 다 미묘하게 다른 단위 입니다. delnan이 이것을 보완하기 위해 +1.
Telastyn

4
@sparkleshy (1) 표현식 (문의 유일한 구성 요소 일 수 있음)과 명령문 (표현식이 아니며 결과 값이 없음)을 혼동 할 수 있습니다. (2) 무엇? 모든 FP 옹호자들은이를 확인하고 좋은 것이라고 주장합니다. 아니면 당신이 반대하는 "모든"부분입니까? (3) {} 블록 은 내가 말하는 것입니다 ( "순차 명령의 개념"). 문제가 발생하는 부분은 어디에 있습니까? voidnull/ 의 차이점 unit은 후자가 값이고 전달 될 수 있다는 점 void이며 , 해당 유형의 값이 없다는 점에서 특별합니다.

5

"statement"및 "expression"을 정의하는 방법에 따라 다릅니다.

매우 엄격한 정의는 "부작용이 있고 반환 값이있는 것"으로 표현과 "반환 값이 있지만 부작용을 가질 수없는 것"으로 표현을 구분합니다. 이러한 정의를 사용하면 적어도 하나의 명령문 (표현식을 평가하고 반환 값을 출력해야 함)없이 의미있는 프로그램을 작성할 수 없습니다. 순수한 표현식만으로는 프로그램 외부의 세계와 상호 작용할 수 없습니다. 불순한 부분이 언어에서 벗어나 지원 생태계로 이동하면 언어만으로도 완전히 순수 할 수 있습니다 (예 : 문장이 없음) (언어는 정의뿐만 아니라 표현도 있지만) .

그러나 표현식에서 부작용을 허용하면 명령문과 표현식의 구별이 임의적이면서 훨씬 덜 흥미로워집니다. 물론 표현식만으로 구성된 프로그래밍 언어를 발명 할 수 있습니다. 대부분의 Lisp 방언은 그런 식으로 작동합니다. 이러한 상황에서 부작용에 대한 표현식을 평가하는 것은 명령문을 실행하는 것과 거의 동일하며 이러한 언어에서는 표현식과 명령문이 동일하다고 주장 할 수 있습니다. 그러므로 명령문과 표현식의 차이점은 구문 일뿐입니다.

많은 언어들이 여전히이 구문을 구별합니다. 왜냐하면 기술적 인 이유가 아니라 가독성에 유용하기 때문입니다. 식을 만들면 반환 값에 관심이 있고 부작용이 적다는 것을 알 수 있습니다. 그것을 진술하면 독자에게 부작용을 일으킬 의도가 있으며 반환 값은 흥미 롭거나 그렇지 않을 수 있습니다.


가독성에 대한 의견은 +1입니다 ... 결국 인간은 그것을 이해해야합니다 ...
mattnz

1

ATLXtend 는 문장없이 잘 작동하는 프로그래밍 언어입니다. 많은 기능적 언어들도 문장이 없습니다. 예, 프로그래밍 언어는 문장 없이도 잘 작동 할 수 있습니다. 나는 많은 언어에서 문장이 명령형 프로그래밍의 유물이라고 생각합니다. 그것들은 널리 알려져 있기 때문에 여전히 사용되며 어떤 경우에는 코드를 더 읽기 쉽게 만듭니다.


1

예.

기능적 언어 (및 단일 할당 언어)는 모두 표현입니다. 예는 Haskal (및 SISAL)입니다. if 문과 for 루프 모두 값을 반환합니다.

다른 종류의 언어가 있습니다. 마음에 들기 쉬운 언어는 선언적 언어입니다 (문에 의존하지 않는 다른 언어도 많이 있습니다). 이 언어들은 표현이 필요하지 않습니다 (일반적으로 생각하는 것과 같은 의미로). 사실을 선언하면 여러 결과를 얻을 수 있습니다. 가장 쉬운 방법은 prolog입니다.


Haskell은 선언이 있으며, 표현이 아닙니다.
Janus Troelsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.