Chicken (Scheme)
| {{#if: Chicken | Chicken | {{#invoke:WLink|getArticleBase}} }}
{{#if: Logo | | ||||||||
|---|---|---|---|---|---|---|---|---|
colspan="2" class="notheme" style="text-align:center; background:#Vorlage:Standardfarbe; color:#202122;" | Logo |
{{#if: {{#invoke:Wikidata|claim|P154}} |
| ||||||||
[[Datei:{{#invoke:Wikidata|claim|P154}}|150px]]
}} }}{{#if: | | ||||||||
| {{{Screenshot}}}{{#if: | {{{Beschreibung}}} }}| }} | ||||||||
| Basisdaten
{{#if: | | ||||||||
| Hauptentwickler |
{{#if: {{#invoke:Wikidata|claim|P126}} |
| |||||||
| Maintainer | claim|P126|parameter=link|references=ja|list=, }}
}} }}{{#if: Felix Winkelmann | | |||||||
| Entwickler |
{{#if: {{#invoke:Wikidata|claim|P178}} |
| |||||||
| Entwickler | claim|P178|parameter=link|references=ja|list=, }}
}} }}{{#if: | | |||||||
| Erscheinungsjahr |
{{#if: {{#invoke:Wikidata|claim|P577}} |
| |||||||
| Erscheinungsjahr | claim|P577|references=ja|list=, }} |
{{#if: {{#invoke:Wikidata|claim|P571}} |
| |||||||
| Erscheinungsjahr | claim|P571|references=ja|list=, }}
}} }} }}{{#ifeq: 5.4.0 | KEINE_ANGABE || {{#if: 5.4.0 | | |||||||
| Aktuelle Version | ({{#if: | Vorlage:Datum – die Form mit drei unbenannten Parametern oder anderen einzelnen Zeiteinheiten ist veraltet und wird nicht mehr unterstützt. Bitte gib das Datum einfach im Klartext an. |
format | 16. Juli 2024 | {{#timefl:now|date}}}} | {{{2}}} | T._Monat JJJJ}} | lang= {{#switch: | -|=de | #default=de-AT
}} }} }}) }} |
{{#if: {{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813}} |
|
| Aktuelle Version | claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|references=ja}} {{#if: {{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|qualifier=P577}} | ({{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|qualifier=P577}}) }}}}}} }}{{#ifeq: {{{AktuelleVorabVersion}}} | KEINE_ANGABE || {{#if: | | |||||||
| Aktuelle Vorabversion | ({{#if: | Vorlage:Datum – die Form mit drei unbenannten Parametern oder anderen einzelnen Zeiteinheiten ist veraltet und wird nicht mehr unterstützt. Bitte gib das Datum einfach im Klartext an. |
format | {{{AktuelleVorabVersionFreigabeDatum}}} | {{#timefl:now|date}}}} | {{{2}}} | T._Monat JJJJ}} | lang= {{#switch: | -|=de | #default=de-AT
}} }} }}) }} |
{{#if: {{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724}} |
|
| Aktuelle Vorabversion | claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|references=ja}} {{#if: {{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|qualifier=P577}} | ({{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|qualifier=P577}}) }}}}}} }}{{#if: | | |||||||
| Ausführungsumgebung |
{{#if: Plattformunabhängig |
| |||||||
| Betriebssystem | Plattformunabhängig |
{{#if: {{#invoke:Wikidata|claim|P306}} |
| |||||||
| Betriebssystem | claim|P306|parameter=link|references=ja|list=, }}
}} }} }}{{#if: | | |||||||
| Programmiersprache |
{{#if: {{#invoke:Wikidata|claim|P277}} |
| |||||||
| Programmiersprache | claim|P277|parameter=link|references=ja|list=, }}
}} }}{{#if: Programmiersprache | | |||||||
| Kategorie | Programmiersprache
}}{{#if: BSD | | |||||||
| Lizenz | BSD |
{{#if: {{#invoke:Wikidata|claim|P275}} |
| |||||||
| Lizenz | claim|P275|parameter=link|references=ja|list=, }}
}} }}{{#if: | | |||||||
| deutschsprachig | faculty|0}} | ja | nein }}
}}{{#if: | | |||||||
| Sonstiges | {{{Sonstiges}}}
}}{{#if: call-cc.org | | |||||||
call-cc.org |
{{#if: {{#invoke:Wikidata|claim|P856|notdeprecated=1}} |
| ||||||||
{{#invoke: WLink | formatURL | {{#invoke:Wikidata|claim|P856|parameter=link|notdeprecated=1}}}}
}} }}{{#if: | | ||||||||
| Dateien | [[c:Category:Created with {{{Dateien}}}|{{{Dateien}}}]]
}} | |||||||
Chicken ist ein Compiler und Interpreter für die Programmiersprache Scheme, der den Scheme-Quelltext nach C übersetzt. Chicken ist weitestgehend R5RS konform und bietet viele Erweiterungen zu diesem Standard. Es handelt sich um freie Software, die unter einer BSD-Lizenz vertrieben wird. Der Autor ist Felix Winkelmann.
Design
Wie viele Scheme-Compiler verwendet auch Chicken die Programmiersprache C als Zwischencode. Scheme-Programme werden vom Chicken-Compiler nach C übersetzt und anschließend von einem Standard-C-Compiler in die Maschinensprache des Zielsystems übersetzt, die dann ausgeführt werden kann. Die weite Verbreitung von C-Compilern erlaubt eine weitgehende Plattformunabhängigkeit.
Das Design von Chicken wurde inspiriert von einer Veröffentlichung von Henry G. Baker aus dem Jahre 1994, in der ein innovativer Weg zur Übersetzung von Scheme nach C beschrieben wurde.<ref name="Baker1994">Henry Baker: <templatestyles src="Webarchiv/styles.css" />{{#if:20060303155622
| {{#ifeq: 20060303155622 | *
| {{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A. | {{#invoke:WLink|getEscapedTitle|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}} | {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html}} }} (Archivversionen)
| {{#iferror: {{#time: j. F Y|20060303155622}}
| {{#if: || }}Der Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
| {{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A. | {{#invoke:WLink|getEscapedTitle|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}} | {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2022-10-17 14:37:12 InternetArchiveBot | 2022-10-17 14:37:12 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20060303155622}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
}}
| {{#if:
| {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
| {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
| 16= {{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A. | {{#invoke:WLink|getEscapedTitle|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}} | {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2022-10-17 14:37:12 InternetArchiveBot | 2022-10-17 14:37:12 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: | [] | ] | ) }}
| 9 = {{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A. | {{#invoke:WLink|getEscapedTitle|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}} | {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2022-10-17 14:37:12 InternetArchiveBot | 2022-10-17 14:37:12 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: | [] | ] | ) }}
| #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!{{#if: || }}
}}
| c|{{{webciteID}}}}} {{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A. | {{#invoke:WLink|getEscapedTitle|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}} | {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html}} }} ({{#if: {{#if: 2022-10-17 14:37:12 InternetArchiveBot | 2022-10-17 14:37:12 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
| {{#if:
| Vorlage:Webarchiv/Today
| {{#if:
| Vorlage:Webarchiv/Generisch
| {{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A. | {{#invoke:WLink|getEscapedTitle|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}} | {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html}} }}
}}}}}}}}{{#if:2022-10-17 14:37:12 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:20060303155622|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
| {{#if: || }}{{#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: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
| }}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
}}
| {{#if:
| {{#if: || }}{{#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://home.pipeline.com/~hbaker1/CheneyMTA.html}}
|| {{#if: || }}
}}{{#if: CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.
| {{#if: {{#invoke:WLink|isBracketedLink|CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A.}}
| {{#if: || }}
}}
| {{#if: || }}
}}{{#switch:
|addlarchives|addlpages= {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
}}{{#ifeq: {{#invoke:Str|find|http://home.pipeline.com/~hbaker1/CheneyMTA.html%7Carchiv}} |-1
|| {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://home.pipeline.com/~hbaker1/CheneyMTA.html%7C4}}%7Chttp}} |-1
|| {{#switch: {{#invoke:Webarchiv|getdomain|http://home.pipeline.com/~hbaker1/CheneyMTA.html }}
| abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org =
| #default = {{#if: || }}{{#if: 1 |}}{{#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}}
}}
}}
}}, ACM SIGPLAN Notices 30, (1995), 17–20, doi:10.1145/214448.214454</ref> Hierbei wird ein Scheme-Programm in C-Funktionen übersetzt, die jedoch nicht zum Aufrufer zurückkehren, sondern stattdessen nach Beendigung eine sogenannte Continuation aufrufen. Diese Continuations sind weitere C-Funktionen, die vom Chicken-Compiler erzeugt werden und als Parameter an andere C-Funktionen übergeben werden.
Dies ist nichts anderes als der Continuation-passing style, formuliert in C. Bakers neuartige Idee ist es, den C-Stack als Scheme-Heap zu verwenden. Daher können normale Stack-Operation wie automatische Variablenerzeugung, alloca-Aufrufe zur Erzeugung von Arrays variabler Größe und ähnliches verwendet werden. Sobald der Stack voll ist, wird eine Garbage Collection gestartet, um den Stack wieder zu leeren. Im Chicken-Design wird ein Copying Garbage Collector verwendet, der erstmals 1970 von C. J. Cheney beschrieben wurde.<ref>{{#invoke:Vorlage:Literatur|f}}</ref> Hierbei werden alle noch verwendeten Scheme-Objekte und Continuations auf den Heap verschoben, es werden jedoch keine C-Stack-Frames verschoben, wodurch Chicken ohne Kenntnis der zugrundeliegenden C-Implementierung auskommt.
Dieser Ansatz gibt vielen Operationen die Geschwindigkeit von normalen Stack-Operationen, insbesondere das Aufrufen der Continuations ist ein einfacher Funktionsaufruf. Weiterhin kann hierbei das von Scheme geforderte endrekursive Verhalten erreicht werden, ohne dass der Speicherbedarf übermäßig steigt.
Beschränkungen und Abweichungen vom Standard
Chicken Scheme ist weitestgehend R5RS-konform. Es werden andere Makros (explicit renaming) anstelle der Makros des Sprachstandards verwendet.
Add-on-Software
Eine große Anzahl zusätzlicher Libraries und Programme, die sogenannten Eggs, sind für Chicken verfügbar. Diese Eggs sind vergleichbar mit den Ruby Gems der Programmiersprache Ruby.
Weblinks
Einzelnachweise
<references />
- Wikipedia:Vorlagenfehler/Parameter:Datum
- Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
- Wikipedia:Vorlagenfehler/Vorlage:Webarchiv/Archiv-URL
- Wikipedia:Vorlagenfehler/Parameter:URL
- Wikipedia:Vorlagenfehler/Parameter:Linktext
- Wikipedia:Vorlagenfehler/Vorlage:Webarchiv/Linktext fehlt
- Lisp
- Freies Programmierwerkzeug