facebook / hhvm

A virtual machine for executing programs written in Hack.
https://hhvm.com
Other
18.21k stars 3k forks source link

HHVM segfaults while processing MediaWiki 1.25.1 / GeSHi errors #5672

Closed alex-mashin closed 9 years ago

alex-mashin commented 9 years ago

HHVM 3.7.3 and 3.8 segfault while processing MediaWiki 1.25.1 errors on long wikipages that call GeSHi via SyntaxHighlight GeSHi MediaWiki extension under Ubuntu 15.04.

Stacktrace below. Only several first and several last lines are relevant; the rest is wikicode:

Please note that the source code is for ont MediaWiki page (Модуль:Химия) (a Scribunto Module) and MediaWiki errors in the end mention another page (not transcluded but links to both pages are included in the same navigation template used on both pages): Справка:SyntaxHighlight (a help page about tag). Both pages are large and use SyntaxHighlight MediaWIki extension.

Host: ip-10-0-0-152
ProcessID: 16993
ThreadID: 7f5f863ff700
ThreadPID: 16997
Name: unknown program
Type: Segmentation fault
Runtime: hhvm
Version: tags/HHVM-3.7.3-0-g08c64d25f6c2cd316730b1d37db9eb33744cb306
DebuggerCount: 0

Server: traditio-ru.org
ThreadType: Web Request
Server_SERVER_NAME:(omitted)
URL: /wiki/%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0:Syntaxhighlight

PHP Stacktrace:

#0  GeSHi->parse_non_string_part( m [chemistryData.apiShowFormula] = <|/1/>function|> (frame)
    <|/1/>local|> nextfunc, static, cur = pairs (frame.args)
    <|/1/>if|> nextfunc (static, cur) == nil <|/1/>then|>
        ) called at [(path to MediaWiki installation)/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php:3090]
#1  GeSHi->parse_code() called at [(path to MediaWiki installation)/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php:123]
#2  SyntaxHighlight_GeSHi::parserHook(-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m, Array, Object of class Parser could not be converted to string) called at [(path to MediaWiki installation)/includes/parser/Parser.php:4212]
#3  Parser->extensionSubstitution(Array, frame{}) called at [(path to MediaWiki installation)/includes/parser/Preprocessor_Hash.php:1165]
#4  PPFrame_Hash->expand(<root><template><title>Тэг
    </title><part><name> расширение </name>=<value> SyntaxHighlight GeSHi
    </value></part><part><name> описание   </name>=<value> Выводит исходный код с подсветкой синтаксиса
    </value></part><part><name> автор      </name>=<value> [[Brion Vibber]], [[Tim Starling]] и [[Rob Church]]
    </value></part><part><name> lang       </name>=<value> [[язык программирования]]
    </value></part><part><name> line       </name>=<value> (GESHI_NORMAL_LINE_NUMBERS<template><title>!</title></template>GESHI_FANCY_LINE_NUMBERS) или пустое значение для показа номеров строк
    </value></part><part><name> start      </name>=<value> номер первой строки
    </value></part><part><name> highlight  </name>=<value> номер подсвеченной строки (без учёта line start)
    </value></part><part><name> enclose    </name>=<value> тэг [[HTML]], содержащий код — pre по умолчанию, div или none
    </value></part><part><name> strict     </name>=<value> использовать строгий режим
    </value></part><part><name> содержимое </name>=<value> Исходный код
    </value></part><part><name> возврат    </name>=<value> Исходный код с подсветкой синтаксиса
</value></part></template>

<template lineStart="1"><title>tag</title><part><name index="1"/><value>syntaxhighlight</value></part></template>, а также, <template><title>tag</title><part><name index="1"/><value>source</value></part></template> — [[Справка:тэг MediaWiki|тэг ''MediaWiki'']] для вывода исходного кода с [[подсветка синтаксиса|подсветкой синтаксиса]], предоставляемый [[Расширение MediaWiki|расширением]] ''SyntaxHighlight GeSHi''.

<h level="2" i="1">== Примеры ==</h>
{| class=&quot;wikitable&quot;
! Описание !! Викитекст !! Вывод
|-
! Простой фрагмент кода на [[Lua]]
|
<ext><name>pre</name><attr/><inner>&lt;nowiki&gt;
&lt;syntaxhighlight lang=&quot;lua&quot;&gt;
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m&lt;/syntaxhighlight&gt;
&lt;/nowiki&gt;</inner><close>&lt;/pre&gt;</close></ext>
| <ext><name>syntaxhighlight</name><attr> lang=&quot;lua&quot;</attr><inner>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</inner><close>&lt;/syntaxhighlight&gt;</close></ext>
|-
! Код с нумерацией строк
|
<ext><name>pre</name><attr/><inner>&lt;nowiki&gt;
&lt;syntaxhighlight lang=&quot;lua&quot; line&gt;
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
&lt;/syntaxhighlight&gt;
&lt;/nowiki&gt;</inner><close>&lt;/pre&gt;</close></ext>
| <ext><name>syntaxhighlight</name><attr> lang=&quot;lua&quot; line</attr><inner>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</inner><close>&lt;/syntaxhighlight&gt;</close></ext>
|-
! Код с нумерацией строк не с первой
|
<ext><name>pre</name><attr/><inner>&lt;nowiki&gt;
&lt;syntaxhighlight lang=&quot;lua&quot; line start=&quot;774&quot;&gt;
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
&lt;/syntaxhighlight&gt;
&lt;/nowiki&gt;</inner><close>&lt;/pre&gt;</close></ext>
| <ext><name>syntaxhighlight</name><attr> lang=&quot;lua&quot; line start=&quot;774&quot;</attr><inner>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</inner><close>&lt;/syntaxhighlight&gt;</close></ext>
|-
! Подсветка строки
|
<ext><name>pre</name><attr/><inner>&lt;nowiki&gt;
&lt;syntaxhighlight lang=&quot;lua&quot; line highlight=&quot;4&quot;&gt;
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
&lt;/syntaxhighlight&gt;
&lt;/nowiki&gt;</inner><close>&lt;/pre&gt;</close></ext>
| <ext><name>syntaxhighlight</name><attr> lang=&quot;lua&quot; line highlight=&quot;4&quot;</attr><inner>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</inner><close>&lt;/syntaxhighlight&gt;</close></ext>
|-
! Тэг <template><title>tag</title><part><name index="1"/><value>div</value></part></template>
|
<ext><name>pre</name><attr/><inner>&lt;nowiki&gt;
&lt;syntaxhighlight lang=&quot;lua&quot; enclose=&quot;div&quot;&gt;
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
&lt;/syntaxhighlight&gt;
&lt;/nowiki&gt;</inner><close>&lt;/pre&gt;</close></ext>
| <ext><name>syntaxhighlight</name><attr> lang=&quot;lua&quot; enclose=&quot;div&quot;</attr><inner>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</inner><close>&lt;/syntaxhighlight&gt;</close></ext>
|}
<template lineStart="1"><title>Написал</title><part><name index="1"/><value>Alex Mashin</value></part></template></root>, 0) called at [(path to MediaWiki installation)/includes/parser/Parser.php:3322]
#5  Parser->replaceVariables({{Тэг
    | расширение = SyntaxHighlight GeSHi
    | описание   = Выводит исходный код с подсветкой синтаксиса
    | автор      = [[Brion Vibber]], [[Tim Starling]] и [[Rob Church]]
    | lang       = [[язык программирования]]
    | line       = (GESHI_NORMAL_LINE_NUMBERS{{!}}GESHI_FANCY_LINE_NUMBERS) или пустое значение для показа номеров строк
    | start      = номер первой строки
    | highlight  = номер подсвеченной строки (без учёта line start)
    | enclose    = тэг [[HTML]], содержащий код — pre по умолчанию, div или none
    | strict     = использовать строгий режим
    | содержимое = Исходный код
    | возврат    = Исходный код с подсветкой синтаксиса
}}

{{tag|syntaxhighlight}}, а также, {{tag|source}} — [[Справка:тэг MediaWiki|тэг ''MediaWiki'']] для вывода исходного кода с [[подсветка синтаксиса|подсветкой синтаксиса]], предоставляемый [[Расширение MediaWiki|расширением]] ''SyntaxHighlight GeSHi''.

== Примеры ==
{| class="wikitable"
! Описание !! Викитекст !! Вывод
|-
! Простой фрагмент кода на [[Lua]]
|
<pre><nowiki>
<syntaxhighlight lang="lua">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Код с нумерацией строк
|
<pre><nowiki>
<syntaxhighlight lang="lua" line>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Код с нумерацией строк не с первой
|
<pre><nowiki>
<syntaxhighlight lang="lua" line start="774">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line start="774">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Подсветка строки
|
<pre><nowiki>
<syntaxhighlight lang="lua" line highlight="4">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line highlight="4">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Тэг {{tag|div}}
|
<pre><nowiki>
<syntaxhighlight lang="lua" enclose="div">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" enclose="div">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|}
{{Написал|Alex Mashin}}) called at [(path to MediaWiki installation)/includes/parser/Parser.php:1231]
#6  Parser->internalParse({{Тэг
    | расширение = SyntaxHighlight GeSHi
    | описание   = Выводит исходный код с подсветкой синтаксиса
    | автор      = [[Brion Vibber]], [[Tim Starling]] и [[Rob Church]]
    | lang       = [[язык программирования]]
    | line       = (GESHI_NORMAL_LINE_NUMBERS{{!}}GESHI_FANCY_LINE_NUMBERS) или пустое значение для показа номеров строк
    | start      = номер первой строки
    | highlight  = номер подсвеченной строки (без учёта line start)
    | enclose    = тэг [[HTML]], содержащий код — pre по умолчанию, div или none
    | strict     = использовать строгий режим
    | содержимое = Исходный код
    | возврат    = Исходный код с подсветкой синтаксиса
}}

{{tag|syntaxhighlight}}, а также, {{tag|source}} — [[Справка:тэг MediaWiki|тэг ''MediaWiki'']] для вывода исходного кода с [[подсветка синтаксиса|подсветкой синтаксиса]], предоставляемый [[Расширение MediaWiki|расширением]] ''SyntaxHighlight GeSHi''.

== Примеры ==
{| class="wikitable"
! Описание !! Викитекст !! Вывод
|-
! Простой фрагмент кода на [[Lua]]
|
<pre><nowiki>
<syntaxhighlight lang="lua">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Код с нумерацией строк
|
<pre><nowiki>
<syntaxhighlight lang="lua" line>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Код с нумерацией строк не с первой
|
<pre><nowiki>
<syntaxhighlight lang="lua" line start="774">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line start="774">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Подсветка строки
|
<pre><nowiki>
<syntaxhighlight lang="lua" line highlight="4">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line highlight="4">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Тэг {{tag|div}}
|
<pre><nowiki>
<syntaxhighlight lang="lua" enclose="div">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" enclose="div">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|}
{{Написал|Alex Mashin}}) called at [(path to MediaWiki installation)/includes/parser/Parser.php:434]
#7  Parser->parse({{Тэг
    | расширение = SyntaxHighlight GeSHi
    | описание   = Выводит исходный код с подсветкой синтаксиса
    | автор      = [[Brion Vibber]], [[Tim Starling]] и [[Rob Church]]
    | lang       = [[язык программирования]]
    | line       = (GESHI_NORMAL_LINE_NUMBERS{{!}}GESHI_FANCY_LINE_NUMBERS) или пустое значение для показа номеров строк
    | start      = номер первой строки
    | highlight  = номер подсвеченной строки (без учёта line start)
    | enclose    = тэг [[HTML]], содержащий код — pre по умолчанию, div или none
    | strict     = использовать строгий режим
    | содержимое = Исходный код
    | возврат    = Исходный код с подсветкой синтаксиса
}}

{{tag|syntaxhighlight}}, а также, {{tag|source}} — [[Справка:тэг MediaWiki|тэг ''MediaWiki'']] для вывода исходного кода с [[подсветка синтаксиса|подсветкой синтаксиса]], предоставляемый [[Расширение MediaWiki|расширением]] ''SyntaxHighlight GeSHi''.

== Примеры ==
{| class="wikitable"
! Описание !! Викитекст !! Вывод
|-
! Простой фрагмент кода на [[Lua]]
|
<pre><nowiki>
<syntaxhighlight lang="lua">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Код с нумерацией строк
|
<pre><nowiki>
<syntaxhighlight lang="lua" line>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line>
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Код с нумерацией строк не с первой
|
<pre><nowiki>
<syntaxhighlight lang="lua" line start="774">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line start="774">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Подсветка строки
|
<pre><nowiki>
<syntaxhighlight lang="lua" line highlight="4">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" line highlight="4">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|-
! Тэг {{tag|div}}
|
<pre><nowiki>
<syntaxhighlight lang="lua" enclose="div">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
</nowiki></pre>
| <syntaxhighlight lang="lua" enclose="div">
-- Регистрация эспортируемых функций:
-- «оформить формулу»:
m [chemistryData.apiShowFormula] = function (frame)
    local nextfunc, static, cur = pairs (frame.args)
    if nextfunc (static, cur) == nil then
        -- аргументы не переданы. Использовать аргументы шаблона:
        return showFormula (frame:getParent ().args)
    else
        -- переданы аргументы:
        return showFormula (frame.args)
    end
end

-- Последняя строка. Экспорт функций из модуля:
return m
</syntaxhighlight>
|}
{{Написал|Alex Mashin}}, Справка:Syntaxhighlight, Object of class ParserOptions could not be converted to string, 1, 1, 454485) called at [(path to MediaWiki installation)/includes/content/WikitextContent.php:333]
#8  WikitextContent->fillParserOutput(Справка:Syntaxhighlight, 454485, Object of class ParserOptions could not be converted to string, 1, Object of class ParserOutput could not be converted to string) called at [(path to MediaWiki installation)/includes/content/AbstractContent.php:497]
#9  AbstractContent->getParserOutput(Справка:Syntaxhighlight, 454485, Object of class ParserOptions could not be converted to string) called at [(path to MediaWiki installation)/includes/poolcounter/PoolWorkArticleView.php:140]
#10 PoolWorkArticleView->doWork() called at [(path to MediaWiki installation)/includes/poolcounter/PoolCounterWork.php:123]
#11 PoolCounterWork->execute() called at [(path to MediaWiki installation)/includes/page/Article.php:674]
#12 Article->view() called at [(path to MediaWiki installation)/includes/actions/ViewAction.php:44]
#13 ViewAction->show() called at [(path to MediaWiki installation)/includes/MediaWiki.php:395]
#14 MediaWiki->performAction(Object of class Article could not be converted to string, Справка:Syntaxhighlight) called at [(path to MediaWiki installation)/includes/MediaWiki.php:273]
#15 MediaWiki->performRequest() called at [(path to MediaWiki installation)/includes/MediaWiki.php:566]
#16 MediaWiki->main() called at [(path to MediaWiki installation)/includes/MediaWiki.php:414]
#17 MediaWiki->run() called at [(path to MediaWiki installation)/index.php:41]
alex-mashin commented 9 years ago

This bug is also present in HHVM 3.8.

fredemmott commented 9 years ago

It'd be very helpful if you could isolate the problem to not depend on external libraries/frameworks. Additionally, debugging information in english would make this much more likely to be looked at.

alex-mashin commented 9 years ago

Unfortunately, I can't isolate it. All I can say, it appears when using Syntax Highlisht GeSHi on large wikipages. I suspect some limit on variable size or recursion depth is hit. Limit on memory is 0.5 GB, execution time limit is not reached.

The debugging information is in Ebglish — it is several first and last lines of the stacktrace. The non-English text is just the source code of the wikipage — a Lua module (not executed, just displayed with syntax highlighting).

alex-mashin commented 9 years ago

The error persists in HHVM 3.8.

This is the record in /var/log/syslog about the crash: kernel: [1185141.501701] traps: hhvm[3826] general protection ip:131fbea sp:7f380b3f9060 error:0 in hhvm[400000+330d000].

These are the lines in /var/log/hhvm.log:

\nNotice: Array to string conversion in (path to MediaWiki installation)/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php on line 3442
\nNotice: Array to string conversion in (path to MediaWiki installation)/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php on line 3442
Core dumped: Segmentation fault
Stack trace in /tmp/stacktrace.32538.log

Below is the stacktrace. I noticed that the lengthy wikitext quoted as the value of some PHP variable is from the page about LISP programming language, which is not the article on which HHVM crushes--a Lua Module. But both these pages use SyntaxHighlight GeSHi.

PHP Stacktrace:

#0  GeSHi->parse_non_string_part( (defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
        with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result))))) called at [(path to MediaWiki installation)/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php:3107]
#1  GeSHi->parse_code() called at [(path to MediaWiki installation)/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php:123]
#2  SyntaxHighlight_GeSHi::parserHook((defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
        with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result)))), Array, Object of class Parser could not be converted to string, frame{}) called at [(path to MediaWiki installation)/includes/parser/Parser.php:4212]
#3  Parser->extensionSubstitution(Array, frame{}) called at [(path to MediaWiki installation)/includes/parser/Preprocessor_Hash.php:1165]
#4  PPFrame_Hash->expand(<root><template><title>Карточка языка программирования
</title><part><name>name </name>=<value> Лисп
</value></part><part><name>logo </name>=<value>
</value></part><part><name>semantics </name>=<value> 
[[Мультипарадигменный язык программирования|мультипарадигменный]]: [[объектно-ориентированное программирование|объектно-ориентированное]], [[Функциональное программирование|функциональное]], [[процедурное программирование|процедурное]] программирование
</value></part><part><name>year </name>=<value> [[1958]]
</value></part><part><name>designer </name>=<value> [[Маккарти, Джон|Джон Маккарти]] 
</value></part><part><name>typing </name>=<value> [[Строгая типизация|cтрогая]], [[Динамическая типизация|динамическая]]
</value></part><part><name>implementations </name>=<value>
</value></part><part><name>dialects </name>=<value> [[Common Lisp]] ([[CLOS]]), [[Scheme]], [[Emacs lisp]]
</value></part><part><name>influenced </name>=<value> [[Лого (язык программирования)|Лого]], [[Smalltalk]], [[Python]], [[Ruby]] 
</value></part></template>
'''Лисп''' (''LISP'', от <template><title>lang-en</title><part><name index="1"/><value>LISt Processing</value></part></template> — «обработка списков») — семейство [[язык программирования|языков программирования]], основанных на представлении [[компьютерная программа|программы]] активной-реального-времени-символьно системой [[Линейный список|линейных списков]] '''[[символ]]ов''', которые притом являются основной [[Структура данных|структурой данных]] языка. Лисп считается вторым после [[Фортран]]а старейшим [[Высокоуровневый язык программирования|высокоуровневым языком программирования]].

* &lt;b&gt;Активная система&lt;/b&gt; - каждый символ является динамической системой живущей в лисп-среде;
* &lt;b&gt;Реального времени&lt;/b&gt; - реагирует на команды, события и проч.;
* &lt;b&gt;Символьная система&lt;/b&gt; - реализует абстракцию, идею ламбда-исчисления, т.е. символы живут в свое родной среде. Возможность которая радикально определяет мир компьютеров. 

Лисп (lisp) имеет также значение «детский лепет» — тема интересовавшая создателя Лиспа Мак-Карти [http://www-formal.stanford.edu/jmc/robotandbaby.html The robot and the baby] и [http://www.ai.sri.com/project_list/all весь Стенфорд]. (Самые ходовые связки ИИ: ИИ — разведка (intelligence), ИИ — дети люди/киборги/роботы.)

Наиболее успешная платформа баз знаний на Лиспе [[KEE|KEE (Knowledge Engineering Enveronment]]).

В стандарте Common Lisp (каждый) символ реализован как узел многокоординатной опять же символьной сети. Координаты, свойства, уровни сети записаны в ящичках (slots) символа. Основные слоты: имя символа (основополагающее аристотелево А=А), функциональный слот, слот значение, расширяемый список свойств (можно сказать микромир самого символа).

Традиционный Лисп имеет строгую динамическую [[Тип данных|систему типов]], содержит императивные свойства, но в общем поощряет [[Функциональное программирование|функциональную]] парадигму программирования.

Полноценная символьная обработка подразумевает возможность создания любого профиля объектно-ориентированного программирования (то есть реализация полного ООП имеющего тот или иной характер средствами языка). Кодификацией, стандартизацией профиля ООП в стандарте Лиспа является платформа [[CLOS]].

Внешне [[исходный код]] программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием [[текстовый редактор|текстового редактора]], поддерживающего автоматическое выравнивание кода, [[Подсветка синтаксиса|подсветку]] соответствующих пар скобок и команды рода «перейти через список вправо». Хорошо приспособлен к кодированию на Лиспе редактор [[Emacs]] (большая часть которого написана на Лиспе), кроме того в коммерческих реализациях (например в [[LispWorks]]) [[Среда разработки программного обеспечения|IDE]] содержит удобные редакторы, сохраняющие все достоинства Emacs.

Язык Лисп наряду с языком [[Ada]] прошёл процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт [[Common Lisp]]. Его реализации существуют для большинства платформ. Есть реализации распространяемые свободно под лицензиями, позволяющими использовать Лисп без ограничений в коммерческих приложениях, кроме этого существуют коммерческие реализации, предлагающие дополнительные возможности (IDE, дополнительные библиотеки и т. п.), в том числе техническую поддержку. С полным списком реализаций можно ознакомиться здесь: [http://www.cliki.net/Common%20Lisp%20implementation Common Lisp Implementation].

<h level="2" i="1">== Синтаксис ==</h>

Основной механизм Лиспа, инкапсулированная в список определяющая голова списка, и подключенный к ней хвост списка, который рекурсивно также может быть списком (ламбда-исчисление). Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго-научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на Лиспе состоит из последовательности ''выражений'' (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде ''списков'' — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Список является последовательностью элементов любого рода, в том числе других списков. Например, &lt;code&gt;(1 3/7 'foo #'+)&lt;/code&gt; состоит из целого числа, рациональной дроби, ''символа'' &lt;var&gt;foo&lt;/var&gt; и [[Указатель (программирование)|указателя]] на функцию сложения. Выражения представляются списками в [[префиксная запись|префиксной записи]]: первый элемент должен быть ''формой'', то есть ''функцией'', ''оператором'', ''макросом'' или ''специальным оператором''; прочие элементы суть аргументы, передаваемые форме для обработки. Функция &lt;code&gt;list&lt;/code&gt; возвращает список состоящий из её аргументов: например, &lt;code&gt;(list 1 3/7 'foo #'+)&lt;/code&gt; возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: &lt;code&gt;(list 1 2 (list 1 2))&lt;/code&gt; возвращает &lt;code&gt;(1 2 (1 2))&lt;/code&gt;. Арифметические операторы действуют так же, например &lt;code&gt;(+ 4 (* 2 3))&lt;/code&gt; выдаёт 10.

Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются [[ветвление]] и [[цикл]]ы. Оператор &lt;code&gt;if&lt;/code&gt; позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не &lt;code&gt;nil&lt;/code&gt;, то вычисляется первый аргумент, иначе вычисляется второй. Например, &lt;code&gt;(if nil (list 1 2 &quot;foo&quot;) (list 3 4 &quot;bar&quot;))&lt;/code&gt; всегда возвращает &lt;code&gt;(3 4 &quot;bar&quot;)&lt;/code&gt;.

Символьная природа языка (то есть отсутствие в символьном пространстве традиционной метрической геометрии расстояний, последовательностей и т.д) позволяет легко и продуктивно распараллеливать Лисп-процессы. (Что нашло использование в сверхмощных телекоммуникационных, сетевых Лисп-системах.)

При всей мощности символьного подхода, он не может занять место контининтуальных (нейро) систем (не-машин!) [[нейрокомпьютер]]ов. Т. н. проблема образования категорий из сенсорных данных. (см. [http://cogprints.org/1593/00/harnad95.iee.html Harnad]).

<h level="2" i="2">== Примеры ==</h>

Пример [[Куайн (программирование)|куайна]] (программы, выводящей свой исходный код) на Лиспе:

<ext><name>source</name><attr> lang=lisp</attr><inner>
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
</inner><close>&lt;/source&gt;</close></ext>

Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на [[Scheme]].

Итеративная версия функции определения N-го [[числа Фибоначчи]]:

<ext><name>source</name><attr> lang=lisp</attr><inner>
(defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
        with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result))))
</inner><close>&lt;/source&gt;</close></ext>

<h level="2" i="3">== Применение ==</h>

Основная область применения Лиспа — динамическая генерация символьных миров и последующий процесс принятия решений (см. проекты [http://www.franz.com/success/all_customer_apps.lhtml Franz]).

Одно из направлений использования языка Lisp — его использование в качестве скриптого языка, автоматизирующего работу в ряде прикладных программ.

* Лисп используется как язык сценариев в [[САПР]] [[AutoCAD]] (диалект [[AutoLISP]])
* Лисп является одним из базовых средств текстового редактора [[Emacs]] (Диалект [[EmacsLISP]]). По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности.
* В оконном менеджере [[Sawfish]] применяется специальный диалект Лиспа [[Rep]], который в значительной степени повторяет диалект Лиспа от Emacs.
* Диалект [[Scheme]] используется в качестве одного из скриптовых языков в графическом процессоре [[Gimp]].

Сегодня Лисп используется во множестве различных проектов: от декодирования генома человека до системы проектирования авиалайнеров. Кроме традиционных научных и промышленных применений Лисп используется для высокодинамичных трёхмерных игр (диалект GOAL).

Большую системную и прикладную роль Лисп играет в Linux операционной системе [[Debian]]<template><title>источник</title></template>. <comment>&lt;!-- нет у меня в дебиане лиспа, и ниче, живой `A5b --&gt;</comment>

<h level="2" i="4">== Философия ==</h>

Основной смысл Лисп-программы «жизнь» в символьном пространстве: перемещение, творчество, запоминание, создание новых миров и т. д. Лисп как метафора мозга, символ метафора сигнала <template><title>источник?</title></template>:

<template lineStart="1"><title>Начало цитаты</title></template>
Как происходит биологический анализ сигналов мозгом, как внешний фактор — физическое и химическое воздействие, являющееся для организма раздражителем превращается в биологически значимый сигнал, зачастую жизненно важный, определяющий все поведение человека или животного; и как происходит разделение разных сигналов на положительные, отрицательные и безразличные, индифферентные. Сигнал это уже интегративное понятие. Он представляет собой опознавательный знак группы, комплексных раздражителей, связанных между собой общей историей и причинно следственными отношениями. В этом комплексе, системе раздражителей, сигнальный стимул сам является также составляющим элементом и при иных обстоятельствах его роль может принадлежать другому стимулу из комплекса. В сигнале концентрируется весь прошлый опыт животного или человека. (''Ю.&amp;nbsp;Г.&amp;nbsp;Кратин. «Анализ сигналов мозгом», 1975'')
<template lineStart="1"><title>Конец цитаты</title></template>

<h level="2" i="5">== Идея ==</h>
<template lineStart="1"><title>Периссный раздел</title></template>
Основная идея и сила Лиспа — символьная обработка. Символьная обработка — один из двух базовых методов интеллектуальной работы компьютеры. Вход в символьное пространство позволяет заниматься задачами искусственного интеллекта: понимания окружающего мира и принятия решений. (Второй интеллектуальный метод — контининтуальная машина — нейросистема). Лисп настолько фундаментален, что достаточно иметь только Лисп, чтобы полноценно работать в области ИИ, и достаточно убрать Лисп, чтобы превратить работу в области ИИ в фарс (см. [[кретинизация]]). Вы будете смеяться, но нейросистемы также кретинизируются.

<h level="2" i="6">== Компиляторы ==</h>

'''[http://www.beelisp.ru BEE Lisp](Balabanov Eugene Embeddable Lisp)''' — это легковесный коммерческий компилятор для языка [[Lisp]], разработанный Компанией «Симплтек Девелопмент». Компилятор позволяет создавать полностью автономные EXE и DLL файлы. В отличие от большинства аналогов, исполняемые файлы, созданные этим компилятором не требуют присутствия каких либо интерпретаторов или виртуальных машин. Его программный интерфейс для взаимодействия с ОС позволяет использовать DLL файлы, созданные сторонними разработчиками на других языках (таких как С++). Таким образом, можно вызывать как API функции Windows, так и API функции сторонних SDK из кода на языке Лисп. Можно смешивать Лисп код с кодом, созданным на компилируемых языках, таких как С++ и наоборот — можно вызывать лисп функции из С++ программ.

'''[http://homelisp.ru HomeLisp] (HomeLisp - &quot;домашний Лисп&quot;)''' - простая бесплатная Лисп-система, ориентированная на Windows. Поставляется вместе с простой IDE. Содержит в своем составе COM-библиотеку и два скриптовых движка, позволяющих писать скрипты на Лиспе, а также вызывать Лисп из любой среды, поддерживающей COM. Имеется поддержка графики. Реализована возможность построения автономных EXE-файлов в т.ч. и с графическим интерфейсом. Поддерживается сверхдлинная арифметика целых. Система снабжена '''[http://homelisp.ru/help/index.html подробной документацией]'''.

<h level="2" i="7">== См. также ==</h>
* [[SLIME]]
* [[EMACS]]

<h level="2" i="8">== Ссылки ==</h>
* [[база знаний]]
* [http://lisp.org lisp.org] — Ассоциация пользователей Лисп
* [http://clisp.linkfly.ru clisp.linkfly.ru] — Множество материалов по Lisp
* [http://lisp.narod.ru/ lisp.narod.ru] — Начальные сведения о языках Лисп-семейства на русском
* [http://lisp.tomsk.ru lisp.tomsk.ru] — Лисп-портал.
* <template><title>lj_comm</title><part><name index="1"/><value>ru_lisp</value></part></template> — сообщество в LiveJournal, посвящённое Лисп.
* [http://autocad.xarch.at/lsp_tools/ntemacs/autolisp.el Emacs-режим для AutoLISP] на [http://autocad.xarch.at/lsp_tools/ntemacs.html ресурсе XArch от Райни Урбана (Reini Urban)]
* [http://ideatech.narod.ru/AI_Library.htm#AI_Library Библиотека ИИ. Содержит библиотеку Лиспа]

<template lineStart="1"><title>Языки программирования</title></template>

[[Категория:Лисп|*]]
[[Категория:Языки с динамической типизацией]]</root>, 0) called at [(path to MediaWiki installation)/includes/parser/Parser.php:3322]
#5  Parser->replaceVariables({{Карточка языка программирования
|name = Лисп
|logo =
|semantics = 
[[Мультипарадигменный язык программирования|мультипарадигменный]]: [[объектно-ориентированное программирование|объектно-ориентированное]], [[Функциональное программирование|функциональное]], [[процедурное программирование|процедурное]] программирование
|year = [[1958]]
|designer = [[Маккарти, Джон|Джон Маккарти]] 
|typing = [[Строгая типизация|cтрогая]], [[Динамическая типизация|динамическая]]
|implementations =
|dialects = [[Common Lisp]] ([[CLOS]]), [[Scheme]], [[Emacs lisp]]
|influenced = [[Лого (язык программирования)|Лого]], [[Smalltalk]], [[Python]], [[Ruby]] 
}}
'''Лисп''' (''LISP'', от {{lang-en|LISt Processing}} — «обработка списков») — семейство [[язык программирования|языков программирования]], основанных на представлении [[компьютерная программа|программы]] активной-реального-времени-символьно системой [[Линейный список|линейных списков]] '''[[символ]]ов''', которые притом являются основной [[Структура данных|структурой данных]] языка. Лисп считается вторым после [[Фортран]]а старейшим [[Высокоуровневый язык программирования|высокоуровневым языком программирования]].

* <b>Активная система</b> - каждый символ является динамической системой живущей в лисп-среде;
* <b>Реального времени</b> - реагирует на команды, события и проч.;
* <b>Символьная система</b> - реализует абстракцию, идею ламбда-исчисления, т.е. символы живут в свое родной среде. Возможность которая радикально определяет мир компьютеров. 

Лисп (lisp) имеет также значение «детский лепет» — тема интересовавшая создателя Лиспа Мак-Карти [http://www-formal.stanford.edu/jmc/robotandbaby.html The robot and the baby] и [http://www.ai.sri.com/project_list/all весь Стенфорд]. (Самые ходовые связки ИИ: ИИ — разведка (intelligence), ИИ — дети люди/киборги/роботы.)

Наиболее успешная платформа баз знаний на Лиспе [[KEE|KEE (Knowledge Engineering Enveronment]]).

В стандарте Common Lisp (каждый) символ реализован как узел многокоординатной опять же символьной сети. Координаты, свойства, уровни сети записаны в ящичках (slots) символа. Основные слоты: имя символа (основополагающее аристотелево А=А), функциональный слот, слот значение, расширяемый список свойств (можно сказать микромир самого символа).

Традиционный Лисп имеет строгую динамическую [[Тип данных|систему типов]], содержит императивные свойства, но в общем поощряет [[Функциональное программирование|функциональную]] парадигму программирования.

Полноценная символьная обработка подразумевает возможность создания любого профиля объектно-ориентированного программирования (то есть реализация полного ООП имеющего тот или иной характер средствами языка). Кодификацией, стандартизацией профиля ООП в стандарте Лиспа является платформа [[CLOS]].

Внешне [[исходный код]] программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием [[текстовый редактор|текстового редактора]], поддерживающего автоматическое выравнивание кода, [[Подсветка синтаксиса|подсветку]] соответствующих пар скобок и команды рода «перейти через список вправо». Хорошо приспособлен к кодированию на Лиспе редактор [[Emacs]] (большая часть которого написана на Лиспе), кроме того в коммерческих реализациях (например в [[LispWorks]]) [[Среда разработки программного обеспечения|IDE]] содержит удобные редакторы, сохраняющие все достоинства Emacs.

Язык Лисп наряду с языком [[Ada]] прошёл процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт [[Common Lisp]]. Его реализации существуют для большинства платформ. Есть реализации распространяемые свободно под лицензиями, позволяющими использовать Лисп без ограничений в коммерческих приложениях, кроме этого существуют коммерческие реализации, предлагающие дополнительные возможности (IDE, дополнительные библиотеки и т. п.), в том числе техническую поддержку. С полным списком реализаций можно ознакомиться здесь: [http://www.cliki.net/Common%20Lisp%20implementation Common Lisp Implementation].

== Синтаксис ==

Основной механизм Лиспа, инкапсулированная в список определяющая голова списка, и подключенный к ней хвост списка, который рекурсивно также может быть списком (ламбда-исчисление). Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго-научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на Лиспе состоит из последовательности ''выражений'' (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде ''списков'' — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Список является последовательностью элементов любого рода, в том числе других списков. Например, <code>(1 3/7 'foo #'+)</code> состоит из целого числа, рациональной дроби, ''символа'' <var>foo</var> и [[Указатель (программирование)|указателя]] на функцию сложения. Выражения представляются списками в [[префиксная запись|префиксной записи]]: первый элемент должен быть ''формой'', то есть ''функцией'', ''оператором'', ''макросом'' или ''специальным оператором''; прочие элементы суть аргументы, передаваемые форме для обработки. Функция <code>list</code> возвращает список состоящий из её аргументов: например, <code>(list 1 3/7 'foo #'+)</code> возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: <code>(list 1 2 (list 1 2))</code> возвращает <code>(1 2 (1 2))</code>. Арифметические операторы действуют так же, например <code>(+ 4 (* 2 3))</code> выдаёт 10.

Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются [[ветвление]] и [[цикл]]ы. Оператор <code>if</code> позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не <code>nil</code>, то вычисляется первый аргумент, иначе вычисляется второй. Например, <code>(if nil (list 1 2 "foo") (list 3 4 "bar"))</code> всегда возвращает <code>(3 4 "bar")</code>.

Символьная природа языка (то есть отсутствие в символьном пространстве традиционной метрической геометрии расстояний, последовательностей и т.д) позволяет легко и продуктивно распараллеливать Лисп-процессы. (Что нашло использование в сверхмощных телекоммуникационных, сетевых Лисп-системах.)

При всей мощности символьного подхода, он не может занять место контининтуальных (нейро) систем (не-машин!) [[нейрокомпьютер]]ов. Т. н. проблема образования категорий из сенсорных данных. (см. [http://cogprints.org/1593/00/harnad95.iee.html Harnad]).

== Примеры ==

Пример [[Куайн (программирование)|куайна]] (программы, выводящей свой исходный код) на Лиспе:

<source lang=lisp>
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
</source>

Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на [[Scheme]].

Итеративная версия функции определения N-го [[числа Фибоначчи]]:

<source lang=lisp>
(defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
        with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result))))
</source>

== Применение ==

Основная область применения Лиспа — динамическая генерация символьных миров и последующий процесс принятия решений (см. проекты [http://www.franz.com/success/all_customer_apps.lhtml Franz]).

Одно из направлений использования языка Lisp — его использование в качестве скриптого языка, автоматизирующего работу в ряде прикладных программ.

* Лисп используется как язык сценариев в [[САПР]] [[AutoCAD]] (диалект [[AutoLISP]])
* Лисп является одним из базовых средств текстового редактора [[Emacs]] (Диалект [[EmacsLISP]]). По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности.
* В оконном менеджере [[Sawfish]] применяется специальный диалект Лиспа [[Rep]], который в значительной степени повторяет диалект Лиспа от Emacs.
* Диалект [[Scheme]] используется в качестве одного из скриптовых языков в графическом процессоре [[Gimp]].

Сегодня Лисп используется во множестве различных проектов: от декодирования генома человека до системы проектирования авиалайнеров. Кроме традиционных научных и промышленных применений Лисп используется для высокодинамичных трёхмерных игр (диалект GOAL).

Большую системную и прикладную роль Лисп играет в Linux операционной системе [[Debian]]{{источник}}. <!-- нет у меня в дебиане лиспа, и ниче, живой `A5b -->

== Философия ==

Основной смысл Лисп-программы «жизнь» в символьном пространстве: перемещение, творчество, запоминание, создание новых миров и т. д. Лисп как метафора мозга, символ метафора сигнала {{источник?}}:

{{Начало цитаты}}
Как происходит биологический анализ сигналов мозгом, как внешний фактор — физическое и химическое воздействие, являющееся для организма раздражителем превращается в биологически значимый сигнал, зачастую жизненно важный, определяющий все поведение человека или животного; и как происходит разделение разных сигналов на положительные, отрицательные и безразличные, индифферентные. Сигнал это уже интегративное понятие. Он представляет собой опознавательный знак группы, комплексных раздражителей, связанных между собой общей историей и причинно следственными отношениями. В этом комплексе, системе раздражителей, сигнальный стимул сам является также составляющим элементом и при иных обстоятельствах его роль может принадлежать другому стимулу из комплекса. В сигнале концентрируется весь прошлый опыт животного или человека. (''Ю.&nbsp;Г.&nbsp;Кратин. «Анализ сигналов мозгом», 1975'')
{{Конец цитаты}}

== Идея ==
{{Периссный раздел}}
Основная идея и сила Лиспа — символьная обработка. Символьная обработка — один из двух базовых методов интеллектуальной работы компьютеры. Вход в символьное пространство позволяет заниматься задачами искусственного интеллекта: понимания окружающего мира и принятия решений. (Второй интеллектуальный метод — контининтуальная машина — нейросистема). Лисп настолько фундаментален, что достаточно иметь только Лисп, чтобы полноценно работать в области ИИ, и достаточно убрать Лисп, чтобы превратить работу в области ИИ в фарс (см. [[кретинизация]]). Вы будете смеяться, но нейросистемы также кретинизируются.

== Компиляторы ==

'''[http://www.beelisp.ru BEE Lisp](Balabanov Eugene Embeddable Lisp)''' — это легковесный коммерческий компилятор для языка [[Lisp]], разработанный Компанией «Симплтек Девелопмент». Компилятор позволяет создавать полностью автономные EXE и DLL файлы. В отличие от большинства аналогов, исполняемые файлы, созданные этим компилятором не требуют присутствия каких либо интерпретаторов или виртуальных машин. Его программный интерфейс для взаимодействия с ОС позволяет использовать DLL файлы, созданные сторонними разработчиками на других языках (таких как С++). Таким образом, можно вызывать как API функции Windows, так и API функции сторонних SDK из кода на языке Лисп. Можно смешивать Лисп код с кодом, созданным на компилируемых языках, таких как С++ и наоборот — можно вызывать лисп функции из С++ программ.

'''[http://homelisp.ru HomeLisp] (HomeLisp - "домашний Лисп")''' - простая бесплатная Лисп-система, ориентированная на Windows. Поставляется вместе с простой IDE. Содержит в своем составе COM-библиотеку и два скриптовых движка, позволяющих писать скрипты на Лиспе, а также вызывать Лисп из любой среды, поддерживающей COM. Имеется поддержка графики. Реализована возможность построения автономных EXE-файлов в т.ч. и с графическим интерфейсом. Поддерживается сверхдлинная арифметика целых. Система снабжена '''[http://homelisp.ru/help/index.html подробной документацией]'''.

== См. также ==
* [[SLIME]]
* [[EMACS]]

== Ссылки ==
* [[база знаний]]
* [http://lisp.org lisp.org] — Ассоциация пользователей Лисп
* [http://clisp.linkfly.ru clisp.linkfly.ru] — Множество материалов по Lisp
* [http://lisp.narod.ru/ lisp.narod.ru] — Начальные сведения о языках Лисп-семейства на русском
* [http://lisp.tomsk.ru lisp.tomsk.ru] — Лисп-портал.
* {{lj_comm|ru_lisp}} — сообщество в LiveJournal, посвящённое Лисп.
* [http://autocad.xarch.at/lsp_tools/ntemacs/autolisp.el Emacs-режим для AutoLISP] на [http://autocad.xarch.at/lsp_tools/ntemacs.html ресурсе XArch от Райни Урбана (Reini Urban)]
* [http://ideatech.narod.ru/AI_Library.htm#AI_Library Библиотека ИИ. Содержит библиотеку Лиспа]

{{Языки программирования}}

[[Категория:Лисп|*]]
[[Категория:Языки с динамической типизацией]]) called at [(path to MediaWiki installation)/includes/parser/Parser.php:1231]
#6  Parser->internalParse({{Карточка языка программирования
|name = Лисп
|logo =
|semantics = 
[[Мультипарадигменный язык программирования|мультипарадигменный]]: [[объектно-ориентированное программирование|объектно-ориентированное]], [[Функциональное программирование|функциональное]], [[процедурное программирование|процедурное]] программирование
|year = [[1958]]
|designer = [[Маккарти, Джон|Джон Маккарти]] 
|typing = [[Строгая типизация|cтрогая]], [[Динамическая типизация|динамическая]]
|implementations =
|dialects = [[Common Lisp]] ([[CLOS]]), [[Scheme]], [[Emacs lisp]]
|influenced = [[Лого (язык программирования)|Лого]], [[Smalltalk]], [[Python]], [[Ruby]] 
}}
'''Лисп''' (''LISP'', от {{lang-en|LISt Processing}} — «обработка списков») — семейство [[язык программирования|языков программирования]], основанных на представлении [[компьютерная программа|программы]] активной-реального-времени-символьно системой [[Линейный список|линейных списков]] '''[[символ]]ов''', которые притом являются основной [[Структура данных|структурой данных]] языка. Лисп считается вторым после [[Фортран]]а старейшим [[Высокоуровневый язык программирования|высокоуровневым языком программирования]].

* <b>Активная система</b> - каждый символ является динамической системой живущей в лисп-среде;
* <b>Реального времени</b> - реагирует на команды, события и проч.;
* <b>Символьная система</b> - реализует абстракцию, идею ламбда-исчисления, т.е. символы живут в свое родной среде. Возможность которая радикально определяет мир компьютеров. 

Лисп (lisp) имеет также значение «детский лепет» — тема интересовавшая создателя Лиспа Мак-Карти [http://www-formal.stanford.edu/jmc/robotandbaby.html The robot and the baby] и [http://www.ai.sri.com/project_list/all весь Стенфорд]. (Самые ходовые связки ИИ: ИИ — разведка (intelligence), ИИ — дети люди/киборги/роботы.)

Наиболее успешная платформа баз знаний на Лиспе [[KEE|KEE (Knowledge Engineering Enveronment]]).

В стандарте Common Lisp (каждый) символ реализован как узел многокоординатной опять же символьной сети. Координаты, свойства, уровни сети записаны в ящичках (slots) символа. Основные слоты: имя символа (основополагающее аристотелево А=А), функциональный слот, слот значение, расширяемый список свойств (можно сказать микромир самого символа).

Традиционный Лисп имеет строгую динамическую [[Тип данных|систему типов]], содержит императивные свойства, но в общем поощряет [[Функциональное программирование|функциональную]] парадигму программирования.

Полноценная символьная обработка подразумевает возможность создания любого профиля объектно-ориентированного программирования (то есть реализация полного ООП имеющего тот или иной характер средствами языка). Кодификацией, стандартизацией профиля ООП в стандарте Лиспа является платформа [[CLOS]].

Внешне [[исходный код]] программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием [[текстовый редактор|текстового редактора]], поддерживающего автоматическое выравнивание кода, [[Подсветка синтаксиса|подсветку]] соответствующих пар скобок и команды рода «перейти через список вправо». Хорошо приспособлен к кодированию на Лиспе редактор [[Emacs]] (большая часть которого написана на Лиспе), кроме того в коммерческих реализациях (например в [[LispWorks]]) [[Среда разработки программного обеспечения|IDE]] содержит удобные редакторы, сохраняющие все достоинства Emacs.

Язык Лисп наряду с языком [[Ada]] прошёл процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт [[Common Lisp]]. Его реализации существуют для большинства платформ. Есть реализации распространяемые свободно под лицензиями, позволяющими использовать Лисп без ограничений в коммерческих приложениях, кроме этого существуют коммерческие реализации, предлагающие дополнительные возможности (IDE, дополнительные библиотеки и т. п.), в том числе техническую поддержку. С полным списком реализаций можно ознакомиться здесь: [http://www.cliki.net/Common%20Lisp%20implementation Common Lisp Implementation].

== Синтаксис ==

Основной механизм Лиспа, инкапсулированная в список определяющая голова списка, и подключенный к ней хвост списка, который рекурсивно также может быть списком (ламбда-исчисление). Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго-научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на Лиспе состоит из последовательности ''выражений'' (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде ''списков'' — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Список является последовательностью элементов любого рода, в том числе других списков. Например, <code>(1 3/7 'foo #'+)</code> состоит из целого числа, рациональной дроби, ''символа'' <var>foo</var> и [[Указатель (программирование)|указателя]] на функцию сложения. Выражения представляются списками в [[префиксная запись|префиксной записи]]: первый элемент должен быть ''формой'', то есть ''функцией'', ''оператором'', ''макросом'' или ''специальным оператором''; прочие элементы суть аргументы, передаваемые форме для обработки. Функция <code>list</code> возвращает список состоящий из её аргументов: например, <code>(list 1 3/7 'foo #'+)</code> возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: <code>(list 1 2 (list 1 2))</code> возвращает <code>(1 2 (1 2))</code>. Арифметические операторы действуют так же, например <code>(+ 4 (* 2 3))</code> выдаёт 10.

Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются [[ветвление]] и [[цикл]]ы. Оператор <code>if</code> позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не <code>nil</code>, то вычисляется первый аргумент, иначе вычисляется второй. Например, <code>(if nil (list 1 2 "foo") (list 3 4 "bar"))</code> всегда возвращает <code>(3 4 "bar")</code>.

Символьная природа языка (то есть отсутствие в символьном пространстве традиционной метрической геометрии расстояний, последовательностей и т.д) позволяет легко и продуктивно распараллеливать Лисп-процессы. (Что нашло использование в сверхмощных телекоммуникационных, сетевых Лисп-системах.)

При всей мощности символьного подхода, он не может занять место контининтуальных (нейро) систем (не-машин!) [[нейрокомпьютер]]ов. Т. н. проблема образования категорий из сенсорных данных. (см. [http://cogprints.org/1593/00/harnad95.iee.html Harnad]).

== Примеры ==

Пример [[Куайн (программирование)|куайна]] (программы, выводящей свой исходный код) на Лиспе:

<source lang=lisp>
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
</source>

Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на [[Scheme]].

Итеративная версия функции определения N-го [[числа Фибоначчи]]:

<source lang=lisp>
(defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
        with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result))))
</source>

== Применение ==

Основная область применения Лиспа — динамическая генерация символьных миров и последующий процесс принятия решений (см. проекты [http://www.franz.com/success/all_customer_apps.lhtml Franz]).

Одно из направлений использования языка Lisp — его использование в качестве скриптого языка, автоматизирующего работу в ряде прикладных программ.

* Лисп используется как язык сценариев в [[САПР]] [[AutoCAD]] (диалект [[AutoLISP]])
* Лисп является одним из базовых средств текстового редактора [[Emacs]] (Диалект [[EmacsLISP]]). По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности.
* В оконном менеджере [[Sawfish]] применяется специальный диалект Лиспа [[Rep]], который в значительной степени повторяет диалект Лиспа от Emacs.
* Диалект [[Scheme]] используется в качестве одного из скриптовых языков в графическом процессоре [[Gimp]].

Сегодня Лисп используется во множестве различных проектов: от декодирования генома человека до системы проектирования авиалайнеров. Кроме традиционных научных и промышленных применений Лисп используется для высокодинамичных трёхмерных игр (диалект GOAL).

Большую системную и прикладную роль Лисп играет в Linux операционной системе [[Debian]]{{источник}}. <!-- нет у меня в дебиане лиспа, и ниче, живой `A5b -->

== Философия ==

Основной смысл Лисп-программы «жизнь» в символьном пространстве: перемещение, творчество, запоминание, создание новых миров и т. д. Лисп как метафора мозга, символ метафора сигнала {{источник?}}:

{{Начало цитаты}}
Как происходит биологический анализ сигналов мозгом, как внешний фактор — физическое и химическое воздействие, являющееся для организма раздражителем превращается в биологически значимый сигнал, зачастую жизненно важный, определяющий все поведение человека или животного; и как происходит разделение разных сигналов на положительные, отрицательные и безразличные, индифферентные. Сигнал это уже интегративное понятие. Он представляет собой опознавательный знак группы, комплексных раздражителей, связанных между собой общей историей и причинно следственными отношениями. В этом комплексе, системе раздражителей, сигнальный стимул сам является также составляющим элементом и при иных обстоятельствах его роль может принадлежать другому стимулу из комплекса. В сигнале концентрируется весь прошлый опыт животного или человека. (''Ю.&nbsp;Г.&nbsp;Кратин. «Анализ сигналов мозгом», 1975'')
{{Конец цитаты}}

== Идея ==
{{Периссный раздел}}
Основная идея и сила Лиспа — символьная обработка. Символьная обработка — один из двух базовых методов интеллектуальной работы компьютеры. Вход в символьное пространство позволяет заниматься задачами искусственного интеллекта: понимания окружающего мира и принятия решений. (Второй интеллектуальный метод — контининтуальная машина — нейросистема). Лисп настолько фундаментален, что достаточно иметь только Лисп, чтобы полноценно работать в области ИИ, и достаточно убрать Лисп, чтобы превратить работу в области ИИ в фарс (см. [[кретинизация]]). Вы будете смеяться, но нейросистемы также кретинизируются.

== Компиляторы ==

'''[http://www.beelisp.ru BEE Lisp](Balabanov Eugene Embeddable Lisp)''' — это легковесный коммерческий компилятор для языка [[Lisp]], разработанный Компанией «Симплтек Девелопмент». Компилятор позволяет создавать полностью автономные EXE и DLL файлы. В отличие от большинства аналогов, исполняемые файлы, созданные этим компилятором не требуют присутствия каких либо интерпретаторов или виртуальных машин. Его программный интерфейс для взаимодействия с ОС позволяет использовать DLL файлы, созданные сторонними разработчиками на других языках (таких как С++). Таким образом, можно вызывать как API функции Windows, так и API функции сторонних SDK из кода на языке Лисп. Можно смешивать Лисп код с кодом, созданным на компилируемых языках, таких как С++ и наоборот — можно вызывать лисп функции из С++ программ.

'''[http://homelisp.ru HomeLisp] (HomeLisp - "домашний Лисп")''' - простая бесплатная Лисп-система, ориентированная на Windows. Поставляется вместе с простой IDE. Содержит в своем составе COM-библиотеку и два скриптовых движка, позволяющих писать скрипты на Лиспе, а также вызывать Лисп из любой среды, поддерживающей COM. Имеется поддержка графики. Реализована возможность построения автономных EXE-файлов в т.ч. и с графическим интерфейсом. Поддерживается сверхдлинная арифметика целых. Система снабжена '''[http://homelisp.ru/help/index.html подробной документацией]'''.

== См. также ==
* [[SLIME]]
* [[EMACS]]

== Ссылки ==
* [[база знаний]]
* [http://lisp.org lisp.org] — Ассоциация пользователей Лисп
* [http://clisp.linkfly.ru clisp.linkfly.ru] — Множество материалов по Lisp
* [http://lisp.narod.ru/ lisp.narod.ru] — Начальные сведения о языках Лисп-семейства на русском
* [http://lisp.tomsk.ru lisp.tomsk.ru] — Лисп-портал.
* {{lj_comm|ru_lisp}} — сообщество в LiveJournal, посвящённое Лисп.
* [http://autocad.xarch.at/lsp_tools/ntemacs/autolisp.el Emacs-режим для AutoLISP] на [http://autocad.xarch.at/lsp_tools/ntemacs.html ресурсе XArch от Райни Урбана (Reini Urban)]
* [http://ideatech.narod.ru/AI_Library.htm#AI_Library Библиотека ИИ. Содержит библиотеку Лиспа]

{{Языки программирования}}

[[Категория:Лисп|*]]
[[Категория:Языки с динамической типизацией]]) called at [(path to MediaWiki installation)/includes/parser/Parser.php:434]
#7  Parser->parse({{Карточка языка программирования
|name = Лисп
|logo =
|semantics = 
[[Мультипарадигменный язык программирования|мультипарадигменный]]: [[объектно-ориентированное программирование|объектно-ориентированное]], [[Функциональное программирование|функциональное]], [[процедурное программирование|процедурное]] программирование
|year = [[1958]]
|designer = [[Маккарти, Джон|Джон Маккарти]] 
|typing = [[Строгая типизация|cтрогая]], [[Динамическая типизация|динамическая]]
|implementations =
|dialects = [[Common Lisp]] ([[CLOS]]), [[Scheme]], [[Emacs lisp]]
|influenced = [[Лого (язык программирования)|Лого]], [[Smalltalk]], [[Python]], [[Ruby]] 
}}
'''Лисп''' (''LISP'', от {{lang-en|LISt Processing}} — «обработка списков») — семейство [[язык программирования|языков программирования]], основанных на представлении [[компьютерная программа|программы]] активной-реального-времени-символьно системой [[Линейный список|линейных списков]] '''[[символ]]ов''', которые притом являются основной [[Структура данных|структурой данных]] языка. Лисп считается вторым после [[Фортран]]а старейшим [[Высокоуровневый язык программирования|высокоуровневым языком программирования]].

* <b>Активная система</b> - каждый символ является динамической системой живущей в лисп-среде;
* <b>Реального времени</b> - реагирует на команды, события и проч.;
* <b>Символьная система</b> - реализует абстракцию, идею ламбда-исчисления, т.е. символы живут в свое родной среде. Возможность которая радикально определяет мир компьютеров. 

Лисп (lisp) имеет также значение «детский лепет» — тема интересовавшая создателя Лиспа Мак-Карти [http://www-formal.stanford.edu/jmc/robotandbaby.html The robot and the baby] и [http://www.ai.sri.com/project_list/all весь Стенфорд]. (Самые ходовые связки ИИ: ИИ — разведка (intelligence), ИИ — дети люди/киборги/роботы.)

Наиболее успешная платформа баз знаний на Лиспе [[KEE|KEE (Knowledge Engineering Enveronment]]).

В стандарте Common Lisp (каждый) символ реализован как узел многокоординатной опять же символьной сети. Координаты, свойства, уровни сети записаны в ящичках (slots) символа. Основные слоты: имя символа (основополагающее аристотелево А=А), функциональный слот, слот значение, расширяемый список свойств (можно сказать микромир самого символа).

Традиционный Лисп имеет строгую динамическую [[Тип данных|систему типов]], содержит императивные свойства, но в общем поощряет [[Функциональное программирование|функциональную]] парадигму программирования.

Полноценная символьная обработка подразумевает возможность создания любого профиля объектно-ориентированного программирования (то есть реализация полного ООП имеющего тот или иной характер средствами языка). Кодификацией, стандартизацией профиля ООП в стандарте Лиспа является платформа [[CLOS]].

Внешне [[исходный код]] программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием [[текстовый редактор|текстового редактора]], поддерживающего автоматическое выравнивание кода, [[Подсветка синтаксиса|подсветку]] соответствующих пар скобок и команды рода «перейти через список вправо». Хорошо приспособлен к кодированию на Лиспе редактор [[Emacs]] (большая часть которого написана на Лиспе), кроме того в коммерческих реализациях (например в [[LispWorks]]) [[Среда разработки программного обеспечения|IDE]] содержит удобные редакторы, сохраняющие все достоинства Emacs.

Язык Лисп наряду с языком [[Ada]] прошёл процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт [[Common Lisp]]. Его реализации существуют для большинства платформ. Есть реализации распространяемые свободно под лицензиями, позволяющими использовать Лисп без ограничений в коммерческих приложениях, кроме этого существуют коммерческие реализации, предлагающие дополнительные возможности (IDE, дополнительные библиотеки и т. п.), в том числе техническую поддержку. С полным списком реализаций можно ознакомиться здесь: [http://www.cliki.net/Common%20Lisp%20implementation Common Lisp Implementation].

== Синтаксис ==

Основной механизм Лиспа, инкапсулированная в список определяющая голова списка, и подключенный к ней хвост списка, который рекурсивно также может быть списком (ламбда-исчисление). Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго-научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.

Любая программа на Лиспе состоит из последовательности ''выражений'' (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде ''списков'' — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Список является последовательностью элементов любого рода, в том числе других списков. Например, <code>(1 3/7 'foo #'+)</code> состоит из целого числа, рациональной дроби, ''символа'' <var>foo</var> и [[Указатель (программирование)|указателя]] на функцию сложения. Выражения представляются списками в [[префиксная запись|префиксной записи]]: первый элемент должен быть ''формой'', то есть ''функцией'', ''оператором'', ''макросом'' или ''специальным оператором''; прочие элементы суть аргументы, передаваемые форме для обработки. Функция <code>list</code> возвращает список состоящий из её аргументов: например, <code>(list 1 3/7 'foo #'+)</code> возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: <code>(list 1 2 (list 1 2))</code> возвращает <code>(1 2 (1 2))</code>. Арифметические операторы действуют так же, например <code>(+ 4 (* 2 3))</code> выдаёт 10.

Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются [[ветвление]] и [[цикл]]ы. Оператор <code>if</code> позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не <code>nil</code>, то вычисляется первый аргумент, иначе вычисляется второй. Например, <code>(if nil (list 1 2 "foo") (list 3 4 "bar"))</code> всегда возвращает <code>(3 4 "bar")</code>.

Символьная природа языка (то есть отсутствие в символьном пространстве традиционной метрической геометрии расстояний, последовательностей и т.д) позволяет легко и продуктивно распараллеливать Лисп-процессы. (Что нашло использование в сверхмощных телекоммуникационных, сетевых Лисп-системах.)

При всей мощности символьного подхода, он не может занять место контининтуальных (нейро) систем (не-машин!) [[нейрокомпьютер]]ов. Т. н. проблема образования категорий из сенсорных данных. (см. [http://cogprints.org/1593/00/harnad95.iee.html Harnad]).

== Примеры ==

Пример [[Куайн (программирование)|куайна]] (программы, выводящей свой исходный код) на Лиспе:

<source lang=lisp>
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
</source>

Данная программа должна работать на большинстве диалектов Лиспа, в том числе и на [[Scheme]].

Итеративная версия функции определения N-го [[числа Фибоначчи]]:

<source lang=lisp>
(defun fibonacci (x)
  (if (= x 0) 
      1 
      (loop with result = 1
        with prev = 1
            for i from 0 below (1- x) 
            do (psetq result (+ result prev) prev result))))
</source>

== Применение ==

Основная область применения Лиспа — динамическая генерация символьных миров и последующий процесс принятия решений (см. проекты [http://www.franz.com/success/all_customer_apps.lhtml Franz]).

Одно из направлений использования языка Lisp — его использование в качестве скриптого языка, автоматизирующего работу в ряде прикладных программ.

* Лисп используется как язык сценариев в [[САПР]] [[AutoCAD]] (диалект [[AutoLISP]])
* Лисп является одним из базовых средств текстового редактора [[Emacs]] (Диалект [[EmacsLISP]]). По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности.
* В оконном менеджере [[Sawfish]] применяется специальный диалект Лиспа [[Rep]], который в значительной степени повторяет диалект Лиспа от Emacs.
* Диалект [[Scheme]] используется в качестве одного из скриптовых языков в графическом процессоре [[Gimp]].

Сегодня Лисп используется во множестве различных проектов: от декодирования генома человека до системы проектирования авиалайнеров. Кроме традиционных научных и промышленных применений Лисп используется для высокодинамичных трёхмерных игр (диалект GOAL).

Большую системную и прикладную роль Лисп играет в Linux операционной системе [[Debian]]{{источник}}. <!-- нет у меня в дебиане лиспа, и ниче, живой `A5b -->

== Философия ==

Основной смысл Лисп-программы «жизнь» в символьном пространстве: перемещение, творчество, запоминание, создание новых миров и т. д. Лисп как метафора мозга, символ метафора сигнала {{источник?}}:

{{Начало цитаты}}
Как происходит биологический анализ сигналов мозгом, как внешний фактор — физическое и химическое воздействие, являющееся для организма раздражителем превращается в биологически значимый сигнал, зачастую жизненно важный, определяющий все поведение человека или животного; и как происходит разделение разных сигналов на положительные, отрицательные и безразличные, индифферентные. Сигнал это уже интегративное понятие. Он представляет собой опознавательный знак группы, комплексных раздражителей, связанных между собой общей историей и причинно следственными отношениями. В этом комплексе, системе раздражителей, сигнальный стимул сам является также составляющим элементом и при иных обстоятельствах его роль может принадлежать другому стимулу из комплекса. В сигнале концентрируется весь прошлый опыт животного или человека. (''Ю.&nbsp;Г.&nbsp;Кратин. «Анализ сигналов мозгом», 1975'')
{{Конец цитаты}}

== Идея ==
{{Периссный раздел}}
Основная идея и сила Лиспа — символьная обработка. Символьная обработка — один из двух базовых методов интеллектуальной работы компьютеры. Вход в символьное пространство позволяет заниматься задачами искусственного интеллекта: понимания окружающего мира и принятия решений. (Второй интеллектуальный метод — контининтуальная машина — нейросистема). Лисп настолько фундаментален, что достаточно иметь только Лисп, чтобы полноценно работать в области ИИ, и достаточно убрать Лисп, чтобы превратить работу в области ИИ в фарс (см. [[кретинизация]]). Вы будете смеяться, но нейросистемы также кретинизируются.

== Компиляторы ==

'''[http://www.beelisp.ru BEE Lisp](Balabanov Eugene Embeddable Lisp)''' — это легковесный коммерческий компилятор для языка [[Lisp]], разработанный Компанией «Симплтек Девелопмент». Компилятор позволяет создавать полностью автономные EXE и DLL файлы. В отличие от большинства аналогов, исполняемые файлы, созданные этим компилятором не требуют присутствия каких либо интерпретаторов или виртуальных машин. Его программный интерфейс для взаимодействия с ОС позволяет использовать DLL файлы, созданные сторонними разработчиками на других языках (таких как С++). Таким образом, можно вызывать как API функции Windows, так и API функции сторонних SDK из кода на языке Лисп. Можно смешивать Лисп код с кодом, созданным на компилируемых языках, таких как С++ и наоборот — можно вызывать лисп функции из С++ программ.

'''[http://homelisp.ru HomeLisp] (HomeLisp - "домашний Лисп")''' - простая бесплатная Лисп-система, ориентированная на Windows. Поставляется вместе с простой IDE. Содержит в своем составе COM-библиотеку и два скриптовых движка, позволяющих писать скрипты на Лиспе, а также вызывать Лисп из любой среды, поддерживающей COM. Имеется поддержка графики. Реализована возможность построения автономных EXE-файлов в т.ч. и с графическим интерфейсом. Поддерживается сверхдлинная арифметика целых. Система снабжена '''[http://homelisp.ru/help/index.html подробной документацией]'''.

== См. также ==
* [[SLIME]]
* [[EMACS]]

== Ссылки ==
* [[база знаний]]
* [http://lisp.org lisp.org] — Ассоциация пользователей Лисп
* [http://clisp.linkfly.ru clisp.linkfly.ru] — Множество материалов по Lisp
* [http://lisp.narod.ru/ lisp.narod.ru] — Начальные сведения о языках Лисп-семейства на русском
* [http://lisp.tomsk.ru lisp.tomsk.ru] — Лисп-портал.
* {{lj_comm|ru_lisp}} — сообщество в LiveJournal, посвящённое Лисп.
* [http://autocad.xarch.at/lsp_tools/ntemacs/autolisp.el Emacs-режим для AutoLISP] на [http://autocad.xarch.at/lsp_tools/ntemacs.html ресурсе XArch от Райни Урбана (Reini Urban)]
* [http://ideatech.narod.ru/AI_Library.htm#AI_Library Библиотека ИИ. Содержит библиотеку Лиспа]

{{Языки программирования}}

[[Категория:Лисп|*]]
[[Категория:Языки с динамической типизацией]], LISP, Object of class ParserOptions could not be converted to string, 1, 1, 338880) called at [(path to MediaWiki installation)/includes/content/WikitextContent.php:333]
#8  WikitextContent->fillParserOutput(LISP, 338880, Object of class ParserOptions could not be converted to string, 1, Object of class ParserOutput could not be converted to string) called at [(path to MediaWiki installation)/includes/content/AbstractContent.php:497]
#9  AbstractContent->getParserOutput(LISP, 338880, Object of class ParserOptions could not be converted to string) called at [(path to MediaWiki installation)/includes/poolcounter/PoolWorkArticleView.php:140]
#10 PoolWorkArticleView->doWork() called at [(path to MediaWiki installation)/includes/poolcounter/PoolCounterWork.php:123]
#11 PoolCounterWork->execute() called at [(path to MediaWiki installation)/includes/page/Article.php:674]
#12 Article->view() called at [(path to MediaWiki installation)/includes/actions/ViewAction.php:44]
#13 ViewAction->show() called at [(path to MediaWiki installation)/includes/MediaWiki.php:395]
#14 MediaWiki->performAction(Object of class Article could not be converted to string, LISP) called at [(path to MediaWiki installation)/includes/MediaWiki.php:273]
#15 MediaWiki->performRequest() called at [(path to MediaWiki installation)/includes/MediaWiki.php:566]
#16 MediaWiki->main() called at [(path to MediaWiki installation)/includes/MediaWiki.php:414]
#17 MediaWiki->run() called at [(path to MediaWiki installation)/index.php:41]
alex-mashin commented 9 years ago

The words "hash collision" suddenly came to my mind (since two different wikipages are somehow mixed in the stacktrace). Could it be that HHVM implements some hashing function differently from PHP?

jwatzman commented 9 years ago

Could it be that HHVM implements some hashing function differently from PHP?

It's possible, but we still shouldn't be crashing. An isolated case, if you can get one, would still be really helpful here... not sure if there's much we'll be able to do if you can't whittle it down :(

alex-mashin commented 9 years ago

The maintainers fixed the bugs that prevented using Syntax Highlight master branch with MediaWiki 1.25, so I upgraded Syntax Highlight. The master branch does not cause HHVM to segfault, so I think I won't be able to provide any more information on this issue. Perhaps, it is better to close it now.

jwatzman commented 9 years ago

OK, will do, we can reopen if you can get a repro case.