LINUX.ORG.RU

Об угребищности систем общего назначения

 , ,


2

5

Значит, я с бодуна вот что придумал.

Универсальный Критерий Угребищности Систем Общего Назначения. (Теорема лавсана)

Система Общего Назначения является Угребищной тогда и только тогда когда она не является Метациклическим Интерпретатором.

Другими словами: Система, не способная к построению Метасистемы в рамках самой себя, то есть не способная к описанию и изменению самой себя в своих же терминах, и при этом являющаяся Системой Общего Назначения(в какой-либо области), Угребищна.

Обратное, естественно, неверно. Если Метасистему Системы Общего Назначения можно описать другой системой, это совершенно не значит что она Угребищна, и более того, в таком случае не существовало бы концепции бутстрапа, а значит и Метациклических Интерпретаторов вообще.

Чем, в контексте языков программирования, это отличается от просто тьюринг-полноты?

Тем, что имея в руках тьюринг-полный язык, мы, естественно можем построить метасистему для этого языка на нем самом, и более того это стандартная практика(компиляторы, анализаторы кода и другие средства разработки на мейнстримных языках как правило пишутся на них самих же), но такая метасистема не будет доступна в этом же языке, покуда мы не изменим язык и ее в язык не включим, получив в итоге диалект лиспа.

Альтернативно, мы можем такую метасистему использовать как стороннее средство, связанное через стороннюю систему(скажем генерировать код и вызывать компилятор через создание процесса операционной системы в которой запускается программа на нашем тьюринг-полном языке), подтверждая тем самым десятое правило Гринспуна, и собственно тезис теоремы.

Примеры, сначала метациклических интерпретаторов:

  • Универсальная машина Тьюринга
  • RASP-машина
  • Реляционная модель данных
  • Лисп

А вот скажем примеры систем, соответствующих критерию:

  • Среднестатистический современный регистровый процессор
  • Большинство языков программирования, особенно со статической типизацией.
  • Большинство NoSQL моделей данных или скажем иерархических моделей данных, вроде файловых систем

В частности, давайте посмотрим на C#. C# не является метациклическим интерпретатором, т.к. термины языка не являются его же объектами.

Отчасти, это компенсируется платформой .Net, для которой термины C#(но не все) объектами таки являются(System.Reflection, грядущий Roslyn и т.д.), отчасти, в самой малой степени, фичей nameof() из C# 6, но это все только отчасти.

Сама же платформа .Net критерию тоже соответствует, но, в теории из нее можно было бы сделать метациклический интерпретатор, лисп-машину, внеся лишь достаточно небольшие изменения.

Дискач.

UPD. Собственно, отличнейшую статью нашел на эту тему: http://weblog.raganwald.com/2006/11/significance-of-meta-circular_22.html

★★★

Последнее исправление: lovesan (всего исправлений: 1)
Ответ на: комментарий от lovesan

«рантайм си» - это просто библиотека ф-й, которые могут быть написаны, действительно, на чем угодно - в том числе и на си, так как потом компилируются в машкод и спокойно запускаются процессором. Но код на лиспе даже после компиляции не может быть «просто запущен» процессором.

anonymous
()
Ответ на: комментарий от lovesan

По аналогии - когда мы пишем ядро лисп-системы, нам достаточно ограничить использование стандартных фич, типа GC(как аналогично в ядре ограничивается использование юзерспейсного malloc)

То есть ты написал рантайм лиспа на некотором языке Х, который походит на лиса, но лиспом не является и при этом _может_ запускаться без рантайма. Но от этого твой рантайм не стал написанным на лиспе - он написан на Х - другом языке, с другой семантикой. И это ничуть не отличается от того, если бы он был написан на сишке.

anonymous
()
Ответ на: комментарий от anonymous

Рантайм Си, наркоман, это не «просто библиотека стандартных функций», это вещи вроде линейной памяти, соглашения о NULL итд.

Но код на лиспе даже после компиляции не может быть «просто запущен» процессором.

 (disassemble (lambda (x y) 
                (declare (type fixnum x y)
                         (optimize (speed 3) (safety 0) (debug 0)))
                (the fixnum (+ x y))))

; disassembly for (LAMBDA (X Y))
; Size: 13 bytes. Origin: #x24F34528
; 28:       850500000F22     TEST EAX, [#x220F0000]           ; safepoint
                                                              ; no-arg-parsing entry point
; 2E:       01FA             ADD EDX, EDI
; 30:       8BE5             MOV ESP, EBP
; 32:       F8               CLC
; 33:       5D               POP EBP
; 34:       C3               RET

Прикинь, может. И GC это просто стандартная функция такая.

lovesan ★★★
() автор топика
Ответ на: комментарий от anonymous

1) GC для лиспа спокойно пишется на лиспе. 2) Для Си тоже нужен рантайм, наркоман.

Короче я устал разговаривать с бревном.

lovesan ★★★
() автор топика
Ответ на: комментарий от lovesan

Рантайм Си, наркоман, это не «просто библиотека стандартных функций»

Это именно но.

Прикинь, может.

По твоей логике, рантайм любого языка, который компилируется в машкод/джитуется, может быть написан на этом языке.

anonymous
()
Ответ на: комментарий от lovesan

1) GC для лиспа спокойно пишется на лиспе.

Еще раз для дебилов-алкоголиков. Чтобы запустить код на лиспе НУЖЕН РАБОТАЮЩИЙ РАНТАЙМ НА ЛИСПЕ. Нельзя запустить код на лиспе без этого рантайма, это в принципе невозможно. Например, чтобы запустить код на лиспе нужен работающий гц - который является частью рантайма. Нельзя запустить код на лиспе без гц - потому что семанткиа будет нарушена и это будет уже НЕ лисп.

Таким образом, чтобы запустить гц - тебе нужен уже рабочий гц.

2) Для Си тоже нужен рантайм, наркоман.

«рантайм» сишки - это, еще раз, не более чем набор библиотек.

anonymous
()
Ответ на: комментарий от anonymous

По твоей логике, рантайм любого языка, который компилируется в машкод/джитуется, может быть написан на этом языке.

В случае с JIT - только если есть возможность компиляроваться в нейтив без JIT, а так - да.

lovesan ★★★
() автор топика
Ответ на: комментарий от anonymous

Еще раз для дебилов-алкоголиков. Чтобы запустить код на лиспе НУЖЕН РАБОТАЮЩИЙ РАНТАЙМ НА ЛИСПЕ. Нельзя запустить код на лиспе без этого рантайма, это в принципе невозможно. Например, чтобы запустить код на лиспе нужен работающий гц - который является частью рантайма. Нельзя запустить код на лиспе без гц - потому что семанткиа будет нарушена и это будет уже НЕ лисп.

1) Чтобы скомпилировать компилятор лиспа нужен работающий компилятор лиспа. 2) Можно запустить скомпилированный код на лиспе, т.к. он исполняется процессором. Что непонятно?

lovesan ★★★
() автор топика
Ответ на: комментарий от lovesan

1) Чтобы скомпилировать компилятор лиспа нужен работающий компилятор лиспа.

Работающий в этой же лисп-системе причем. Но это тебе мозг совсем взорвет, боюсь.

lovesan ★★★
() автор топика
Ответ на: комментарий от lovesan

2) Можно запустить скомпилированный код на лиспе, т.к. он исполняется процессором.

Чтобы запустить код на лиспе - нужен работающий гц.

anonymous
()
Ответ на: комментарий от lovesan

В случае с JIT - только если есть возможность компиляроваться в нейтив без JIT, а так - да.

Но в sbcl нету такой возможности.

anonymous
()
Ответ на: комментарий от lovesan

1) Чтобы скомпилировать компилятор лиспа нужен работающий компилятор лиспа.

на чем был написан самый первый лисп в цепочке? Мы же не на лисп-машине выполняем, а на x86, значит выбор невелик - си или ассемблер, и твое утвеждение «скомпилировать компилятор лиспа нужен работающий компилятор лиспа» неверно для самого первого лиспа, так?

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Для CL возможен трехступенчатый бутстрап, по идее, но это много гемороя. Для порта на другие системы - кросс-компиляция первой стадии, как-то так. В случае CMUCL подозреваю, он был забутстраплен тоже каким-либо CL, или может MacLisp, каким-нибудь. Вряд ли C++ или подобным говном. Насколько я знаю, с C++ вроде бы бутстрапится Clozure CL.

Самый первый лисп был написан на бумаге :)

lovesan ★★★
() автор топика
Ответ на: комментарий от anonymous

Есть, просто всем лень - рантайм на си более-менее вроде работает.

lovesan ★★★
() автор топика
Ответ на: комментарий от lovesan

Given that the Lisp part of the system includes the native code compiler (yes, all of it, even the code generator) and assembler, there's no reason all this C couldn't be written in Lisp - or some form of non-consing proto-Lisp, in the case of the GC - and we'd expect it to run about as fast, too, but really, why bother? SBCL runs on a fairly large number of Unixlike systems, and we (the maintainers) have better things to do than keeping a list of system call numbers and ActivationRecord layouts for signal handlers for each of them. — DanBarlow, SBCL hacker, but speaking for myself

lovesan ★★★
() автор топика
Ответ на: комментарий от anonymous

Проблема в том, что без гц ты будешь запускать не лисп, а его подмножество. И это подмножество будет ближе к сишке, чем к лиспу по семантике. Так какой смысл его называть лиспом?

anonymous
()
Ответ на: комментарий от lovesan

some form of non-consing proto-Lisp, in the case of the GC

Ну о чем я и говорю - мы делаем какой-то «non-consing proto-Lisp», который нет ни одной причины называть лиспом, пишем на нем все что надо и бутстрапим. Но мы написали рантайм в итоге не на лиспе, а на этом «non-consing proto-Lisp», который ни с какой стороны не лисп.

anonymous
()
Ответ на: комментарий от lovesan

Лисп будет вполне.

Так, давай определимся, что такое «лисп»? есть например common lisp, и это будет НЕ common lisp, очевидно. Какие есть основания считать этот самый «proto-lisp» лиспом? Из-за синтаксиса (ведь семантика у него будет совсем не лисповая)? Он non-consed, он не метацикличен, там даже нету ФВП. Ну какой с него лисп?

anonymous
()
Ответ на: комментарий от stevejobs

Я говорю о том, что если мы что-то назвали лиспом, то оно лиспом не станет. Оно должно обладать какими-то характерными для лиспа качествами. Какими характерными для лиспа качествами будет обладать этот «proto-lisp»? Потому что на поверку оказывается, чо он в силу своего назначения никакими из них обладать не может как раз.

anonymous
()

" Система, не способная к построению Метасистемы в рамках самой себя, то есть не способная к описанию и изменению самой себя в своих же терминах, и при этом являющаяся Системой Общего Назначения(в какой-либо области), Угребищна."

Из чего следует, что любая не Угребищная система (т.е. способная к самомодификации) нарушает Второй Протокол (ц) Automata и должна быть уничтожена!11 Желательно, вместе с ее создателем.

anonymous
()
Ответ на: комментарий от anonymous

Я думаю рантайм SBCL написан на Си только потому что у него лучше оптимизация чем у SBCL. Один фиг код рантайма компилируется в маш коды. Хоть ты на си пиши компилятор хоть на PHP+VB. Или ты думаешь там рантайм чистую сишечку гоняет а по ней сверху common lisp? Если так, то ты ошибаешься.

Int0l ★★
()
Ответ на: комментарий от Int0l

Я думаю рантайм SBCL написан на каком-то Лиспе, потому что иначе им было бы проще покончить жизнь самоубийством

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.