OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 14 Июнь, 2025 17:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 08:26 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Oleg N. Cher писал(а):
budden писал(а):
Так если не хотите, чтобы я с Вами спорил, то и не надо делать сомнительных утверждений. (+ a b) в лиспе не совсем однозначно из-за динамической типизации. Кроме того, в общелиспе по умолчанию используются настоящие числа, а не эрзац-числа по модулю 2^N.
А где используются ненастоящие эрзац-числа по модулю 2^N? Везде, кроме Лиспов?

Вот про эрзац-числа это очень сомнительное утверждение. Везде числа как числа, а у нас нет. ;)

budden писал(а):
А настоящие числа нельзя сложить одной машинной командой.
Поясните.

budden писал(а):
Хотя если из анализа объявлений типов компилятору будет известно, что их сумма не вызовет переполнения fixnum-а, то может быть в компиляторах (компиляторов CL в машинный код я знаю 4 штуки, а уж сколько компиляторов Схемы - наверное, десятки) это и превратится в одну машинную команду - я не проверял.
Вот. Ваша слабость в незнании низкого уровня. И не надо про специализированные аппаратные Лисп-машины. У нас под рукой их просто нет и не будет.

Переполнение в машкоде легко ловится, обычно после операции на него указывает установленный флаг C (carry).

budden писал(а):
Да, для эффективного выполнения лиспа нужна компиляция. Ну и что? Для Оберона она тоже нужна. Из того, что лисп к тому же очень легко интерпретировать, вы пытаетесь вывести, что он хуже? Не получится.
Оберон тоже очень легко интерпретировать, только смысла нет.

Вы не уловили мой посыл. В Лиспе компиляция "ненастоящая". Не в родной машкод. Хотя я признаю наличие инструментов, которые, возможно, делают какие-то попытки в этом направлении, но в силу природы языка это слабые и плохие потуги. Вот поэтому и хуже. Для меня, не для Вас. Я свои выводы сделал, и Ваши посты меня в обратном никак не убеждают. Впрочем, и не должны. Не убеждают, что Лисп лучше и выгоднее для разработки, чем язык [ X ], что он повышает производительность и бла-бла. Ну нравится Вам, ради бога. Я сюда захожу про Оберон прочитать, а не про мифическую простоту Лиспа. 0 и 1 - куда уж проще.

budden писал(а):
Касаемо жирных виртуальных машин, на фоне Java и Python Лисп достаточно хорошо выглядит по производительности и по расходу памяти, если правильно писать.
А Вы не с Python сравнивайте, а с Rust или Zig. Какой смысл в ещё одной тормозной технологии?

budden писал(а):
Я говорил о том, что лисп проще Оберона, если вынести производительность за скобки, и на единицу сложности у лиспа гораздо больше выразительности.
((((((((((действительно?))))))))))

budden писал(а):
Вы же говорите, что он медленнее. Но за простоту надо платить.
Я Вам уже писал, что простота Лиспа не в том, что на нём просто писать. Лисп требует серьёзной подстройки мышления (как Форт), но если в случае с Rust это ещё имеет какой-то смысл, то в случае Лиспа точно нет. И вот эти попытки самоутвердиться, что Вы-де из иной касты Познавших Тайную мудрость - они какие-то даже наивные. Вы мне этим напоминаете старого доброго Geniepro, только у него вместо Лиспа был Haskel. Тоже избранный, тоже вы все тут нифига не понимаете. Но про монады было интереснее. ;)

Я даже больше скажу. Функциональное программирование в целом никак не будет производительнее императивного. И то, что на нём как-то элегантнее можно выразить какие-то частные случаи, ничего не даёт в общем. Избавиться от переменных и стейт-машины, чтобы было легче распараллелить процессы? Ну несерьёзно же.

Вот у Оберона простота человеческая. На нём удобно проектировать программы. За что и ценим. Если мне понадобится список, то я его легко сварганю. Но как Форт навязывает программисту свой стек и обратную польскую запись, так Лисп навязывает ему списки, скобки и префиксную. В любом случае, это уже требует "распаковки" кода в голове. А код на Обероне мы просто читаем, как есть. Неужто Вы не понимаете этой разницы? Только не говорите, что Вы с Марса, и там все на Лиспе думают. ;)

P. S. А за "экспортируем всё" и "модули - они вообще не являются необходимыми" вообще убыв бы (c)

Скажите, в чём Ваш интерес ходить к оберонщикам и навязывать им свой Лисп?

budden писал(а):
Вы ведь пытаетесь сказать, что лисп плохой, верно?
Неверно. Я лишь пытаюсь сказать, что я захожу сюда за Обероном. А Лисп мне неинтересен.

budden писал(а):
Кроме того, я говорил о нише Оберона 07, а Вы стали говорить, что лисп туда не лезет.
Вы говорили про простоту Лиспа для мелких машин. В современный ARM Лисп вполне себе влезет, но толку с него там будет мало. Про задачи реального времени даже не будем начинать.

budden писал(а):
я не знаток лиспов для мелких машин, хотя они существуют.
Они там существовали, скорее. Когда-то.

Хотя, Вы видите, мы и термин "мелкие машины" с Вами понимаем по-разному. Я не о ZeroPi, я о ретро из 80х. ZeroPi Ваш Лисп вывезет, было бы счастье.


Много тут написано и про лисп, и про меня, грешного, нехорошего, отвечу на избранное.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 08:39 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Код:
(declaim (optimize (speed 3) (safety 0)))

(deftype эрзац-число () 'fixnum)

(defparameter *максимальное-эрзац-число* most-positive-fixnum)

;; 2 бита у 64-разрядных маленьких чисел в 64-разрядном SBCL заняты тегом типа
;; это два нуля, что и даёт возможность их складывать.
(assert (= *максимальное-эрзац-число* (- (expt 2 62) 1)))

(declaim (ftype (function (эрзац-число эрзац-число) эрзац-число) эрзац-сумма-эрзац-чисел))

(defun эрзац-сумма-эрзац-чисел (a b)
  (declare (эрзац-число a)
           (эрзац-число b))
  (the fixnum (+ a b)))

(print (эрзац-сумма-эрзац-чисел *максимальное-эрзац-число* *максимальное-эрзац-число*))


Далее,
Код:
; disassembly for эрзац-сумма-эрзац-чисел
; Size: 21 bytes. Origin: #x2339C1CA
; CA:       498B442460       mov RAX, [R12+96]                ; no-arg-parsing entry point
                                                              ; thread.binding-stack-pointer
; CF:       488945F8         mov [RBP-8], RAX
; D3:       4801F9           add RCX, RDI
; D6:       488BD1           mov RDX, RCX
; D9:       488BE5           mov RSP, RBP
; DC:       F8               clc
; DD:       5D               pop RBP
; DE:       C3               ret
nil

Это мой ответ на ложное утверждение о том, что лисп компилирует в ненастоящий машинный код. Я бы в этом месте на месте Олега бы хотя бы признал, что написал неправду, извинений не надо, спасибо, хотя и высказывание, что я "не знаю низкий уровень" тоже верно лишь относительно и можно сказать, что это клевета.

Когда я пишу на лиспе, я не пользуюсь эрзац-числами, поэтому не могу сказать, как отловить переполнение и возможно ли это. Данный код просто сбрасывает флаг переноса и печатает -2. Код, отлавливающий выход за пределы диапазона, пишется просто, но машинный код будет сложнее. И по сути дела мой код работает в UB, поскольку я написал safety 0, в этом случае поведение при переполнении скорее всего является UB.

В большинстве языков используются именно эрзац-числа. Я не думаю, что язык без настоящих чисел можно называть языком высокого уровня. На бумажке можно сложить очень большие числа в столбик, а на Обероне это нельзя сделать. Странно, можно ли называть это языком высокого уровня. Питон, видимо, является языком высокого уровня и в нём тоже по умолчанию используются настоящие числа. Однако сложение настоящих чисел - это сложно, поскольку для этого требуется динамическая память. Обычно оно реализовано в виде библиотеки (и в A2 вроде есть такая библиотека). Поэтому вполне оправдано, что на мелких машинах используются эрзац-числа вместо настоящих. Конечно, и лисп можно засадить в засаду, если дать число, которое не поместится в памяти, однако гугл легко помещается:
Код:
157 cl-user>(+ (expt 10 100) 1)
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

И да, числа с плавающей точкой в Common Lisp - тоже эрзац, но есть хотя бы рациональные дроби:
Код:
>(expt 5/6 3)
125/216


Последний раз редактировалось budden Четверг, 14 Ноябрь, 2024 09:10, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 08:44 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Кроме этого, в лиспе есть FFI и можно создать сущности типов, похожих на типы из Си (там целая технология под капотом, которая отлавливает нюансы размещения сишных объектов в памяти, создавая маленькие экспериментальные программки, называется CFFI-GROVEL). Наверное, их можно и сложить, для этого есть соответствующие (не входящие в стандарт языка) примитивы, кажется, это называется VOP. Но я не буду этим заниматься, т.к. не помню, чтобы этим занимался и не знаю, как это делается. Плюс к тому и так уже время потратил на этот ответ.


Последний раз редактировалось budden Четверг, 14 Ноябрь, 2024 08:49, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 08:47 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Перед ответом на остальное я подожду от Вас, Олег, реакцию на вышесказанное. Надо бы признать, что написали заведомо ложную информацию, тогда будет ясно, что беседа с Вами по данной теме имеет смысл. Если не признаете, то это, видимо, автоматически обнуляет и всё остальное, что Вы написали про лисп.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 10:34 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
замечу, что основной машинный код для комбинированой операции не особо сложнее будет, если брать x86: этот камень таки имеет очень удобный флаг «overflow» (который не зависит от флага переноса). соответственно, мы просто работаем с 32-битными целыми, а после операции вставляем `jo i_need_more`. в подавляющем большинстве случаев это не стоит ничего, потому что jump not taken. а если таки taken — то тут уже расчехляем тяжёлую артиллерию, конвертируем ячейку в бигнум — и делаем медленно.

в принципе, ничего не мешает добавить такое же поведение и в оберон, но… зачем. в этом случае вполне достаточно библиотеки. в состав того же BBCB входит модуль Integers, например, с базовыми операциями над целыми. в принципе, этого достаточно, чтобы построить всё остальное. но практически оно надо только в специфических областях, и тащить всю тяжёлую механику бигнумов в язык будет прямым противоречием обероновскому духу. если на то пошло, то тогда уж лучше нативные комплексные числа. хотя и они мало кому нужны, и мало кто понимает, что они такое.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 11:48 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Изначально Олег спросил, как сложить числа одной командой. Если мы обрабатываем переполнение, то это уже в любом случае не одна команда. Я ответил на то, что спрашивали. Так-то сложение в лиспе, без вот этих вот экстремальных знаний о типах, не свойственных обычному (а не быстрому) коду, является функцией, в которой происходит диспетчеризация по тегам всех аргументов (а аргументов может быть от 0 до... ну до 100, как минимум, есть какой-то предел).

Вот что предлагает мне на выбор SBCL, когда я спрашиваю его про определение +
Код:
(DEFVAR +)
(DEFUN +)
(DEFINE-METHOD-COMBINATION + GENERIC-FUNCTION (EQL +) T)
(:DEFTRANSFORM +
 ((OR RATIONAL (COMPLEX RATIONAL)) (SB-INT:CONSTANT-ARG (INTEGER 0 0)))
 "fold zero arg")
(:DEFTRANSFORM + (RATIONAL (SB-INT:CONSTANT-ARG RATIONAL))
 "associate +/(+ -) of constants")
(:DEFTRANSFORM +
 (DOUBLE-FLOAT (SB-INT:CONSTANT-ARG (OR (MEMBER 0.0 0.0f0) (INTEGER 0 0))))
 "optimize")
(:DEFTRANSFORM +
 (SINGLE-FLOAT (SB-INT:CONSTANT-ARG (OR (MEMBER 0.0f0) (INTEGER 0 0))))
 "optimize")
(:DEFTRANSFORM + (DOUBLE-FLOAT SINGLE-FLOAT) "optimize")
(:DEFTRANSFORM + (SINGLE-FLOAT DOUBLE-FLOAT) "optimize")
(:DEFTRANSFORM + (FLOAT RATIONAL) "optimize")
(:DEFTRANSFORM + (RATIONAL FLOAT) "optimize")
(:DEFTRANSFORM + "check for iteration variable reoptimization")
(:DEFOPTIMIZER + SB-C:DERIVE-TYPE)
(:DEFINE-VOP + SB-VM::FAST-+-C/FIXNUM=>FIXNUM "inline fixnum arithmetic")
(:DEFINE-VOP + SB-VM::+/DOUBLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::+/SINGLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::FAST-+/FIXNUM=>FIXNUM "inline fixnum arithmetic")
(:DEFINE-VOP + SB-VM::+/COMPLEX-REAL-SINGLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::+/COMPLEX-DOUBLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::+/COMPLEX-SINGLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::+/REAL-COMPLEX-SINGLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::FAST-+-C/UNSIGNED=>UNSIGNED
 "inline (unsigned-byte 64) arithmetic")
(:DEFINE-VOP + SB-VM::FAST-+-C/SIGNED=>SIGNED
 "inline (signed-byte 64) arithmetic")
(:DEFINE-VOP + SB-VM::+/COMPLEX-REAL-DOUBLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::+/REAL-COMPLEX-DOUBLE-FLOAT "inline float arithmetic")
(:DEFINE-VOP + SB-VM::FAST-+/SIGNED=>SIGNED
 "inline (signed-byte 64) arithmetic")
(:DEFINE-VOP + SB-VM::FAST-+/UNSIGNED=>UNSIGNED
 "inline (unsigned-byte 64) arithmetic")
(:DEFINE-VOP + SB-VM::GENERIC-+)
(:DEFINE-SOURCE-TRANSFORM +)
(DECLAIM +
         SB-C:DEFKNOWN)

Т.е. это много разного рода оптимизаторов и преобразователей для разных случаев жизни и для разных этапов компиляции.

Определение собственно функции +, а точнее, шаблона, который генерирует функцию + для двух аргументов, выглядит вот так:
Код:
(sb!xc:defmacro two-arg-+/- (name op big-op)
  `(defun ,name (x y)
     (number-dispatch ((x number) (y number))
       (bignum-cross-fixnum ,op ,big-op)
       (float-contagion ,op x y)

       ((complex complex)
        (canonical-complex (,op (realpart x) (realpart y))
                           (,op (imagpart x) (imagpart y))))
       (((foreach bignum fixnum ratio single-float double-float
                  #!+long-float long-float) complex)
        (complex (,op x (realpart y)) (,op 0 (imagpart y))))
       ((complex (or rational float))
        (complex (,op (realpart x) y) (,op (imagpart x) 0)))

       (((foreach fixnum bignum) ratio)
        (let* ((dy (denominator y))
               (n (,op (* x dy) (numerator y))))
          (%make-ratio n dy)))
       ((ratio integer)
        (let* ((dx (denominator x))
               (n (,op (numerator x) (* y dx))))
          (%make-ratio n dx)))
       ((ratio ratio)
        (let* ((nx (numerator x))
               (dx (denominator x))
               (ny (numerator y))
               (dy (denominator y))
               (g1 (gcd dx dy)))
          (if (eql g1 1)
              (%make-ratio (,op (* nx dy) (* dx ny)) (* dx dy))
              (let* ((t2 (truncate dx g1))
                     (t1 (,op (* nx (truncate dy g1)) (* t2 ny)))
                     (g2 (gcd t1 g1)))
                (cond ((eql t1 0) 0)
                      ((eql g2 1)
                       (%make-ratio t1 (* t2 dy)))
                      (t (let* ((nn (truncate t1 g2))
                                (t3 (truncate dy g2))
                                (nd (if (eql t2 1) t3 (* t2 t3))))
                           (if (eql nd 1) nn (%make-ratio nn nd))))))))))))

Искать дальше, где определён + для общего случая - влом, хотя наверное, надо отмотать пару экранов. Ладно. Он генерируется этим куском кода:
Код:
(macrolet ((define-arith (op init doc)
             `(defun ,op (&rest numbers)
                (declare (explicit-check))
                ,doc
                (if numbers
                    (let ((result (the number (fast-&rest-nth 0 numbers))))
                      (do-rest-arg ((n) numbers 1 result)
                        (setq result (,op result n))))
                    ,init))))
  (define-arith + 0
    "Return the sum of its arguments. With no args, returns 0.")
  (define-arith * 1
    "Return the product of its arguments. With no args, returns 1."))


А вот как сделать именно сложение чисел, заполняющих всё слово, с отловом переполнения - тут я затрудняюсь. В отличие от Оберона, в SBCL любое данное помещается в машинное слово, поэтому там не может быть 64-разрядных чисел в машинном слове - два бита идут на тег типа. Числа, не помещающиеся в 62 разряда, представляются уже бигнумом и их, естественно, нельзя сложить одной машинной командой. Если нужно именно слово, то их надо либо в массиве хранить, либо в записи (обращение всё равно через укль, не уверен, что выйдет за одну команду сложить), либо через FFI-указатель, но может быть есть и другие варианты.

В общем-то язык не на то заточен, но естественно, это речь конкретно про SBCL, а не про "лисп вообще". Вполне можно сделать "оберон со скобочками", правда, вопрос, насколько целесообразно перемножать два бесконечно ненужных.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 14 Ноябрь, 2024 22:50 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
я лично считаю, что даже с обработкой переполнения — одна команда. потому что нормальный оберон должен вставлять тот же самый jo. то, что ofront этого не умеет, потому что транслирует в сишечку, а сишечка тоже этого не умеет — это интимные проблемы кривого ofront. что там после jo происходит — это уже частности реализации: падает ли, делает ли бигнумы… оно к изначальному вопросу не относится. ;-)

алсо, я читал, откуда всё началось, а не с мороза влетел. просто в той теме я по определённым причинам писать не стану.

да. так вот. моё замечание было к тому, что сделать numeric tower без замедления наиболее частого варианта в лиспах и можно, и несложно. я когда-то в одном из своих трансляторов схемы так и делал. и стоит это примерно ничего, и вполне считается как «сложение чисел одной командой». неучёт jo — это примерно то же самое, что и неучёт прочих подготовительных/финальных mov.

p.s.: а чер никогда свои ошибки не признаёт, не было такого случая в истории. так что или не придёт, или придёт доказывать, что не ошибся (при помощи других — или тех же самых — ошибок).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 00:07 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Приятно всё же, что кругом столько лисперов. Мафия бессмертна :) Ну я в своё время пытался догнать сишечку и упёрся в то, что тегирование уменьшает диапазон фикснумов. Всё же Оберон более быстрый должен быть по устройству типов данных, чем те две общелиспа, которые я изучал, но менее гибкий в плане горячей замены. Даже не знаю, какой из этого надо делать вывод. И быстроты хочется, и гибкости.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 01:37 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
ну, хоть как-то интересоваться программированием и пройти мимо лиспа — это довольно сложно, мне кажется. ;-) очень изящная идея же.

а вывод, мне кажется, обычный: «не человек для инструмента, а инструмент для человека».

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

но всё-таки с уходом лисп-машин и сам лисп ушёл больше в область «программирования для самовыражения». хотя и оставил след почти во всём: если перечислять штуки, которые родом из лиспа — то трактат получится. были даже попытки сделать «схему с человеческим лицом» — Dylan, например. тем не менее, я в итоге вернулся к си, паскалю, модуле, оберону. всё-таки ближе они к современному железу.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 01:46 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
p.s.: в принципе, возможность динамической загрузки и выгрузки модулей, а также возможность инспектировать модули в рантайме и вызывать оттуда процедуры — вполне приближает его к лиспам и фортам в плане динамической (пере)сборки системы (это более широкое понятие, чем просто «программа») на лету. к сожалению, большинство оберон-систем (и даже мой O/Ur, каюсь!) вместо полноценной выгрузки модулей с освобождением памяти просто их прячет. в LC, кстати, я это починил — там модули действительно выгружаются как надо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 05:31 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
arisu писал(а):
то, что ofront этого не умеет, потому что транслирует в сишечку, а сишечка тоже этого не умеет — это интимные проблемы кривого ofront.
Угу, угу. Ну давай про своё драгоценное прямое, что работает на third party почти интерпретаторе и не работает на дюжине архитектур, даже на ARM. И при этом совместимо только само с собой, а главная линия разработки навеяна больными фантазиями пьяного ёжика под ЛСД и в бреду.

