최신 프로그래밍 언어 개발을위한 프로세스 계산 및 PL 이론 사용


10

한동안 나는 언어 이론과 프로세스 계산법에 관심이 많았고 그것들을 연구하기 시작했다. 솔직히 말해서, 나는 경력을 쌓기 위해 신경 쓰지 않을 것입니다. 나는 이론이 엄청나게 매력적이라는 것을 안다. 내가 계속 겪고있는 한 가지 질문은 PL 이론이나 프로세스 Calculi가 현대 프로그래밍 언어 개발에서 전혀 중요하지 않은지입니다. Pi-calculus에 많은 변형이 있고 활발한 연구가 많이 있지만 필요하거나 중요한 응용 프로그램이 있습니까? 내가 묻는 이유는 프로그래밍 언어 개발을 좋아하고 진정한 목표는 이론을 사용하여 실제로 PL을 작성하는 것이기 때문입니다. 내가 쓴 것들에 대해서는 이론과 전혀 관련이 없었습니다.

답변:


9

내 대답은 실제로 Gilles를 정교화 한 것으로 내 글을 쓰기 전에는 읽지 않았다. 그럼에도 도움이 될 수 있습니다.

일반적인 프로그래밍 언어 이론과 특히 미적분학을 처리하는 두 가지 차원의 프로그래밍 언어 작업을 구별하여 귀하의 질문에 대답하려고합니다.

  • 순수한 연구.

  • 제품 중심의 연구 개발.

후자는 일반적으로 제품으로 프로그래밍 언어를 제공한다는 목표로 업계에서 발생합니다. Oracle에서 Java를 개발하고 Microsoft에서 C #을 개발하는 팀이 예입니다. 반대로 순수한 연구는 제품과 관련이 없습니다. 그 목적은 프로그래밍 언어를 본질적인 관심 대상으로 이해하고 모든 프로그래밍 언어의 기본이되는 수학적 구조를 탐구하는 것입니다.

다양한 목표로 인해 프로그래밍 언어 이론의 다양한 측면이 순수 연구 및 제품 중심의 R & D와 관련이 있습니다. 아래 그림은 중요한 부분을 알려줍니다.

여기에 이미지 설명을 입력하십시오

이 시점에서 두 차원이 왜 그렇게 다른지 그리고 어떻게 관련이 있는지 묻습니다.

핵심 통찰력은 프로그래밍 언어 연구 및 개발이 기술, 사회 및 경제의 여러 차원을 가지고 있다는 것입니다. 거의 정의상 산업은 프로그래밍 언어의 경제적 보상에 관심이 있습니다. 마이크로 소프트 등은 마음의 장점을 가지고 언어를 개발하지는 않지만 프로그래밍 언어가 경제적 이점을 제공한다고 믿기 때문에 그리고 일부 프로그래밍 언어가 성공한 이유를 심층 조사한 결과, 유사하거나 고급 기능이있는 다른 언어는 그렇지 않습니다. 그리고 그들은 단일 이유가 없다는 것을 발견했습니다. 프로그래밍 언어와 해당 환경은 복잡하므로 특정 언어를 채택하거나 무시해야하는 이유도 있습니다. 그러나 프로그래밍 언어의 성공을위한 가장 큰 요인은 이미 널리 사용되는 언어에 프로그래머를 우선적으로 첨부하는 것입니다. 사람들이 언어를 더 많이 사용할수록 라이브러리, 도구, 교재가 더 많고 프로그래머가 더 생산적입니다. 그 언어를 사용할 수 있습니다. 이것을 네트워크 효과라고도합니다. 또 다른 이유는 개인과 조직을위한 고가의 스위칭 언어입니다. 특히 경험이없는 프로그래머에게 언어를 숙달하고 친숙한 언어와의 시맨틱 거리가 크면 시간이 많이 걸리는 노력입니다. 이러한 사실을 감안할 때, 왜 새로운 언어가 전혀 매력을 느끼지 못하는가? 왜 회사가 전혀 새로운 언어를 개발합니까? 우리는 왜 Java 나 Cobol을 유지하지 않습니까? 유청이 언어를 성공시키는 데는 몇 가지 중요한 이유가 있다고 생각합니다.

  • 대체 할 기존 기업이없는 새로운 프로그래밍 영역이 열립니다. 주요한 예는 Javascript가 동시에 증가하는 웹입니다.

  • 언어 끈적임. 이것은 언어 변경의 높은 가격을 의미합니다. 그러나 때때로 프로그래머는 다른 분야로 옮겨 가면서 프로그래밍 언어를 사용하여 새로운 분야의 구 언어로 성공합니다.

  • 심각한 재정적 화력을 가진 대기업에 의해 언어가 추진됩니다. 얼리 어답터는 몇 년 후에도 언어가 계속 지원 될 것이라고 합리적으로 확신 할 수 있기 때문에 이러한 지원은 채택 위험을 줄입니다. 이에 대한 좋은 예는 C #입니다.

  • 언어에는 매력적인 도구와 생태계가 함께 제공 될 수 있습니다. 여기에도 C #이 있으며 .Net 및 Visual Studio 에코 시스템을 예로들 수 있습니다.

  • 오래된 언어는 새로운 기능을 선택합니다. Java는 각 반복마다 함수형 프로그래밍 전통에서 더 좋은 아이디어를 얻습니다.

  • 마지막으로, 새로운 언어는 본질적인 기술적 인 장점을 가질 수 있습니다. 예를 들어 표현력이 뛰어나고 구문이 좋으며 오류가 더 많은 타이핑 시스템 등이 있습니다.

