Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Скриптовый язык Гриня. Кто-нибудь потестит?

Автор Алексей Гринь, января 17, 2015, 17:21

0 Пользователи и 1 гость просматривают эту тему.

Jumis

Ужасный чудными делами
Дзержинец мира искони
Он нашими решил судьбами
Себя прославить в эти дни

Bhudh

Цитата: Алексей Гринь от января 18, 2015, 20:24То есть происходит субстантивация инфинитивной формы. И тогда можно обращаться с функцией как с объектом (существительным).
А чего сразу существительным-то? У инфинитива тоже могут быть свои свойства: вид, время там, а то и залог...
Это в императиве их чаще всего не бывает.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Bhudh

Цитата: Jumis от января 18, 2015, 20:28может, лучше на Хабру со всем этим?  :-[
Там сразу вывесят картинку с 14-ю стандартами.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Алексей Гринь

Цитата: Bhudh от января 18, 2015, 20:27
Результат вызова foo(), равный 5, ничем не отличается в каком-либо выражении от значения переменной foo, равного 5.
В том-то и дело, что нечистые функции могут возвратить то 5, то 3, то ещё чего. Самая переменная x может менять своё значение. Поэтому нельзя говорить, что x=foo() есть равенство, потому что это не так. Это динамические приравнивание, а не статическое отношение равенства.
肏! Τίς πέπορδε;

Алексей Гринь

Цитата: Bhudh от января 18, 2015, 20:30
А чего сразу существительным-то? У инфинитива тоже могут быть свои свойства: вид, время там, а то и залог...
Это в императиве их чаще всего не бывает.
Ну замени инфинитив на герундий. First-class function objects/functors - это по сути программистский аналог герундиев.
肏! Τίς πέπορδε;


Bhudh

Цитата: Алексей Гринь от января 18, 2015, 20:34нельзя говорить, что x=foo() есть равенство, потому что это не так. Это динамические приравнивание
Цитата: Bhudh от января 18, 2015, 15:46В момент исполнения
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

klangtao

Цитата: Bhudh от января 18, 2015, 21:26
Цитата: Алексей Гринь от января 18, 2015, 20:34нельзя говорить, что x=foo() есть равенство, потому что это не так. Это динамические приравнивание
Цитата: Bhudh от января 18, 2015, 15:46В момент исполнения
Равенство - метод (если говорить в парадигме Гринь-скрипта), возвращающий булево значение. Присвоение возвращает собственно присвоенное значение (ну, или ошибку). Разница как между словосочетанием и предикативным сочетанием.
Свежий ветер избранных пьянил,
С ног сбивал, из мёртвых воскрешал, -
Потому что если не любил -
Значит, и не жил, и не дышал!

Rusiok

Цитата: Алексей Гринь от января 18, 2015, 20:24
можно провести аналогию, что вызов функции создатьОкно() есть императив, а функция без скобок — создатьОкно — своего рода инфинитив
А можете, в рамках Вашей аналогии, пояснить лямбда-функцию?
"проект предлагал сократить разговорную речь путем сведения многосложных слов к односложным и упразднения глаголов" - Джонатан Свифт. Путешествие в Бальнибарби

Bhudh

А чем λ-действие так сильно отличается от обычного действия, кроме того, что придумывается на ходу?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Алексей Гринь

Обновил версию в прикреплении.


  • Пофиксил баг, заключающийся в том, что запрещённый implicit unboxing пытался скомпилироваться в некорректный код, вместо того, чтобы прекращать компиляцию.

  • Не помню, что было в первоначальном релизенге, но только сейчас я обнаружил, что в closure-to-callback transition thunks используемые регистры не сохранялись корректно. Каким чудом это работало, не знаю (тестирую на сравнительно большом проекте, и там ничего не вылетало, чудеса). Также уменьшил размер thunk'ов с ~50 байт до 29.

  • Оптимизировал немного внутренние структуры VM, так что использует памяти на 15-20% меньше, однако это поделие всё равно жрёт слишком много под себя. Есть экстремальный скрипт размером в 6.8 мегабайт, так вот это поделие всё равно жрёт в районе 450 МБ чисто под свои внутренние структуры (раньше жрало и вовсе 550 МБ до оптимизаций). Всё дело в том, что все токены и все expressions сохраняются в памяти и никуда не удаляются (пока не удалится домен) и существуют в не очень оптимизированном формате. Надо тут как-то решать (но надо ли? нужны ли нам скрипты размеров 7 МБ?)

  • Добавил новый немного шизоидный пример, в котором числа Фибоначчи возвращаются и результаты кэшируются путём создания замыкания, которое возвращает замыкание. Чисто тест на корректность.

  • Устранил утечки памяти.
  • Нативные библиотеки теперь кэшированно загружаются и отгружаются корректно при удалении доменов. Раньше это всё аккумулировалось.

  • Простые геттер-методы, оборачивающие доступ к переменным, теперь генерируется напрямую ручным JIT'ом в обход C-компилятора в RAM, чтобы снять давление на него (и это только начало). Чтобы сильно не заморачиваться, не все геттеры компилируются так, часть всё равно реализуется через C-компилятор.

  • Добавил новый оператор sizeof.

肏! Τίς πέπορδε;

Алексей Гринь

Обновил версию в прикреплении.

1) Ускорил время загрузки в 1.5 раза (за счёт переноса ответственности части кода с C compiler на ThunkManager). Собственно компиляция (не считая парсинга и верификации) того 7-мегабайтного примера теперь занимает меньше 5 секунд (аналог в С занимает 35 мегабайт). В будущем будем оптимизировать парсинг (прекэширование структур?)

2) Рудиментарная поддержка отладки прямо изнутри языка: если включён softdebug:true, то специальный оператор break остановит текущий домен и перечислит все локальные переменные в текущем контексте, а также их значения, и далее можно вводить команды (из-под консоли): пока что можно только перечислять свойства локальных переменных и смотреть их значение; в будущем расширю список. Среди ограничений пока что: 1) захваченные переменные не включается в список 2) не выводятся значения valuetypes 3) массивы распознаются при выводе значений, но не Map'ы (в след. версии)

Если softdebug:true не включён, то все операторы break игнорируются (аналогично assert в C)

3) Исправил разные баги (например, имена аргументов могли конфликтовать с inline C)
肏! Τίς πέπορδε;

klangtao

Цитата: Rusiok от января 18, 2015, 22:53
А можете, в рамках Вашей аналогии, пояснить лямбда-функцию?
Не совсем в рамках этой аналогии, но вот что-то вроде...
Свежий ветер избранных пьянил,
С ног сбивал, из мёртвых воскрешал, -
Потому что если не любил -
Значит, и не жил, и не дышал!

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

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

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр