Давно уже в моей голове поселилась эта идея. Но я всё откладывал на потом — были более важные или интересные дела. А теперь я жалею, надо было всё бросить и сосредоточиться только на ней!

Все замерли в ожидании, что за идея? Идея — написать свой язык программирования!

Вздох разочарования, 99% выкинули свои компьютеры в окно, ну а для тех кто остался, я продолжу.

Меня всегда интересовали различные направления и веб я хочу сбацать и мобайл и десктоп и что-нибудь серверное готов написать, ещё мне интересены ИИ, игры, роботы, криптовалюты… И при этом, хотелось бы всё это писать на одном языке).

Смотрел я в сторону С++, C#, Java, Javascript и даже Python, но везде мне что-нибудь не нравилось…

Итак, всё решено, пишу свой язык программирования. Скрестим мощный C++ с лёгким Javascript и назовём Cj!

image

Начинаем придумывать синтаксис языка


При описании переменных я предлагаю дать возможность как в С++ сразу указывать тип переменной. Для описания автоматической переменной используем, как и в C++, слово auto, либо не указываем, как в Javascript, тип данных совсем.

int a;
auto b;
c = 5;

Теже правила применяем и для описания функций:

int sum() {}
auto sub() {}
mul() {}

Смотрите как удобно и лаконично! Если у имени есть скобочки (), то это функция, не надо никаких function, как в Javascript, но и возвращаемый тип указывать не обязательно!

Пока достаточно, полную спецификацию на язык можно посмотреть здесь: sitev.ru/post/163

Выбираем инструмент для написания компилятора


Конечно, я сразу же побежал читать статьи про LLVM. Но прочитав пару статеек, мне стало скучно и грусно. Мозг устал, благо пора уже было спать. Проснувшись утром, я уже знал решение этой задачи: никаких 4-х букв, пишу строго на С++! Напишу свой лексер, парсер и т.д… Мне так интереснее, и в добавок, на выходе получим свой простенький аналог LLVM!

Синтаксические диаграммы для языка Cj


Писать сразу код по спецификации я пробывал, но постоянно путался, переписывал. Да и зачем? Если есть синтаксические диаграммы Вирта. Надо описать синтаксис визуально, а потом перевести его в код. Давайте быстренько набросаем эти диаграммы.

Программа — это блок кода, который состоит из statement (инструкций).



Основной код main_block_code отличается от вложенного {}. Для них буду разные диаграммы.



Обработка функций — это вызов и описание функции. Вызов попроще:



описание чуть посложнее:



И да, мы забыли про переменные и про то как они с функциями будут участвовать в выражении:



Осталось написать компилятор


Злые языки начнут язвить: ну-ну, пиши давай теперь свой компилятор. А я вот написал уже (генерирует исходник на JavaScript).

Пример на языке Cj:

int my_func1(int p) {
int a;
a = 5;
}
my_func1();


А вот что получается на Javascript:

function my_func1(p) {
	var a;
	a = 5;
}
my_func1();

Конечно, в языке пока только внедрены самые базовые возможности. Что тут говорить, в нём даже не описан оператор if! Да и компилятор скорее всего будет падать. Но всё ещё впереди, как говорится: лиха беда начало!

Исходники выложил на ГитХаб, а вот бинарник.

Смотрим, тестируем, присоединяемся к написанию нового языка программирования Cj!

Комментарии (262)


  1. sitev_ru Автор
    16.10.2017 15:25
    -1

    Статья резко пошла в минус. Яж писал «вздох разочарования, 99% выкинули свои компьютеры в окно, ну а для тех кто остался, я продолжу». Это статья, кому интересно писать свои компиляторы))


    1. Merlen_Gross
      16.10.2017 15:29
      +1

      Тем, кому интересна эта тема, читают специализированную литературу и практикуются без попыток увеличения ЧСВ через написание статей, чья выжимка выглядит как "смотрите чё могу посоны".


      1. sitev_ru Автор
        16.10.2017 15:36
        -2

        Не соглашусь с Вами. Я пишу язык и хочу привлечь ещё людей. Вдруг найду единомышленников?


        1. curunir
          16.10.2017 15:44

          Хорошо, я понимаю, вы не хотели чтобы статью восприняли в негативном ключе, но даже если так — чем же вы думали привлечь единомышленников? За исключением

          Смотрите как удобно и лаконично! Если у имени есть скобочки (), то это функция, не надо никаких function, как в Javascript, но и возвращаемый тип указывать не обязательно!
          вы не описали вообще ничего в рамках статьи. Причём даже то что описано — показывает вас как профессионала с не самой лучше стороны.
          Возможно, вам стоило сначала как следует рассмотреть развивающиеся проекты подобного рода и получше разобраться в вопросе.


          1. sitev_ru Автор
            16.10.2017 15:48

            Например, какие проекты?


        1. aamonster
          16.10.2017 16:45

          Таких, чьё мнение стОит учитывать — не найдёте.
          Мне нравится ваш энтузиазм, сам таким же был в 15, но вы не описали потенциальных преимуществ своего языка (мелкие изменения в синтаксисе — ерунда, к таким деталям привыкаешь за день), ни деталей его устройства (вы хотя бы понимаете принципиальную разницу между c++ и javascript? Ну, помимо того, что один компилируется, а другой, если не повезло, интерпретируется?)
          И с ходу отбросили llvm и т.п. — похоронив надежду сделать хорошую оптимизацию в своём языке.


          В общем, привлечь сможете только таких же юных энтузиастов, а нужен суровый наставник :-)


          1. sitev_ru Автор
            16.10.2017 17:27

            Я постарше… Возможно старше Вас )


            1. aamonster
              16.10.2017 23:12

              Тем лучше для вас — в 40 с гаком приятнее быть молодым энтузиастом, чем старым пессимистом :-).


              Тем не менее, вам сейчас нужен именно пессимист, который будет задавать неприятные вопросы (вообще говоря, основные вопросы вроде "какова цель", "в чём преимущества" и "чем за них придётся платить" должны были задать вы сами и сами дать ответы на них в статье).


              Кстати, тут уже всплыла следующая проблема — библиотеки. Язык, если вы не делаете качественную оптимизацию — ерунда, думаю, тут у многих в истории болезни как минимум написание интерпретаторов. Но вы же замахнулись на переносимость. Как вы себе представляете эффективную библиотеку, единую для C и JavaScript?


              Собираетесь ли вы в своём языке предоставить GC? Дать доступ к raw pointers? Поддерживать замыкания? Это всё — ключевые вопросы, меняющие структуру языка куда сильнее, чем изменения в синтаксисе, которые вы описали в статье.


              1. sitev_ru Автор
                17.10.2017 06:12
                -1

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

                Сейчас вырисовывается такой план:
                1. Сделать трансляцию в Javascript
                2. Сделать трансляцию в С++ и чтобы работало одинаково с Javascript

                Далее я идут в яндекс/гугл/майру, беру у них несколько миллиончиков зелёненьких на разработку и дело в шляпе. Если не дадут бабки — будет просто язык, на котором буду писать только я сам, и возможно, несколько единомышленников…


                1. aamonster
                  17.10.2017 08:48
                  +2

                  Не дадут, разумеется. И единомышленников, которые помогут — вряд ли найдёте.
                  Сделать нечто, транслирующееся и в js, и в c++ — несложно. Только возможности будут несопоставимы ни с тем, ни с другим — просто потому, что вы унаследуете ограничения обоих.
                  Я не зря спрашивал про gc/указатели/замыкания. Это ключевые моменты, влияющие на внутреннее устройство языка, а не синтаксический сахар, про который вы говорили в статье.


                  1. sitev_ru Автор
                    17.10.2017 09:05
                    -5

                    Кстати, дайте совет? Может Вы что-нибудь дельное предложите. Я просто пока не задумывался над этим вопросом. Вдруг мне подкинут пару миллинчикофф на разработку языка. Тогда Ваш труд не пропадёт даром, я с вами обязательно поделюсь!

                    Кстати, где карма? Где публикации?


            1. sayber
              16.10.2017 23:14

              У нас половина сообщества за 35-40 лет.


        1. andreymal
          16.10.2017 16:50

          А почему единомышленников должен заинтересовать ваш «язык», если любой мало-мальски вменяемый программист может написать то же самое или даже лучше за несколько дней? :)


          1. sitev_ru Автор
            16.10.2017 17:28

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


      1. alisa_musik
        17.10.2017 23:20
        -1

        А мне понравилось. Язык простенький, как раз для меня!

        P.S. Гомерчик прикольный!


        1. alisa_musik
          17.10.2017 23:46

          Зачем минусуете?


    1. EvilGenius18
      16.10.2017 15:36

      Скорее для тех, кому нравится делать что-то абсолютно бесполезное.

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


      1. sitev_ru Автор
        16.10.2017 15:38

        Речь не идёт о 20-ти годах. Да, возможно, несколько месяцев.


        1. EvilGenius18
          16.10.2017 15:44

          А исправление багов и закрытие уязвимостей? Или и так сойдет?
          Для чего нам будущее, в котором будут сотни проектов, наполненные багами и уязвимостями, написанные с нуля недо-разработчиками?


          1. sitev_ru Автор
            16.10.2017 15:49
            -3

            У меня нет финансирования, я пишу в свободное время. Дайте бабки, исправлю баги и уязвимости). Да и давайте закроем ГитХаб. Что-то они там пишут, слишком много говнокода!


            1. EvilGenius18
              16.10.2017 16:06

              Дело не в финансировании. Писать свои языки программирования это плохая идея, если он не предлагает чего-то совершенно революционного для большого количества разработчиков.
              Кто захочет переписывать все библиотеки с Python для нового языка только потому, что он новый? Ни у кого на это нет времени

              А гитхаб это прямой пример того, о чем я говорю:
              — берем существующий проект / инструмент с исправленными багами и закрытыми уязвимостями, проект на который уже была потрачена тысяча часов работы.
              — улучшаем этот инструмент, вместо того, чтобы писать свой с нуля


              1. sitev_ru Автор
                16.10.2017 16:21

                Не пойму, я хочу написать свой язык программирования. Какой проект я должен взять с ГитХаба?


                1. EvilGenius18
                  16.10.2017 16:45

                  Для этой цели никакой. Лично я думаю, свой язык программирования стоит писать только, если он способен изменить что-то в мире разработки кардинально. Иначе зачем он нужен?
                  Если вы уверен, что он таковым является, тогда стоит описать его преимущества и принцип работы в формате так называемой white paper, чтобы профессиональные разработчики заинтересовались и помогли написать.

                  Если же вы не уверены, что этот язык настолько хорош, что многие разработчики бросят свои Python, C, JS и перепишут все существующие фреймворки и библиотеки ради него, тогда, для кого он будет нужен?


                  1. sitev_ru Автор
                    16.10.2017 17:33

                    Запросто! Итак, ко мне обращается заказчик и говорит. Хочу веб сайт. Я беру Cj лабаю на нём сайтик. На выходе html/js/css/php или nodejs. Сдал работу заказчику. Обращается второй заказчик и говорит мне — напиши мобайл для андроид и для айос. Я беру Cj и пишу один код. На выходе для андроида — java, для ios — ObjectC. Тут обращается следующий заказчик — ему я пишу серверное приложение, на выходе C++ или какой-нибудь Erlang. Хочу игру на Unity. Опять беру Cj — упс — игра га юнити) и т.д. и т.п...)


                    1. SerafimArts
                      16.10.2017 17:37

                      Что-то мне это напоминает: haxe.org и не особо он взлетел, хотя сообщество огромное. Догадываетесь почему? =)


                      1. sitev_ru Автор
                        16.10.2017 18:06
                        -3

                        Меня устроит, если язык добавят в хотя бы в Википедию. ))


                    1. lair
                      16.10.2017 17:58

                      беру Cj лабаю на нём сайтик. На выходе html/js/css/php или nodejs.

                      То есть у вас в Cj еще и разметка будет?


                      1. sitev_ru Автор
                        16.10.2017 18:05
                        -1

                        Пока не знаю… Это как идея. И разметка и css на Cj! ))


                        1. lair
                          16.10.2017 18:07
                          +2

                          Вы пытаетесь сделать god language. Не взлетит.


                          1. sitev_ru Автор
                            16.10.2017 18:20

                            Ближайшая цель — добавить в язык ещё несколько конструкций и генерить Javascript, свой Typescript. Что дальше — потом будет видно.


                            1. lair
                              16.10.2017 18:23
                              +1

                              Совершенно не понятно, зачем добавлять в свой язык конструкции, чтобы генерить из него JS/TS (или другой язык), если можно просто взять JS/TS, из которого генерить все остальное.


                              Какой профит от собственного языка?


                              1. sitev_ru Автор
                                16.10.2017 18:35

                                Да, я понял Вашу мысль. Можно делать, как Вы предлагаете. У меня не возникло такой мысли. Видимо, хотелось сделать какой-то более чистый синтаксис. Ну пошёл по такому пути.


                                1. lair
                                  16.10.2017 18:36

                                  Видимо, хотелось сделать какой-то более чистый синтаксис.

                                  Получилось?


                                  1. sitev_ru Автор
                                    16.10.2017 19:09
                                    -1

                                    Вроде бы, хотя не факт. Вы что предлагаете взять TypeScript и генерить из него под все платформы? Вы будете участвовать в написании такой штуки? (К сожалению, отвечаю редко, потому что хабр запрещает мне отправлять компилятор чаще, чем 1 раз в 5 минут)


                                    1. lair
                                      16.10.2017 21:02

                                      Вы что предлагаете взять TypeScript и генерить из него под все платформы?

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


                                      Вы будете участвовать в написании такой штуки?

                                      Нет, я считаю это гиблой идеей.


                                    1. mayorovp
                                      19.10.2017 12:57
                                      +1

                                      C# так уже умеет, только не для целых программ, а для выражений.


                                      Я работал как минимум с двумя библиотеками которые, фактически, умеют превращать C# в SQL и с одной которая умеет превращать C# в Javascript (и я исправлял ошибки последней — так что можно сказать что участвовал в написании, правда это было в закрытом форке).


                    1. zagayevskiy
                      16.10.2017 18:29

                      Ну, вы в курсе про Kotlin, да? Андроид и веб есть, натив, вроде тоже. Посоны 5 лет писали до версии 1.0.


                      1. sitev_ru Автор
                        16.10.2017 18:40

                        А если хочу в айос?


                        1. staticlab
                          16.10.2017 18:42

                          Kotlin Native компилируется в нативный байткод через LLVM.


                          1. Nagg
                            17.10.2017 02:49

                            и что с ним на айосе можно делать?) Хеллоу ворлд написать?


                            1. staticlab
                              17.10.2017 07:16

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


                              Во всяком случае, можно писать кроссплатформенные игры, например, на SDL или на движке с поддержкой SWF.


                              1. sitev_ru Автор
                                17.10.2017 08:45

                                Выбираем движок Unity, Unreal и любой другой — тоже можно писать кроссплатформенные игры под все платформы.


                                1. staticlab
                                  17.10.2017 09:39
                                  +1

                                  Тогда зачем нужен Cj, если есть Unity?


                              1. Nagg
                                17.10.2017 14:07

                                Ок понял, значит не нужно. Когда будет полноценный UI фраемворк + интеропобилити с 3rd party тогда поговорим — а так это очередное "Смотрите, я скомпилировал свифт под андроидом!"


                                1. staticlab
                                  17.10.2017 14:21

                                  Под полноценным "фраемворком" (откуда, кстати, пошла мода на такое коверканье?) имеете в виду кроссплатформенный фреймворк?


                                  1. Nagg
                                    18.10.2017 00:33

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


                                1. sitev_ru Автор
                                  17.10.2017 14:21
                                  -2

                                  Возможно, Хабр слишком серьёзный сайт. На каком сайте можно представить разработки начального уровня, где пока что толком ничего не работает, но чтобы услышать добрый совет или какую-либо помощь?


                                  1. SerafimArts
                                    17.10.2017 14:50
                                    +2

                                    На Тостере, подозреваю.


                        1. zagayevskiy
                          16.10.2017 18:47
                          +2

                          Kotlin/Native is primarily designed to allow compilation for platforms where virtual machines are not desirable or possible (such as iOS, embedded targets), or where a developer is willing to produce a reasonably-sized self-contained program without the need to ship an additional execution runtime.

                          Это я к тому, что команда разработчиков, получающих по 200.000р в месяц, полировала язык 5 лет, и всё ещё не закончила. Тут вылезаете вы с вопросом "А если хочу в айос?", в то время как у вас не компилятор, а транспилятор, который умеет 0.01% псевдо-джаваскрипта переводить в джаваскрипт 1-в-1.


                          1. sitev_ru Автор
                            16.10.2017 19:23

                            Отлично, возможно, мой язык — это Kotlin. Заинтересовался, придётся изучить этот язык)). Но и свою поделку уже врядли брошу. Буду развивать дальше)


                            1. zagayevskiy
                              16.10.2017 19:25

                              До чего жырный тролль.


  1. lair
    16.10.2017 15:28
    +3

    А что, бишь, в вашем языке от "мощного C++"?


    1. sitev_ru Автор
      16.10.2017 15:32
      -2

      Пока ничего. Это только версия 0.1. Кстати, если Вам интересно, предлагайте, что хотели бы увидеть? Возможно, у Вас есть интересные идеи, у меня желание писать код. Хотя, у меня и самого идей полным полно, но готов, естественно, обсуждать любую критику и предложения.


      1. lair
        16.10.2017 15:34
        +2

        Кстати, если Вам интересно, предлагайте, что хотели бы увидеть?

        Я предпочел бы это развидеть. Я считаю, что эта помесь ежа с ужом, как обычно, превратится в колючую проволоку.


        1. sitev_ru Автор
          16.10.2017 15:51
          -1

          Надеюсь сделать хороший продукт. По крайней мере, мне интересно!


          1. lair
            16.10.2017 15:52

            Чтобы сделать хороший продукт, надо иметь цель помимо "сделать хороший продукт". Какие задачи преследует этот продукт? Чем он выгоднее конкурентов?


            1. sitev_ru Автор
              16.10.2017 16:14

              Хочу писать веб страничку — Cj генерит Javascript, хочу Android — генерит Java под Android и т.д… Цель — генерировать самый оптимальный код, самое оптимальное решение. И тогда будет успех. Я не говорю, что я в одиночку в свободное от работы время смогу написать лучше гугл или майкрософт. Но я стараюсь)


              1. lair
                16.10.2017 16:15

                Хочу писать веб страничку — Cj генерит Javascript, хочу Android — генерит Java под Android и т.д…

                1. Тогда при чем тут вообще C++?
                2. Как вы будете решать проблему с зависимостями?
                3. Почему не использовать любой существующий язык?


                1. sitev_ru Автор
                  16.10.2017 16:23

                  1. Хочу десктоп — Cj генерит, С++
                  2. Поясните подробнее, плиз?
                  3. Предложите, какой язык я должен использовать?


                  1. kez
                    16.10.2017 16:45

                    1. Например, в таком случае стоит посмотреть в сторону haxe


                    1. sitev_ru Автор
                      16.10.2017 16:45

                      Смотрел я haxe — не понравился


                  1. lair
                    16.10.2017 16:46

                    Хочу десктоп — Cj генерит, С++

                    Зачем вам для этого C++ в языке?


                    Поясните подробнее, плиз?

                    Вот у вас есть, значит, приложение, которое должно сохранить файл, полученный с сервера, на диск. В приложении написано что-нибудь типа stream.SaveTo(path). Во что это будет компилироваться на десктопе — более-менее понятно. А на остальных платформах, вот прямо с браузера начиная?


                    Предложите, какой язык я должен использовать?

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


                    1. sitev_ru Автор
                      16.10.2017 17:40
                      -2

                      Для десктопа, например, генерит Qt/C++. Что делать с stream.SaveTo(path)? Очевидно, что в данном случае это бесмысленно. Но есть какие-то общие вещи, которые можно сделать универсально. Например, создать кнопочку. Для программы, веб-странички или какой-нибудь активити это действие однотипно.


                      1. staticlab
                        16.10.2017 17:48
                        +1

                        Далеко не однотипно. И вы сами сказали, что толком не знаете, как эту кнопочку для всех платформ сразу сделать.


                        1. sitev_ru Автор
                          16.10.2017 18:07

                          Наоборот, знаю. Она просто генерится под каждую платформу


                          1. staticlab
                            16.10.2017 18:12

                            Продемонстрируете как выглядит код на Cj, создающий кнопку, которая становится красной после нажатия, а также что будет на выходе хотя бы для JS и C++?


                            1. sitev_ru Автор
                              16.10.2017 18:29

                              Button button;
                              button.onClick = () {
                              	this.setColor(red);
                              }


                              Видимо, как-то так. Для JS и C++ будет какой-то похожий код.


                              1. kez
                                16.10.2017 18:31
                                +2

                                Для… C++ будет какой-то похожий код.

                                Так его интереснее всего посмотреть!


                                1. sitev_ru Автор
                                  16.10.2017 18:46

                                  Обычное создание кнопки программно для JS или для C++. Другой вопрос, что кнопку видимо правельнее создавать не программно, а использовать какие-то UI-файлы.


                              1. lair
                                16.10.2017 18:32

                                А нулрефа в этом замечательном коде разве не будет? И где же именно будет создана кнопка, на каком скрине, в каком его месте?


                                1. sitev_ru Автор
                                  16.10.2017 18:51
                                  -1

                                  Возможно, надо указать окно/страничку/активити, где будет кнопка. Пока это не принципиально, я такими вопросами в принципе не задавался. Нельзя сразу объять необъятное. Нужно двигаться постепенно. У нас в наличии лишь один разработчик, делающий за интерес в свободное время)


                                  1. SerafimArts
                                    16.10.2017 18:58

                                    Просто попишите на Haxe, на том языке, где это уже давно есть и попробуйте понять какие проблемы содержит данный подход.


                                    Помимо этого стоит ознакомиться с историей ASP и почему он мёртв. Почему некоторые банковские сайты часто требуют IE6/7 и отказываются работать в современных браузерах (в том числе и в современных IE, как бы сюрриалистично не звучало вместе "IE" и "современность". Я уж не говорю про Edge). И почему ему на смену пришёл ASP.NET (это совершенно другая технология, не стоит путать).


                                    Норм идея?


                                    1. lair
                                      16.10.2017 21:03

                                      Мне, кстати, интересно, каким боком сюда ASP.


                                      1. SerafimArts
                                        16.10.2017 21:15

                                        Некоторая часть API ASP (имя ввиду вот это: en.wikipedia.org/wiki/Active_Server_Pages), насколько я помню, в ранние годы генерировала куски JS и HTML кода. Или я что-то напутал?


                                        1. lair
                                          16.10.2017 22:01

                                          Это и asp.net-контролы делают сейчас. Это в любом случае была не кросс-компиляция, а просто готовая функциональность.


                                          1. SerafimArts
                                            16.10.2017 22:29

                                            Звучит паршиво. Кажется, что эти «виджеты-контролы» — это именно то, что сгубило и ASP, губит Yii и убивает Meteor. Нет?


                                            1. lair
                                              16.10.2017 22:31

                                              Затрудняюсь с ответом. У контролов есть свои сильные стороны, а вот что убило asp — я уже и не помню.


                                              (ну, помимо выхода asp.net)


                                              1. SerafimArts
                                                16.10.2017 22:52

                                                На счёт сторон — никто не спорит. Это вполне себе альтернатива jquery плагинчикам. Только, кажется, эти плагинчики никак не зависят ни от серверной реализации, ни от версии ПО на том же сервере.

                                                Я не ошибусь, если предположу, что эти компоненты используют лишь для совсем внутренних админок и макетов? Где надо побыстрее, а не так, чтобы оно нормально работало?


                                                1. lair
                                                  16.10.2017 22:53

                                                  Кого используют?


                                                  1. SerafimArts
                                                    16.10.2017 22:57

                                                    «эти компоненты» = контролы ASP.NET


                                                    1. lair
                                                      16.10.2017 22:58

                                                      Да нет, конечно. Используют в обычном продакшне.


                                  1. lair
                                    16.10.2017 21:01

                                    Это как раз принципиально. Если вы не понимаете, как будут решаться такие вопросы, заявленная вами цель недостижима.


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


                              1. staticlab
                                16.10.2017 18:33

                                А где эта кнопка в таком случае появится-то?


                                И интересует не "какой-то похожий код", а конкретный. Чтобы можно было судить о возможности эффективной транспиляции.


                                1. sitev_ru Автор
                                  16.10.2017 19:04

                                  Всему своё время) Возможно, вы подскажите самый эффективный подход.


                              1. sergey_kzn
                                16.10.2017 19:52

                                Почему-то это подозрительно напоминает Qt с QML. Декларативный интерфейс, кросплатформенно и вроде бы под web умеет.


                      1. lair
                        16.10.2017 17:57

                        Но есть какие-то общие вещи, которые можно сделать универсально. Например, создать кнопочку.

                        Ага, для сервиса особенно.


              1. staticlab
                16.10.2017 16:18

                Цель — генерировать самый оптимальный код, самое оптимальное решение

                Практика показывает, что кроссплатформенные решения всё равно уступают нативной разработке.


                1. sitev_ru Автор
                  16.10.2017 16:24

                  Так и задача генерировать нативное! А значит, все остальные кроссплатформенные решения уже проигрывают Cj! ))


                  1. staticlab
                    16.10.2017 16:35

                    Как предлагаете сделать, например, вывод кнопки для браузера, для андроида, для айфона и для десктопа на вин/лин/мак?


                    1. sitev_ru Автор
                      16.10.2017 16:47

                      Правильно клоните! Хочу сделать их однотипно. А как лучше, пока не продумал, но мысли есть, конечно же.


  1. ihost
    16.10.2017 15:33

    Сама по себе идея разрабатывать части web-приложения на C/C++ далеко не новая — другое дело, какой результат вы хотите получить от такого подхода? Возможно, вам будет интересно ознакомиться с WASM: http://webassembly.org/docs/c-and-c++/


    1. sitev_ru Автор
      16.10.2017 15:41

      Я, конечно же, знаю про эту поделка и она пока что выглядит менее жизнеспособно, чем моё решение.

      Команда, работающая над WebAssembly, включает разработчиков из компаний Mozilla, Google, Microsoft и Apple
      . Надеюсь они когда-нибудь осилят ))


      1. RPG18
        16.10.2017 16:01

        Я, конечно же, знаю про эту поделка и она пока что выглядит менее жизнеспособно, чем моё решение.

        Уже игры на Unity в WebAssembly есть, а вы говорите "выглядит менее жизнеспособно"


        1. sitev_ru Автор
          16.10.2017 16:15

          Думал они используют WebGL


          1. RPG18
            16.10.2017 16:21

            WebGL это рисование. Их C/C++ код компилируется в Asm.js/WebAssembly.


            1. sitev_ru Автор
              16.10.2017 16:26

              Хорошо. Кто-нибудь в 2017 году пишет сайтики на WebAssembly? Думаю если и пишут, то очень очень мало. Cj будет генерировать Javascript.


              1. RPG18
                16.10.2017 16:28

                Уже есть Emscripten, который из C/C++ генерит JavaScript


                1. sitev_ru Автор
                  16.10.2017 16:49

                  Вы им компилировали? Я попробывал. Куча лишнего Javascript-кода. А у меня чистый код!


                  1. RPG18
                    16.10.2017 16:53

                    Уже пару лет в продакшене.


                    1. sitev_ru Автор
                      16.10.2017 17:43

                      Давно пробывал его. Задал int a = 1; выдал много непонятного кода). Возможно, я ошибаюсь)


                      1. RPG18
                        16.10.2017 17:49

                        Конечно же он выдал много кода, т.к. у C++ есть runtime.


                        1. sitev_ru Автор
                          16.10.2017 18:09

                          А для меня этот код лишний. Я и хочу на строчку типа int a = 1; в Javascript получить также одну строчку var a = 1;


                          1. SerafimArts
                            16.10.2017 18:12
                            +1

                            Допустим. Тогда:


                            int a = 1;
                            a = a + "some";

                            Что в этом случае должно произойти?


                            1. sitev_ru Автор
                              16.10.2017 18:23

                              Думаю, что это ошибка. У вас есть доводы переопределить тип для переменной а?


                              1. SerafimArts
                                16.10.2017 18:42

                                Там выше был пример, что "int a" превращается в "var a". Следовательно будет:


                                var a = 1;
                                a = a + "some"; // "1some"

                                А это вполне валидный и рабочий JS код. По-этому никаких ошибок.


                                С другой стороны, почему var, а не let...?


                                1. sitev_ru Автор
                                  16.10.2017 19:16

                                  Зачем изначально портить язык такими штуками?

                                  А var или let не принципиально. Это как пример. let не поддерживается старыми браузерами, значит пусть обновляют)


                                  1. SerafimArts
                                    16.10.2017 20:33

                                    Какими? Вы сами пытаетесь сделать транслятор. Следовательно надо поддержать консистентность. Сделать так, чтобы вот такой вот совершенно элементарный пример одинаково работал и на JS, и на C++: и там, и результат работы не отличался. Верно?

                                    На счёт «не принципиальности». Какой результат должен выдать вот этот пример на вашем языке?

                                    int a = 23;
                                    some() {
                                    a = 42;
                                    }

                                    // Вопрос: Чему равен "a"?


                                    Ответ
                                    Если «var a», то 42
                                    Если «let a», то 23 и одна глобальная "(global || window).a" переменная, равная 42


                                    1. sitev_ru Автор
                                      16.10.2017 21:11

                                      Версия 0.1 — это пробный шар. Конечно, нужно let. Как быть с поддержкой в старых браузерах?


                                      1. SerafimArts
                                        16.10.2017 21:36

                                        Ну, например, в локальном скоупе создать изолированную память (сгенерировать уникальное имя переменной, например). Заблокировать к ней доступ извне (сделать вид, что её не существует). Туда добавить нужное значение. Прокинуть наверх значение с именем переменной, сделав вид, что объявление "a" действительно было. Внутри вложенных скоупов генерировать свои имена, прокидывать наверх. И так далее.


                                        В результате получаем, что эти три строчки превращаются в 'дцать.


                                        Например (где xxx, yyy, и т.д. — генерируемые имена):


                                        Заголовок спойлера
                                        var xxx = (function() {
                                            var yyy = 23;
                                            return {
                                                a: yyy, 
                                                some: function some() {
                                                    var zzz = 42;
                                                }
                                            };
                                        });
                                        
                                        var a = xxx['a'];
                                        var some = xxx['some'];
                                        delete xxx;


                                        1. sitev_ru Автор
                                          16.10.2017 21:39

                                          жесть)


                                          1. SerafimArts
                                            16.10.2017 22:11

                                            Отлично, первый этап пройден. Мы выяснили откуда во всех трансляторах такая куча "лишнего" кода и почему без него не получится.


                                            Переходим к stdlib. Начнём с чего-нибудь "простого", функции получения длины строки. Давайте попробуем написать код на нашем убер-Cj:



                                            (Увы, хабр не поддерживает нормально utf-8, так что картинкоё)


                                            Такая строка занимает 21 байт в utf-8. Что-то не сходится. Как мы будем считать? И давайте учитывать, что в JS длина этой строки 12 символов, хотя физически их 11. А на C++ как мы будем считать? Подключим внутрь бинарника какой-нибудь icudt (пыщ: http://site.icu-project.org/), объёмом в ~25 мегабайт?


                                            1. sitev_ru Автор
                                              16.10.2017 22:16

                                              Тут я вроде подготовился: habrahabr.ru/post/319602


                                              1. staticlab
                                                17.10.2017 01:04

                                                У вас, кстати, длина строки получается 11, тогда как в JS — 12.


                                                Между прочим:


                                                #ifdef __linux__
                                                #define OS_LINUX
                                                #define cfg_WebApp
                                                #else
                                                #define OS_WINDOWS
                                                #define cfg_WebApp
                                                #endif

                                                Потрясающая кроссплатформенность! Угадайте, по какой ветке пойдёт компиляция на macOS? Бинарник (clang, -O3), кстати, весит целых 62 КБ!


                                                1. sitev_ru Автор
                                                  17.10.2017 06:17
                                                  -1

                                                  Тянется непомню уже откуда, старый код — macOS не брал в расчёт) Как тут лучше написать? может вообще проще выкинуть OS_LINUX и OS_WINDOWS? Бинарник Cj весит 62 КБ?


                                                  1. staticlab
                                                    17.10.2017 06:57
                                                    +1

                                                    может вообще проще выкинуть OS_LINUX и OS_WINDOWS?

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


                                                    Бинарник Cj весит 62 КБ?

                                                    Нет, бинарник, который меряет длину строки и выводит в консоль.


                  1. mwizard
                    16.10.2017 16:53

                    Несомненно, отсутствующий код — самый чистый.


                    1. sitev_ru Автор
                      16.10.2017 18:10
                      -1

                      )


    1. Stawros
      16.10.2017 15:47

      Мне кажется автор всё-таки TypeScript изобретает.


      1. sitev_ru Автор
        16.10.2017 15:52
        -3

        Почти. Даже если я изобретаю TypeScript, то в нынешних условиях это не изобретение велосипеда, а это обычное импортозамещение )


  1. staticlab
    16.10.2017 15:37

    либо не указываем, как в Javascript

    не указывать ключевое слово для объявления переменной и в JavaScript давно уже bad practice.


    mul();

    отлично, это объявление функции или её вызов? :)


    1. sitev_ru Автор
      16.10.2017 15:39
      -1

      конечно же вызов, объявление было бы так: mul() {}


      1. staticlab
        16.10.2017 15:40

        Тогда


        int sum();

        что такое?


        1. sitev_ru Автор
          16.10.2017 15:43

          В языке Cj это скорее всего будет ошибка. Но не факт. Всё пока только в зачаточном состоянии. В С++ это прототип функции. Нужен ли он в Cj? Пока не уверен.


          1. staticlab
            16.10.2017 15:46

            Так вы сами это в статье написали, а теперь говорите, что это возможно не нужно и возможно ошибка.


            1. sitev_ru Автор
              16.10.2017 15:55
              -1

              Ошибся в статье. Спасибо что внимательно её прочитали. Исправил.


              1. staticlab
                16.10.2017 15:59
                +1

                Так у вас и в спецификации ошибка:


                4.5. Вызов функции

                Для вызова в программе функции нужно указать её имя и круглые скобочки () и параметры, если они есть.

                тип имя ( параметры ) ;


                1. sitev_ru Автор
                  16.10.2017 16:17

                  Спасибо, исправил…


  1. Zenitchik
    16.10.2017 15:46

    Вы на Visual Basic никогда не писали? "auto" наводит на мысль, что Вы не в курсе, что такое вариантный тип.
    Логично было бы ввести тип Variant, и использовать аббревиатуру "var" )))


    1. sitev_ru Автор
      16.10.2017 16:19

      Нет, не писал, но писал на Дельфи/С++ билдере, там тоже есть Вариант. Пусть будет авто, чтобы не путаться. В идеале просто auto опускаем.


      1. staticlab
        16.10.2017 16:23

        В Delphi — Variant, в C++ Builder — Variant, в Visual Basic — Variant, в стандартном C++ — std::variant, в JavaScript — var (хоть это и от variable). Поэтому мы назовём auto, чтобы не путаться :)


        1. sitev_ru Автор
          16.10.2017 16:29
          -1

          В С++ есть auto. Если Вам так важно, я могу сделать для Вас лично var. В аналах истории будет записано, что некий staticlab уговорил разработчика языка добавить слово var! ))


          1. staticlab
            16.10.2017 16:31
            +1

            Вы понимаете различие между variant и auto?


            1. sitev_ru Автор
              16.10.2017 16:50

              Ну как бы да, понимаю. И что?


              1. staticlab
                16.10.2017 16:53

                А мне кажется, что не понимаете.


                a = "Hello ";
                b = "World";
                x = a + b;
                c = 1;
                d = 2;
                x = c + d;

                У вас это должно транспилироваться в какой код на JS, Java и C++?


                1. sitev_ru Автор
                  16.10.2017 16:58

                  Да, я понял, правда не сразу)) Я думал, в языке Cj задать, что в этом случае переопределять тип переменной будет запрещено. Возможно, ввести тип variant. А Вы что предлагаете?


                  1. staticlab
                    16.10.2017 17:02

                    Использование variant для строго типизированных языков будет менее эффективно, чем нативная реализация.


              1. mwizard
                16.10.2017 16:54

                И в чем она заключается, раз понимаете?


                1. sitev_ru Автор
                  16.10.2017 18:10

      1. Serge78rus
        16.10.2017 16:38

        Простите, но auto и variant — очень разные понятия. Тип auto говорит о том, что тип будет выведен автоматически на этапе компиляции. Тип, содержащийся в variant, определяется в процессе выполнения.


        1. sitev_ru Автор
          16.10.2017 16:55

          Понятно, что будет много подводных камней. Как быть, я хочу генерировать и в Javascript и в C++. В случае Javascript, это Variant, в случае C++ это auto. Как быть я пока не знаю. Но, в принципе, простые примерчики работать будут)


          1. Serge78rus
            16.10.2017 17:37

            Вы понимаете разницу между статической и динамической типизацией?


            1. sitev_ru Автор
              16.10.2017 17:47

              Если в языке Cj переменная типа auto, то это статическая типизация и менять тип переменной будет ошибкой. Если задать тип вариант — это будет динамической типизацией. В этом случае, менять тип по хочу выполнения программы будет возможно. Если мы опускаем тип, то в Cj планировал сделать, как будто это auto, то есть статическая типизация.


  1. MamontsevDS
    16.10.2017 15:56

    А почему вы трансляцию называете компиляцией?


    1. sitev_ru Автор
      16.10.2017 16:05
      -1

      Что же ответить. Вы абсолютно правы. Но когда писал статью, показалось, что компилятор написать покруче будет. Теперь буду использовать всё-таки слово транслятор. До написания компилятора ой как далеко!


      1. staticlab
        16.10.2017 16:19

        Напишу свой лексер, парсер и т.д… Мне так интереснее, и в добавок, на выходе получим свой простенький аналог LLVM!

        Я вас расстрою, но LLVM — это не лексер и не парсер.


        1. sitev_ru Автор
          16.10.2017 16:30
          -1

          Что LLVM не включает в себя лексер и парсер?


          1. staticlab
            16.10.2017 16:35

            Не включает в себя лексер и парсер исходного языка.


            1. sitev_ru Автор
              16.10.2017 16:37

              Я сожалению или к счастью я не стал разбираться с LLVM, мой подход показался мне ближе…


    1. sitev_ru Автор
      16.10.2017 18:57
      -1

      Из википедии: Kotlin (Ко?тлин) — статически типизированный язык программирования, работающий поверх JVM и разрабатываемый компанией JetBrains. Компилируется также в JavaScript
      Почему тут называют компиляцией в Javascript, а мне нельзя? ))


  1. Shtucer
    16.10.2017 16:21

    А вот что получается на Javascript:

    function my_func1(var p) {


    Это в каком JavaScript такое валидно? А то у меня получается "Uncaught SyntaxError: Unexpected token var"


    1. sitev_ru Автор
      16.10.2017 16:42
      -2

      Оперативно подкорректировал Cj github.com/sitev/cj/commit/fd559123ff13d2a528a3d644b9281ef7a91902e7
      Теперь нет там var. Я даже не проверил работу Javascript, спасибо за замечание.


      1. Shtucer
        16.10.2017 16:46
        +1

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


        1. sitev_ru Автор
          16.10.2017 17:00

          Это как с английским, пишу на Javascript со словарём! )


          1. staticlab
            16.10.2017 17:06

            Напомню полную советскую градацию:


            • не владею;
            • читаю и перевожу со словарём;
            • читаю и могу изъясняться;
            • свободно владею.

            То есть языки знаю на троечку, но зачем их учить, лучше я свой придумаю!


            1. sitev_ru Автор
              16.10.2017 17:57
              -4

              Зачем придумали Typescript? Да потому что Javascript полный отстой. Что там учить? Там всё просто!


              1. MamontsevDS
                17.10.2017 07:12

                Вроде взрослый человек, а мыслите как подросток, считающий, что он все знает лучше остальных.


                1. sitev_ru Автор
                  17.10.2017 08:39
                  -2

                  Почему у Вас карма отрицательная и нет ни одной публикации?


                  1. ZZahar
                    17.10.2017 09:40

                    А вы не думали, что карма и публикации это не единственный показатель?


                    1. sitev_ru Автор
                      17.10.2017 09:41
                      -1

                      Показатель чего? Не знал, что на Хабре можно зарегиться без публикации какой-нибудь статьи. Я не смог)


                      1. Zenitchik
                        17.10.2017 16:04

                        С некоторых пор можно, и это палка о двух концах...


      1. staticlab
        16.10.2017 16:50

        А теперь ещё проверьте, компилируется ли ваш исходный код из Гитхаба. Где взять core.lib и lang.lib? И вроде пилите убийцу всех языков современности, а сами пишете некроссплатформенный код под винду / MSVC.


        1. sitev_ru Автор
          16.10.2017 17:04

          вот они: github.com/sitev/core, github.com/sitev/lang

          У меня такой подход, я пишу на Microsoft Visual Studio, но в итоге получается всё кроссплатформенно. Например, сайт sitev.ru работает на своём вебсервере и своёй CMS на плюсах. Они разработаны по тойже технологии. Всё что сейчас не работает, я исправлю, не дошли руки протестировать в линуксе.


          1. farcaller
            16.10.2017 18:44

            Например, сайт sitev.ru работает на своём вебсервере и своёй CMS на плюсах

            У вас там адъ в разметке из стилей


            1. sitev_ru Автор
              16.10.2017 19:34

              Я могу цеплять разные шаблоны к сайту. Сейчас стоит этот: adminlte.io/themes/AdminLTE/index2.html


              1. farcaller
                16.10.2017 19:36

                image


                так понятно?


                1. sitev_ru Автор
                  16.10.2017 19:48

                  Упс. Спасибо, починю на днях…


          1. Zenitchik
            16.10.2017 18:47

            Microsoft Visual Studio

            Т.е. ещё и .NET???


            1. sitev_ru Автор
              16.10.2017 19:42

              В студии, но на чистом С++ и без всяких .NET ))


  1. yarric
    16.10.2017 16:42

    А теперь запилите компиляцию в нативный код.


    1. sitev_ru Автор
      16.10.2017 17:05

      Пока запил в Javascript. Он нативный для браузера.


      1. yarric
        16.10.2017 19:51

        Нуу, так C++ не потеснишь… Трансляторы в JS сейчас только ленивый не пишет.


        1. sitev_ru Автор
          16.10.2017 20:15

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


          1. vintage
            16.10.2017 22:47

            Сомневаюсь, что вы найдёте единомышленников в разработке языка под вас. Но если будут интересные идеи касательно языков — пишите нам в телеграм чат: https://t.me/lang_idioms


  1. JegernOUTT
    16.10.2017 16:44

    Вы бы лучше не торопились. Постепенно прочитали бы книжку , познакомились бы с исходным кодом компиляторов крупных языков (к примеру если нравятся плюсы, то gcc, clang). Попробовали бы поконтрибьютить (исправить парочку багов, добавить функциональность...).
    Сейчас же ваше творчество выглядит обычным троллингом, никакого серьёзного фидбэка от этого ожидать не стоит. И лучше вообще удалить статью, чтобы рейтинг и карму не слили ещё больше


    1. sitev_ru Автор
      16.10.2017 17:13
      -1

      Моя цель — написать свой язык и на нём делать различные проекты. А карма или рейтинги на хабре? Я недавно написал вопрос на тостере toster.ru/q/464824. Поплакался. Так это вызвало бурю советов, кучу подписавшихся, добавили много очков к рейтингу. Надо писать, что всё плохо и тогда будет счастье)


      1. andreymal
        16.10.2017 17:16

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


        1. sitev_ru Автор
          16.10.2017 17:59

          Тут просто выкладывают какие-то переводы и это нормально. А если что-то сам написал, то нельзя показывать. Не беспокойтесь. Я ещё планирую не одну статейку по Cj здесь опубликовать. Естественно, уровень языка будет намного выше)


  1. SerafimArts
    16.10.2017 16:56

    Предлагаю автору:
    1) Ознакомиться с этим докладом: https://www.youtube.com/watch?v=HE4yyPpUsy4 обещаю, будет очень интересно и познавательно.


    2) Прочитать про BNF/EBNF и взяться, например за ANTLR. В результате декларация функции, включая токены и грамматику превращается примерно вот в такую схему (на псевдоязыке, похожем на ANTLR).


    Декларация, которая позволяет избавиться от процентов ~80% вашего кода
    %skip T_WHITESPACE [\xfe\xff|\x20|\x09|\x0a|\x0d]+
    
    %token T_WORD [_A-Za-z][_0-9A-Za-z]*
    %token T_ANY .*?
    
    Document
        : Function()?
        | // и переменные
    
    Type
        : "int"
        | "auto"
    
    FunctionDefinition
        : Type()? (T_WORD #FunctionName) 
        "("
            // тут должны быть аргументы
        ")"
        "{"
           // тут должно быть тело
         "}"
    
    VariableDefinition
        : Type()? (
            T_WORD #VariableName
        )  "=" (
            T_ANY #VariableValue
        )
    
    FunctionInvocation
        : (T_WORD #FunctionName) "("
             // тут должны быть аргументы
        ")" (";")?


    1. SerafimArts
      16.10.2017 17:07

      Ах, да. Ребят, если вы читаете этот коммент, то: Понятно же, что парню лет 12-14, судя по лексикону и манере выражаться. Сам таким был, и наверняка себя вспомните. Так что не надо прям так наезжать. Понятно, что глупость, но на корню резать инициативу, ну блин. Добрее надо быть =)

      sitev_ru а тебе посоветую:
      1) Для начала спрашивать на эту тему у шарящих людей. Не бежать накатывать статьи, которые не несут почти никакой смысловой нагрузки.
      1.2) Если таких людей нет под рукой, то хотя бы на тостере.
      2) Статья хоть и глупая и отхватил уже за неё минусов, но не думаю что прям сейчас надо бежать и закрывать её. Оставь до завтра. Раз уж получил по макушке, то почитай хотя бы комменты, не глупые люди пишут. Получишь хоть какие-то отзывы. Подумаешь, осмыслишь, сбросишь карму (тут можно делать один резет) и попробуешь сначала, с работой над ошибками.


      1. sitev_ru Автор
        16.10.2017 17:16
        +1

        Ну какие 12-14 лет? Я ещё писал на 4-х цветных БК-0010 =)


        1. sitev_ru Автор
          16.10.2017 17:22

          Это как раз было в 12-14 лет )))


          1. SerafimArts
            16.10.2017 17:34

            А, ну кто ж знал. Я судил по манере оформления статьи и качеству подготовки материала. У всех бывают ошибки =)


            1. sitev_ru Автор
              16.10.2017 18:01
              -1

              Это хитрый манёвр, возможно школьники хотя бы заинтересуются этой идеей? )


              1. SerafimArts
                16.10.2017 18:08

                Разве вы не считаете, что их стоит учить более простым, удобным и правильным подходам? А не, простите, отсебятине.

                Я, конечно, понимаю, что такой способ реализации тоже имеет место быть, но способ проектирования дизайна языка — крайне плачевный. Просто посмотрите видюшку, что я кинул выше и поймёте почему я именно так выразился.


                1. sitev_ru Автор
                  16.10.2017 18:21

                  Никого не хочу учить. Просто хотел поделиться мыслями и увидеть реакцию. Вот, например, теперь посмотрю Ваше очень полезное видео!


    1. sitev_ru Автор
      16.10.2017 17:21

      Ну не могу же я всё бросить на полпути? Развернуться и идти по этому пути. Мне мой путь кажется простым и понятным. Но, обязательно, изучу этот материал. Спасибо!


      1. lair
        16.10.2017 17:31

        Sunken cost fallacy.


      1. zagayevskiy
        16.10.2017 19:19

        На каком полпути? о_О


    1. KvanTTT
      16.10.2017 19:06

      На ANTLR даже чище получится:


      Грамматика
      grammar Cj;
      
      document
          : ( functionDeclaration
            | variableDeclaraction
              /* etc. */)* EOF
          ;
      
      functionDeclaration
          : type? functionName=ID '(' /* arguments */ ')'
            '{' /* body */ '}'
          ;
      
      variableDeclaraction
          : type? varName=ID '=' varValue=any
          ;
      
      functionInvocation
          : functionName=ID '(' /* arguments */ ')' ';'?
          ;
      
      type
          : 'int'
          | 'auto'
          ;
      
      any
          : ANY+
          ;
      
      WHITESPACE: [ \t\r\n]+ -> channel(HIDDEN);
      INT:        'int';
      AUTO:       'auto';
      ID:         [_A-Za-z][_A-Za-z0-9]*;
      ANY:        .;


      1. sitev_ru Автор
        16.10.2017 20:07

        Я когда рисовал диаграммы Вирта, смотрел РБНФ и подумал: может ли возникнуть такая ситуация, что у этого языка не хватит функционала? Не смог ответить на этот вопрос))


        1. KvanTTT
          16.10.2017 23:06

          Ну так грамматики более лаконичные, чем диаграммы. К тому же это текстовый формат. Просто вы не сталкивались с парсером настоящих больших языков.


          По сути ваша спецификация и есть грамматика. Только почему-то там все по-русски.


          1. sitev_ru Автор
            17.10.2017 05:49
            -1

            РБНФ лучше, чем диаграммы Вирта?


    1. yarric
      16.10.2017 19:54

      Ну такое… Парсер рекурсивного спуска как-то получше выглядит.


      1. KvanTTT
        16.10.2017 22:52

        Для леворекурсивных правил это точно не так.


        1. sitev_ru Автор
          17.10.2017 05:40
          -1

          Я не специалист по парсерам. Я какой-го типа парсер написал, если не секрет? )


  1. dreka5
    16.10.2017 17:05

    я бы посоветовал пропарсить вложенную лямбду с замыканием. уххх!!! та ещё прелесть.
    как Cj справиться с этим.

    без этого новый язык в наших реалях безсмысленно проектировать.
    Он сразу проиграет котлину/расту и прочему


    1. sitev_ru Автор
      16.10.2017 17:07

      Нужно придумать какое-то универсальное решение по лямбдам и замыканиям. Пока не дошёл до них…


  1. scoffer-by
    16.10.2017 18:02
    -3

    Есть еще романтики в этом стаде велосипедофобов.
    Автору успехов! Ну и грамотешки маленько.
    Но карму в этой хабродемократии школоты попортят изрядно.


  1. sitev_ru Автор
    16.10.2017 18:03
    -1

    Автору успехов!
    Большое спасибо!


  1. NeoCode
    16.10.2017 20:09

    Объявлять переменные просто так, без предваряющего ключевого слова (или хотя-бы типа) — ИМХО не очень хорошо, потенциальный источник ошибок. В Go например применили специальный оператор :=, который можно использовать ТОЛЬКО для объявления с инициализацией, но не для присваивания, за счет чего случайно объявить переменную (по причине опечатки в имени другой переменной) уже невозможно — только намеренно.


    1. sitev_ru Автор
      16.10.2017 20:21

      От символа := меня бросает в дрожь, вспоминаю паскаль)


  1. kahi4
    16.10.2017 20:25
    +1

    Ну что вы начинаете то сразу "зачем писать свой язык, кому он нужен?". Ну хочется человеку, пусть пишет. Я вон тоже хочу "написать" (вообще язык эм ему разрабатывают спецификацию, а пишут тулчеин для него, но не суть. Это как "написать математику") свой язык, потом свою книгу и все такое, только erlang уже изобрели, а жаль.


    Направим на путь истинный конструктивными вопросами. Пойдем по спецификации (боже, там текста на одну страницу, а уже куча косяков):


    Идентификатор ... но не может начинаться с цифры.

    Отличный вопрос появился для собеседования: а почему так сделано?
    По поводу спецификации — а длина идентификатора чем-то ограничена или может быть произвольной? А регистрозависимость? Взяли бы просто абзац со спецификации C++ и все. Еще было бы неплохо список зарезервированных слов сюда включить.


    void — специальный тип для пустых значений
    bool — булевый (логический) тип данных
    целочисленные типы: знаковые byte (1 байт), short (2 байт), int (4 байт), long (8 байт) и соответствующие им беззнаковые ubyte, ushort, uint, ulong
    числа с плавающей точкой: float, double, real
    char - символьный (знаковый) тип данных.

    Чем double от real отличается? Как вы в js, например, беззнаковые числа реализуете (понятно что через number, я имею ввиду, например, попытку присвоить отрицательное значение в рантайме. К слову, относительно всех остальных типов — как реализуете переполнение? Если я объявлю ubyte i = 255; потом ++i что произойдет? Должно стать 0 или хотя бы бросить исключение, или что там у вас для этого будет. Прерывание! Во, крутая идея, сделайте вместо исключений единственный язык, работающий на прерываниях)? Где null потеряли? И вообще указатели. В js есть и null и undefined, вы оба их сделаете void? 2 байтА, а не 2 байт. Функциональный тип есть? Без него трудненько. А строки? А, окей, типа во второй редакции с массивами появятся и строки как массив char, так?


    Для использование переменной в программе нужно просто указать её имя.

    Идентификатор.


    1. Функция

    Эм. Функции — это тип или не очень? А что касается области видимости внутри (и во вне) функции? А можно объявлять одну функцию в другой? А необязательные параметры? Вообще, они все обязательные или как?


    Операции
    Данная версия Cj поддерживает ограниченный набор операций

    Ух! Погнали. В js (во что вы собрались компилировать) если написать 6 / 4 закономерно получишь 1.5. Во что скомпилируется конструкция


    int x;
    int y;
    x = 6;
    y = 4;
    return x / y;

    Результат должен быть 1. Удачи.


    P.S. Зачем я все это пишу вообще? Я буду удивлен, если выйдет хотя бы версия 0.2. А текущая версия даже на версию не годится, это как-то все само подразумевается, а вы умудрились в совсем уж очевидных вещах накосячить и сделать свой язык принципиально не соответствующий поставленной цели:


    Меня всегда интересовали различные направления и веб я хочу сбацать и мобайл и десктоп и что-нибудь серверное готов написать, ещё мне интересены ИИ, игры, роботы, криптовалюты… И при этом, хотелось бы всё это писать на одном языке).


    1. kahi4
      16.10.2017 20:31
      +1

      Меня всегда интересовали различные направления и веб я хочу сбацать и мобайл и десктоп и что-нибудь серверное готов написать, ещё мне интересены ИИ, игры, роботы, криптовалюты… И при этом, хотелось бы всё это писать на одном языке).

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


    1. sitev_ru Автор
      16.10.2017 21:06
      -1

      Отлично, спасибо за конструктивный комментарий! Чем double от real отличается? Ещё не знаю, скопировал из языка Д, видимо real больше double. Да, с делением проблема, конечно). Ну а так — версия 0.1 — это просто пробный шаг. Теперь я беру спецификацию, что-то добавляю к языку, что-то корректирую — это версия 0.2, реализую в коде, потом 0.3 и т.д., ну как обычно…


      1. SerafimArts
        16.10.2017 21:38

        Обычно, вначале пишутся спецификации языка, вроде таких: https://www.ecma-international.org/ecma-262/8.0/index.html, а потом реализуется язык. Единственным исключением, на моей памяти, у которого спецификация появилась после реализации — был PHP.


      1. lair
        16.10.2017 22:02

        Чем double от real отличается? Ещё не знаю

        А зачем тогда?


      1. kez
        16.10.2017 23:11

        потом 0.3 и т.д., ну как обычно…

        Заголовок спойлера

        image


    1. andreymal
      17.10.2017 01:28

      Ну хочется человеку, пусть пишет.

      Конечно пусть, только писать про это хабрапосты совсем не обязательно :) У меня тоже есть маленький самопальный язык с самопальной компиляцией (трансляцией?) в самопальный байткод с его самопальной интерпретацией, и всё это трудится на моём маленьком продакшене как простенькая числодробилка, но бежать писать посты про это я не собираюсь, там всё равно ничего интересного или уникального)


      1. sitev_ru Автор
        17.10.2017 06:26
        -1

        Конечно пусть, только писать про это хабрапосты совсем не обязательно :)

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


        1. kahi4
          17.10.2017 08:25
          +1

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


          Идея писать системный код так же легко как на js — хороша. Да, компилируемый js-подобный язык, здорово. Я прям заинтригован. Даже слушаю внимательно, а то rust что-то не заходит, а вот C++, только с прототипами, утиной типизацией и синтаксисом js (ts) ммм [/sarcasm]. И я у вас не видел даже намека и планов на работу с памятью, а было бы интересно почитать, а без этого системное программирование не очень.


          А пока что у вас получается только переизобрести typescript, только который ничего не умеет.


          В общем — ссылку на компилятор в байт-код (или транслятор в C/C++, если так хочется), тогда поговорим. Либо сформулируйте цель языка иначе. Например "не нравится в какую сторону развивается typescript, нельзя писать public get и private set на одно поле одновременно, тупо же".


          1. sitev_ru Автор
            17.10.2017 08:57
            -1

            Как ни странно, книга драконов не дала чёткое понимание, ответ нашёл в Википедии)).

            Задача сложная. Можно бесконечно рассуждать как лучше сделать. Я примерно вижу направление, сделал в этом направлении первый шажок. Теперь осматриваюсь, что дальше, куда дальше двигаться… Можно сесть, всё проанализировать, проработать на начальном этапе. Но боюсь после этого мне не захочется ничего делать, поняв сложность задуманного. Поэтому действую по интуиции, двигаюсь, в правильном, как я думаю, направлении и решаю проблемы по мере поступления.



          1. sitev_ru Автор
            17.10.2017 09:24
            -1

            Идея писать системный код так же легко как на js — хороша. Да, компилируемый js-подобный язык, здорово. Я прям заинтригован.
            . Давайте с вами развивать эту тему? Поясните, как Вы это себе представляете.


  1. Roumed1
    17.10.2017 12:48

    Идею личной пробы одобряю, но как и многие до меня призову Вас задуматься, как сделать так, чтобы постфактум на этом проекте не появилась жирная надпись «ПОТРАЧЕНОе даром время».


    1. sitev_ru Автор
      17.10.2017 13:00
      -2

      Спасибо. Но смущает, что другому автору статьи вы написали коммент получше: «Вашей смелости и амбициозности остается только позавидовать.» ))


  1. oYASo
    17.10.2017 14:31
    +2

    Я сначала хотел написал что-то в духе «чем бы только не занимались, лишь бы к сессии не готовиться», но пролистал тред и понял, что у автор все-таки довольно большой опыт в разработке. Так что это не максимализм студента или какая-то шутка.

    Разработка нового языка программирования — задача крайне сложная. В нынешнее время лезть в это направление без PhD в Computer Science от университета уровня MTI практически бесполезно. Лезть в это дело без отличной команды разработчиков-инженеров, коллег из области Computer Science и серьезного бюджета — 99.999% гарантия потраченного времени. Те, кто написали хоть сколько-нибудь популярные языки, имели уже большой опыт и бэкграуд. Например, TypeScript, на который похож тот язык, что разрабатываете вы, сделал Андерс Хейлсберг из Microsoft, создавший перед этим Turbo Pascal, Delphi, C#, J++ и участвующий в разработке MFC. Язык D изобрел Александреску — идол шаблонной магии в мире C++, имеет огромный бэкграуд в этом языке и знал, зачем нужен D (ну и поддержка Facebook, конечно). Новый модный Rust пишут уже 11 лет с поддержкой Mozilla Research, используя бэкэндом LLVM (от которого вы очень лихо отказались).

    Судя по вашему подходу к разработке (тотальное нежелание разбираться в инструментах, которые призваны упрощать разработку новый языков; нежелание оформить proposal зачем это все вообще нужно и т.д.), лично я делаю вывод, что это исключительное велосипедирования ради велосипедирвания. Без четкого объяснение, какие проблемы должен решить новый язык, ни пользователей, ни разработчиков вы не получите. Если это трансляция из чего-то в чего-то, то этого уже навалом (Emscripten и т.д.).

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


    1. sitev_ru Автор
      17.10.2017 15:23
      -1

      Судя по вашему подходу к разработке (тотальное нежелание разбираться в инструментах, которые призваны упрощать разработку новый языков

      Зачем мне изучать чужое, если я написал своё и оно уже работает?

      нежелание оформить proposal зачем это все вообще нужно и т.д

      Я потратил несколько часов на ответы на комментарии, если это не прояснило ситуацию, ну извините…


      1. lair
        17.10.2017 15:27
        +1

        Зачем мне изучать чужое, если я написал своё и оно уже работает?

        Разве работает? Последний раз когда смотрели, ничего толком не работало.


        1. sitev_ru Автор
          17.10.2017 18:13
          -1

          Пришлось снять разработку на Cj и выложить в интернет )))))))
          youtu.be/zwUhDOVifdw


          1. lair
            17.10.2017 18:28

            Вам рассказать, как такое сделать на string.Replace? Вот когда у вас будет хотя бы минимальный работающий код на выходе (т.е., тот, который можно запустить и увидеть результат), и хотя бы для двух языков — тогда и поговорим. Начните с банального вывода в консоль.


            1. sitev_ru Автор
              17.10.2017 20:02

              Но если разобраться, то внутри явно не string.Replace, а работает лексер, парсер и генератор… ладно, проехали… сейчас план такой:

              1. Добавлю операторы условия и цикла (а то уж совсем)
              2. Добавлю возможность подключать внешние функции, типа вывод в консоль
              3. Делаю и для js и для с++

              Ну и тогда опять сюда, получать очередную порцию полезной критики))


              1. lair
                17.10.2017 20:46

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


                1. sitev_ru Автор
                  17.10.2017 21:03

                  Ну что там может не хватать? Это же не какая-то левая библиотека, это же не какой-то чёрный ящик, я сам писал, и я уверен в нём, если надо допишу, переделаю, всё норм


                  1. lair
                    17.10.2017 21:07

                    Интерфейсы, вообще вся ООП-машинерия, лямбды, паттерн-матчинг, обработка ошибок...


                    (это вот если не задумываться)


                  1. lair
                    17.10.2017 21:20

                    Ohwait, какая ООП-машинерия, у вас же чисто процедурный язык (если по спеке судить).


      1. oYASo
        17.10.2017 19:14

        Зачем мне изучать чужое, если я написал своё и оно уже работает?

        Без комментариев.


      1. kahi4
        17.10.2017 21:45

        Ну на мои вопросы вы так и не ответили. Покажите во что превратится следующий код:


        int x = 6;
        int y = 4;
        int z = x / y;
        print(z);

        В z обязана лежать единица, такая уж она целочисленная арифметика, с этим ничего не поделаешь. В недоверсии 0.1 вы написали эм ничего. Абсолютно ничего, вы не поддерживаете свой же синтаксис, да и не представляете [вероятно, но есть основания так пологать] как это реализовать. Знаете, на этом этапе рано еще о компиляторе говорить, хотя бы рантайм на js опишите.


        Напишите хотя бы (желательно до завтра, а то я тут немного улетаю, а уж очень хочется посмотреть) даже не компилятор, а просто рантайм, в котором мой пример будет корректно работать. Ну и добавьте на скорую руку глобальную функцию print(), который будет превращаться в console.log на js.


        Хотя бы словами в комментариях на хабре, хорошо, без кода. Вперед, я жду. Думаю, тут всем будет интересно.


        Ну и да, главный вопрос — что вы хотите от своего языка, какая его ниша? Я так и не понял. Универсальный язык, который умеет и в веб, и в системное программирование? Правильно?


        Код функции malloc на вашем языке и чем оно станет при компиляции в js и в C в студию.


        1. sitev_ru Автор
          17.10.2017 22:28
          -1

          В z обязана лежать единица… да и не представляете как это реализовать

          x = 6;
          y = 4;
          z = Math.floor(x / y);


          и добавьте на скорую руку глобальную функцию print(), который будет превращаться в console.log на js.

          У меня есть, конечно же, мысли, как это сделать, но пока не уверен на 100% (выкладывать пока не буду — обжёгся), как лучше… Выслушаю вашу точку зрения

          Ну и да, главный вопрос — что вы хотите от своего языка, какая его ниша?

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

          Код функции malloc на вашем языке

          Пока такой функции не будет. Что дальше, я не знаю. В 2017 году вроде можно обойтись без неё. Если нужно, будет обходной вариант. Язык же предполагается невероятно гибким! ))


          1. kahi4
            18.10.2017 00:14

            int x = -6;
            int y = 4;
            int z = x / y;

            Вместо каждой операции деления будете подставлять код с ветвлением? Ну ок.
            Задачка посложнее


            float x = 1.0 / 3.0;
            double y = 1.0 / 3.0;
            double z = y - x;

            Ответ: -0.000000009934107


            Код на C
            #include<stdio.h>
            
            int main() {
               float x= 1.0f / 3.0f;
               double y = 1.0 / 3.0;
               double z = y - x;
               printf("%.15f", z);
            }


            1. sitev_ru Автор
              18.10.2017 06:03

              Вместо каждой операции деления будете подставлять код с ветвлением?

              Совершенно не так. Если присваиваю переменную, а она в Cj целая, то тогда подставляю Math.floor().

              x = 1.0 / 3.0;
              y = 1.0 / 3.0;
              z = y - x;
              console.log(z);

              Вот такой код получится на Javascript. Результат = 0, отличается от -0.000000009934107. Казалось бы это уже проблема. Но согласитесь, и наш мир не совершенен. Но в концепции языка Cj, как ни странно, это нормально. Я не собираюсь на Javascript заниматься точными математическими расчётами. Хотя, на такой случай, возможно, есть какие-то библиотеки на Javascript. Плюсы языка, если вдуматься, намного перевешивают такие минусы.

              Предлагаю назвать это парадоксом kahi4.


              1. kahi4
                18.10.2017 09:12
                +1

                Спасибо за такую честь, но пожалуй не стоит объяснять криворукость парадоксами.


                Math.floor не подойдет, потому что при отрицательных числах должен быть Math.ceil, ну и я молчу про то, что тогда может оказаться большой (и критичной, если идет речь про расчеты индекса в массиве) накапливающаяся ошибка в рассчетах, длинее чем 1 оператор. ( 6 / 4 ) * 200 например.


                Про float — спасибо, в топку язык, код на котором ведет не консиснтентно. А так хорошо звучало, хотите язык для написания криптовалют, там неплохо было бы работать под видеокартой, GPGPU на языке, близком по стилю к js — здорово же, да еще с возможностью отладить это прямо в браузере.


                Хотя, на такой случай, возможно, есть какие-то библиотеки на Javascript.

                Ради простого умножения двух float друг на друга тянуть библиотеку на js?


                В общем вам тут хотят помочь понять почему нужно делать так или иначе, а вы еще не придумав операций сравнения умудряетесь всунуть в язык костыли, причем не имея под этим никакой необъодимости а просто потому что.


                1. mwizard
                  18.10.2017 19:40
                  +1

                  Ваши загадки на JS, кстати, решаются следующим образом (спасибо спецификации asm.js):


                  const x = -6;
                  const y = 4;
                  const z = x / y | 0;  // -1

                  const F = Math.fround;
                  const x = F(F(1.0) / F(3.0));
                  const y = 1.0 / 3.0;
                  const z = y - x;  // -9.934107481068821e-9

                  А вот задор автора энтой поделки заставляет вспомнить про эффект Даннинга-Крюгера — вопиющая некомпетентность не позволяет ему осознать очевидные проблемы.


                  1. sitev_ru Автор
                    18.10.2017 21:23

                    Да, спасибо, я в Javascript не силён, тем более его тонкости математики, знаю Javascript на уровне вызова из него JQuery )). Специализируюсь на другом. Я и в компиляторах не специализируюсь, но пишу: глаза бояться — руки делают, разберусь…
                    По-первому примеру думал так сделать: var z = x / y ^ 0;
                    За 2-ой пример, конечно, спасибо… Сильно!

                    На самом деле, эти тонкости на текущем этапе безразличны. Но на будущее, конечно, большое спасибо! Очень интересно!

                    вопиющая некомпетентность не позволяет ему осознать очевидные проблемы
                    Ещё раз повторюсь, что на javascript не специализируюсь. Эти очевидные проблемы на 1-ом этапе на мою задачу никак не повлияют


                    1. lair
                      19.10.2017 01:05

                      Да, спасибо, я в Javascript не силён, тем более его тонкости математики, знаю Javascript на уровне вызова из него JQuery )). Специализируюсь на другом.

                      А в чем вы сильны/специализируетесь?


                    1. mwizard
                      19.10.2017 07:52
                      +2

                      А я и не про JS. Ваша некомпетентность не ограничена такими скромными границами, она всеобъемлюща.


                  1. kahi4
                    18.10.2017 22:52

                    Первое — тоже самое, что просто использовать ParseInt.


                    Про асм не подумал, верно подметили. Правда safari не поддерживает его, как и ie11.


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


                    byte x = 127;
                    byte y = x + 10;
                    // y = -119

                    Мой вариант
                    const x = 121;
                    const y = 10;
                    const z = (zt = x + y, zt > 127 ? zt - 256 : zt);

                    Кто короче?


                    Хм, я.


                    const z = Int8Array.of(x + y)[0];


                    1. mwizard
                      19.10.2017 08:10

                      Боюсь, что короче, чем Int8Array.of, уже не сделаешь, давайте следующую загадку.


                      1. vintage
                        19.10.2017 10:58
                        +1

                        const z = (x+y+384)%256-128


                  1. kahi4
                    18.10.2017 23:21

                    А вообще я уже вижу рантайм этого языка:


                    • при запуске выделяется UInt8Array размера под статические переменные, а каждая переменная транслируется в структуру:
                      {
                      name, type, pointer
                      }

                    Маллок просто расширяет этот массив на заданное количество байт, а так же возвращает указатель. Мемфри — ну понятно, по аналогии. Можно даже реализовать unsafe code и дать прямой доступ к указателям! Код с прямым доступом к указателям, который компилируется в байткод под виртуалную машину на js! Не круто ли? Не этого ли мы хотели?


                    1. mwizard
                      19.10.2017 07:51
                      +1

                      кхе кхе asm.js кхе кхе webassembly кхе кхе


          1. kahi4
            18.10.2017 00:25
            +1

            В 2017 году вроде можно обойтись без неё.

            Хоть в 2050 году эта функция будет нужна. Хорошо, можно обойтись без нее, тогда приведите модель работы с памятью вашего языка. Например, где вообще создаются переменные? В куче? В стеке? Как получится? А динамически выделяемая память? Ах да, вы язык разрабатываете, вам не до таких мелочей, когда понадобится, тогда и подумаем. Хорошо самолеты делают не так, а то шасси бы разрабатывали когда самолет уже в воздухе и пора садиться.


            Если вы не собираетесь использовать этот язык как системный, то никаких преимуществ перед js, Kotlin, Python, PHP, C#, Java, [любой другой язык прикладного уровня] вы не показали, а синтаксис пока что вы предлагаете несостоятельный. (А если собираетесь, то еще и перед Rust, D, да даже плюсы). В чем тогда идея?


            1. sitev_ru Автор
              18.10.2017 09:07
              -2

              Хоть в 2050 году эта функция будет нужна.

              В Javascript не нужна, да и в С++ от неё отказались

              Хорошо, можно обойтись без нее, тогда приведите модель работы с памятью вашего языка. Например, где вообще создаются переменные? В куче? В стеке? Как получится? А динамически выделяемая память?

              Пока предполагаются только динамические массивы: sitev.ru/post/174

              Ах да, вы язык разрабатываете, вам не до таких мелочей, когда понадобится, тогда и подумаем. Хорошо самолеты делают не так, а то шасси бы разрабатывали когда самолет уже в воздухе и пора садиться.
              Совершенно верно, это не самолёт, это программа. В этой задаче я не работаю на дяденьку, а пишут в своё удовольствие. Если нет полного описания, значит я так решил или пока не продумал до мелочей как будет и это правильно!

              Если вы не собираетесь использовать этот язык как системный
              Конечно, собираюсь!

              то никаких преимуществ перед js, Kotlin, Python, PHP, C#, Java, [любой другой язык прикладного уровня] вы не показали, а синтаксис пока что вы предлагаете несостоятельный. (А если собираетесь, то еще и перед Rust, D, да даже плюсы).
              Синтаксис более минималистический, более чистый. Преимущества есть, но очевидны, если понять идею того, что я делаю.

              В чем тогда идея?
              Вроде распинался несколько часов, или уже даже дней, отвечал на комментарии, а вы всё не смогли понять идею. Странно. Идея такая: пишу на Cj и генерирую в Javascript или С++ или любой другой язык и поэтому я могу выполнить любую задачу заказчика на одном и том же языке программирования!

              Теперь понятна идея? Разве это не круто? ))


              1. lair
                18.10.2017 09:29
                +1

                У вас "более чистый синтаксис" только потому, что вы ничего не поддерживаете.


                Чтобы выполнить "любую задачу", языка недостаточно.


              1. lair
                18.10.2017 11:15
                +2

                О, динамические массивы!


                identifier [ ] ;

                … а какого он типа-то? Можно сделать так?


                array[];
                ar[0] = 5;
                ar[1] = "str";

                Как определяется длина массива?


                array[];
                array[0] = 1; //так, наверное, можно
                array[1] = 2; //так, наверное, тоже
                array[3] = 4; //а так?
                x = array[2]; //чему равен x?
                x = array[4]; //а теперь?


                1. sitev_ru Автор
                  18.10.2017 11:36

                  Интересные замечания. А ещё спрашивают, зачем я на Хабр обратился).
                  Тип можно задать так:

                  int a[];

                  Как определяется длина массива?
                  array[];
                  array[0] = 1; //так, наверное, можно
                  array[1] = 2; //так, наверное, тоже
                  array[3] = 4; //а так?
                  x = array[2]; //чему равен x?
                  x = array[4]; //а теперь?


                  1. lair
                    18.10.2017 11:37
                    +1

                    Интересные замечания. А ещё спрашивают, зачем я на Хабр обратился

                    Эти замечания очевидны любому, кто хоть сколько-то писал на разумных языках. Если вам они не очевидны, вам надо не на Хабр, а в учебник.


                    Тип можно задать так:

                    А если не задать, то что будет?


                    Как определяется длина массива?

                    Так что с длиной-то?


              1. kahi4
                18.10.2017 11:38
                +2

                Вы знаете что такое язык программирования системного уровня?


                У вас есть только микроконтроллер, нет никакой ОС, любезно предоставляющей вам функцию выделения памяти.


                Я пишу


                a[];
                a[999] = 123;

                Чем оно станет после компиляции под микроконтроллер/GPGPU? Кто будет резервировать память?


                В C++ от того, что функция malloc ушла внутрь new, она никуда не делась и вы можете по-прежнему определить ее руками.


                Отсюда либо откажитесь от слов "системное программирование" и "вся мощь C++", либо вменяемо распишите модель памяти и работу с ней. Иначе не бывает, C++ без прямой работы с памятью никому не нужен.


                Идея такая: пишу на Cj и генерирую в Javascript или С++ или любой другой язык и поэтому я могу выполнить любую задачу заказчика на одном и том же языке программирования!

                Я бы мог вас отправить читать теорию, почему так не получится сделать для языков, работающих на столь разном уровне, но пытаюсь вам объяснить на пальцах. Язык, который одновременно транслируется и в C++ и в js будет хуже их обоих. Единственный вариант — создавать свой рантайм, но а: уже есть java/c#, б: вот только на js еще и рантайма не хватало. "Мы запустили интерпретатор внутри интерпретатора, чтобы вы могли интерпретировать, пока интерпретируете". Как и на C++, к слову. Да и вообще, зачем вы паритесь?


                Вот вам отличная идея, как ответить на все мои вопросы: напишите транслятор в js, а чтобы поддерживать C++ — просто поднимайте внутри C++ движок js. И в java так компилировать можно. И в шарп. Oh wait...


  1. KvanTTT
    17.10.2017 14:41
    +1

    Автор либо тролль, либо у него что-то не в порядке с головой, либо просто недалекий.


  1. retran
    18.10.2017 09:57
    +1

    У меня вот есть такое — github.com/retran/my-little-lispy-experimental

    Там есть маленькая виртуальная машина, статические скоупы, динамическая строгая типизация, лямбды, замыкания, оптимизация хвостовой рекурсии, примитивный remote repl… И, да, там тоже свой лексер и парсер. И даже мотивация была — DSL-движок, для описания всяких игровых моделей.

    Вот только я довольно хорошо осознаю «серьезность» проекта, не тащу его на хабр, и в пет-проджекте использую банальный Lua, а на работе — проприетарный скриптовый язык с 20-летней историей.

    Зачем вы принесли вот это на хабр и что у вас на самом деле есть?


    1. sitev_ru Автор
      18.10.2017 10:34
      -2

      Зачем вы принесли вот это на хабр

      Как я понимаю, Хабр — это площадка для ИТ-специалистов, где человек выкладывает статью на какую-то интересующую тему его и сообщество обсуждает это.

      Куча статей просто не о чём, хотя на такие же темы:
      habrahabr.ru/post/236907
      habrahabr.ru/post/274083
      и т.д…

      Моя статья даже поинтереснее будет, как мне казалось. Но видимо ошибался.

      Человек разрабытывает транслятор/компилятор. Сложная тема, интересно услышать мнение специалистов. Я не специализируюсь на разработке компилятора, интересно услышать спецов, в принципе, и я услышал…

      А это что за комменты?
      Автор либо тролль, либо у него что-то не в порядке с головой, либо просто недалекий.
      такие оскорбления запрещены правилами Хабра. И где модератор? Нету )

      Там есть маленькая виртуальная машина, статические скоупы, динамическая строгая типизация, лямбды, замыкания, оптимизация хвостовой рекурсии, примитивный remote repl… И, да, там тоже свой лексер и парсер. И даже мотивация была — DSL-движок, для описания всяких игровых моделей.


      У вас всё сложно, поэтому и осознали сложность, а у меня всё намного проще и реально реализуемо, хотя есть и большие минусы, мне их указали комментаторы, но я о них даже не задумываюсь, потому что плюсов в моей идее намного больше!


      1. lair
        18.10.2017 11:16
        +1

        у меня всё намного проще

        … потому что ничего не делает, ага.


      1. retran
        18.10.2017 16:53
        +1

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


      1. retran
        18.10.2017 16:59
        +1

        К слову, «серьезность» я взял в кавычки не потому что там что-то сложное, а потому что я не считаю свой лисп какой-то серьезной работой, готовой для представления или какого-то реального использованя.


        1. Zenitchik
          18.10.2017 17:31
          +1

          А чем чёрт не шутит, я вот пишу язык с лисп-подобным синтаксисом (но совсем не лисп-подобной структурой данных) для применения в качестве кода, которым нестандартные данные могут быть представлены в JSON. Пожалуй, моя поделка заслуживает ещё меньшего внимания, чем Ваша, однако область применения есть (собственно, от неё и плясал).


          1. sitev_ru Автор
            18.10.2017 17:54
            -1

            Ну вот, постепенно объявляются люди, которые тоже ваяют свои языки, компиляторы и т.д… А можно посмотреть код Вашего языка? Он опенсоурсный?


          1. vintage
            18.10.2017 18:19

            Не хотите ли рассказать о своей идее по подробней?


            1. Zenitchik
              18.10.2017 18:23
              +1

              Пока не хочу. Слишком оно сырое.


              1. vintage
                18.10.2017 19:24

                Идея не может быть сырой. Просто у меня похожие идеи. Могли бы заняться перекрёсным опылением.


                1. babylon
                  18.10.2017 19:44

                  Я тоже могу присоединиться к опылению или почкованию, по крайней мере могу дать цу, но нужно знать прикуп:)


                1. Zenitchik
                  18.10.2017 20:47

                  Идею тоже нужно хорошо сформулировать, прежде чем излагать...


                  1. vintage
                    19.10.2017 08:40

                    Ну, если сформулируете — присоединяйтесь: https://t.me/lang_idioms :-)


  1. rraderio
    19.10.2017 11:31

    «The Lux Programming Language» by Eduardo Julian
    www.youtube.com/watch?v=T-BZvBWiamU