이러한 배경을 고려할 때 순수한 프로그래밍 언어 연구와 상용 프로그래밍 언어 개발 사이에 약간의 분리가 있다는 것은 놀라운 일이 아닙니다. 특히 대규모 소프트웨어의 경우 소프트웨어 구성 및 진화를보다 효율적으로 만드는 것을 목표로하지만, 산업 프로그래밍 언어 작업은 중요한 대중에 도달하고 네트워크 효과를 얻기 위해 빠른 채택을 촉진하는 데 더 관심이 있어야합니다. 이것은 일하는 프로그래머가 관심을 갖는 것에 초점을 둔 연구로 이어진다. 이는 라이브러리 가용성, 컴파일러 속도, 컴파일 된 코드 품질, 이식성 등과 같은 경향이 있습니다. 우리가 오늘날 실천하는 프로세스 미적분학은 주류 프로젝트를 수행하는 프로그래머에게는 거의 쓸모가 없습니다 (비록 미래에 그것이 바뀔 것이라고 믿지만).

λπβ-기능 프로그래밍 감소, 논리 프로그래밍 해상도 / 통일, 동시 계산을위한 이름 전달). 스칼라와 같은 언어가 실행 가능한 전체 유형 유추를 가질 수 있는지 이해하기 위해 JVM에 대해 걱정할 필요가 없습니다. 실제로 JVM에 대한 생각은 형식 유추에 대한 더 나은 이해를 방해합니다. 그렇기 때문에 작은 코어 계산으로 계산을 추상화하는 것이 중요하고 강력한 이유입니다.

따라서 프로그래밍 언어 연구를 사람들이 장난감을 가지고 노는 거대한 샌드 박스라고 생각할 수 있으며, 특정 장난감을 가지고 놀 때 재미있는 것을 발견하고 장난감을 철저히 조사한 경우, 재미있는 장난감이 주류 산업 수용을 향한 긴 행진을 시작합니다 . 프로그래밍 언어 연구원이 처음으로 발명 한 언어 기능이 널리 받아 들여지기까지 수십 년이 걸리기 때문에 오래 전진한다고 말합니다. 예를 들어 가비지 수집은 1950 년대에 고안되었으며 1990 년대에 Java에서 널리 사용 가능해졌습니다. 패턴 매칭은 1970 년으로 거슬러 올라가며 스칼라 이후로만 널리 사용됩니다.

