Форум программистов, компьютерный форум, киберфорум
Наши страницы
Другие языки программирования
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
1

Новый язык программирования SPL

20.05.2017, 16:30. Просмотров 2840. Ответов 83
Метки нет (Все метки)

Всем привет!

Я сейчас делаю новый язык программирования, называется SPL (Simple Programming Language).
Это высокоуровневый интерпретируемый язык, который реализован в виде UWP приложения для Windows 10.
Основное ядро языка уже готово. Желающие протестировать, поделиться своими соображениями и пожеланиями - добро пожаловать!

Для тех, кто знает английский язык - у меня уже написана книга про SPL, подробно описывающая структуру языка и снабженная примерами. На русский я ее еще не перевел, потому что пока это рабочий документ, книга постоянно дорабатывается и обновляется. А на английском она потому, что с английского языка ее потом будет проще перевести на русский, чем с русского на английский.

Также я готов обсуждать и отвечать на вопросы здесь, на форуме.

Вкратце о языке. Он не содержит ключевых слов и очень лаконичен в своей записи. В SPL все переменные имеют автоматический тип, все массивы - динамические гетерогенные. Из любого места можно пользоваться локальными переменными любой функции.

#.output("Hello, world!")

Печатает текст "Hello, world!". Символ "#" показывает, что функция принадлежит группе системных функций. Приведенная ниже программа печатает то же самое:

текст="Hello, world!"
печать=#.output
печать(текст)

Это пример условия, в котором если "a" больше 5, то в "b" заносится 1, иначе в "b" заносится 0:

? a>5
b=1
!
b=0
.

Это пример перехода на метку, где "->" это команда перехода, а метка указывается после символа ":":

-> метка
:метка

или так:

->1
:1

Это пример цикла, который печатает цифры от 1 до 10:

a=0
> a<10
a+=1
#.output(a)
<

Это пример определения и использования функции пользователя "diag". Программа в результате печатает число 5 (диагональ катетов длиной 3 и 4):

diag(x,y)<=#.sqrt(x^2+y^2)
#.output(diag(3,4))

Вот более сложный пример определения и рекурсивного вызова функции "f", которая рассчитывает факториал числа. Программа в результате печатает число 120 (факториал числа 5):

f(k)=
?k=1;<=1;.
<=k*f(k-1)
.
#.output(f(5))

В SPL очень много особенностей, некоторые из которых вы не найдете в других языках программирования.
Поскольку SPL я делаю в виде UWP приложения, то программа работает на любом типе устройства под управлением Windows 10, а программы пользователя автоматически синхронизируются между вашими устройствами. Программа пока в самом начале развития, в стадии альфа-версии. Но там уже работает редактор кода и есть что тестировать в самом языке.

Если кто-нибудь захочет принять участие в бета-тестировании и поближе ознакомиться с SPL - пишите, я поделюсь линком для установки из магазина Microsoft Store.

Спасибо за внимание!

Добавлено через 50 минут
Линк на мою книгу по SPL (англ. яз.): http://kibernetik.pro/forum/viewtopic.php?f=71&t=1717
Текст постоянно дописывается и переписывается, пока язык в процессе разработки.
Все, что описано в книге, уже сделано и работает в альфа-версии. Все примеры программ - рабочие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2017, 16:30
Ответы с готовыми решениями:

Новый язык программирования
я изобрел самый лучший язык программирования и самый простой program SAMPLE...

Новый язык программирования LUX
*** Новый язык программирования LUX - особенности программирования. ...

Язык программирования Яр
Разрабатываю полностью русскоязычный язык программирования для...

Язык программирования РС/Б
На страничке http://www.rs-b.nm.ru можно скачить компилятор (написаный...

Язык программирования GRASS
У кого-нибуть есть информация по этому языку программирования? Поисковые...

83
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
08.06.2017, 00:30  [ТС] 41
В SPL функция может возвращать несколько объектов в виде
C#
1
a,b = f(x)
Конечно функция может принимать несколько входящих параметров в виде
C#
1
h(x,y)
Теперь функция, возвращающая несколько объектов, может использоваться в качестве входящих параметров в другой функции в виде
C#
1
h(f(x):2)
Запись, приведенная выше означает, что два выходящих объекта функции f используются в качестве входящих параметров функции h.
В SPL одна и та же функция может возвращать разное количество объектов. Поэтому при таком использовании нужно явно указывать, сколько объектов в данном случае мы ожидаем от функции f (если никакого числа не указывать, то от функции f будет стандартно ожидаться один объект).
Это сделано для того, чтобы многообъектные на выходе функции можно было напрямую использовать на входе многопараметровых функций без использования для этого каких-либо дополнительных действий.
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
08.06.2017, 03:35  [ТС] 42
А вот и пример работы приведенной выше фичи.
Здесь функция #.drawcolor принимает 3 аргумента - r,g,b компоненты цвета, а функция #.hsv2rgb возвращает в качестве результата 3 объекта - r,g,b компоненты цвета. И функция #.hsv2rgb просто подается в качестве аргумента функции #.drawcolor.
Нужно отметить, что функция #.drawcolor может принимать и 4 аргумента, поэтому, если нужно, то там же через запятую после вызова функции #.hsv2rgb можно дописать и четвертый аргумент - прозрачность цвета.
C#
1
2
3
4
5
6
7
8
mx=500; my=300
> x, 0..mx
  #.drawline(x,my,x,my)
  > y, 0..my
    #.drawcolor(#.hsv2rgb(x/mx*360,1,y/my):3)
    #.drawline(x,my-y)
  <
<
Новый язык программирования SPL
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
08.06.2017, 22:01  [ТС] 43
Пример того, что одна и та же функция в SPL может возвращать произвольное количество объектов.
В этой программе функция пользователя "rnd" возвращает от одного до трех случайных чисел.
C#
1
2
3
4
5
6
7
8
9
10
11
12
rnd(n)=
  ? n=1
    <= #.rnd(1)
  !? n=2
    <= #.rnd(1), #.rnd(1)
  !? n=3
    <= #.rnd(1), #.rnd(1), #.rnd(1)
  .
.
x=rnd(1)
x,y=rnd(2)
x,y,z=rnd(3)
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
10.06.2017, 23:08  [ТС] 44
SPL получил возможность контролировать буферизацию графики в ручном режиме, которая по умолчанию работает автоматически.
Также добавлен такой функционал, как закадровый буфер произвольного размера, вместе с функциями для работы с закадровым буфером. Всего одной функцией поток графических команд перенаправляется в закадровый буфер любого размера, потом, к примеру, сохраняется на диск в виде файла изображения, и всего одной функцией перенаправляется обратно в основное окно приложения.
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
18.06.2017, 16:20  [ТС] 45
Сайт по SPL переехал сюда.

Добавлено через 4 часа 34 минуты
В SPL появились многопоточные вычисления.
Пример выполнения функции F в параллельном потоке. Чтобы это выглядело поинтереснее, в функцию F в качестве параметров передаются и функция печати, и аргумент для этой функции:

C#
1
2
3
4
5
f(x,y)=
  x(y)
.
 
-> f(#.output, "Я это печатаю из другого потока")
Результат работы этой программы: напечатанный текст "Я это печатаю из другого потока".
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
20.06.2017, 18:44  [ТС] 46
Я сделал функцию #.pan, которая позволяет определить мультитачевое взаимодействие пользователя с экраном. Всего одна функция дает возможность использовать в программе такие мультитачевые жесты пользователя, как одновременное перемещение, масштабирование и поворот.

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
xc,yc = #.scrsize()
xc /= 2; yc /= 2
sc = 1; ac = 0
moved = 0
#.scroff()
drawlines(xc,yc,sc,ac)
>
? #.pan()
  moved = 1
  dx,dy,ds,da = #.pan(4)
  drawlines(xc+dx,yc+dy,sc*ds,ac+da)
!
  ? moved
  moved = 0
  xc += dx; yc += dy; sc *= ds; ac += da
  .
.
<
drawlines(xc,yc,sc,ac)=
  s = 50*sc
  ss = s*#.sin(ac)
  cs = s*#.cos(ac)
  #.scrclear()
  #.drawsize(4)
  #.drawline(xc+ss,yc-cs,xc-ss,yc+cs)
  #.drawline(xc-cs,yc-ss,xc+cs,yc+ss)
  #.scr()
.
Новый язык программирования SPL
Новый язык программирования SPL
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
21.06.2017, 23:12  [ТС] 47
Теперь SPL умеет отслеживать индивидуально каждое касание экрана при мультитачевом взаимодействии.
Эта программа позволяет рисовать на экране несколькими пальцами одновременно. Каждому пальцу при рисовании назначается свой цвет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#.drawsize(40)
>
  > i, 1..#.tap()
    x,y = #.tap(i,2)
    ? #.tap(i)
      ox = old(oldx,i,x)
      oy = old(oldy,i,y)
      #.drawcolor(#.hsv2rgb(i*60,1,1):3)
      #.drawline(ox,oy,x,y)
    .
    oldx[i] = x; oldy[i] = y
  <
  > j, i..10
    oldx[j],oldy[j] = -1
  <
<
old(array,i,v)=
  ? #.size(array)<i
    <= v
  .
  x = array[i]
  ? x<0
    <= v
  .
  <= x
.
Новый язык программирования SPL
0
Catstail
Модератор
23613 / 11713 / 2047
Регистрация: 12.02.2012
Сообщений: 19,108
23.06.2017, 21:33 48
Цитата Сообщение от Mr_K Посмотреть сообщение
Из любого места можно пользоваться локальными переменными любой функции.
- боюсь, что это - не достоинство...
1
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
24.06.2017, 01:22  [ТС] 49
Цитата Сообщение от Catstail Посмотреть сообщение
- боюсь, что это - не достоинство...
Это - просто возможность языка.
0
Catstail
Модератор
23613 / 11713 / 2047
Регистрация: 12.02.2012
Сообщений: 19,108
24.06.2017, 10:52 50
Mr_K, поймите меня правильно... Я терпеть не могу давать "через губу" советы инициативным разработчикам! Но доступ к локальным переменным функций порождает очень опасный код.
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
24.06.2017, 13:52  [ТС] 51
Цитата Сообщение от Catstail Посмотреть сообщение
доступ к локальным переменным функций порождает очень опасный код.
В SPL доступ к локальным переменным функции является продолжением возможности доступа к глобальным переменным из функции. На мой взгляд, одно не более "опасно", чем другое.
0
Catstail
Модератор
23613 / 11713 / 2047
Регистрация: 12.02.2012
Сообщений: 19,108
24.06.2017, 14:13 52
Mr_K, Вы сильно ошибаетесь. Даже "обычные" глобальные переменные могут быть причиной очень трудно диагностируемых ошибок. А уж если локальные переменные всех функций живут в едином адресном пространстве (я верно понял?), то это породит страшно опасный код. Впрочем, я не настаиваю, сами убедитесь.
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
24.06.2017, 15:48  [ТС] 53
Цитата Сообщение от Catstail Посмотреть сообщение
Mr_K, Вы сильно ошибаетесь. Даже "обычные" глобальные переменные могут быть причиной очень трудно диагностируемых ошибок. А уж если локальные переменные всех функций живут в едином адресном пространстве (я верно понял?), то это породит страшно опасный код. Впрочем, я не настаиваю, сами убедитесь.
Я плохо понимаю о чем вы говорите.
Лучше обсуждать что-то на примере конкретного кода на SPL.
0
Catstail
Модератор
23613 / 11713 / 2047
Регистрация: 12.02.2012
Сообщений: 19,108
24.06.2017, 20:02 54
Попробую объяснить. Есть две функции F и G. У обеих есть локальная переменная, скажем, v. Если я в теле F изменю значение v, то каково будет значение v в теле G?
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
24.06.2017, 20:26  [ТС] 55
Изменение v в F никаким образом не связано со значением v в G.
Каждая функция - это свое собственное пространство имен.
0
korvin_
2165 / 1658 / 320
Регистрация: 28.04.2012
Сообщений: 5,923
25.06.2017, 21:28 56
Цитата Сообщение от Mr_K Посмотреть сообщение
Изменение v в F никаким образом не связано со значением v в G.
Каждая функция - это свое собственное пространство имен.
Но из процедуры F можно получить доступ к переменной v процедуры G и изменить её? Если да, то нафига? И как защитится от такого доступа?
0
locm
2150 / 877 / 114
Регистрация: 28.10.2011
Сообщений: 2,779
Записей в блоге: 6
30.06.2017, 19:29 57
Цитата Сообщение от Mr_K Посмотреть сообщение
Из любого места можно пользоваться локальными переменными любой функции.
Чем тогда локальные переменные будут отличаться от глобальных? В случае рекурсии (если ее поддерживает SPL), в какому экземпляру локальной переменной будет доступ?

Цитата Сообщение от Mr_K Посмотреть сообщение
Лучше обсуждать что-то на примере конкретного кода на SPL.
Кто кроме вас знает этот язык?
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
30.06.2017, 20:12  [ТС] 58
Цитата Сообщение от locm Посмотреть сообщение
Чем тогда локальные переменные будут отличаться от глобальных? В случае рекурсии (если ее поддерживает SPL), в какому экземпляру локальной переменной будет доступ?
Глобальные переменные определены в основном теле программы, локальные - в функциях. Доступ и к тем, и к другим осуществляется по одному принципу.

Цитата Сообщение от locm Посмотреть сообщение
Кто кроме вас знает этот язык?
Если язык не знаешь, то как можно его критиковать?
А если критикуешь, то как это можно делать, не зная его?
Мораль - сначала разберись о чем пишешь, потом пиши.

Добавлено через 8 минут
В SPL нет как-таковых глобальных или локальных объектов. В этом смысле доступ ко всем объектам осуществляется одинаково.

SPL поддержвает рекурсию. В случае рекурсии в функции доступна текущая версия объекта.
0
locm
2150 / 877 / 114
Регистрация: 28.10.2011
Сообщений: 2,779
Записей в блоге: 6
30.06.2017, 20:16 59
Цитата Сообщение от Mr_K Посмотреть сообщение
Если язык не знаешь, то как можно его критиковать?
Где в этом сообщении вы увидели критику языка?
Там только вопросы, из-за недостатка документации на ЯП.

Если вы не предоставили доступ к компилятору или интерпретатору то как изучить все тонкости языка?
Кроме того, где исчерпывающая документация на русском на текущую версию языка?
Вот и получается что видимо кроме вас этот ЯП никто не знает.

Добавлено через 3 минуты
Цитата Сообщение от Mr_K Посмотреть сообщение
В SPL нет как-таковых глобальных или локальных объектов. В этом смысле доступ ко всем объектам осуществляется одинаково.
Тогда локальных переменных нет. Они все глобальные.
0
Mr_K
11 / 11 / 0
Регистрация: 19.03.2016
Сообщений: 64
30.06.2017, 20:38  [ТС] 60
Цитата Сообщение от locm Посмотреть сообщение
Где в этом сообщении вы увидели критику языка?
Там только вопросы, из-за недостатка документации на ЯП.
У меня к вам нет вопросов. Вы же спросили кто еще кроме меня знает язык SPL. Просто раз тут люди критикуют и оценивают, значит, видимо, не только я один его знаю

Цитата Сообщение от locm Посмотреть сообщение
Если вы не предоставили доступ к компилятору или интерпретатору то как изучить все тонкости языка?
Кроме того, где исчерпывающая документация на русском на текущую версию языка?
Вот и получается что видимо кроме вас этот ЯП никто не знает.
Я давал ссылку на документацию: http://kibernetik.pro/spl/

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

Цитата Сообщение от locm Посмотреть сообщение
Тогда локальных переменных нет. Они все глобальные.
Я такой тип объектов называю scope variables - с доступом по области определения. Степень "глобальности" у них одинаковая.
1
30.06.2017, 20:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2017, 20:38

Язык программирования Pike
Пайк (англ. Pike — «щука») — динамический интерпретируемый...

Icon язык программирования
кто знает, где скачать учебник по icon на русском?

Что за язык программирования?
что за язык программирования &gt; restart:with(networks): &gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru