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

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

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

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

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

Первый публичный релизенг. См. прикрепление. К сожалению, только Windows/x86 пока что. Интересно знать, запустится ли на других машинах вообще (не проверял). (И что насчёт WOW64?)

Фичи:
* статически типизированный
* объектно-ориентированный во все поля (по семантике близок к C#)
* garbage-collected
* рефлективный
* JIT-компилируемый
* легко встраиваемый, легковесный (виртуальная машина - 472 КБ), расширяемый
* большой фокус на замыканиях

Основное применение - небольшие такие обёртки вокруг нативного кода и просто для l33t-хэкинга.

Особенности

  • Синтаксис простой: (объект метод аргумент1 аргумент2 аргумент3). Это позволяет унифицировать методы с арифметическими операциями: выражение "(1 + 2)" есть вызов метода "+" у объекта "1". Нет operator precedence, так как нет понятия "оператор", всё группируется скобочками, как в Lisp'е (за исключением того, что top-level выражения скобочки не требует)

  • Отсутствует специальный синтаксис для if..then или while. Вместо этого, как в Smalltalk, используется вызов методов + замыкания. Например:
    Цитировать(0 to n) loop ^(i: int) {  };
    (0 to n) есть вызов метода "to" у объекта 0, что создаёт объект класса Range. Объект класса Range имеет метод "loop", который принимает замыкание и проходится по каждому элементу Range, применяя замыкание к каждому элементу. Это всё inlinable, правда в текущем релизе инлайнится только bool::then

  • Типы по значению (valuetypes) - обитают в стеке, иммутабельны. Прекрасны для Vector/Matrix в игровых движках, например. Выше указанный Range является valuetype. Типы по значению являются самыми обычными типами - они, например, могут реализовывать интерфейсы.

  • Неявные интерфейсы (как оказалось, в Go придумали то же самое). Если класс располагает набором методов, указанным в интерфейсе, то такой класс автоматически реализует интерфейс. Это можно назвать static duck typing.

  • Отсутствует унифицированная иерархия классов как в C#/Java. Это нам не нужно, так как абсолютно все типы автоматически приводятся к пустому неявному интерфейсу any.

  • Отсутствует различие между user-классами и primitive-классами. Целые числа, например, есть такие же объекты с такими же правилами, как и у остальных объектов - при этом overhead нулевой.

  • Именованные конструкторы (при вызове выглядят, как factory methods.)

  • Прекрасен в качестве обёртки нативного кода: существует 4 способа обратиться к нативному (С) коду:
    а) icalls, на уровне C API
    б) ecalls, то есть external calls, позволяют вызывать методы в нативных DLL прямо из-под ГриньСкрипта без glue-кода
    в) inline C
    г) inline ASM внутри inline C

  • Failables - алгебраический тип данных, который содержит или значение, или ошибку. Наш ответ "исключениям". Например, тип int? может содержать как объект ошибки в случае неудачи, так и целочисленное значение в случае удачи.

  • Домены - виртуальная машина разделена на т.н. домены, что есть изолированные экземпляры VM в собственных потоках. Домены полностью независимы друг от друга и реализуют идею многопоточности, а также sandboxing. Домены могут многопоточно общаться друг с другом с помощью экспортирования объектов в другие домены как "чужих". Методы "чужих" объектов реализуются как Remote Procedure Call, как синхронные, так и асинхронные (в данном релизе асинхронные вызовы так и не реализованы).

  • Рефлексия, атрибуты и т. д. (в данной версии классы рефлексии не до конца реализованы)

  • Портабельность VM в смысле Ctrl+C/Ctrl+V без нужды что-либо устанавливать.

  • Много семантических деталей есть по мелочи, типа поля могут быть только приватными. Или возможность в compile-time добавить новые методы примитивным типам типа int, bool и т.д. с нулём оверхеда.


В данной версии есть известные проблемы/баги:
а) Запуск скрипта увеличивается прямо пропорционально размеру скрипта, так как всё предкомпилируется сразу (за исключением  managed-to-native callback transition thunks). В данный момент я это обхожу с помощью SplashScreen's (не включено в данный релиз)
б) Если valuetypes рекурсивно ссылаются друг на друга, может произойти segfault (руки не дошли).
в) Сборщик мусора примитивный, но пока мне хватает.
г) Стандартная библиотека недоделанная и куцая (руки не дошли).

В релизе есть следующие файлы
ussr.exe - запускатель скриптов в консоли
ussr-win.exe - запускатель скриптов без консоли
ussrvm10.dll - сама виртуальная машина, независима от ussr.exe
here.bat - для удобного открытия консоли в текущей папке
run-helloworld.bat - сюда можно тыкнуть в первый раз для проверки работы, должен появиться MessageBox. Здесь же можно посмотреть, как вызывать скрипты (ussr /source:path)
папка base - базовые классы
папка examples - примеры на синтаксис и семантику
папка misc/sovietscript.h - заголовочные файлы для общения с VM напрямую (недотестено)
папка misc/sovietscript_notepad++_theme.xml - тема для подсветки синтаксиса Notepad++
肏! Τίς πέπορδε;

Wolliger Mensch

Как-то неинтересно. Вы бы лучше написали бы понятный язык программирования для страдающих математическим кретинизмом. Было бы куда полезнее. :yes:
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

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

Цитата: Wolliger Mensch от января 17, 2015, 17:30
Как-то неинтересно
Тут не в интересности дело, а в решении конкретных задач: скриптование С-кода без тонн костылей, как это любят другие языки программирования.
肏! Τίς πέπορδε;

Тайльнемер



Wolliger Mensch

Цитата: Тайльнемер от января 17, 2015, 18:54
Это вы о себе?

Ну как сказать. Механически запоминая, я осиливал даже интегралы в своё время и какие-то неестественные для себя геометрические загогулины. И программировал для своих нужд, также опираясь на механическое запоминание и широкую аналогию в действиях. Но понятно было, что далеко так не уедешь. Всегда мечтал о понятном языке программирования. С большим чаянием читал про якобы простые и понятные широким массам языки программирования. Всё оказалось блефом: возможно, это языки действительно простые — для людей с математическим складом ума. Но за их пределы простота, по-моему, никогда не выходила. :'(
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

Wolliger Mensch

Цитата: Алексей Гринь от января 17, 2015, 18:11
Тут не в интересности дело...

Как это? Нет в жизни человека вещей, отношение к которым не зависело бы от интересности.
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

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

Цитата: Wolliger Mensch от января 17, 2015, 20:59
Как это? Нет в жизни человека вещей, отношение к которым не зависело бы от интересности.
Есть ещё просто желание сделать чистую легковесную систему под себя, без миллиарда костылей и непонятных зависимостей и registry и whatnot.

Хочется жить в чистоте, а не в грязи.
肏! Τίς πέπορδε;

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

Цитата: Wolliger Mensch от января 17, 2015, 20:58
Всегда мечтал о понятном языке программирования. С большим чаянием читал про якобы простые и понятные широким массам языки программирования. Всё оказалось блефом: возможно, это языки действительно простые — для людей с математическим складом ума. Но за их пределы простота, по-моему, никогда не выходила. :'(
Э, большое количество кода мало имеет общего с математикой. Это просто объекты и команды к ним на вполне понятном английском языке. Можно спокойно программировать сложные приложения, почти ничего не шаря в математике. Просто используя готовые библиотеки. То есть многие приложения это просто набор готовых блоков, которых ты соединяешь собственным кодом-«клеем».

Ну вот что непонятного в:

окно = создатьОкно();
окно.показать();

?

Другое дело когда пишешь middleware, типа моего вот ГриньСкрипта, или мой UI-фреймворк с 3d-ускорением, тут нужно знать множество тонкостей. Это я один такой дурак; другие же люди не парятся и используют готовые middleware (блоки кода).
肏! Τίς πέπορδε;

Wolliger Mensch

Цитата: Алексей Гринь от января 17, 2015, 21:16
Ну вот что непонятного в:

окно = создатьОкно();
окно.показать();

Зачем там равно? Что значат скобки? Почему во второй строке точка?
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

Bhudh

Цитата: Wolliger Mensch от января 18, 2015, 01:55Зачем там равно?
Чтобы показать что окно равно результату действия создатьОкно, которое
Цитата: Wolliger Mensch от января 18, 2015, 01:55значат скобки

Цитата: Wolliger Mensch от января 18, 2015, 01:55Почему во второй строке точка?
Потому, что так разделяются объект окно и его действие показать(ся), применение которого (действия)
Цитата: Wolliger Mensch от января 18, 2015, 01:55значат скобки
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Тайльнемер

Цитата: Bhudh от января 18, 2015, 02:49
Чтобы показать что окно равно результату действия создатьОкно, которое
Это не совсем так. Присваивание — это же не равенство в математическом смысле.

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

Цитата: Wolliger Mensch от января 18, 2015, 01:55
Зачем там равно? Что значат скобки? Почему во второй строке точка?
Равно есть приравнивание.

"окно=создатьОкно()" значит «пусть есть новая переменная (существительное) "окно", и пусть оно будет содержать значение, которое возвратила функция создатьОкно».

Скобки это вызов функции, т.е. глагола. В данном случае нет параметров, поэтому скобки пустые. С помощью скобок мы запускаем глагол, типа повелительного наклонения у глагола.

Точка в "окно.показать();" значит «вызвать глагол под названием "показать", ассоциированный с существительноным "окно"». В объектно-ориентированном программировании глаголы могут быть привязаны к своим словам-хозяинам. То есть, смена контекста. "Показать" может значить одно, если выполняется в контексте "окна", но совсем другое, если выполняется в контексте объекта (существительного) другого типа («показать окно» и «показать фигу» есть разные ситуации, хоть глагол и назван одинаково). То есть, таким образом, многозначность имеем мы.
肏! Τίς πέπορδε;

Bhudh