Вот что бесит - так это самонадеянность, предвзятость и самохвальство. Моё хорошее. Твоё кривое. А ты уточнил какие задачи может решать моё и какие не может твоё?

Но радует и наличие всего одного пользователя. Только в этом свете непонятно зачем нам про это расписывают ежедневные простыни, полные высокомерия и превосходства. Оно нам точно надо?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 08:37 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
> Про компиляцию Лиспа в настоящий машинный код. Ну есть из ста Лиспов парочка, которая умеет, хоть это слава богу. А какой там код? Явно не складывающий "ненастоящие" числа одной машинной командой? На что я и обратил Ваше внимание.

Вы ещё здесь забыли сказать "я ошибся и написал вообще неверную информацию о том, что лисп - это виртуальная машина". Хотя конечно можно и в такой форме признать, что Вы поработали над одной ошибкой, но не над всеми. Да, вообще говоря common lisp не складывает числа одной машинной командой, и можно про это закончить. Тема была не про это, а про упрощение Оберона, и мне неинтересно с Вами дальше обсуждать числа, тем более здесь. Продолжим работу над ошибками. Даже не будем дальше разбираться в том, что такое для Вас "настоящий" или "ненастоящий" код. Очевидно, что к вопросу о простоте Оберона это никакого отношения не имеет, ну разве только вот какое. Чем выше оптимизирован код, тем сложнее его сгенерировать, поэтому до кода, сделанного простым компилятором, всегда можно докопаться. Значит, истинный Оберон не может генерировать "идеальный машинный код", а Ofront+, если уж есть желание походить по чьим-то мозолям, не является идейно истинным Обероном, т.к. не самодостаточен. SBCL к простым компиляторам не относится и он пытается генерировать максимально хороший код. С учётом динамической типизированности Common Lisp это возможно не всегда. GCC - тоже не простой компилятор. Код конкретно сложения ненастоящих чисел я уже показал выше, можете посмотреть, но мне неинтересно, считаете ли Вы его настоящим или нет. Я отреагировал на тему про упрощение Оберона, а понятно же, что простота и эффективность мешают друг другу, если мы говорим не только о простоте языка, но и простоте его реализации. В случае Оберона мы о ней говорим всегда по умолчанию, иное требует оговорок. Но я вижу, что Вы уже как минимум вышли из своего неверного мнения о том, что лисп - это обязательно виртуальная машина, и даже написали это признание там же, где раньше написали неправду. Молодец.

> Хотя, Вы видите, мы и термин "мелкие машины" с Вами понимаем по-разному

Прошу уточнить, что же я понимаю под мелкими машинами и на каком основании Вы это решили.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 10:50 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
а подумал — и удалил ответ. не стоит оно всё того.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 15:19 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
budden писал(а):
Вы ещё здесь забыли сказать "я ошибся и написал вообще неверную информацию о том, что лисп - это виртуальная машина".
Я не ошибся и написал в целом верную информацию о том, что Лисп как динамический язык требует сложного рантайма, который может быть как классической ВМ, так и чем-то гибридным. А если даже есть удивительные трансляторы Лиспа (через Си или даже прямо) в натив, то качество и производительность кода получается такая, что хочется плакать. Поэтому даже такой способ по качеству развёртывания и производительности сопоставим с ВМ. Видите ли, абстракции Лиспа просто плохо ложатся на традиционные архитектуры, поэтому надо так всё наворачивать. Вы же согласны с этим, Денис?

budden писал(а):
Код конкретно сложения ненастоящих чисел я уже показал выше, можете посмотреть, но мне неинтересно, считаете ли Вы его настоящим или нет.
Я считаю его непроизводительным, и боже сохрани сводить всю арифметику к вычислениям с "настоящими" числами. Если Вы будете с этим спорить, ну, я опять скажу, что Вы не понимаете низкий уровень. Хинт: сложение "ненастоящих" чисел - одна машинная операция, а с "настоящими" уже нужны десятки-сотни.

budden писал(а):
Но я вижу, что Вы уже как минимум вышли из своего неверного мнения о том, что лисп - это обязательно виртуальная машина, и даже написали это признание там же, где раньше написали неправду. Молодец.
См. выше. Я Вам ещё раз могу попробовать объяснить, что мне интересен инструментарий совсем другого порядка. Я прекрасно понимаю ограничения Лиспа. Я за человеческую простоту, а не вывих мозга при кодировании.

И для меня непринципиально кувалда или киянка. Мне просто интересны отвёртки.

budden писал(а):
Прошу уточнить, что же я понимаю под мелкими машинами и на каком основании Вы это решили.
На том основании, что они у Вас тянут Лисп, который худо-бедно может использоваться на них вместо Оберона.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 15:46 

Зарегистрирован: Пятница, 11 Январь, 2019 21:33
Сообщения: 101
("Откочевал" из темы про О7)


budden писал(а):
Возвращаясь к макросам, если взглянуть на заголовочники ядра линукса, то там макрос на макросе и макросом погоняет. Конечно, можно много изображать благородство и говорить, что макросы не нужны, но тогда встаёт вопрос, а как же писать переносимые программы? В A2 этот вопрос решён, но препроцессор там всё же есть, состоящий из двух отдельных инструментов, которые в сумме дают часть функционала cpp, а также решается на уровне конфигурации. Часть решения зашита и в сам язык в виде переменного размера некоторых типов. Помогает здесь и возможность переименовывать модули при импорте. В итоге получается целостное и работающее решение, которое даже можно похвалить. Видимо, в Oberon07 такого нет, при том, что язык сам по себе не абстрактен от железа, ведь SET же имеет переменный размер. Поскольку в A2 возможность писать переносимые программы возникает только в комплексе из языка, его реализации и системы сборки, которая не является частью языка. Здесь можно говорить о том, что какого-то необходимого функционала в O7 недостаёт. Конечно, всегда есть такой вариант, как клонировать весь код, который прямо или косвенно зависит от особенностей платформы, но ведь в условии задачи было "не выкидывать то, что потом придётся делать".

В Modula-3 экосистеме сумели сделать переносимость без макросов, а разными наборами .i3 и .m3 модулей для пар ОS-CPU и(или) разных разрядностей процессора. Но в последнее время переносят многое на уровне кода на Си/C++ ( cm3 двуязычная система). Т.о. неясно удалось ли полностью избежать применения макросов, или они "изящно" спрятаны на ближнем к аппаратуре слое модулей.


budden писал(а):
vvmtutby писал(а):
budden писал(а):
P.S. ещё в лиспе (...) есть (...) макросы (...).
ЯП Julia позволяет использовать "макросы в стиле Lisp", которые работают на уровне abstract syntax trees (AST). ( Лучше ориентироваться на этот механизм метапрограммирования, чем на "чистый Lisp")

