Zum Inhalt springen

HQ9+

aus Wikipedia, der freien Enzyklopädie

HQ9+ ist eine Parodie auf esoterische Programmiersprachen, die selbst nicht Turing-vollständig ist, da weder bedingte Anweisungen noch Schleifen möglich sind. Entwickelt wurde HQ9+ vom späteren Google-Mitarbeiter Cliff L. Biffle, der daneben auch die Turing-vollständigen esoterischen Programmiersprachen 4DL sowie Beatnik schuf, in denen Quelltexte als Hyperwürfel bzw. nach den Scrabble-Regeln zu bewertende Texte notiert werden müssen.

Biffle entwickelte mit HQ9+ eine Sprache, mit der in Programmierkursen häufig gestellte Aufgaben trivial gelöst werden können. Hallo-Welt-Programme etwa dienen dem Kennenlernen grundlegender syntaktischer Elemente einer Programmiersprache und Zählreime dem Kennenlernen von Schleifen. Die Entwicklung eines Quines dient als Indiz für die Turing-Vollständigkeit einer Sprache. HQ9+ führt diese Aufgaben ad absurdum, indem es nicht nur eigene Befehle dafür einführt, sondern den Sprachumfang darauf beschränkt.

Das Prinzip der Trivialisierung setzt sich in der objektorientierten Variante HQ9++ von David Morgan-Mar<ref>Dokumentation von HQ9++ auf der Webseite des Autors</ref> fort, bei der Objekte erstellt werden können, die, wie auch der Zähler, keine Funktion erfüllen können. HQ9+- von Ivan Zaigralin<ref>Dokumentation von HQ9+- auf der Webseite des Autors</ref> erweitert die Sprache nochmals um einen Operator zur Qualitätskontrolle, der Syntax- und verschiedene Laufzeitfehler auslöst und so das Verhalten des Interpreters oder (Trans-)Compilers in diesen Fällen testet.

Befehlssatz

Jedes Zeichen im Namen steht für einen der verfügbaren Befehle der Sprache:

H Gibt den Text „Hello World!“ aus.
Q Gibt den eigenen Quelltext aus und ahmt damit das Verhalten eines Quines nach.
9 Gibt den Liedtext von „99 Bottles of Beer on the Wall“<ref>siehe dazu das Archiv 99 Bottles of Beer für mehr als 1000 Programmier-Beispiele, siehe auch <templatestyles src="Webarchiv/styles.css" />{{#if:20070214141624 * Vorlage:Webarchiv/Wartung/Stern{{#if: das E-Book von Philipp Winterberg (pdf) | {{#invoke:WLink|getEscapedTitle|das E-Book von Philipp Winterberg (pdf)}} | {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}} }} (Archivversionen) 20070214141624}} {{#if: }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein! {{#invoke:WLink|getEscapedTitle|das E-Book von Philipp Winterberg (pdf)}} | {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: 2025-06-12 08:15:33 InternetArchiveBot | 2025-06-12 08:15:33 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20070214141624}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
      }}
  }}
{{#if: {{{webciteID}}}}} len|{{{webciteID}}}}} {{#invoke:WLink|getEscapedTitle|das E-Book von Philipp Winterberg (pdf)}} | {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: 2025-06-12 08:15:33 InternetArchiveBot | 2025-06-12 08:15:33 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }} {{#invoke:WLink|getEscapedTitle|das E-Book von Philipp Winterberg (pdf)}} | {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: 2025-06-12 08:15:33 InternetArchiveBot | 2025-06-12 08:15:33 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }} webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if: }}
      }}
{{{webciteID}}}}} {{#if: das E-Book von Philipp Winterberg (pdf) | {{#invoke:WLink|getEscapedTitle|das E-Book von Philipp Winterberg (pdf)}} | {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}} }}] (Memento{{#if: {{#if: 2025-06-12 08:15:33 InternetArchiveBot | 2025-06-12 08:15:33 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
  }}
{{#if: Vorlage:Webarchiv/Today {{#if: Vorlage:Webarchiv/Generisch {{#invoke:WLink|getEscapedTitle|das E-Book von Philipp Winterberg (pdf)}} | {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}} }}]
                 }}}}}}}}{{#if:2025-06-12 08:15:33 InternetArchiveBot
Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
all = url= opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original= cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv errNS = 0 template = Vorlage:Webarchiv format = * preview = 1
  }}{{#ifexpr: {{#if:20070214141624|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
{{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
getdomain|{{{archiv-url}}}}} web.archive.org =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
webcitation.org =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
Execute}}|}} {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}} }} {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
{{#if: {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf}}
{{#if: }}
  }}{{#if: das E-Book von Philipp Winterberg (pdf)
isBracketedLink|das E-Book von Philipp Winterberg (pdf)}} {{#if: }}
      }}
{{#if: }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
addlpages= {{#if: }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf%7Carchiv}} |-1
{{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf%7C4}}%7Chttp}} |-1 {{#switch: {{#invoke:Webarchiv|getdomain|http://www.99-bottles-of-beer.de/Das_99_Bottles_of_Beer_Programm.pdf }} daserste.ndr.de | inarchive.com | webcitation.org = #default = {{#if: }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} (zu HQ9+: S. 46)</ref> aus.
+ Erhöht den Akkumulator um eins.

Beispiele

Eingabe Ausgabe
H Hello world!
HQ Hello world!
HQ
QQQQ QQQQ
QQQQ
QQQQ
QQQQ
Q+Q+Q Q+Q+Q
Q+Q+Q
Q+Q+Q

Literatur

  • Philipp Winterberg: Das "99 Bottles of Beer"-programm: Eine Reise Durch Die Welt Der Programmiersprachen, 2013, S. 46 [1]
  • Тюгашев Андрей Александрович: Языки программирования. Учебное пособие. Стандарт третьего поколения, "Издательский дом ""Питер""", 2014, S. 246 [2]

Einzelnachweise

<references />

Weblinks

  • <templatestyles src="Webarchiv/styles.css" />{{#if:20100124165502
      | {{#ifeq: 20100124165502 | *
    | Vorlage:Webarchiv/Wartung/Stern{{#if: Dokumentation und Entstehungsgeschichte von HQ9+ | {{#invoke:WLink|getEscapedTitle|Dokumentation und Entstehungsgeschichte von HQ9+}} | {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html}} }} (Archivversionen)
    | {{#iferror: {{#time: j. F Y|20100124165502}}
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
         | {{#if: Dokumentation und Entstehungsgeschichte von HQ9+ | {{#invoke:WLink|getEscapedTitle|Dokumentation und Entstehungsgeschichte von HQ9+}} | {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y|20100124165502}} im Internet Archive{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
      }}
  }}
      | {{#if:
          | {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
    | {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
       | 16= {{#if: Dokumentation und Entstehungsgeschichte von HQ9+ | {{#invoke:WLink|getEscapedTitle|Dokumentation und Entstehungsgeschichte von HQ9+}} | {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | 9 = {{#if: Dokumentation und Entstehungsgeschichte von HQ9+ | {{#invoke:WLink|getEscapedTitle|Dokumentation und Entstehungsgeschichte von HQ9+}} | {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if:  || }}
      }}
    | c|{{{webciteID}}}}} {{#if: Dokumentation und Entstehungsgeschichte von HQ9+ | {{#invoke:WLink|getEscapedTitle|Dokumentation und Entstehungsgeschichte von HQ9+}} | {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html}} }} (Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
  }}
          | {{#if: 
              | Vorlage:Webarchiv/Today
              | {{#if:
                      | Vorlage:Webarchiv/Generisch
                      | {{#if: Dokumentation und Entstehungsgeschichte von HQ9+ | {{#invoke:WLink|getEscapedTitle|Dokumentation und Entstehungsgeschichte von HQ9+}} | {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html}} }}  
                 }}}}}}}}{{#if:
    | Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
     |all      = url=
     |opt      = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
     |cat      = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
     |errNS    = 0
     |template = Vorlage:Webarchiv
     |format   = *
     |preview  = 1
  }}{{#ifexpr: {{#if:20100124165502|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
    | {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
        | web.archive.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
        | webcitation.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
        | archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
         | {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
             | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
          |  }} 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
    | {{#if: 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.cliff.biffle.org/esoterica/hq9plus.html}}
    || {{#if:  || }}
  }}{{#if: Dokumentation und Entstehungsgeschichte von HQ9+
    | {{#if: {{#invoke:WLink|isBracketedLink|Dokumentation und Entstehungsgeschichte von HQ9+}}
        | {{#if:  || }}
      }}
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
    |addlarchives|addlpages= {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://www.cliff.biffle.org/esoterica/hq9plus.html%7Carchiv}} |-1
    || {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.cliff.biffle.org/esoterica/hq9plus.html%7C4}}%7Chttp}} |-1
         || {{#switch: {{#invoke:Webarchiv|getdomain|http://www.cliff.biffle.org/esoterica/hq9plus.html }}
              | abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org = 
              | #default = {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} (englisch) auf der Webseite des Autors