스택 기반 프로그래밍 언어가 동시에 가능할 수 있습니까?


14

FORTHCat 과 같은 스택 기반 프로그래밍 언어에 대해 읽었 으며 그 특성상 패러다임에 관계없이 한 번에 하나의 작업 만 실행할 수있는 것 같습니다 (FORTH는 필수이지만 Cat은 기능적임).

명령형 언어는 스택을 수정하고 Joy 와 같은 순전히 기능적인 언어 는 새 스택을 반환하지만 요점은 한 번에 하나의 스택 만 사용된다는 것입니다.

그렇다면 스택 기반 프로그래밍 언어를 동시에 사용할 수 있습니까? 동시에 여러 스택을 사용하거나 비슷한 것을 사용하여 동시성을 달성 할 수 있습니까?

스택 기반 프로그래밍 언어로 지연 평가를 구현할 수 있습니까?

위에 언급 된 언어와 개념에 대해 오해가 있으면 수정 해주세요


5
어떻게 할 수 있는 필수 언어가 동시 수?
Bergi


동시성 (독립적이지 않고 독립적 인 스택과 공유 메모리로 실행되는 여러 스레드를 사용하는 것) 또는 병렬 처리를 의미합니까?
Daniel Jour

@DanielJour 잘 이해한다면 병렬 처리는 동시 실행을 의미하고 동시성은 독립적 실행을 의미하므로 동시성을 의미합니다. 각 스레드의 독립 스택에 대해 더 자세히 설명해 주시겠습니까?
Armando H.

답변:


16

그렇다면 스택 기반 프로그래밍 언어를 동시에 사용할 수 있습니까?

확실한.

동시에 여러 스택을 사용하거나 비슷한 것을 사용하여 동시성을 달성 할 수 있습니까?

이미 일반 언어의 경우 다중 스레딩은 일반적으로 여러 "호출"스택을 의미합니다. 각 스레드에 자체 데이터 스택을 제공하는 것은 완전히 당연합니다. 예를 들어, 액터가 스택 기반 언어로 코드로 구현 된 액터를 갖는 것이 간단합니다. GHC의 par주석에 대한 명백한 병렬 처리는 합리적으로 간단해야합니다. 병렬로 실행하는 주요 문제는 코드를 실행할 때까지 코드의 스택 효과가 무엇인지 알 수 없다는 것입니다. 그러나 Joy와 같은 구문을 사용하면 [a b c] par실행으로 상상할 수 있습니다.a b c빈 스택 또는 스택 사본에 대해 완료시 스택의 최상위 요소 만 유지하거나 스택이 비어있는 경우 더미 값을 푸시합니다. 변형을 상상할 수 있습니다. 암시적인 병렬 처리는 순전히 기능적인 언어와 비교할 때 순진하게하기가 더 어려울 것이지만, 확실히 할 수도 있습니다. 사용자 정의 결합기의 컴파일 된 코드는 종종 "일반"코드와 크게 다르지 않습니다.

스택 기반 프로그래밍 언어로 지연 평가를 구현할 수 있습니까?

알 수없는 스택 효과는 다시 까다로운 부분입니다. 모든 스택 효과를 정적으로 결정할 수 있도록 언어를 디자인하면 그리 어렵지 않습니다. 게으름이 명시 적이라면 비교적 단순 해 보이며 Joy의 인용문과 거의 비슷하게 보일 것 i입니다. 게으른 연결 언어 라고 부르는 한 언어 는 내가 말할 수있는 것에서 위의 두 가지 접근법을 혼합하여 사용하는 것 같습니다. 나는 암묵적으로 게으른 연결 언어가 역동적 스택 효과에 직면하여 적어도 모호하게 사용 가능한 방식으로 작동하는 방법을 실제로 보지 못하지만 내 상상력이 부족할 수 있습니다.

또한 스택 기반 언어가 여러 스택을 갖는 것은 드문 일이 아닙니다. 예를 들어 Forth에는 임의의 데이터를 배치 할 수있는 데이터 스택과 반환 스택이 있습니다.


8

