최근 수정 시각 : 2024-02-07 11:47:09

HQ9+

1. 개요2. 문법3. 예제4. 파생 언어
4.1. HQ9++4.2. HQ9+-4.3. HQ9+~4.4. H9+4.5. Hq9eFuck4.6. HQ9F+

1. 개요

소개

2001년경에 클리프 비플[1]이 만든 난해한 프로그래밍 언어.

제작 동기는 브레인퍽 등의 장난으로 만들어진 변태적인 프로그래밍 언어로 고통받고 있는 인간들을 구원한다는 단순한 목적으로, 때문에 명령체계가 아주 간단하고 알아먹기도 아주 쉽다. 편의성을 위해 기능을 포함한 나머지를 모두 포기한 아주아주 대인배적인 마인드로 만들어졌기 때문이다. 때문에 난해한 프로그래밍 언어로 분류되어 있지만, 의외로 규칙은 정말 쉽고 단순하다.

HQ9+가 워낙 이 방면으론 유명한(...) 언어다 보니 이미 구현체가 존재하는 난해한 프로그래밍 언어로 HQ9+를 구현하는 것도 하나의 전통이 되어 왔다. 언어가 쉽기 때문에 구현도 쉽기 때문. 파생 언어도 다른 난해한 언어들에 비해서 많고 여러모로 난해한 프로그래밍 언어 쪽에서 상당한 입지를 가지고 있다. 파생 언어들은 아래의 파생 언어 문단을 참고하자.

HQ9+ 인터프리터의 소스 코드는 여기서 볼 수 있다. OCaml로 작성됐다. 또는 온라인 인터프리터를 사용할 수 있다.

2. 문법

겨우 4가지의 명령어를 가지고 있으며, HQ9+라는 이름은 약자나 두문자어가 아닌 단순히 이 언어의 모든 명령어를 합친 것이다. 즉 HQ9+ 이름 자체가 유효한 HQ9+소스 코드이다.
끝.

3. 예제

  • 콰인을 출력하는 코드. 콰인은 수학적으로 연구할 건덕지가 있는데다가 Python이나 C 등의 언어로는 작성하기 꽤 어려운 프로그램이다. 더 자세한 내용은 해당 항목을 참조하자. 물론 이 언어로는 Q 한글자로 끝이다.
    #!syntax xml Q
  • 벽장 속 99병의 맥주를 출력하는 코드. 가사의 뜻이 궁금하다면 해당 항목을 참조하자.
    #!syntax xml 9
  • 가산기의 값을 1 증가시키는 코드. 그러나 값을 출력할 수도, 다른곳에 대입할 수도 없으므로 사실상 잉여 명령어다.
    #!syntax xml +

요약하자면, 초보 프로그래머가 가장 자주 짜는 프로그램 프로그래밍 할 수 있는 언어. 튜링 완전하지도 않고, 범용 프로그램으론 사용할 수 없다.

4. 파생 언어

4.1. HQ9++

데이비드 모건마르[3]가 만든 HQ9+의 '객체 지향적인' 확장.

HQ9++는 HQ9+의 상위 호환이며, 따라서 모든 유효한 HQ9+ 코드는 유효한 HQ9++ 코드이다. 이름은 C++를 패러디 한 것으로 보인다.

++ 명령어가 추가되었으며, 실행하면 가산기의 값을 2만큼 증가시키고, 제네릭 상위 클래스의 새 자식 클래스의 인스턴스를 생성시킨다. 다만, 정보 은닉의 원리에 따라 이 객체에 접근하는 것은 불가능하다.

4.2. HQ9+-

HQ9++에 - 명령어를 더한 HQ9+-도 있는데, -의 효과는 다음과 같다.
  • - 앞에 아무 것도 없을 경우 : 구문 오류(syntax error) 발생
  • - 앞에 H가 있을 경우 : 입출력 오류(I/O error) 발생
  • - 앞에 Q가 있을 경우 : 무한 피드백(infinite recurse) 발생
  • - 앞에 9가 있을 경우 : 무한 루프(infinite loop) 발생
  • - 앞에 +가 있을 경우 : 0으로 나누는 오류(by itself) 발생
  • - 앞에 ++가 있을 경우 : 객체가 상위 클래스를 하위 클래스로 가지는 문제 발생
  • - 앞에 -가 있을 경우 : 가산기 감소[4]

