Ya, programming language Ya

ya_lang


Programming language Ya

Discussion of Ya and its implementation


помогите опубликовать английское описание Ya в java_dev.
Ya, programming language Ya
ya_lang
Я написал наконец по английски описание Ya, чтобы публиковать в разных местах где люди интересуются новостями в языках и новыми языками. Нашол java_dev.livejournal.com, но опубликовать там не получается - нет линка для публикаций. Че делать? Кто знает как с этим справиться? Если можете опубликуйте сами.

Ya - description of new programming language Ya
Ya, programming language Ya
ya_lang
I'm Pavel Senatorov from Moscow, the developer of new programming language Ya.

The description in russian look at ya-lang.livejournal.com. The comments to this article better publish in ya-lang.livejournal.com - while now there only russian messages, everybody there understand English well.

Please help to know where this message should be posted for people who are interested in news for C++, C#, Java, Pascal.

Ya is based on C++ and gets most of C++ as is. Yet there is no compatibility with C++, C++ program is not a Ya program and cannot be compiled as is.

Basic concepts (ideas, basics) of Ya
- double compilation - while compiler compiles, parts of the compiling program could be executed. It's required for extending Ya syntax, lexical tokens and to perform optimizations, with optimizer being written in the program being compiled.
- extandable syntax
. - possible to add new statements. For example it's possible to to add statement 'foreach' for newly written type of a container.
. - probably it will be possible to add to language syntax even a new nonterminal and rules for using it
- extandable lexical tokens
. - possibility to add to expressions new operations.
. . - for example for sortings it's required comparison result of lesser or equal or bigger and it's possible to add new operation, let' name it '<=>', which makes it for standard types.
. . - next example: let's '<->' will notify exchange of values of variables (swap). Usage: int i,j; i <-> j;
. - possibility to make other new constants. For example time is typically written like 10:53:17 - addition of a new kind of constant is described as regex and the code for transforming of text of new constant into required type the programmer writes on Ya. Note that this code will be executed on compile time, not run time.
- support for databases and internal structures like databases - it will probably be done as library, but should be mentioned. The same kind of feature in C# is named LinQ
- many small changes in the base of C++
. - no project file. Each Ya project has _main_ source that compiler compiles. Main source contains description of other modules of program and which files contain this modules. It must not be described in main source and could be partially in other modules, yet the compiler should know from sources which modules are parts of program and where they are.
. - named modules: 'module name;' at the start of each compiled file
. - header files are not used. Instead it is the statement 'using module, module;' , so separate header and implementation for a module goes out, because 'using module' gets interface into work but not implementation details.
. - keyword 'class' is not used, 'type' used instead. New types are described like here:
. . - type constint = int-;
. . - type StrC { body of structure-class }
. - all types are considered as classes, for example it's possible to inherit from type 'int'.

список задач с временами и порядком действий
Ya, programming language Ya
ya_lang
Часть 1 - база чтобы перейти самому на Ya и начать рекламу и переписку с чужаками (35.75 - к серед декабря, начал от 34, потом добавлял)
+ узнать как писать unicode 2 и 4 байта (0, т.к. переписка и чуть пробовать)
+ запуск компилятора (MSVC6) для компиляции # надо делать сразу - завтра. (2 - реально где-то 1.5 час и еще была проба на час = 2.5ч)
+ операция ',' применима по разному: 1,,,2; ,,,2; 2,,,; ,,,,; (1 - начал 11.14 вечером - кончил 11.15 к вечеру, т.е. за .75)
- контроль типов в выраж сделан криво, надо вернуть YOp (.5)
. заведение новых операторов - пока без возможности вариации типа [else statement els] (11.05: еще 3 дня - реально кончил 11.06 вечером т.е. 2 дня но не доделал)
+ лексер под иденты, знаки и заново определяемые константы - после этого возможность по дополнению синтаксиса и лексики готова (лексер 3, константы еще 2 ->5 - лексер знаков .5дня, иденты допустимы но пока не исп, заново определяемые константы не поддержаны -> реально лексер только знаков 1 день)
. + комментарии /*...*/ можно поддержать вложенные - пока не предпол делать -> реально 2 часа
+ определение и использование новых операций, которых не было, т.е. с заведением новых лексем. (11.07 середина дня: 2 дня на простые операции -> реально уже 4 - доделал 11.14 из них 1 день на другое, т.е. всего 6.5дн вместо 2 - пока правило в 3 раза держится)
- в LL1 недоработка - в YLexema должно быть 3 Priority для pre in post (.5 - т.к. переделывать YExpr чтоб пользовался)
. двойная компиляция в полном обьеме - чтобы любые вычисления compile time стали возможны и # мог генерировать любой новый код. (типа 6 - начал 11.15 .75)
. - приведение в порядок различий между runtime и compiletime (3)
. - вызов компилятора в процессе (2)
. - формирование .prj файла (1)
- многострочные строковые константы разрешить без \n\. Кроме того, быть с пробелами в строке как в Ceylon - лишние пробелы на след. строках удалять (1)
- основы - классы и их использование, функции и контроль типов, преобр типов в выраж (6)
. - классы и их использование (3)
. - функции и их вызов (1)
. - и контроль типов для функций (1)
. - операция преобразования типа теперь пишется: тип выражение - никаких скобок, запрещены вокруг типа. Выраж может быть в скобках без проблем. (1)
- модули и убрать файл проектов (6)
. - module name; переход на модули (1)
. - using module, module... и где модули - module Syntax "Ya/Syntax.Ya"; (2)
. - убрать файл проекта и местополож файлов по исходнику. И генерация .Prj файла (3)
- unicode 1,2,4 байта (3)
. - понять как писать unicode тексты 2 и 4 байта (0, это переписка и чуть проб: надо сразу узнать как писать unicode, т.е. завтра)
. - понять как это читать и обрабатывать (1)
. - делать как придумаю (1)
. - теоретически надо сразу сделать иденты разные, но тут не знаю куда копать. Скорее больше спрашивать других чем делать (1)
К этому моменту синтаксис, лексика, unicode готовы - фактически вся основа языка. Оценка времени - наверху в скобках - а всего 36 дней, а начало работ ~10.11.12, т.е. конец части 1 16.11.12

Часть 2 - перейти самому на Ya и начать рекламу и переписку с чужаками (6)
- ЖЖ (4)
. - опубликовать в ЖЖ переписку со своими (1)
. - реклама в ЖЖ - по мелочам (1)
. - реклама по новым другим языкам, а также по фанатам C++ C# Java Pascal Delphi, не знаю, реально знаю - надо сделать но не рассчитывать что толк будет (2)
- перевод меня на Ya. Правда из С++ в Ya придется руками переделывать, но начать надо с этого (2)

Часть 3 (6-7)
- ! - assert внутри выраж - expr! значит выражение вычисляется как обычно и после этого на результат выраж делается assert (1.2)
. - postfix op expr! с реализацией для bool и * (0.2)
. - для указателей щитать что false не только 0 но и любой указ по которому залезть в память нельзя - тут надо узнать простое правило опр по значению адреса что хорошо и что подозр. Вероятно 1.меньше некой const плохо, 2.0xC... 0xD... - тоже плохо (1)
- внутри модуля разрешить пользоваться короткими идентами, а когда пользуются извне - к идентам автоматом добавляется имя модуля, а когда из другой подсистемы (не знаю как правильно назвать Gen, Ya, Kle...) - то еще и букву-имя подистемы. Это моя замена namespaces. Впрочем имя модуля-подсистемы разрешить давать с '.', напр 'Gen.' или 'Act.' (2-3)
- разрешить в идентах знакосимволы. Знаки которые нельзя - '(' ')' - иначе пробл с вызовом функций. Лексинг - YSigner. Но начало обязат от стд идент (1)
- функции без скобок: YLexa next { return *++Lexes; } Собсна проблема тут только в том что по использованию нельзя понять чем пользуешся - перем или функц (2)


Часть 4 (3+1+2+1+1+3+3+1+1 =16)
- switch (3)
. - вместо case писать ? - это гораздо лучше чем ничего не писать - и коротко и ясно что case (0)
. - в switch после ? может быть несколько вариантов через запятую. И с диапазонами 10..20. '..' это лексема, не 2 точки (2)
. - в switch else: = default: (0)
. - в switch каждый case автоматически заканчивается break кроме случая написания continue для продолжения в след case - тут непроста реализация (1)
- break for...; continue for; (1)
- значения параметров по умолчанию, типа void hello(String name="World") - надо разрешить все параметры делать с умолчанием (т.е. можно с умолчанием а после без) - этим польуются так: при вызове если хочеш умолчательное знач ничего не пиши на месте параметра, типа f(,,5) (2)
- ** - возведение в степень, должно работать для целых и double степеней (брать корень) (1)
- str+str+str : рядом написанные выраж типа строка через + конкатенируются, в том числе с не строками. Пример: char[] name, hello = "Hello, " + name; (2)
. - Но: тип преобразования не укажеш %d %4d %.*s. Кажется вот как интересно сделать: "Hello %s!" + name; - форматирование пишется для 1 аргумента. Не уверен что пойдет, надо пробовать
- else как инфикс операция: в выражениях у которого первый арг оценивается как bool и пропускается если true а иначе после else. Пример: char[] hello = "Hello, " + (name else "world"); (1)
- Внутри тела # функции по код умолчанию идет на выход как препроцессированный. А вот что начинается с #, например #{...} или #if()...else...; - это исполняется compile time. Т.е. грубо - # это compile time, а просто - run time. Теоретически в обычном коде можно написать #if() - но оно должно пользоваться только compile time вещами, т.е. типами и кодом и константностью но не run time, например не аргументами (3)
- нужны массивы (ну типа массивы) с другим индексом. По сути хеши. Это ... а надо ли это делать частью языка? Игорь говорит что в Java-C# это часть языка, а нафига? Если можно сделать как либу - так лучше. (3)
- опции компилятора разрешить задавать в исходнике. Синтаксис - типа pragma. По сути обычное дело для # (1)

