Cj — новый язык программирования -47

- такой же как Forbes, только лучше.

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

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

Вздох разочарования, 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
    /#10475452 / -1

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

    • Merlen_Gross
      /#10475466 / +1

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

      • sitev_ru
        /#10475492 / -2

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

        • curunir
          /#10475524

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

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

        • aamonster
          /#10475722

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


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

          • sitev_ru
            /#10475868

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

            • aamonster
              /#10476540

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


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


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


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

              • sitev_ru
                /#10476728 / -1

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

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

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

                • aamonster
                  /#10476820 / +2

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

                  • sitev_ru
                    /#10476838 / -5

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

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

            • sayber
              /#10476542

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

        • andreymal
          /#10475742

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

          • sitev_ru
            /#10475872

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

      • alisa_musik
        /#10478468 / -1

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

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

    • EvilGenius18
      /#10475490

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

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

      • sitev_ru
        /#10475496

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

        • EvilGenius18
          /#10475522

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

          • sitev_ru
            /#10475544 / -3

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

            • EvilGenius18
              /#10475596

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

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

              • sitev_ru
                /#10475638

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

                • EvilGenius18
                  /#10475718

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

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

                  • sitev_ru
                    /#10475882

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

                    • SerafimArts
                      /#10475892

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

                      • sitev_ru
                        /#10475986 / -3

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

                    • lair
                      /#10475960

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

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

                      • sitev_ru
                        /#10475980 / -1

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

                        • lair
                          /#10475988 / +2

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

                          • sitev_ru
                            /#10476038

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

                            • lair
                              /#10476046 / +1

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


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

                              • sitev_ru
                                /#10476074

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

                                • lair
                                  /#10476078

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

                                  Получилось?

                                  • sitev_ru
                                    /#10476158 / -1

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

                                    • lair
                                      /#10476324

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

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


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

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

                                    • mayorovp
                                      /#10481154 / +1

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


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

                    • zagayevskiy
                      /#10476060

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

                      • sitev_ru
                        /#10476088

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

                        • staticlab
                          /#10476096

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

                          • Nagg
                            /#10476706

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

                            • staticlab
                              /#10476750

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


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

                              • sitev_ru
                                /#10476818

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

                                • staticlab
                                  /#10476892 / +1

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

                              • Nagg
                                /#10477512

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

                                • staticlab
                                  /#10477562

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

                                  • Nagg
                                    /#10478536

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

                                • sitev_ru
                                  /#10477564 / -2

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

                        • zagayevskiy
                          /#10476114 / +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.

                          • sitev_ru
                            /#10476192

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

  2. lair
    /#10475462 / +3

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

    • sitev_ru
      /#10475480 / -2

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

      • lair
        /#10475488 / +2

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

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

        • sitev_ru
          /#10475550 / -1

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

          • lair
            /#10475554

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

            • sitev_ru
              /#10475612

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

              • lair
                /#10475616

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

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

                • sitev_ru
                  /#10475646

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

                  • kez
                    /#10475720

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

                    • sitev_ru
                      /#10475724

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

                  • lair
                    /#10475728

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

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


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

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


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

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

                    • sitev_ru
                      /#10475910 / -2

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

                      • staticlab
                        /#10475930 / +1

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

                        • sitev_ru
                          /#10475992

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

                          • staticlab
                            /#10476022

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

                            • sitev_ru
                              /#10476058

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


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

                              • kez
                                /#10476066 / +2

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

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

                                • sitev_ru
                                  /#10476110

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

                              • lair
                                /#10476068

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

                                • sitev_ru
                                  /#10476132 / -1

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

                                  • SerafimArts
                                    /#10476144

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


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


                                    Норм идея?

                                    • lair
                                      /#10476330

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

                                      • SerafimArts
                                        /#10476356

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

                                        • lair
                                          /#10476420

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

                                          • SerafimArts
                                            /#10476462

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

                                            • lair
                                              /#10476466

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


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

                                              • SerafimArts
                                                /#10476502

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

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

                                                • lair
                                                  /#10476506

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

                                                  • SerafimArts
                                                    /#10476512

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

                                                    • lair
                                                      /#10476518

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

                                  • lair
                                    /#10476318

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


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

                              • staticlab
                                /#10476072

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


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

                                • sitev_ru
                                  /#10476150

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

                              • sergey_kzn
                                /#10476238

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

                      • lair
                        /#10475958

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

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

              • staticlab
                /#10475620

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

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

                • sitev_ru
                  /#10475650

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

                  • staticlab
                    /#10475682

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

                    • sitev_ru
                      /#10475732

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

  3. ihost
    /#10475486

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

    • sitev_ru
      /#10475510

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

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

      • RPG18
        /#10475586

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

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

        • sitev_ru
          /#10475614

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

          • RPG18
            /#10475640

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

            • sitev_ru
              /#10475660

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

              • RPG18
                /#10475666

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

                • sitev_ru
                  /#10475734

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

                  • RPG18
                    /#10475754

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

                    • sitev_ru
                      /#10475918

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

                      • RPG18
                        /#10475936

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

                        • sitev_ru
                          /#10476000

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

                          • SerafimArts
                            /#10476014 / +1

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


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

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

                            • sitev_ru
                              /#10476048

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

                              • SerafimArts
                                /#10476094

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


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

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


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

                                • sitev_ru
                                  /#10476174

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

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

                                  • SerafimArts
                                    /#10476284

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

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

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

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


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

                                    • sitev_ru
                                      /#10476344

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

                                      • SerafimArts
                                        /#10476382

                                        Ну, например, в локальном скоупе создать изолированную память (сгенерировать уникальное имя переменной, например). Заблокировать к ней доступ извне (сделать вид, что её не существует). Туда добавить нужное значение. Прокинуть наверх значение с именем переменной, сделав вид, что объявление "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;

                                        • sitev_ru
                                          /#10476392

                                          жесть)

                                          • SerafimArts
                                            /#10476436

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


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



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


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

                                            • sitev_ru
                                              /#10476444

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

                                              • staticlab
                                                /#10476670

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


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


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

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

                                                • sitev_ru
                                                  /#10476730 / -1

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

                                                  • staticlab
                                                    /#10476744 / +1

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

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


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

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

    • Stawros
      /#10475540

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

      • sitev_ru
        /#10475558 / -3

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

  4. staticlab
    /#10475494

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

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


    mul();

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

    • sitev_ru
      /#10475502 / -1

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

      • staticlab
        /#10475504

        Тогда


        int sum();

        что такое?

        • sitev_ru
          /#10475518

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

          • staticlab
            /#10475532

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

            • sitev_ru
              /#10475564 / -1

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

              • staticlab
                /#10475582 / +1

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


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

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

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

  5. Zenitchik
    /#10475534

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

    • sitev_ru
      /#10475624

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

      • staticlab
        /#10475644

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

        • sitev_ru
          /#10475670 / -1

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

          • staticlab
            /#10475674 / +1

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

            • sitev_ru
              /#10475738

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

              • staticlab
                /#10475758

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


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

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

                • sitev_ru
                  /#10475776

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

                  • staticlab
                    /#10475790

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

      • Serge78rus
        /#10475700

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

        • sitev_ru
          /#10475762

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

          • Serge78rus
            /#10475896

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

            • sitev_ru
              /#10475928

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

  6. MamontsevDS
    /#10475568

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

    • sitev_ru
      /#10475594 / -1

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

      • staticlab
        /#10475626

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

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

        • sitev_ru
          /#10475672 / -1

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

          • staticlab
            /#10475686

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

            • sitev_ru
              /#10475694

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

    • sitev_ru
      /#10476140 / -1

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

  7. Shtucer
    /#10475636

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

    function my_func1(var p) {


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

    • sitev_ru
      /#10475710 / -2

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

      • Shtucer
        /#10475726 / +1

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

        • sitev_ru
          /#10475780

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

          • staticlab
            /#10475802

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


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

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

            • sitev_ru
              /#10475956 / -4

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

              • MamontsevDS
                /#10476748

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

                • sitev_ru
                  /#10476808 / -2

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

                  • ZZahar
                    /#10476894

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

                    • sitev_ru
                      /#10476896 / -1

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

                      • Zenitchik
                        /#10477788

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

      • staticlab
        /#10475740

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

        • sitev_ru
          /#10475792

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

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

          • farcaller
            /#10476102

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

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

          • Zenitchik
            /#10476116

            Microsoft Visual Studio

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

            • sitev_ru
              /#10476220

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

  8. yarric
    /#10475712

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

    • sitev_ru
      /#10475796

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

      • yarric
        /#10476236

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

        • sitev_ru
          /#10476260

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

          • vintage
            /#10476490

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

  9. JegernOUTT
    /#10475714

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

    • sitev_ru
      /#10475826 / -1

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

      • andreymal
        /#10475832

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

        • sitev_ru
          /#10475966

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

  10. SerafimArts
    /#10475770

    Предлагаю автору:
    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) "("
             // тут должны быть аргументы
        ")" (";")?

    • SerafimArts
      /#10475806

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

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

      • sitev_ru
        /#10475830 / +1

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

        • sitev_ru
          /#10475854

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

          • SerafimArts
            /#10475884

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

            • sitev_ru
              /#10475968 / -1

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

              • SerafimArts
                /#10475994

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

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

                • sitev_ru
                  /#10476044

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

    • sitev_ru
      /#10475850

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

    • KvanTTT
      /#10476154

      На 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:        .;

      • sitev_ru
        /#10476250

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

        • KvanTTT
          /#10476528

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


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

          • sitev_ru
            /#10476724 / -1

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

    • yarric
      /#10476240

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

      • KvanTTT
        /#10476500

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

        • sitev_ru
          /#10476722 / -1

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

  11. dreka5
    /#10475800

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

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

    • sitev_ru
      /#10475812

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

  12. scoffer-by
    /#10475974 / -3

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

  13. sitev_ru
    /#10475976 / -1

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

  14. NeoCode
    /#10476254

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

    • sitev_ru
      /#10476268

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

  15. kahi4
    /#10476274 / +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. А текущая версия даже на версию не годится, это как-то все само подразумевается, а вы умудрились в совсем уж очевидных вещах накосячить и сделать свой язык принципиально не соответствующий поставленной цели:


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

    • kahi4
      /#10476278 / +1

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

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

    • sitev_ru
      /#10476332 / -1

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

      • SerafimArts
        /#10476388

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

      • lair
        /#10476424

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

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

      • kez
        /#10476536

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

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

        image

    • andreymal
      /#10476682

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

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

      • sitev_ru
        /#10476738 / -1

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

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

        • kahi4
          /#10476788 / +1

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


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


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


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

          • sitev_ru
            /#10476832 / -1

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

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

          • sitev_ru
            /#10476868 / -1

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

  16. Roumed1
    /#10477302

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

    • sitev_ru
      /#10477338 / -2

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

  17. oYASo
    /#10477590 / +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 и т.д.).

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

    • sitev_ru
      /#10477692 / -1

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

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

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

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

      • lair
        /#10477706 / +1

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

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

        • sitev_ru
          /#10477996 / -1

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

          • lair
            /#10478016

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

            • sitev_ru
              /#10478192

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

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

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

              • lair
                /#10478274

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

                • sitev_ru
                  /#10478296

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

                  • lair
                    /#10478298

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


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

                  • lair
                    /#10478314

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

      • oYASo
        /#10478090

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

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

      • kahi4
        /#10478348

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


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

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


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


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


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


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

        • sitev_ru
          /#10478404 / -1

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

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


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

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

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

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

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

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

          • kahi4
            /#10478512

            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);
            }

            • sitev_ru
              /#10478630

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

              Совершенно не так. Если присваиваю переменную, а она в 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.

              • kahi4
                /#10478734 / +1

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


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


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


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

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


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

                • mwizard
                  /#10480022 / +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

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

                  • sitev_ru
                    /#10480144

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

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

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

                    • lair
                      /#10480400

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

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

                    • mwizard
                      /#10480574 / +2

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

                  • kahi4
                    /#10480272

                    Первое — тоже самое, что просто использовать 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];

                    • mwizard
                      /#10480618

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

                  • kahi4
                    /#10480294

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


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

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

                    • mwizard
                      /#10480572 / +1

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

          • kahi4
            /#10478526 / +1

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

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


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

            • sitev_ru
              /#10478724 / -2

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

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

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

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

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

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

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

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

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

              • lair
                /#10478742 / +1

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


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

              • lair
                /#10478928 / +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]; //а теперь?

                • sitev_ru
                  /#10479000

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

                  int a[];

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

                  • lair
                    /#10479004 / +1

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

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


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

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


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

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

              • kahi4
                /#10479006 / +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...

  18. KvanTTT
    /#10477606 / +1

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

  19. retran
    /#10478776 / +1

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

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

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

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

    • sitev_ru
      /#10478850 / -2

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

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

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

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

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

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

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


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

      • lair
        /#10478932 / +1

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

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

      • retran
        /#10479748 / +1

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

      • retran
        /#10479764 / +1

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

        • Zenitchik
          /#10479820 / +1

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

          • sitev_ru
            /#10479848 / -1

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

          • vintage
            /#10479884

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

            • Zenitchik
              /#10479888 / +1

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

              • vintage
                /#10480000

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

                • babylon
                  /#10480032

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

                • Zenitchik
                  /#10480102

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

  20. rraderio
    /#10480966

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