표준 언어 표현을 구축하는 일반적인 복잡성은 무엇입니까?
-
06-07-2019 - |
문제
언어를 정식으로 표현하는 것이 종종 편리합니다 (제 경우에는 일반적으로 도메인 특정 언어입니다). 그러나 나는 해당 언어의 임의의 프로그램을 위해 정식 형태를 결정 및/또는 만들 수 있는지 여부를 결정하는 관련 언어의 표현성에 엄격한 한계가 있다고 생각합니다. 불행히도, 나는 이것에 대해 읽는 것을 기억한다는 언급을 찾을 수 없었습니다.
한편으로, 언어의 표준 표현을 만드는 것은 많은 어려운 그래프 문제 (예 : 그래프 아이모 르프)와 비슷한 복잡성이지만 다른 한편으로는 IIRC, GCC, YHC 및 GHC와 같은 컴파일러가 중간 표현을 사용하는 것이 합리적입니다. 다양한 형식 (어셈블리, JavaScript 등)으로 출력을 생성하려면 적어도 일부 형태로 해결 된 문제입니다.
주어진 언어에 대한 표준 형태를 결정 / 생성 할 수 있습니까? (언어가 얼마나 표현력이 있고 언어 표현력이 표준 형태의 유용성에 어떤 영향을 미칩니 까?) 가능한 경우 참조 또는 증거를 제공하십시오.
편집하다: 예를 들어, a 일반 언어 (예 : '순수한'형태의 정규 표현)는 튜링-완성 언어 할 수 있다. 다시 말해, 일반 언어로 웹 서버를 쓸 수는 없지만 Lambda Calculus로 할 수 있습니다). 저의 질문은 이론적 가능성에 관한 것이며 복잡성 이론과 관련된 구체적인 대답이 있습니다. 다른 시스템으로 전송 해야하는 DSL이있는 경우, 두 개의 다른 시스템이 사용하는 독립적 인 표현을 분리하기 때문에 해당 코드의 표준 형태를 생성하는 것이 좋습니다. 하지만, P- 공간이 완료되거나 NP가 튜링에 완료 된 언어를 표준 형태로 변환하는 경우, 정식 형태를 구축하는 데 시간을 낭비해서는 안됩니다. 언어 복잡성 ~할 수 있다 다항식 시간에 표준화됩니다.
해결책
"표준 표현"에 의해 다음을 의미한다고 가정합니다. 전화 프로그램 피 그리고 큐 동등한 그들이 같은 입력에서 "똑같은 일"을한다면. "동일한 일을하는"것은 프로그램이 동일한 출력을 가지고 있으며, 두 프로그램 모두 유한 한 시간 후에 또는 두 프로그램이 모두 무한 루프에 들어갑니다. 이 동등성 관계는 모든 프로그램 세트에서 동등성 클래스를 정의합니다. 프로그램의 "표준 표현" 피 프로그램입니다 피' 동일한 동등성 클래스에 속하며 동일한 동등성 클래스의 모든 구성원이 동일한 표준 표현을 갖도록 요구합니다.
Turing-Complete Languages의 경우 Turing Computible Canonical 표현을 통해 중단 문제 다음과 같이 : 먼저 무한 루프로 구성된 프로그램을 작성하고 정식 표현을 찾으십시오. 큐. 그런 다음 모든 입력 프로그램에 대해 피, 먼저 기계적으로 프로그램으로 변환하십시오 피0 그것은 출력이 없다는 것을 제외하고는 같은 일을하고 정식 표현을 찾습니다. 피0이 프로그램의. 결과가 있다면 큐, 당신은 그것을 알고 있습니다 피0 멈추지 않으므로 어느 것도 마찬가지입니다 피. 그렇지 않으면, 피0 중단됩니다 피.
더 재미 있으려면 일부를 읽으십시오 그레고리 차이틴 그가 "우아한"프로그램이라고 부르는 것에 대해 작업하십시오.
다른 팁
어셈블리 언어로 컴파일하는 것이 실용적인 방식으로 정식 형태로 번역 될 수있는 것 같습니다.