Часть 5 (7)
- желательно сделать программу которая переделывает С++ в Ya, раз уж Ya не принимает чистый C++. Причин много - преобр типа пишется type expr а не (type)expr или type(expr). - switch ?: - i else "World" - char|*? st; (7 - но реально это делается впараллель с другими работами)

Про основателя блога который Павел Сенаторов
Ya, programming language Ya
ya_lang
Я Павел Сенаторов из Москвы, родился 27.07.69

Окончил в 86 математ школу 52 и в 92 МФТИ факультет ФУПМ - управления и прикладной математики. В школе первоначально увлекался физикой, даже побеждал на олимпиадах городских. Но инженерия была важней. Со школы начал заниматься электроникой, паял усилители и кажись даже УКВ радио сделал по схеме с ФАПЧ. Но потом настало программирование - еще в школе профессиональное обучение было на программистов и это осталось на всю жизнь.

После института работал программистом до 98. В 96 написал из интереса систему распознавания текста с экрана компа - опыт распознавания уже был т.к. я работал на Окрус - мало щас известную фирму которая делала рапознаватель отсканированного текста, и тогда задумал и сделал свою распознавалку. Потом из-за своей распознавалки сотрудничал с фирмой БИТ, так тогда нынешний ABBYY назывался.

В 98 весной-летом я работал в Штатах (во Флориде) и моей распознавалкой экрана заинтересовалась одна американаская фирма. Так что во Флориде я просидел 2 мес из 3 и слинял в эту фирму в New Jersey. Как результат с этого момента я стал делать свой продукт на продажу, типа бизнес получился. Что привело к тому что с 99 по 09 года я жил за счет продаж продуктов Kleptomania и Textract, см. http://structurise.com, которые вполне кормили но миллионером далеко не стал, больше $50K в год не было.

Язык стал разрабатывать примерно с 02 - щас уже точно не скажеш. Серьезная активность пошла в 06-09, но сильно мешела наркомания, если это так назвать - я сидел на трамадоле - это такое обезболевающее. С трамалом все кончилось по инициативе мамы - в августе 09 я стал еще что-то жрать, мама послала сестру Аню и мою любовницу Дину меня спасать, так что я в итоге провел сентябрь-декабрь 09 в спецзаведении по лечению наркоманов в подмосковье. Это вполне сработало и пробовать заново трамал или что еще пока не собираюсь, хотя интерес с чего это я трамал жрал все же есть некий.

А в январе 12 я стал думать что делать и понял что меня интересует только язык. Без языка можно сразу кидаться - жить незачем, а там правильнее чем тут, все же на том свету наша родина и тут оказываемся ну типа в путешествии, а чего-то достичь можно только там. Щас я в этом не уверен, неспроста народ родится. Неважно.

Так что начал 5 января 12 писать компилятор, реально сначала C++ без препроцессора со своими добавками которые хотел испытать, в первую очередь на тему двойной компиляции.

Но последние месяцы пишу чисто Ya а не C++ и даже надеюсь к новому 13 попробовать и перейти на Ya полностью, т.е. свои исходники компилятора переделать в Ya и работать на Ya - для меня это лучший способ понять какие фичи хороши, какие выкинуть а какие поменять.

На будущее надеюсь в мае-октябре 13 доделать язык и компилятор до возможности показывать другим. В этот момент начну рекламу с целью найти сообщников - конечно интересующиеся и помогающие есть и сейчас, но нас мало, типа 8. Так что буду в первую очередь публиковать обьявления там где кучкуются интересующиеся новыми языками а также новинками про C++, C#, Java и Pascal.

Также нужно нормальное описание языка на английском. Видать придется самому делать.

Начать распространять компиятор можно в принципе в этот же момент. Но не бесплатно - я собираюсь-надеюсь на Ya и заработать. Т.е. формально будет shareware - типа месяц можно пользоваться-пробовать, а потом плати $1000 если хочеш на нем работать.

Это блог про новый язык программирования Ya который я придумал
Ya, programming language Ya
ya_lang
Сделать язык я мечтал со школы но реально заняться удалось лиш в 2012. Т.е. что-то я делал, думал-писал про устройство языка но до
реализации (компилятора) не доходило.

Ya основан на C++ и большую часть C++ берет как есть. Но совместимости с C++ нет, C++ программа не будет компилироваться как Ya.

Базовые концепции (идеи, основы) языка
- двойная компиляция - пока компилятор компилирует компилируемый код может тут же запускаться. Это нужно для возможности
расширять-изменять синтаксис языка, лексику и делать оптимизации, где оптимизатор написан программистом
- дополняемый синтаксис
. - можно добавлять новые операторы в язык. Например какой-нибудь foreach для своего типа контейнеров.
. - предполагается что можно будет даже добавить в синтаксис языка нетерминал и правила трансляции в базовые
нетерминалы-терминалы
- дополняемая лексика
. - можно добавить в выражения новую операцию.
. . - например для сортировок нужнен результат <0,0,>0 и можно ввести операцию, назовем ее <=>, которая это делает для стандартных типов.
. . - еще пример: пусть <-> означает обмен значений переменных (swap). int i,j; i <-> j;
. - можно добавить другие новые константы. Например время естественно писать как 10:53:17 - добавление новые константы
описывается как регекс а код по превращению текста константы в нужный тип программист пишет на Ya
- поддержка работы с базами данных и данными программы по структуре похожими на базу данных - видимо это будет не более чем
библиотека, но для языка важно
- мелкие изменения в базе С++ - это наверно концепцией не назовеш, но опять важно
. - отказ от файла проекта. В каждом Ya проекте есть _главный_ исходник и при запуске компилятора ему говорят компилировать один
главный исходник. Внутри главного исходника описывается какие модули в проекте и в каких файлах. Конечно это не обязано быть
описано в главном исходнике, лиш бы при компиляции используемых модулей было ясно в каком файле модуль
. - понятие модуля с именем: module name; в самом начале каждого компилируемого файла
. - убирание .hpp и введение using module, module..., что убирает разделение на хидер и реализацию т.к. в модуле пишут обе части
но using подключает только интерфейс модуля но не реализацию
. - слово class отменить (запретить) и писать структуры и новые типы так:
. . - type constint = int-;
. . - type StrC {тело cтруктуры} - заметим что ; в конце не нужна т.к. переменных тут быть не может
. - break for...; continue for; - в C++ часто приходится делать goto из циклов и switch если покидаеш более одного for-switch.
Потому теперь можно указать из чего break выходит, например break switch for; - значит надо выйти сначала из switch и еще из for
. - в switch каждый case автоматически заканчивается break кроме случая написания continue для продолжения в след case
. - в switch после case может быть несколько вариантов через запятую. И с диапазонами 10..20. '..' это лексема, не 2 точки. Пример: case 1,4,10..20:
. - описание типа - теперь описание типа будет в одном месте, не как в C++ где массивы пишут так char str[100]; - в Ya это будет
char[] str(100); или в структурах было описание длины напр int i:8; что значит что i 8 бит длиной - теперь будет int:8 i;
. - + unsigned. Пример int+ i; т.е. unsigned int i;
. - -+ signed: -+ щитается одной лексемой
. - - const. Пример int- i = 0; т.е. const int i = 0;
. - указание длины (в битах) перем: пример: int+:8 i; это unsigned int i:8; Или int+:16*- p; это ushort* const p; если short 16
бит
. - * указатель-ссылка, официально указатель, станет одним, ссылки официально отменяются. Для доступа к значению можно писать
*ptr а можно ptr, т.е. компилятор по типам аргумента и результата определяет сколько раз тут надо взять содержимое указателя. Это
делается чтобы проще было писать работу с указателями. -> станет не нужна. Указ на указ возможны. Взятие адреса - &
. - [] для массива, между [ и ] можно писать тип контейнера, например для создания массива который можно расширять будет писаться
[+]
- возможность пользователю-программисту дорабатывать реализацию языка - при помощи написания библиотек. Т.е. в языке есть
(предполагаются) возможности (типа полей-методов зависящих от нескольких аргументов), которые в базовой реализации сделаны
нормально для простых применений (типа зависимость лиш по одному аргументу для полей и функций), а для сложных реализованы кое-как
(скажем для 2х аргс реализацию я сделаю чтобы показать что возможность все же есть, но сделаю кое-как), или не реализованы (скажем
для 3х аргс можно и не делать - кому надо сам сделает).

?

Log in