그러니까 오류를 막기 위해 오류를 추가할 수 밖에 없게 만드는 모순적인 명령어. 무슨 지거리야 존재 자체가 오류다

4.3. HQ9+~

HQ9+-의 튜링 완전한 확장으로 HQ9+~가 존재한다.

역시 ~가 추가되었으며, HQ9+-와 비슷하게 앞서 위치한 문자에 따라 동작이 결정된다.
  • ~ 앞에 H가 있을 경우 : FizzBuzz[FizzBuzz]를 현재 가산기의 값 만큼 실행시킨다.
  • ~ 앞에 Q가 있을 경우 : 참값 기계(Truth-machine)[6]를 실행시킨다.
  • ~ 앞에 9가 있을 경우 : 새 보편 튜링 머신을 생성하고 실행시킨다. 단, 정보 은닉의 원칙에 의해 튜링 머신으로부터 출력된 값에는 접근할 수 없다.
  • ~ 앞에 +가 있을 경우 : 유저로부터 입력을 받는다. 역시나 정보 은닉의 원칙에 의해 입력된 값에는 접근할 수 없다.

4.4. H9+

Q가 빠진 H9+도 있는데, H, 9, +를 제외한 모든 문자는 무시한다. 즉 Hello, world!를 입력할 경우 H를 제외한 모든 문자는 무시되어 Hello, world!가 출력되어, 이 프로그램이 Hello, world! 와 동시에 콰인이 된다.

4.5. Hq9eFuck

BrainFuck의 명령어를 사용할 수 있는 Hq9eFuck도 존재한다. 즉 +++[H-] 는 "Hello world!"를 3번 출력한다. 브레인퍽의 명령어를 그대로 상속받기 때문에, 튜링 완전한 언어이다.

4.6. HQ9F+

HQ9F+라는 파생 언어는 가산기가 가진 값까지 FizzBuzz[FizzBuzz]를 실행시킨다. 즉 +++++F라는 코드는 1, 2, Fizz, 4, Buzz를 출력한다. 개발자에 따르면 요즘 프로그래머들이 FizzBuzz조차 짜지 못한다는 것에 낙심해서 만들었다고.

[1] 현재는 구글 X에서 일하고 있다.[2] 모든 프로그래밍 언어중에 가장 간단한 Hello, world!의 위엄을 자랑한다.[3] Ook!, 셰프 등 다양한 난해한 프로그래밍 언어를 만든 사람이기도 하다.[4] 유일하게 정상적인(?) 동작을 하지만, 유한한 길이의 코드에서 해당 동작이 실행되는 것을 보는 것은 불가능하다. 잠깐만 생각해보면, -앞에 있는 -는 오류를 발생시키고, 그걸 막기 위해 또 -앞에 -를 붙히고 붙히다 보면 결국 소스코드의 길이는 유한하므로 파일의 끝에 다다르게 되며 앞에 아무 글자도 없으니 결국 오류가 발생하므로 가산기를 감소시키는 동작은 항상 이전의 오류 때문에 실행이 불가능하다. 즉 잉여 동작이다 무한루프도 못 돌린다[FizzBuzz] 역시 Hello, world!99병의 맥주 처럼 프로그래밍을 처음 배울 때 흔히 짜게 되는 코드. 1부터 시작해 숫자를 차려로 올려가며 3의 배수면 Fizz, 5의 배수면 Buzz, 3의 배수이고 5의 배수이면 FizzBuzz를 출력시킨다.[6] 입력이 0인 경우 종료하고 1인 경우 1을 무한히 출력하는 정지하지 않는 오토마타를 말한다. #[FizzBuzz]