С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Другие языки программирования
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.74/103: Рейтинг темы: голосов - 103, средняя оценка - 4.74
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
1

[V] Хорош ли синтаксис языка программирования V?

24.03.2015, 08:17. Просмотров 18862. Ответов 77

Создаю язык программирования для CGI и текстовых терминалов. Сайт www.vlang.ru. Ищу конструктивную критику синтаксиса языка.

Пример:
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
29
30
?Use("include.vsc") // присоединяет файл с кодом, исключает дублирование
_Счетчик Отобразить(_Строка) импорт _ОтобразитьСтроку;
 
?Шаблон Клон-Тип1(
    Тип1 Клон(Тип1 пА):
        Тип1 лРез;
        __ИзСтроки(лРез, пА.__ВСтроку, 0);
        =лРез;
    .
)
?Шаблон на-Тип1(
    Тип1 на(Тип1 *пА):
        =пА;
    .
    Тип1 на(Тип1 !пА):
        =пА;
    .
)
~ТРезультат(_0 А, Б, И):
.
~ТРезультат2(_0 А):
.
 
-> АвтоШаблоны(): // начало исполнения
    ТРезультат лТРезультат; лТРезультат.А=123; лТРезультат.Б=777; лТРезультат.И=100500;
    Отобразить(лТРезультат.Клон.на.__ВСтроку+"\н"); // "Клон" и "на" автоматически создаются
    ТРезультат2 лТРезультат2; лТРезультат2=999;
    Отобразить(Клон(на лТРезультат2).__ВСтроку+"\н"); // "Клон" и "на" автоматически создаются
    <-0; // возврат кода завершения
.
2
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2015, 08:17
Ответы с готовыми решениями:

Выбор языка программирования
Добрый день, посетители форума. Мой путь в программирование начался 2 года...

Ребят, презентация нового языка программирования ObjectScript
Сколько же существует всяких языков программирования, еще один? Ну можно и так...

Синтаксис какого языка программирования наиболее читабелен?
Здравия всем! Пытаюсь тут ЯП пилить, но вот проблема, не могу подобрать...

Что мне может дать знание языка Perl и чем он хорош?
Думаю начать изучать язык Perl. Чем то он мне понравился. Но думаю - стоит или...