프로세스 미적분학은 특히 흥미로운 장난감입니다. 그러나 철저히 조사하기에는 너무 새롭습니다. 10 년간의 순수한 연구가 필요합니다. 현재 프로세스 이론 연구에서 진행되고있는 것은 프로그래밍 언어 연구, (순차적) 유형 이론의 가장 큰 성공 사례 하나를 취하고 메시지 전달 동시성에 대한 유형 이론을 개발하는 것입니다. Hindley-Milner와 같이 순차적 프로그래밍을위한 적당한 표현력의 타이핑 시스템은 이제 잘 이해되고 있으며 어디에나 있으며 작업 프로그래머들에 의해 수용되고 있습니다. 동시 프로그래밍을 위해 적당히 표현적인 유형을 원합니다. 이것에 대한 연구는 1980 년대 Milner, Sangiorgi, Turner, Kobayashi, Honda 등과 같은 선구자들에 의해 시작되었습니다. 선형 논리에서 비롯된 선형성 개념에 기반을 둔 명시 적 또는 암시 적 개념에 근거합니다. 지난 몇 년 동안 활동이 크게 증가했으며 앞으로도 계속 상승 할 것으로 예상됩니다. 또한 프로세스 미적분학을 훈련받은 젊은 연구자들이 산업 R & D 연구소에서 근무하고 CPU와 컴퓨터 아키텍처가 진화했기 때문에 실제적으로 제품 중심의 R & D로이 작업이 시작되기를 기대합니다. 순차적 형태의 계산에서.

요약하자면, 프로세스 미적분학과 같은 최첨단 프로그래밍 언어 이론이 자신의 언어 작성 작업에 유용하지 않다고 걱정하지 않을 것입니다. 최첨단 이론이 현재 프로그래밍 언어의 문제를 해결하지 않기 때문입니다. 미래 언어에 관한 것입니다. '실제 세계'가 따라 잡는 데 다소 시간이 걸립니다. 오늘날 언어를 구축하는 데 사용하는 지식은 과거의 프로그래밍 언어 이론입니다. 프로세스 미적분학에 대한 자세한 내용은 이론적 컴퓨터 과학에서 가장 많이 사용되는 영역 중 하나이기 때문에 권장됩니다.


1
와! 다이어그램을 만드는 데 시간이 얼마나 걸렸으며 나중에 사용할 수 있습니까?
코디

1
@cody OmniGraffle을 사용하여 몇 초가 걸리므로 자유롭게 사용하십시오.
Martin Berger

8

프로그래밍 언어 디자인의 과학은 초기 단계에 있습니다. 이론 (프로그램의 의미와 언어의 표현성에 대한 연구)과 경험주의 (프로그래머가 관리하거나 관리하지 않는)는 언어를 디자인 할 때 여러 가지 질적 인 주장을합니다. 그러나 결정해야 할 양적 이유는 거의 없습니다.

실질적인 프로그래밍 언어로 혁신을 사용할 수있을 정도로 이론이 안정화되는 시간과이 혁신이 "주류"언어로 나타나기 시작하는 시간 사이에는 지연이 있습니다. 예를 들어 가비지 수집 기능이있는 자동 메모리 관리는 1960 년대 중반에 산업 용도로는 성숙했지만 1995 년 Java에서만 주류에 도달했다고 말할 수 있습니다. 파라 메트릭 다형성은 1970 년대 후반에 잘 이해되어 만들어졌습니다. 200 년대 중반 자바로 연구원 경력의 규모에서 30 년은 오랜 시간입니다.

언어의 광범위한 산업적 채택은 사회 학자들이 연구해야 할 문제이며 과학은 훨씬 초기 단계에 있습니다. 시장 고려 사항은 중요한 요소입니다. Sun, Microsoft 또는 Apple이 언어를 사용하는 경우 이는 많은 POPL 및 PLDI 용지보다 훨씬 많은 영향을 미칩니다. 선택을하는 프로그래머라도 언어 설계보다 라이브러리 가용성이 훨씬 중요합니다. 언어 디자인이 중요하지 않다는 것은 말할 나위도 없습니다. 잘 디자인 된 언어를 갖는 것은 안도감입니다! 그것은 단지 결정적인 요소가 아닙니다.

프로세스 미적분학은 여전히 ​​이론이 안정화되지 않은 단계에 있습니다. 우리는 순차적 계산을 이해한다고 믿습니다. 순차적 계산이라고 부르는 모든 모델은 동일합니다 (교회-투어링 논문). 이것은 동시성을 유지하지 못합니다. 다른 프로세스 계산법은 표현력에 미묘한 차이가있는 경향이 있습니다.

프로세스 미적분학은 실질적인 영향을 미칩니다. 서버와 통신하는 클라이언트, 다른 서버와 통신하는 서버 등 많은 계산이 분산되어 있습니다. 로컬 컴퓨팅조차도 여러 프로세서에 대한 병렬 처리를 활용하고 환경 동시성 (독립 프로그램과의 통신)에 반응하기 위해 종종 멀티 스레딩됩니다. 사용자와 함께).

더 나은 소프트웨어를 만들기 위해 연구 발전이 필요합니까? 결국 하늘에있는 파이에서 파이 미적분을 알 수없는 10 억 달러 규모의 산업이 있습니다. 다시, 그 산업은 버그를 수정하는 데 수십억 달러를 소비합니다.

“필요할 것”은 결코 가치있는 연구가 아닙니다. 장기적인 결과를 미리 예측하는 것은 불가능합니다. 더 나아가서 어떤 연구가 언젠가 결과를 초래할 것이라는 안전한 가정이라고 말하고 싶습니다. 우리는 그 날이 내년에 올 것인지 또는 다음 천년에 올 것인지 알 수 없습니다.


3

Pi-calculus에 많은 변형이 있고 활발한 연구가 많이 있지만 필요하거나 중요한 응용 프로그램이 있습니까?

내가 묻는 이유는 프로그래밍 언어 개발을 좋아하고 진정한 목표는 이론을 사용하여 실제로 PL을 작성하는 것이기 때문입니다. 내가 쓴 것들에 대해서는 이론과 전혀 관련이 없었습니다.

까다로운 질문입니다! 나는 당신에게 나의 개인적인 의견을 말할 것이며, 이것이 나의 의견 이라고 강조합니다 .

나는 pi-calculus가 동시 프로그래밍의 표기법으로 직접 적합하다고 생각하지 않습니다. 그러나 동시 프로그래밍 언어를 디자인하기 전에 반드시 공부 해야한다고 생각합니다 . 그 이유는 pi-calculus가 저수준을 제공하지만 중요하게는 구성 적이라는 것입니다! --- 동시성 계정. 결과적으로 원하는 모든 것을 표현할 수 있지만 항상 편리하지는 않습니다.

이 의견을 설명하려면 유형에 대해 약간 생각해야합니다. 첫째, 유용한 프로그래밍 언어는 일반적으로 추상화를 구축하기 위해 일종의 징계가 필요합니다. 특히 소프트웨어를 빌드 할 때 절차 적 추상화를 사용하려면 일종의 함수 유형이 필요합니다.

이제 pi-calculus의 자연 형 규칙은 고전 선형 논리의 변형입니다. 예를 들어, 간단한 동시 프로그램을 선형 논리의 제안 증명으로 해석하는 방법을 보여주는 Abramsky 논문의 Process Realizability 를 참조하십시오 . (문헌에는 pi-calculus 프로그램을 입력하기위한 세션 유형에 대한 많은 작업이 포함되어 있지만 세션 유형과 선형 유형은 매우 밀접한 관련이 있습니다.)

ABAB

이것은 POV 유형 이론에서 잘 보이지만 프로그래밍 할 때 어색합니다. 그 이유는 프로그래머가 함수 호출뿐만 아니라 호출 스택을 관리하기 때문입니다. 실제로 람다 미적분을 pi 미적분으로 인코딩하면 일반적으로 CPS 변환처럼 보입니다. 이제는 타이핑하면 절대로 이것을 망칠 수 없지만 그럼에도 불구하고 프로그래머에게는 많은 부기가 필요합니다.

이것은 동시성 이론의 고유 한 문제는 아닙니다. mu-calculus는 call / cc와 같은 순차 제어 연산자에 대한 좋은 증거 이론적 설명을 제공하지만 스택을 명시 적으로 만드는 가격으로 인해 어색한 프로그래밍 언어가됩니다.

따라서 동시 프로그래밍 언어를 디자인 할 때는 원시 pi-calculus보다 더 높은 수준의 추상화를 사용하여 언어를 디자인해야하지만 합리적인 유형의 프로세스 미적분으로 깨끗하게 번역해야합니다. (최근의 좋은 예는 Tonhino, Caires 및 Pfenning의 고차 주문 프로세스, 기능 및 세션 : Monadic 통합 입니다.)


어떤 의미에서 -calculus 에서 호출 스택을 관리해야 합니까? 이는 Millam 의 를 로 인코딩 하고 새로운 Van Bakel / Vigliotti 인코딩에서도 자동으로 발생합니다 . 함수는 -calculus 에서 완벽하게 훌륭한 형태의 구문 설탕입니다 . λ π ππλππ
Martin Berger

