셰익스피어 (프로그래밍 언어)

셰익스피어 프로그래밍 언어()는 Jon Åslund와 Karl Hasselström이 만든 난해한 프로그래밍 언어이다. 이 언어의 특징은 프로그램의 코드가 윌리엄 셰익스피어의 연극처럼 보인다는 것인데, 그 이유는 Chef 프로그래밍 언어처럼 소스 코드가 소스 코드처럼 보이지 않도록 설계되었기 때문이다.

프로그램의 시작 부분에 위치하는 등장인물 리스트는 여러 개의 스택을 선언하며, 등장인물의 이름은 당연히 "로미오"나 "줄리엣"같은 이름이다. 이 캐릭터들은 함께 대화에 등장하는데, 이 대화에서 캐릭터들은 서로의 최상위 값을 수정하거나, push나 pop 연산을 수행하거나, 입출력을 수행한다. 이 캐릭터들은 서로에게 질문을 할 수 있으며, 질문은 조건문으로서 기능한다. 전체적으로 보았을 때, 이러한 프로그래밍 모델은 어셈블리어와 아주 유사하나 훨씬 장황하다.

 문법 

 제목 
셰익스피어 프로그램의 첫번째 줄부터 첫번째 마침표까지를 "제목"이라고 하며, 이는 주석으로 간주된다.

 등장인물 
제목의 다음 부분은 변수가 선언되는 곳이다. 각 변수는 부호 있는 정수를 가지며, 다음과 같이 선언된다.
 Name, Description
여기서 Name 은 변수의 이름을 나타내며, Description 은 무시된다. 컴파일러는 실제 셰익스피어 극에 등장한 인물의 이름만을 인식한다.

 막과 장 
셰익스피어 언어로 작성된 코드는 "막"으로 구성되며 막은 "장"을 포함하고 있다. 장에서는 캐릭터들 (즉, 변수들) 이 상호작용한다. 각각의 막과 장에는 로마 숫자가 매겨지고, 이는 GOTO 레이블로서 기능한다. 콜론 이후의 코드는 주석으로 간주된다. 막과 장은 다음과 같이 선언된다.
 Act I: Hamlet's insults and flattery.

 Scene I: The insulting of Romeo.

 등장, 퇴장, 그리고 단체 퇴장 
개개의 줄은 일반적으로 한 캐릭터가 다른 캐릭터에게 말하는 대사의 형식을 가지고 있다. 이러한 "대화"를 통해 변수 (즉, 말을 듣고 있는 캐릭터)의 값이 할당되거나, 변경되거나, 혹은 출력된다. 캐릭터는 오직 "You", "Thou", 혹은 "Thee"로서만 지칭될 수 있다. 따라서, 일반적으로 대화가 이루어질 때는 반드시 정확히 두 명의 캐릭터가 "무대 위에" 있어야 한다. 요컨대, 한 명은 말을 하고, 다른 한 명은 그 말을 듣고 있다. 변수를 무대 위에 등장시키기 위해서는 Enter 명령이 한 명 이상의 캐릭터의 리스트와 함께 사용된다. Exit 명령은 정확히 한 명의 명시된 캐릭터를 무대에서 퇴장하게 한다. Exeunt 명령은 두 명 이상의 캐릭터를 퇴장시킨다. 만약 Exeunt 명령에 캐릭터의 리스트가 주어지지 않는다면, 모든 캐릭터가 무대에서 퇴장한다. 예시를 들자면 다음과 같다.
 [Enter Juliet]
 [Enter Romeo and Juliet]
 [Exit Romeo]
 [Exeunt Romeo and Juliet]
 [Exeunt]

 대사 
대사는 한 캐릭터가 말하는 대화로 표현되며 적어도 하나의 문장으로 이루어진다. 각각의 문장은 변수에 새로운 값을 할당하거나, 변수가 자신의 값을 출력하게 하거나, 혹은 변수가 입력을 받게 한다. 또한 대사는 스택을 조작하거나 if/then 혹은 goto 문으로서 기능한다. 하나의 대사는 캐릭터의 이름과 콜론으로 시작된다. 대사에서 사용된 캐릭터가 말하는 사람이기 때문에, 무대 위에 있는 다른 캐릭터가 "You", "Thou", 혹은 "Thee"로 지칭되는 변수가 된다.

 상수 그리고 값의 할당 
상수는 명사와 형용사의 조합으로 표현된다. 셰익스피어 언어는 각각의 유한한 리스트를 인식하며, 각 리스트는 긍정적인 성질, 부정적인 성질, 그리고 중립적인 성질을 가지고 있는 것으로 분류된다. 긍정적이거나 중립적인 명사는 1의 값을 가지며 부정적인 명사는 -1의 값을 가진다. 임의의 형용사는 명사에 2를 곱하며, 여러 개의 형용사가 사용될 수 있다. 소유대명사는 파서가 무시하는 반면, 기본적인 산술에 관련된 단어들은 연산자로서 인식된다. 그러한 단어들에는 "sum", "quotient", 그리고 "cube"가 있다. 캐릭터에 값을 할당하는 문장은 "You", "Thou", 혹은 "Thee"로 시작하며, 그 뒤에 "are as [임의의 형용사] as" 가 뒤따를 수 있고, 그리고 나서 새로운 값을 위해 명사, 형용사, 변수, 그리고 연산자로 이루어진 수학식으로 종료된다. 이러한 대사들의 예시는 다음과 같다.
 Hamlet:
 You lying stupid fatherless big smelly half-witted coward!

 Juliet:
 You are as villainous as the square root of Romeo!