나는 FORTH에 대해 조금 알고 있으므로 그것에 국한 할 것입니다. 저수준 언어이므로 프로그래머가 모든 하드웨어 리소스에 액세스 할 수 있습니다. 그래서 당신은 당신이 원하는대로 할 수 있습니다.

동시성

병렬 프로그램 (편집 : 실제 동시 프로그램을 말하는 데 사용)을 갖기 위해서는 적어도 두 개의 실행 장치 (CPU-s)가 필요합니다. 예를 들어 "이 두 개의 인수를 사용하여 프로세서 2에서이 단어를 실행하십시오"라는 단어를 FORTH로 구현하는 것은 사소한 일입니다. 워드는 프로세서 2에 필요한 두 개의 스택을 할당하고 워드를 실행하기 시작합니다. 해당 프로그램에서 사용할 수있는 구문을 정확히 제한해야합니다.

동시 프로그램 수가 실행 단위 수보다 많으면 "의사 병렬"프로그램을 사용하게됩니다. 기본적으로 두 가지 방법이 있습니다 : 코 루틴 또는 선점 형 멀티 태스킹. 어쨌든 이것을 달성하는 방법은 가능하지만 (쉽지 않지만 문헌에 잘 설명되어 있음) FORTH를 사용하면 필요한 모든 저수준 항목에 액세스 할 수 있습니다.

게으른 평가

물론 모든 프로그래밍 언어 에서처럼 FORTH 에서이 작업을 수행 할 수 있습니다. Haskell처럼 우아하거나 "내장 된"것은 아닙니다. 나는 매우 순진한 예를 사용할 것입니다.

아이디어는 일련의 항목을 리턴하는 "함수"(여기서 느슨하게 사용됨)를 정의하는 것입니다. 예를 들어 모든 정수를 반환하는 함수가 있습니다. 그런 다음이 세트에서 작업을 수행하고 완료되면 결과를 제공합니다. 예를 들어, 합계가 1000보다 클 때까지 모든 정수의 합계를 계산할 수 있습니다. 지연이없는 평가는 먼저 모든 정수를 세트로 할당합니다. 이는 무한한 정수가 있으므로 불가능합니다. 그런 다음이 세트에서 작업을 시작합니다. 게으른 구현에는 "세트의 다음 값을 제공"하는 방법이 있습니다. 이 작업을 수행하려면 "마지막 값 제공"기능에 변수가 하나만 필요합니다.

하스켈은 이런 식으로 일을합니다. 물론 더 복잡한 상황을 처리하지만 아이디어는 동일합니다. 프로그래머가 문제를 해결하는 방법이 아니라 문제에 집중할 수 있도록 평가합니다.


4
"실제 동시 프로그램을 사용하려면 최소한 두 개의 실행 단위가 필요합니다". 이것은 단지 구현 문제입니다. 프로그래밍 언어 관점에서 볼 때 단일 CPU에서 실행되는 두 개의 스레드 또는 두 개의 스레드 사이에는 거의 차이가 없습니다. 어떤 의미에서, 각 스레드는 자체의 '실행 단위'로 간주 될 수 있습니다.
이산 도마뱀

1
때로는 묵시 정보를 고려해야합니다. 한 예는 실제 컴퓨터 외부의 실제 세계와 인터페이스 할 때입니다. "올바른 정답이 너무 늦다"에 따라 실시간으로 두 개의 실행 장치에서 실행되는 것을 하나의 장치에서 혼합 된 실행과 비교할 때 타이밍이 다를 수 있습니다.
ghellquist

때때로 우리는. 그러나 나는 이것이 그런 경우가 아니라고 생각합니다. 예를 들어, 질문에는 실시간 예약 요구 사항이 언급되어 있지 않습니다.
이산 도마뱀

3
"병행 성"! = "병렬". 단일 CPU 시스템에서 실행중인 여러 스레드는 병렬 처리가 수행되지 않더라도 서로 동시에 실행된다고 말할 수 있습니다.
Solomon Slow

동시성 대 병렬 처리에 대한 요점. 나는 텍스트를 바꿀 것이다.
ghellquist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.