November 15th, 2012

Ya, programming language Ya

Это блог про новый язык программирования Ya который я придумал

Сделать язык я мечтал со школы но реально заняться удалось лиш в 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х аргс можно и не делать - кому надо сам сделает).
Ya, programming language Ya

Про основателя блога который Павел Сенаторов

Я Павел Сенаторов из Москвы, родился 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, programming language Ya

список задач с временами и порядком действий

Часть 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 - но реально это делается впараллель с другими работами)