또한 -calculus는 call / cc와 같은 순차 제어 연산자에 대한 어색한 설명입니다. 이러한 연산자는 -caluclus 로 훨씬 쉽고 자연스럽게 표현됩니다. 점프는 분명히 메시지 전달 형식이기 때문입니다. -calculus에는 자연스럽게 이동할 수있는 이름 개념이 없으므로 기능 응용 프로그램으로 코드를 작성하거나 추가 항목을 추가해야합니다. π λλμπλ
Martin Berger

함수에 대한 유익한 생각 중 하나는 함수가 클라이언트-서버 상호 작용이며 리턴 채널이 적절하고 서버 채널이 복제된다는 것입니다. 이것은 쉽게 입력 할 수 있습니다. 세션 유형은 적용하는 상호 작용에 대한 제약 조건이 약간 약하기 때문에이를 완전히 포착하지 못합니다.
Martin Berger

물론 모든 것은 원시 -calculus 보다 원시 -calculus 로 프로그래밍하고 싶지 않습니다 . 두 형식주의는 우리가 다른 것의 독점에서 계산의 일부 특징에 집중할 수있게 해주는 단순화입니다. λπλ
Martin Berger

@MartinBerger : 나는 당신이 대답하도록 설득하기를 바랐습니다! raw 로 프로그래밍하고 함수를 사용하려면 Milner 번역 이미지에있는 용어를 작성해야하므로 "스택 관리"를 수행해야합니다. 본질적으로 연속과 명시 적 대체를 관리한다는 의미입니다. (여담으로, 나는 밴 Bakel / Vigliotti 용지에 대해 알고하지 않았다 - 감사합니다!)π
닐 Krishnaswami에게

1

당신은 " 진정한 최종 목표 는 이론을 사용하여 실제로 PL을 구축하는 것 "이라고 말합니다 . 다른 목표가 있다는 것을 인정할 것입니다.

제 관점에서, 이론의 제 1의 목적은 기존의 프로그래밍 언어와 그 언어로 작성된 프로그램에 대해 추론 할 수있는 이해를 제공하는 것입니다. 여가 시간에는 Lisp에서 오래 전 작성된 이메일 클라이언트 인 대규모 소프트웨어를 유지 관리합니다. Hoare 논리, 분리 논리, 데이터 추상화, 관계형 매개 변수 및 문맥 상 등가와 같은 내가 알고있는 모든 PL 이론은 일상적인 작업에 유용합니다. 예를 들어, 새로운 기능으로 소프트웨어를 확장하는 경우 원래 기능을 그대로 유지해야한다는 것을 알고 있습니다. 즉, 새로운 기능을 수행하더라도 이전의 모든 컨텍스트에서 동일한 방식으로 작동해야합니다 새로운 맥락. 문맥 상 동등성에 대해 전혀 모른다면 아마도 그런 식으로 문제를 구성 할 수도 없을 것입니다.

pi-calculus에 대한 귀하의 질문에 따르면, pi-calculus는 여전히 언어 디자인에서 응용 프로그램을 찾기에는 너무 새롭습니다. pi-calculuswikipedia 페이지에는 pi-calculus를 사용하는 언어 디자인으로 BPML 및 occam-pi가 언급되어 있습니다. 그러나 이전 CCS 페이지와 CSP와 같은 다른 프로세스 계산법, 많은 계산 언어 설계에 사용 된 계산법 및 기타 계산법을 볼 수도 있습니다. Sangiorgi and Walker 책 의 "Objects and pi-calculus"섹션에서 pi-calculus가 기존 프로그래밍 언어와 어떤 관련이 있는지 확인할 수도 있습니다.


0

나는 야생에서 프로세스 미적분학의 실제 구현을 찾고 싶습니다 :) (이론에 대해 읽는 것 외에도).

  1. Clojure 비동기 채널은 CSP를 기반으로합니다. http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html
  2. Golang 또한 CSP에 따라 채널이 있습니다 (이것은 내가 생각 Clojure에 대한 리치 키스 마크 야 영감) : http://www.informit.com/articles/printerfriendly/1768317
  3. scala (아래 첨자)에 대한 ACP 기반 확장을 만든 사람이 있지만 링크를 게시 할만 큼 평판이 좋지 않습니다 ...

기타

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