crypt of decay - предсонное, неинтересное, гиковское, мысли, дыбр (да, это тэги) [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

предсонное, неинтересное, гиковское, мысли, дыбр (да, это тэги) [Jan. 17th, 2013|01:02 am]
Previous Entry Add to Memories Tell A Friend Next Entry
подумываю таки оживить проект mist. это такой язык, у которого вся основа спизжена со смолтолка, но немного своего добавлено и у объектов есть такая фича, как «состояние» (спизжено из анрылскрипта). язык скорее скриптовый, чем standalone. собственно, реализации там немного, но при написании «в лоб» оно будет атомно тормозить. а с другой стороны — надо, всё же, сделать хотя бы прототип, пусть и мегатормозной. а потом уже ваять версию побыстрее.

да, предварительный набросок техдока на язык давно есть. техдоки на рантайм нет пока, но тут можно спереть основу из Little Smalltalk и доработать напильником.

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

также думаю, как получше и попроще организовать кэш сообщений. можно, например, хранить индексы нескольких слотов (и то, какому объекту они принадлежат) прямо в коде VM. тогда если некий обработчик постоянно посылает определённые сообщения определённым объектам (а так и есть обычно), то не надо будет их каждый раз искать заново. ну, и там же хранить «индекс модификации объекта», чтобы инвалидировать кэш, если добавили/убрали обработчик. надо будет сделать компилятор mist'а на mist'е, и собирать ним стандартную библиотеку (как достаточно большой кусок кода). соответственно, потенциальное ускорение будет видно просто глазами (и time), и будет ясно, есть ли смысл усложнять код.

с GC, опять же, не очень ясно. с одной стороны инкрементальный+generational выглядит красиво. с другой стороны — refcounter, возможно, проще (плюс периодический mark/sweep для убития циклов; или спиздить где-нибудь детектор циклов). запарка в том, что это надо бы решить сразу, потому что в код придётся мандячить соответствующую логику: или write barriers для первого варианта, или ебопляску со счётчиком для второго.

пока что первый вариант мне нравится больше. в частности и потому, что чистый refcounter всё равно нихера не обеспечивает «прогнозируемого времени»: а если по цепочке 100500 объектов освободится? так что всё равно получится комбинированый вариант, а тогда зачем делать такого монстрика?

зачем? просто потому, что давно я язычков не делал. а какие делал — те все какие-то «обычные», неинтересные.
Linkmeow!

Comments:
From:(Anonymous)
Date:January 17th, 2013 - 03:18 am
(Link)
чет ты стал огромные посты постить, аки я.
осилим утром пред-ий и этот.

запости на своём "родном" эльфячем (находила какие-то твои ранние посты то ли тут, то ли на еще тогда живом твоем личном блоге)

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

aive
From:[info]alamar
Date:January 18th, 2013 - 01:39 pm
(Link)
Когда я обдумывал свой лиспоподобный (или смолтолкаподобный язык), я придумал интересное решение этой проблемы.

Сделать вызов методов правильным-виртуальным, сделать всё объектами, а для быстродействия сделать набор (произвольно расширяемый, а не зашитый в язык, конечно же) DSL-ей.

И вот внутри математического DSLя будет инфикс, будут примитивные типы, разные размеры целых и так далее.
И это уже исключительно забота DSLя, в какие инструкции скомпилировать свои внутренности. Его задача - принять переменные, выдать переменные. Чёрный ящик.

То есть, напишешь ты (calc (x * 3) << 2)
А дальше уже calc знает, что умножение - это всегда умножение.
Но если ты вдруг захочешь другую арифметику, то тебе не надо будет перегружать все операции на всех типах по отдельности (это неудобно и хрупко), а просто напишешь (matrix-calc) или (vector-calc) или там (gpu-calc)
И внутри себя у него будет полностью свой набор правил, методов, договорённостей, типов и нотаций.

То же самое со строками, кстати. Сделать неудобный, но портабельный тип строк, а внутри строкового контейнера будут и буферы, и массивы байт, и другие любые извращения для скорости.
[User Picture]
From:[info]ketmar
Date:January 18th, 2013 - 02:05 pm
(Link)
дело в том, что основное назначение языка — таки «скриптовый», а не all-purpose. что подразумевает небольшие размеры, отсутствие подобных наворотов (bwah! it IS DSL alreay!) и простое встраивание в ся. при этом хочется не растерять основной красоты и не стать диким тормозом.

впрочем, в нормальной версии компилятор mist планируется написать на самом mist, так что можно будет просто «врезаться» в компилятор.
From:[info]alamar
Date:January 18th, 2013 - 04:36 pm
(Link)
В скриптовом языке тебе нужен ровно один тип числа - беззнаковое 64-битное целое. Оно же счётчик, оно же индекс в массиве. А больше тебе никакие не нужны. И арифметика не нужна. А нужны функции sum и inc.
[User Picture]
From:[info]ketmar
Date:January 18th, 2013 - 04:43 pm
(Link)
тебе, возможно, и не нужно. а мне — нужно. задача годного скриптового языка — разгрузить сишную программу от ненужной приколоченой гвоздями логики, а программиста — от унылого процесса написания улучшеных прототипов на сях.

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

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

именно для подобных целей мне и нужен скриптовый язык. и да: он должен быть простым, но при этом мощным. и не превосходить в объёме код самой низкоуровненой прокладки на несколько порядков.
[User Picture]
From:[info]ketmar
Date:January 18th, 2013 - 02:13 pm
(Link)
хотя, конечно, сделать что-то вроде #((…)), где юзер пишет ту же математику и разрешает компилеру читерить, соглашаясь, что при этом перегрузка методов идёт побоку — где-то вариант. но неизящный. и вопросов с перегрузкой тех же ifTrue:[ifFalse:] никак не снимает — а такая перегрузка вполне корректная операция.

допиленый мной LittleSmalltalk на условиях и циклах читерит атомно, например, попросту кладя болт на эти перегрузки (в смысле, оригинал тоже читерил, это не моя допилка). и умеет простые «свёртки» типа 'a isNil ifTrue:' в 'a ifNil:'.

с другой стороны, можно оставить возможность добавлять новые подобные конструкции (собственно, при наличии code blocks оно и так никуда не девается), а поведение стандартных прибить гвоздями к документации. решение не такое уж плохое, потому что перекрывать стандартные у меня нужды не возникло ни разу.
From:[info]alamar
Date:January 18th, 2013 - 04:38 pm
(Link)
Нет, не надо никому читерить. Надо совершенно прозрачно принимать на вход набор символов и генерировать из них код. Просто по другим законам живущий.

Стандартные не обязательно прибивать гвоздями. Просто сказать, что они стандартные, и не менять их. Кто себе прострелит ногу - тот сам себе жертва.
[User Picture]
From:[info]ketmar
Date:January 18th, 2013 - 04:46 pm
(Link)
>Просто сказать, что они стандартные, и не менять их
это и есть «прибить гвоздями», вообще-то. указав в документации: «в случае выше/нижеперечисленых стандартных управляющих конструкций и ты пы компилятор читерит. если вам это не нравится — вы можете выставить компилятору флаг 'перестань читерить', и получите в итоге 'честный', но медленный код. выбор за вами.»

так и сделаю, наверное.
From:[info]alamar
Date:January 18th, 2013 - 05:13 pm
(Link)
Это всё равно не то, что я тебе пытался рассказать.
(Но мой случай не очень подходит для скриптового языка, так как подразумевает большие инвестиции в платформу и VM)
Мой случай - это ты явно заключаешь тот кусок кода, где надо оптимизировать арифметику, в отдельный блок - и в этом блоке действуют принципиально другие законы, чем в остальном обычном коде.
[User Picture]
From:[info]ketmar
Date:January 18th, 2013 - 05:18 pm
(Link)
да я понял, я об этом писал же, и сказал, что мне не нравится. это для «взрослого» языка имеет смысл городить метамеханизмы. в моём случае они только раздуют всё, а реально пользоваться этим будет неудобно.
From:[info]alamar
Date:January 18th, 2013 - 05:26 pm
(Link)
Для скриптового я с тобой согласен.