Цитата: Тайльнемер от января 18, 2015, 05:12Присваивание — это же не равенство в математическом смысле
В момент исполнения — именно равенство. А потом по обстоятельствам.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

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

Цитата: Bhudh от января 18, 2015, 15:46
В момент исполнения — именно равенство. А потом по обстоятельствам.
Равенство чему? Ладно, там, x=5. Но что есть x=foo()?
foo() это не значение, это операция. x не может быть «равна» операции.
肏! Τίς πέπορδε;

Bhudh

Цитата: Алексей Гринь от января 18, 2015, 16:32foo() это не значение, это операция.
Алексей, уж от тебя-то не ожидал! :o
"Операция" (функция) — это foo. А foo() — её вызов.
А когда идёт приравнивание переменной вызову функции, это приравнивание не самой функции, а её результату.
В момент присваивания значение переменной и значение результата функции равны.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Wolliger Mensch

Цитата: Алексей Гринь от января 18, 2015, 11:41
Цитата: Wolliger Mensch от января 18, 2015, 01:55
Зачем там равно? Что значат скобки? Почему во второй строке точка?
Равно есть приравнивание.

"окно=создатьОкно()" значит «пусть есть новая переменная (существительное) "окно", и пусть оно будет содержать значение, которое возвратила функция создатьОкно».

Скобки это вызов функции, т.е. глагола. В данном случае нет параметров, поэтому скобки пустые. С помощью скобок мы запускаем глагол, типа повелительного наклонения у глагола.

Если скобки — это вызов глагола, то при пустых скобках глагола нет. А что такое тогда «создатьОкно»? :what:
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

Bhudh

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

Wolliger Mensch

Цитата: Bhudh от января 18, 2015, 17:22
Действие само по себе.
Скажем, с реальным окном действие — это, например, выстругивание.

Непонятно. :donno:
«Вот интересно, каких лингвистических жемчуг можно найти в море отодвинутых книг», Ян Гавлиш.
«Впредь прошу помнить, что придумал игру не для любых ассоциаций, а для семантически оправданных. Например, чтó это такое: ,,рулетке" — ,,выпечке"?? Тем более, что сей ляпсус я сам совершил...», Марбол
«Ветхий Завет написан на иврите и частично на армейском», Vesle Anne
«МЛ(ять)КО ... ПЛ(ять)NЪ», Тася
«Вот откроет этот спойлер, например, Марго, ничего не подозревая, а потом будут по всему форуму блюющие смайлики...», Авал
«Томан приличный мужчина. Правда по патриархальным меркам слегка голодранец», Vesle Anne
«Возможен ли фонетический переход "ж" в "п с придыханием"», forest

Bhudh

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

Тайльнемер

Цитата: Wolliger Mensch от января 18, 2015, 17:17
Если скобки — это вызов глагола, то при пустых скобках глагола нет. А что такое тогда «создатьОкно»? :what:
Вы немного не так поняли.
создатьОкно — это глагол.
Скобки после глагола — это его вызов.
В данном случае глагол непереходный, поэтому скобки пустые, а так, там в скобках могут стоять дополнения через запятую.

Bhudh

Цитата: Тайльнемер от января 18, 2015, 18:27В данном случае глагол непереходный
Переходный, просто уже конкретизированный.
Никто ж не мешает написать окно = создать("окно");.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

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

Цитата: Bhudh от января 18, 2015, 17:00
Алексей, уж от тебя-то не ожидал! :o
"Операция" (функция) — это foo. А foo() — её вызов.
А когда идёт приравнивание переменной вызову функции, это приравнивание не самой функции, а её результату.
В момент присваивания значение переменной и значение результата функции равны.
Понятие равенства имеет смысл только в математике, где функции это отношения между объектами, которые существуют, как бы сказать, извечно, и отсутствует понятие времени.

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

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

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

Цитата: Wolliger Mensch от января 18, 2015, 17:17
Если скобки — это вызов глагола, то при пустых скобках глагола нет. А что такое тогда «создатьОкно»? :what:
Ну можно провести аналогию, что вызов функции создатьОкно() есть императив, а функция без скобок — создатьОкно — своего рода инфинитив. Не все языки разрешают такое; те же, что разрешают, рассматривают обращение к функциям без скобок (т.е. к инфинитивам) как самим объектам. То есть происходит субстантивация инфинитивной формы. И тогда можно обращаться с функцией как с объектом (существительным).
肏! Τίς πέπορδε;

Bhudh

Цитата: Алексей Гринь от января 18, 2015, 20:21foo() это последовательная, осуществляемая во времени операция, описывающая не отношение, а императивный алгоритм.
Алгоритм это тащемта мыслимая последовательность событий, записанная в теле функции на ЯПе.
А при вызове функции нет нужды мыслить такими категориями.
Результат вызова foo(), равный 5, ничем не отличается в каком-либо выражении от значения переменной foo, равного 5.
Для выражения имеет значение только возвращаемый результат, который выступает как условное "значение функции". А как именно функция его определяет, это дело десятое. Пусть хоть из константы берёт и возвращает.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

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

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

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

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

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