한편, 수학식은 다른 캐릭터의 이름을 (그 캐릭터가 무대 위에 있지 않더라도) 사용하여 그 캐릭터의 현재 값을 계산에 사용할 수 있다. 또한 "yourself"나 "thyself"를 사용하여 대사를 듣고 있는 캐릭터의 값에도 접근할 수 있다.

 입력 및 출력 
대사는 변수로 하여금 출력하거나 입력을 받도록 할 수 있다. "Open your heart" 는 변수의 값을 숫자로 출력하는 반면, "Speak your mind" 는 상응하는 ASCII 문자를 출력한다. "Listen to your heart" 혹은 "Open your mind" 는 변수로 하여금 사용자로부터 입력을 받게 한다. 전자는 숫자를 받으며 후자는 문자를 받는다.

 조건문과 goto 
if/then 문은 캐릭터가 제기한 질문으로서 표현된다. "as [임의의 형용사] as" 는 두 변수가 같은 값을 가지는지를 검사하는 반면, "better" 와 "worse" 는 각각 한 변수가 다른 변수보다 큰지 혹은 작은지를 나타낸다. 이어지는 대사는 "if so" 혹은 "if not" 으로 시작하며, 제시된 조건의 진리치에 따라 무엇이 일어날지를 결정한다. goto 문은 "Let us", "We shall", 혹은 "We must" 로 시작하며, "return to" 혹은 "proceed to" 가 뒤따르고 나서 한 개의 막이나 장이 주어진다. 장의 경우, 현재 막에 있는 장으로서 해석된다. goto 문은 다른 막에 있는 장을 호출할 수 없다. goto 문을 호출하는 조건문의 예시는 다음과 같다.
 Juliet:
 Am I better than you?

 Hamlet:
 If so, let us proceed to scene II.

 스택 연산 
각각의 변수는 스택이다. 만약 대사가 "Remember me" 혹은 "Remember yourself" 와 같이 캐릭터에게 적절한 값을 "기억"하게 하면 그 변수의 스택에 정수가 push된다. 만약 캐릭터가 "회상"하라는 말을 들으면, 해당 스택의 최상위 값이 pop된다. (즉, 변수는 그 값을 가지게 된다.) 이러한 대사 뒤에 오는 모든 단어는 주석으로 간주된다.

 예시 코드 
다음은 표준적인 "Hello, World!" 프로그램이다.

이 프로그램은 위 문자열을 이루는 각각의 문자에 대한 ASCII 값을 생성하고 그것을 "Speak your mind" 명령을 사용해 출력한다. 예를 들어, 햄릿이 말하는 첫번째 대사는 산술 연산자의 조합을 사용해 십진수 값 72 (이진수 1001000) 를 다른 주인공인 로미오에게 할당하며, 이는 ASCII 코드에서 문자 'H'에 해당한다.Do Not Adieu, a play in two acts.

Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.

 Act I: Hamlet's insults and flattery.

 Scene I: The insulting of Romeo.

[Enter Hamlet and Romeo]

Hamlet:
 You lying stupid fatherless big smelly half-witted coward!
 You are as stupid as the difference between a handsome rich brave
 hero and thyself! Speak your mind!

 You are as brave as the sum of your fat little stuffed misused dusty
 old rotten codpiece and a beautiful fair warm peaceful sunny summer's
 day. You are as healthy as the difference between the sum of the
 sweetest reddest rose and my father and yourself! Speak your mind!

 You are as cowardly as the sum of yourself and the difference
 between a big mighty proud kingdom and a horse. Speak your mind.

 Speak your mind!

[Exit Romeo]

 Scene II: The praising of Juliet.

[Enter Juliet]

Hamlet:
 Thou art as sweet as the sum of the sum of Romeo and his horse and his
 black cat! Speak thy mind!

[Exit Juliet]

 Scene III: The praising of Ophelia.

[Enter Ophelia]

Hamlet:

 Thou art as beautiful as the difference between Romeo and the square
 of a huge green peaceful tree. Speak thy mind!

 Thou art as lovely as the product of a large rural town and my amazing
 bottomless embroidered purse. Speak thy mind!

 Thou art as loving as the product of the bluest clearest sweetest sky
 and the sum of a squirrel and a white horse. Thou art as beautiful as
 the difference between Juliet and thyself. Speak thy mind!

[Exeunt Ophelia and Hamlet]

 Act II: Behind Hamlet's back.

 Scene I: Romeo and Juliet's conversation.

[Enter Romeo and Juliet]

Romeo:
 Speak your mind. You are as worried as the sum of yourself and the
 difference between my small smooth hamster and my nose. Speak your
 mind!

Juliet:
 Speak YOUR mind! You are as bad as Hamlet! You are as small as the
 difference between the square of the difference between my little pony
 and your big hairy hound and the cube of your sorry little
 codpiece. Speak your mind!

[Exit Romeo]

 Scene II: Juliet and Ophelia's conversation.

[Enter Ophelia]

Juliet:
 Thou art as good as the quotient between Romeo and the sum of a small
 furry animal and a leech. Speak your mind!

Ophelia:
 Thou art as disgusting as the quotient between Romeo and twice the
 difference between a mistletoe and an oozing infected blister! Speak
 your mind!

[Exeunt]

 같이 보기 

 Natural language programming
 난해한 프로그래밍 언어
 Inform 7
 Timeline of programming languages

 외부 링크 
 홈페이지
 소스포지 프로젝트 페이지
 GCC Frontend

 참고문헌 

분류:윌리엄 셰익스피어
분류:난해한 프로그래밍 언어