По русскому названию языка программирования определить английское название этого языка
Задача на перечисляемый тип P=(ада, бейсик, модула2, лисп, паскаль, пл2,...

77
XRuZzz
Антикодер
1511 / 689 / 37
Регистрация: 15.09.2012
Сообщений: 2,719
25.03.2015, 12:07 2
я советую привязываться к математике, а не к языкам, на которых разговаривает какой либо народ. Если конечно, собираетесь ваш язык применять в реальных проектах.
0
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
26.03.2015, 20:23  [ТС] 3
Цитата Сообщение от XRuZzz Посмотреть сообщение
я советую привязываться к математике
Это как?
0
XRuZzz
Антикодер
1511 / 689 / 37
Регистрация: 15.09.2012
Сообщений: 2,719
26.03.2015, 21:47 4
Цитата Сообщение от vic_one Посмотреть сообщение
Это как?
например, как haskell привязан к математическому смыслу функций.
Лично я бы ввёл в синтаксис языка программирования все мат значки из юникода. Но это спорный и маловажный вопрос.
Насколько, я понимаю хорошие языки программирования получались у людей, которые хорошо овладели какой либо математичекой областью и работали над проблемами как то связанными с ИИ.

А вашу задачу лучше перевести в плоскость переводчика с русского языка на какой либо другой высокоуровневый язык программирования. Если вы не предлагаете новых концепций программирования.
Я сам люблю русский язык, но из синтаксиса языка программирования я бы выкидывал и русский и англ язык.
1
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
27.03.2015, 20:32  [ТС] 5
Цитата Сообщение от XRuZzz Посмотреть сообщение
например, как haskell привязан к математическому смыслу функций.
мысль понятна, но я вас огорчу - уже любой математический значок из UTF-16 может быть оператором в V.
Цитата Сообщение от XRuZzz Посмотреть сообщение
Я сам люблю русский язык, но из синтаксиса языка программирования я бы выкидывал и русский и англ язык.
Таки есть и для вас вариант со значками вместо русских слов.

А вот тройной диспетчеризации вызова интерфейсной функции мало где еще есть.
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
28.03.2015, 17:57 6
Сказывается очень сильное влияние крестов (наверное одного из худших синтаксически организованных языков). Чем обусловлена кириллица? Сужением круга потенциальных взломщиков? xD Перегрузка операторов в ОО языках - вселенское зло, но это не касается синтаксиса. Все служебные термы начинаются с вопросительного знака? Читать очень тяжело. Camel/snake case это скорее для стандартных библиотек, а не ключевых выражений. Разделение функций и "операторов" на разные классы - очень сомнительно. Возврат кода завершения - прошлый век. В общем то что Вы делаете это хорошо, но Вы порядком устарели. Современные языки развиваются в декларативном русле, в том числе и статически типизируемые, компилируемые в нэйтив. У Вас что-то очень сильно напоминающее c++.
1
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
28.03.2015, 21:56  [ТС] 7
Цитата Сообщение от castorsky Посмотреть сообщение
Чем обусловлена кириллица?
Есть также латиница и "математиница".
Цитата Сообщение от castorsky Посмотреть сообщение
Перегрузка операторов в ОО языках - вселенское зло
Можно еще собственные операторы вводить - вот где оно.
Цитата Сообщение от castorsky Посмотреть сообщение
Все служебные термы начинаются с вопросительного знака?
С вопросительного макросы начинаются.
Цитата Сообщение от castorsky Посмотреть сообщение
Разделение функций и "операторов" на разные классы - очень сомнительно.
Оператор - это функция с парой аргументов, но оператор имеет приоритет.
Цитата Сообщение от castorsky Посмотреть сообщение
Возврат кода завершения - прошлый век.
А что return в питоне и прочей живности отменили?
Цитата Сообщение от castorsky Посмотреть сообщение
У Вас что-то очень сильно напоминающее c++.
Да - это оно, но с наворотами. Единственное чего нет так это множественного наследования по состоянию. Но зато есть инъекция интерфейсов в ранее определенные типы.
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
28.03.2015, 22:36 8
Цитата Сообщение от vic_one Посмотреть сообщение
Можно еще собственные операторы вводить - вот где оно.
А надо ли? В чем выигрыш? Это делает невозможным полноценный вывод типов (в Вашем языке это есть?). А возможность написать x foo y вместо x.foo(y) или foo(x, y) мягко говоря сомнительное преимущество. Да и ничто не запрещает исользовать разные нотации. Вот пример
Java
1
2
3
4
5
6
7
scala> 1.+(2.-(-3))
res3: Int = 6
 
scala> 1 + 2 - -3
res4: Int = 6
 
scala>
Цитата Сообщение от vic_one Посмотреть сообщение
А что return в питоне и прочей живности отменили?
Это уже невозможно отменить. Но давайте будем объективными, вовращать значения и проверять их это всё равно что по умолчанию допускать возможность сайд эффектов. От чего многие по возможности стараются избавляться. Да, всё должно что-то возвращать, но пусть это будет результат вычислений, а не код возврата, а результат положим куда-то. Си вей так сказать.
Цитата Сообщение от vic_one Посмотреть сообщение
Да - это оно, но с наворотами.
Собственно это и есть главный недостаток. Нисколько не умаляя возможностей с++ я уверенно скажу что дизайн языка один из худших. Можете поделиться источниками, по которым Вы учились проектировать языки?
0
XRuZzz
Антикодер
1511 / 689 / 37
Регистрация: 15.09.2012
Сообщений: 2,719
29.03.2015, 00:22 9
Прошу пояснить след. вопросы[или написать об этом подробнее на вашем сайте]:
Что значит язык адаптирован для CGI? [плохо представляю, с чем едят CGI]
компилируемым в коды x86
Это получается, я могу сделать обычный бинарный файл? Или язык интерпретируемый?
На каком ЯП вы пишете ЯП?

Я советую вести разработку на github-e или подобном сайте, шансы на то, что вашу идею подхватят увеличатся. А заработать на вашей идее и исходниках, без вашего согласия, вряд ли кто то сможет.

Если язык уже реально хоть как то работает, то респект
Думаю многие на форуме пытались написать свой ЯП, но я не видел, чтоб кому то удалось показать прототип.

Цитата Сообщение от castorsky Посмотреть сообщение
Можете поделиться источниками, по которым Вы учились проектировать языки?
а они существуют? по моему есть множество описаний к ЯП, некоторые работы учёных вроде Тюринга, Чёрча Алонзо и всё :]

Я советую разобраться с haskell[чем я сейчас и занимаюсь], и с Лямбда-исчислениями, чтобы понимать функциональные языки программирования.
Для этого можно почитать Шевченко "O Haskell по человечески", книги Душкина Р. В., которые неявно критикует Шевченко :] поиграть в Godingame[не люблю рекламировать, но приходится]
Но я не скажу, что функциональный Haskell мне более приятен, чем D[да да, если останется время - почитайте Александреску]
Если видите явные ошибки в языке - переделывайте сразу, обратную совместимость лучше не поддерживать.

А ещё, лично мне, интересна поддержка квантового программирования[у Душкина есть книга], логической парадигмы, для ИИ и док-ва теорем. В математике ещё можно много интересного откопать для языков программирования[или где то ещё?]
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
29.03.2015, 00:23 10
Цитата Сообщение от XRuZzz Посмотреть сообщение
а они существуют?
Ну конечно же. Эту еще не читал, всё никак не соберусь, эту можно и в бумаге заказать.
1
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
29.03.2015, 10:24  [ТС] 11
Цитата Сообщение от castorsky Посмотреть сообщение
А возможность написать x foo y вместо x.foo(y) или foo(x, y) мягко говоря сомнительное преимущество.
для такого частного вырожденного случая и не нужно.
А вот для:
C++
1
2
*lD=Select "*" from lDS1 left lDS2 on {(_lDS1::_ i1, _lDS2::_ i2):=(i1.A==i2.A)}
 where {(ListDS lds):=(lds.DS1.B>0 && lds.DS2.C<42)};
нужны приоритеты.

Добавлено через 8 минут
Цитата Сообщение от XRuZzz Посмотреть сообщение
Что значит язык адаптирован для CGI?
CGI имеет свой стандарт передачи параметров для скрипта отличный от классических командных строк.
Цитата Сообщение от XRuZzz Посмотреть сообщение
Это получается, я могу сделать обычный бинарный файл? Или язык интерпретируемый?
На каком ЯП вы пишете ЯП?
Обычный не получите. Но вот необычный может быть в дальнейшем исполнен без исходных кодов в среде V.
Цитата Сообщение от XRuZzz Посмотреть сообщение
Я советую вести разработку на github-e или подобном сайте, шансы на то, что вашу идею подхватят увеличатся. А заработать на вашей идее и исходниках, без вашего согласия, вряд ли кто то сможет.
Исходники имеют ценность только для меня, а вот желающих писать на языке пока мало, что-то около 0.
Цитата Сообщение от XRuZzz Посмотреть сообщение
Если язык уже реально хоть как то работает, то респект
Думаю многие на форуме пытались написать свой ЯП, но я не видел, чтоб кому то удалось показать прототип.
Он работает, но без практик не выявить всех глюков. Скачать архив со средой можно с сайта. Там много примеров. И таки поддерживается AVX.

Добавлено через 53 минуты
В создании нового языка есть неявные сложности.
Я вот основоположил такие параметры:
1) однопроходность
2) адресонезависимость (все вызовы функций относительные)
3) русская раскладка клавиатуры

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

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

если взять за основу другие параметры:
1) мощный анализ использования переменных
2) многовариантную систему хранения значений переменных
3) тотальную оптимизацию под многопоточность

то возможно еще бы не получил конечного варианта языка.
1
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
29.03.2015, 22:04 12
Цитата Сообщение от vic_one Посмотреть сообщение
А вот для:
Вы комментируйте исходник. Ничего не понятно. Уверен что с использованием конструкций let, let*, let in было бы гораздо легче понять о чем идет речь. Да и не увидел я тут явного преимущества перегрузки.
Цитата Сообщение от vic_one Посмотреть сообщение
однопроходность
Это круто. Достойно уважения.
Цитата Сообщение от vic_one Посмотреть сообщение
адресонезависимость
Опишите подробней.
Цитата Сообщение от vic_one Посмотреть сообщение
русская раскладка клавиатуры
Вы же заведомо сужаете круг своих потенциальных пользователей.
Цитата Сообщение от vic_one Посмотреть сообщение
книги не использовал как руководство - там много от автора и мало обоснованной теории
И всё таки какие книги?
1
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
30.03.2015, 09:21  [ТС] 13
Цитата Сообщение от castorsky Посмотреть сообщение
Вы комментируйте исходник.
Это DSL основанный на SQL, но применим к спискам. В нем используются различные пользовательские операторы с разными приоритетами. оператор "from" имеет меньший приоритет чем "left" и "on". Существуют DSL только для выразительности основного участка кода.

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

Цитата Сообщение от castorsky Посмотреть сообщение
Вы же заведомо сужаете круг своих потенциальных пользователей.
Есть английские ключевые слова.

Цитата Сообщение от castorsky Посмотреть сообщение
И всё таки какие книги?
Википедия - "обратная польская запись".
64-ia-32-architectures-software-developer-manual-325462
AMD64-3
- это описания наборов инструкций
и множество мелкой разрозненной информации про правила существования машинного кода под Windows.
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
30.03.2015, 15:18 14
Цитата Сообщение от vic_one Посмотреть сообщение
оператор "from" имеет меньший приоритет чем "left" и "on".
И всё таки я не вижу пользы перегрузки. Нам ничего не мешает явно задать приоритеты в М-выражениях.
>
Зря Вы пренебрегаете теорией. Она есть. А помимо c++ есть множество более достойных языков. Никто не сможет объяснить что здесь написано потому что контекст сущностей не очевиден. Кроме того пример загажен множеством "операторов", семантику которых надо сначала изучить в других файлах.
C++
1
((foo<bar>)*(g++)).baz(!&qux::zip->ding())
0
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
30.03.2015, 20:35  [ТС] 15
Цитата Сообщение от castorsky Посмотреть сообщение
А помимо c++ есть множество более достойных языков.
пару названий напишите.
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
30.03.2015, 21:40 16
forth, scheme, ml (ocaml объектно ориентированный наследник)
0
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
31.03.2015, 08:02  [ТС] 17
Цитата Сообщение от castorsky Посмотреть сообщение
forth, scheme, ml (ocaml объектно ориентированный наследник)
Это для меня альтернативная вселенная. Я предпочитаю императивный подход с элементами функциональшины. Даже ООП в полной мере не использую - только базовые полезные свойства (наследование и интерфейсы).
0
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
15.05.2015, 20:34  [ТС] 18
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
?Использовать("include.vsc") // присоединяет файл с кодом, исключает дублирование
 
Тип ТА(_0 А):
    "=" Скопировать;
.
* НовыйТА(_0 А):
    ТА лТА;
    лТА.А=А;
    =лТА;
.
*Скопировать(ТА Л,П):
    Л.А=П.А;
    =Л.А;
.
 
?Шаблон ВСписок - Тип1(
    * ВСписок(Тип1 *Эл):
        *лСписок={
 
        Тип Сп___[Тип1]:    
        .
 
        ():
            Сп___ лСп___;
            =лСп___
        }();
        лСписок+=Эл;
        =лСписок;
    .
)
 
?Шаблон Примешать - Тип1 Тип2 Фн1(
    Тип1 Примешать(Тип1 Эл, Тип2 Зн, (Фн1) Фн):
        ={
 
        Тип _Примесь Тип1+(Тип2 _ЗнПримесь, (Фн1) _ФнПримесь):  
        .
 
        * _ПримесьВыполнить(Тип1 Эл, Тип2 Зн):
            Тип2 ЗнР;
            Эл._Примесь:
                Эл._ЗнПримесь=Эл._ФнПримесь(Эл.Тип1, Эл._ЗнПримесь, Зн);
                ЗнР=Эл._ЗнПримесь;
            .
            =ЗнР;
        .
        * _ПримесьДля(Тип1 Эл, Тип2 Зн):
            Эл._Примесь:
                =1;
            .
            =0;
        .
 
        (Тип1 Эл, Тип2 Зн, (Фн1) Фн):
            _Примесь лТ___;
            *лА=лТ___.Тип1;
            лА=Эл;
            лТ___._ЗнПримесь=Зн;
            лТ___._ФнПримесь=Фн;
            =лТ___;
        }(Эл, Зн, Фн);
    .
)
 
-> Примеси(): // начало исполнения
    *лСписок=ВСписок(НовыйТА(127));
    лСписок+=НовыйТА(999).Примешать(1){(ТА А, _0 Зн1, Зн2):=А.А+Зн1+Зн2};
    лСписок+=НовыйТА(1).Примешать("А"){(ТА А, _Строка Зн1, Зн2):=(А.А)+Зн1+Зн2};
    Повторить 10:
        @ лЭл++ лСписок:
            Если лЭл._ПримесьДля(0):
                отображение("лЭл.А="+(лЭл.А)+" Примесь="+_ПримесьВыполнить(лЭл, 1)._С+"\н");
            ,Иначе если лЭл._ПримесьДля(""):
                отображение("лЭл.А="+(лЭл.А)+" Примесь="+_ПримесьВыполнить(лЭл, _С"_")+"\н");
            .
        .
    .
    
    <-0; // возврат кода завершения
.
1
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
15.06.2015, 07:49  [ТС] 19
Еще 1 пример.
Fortran
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
?Use("include.vsc") // присоединяет файл с кодом, исключает дублирование
 
?Template ToList - Type1(
Function ToList(Type1 rval_ret D1):
     *lres={
        List List__[Type1]:
            "+" Add;
        .
 
        Function List__Add(List__ rval_ret L, Type1 rval_ret R):
            L+=R;
            Return L;
        .
 
        Function List__Add(List__ lval L, Type1 rval_ret R):
            L+=R;
            Return L;
        .
 
        (): List__ lRes; Return lRes;
    }();
    lres+=D1;
    Return lres;
.
)
 
?Template Box - Type1(
Function Box(Type1 D1):
    Return {
        Type Box__(Type1 D1):
            "=" Set;
        .
 
        Function Box__Set(Box__ L, Box__ R):
            L.D1=R.D1;
            Return 1;
        .
 
        (Type1 D1):
            Box__ lRes; lRes.D1=D1;
            Return lRes;
    }(D1);
.
)
 
?Template Box - Type1 Type2(
Function Box(Type1 D1, Type2 D2):
    *lRes= {
        Type Box__(Type1 D1, Type2 D2):
            "=" Set;
        .
 
        Function Box__Set(Box__ L, Box__ R):
            L.D1=R.D1; L.D2=R.D2;
            Return 1;
        .
 
        (): Box__ lRes; Return lRes;
    }();
    lRes.D1=D1; lRes.D2=D2; 
    Return lRes;
.
)
 
 
Program НовыйСинтаксис(): // начало исполнения
    *fnPrint={(_String S):=отображение S}; // лямбда!!!
 
    *lList=Box(1).ToList+Box(2)+Box(3);
    *lListP1=lList+Box(4)+Box(5);
    @ lBox, lInd++ lListP1:
        fnPrint("lBox["+(lInd)+"].D1 = "+(lBox.D1)+"\n");
    .
 
    *lList2=Box(1, "первый").ToList+Box(2, "второй")+Box(3, "третий");
    @ lBox, lInd-- lList2:
        fnPrint("lBox["+(lInd)+"].D1 = "+(lBox.D1)+" D2="+lBox.D2+"\n");
    .
    
    End 0; // возврат кода завершения
.
1
vic_one
47 / 7 / 0
Регистрация: 20.03.2015
Сообщений: 56
28.07.2015, 09:18  [ТС] 20
F#
1
2
*fnPrint={(_String S):=отображение S}; // лямбда!!!
*fnPrint2={_String S:=отображение S}; // теперь и без скобок вокруг параметров
1
28.07.2015, 09:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2015, 09:18

С какого языка стоит начать обучение? С языка программирования Pascal?
Здравствуйте. Хотелось бы больше знать о компьютерной безопасности, в...

По русскому названию языка программирования присвоить переменной английское название этого языка
Дан перечень названий языков програм. на русском и англ. языках.По русскому...

Выбор языка программирования для разработки среды программирования
Возникла мысль о создании ЯПа. Ныне популярные ЯПы не универсальны, либо...


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

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

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