Я сделал какие-то макросы для Яра-22, учитывающие синтаксис, т.е. отличающие выражение, оператор и составной оператор, однако они получились сильно неэлегантными. Также и в Scala были большие проблемы с внедрением макросов. По сути дела элегантных вариантов я вижу только два: как в Си на уровне текста, где производится упрощённый анализ, как в препроцессоре (шаблоны с <> являются в принципе в каком-то смысле разновидностью оных) и как в лиспе. В полновесной AST слишком много полей и слишком много разных видов узлов. Например, отдельный узел для составного оператора, для простого оператора (как присваивание) и для выражения. С другой стороны, в лиспе макросы мешают отладке и нужно много с этим возиться. Можно ещё посмотреть, как сделано в Расте - вроде язык модный.

Хотя конечно, в лиспе макросы пишутся слишком легко и соблазн их писать велик, поскольку язык без этого довольно неудобный. Возможно, что золотая середина находится где-то в другом месте, но я её пока что не нашёл.
Честно говоря, я хотел про макросы Julia написать детальнее, но не нашёл компактного технологического описания обработки оных на этапе компиляции. Насколько я понял, первым же шагом "человеко-читаемый" синтаксис преобразуется в нечто. И оно обрабатывается кодом(?) на Schеme.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 15 Ноябрь, 2024 23:54 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
Вообще, пример было бы неплохо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 16 Ноябрь, 2024 00:21 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1623
> На том основании, что они у Вас тянут Лисп, который худо-бедно может использоваться на них вместо Оберона.

Минимальный лисп, который я нашёл за примерно 15 минут запускается на вот такой машине.

> The Arduino Uno and Arduino Nano are based on the Atmel ATmega328 processor, which is the smallest ATmega processor that uLisp supports. It runs at 16 MHz and provides 32 Kbytes of program memory, 2 Kbytes of RAM, and 2 Kbytes of EEPROM.

Что я имел в виду под мелкими машинами на самом деле, очевидно, значения не имеет. Раз Вы сказали, что я имел в виду Zero Pi с 512 МБ RAM, то так тому и быть. Вы же всегда правы. Если я думал что-то другое, видимо, я ошибался. Спасибо, теперь Вы мне объяснили, что я думал на самом деле. Теперь буду думать правильно. Кроме того, Вы прекрасно справляетесь с задачей писать про Лисп на этом форуме :) Короче, "три дня я гналась за вами чтобы сказать вам как вы мне безразличны".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 16 Ноябрь, 2024 00:26 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
собственно, есть макросы и есть макросы. сишный препроцессор — это чтобы определять константы именами, да компенсировать отсутствие inline в компиляторе. а, и ещё делать кашу из ifdef-ов. лисповые макросы — это про общие трансформации кода, благодаря принципу «код — это обычные данные». крестошаблоны — это такой костыль из-за отсутствия нормальных макросов.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 16 Ноябрь, 2024 00:28 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 586
Откуда: Украина, Днепропетровская обл.
budden писал(а):
Минимальный лисп, который я нашёл за примерно 15 минут запускается на вот такой машине.

> The Arduino Uno and Arduino Nano are based on the Atmel ATmega328 processor, which is the smallest ATmega processor that uLisp supports. It runs at 16 MHz and provides 32 Kbytes of program memory, 2 Kbytes of RAM, and 2 Kbytes of EEPROM.
Вы только умолчали о том, какое печальное зрелище будет представлять этот Лисп на этой машине. Ну да, два настоящих числа два и два Вы на нём сложите. Но с чем-то посложнее точно будут проблемы.

А вот "модный Раст", о котором Вы намедни упомянули. Ведь суть не в том, что он модный, а в том, что он в своей нише практически не имеет себе равных. К примеру, на Rust можно писать программы даже для процессора NMOS 6502. И это будут полноценные программы, а не два плюс два, я Вас уверяю.

budden писал(а):
Кроме того, Вы прекрасно справляетесь с задачей писать про Лисп на этом форуме :)
Не надо мне приписывать свои грехи. Это у Вас что ни делай - всё Лисп получается. А с волками жить, так сказать...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 16 Ноябрь, 2024 00:38 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1556
(задумчиво) на всякий случай покаюсь: никакого лиспа на Z80 не существовало. математику я на нём не считал, symbolic computations не делал. это всё LSD проклятое, наркотикам бой!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB