Все замерли в ожидании, что за идея? Идея — написать свой язык программирования!
Вздох разочарования, 99% выкинули свои компьютеры в окно, ну а для тех кто остался, я продолжу.
Меня всегда интересовали различные направления и веб я хочу сбацать и мобайл и десктоп и что-нибудь серверное готов написать, ещё мне интересены ИИ, игры, роботы, криптовалюты… И при этом, хотелось бы всё это писать на одном языке).
Смотрел я в сторону С++, C#, Java, Javascript и даже Python, но везде мне что-нибудь не нравилось…
Итак, всё решено, пишу свой язык программирования. Скрестим мощный C++ с лёгким Javascript и назовём Cj!
Начинаем придумывать синтаксис языка
При описании переменных я предлагаю дать возможность как в С++ сразу указывать тип переменной. Для описания автоматической переменной используем, как и в 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)
lair
16.10.2017 15:28+3А что, бишь, в вашем языке от "мощного C++"?
sitev_ru Автор
16.10.2017 15:32-2Пока ничего. Это только версия 0.1. Кстати, если Вам интересно, предлагайте, что хотели бы увидеть? Возможно, у Вас есть интересные идеи, у меня желание писать код. Хотя, у меня и самого идей полным полно, но готов, естественно, обсуждать любую критику и предложения.
lair
16.10.2017 15:34+2Кстати, если Вам интересно, предлагайте, что хотели бы увидеть?
Я предпочел бы это развидеть. Я считаю, что эта помесь ежа с ужом, как обычно, превратится в колючую проволоку.
sitev_ru Автор
16.10.2017 15:51-1Надеюсь сделать хороший продукт. По крайней мере, мне интересно!
lair
16.10.2017 15:52Чтобы сделать хороший продукт, надо иметь цель помимо "сделать хороший продукт". Какие задачи преследует этот продукт? Чем он выгоднее конкурентов?
sitev_ru Автор
16.10.2017 16:14Хочу писать веб страничку — Cj генерит Javascript, хочу Android — генерит Java под Android и т.д… Цель — генерировать самый оптимальный код, самое оптимальное решение. И тогда будет успех. Я не говорю, что я в одиночку в свободное от работы время смогу написать лучше гугл или майкрософт. Но я стараюсь)
lair
16.10.2017 16:15Хочу писать веб страничку — Cj генерит Javascript, хочу Android — генерит Java под Android и т.д…
- Тогда при чем тут вообще C++?
- Как вы будете решать проблему с зависимостями?
- Почему не использовать любой существующий язык?
sitev_ru Автор
16.10.2017 16:231. Хочу десктоп — Cj генерит, С++
2. Поясните подробнее, плиз?
3. Предложите, какой язык я должен использовать?lair
16.10.2017 16:46Хочу десктоп — Cj генерит, С++
Зачем вам для этого C++ в языке?
Поясните подробнее, плиз?
Вот у вас есть, значит, приложение, которое должно сохранить файл, полученный с сервера, на диск. В приложении написано что-нибудь типа
stream.SaveTo(path)
. Во что это будет компилироваться на десктопе — более-менее понятно. А на остальных платформах, вот прямо с браузера начиная?
Предложите, какой язык я должен использовать?
Любой, для которого есть готовый парсер. Для ваших целей нужен не новый язык, а бэкенд, который одно и то же синтаксическое дерево компилит в разные целевые языки.
sitev_ru Автор
16.10.2017 17:40-2Для десктопа, например, генерит Qt/C++. Что делать с stream.SaveTo(path)? Очевидно, что в данном случае это бесмысленно. Но есть какие-то общие вещи, которые можно сделать универсально. Например, создать кнопочку. Для программы, веб-странички или какой-нибудь активити это действие однотипно.
staticlab
16.10.2017 17:48+1Далеко не однотипно. И вы сами сказали, что толком не знаете, как эту кнопочку для всех платформ сразу сделать.
sitev_ru Автор
16.10.2017 18:07Наоборот, знаю. Она просто генерится под каждую платформу
staticlab
16.10.2017 18:12Продемонстрируете как выглядит код на Cj, создающий кнопку, которая становится красной после нажатия, а также что будет на выходе хотя бы для JS и C++?
sitev_ru Автор
16.10.2017 18:29Button button; button.onClick = () { this.setColor(red); }
Видимо, как-то так. Для JS и C++ будет какой-то похожий код.lair
16.10.2017 18:32А нулрефа в этом замечательном коде разве не будет? И где же именно будет создана кнопка, на каком скрине, в каком его месте?
sitev_ru Автор
16.10.2017 18:51-1Возможно, надо указать окно/страничку/активити, где будет кнопка. Пока это не принципиально, я такими вопросами в принципе не задавался. Нельзя сразу объять необъятное. Нужно двигаться постепенно. У нас в наличии лишь один разработчик, делающий за интерес в свободное время)
SerafimArts
16.10.2017 18:58Просто попишите на Haxe, на том языке, где это уже давно есть и попробуйте понять какие проблемы содержит данный подход.
Помимо этого стоит ознакомиться с историей ASP и почему он мёртв. Почему некоторые банковские сайты часто требуют IE6/7 и отказываются работать в современных браузерах (в том числе и в современных IE, как бы сюрриалистично не звучало вместе "IE" и "современность". Я уж не говорю про Edge). И почему ему на смену пришёл ASP.NET (это совершенно другая технология, не стоит путать).
Норм идея?
lair
16.10.2017 21:03Мне, кстати, интересно, каким боком сюда ASP.
SerafimArts
16.10.2017 21:15Некоторая часть API ASP (имя ввиду вот это: en.wikipedia.org/wiki/Active_Server_Pages), насколько я помню, в ранние годы генерировала куски JS и HTML кода. Или я что-то напутал?
lair
16.10.2017 22:01Это и asp.net-контролы делают сейчас. Это в любом случае была не кросс-компиляция, а просто готовая функциональность.
SerafimArts
16.10.2017 22:29Звучит паршиво. Кажется, что эти «виджеты-контролы» — это именно то, что сгубило и ASP, губит Yii и убивает Meteor. Нет?
lair
16.10.2017 22:31Затрудняюсь с ответом. У контролов есть свои сильные стороны, а вот что убило asp — я уже и не помню.
(ну, помимо выхода asp.net)
SerafimArts
16.10.2017 22:52На счёт сторон — никто не спорит. Это вполне себе альтернатива jquery плагинчикам. Только, кажется, эти плагинчики никак не зависят ни от серверной реализации, ни от версии ПО на том же сервере.
Я не ошибусь, если предположу, что эти компоненты используют лишь для совсем внутренних админок и макетов? Где надо побыстрее, а не так, чтобы оно нормально работало?
lair
16.10.2017 21:01Это как раз принципиально. Если вы не понимаете, как будут решаться такие вопросы, заявленная вами цель недостижима.
Собственно, если бы я вдруг брался за такую амбициозную задачу, я бы начал как раз с того, что просто набросал, как будет выглядеть код, как исходный, так и целевой. Возможно, уже на этом этапе было бы понятно, что задача не имеет решения.
sergey_kzn
16.10.2017 19:52Почему-то это подозрительно напоминает Qt с QML. Декларативный интерфейс, кросплатформенно и вроде бы под web умеет.
lair
16.10.2017 17:57Но есть какие-то общие вещи, которые можно сделать универсально. Например, создать кнопочку.
Ага, для сервиса особенно.
staticlab
16.10.2017 16:18Цель — генерировать самый оптимальный код, самое оптимальное решение
Практика показывает, что кроссплатформенные решения всё равно уступают нативной разработке.
sitev_ru Автор
16.10.2017 16:24Так и задача генерировать нативное! А значит, все остальные кроссплатформенные решения уже проигрывают Cj! ))
ihost
16.10.2017 15:33Сама по себе идея разрабатывать части web-приложения на C/C++ далеко не новая — другое дело, какой результат вы хотите получить от такого подхода? Возможно, вам будет интересно ознакомиться с WASM: http://webassembly.org/docs/c-and-c++/
sitev_ru Автор
16.10.2017 15:41Я, конечно же, знаю про эту поделка и она пока что выглядит менее жизнеспособно, чем моё решение.
Команда, работающая над WebAssembly, включает разработчиков из компаний Mozilla, Google, Microsoft и Apple
. Надеюсь они когда-нибудь осилят ))RPG18
16.10.2017 16:01Я, конечно же, знаю про эту поделка и она пока что выглядит менее жизнеспособно, чем моё решение.
Уже игры на Unity в WebAssembly есть, а вы говорите "выглядит менее жизнеспособно"
sitev_ru Автор
16.10.2017 16:15Думал они используют WebGL
RPG18
16.10.2017 16:21WebGL это рисование. Их C/C++ код компилируется в Asm.js/WebAssembly.
sitev_ru Автор
16.10.2017 16:26Хорошо. Кто-нибудь в 2017 году пишет сайтики на WebAssembly? Думаю если и пишут, то очень очень мало. Cj будет генерировать Javascript.
RPG18
16.10.2017 16:28Уже есть Emscripten, который из C/C++ генерит JavaScript
sitev_ru Автор
16.10.2017 16:49Вы им компилировали? Я попробывал. Куча лишнего Javascript-кода. А у меня чистый код!
RPG18
16.10.2017 16:53Уже пару лет в продакшене.
sitev_ru Автор
16.10.2017 17:43Давно пробывал его. Задал int a = 1; выдал много непонятного кода). Возможно, я ошибаюсь)
RPG18
16.10.2017 17:49Конечно же он выдал много кода, т.к. у C++ есть runtime.
sitev_ru Автор
16.10.2017 18:09А для меня этот код лишний. Я и хочу на строчку типа int a = 1; в Javascript получить также одну строчку var a = 1;
SerafimArts
16.10.2017 18:12+1Допустим. Тогда:
int a = 1; a = a + "some";
Что в этом случае должно произойти?
sitev_ru Автор
16.10.2017 18:23Думаю, что это ошибка. У вас есть доводы переопределить тип для переменной а?
SerafimArts
16.10.2017 18:42Там выше был пример, что "int a" превращается в "var a". Следовательно будет:
var a = 1; a = a + "some"; // "1some"
А это вполне валидный и рабочий JS код. По-этому никаких ошибок.
С другой стороны, почему var, а не let...?
sitev_ru Автор
16.10.2017 19:16Зачем изначально портить язык такими штуками?
А var или let не принципиально. Это как пример. let не поддерживается старыми браузерами, значит пусть обновляют)SerafimArts
16.10.2017 20:33Какими? Вы сами пытаетесь сделать транслятор. Следовательно надо поддержать консистентность. Сделать так, чтобы вот такой вот совершенно элементарный пример одинаково работал и на JS, и на C++: и там, и результат работы не отличался. Верно?
На счёт «не принципиальности». Какой результат должен выдать вот этот пример на вашем языке?
int a = 23;
some() {
a = 42;
}
// Вопрос: Чему равен "a"?
ОтветЕсли «var a», то 42
Если «let a», то 23 и одна глобальная "(global || window).a" переменная, равная 42sitev_ru Автор
16.10.2017 21:11Версия 0.1 — это пробный шар. Конечно, нужно let. Как быть с поддержкой в старых браузерах?
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;
sitev_ru Автор
16.10.2017 21:39жесть)
SerafimArts
16.10.2017 22:11Отлично, первый этап пройден. Мы выяснили откуда во всех трансляторах такая куча "лишнего" кода и почему без него не получится.
Переходим к stdlib. Начнём с чего-нибудь "простого", функции получения длины строки. Давайте попробуем написать код на нашем убер-Cj:
(Увы, хабр не поддерживает нормально utf-8, так что картинкоё)
Такая строка занимает 21 байт в utf-8. Что-то не сходится. Как мы будем считать? И давайте учитывать, что в JS длина этой строки 12 символов, хотя физически их 11. А на C++ как мы будем считать? Подключим внутрь бинарника какой-нибудь icudt (пыщ: http://site.icu-project.org/), объёмом в ~25 мегабайт?
sitev_ru Автор
16.10.2017 22:16Тут я вроде подготовился: habrahabr.ru/post/319602
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 КБ!
sitev_ru Автор
17.10.2017 06:17-1Тянется непомню уже откуда, старый код — macOS не брал в расчёт) Как тут лучше написать? может вообще проще выкинуть OS_LINUX и OS_WINDOWS? Бинарник Cj весит 62 КБ?
staticlab
17.10.2017 06:57+1может вообще проще выкинуть OS_LINUX и OS_WINDOWS?
От этих макросов зависит, какие будут хедеры подключаться, а на каждой платформе они свои, так что это вряд ли.
Бинарник Cj весит 62 КБ?
Нет, бинарник, который меряет длину строки и выводит в консоль.
Stawros
16.10.2017 15:47Мне кажется автор всё-таки TypeScript изобретает.
sitev_ru Автор
16.10.2017 15:52-3Почти. Даже если я изобретаю TypeScript, то в нынешних условиях это не изобретение велосипеда, а это обычное импортозамещение )
staticlab
16.10.2017 15:37либо не указываем, как в Javascript
не указывать ключевое слово для объявления переменной и в JavaScript давно уже bad practice.
mul();
отлично, это объявление функции или её вызов? :)
sitev_ru Автор
16.10.2017 15:39-1конечно же вызов, объявление было бы так: mul() {}
Zenitchik
16.10.2017 15:46Вы на Visual Basic никогда не писали? "auto" наводит на мысль, что Вы не в курсе, что такое вариантный тип.
Логично было бы ввести тип Variant, и использовать аббревиатуру "var" )))sitev_ru Автор
16.10.2017 16:19Нет, не писал, но писал на Дельфи/С++ билдере, там тоже есть Вариант. Пусть будет авто, чтобы не путаться. В идеале просто auto опускаем.
staticlab
16.10.2017 16:23В Delphi — Variant, в C++ Builder — Variant, в Visual Basic — Variant, в стандартном C++ — std::variant, в JavaScript — var (хоть это и от variable). Поэтому мы назовём auto, чтобы не путаться :)
sitev_ru Автор
16.10.2017 16:29-1В С++ есть auto. Если Вам так важно, я могу сделать для Вас лично var. В аналах истории будет записано, что некий staticlab уговорил разработчика языка добавить слово var! ))
staticlab
16.10.2017 16:31+1Вы понимаете различие между variant и auto?
sitev_ru Автор
16.10.2017 16:50Ну как бы да, понимаю. И что?
staticlab
16.10.2017 16:53А мне кажется, что не понимаете.
a = "Hello "; b = "World"; x = a + b; c = 1; d = 2; x = c + d;
У вас это должно транспилироваться в какой код на JS, Java и C++?
sitev_ru Автор
16.10.2017 16:58Да, я понял, правда не сразу)) Я думал, в языке Cj задать, что в этом случае переопределять тип переменной будет запрещено. Возможно, ввести тип variant. А Вы что предлагаете?
staticlab
16.10.2017 17:02Использование variant для строго типизированных языков будет менее эффективно, чем нативная реализация.
Serge78rus
16.10.2017 16:38Простите, но auto и variant — очень разные понятия. Тип auto говорит о том, что тип будет выведен автоматически на этапе компиляции. Тип, содержащийся в variant, определяется в процессе выполнения.
sitev_ru Автор
16.10.2017 16:55Понятно, что будет много подводных камней. Как быть, я хочу генерировать и в Javascript и в C++. В случае Javascript, это Variant, в случае C++ это auto. Как быть я пока не знаю. Но, в принципе, простые примерчики работать будут)
Serge78rus
16.10.2017 17:37Вы понимаете разницу между статической и динамической типизацией?
sitev_ru Автор
16.10.2017 17:47Если в языке Cj переменная типа auto, то это статическая типизация и менять тип переменной будет ошибкой. Если задать тип вариант — это будет динамической типизацией. В этом случае, менять тип по хочу выполнения программы будет возможно. Если мы опускаем тип, то в Cj планировал сделать, как будто это auto, то есть статическая типизация.
MamontsevDS
16.10.2017 15:56А почему вы трансляцию называете компиляцией?
sitev_ru Автор
16.10.2017 16:05-1Что же ответить. Вы абсолютно правы. Но когда писал статью, показалось, что компилятор написать покруче будет. Теперь буду использовать всё-таки слово транслятор. До написания компилятора ой как далеко!
staticlab
16.10.2017 16:19Напишу свой лексер, парсер и т.д… Мне так интереснее, и в добавок, на выходе получим свой простенький аналог LLVM!
Я вас расстрою, но LLVM — это не лексер и не парсер.
sitev_ru Автор
16.10.2017 18:57-1Из википедии: Kotlin (Ко?тлин) — статически типизированный язык программирования, работающий поверх JVM и разрабатываемый компанией JetBrains. Компилируется также в JavaScript
Почему тут называют компиляцией в Javascript, а мне нельзя? ))
Shtucer
16.10.2017 16:21А вот что получается на Javascript:
function my_func1(var p) {
Это в каком JavaScript такое валидно? А то у меня получается "Uncaught SyntaxError: Unexpected token var"
sitev_ru Автор
16.10.2017 16:42-2Оперативно подкорректировал Cj github.com/sitev/cj/commit/fd559123ff13d2a528a3d644b9281ef7a91902e7
Теперь нет там var. Я даже не проверил работу Javascript, спасибо за замечание.Shtucer
16.10.2017 16:46+1Я правильно понимаю, что вы решили не тратить свое драгоценное время на глубокое изучение какого-либо языка, а потратить сэкономленное на написание своего собственного?
sitev_ru Автор
16.10.2017 17:00Это как с английским, пишу на Javascript со словарём! )
staticlab
16.10.2017 17:06Напомню полную советскую градацию:
- не владею;
- читаю и перевожу со словарём;
- читаю и могу изъясняться;
- свободно владею.
То есть языки знаю на троечку, но зачем их учить, лучше я свой придумаю!
sitev_ru Автор
16.10.2017 17:57-4Зачем придумали Typescript? Да потому что Javascript полный отстой. Что там учить? Там всё просто!
MamontsevDS
17.10.2017 07:12Вроде взрослый человек, а мыслите как подросток, считающий, что он все знает лучше остальных.
staticlab
16.10.2017 16:50А теперь ещё проверьте, компилируется ли ваш исходный код из Гитхаба. Где взять core.lib и lang.lib? И вроде пилите убийцу всех языков современности, а сами пишете некроссплатформенный код под винду / MSVC.
sitev_ru Автор
16.10.2017 17:04вот они: github.com/sitev/core, github.com/sitev/lang
У меня такой подход, я пишу на Microsoft Visual Studio, но в итоге получается всё кроссплатформенно. Например, сайт sitev.ru работает на своём вебсервере и своёй CMS на плюсах. Они разработаны по тойже технологии. Всё что сейчас не работает, я исправлю, не дошли руки протестировать в линуксе.farcaller
16.10.2017 18:44Например, сайт sitev.ru работает на своём вебсервере и своёй CMS на плюсах
У вас там адъ в разметке из стилей
sitev_ru Автор
16.10.2017 19:34Я могу цеплять разные шаблоны к сайту. Сейчас стоит этот: adminlte.io/themes/AdminLTE/index2.html
yarric
16.10.2017 16:42А теперь запилите компиляцию в нативный код.
sitev_ru Автор
16.10.2017 17:05Пока запил в Javascript. Он нативный для браузера.
yarric
16.10.2017 19:51Нуу, так C++ не потеснишь… Трансляторы в JS сейчас только ленивый не пишет.
sitev_ru Автор
16.10.2017 20:15Я не собираюсь делать революцию в области программирования. Я просто хочу написать язык под себя. Возможно, эта тема ещё кому-то интересна. Ищу единомышленников)
vintage
16.10.2017 22:47Сомневаюсь, что вы найдёте единомышленников в разработке языка под вас. Но если будут интересные идеи касательно языков — пишите нам в телеграм чат: https://t.me/lang_idioms
JegernOUTT
16.10.2017 16:44Вы бы лучше не торопились. Постепенно прочитали бы книжку , познакомились бы с исходным кодом компиляторов крупных языков (к примеру если нравятся плюсы, то gcc, clang). Попробовали бы поконтрибьютить (исправить парочку багов, добавить функциональность...).
Сейчас же ваше творчество выглядит обычным троллингом, никакого серьёзного фидбэка от этого ожидать не стоит. И лучше вообще удалить статью, чтобы рейтинг и карму не слили ещё большеsitev_ru Автор
16.10.2017 17:13-1Моя цель — написать свой язык и на нём делать различные проекты. А карма или рейтинги на хабре? Я недавно написал вопрос на тостере toster.ru/q/464824. Поплакался. Так это вызвало бурю советов, кучу подписавшихся, добавили много очков к рейтингу. Надо писать, что всё плохо и тогда будет счастье)
andreymal
16.10.2017 17:16Вы, может быть, и молодец, только сей пост следовало писать тогда, когда уже появится хотя бы один нормальный рабочий проект на этом языке. А сейчас это всё ещё как-то ни о чём
sitev_ru Автор
16.10.2017 17:59Тут просто выкладывают какие-то переводы и это нормально. А если что-то сам написал, то нельзя показывать. Не беспокойтесь. Я ещё планирую не одну статейку по Cj здесь опубликовать. Естественно, уровень языка будет намного выше)
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) "(" // тут должны быть аргументы ")" (";")?
SerafimArts
16.10.2017 17:07Ах, да. Ребят, если вы читаете этот коммент, то: Понятно же, что парню лет 12-14, судя по лексикону и манере выражаться. Сам таким был, и наверняка себя вспомните. Так что не надо прям так наезжать. Понятно, что глупость, но на корню резать инициативу, ну блин. Добрее надо быть =)
sitev_ru а тебе посоветую:
1) Для начала спрашивать на эту тему у шарящих людей. Не бежать накатывать статьи, которые не несут почти никакой смысловой нагрузки.
1.2) Если таких людей нет под рукой, то хотя бы на тостере.
2) Статья хоть и глупая и отхватил уже за неё минусов, но не думаю что прям сейчас надо бежать и закрывать её. Оставь до завтра. Раз уж получил по макушке, то почитай хотя бы комменты, не глупые люди пишут. Получишь хоть какие-то отзывы. Подумаешь, осмыслишь, сбросишь карму (тут можно делать один резет) и попробуешь сначала, с работой над ошибками.sitev_ru Автор
16.10.2017 17:16+1Ну какие 12-14 лет? Я ещё писал на 4-х цветных БК-0010 =)
sitev_ru Автор
16.10.2017 17:22Это как раз было в 12-14 лет )))
SerafimArts
16.10.2017 17:34А, ну кто ж знал. Я судил по манере оформления статьи и качеству подготовки материала. У всех бывают ошибки =)
sitev_ru Автор
16.10.2017 18:01-1Это хитрый манёвр, возможно школьники хотя бы заинтересуются этой идеей? )
SerafimArts
16.10.2017 18:08Разве вы не считаете, что их стоит учить более простым, удобным и правильным подходам? А не, простите, отсебятине.
Я, конечно, понимаю, что такой способ реализации тоже имеет место быть, но способ проектирования дизайна языка — крайне плачевный. Просто посмотрите видюшку, что я кинул выше и поймёте почему я именно так выразился.sitev_ru Автор
16.10.2017 18:21Никого не хочу учить. Просто хотел поделиться мыслями и увидеть реакцию. Вот, например, теперь посмотрю Ваше очень полезное видео!
sitev_ru Автор
16.10.2017 17:21Ну не могу же я всё бросить на полпути? Развернуться и идти по этому пути. Мне мой путь кажется простым и понятным. Но, обязательно, изучу этот материал. Спасибо!
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: .;
sitev_ru Автор
16.10.2017 20:07Я когда рисовал диаграммы Вирта, смотрел РБНФ и подумал: может ли возникнуть такая ситуация, что у этого языка не хватит функционала? Не смог ответить на этот вопрос))
KvanTTT
16.10.2017 23:06Ну так грамматики более лаконичные, чем диаграммы. К тому же это текстовый формат. Просто вы не сталкивались с парсером настоящих больших языков.
По сути ваша спецификация и есть грамматика. Только почему-то там все по-русски.
dreka5
16.10.2017 17:05я бы посоветовал пропарсить вложенную лямбду с замыканием. уххх!!! та ещё прелесть.
как Cj справиться с этим.
без этого новый язык в наших реалях безсмысленно проектировать.
Он сразу проиграет котлину/расту и прочемуsitev_ru Автор
16.10.2017 17:07Нужно придумать какое-то универсальное решение по лямбдам и замыканиям. Пока не дошёл до них…
scoffer-by
16.10.2017 18:02-3Есть еще романтики в этом стаде велосипедофобов.
Автору успехов! Ну и грамотешки маленько.
Но карму в этой хабродемократии школоты попортят изрядно.
NeoCode
16.10.2017 20:09Объявлять переменные просто так, без предваряющего ключевого слова (или хотя-бы типа) — ИМХО не очень хорошо, потенциальный источник ошибок. В Go например применили специальный оператор :=, который можно использовать ТОЛЬКО для объявления с инициализацией, но не для присваивания, за счет чего случайно объявить переменную (по причине опечатки в имени другой переменной) уже невозможно — только намеренно.
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, так?
Для использование переменной в программе нужно просто указать её имя.
Идентификатор.
- Функция
Эм. Функции — это тип или не очень? А что касается области видимости внутри (и во вне) функции? А можно объявлять одну функцию в другой? А необязательные параметры? Вообще, они все обязательные или как?
Операции
Данная версия Cj поддерживает ограниченный набор операцийУх! Погнали. В js (во что вы собрались компилировать) если написать 6 / 4 закономерно получишь 1.5. Во что скомпилируется конструкция
int x; int y; x = 6; y = 4; return x / y;
Результат должен быть 1. Удачи.
P.S. Зачем я все это пишу вообще? Я буду удивлен, если выйдет хотя бы версия 0.2. А текущая версия даже на версию не годится, это как-то все само подразумевается, а вы умудрились в совсем уж очевидных вещах накосячить и сделать свой язык принципиально не соответствующий поставленной цели:
Меня всегда интересовали различные направления и веб я хочу сбацать и мобайл и десктоп и что-нибудь серверное готов написать, ещё мне интересены ИИ, игры, роботы, криптовалюты… И при этом, хотелось бы всё это писать на одном языке).
kahi4
16.10.2017 20:31+1Меня всегда интересовали различные направления и веб я хочу сбацать и мобайл и десктоп и что-нибудь серверное готов написать, ещё мне интересены ИИ, игры, роботы, криптовалюты… И при этом, хотелось бы всё это писать на одном языке).
Невероятно, но я прям сейчас могу на js писать под все перечисленные направления. И на практически любом другом языке, вопрос лишь в количестве инструментов и библиотек для этого. Исключение — системные языки программирования, так нужна определенная специфика. Впрочем, на js вон под микроконтроллер можно писать и ничего, как-то работает.
sitev_ru Автор
16.10.2017 21:06-1Отлично, спасибо за конструктивный комментарий! Чем double от real отличается? Ещё не знаю, скопировал из языка Д, видимо real больше double. Да, с делением проблема, конечно). Ну а так — версия 0.1 — это просто пробный шаг. Теперь я беру спецификацию, что-то добавляю к языку, что-то корректирую — это версия 0.2, реализую в коде, потом 0.3 и т.д., ну как обычно…
SerafimArts
16.10.2017 21:38Обычно, вначале пишутся спецификации языка, вроде таких: https://www.ecma-international.org/ecma-262/8.0/index.html, а потом реализуется язык. Единственным исключением, на моей памяти, у которого спецификация появилась после реализации — был PHP.
kez
16.10.2017 23:11потом 0.3 и т.д., ну как обычно…
Заголовок спойлераandreymal
17.10.2017 01:28Ну хочется человеку, пусть пишет.
Конечно пусть, только писать про это хабрапосты совсем не обязательно :) У меня тоже есть маленький самопальный язык с самопальной компиляцией (трансляцией?) в самопальный байткод с его самопальной интерпретацией, и всё это трудится на моём маленьком продакшене как простенькая числодробилка, но бежать писать посты про это я не собираюсь, там всё равно ничего интересного или уникального)
sitev_ru Автор
17.10.2017 06:26-1Конечно пусть, только писать про это хабрапосты совсем не обязательно :)
Надо обязательно писать такие посты, я не хочу, чтобы осталось, как у вас: где-то крутится у меня и всё! Наоборот, мне очень интересна стала эта тема и я хочу её развивать! В процессе обсуждения рождаются идеи, я читая комментарии тоже чему-то учусь, думаю, рассуждаю. Я обязательно где-то не прав, где-то ошибаюсь. Нельзя вариться в своём болоте. Хочу хотя бы доделать какой-то законченный вариант это поделки.kahi4
17.10.2017 08:25+1Вам вроде уже советовали почитать книгу драконов, да и в целом подтянуть теоретический минимум. Пересмотреть кучу спецификаций других языков, разобраться почему используются те или иные решения. Наверное, есть единственный язык на моей памяти, который стал популярный, но разрабатывался с одной лишь мыслью "в ж*** скобочки, будем табуляцией делать", и то его популярности способствовало много факторов, который нет у вашего языка на данный момент.
Идея писать системный код так же легко как на js — хороша. Да, компилируемый js-подобный язык, здорово. Я прям заинтригован. Даже слушаю внимательно, а то rust что-то не заходит, а вот C++, только с прототипами, утиной типизацией и синтаксисом js (ts) ммм [/sarcasm]. И я у вас не видел даже намека и планов на работу с памятью, а было бы интересно почитать, а без этого системное программирование не очень.
А пока что у вас получается только переизобрести typescript, только который ничего не умеет.
В общем — ссылку на компилятор в байт-код (или транслятор в C/C++, если так хочется), тогда поговорим. Либо сформулируйте цель языка иначе. Например "не нравится в какую сторону развивается typescript, нельзя писать public get и private set на одно поле одновременно, тупо же".
sitev_ru Автор
17.10.2017 08:57-1Как ни странно, книга драконов не дала чёткое понимание, ответ нашёл в Википедии)).
Задача сложная. Можно бесконечно рассуждать как лучше сделать. Я примерно вижу направление, сделал в этом направлении первый шажок. Теперь осматриваюсь, что дальше, куда дальше двигаться… Можно сесть, всё проанализировать, проработать на начальном этапе. Но боюсь после этого мне не захочется ничего делать, поняв сложность задуманного. Поэтому действую по интуиции, двигаюсь, в правильном, как я думаю, направлении и решаю проблемы по мере поступления.
sitev_ru Автор
17.10.2017 09:24-1Идея писать системный код так же легко как на js — хороша. Да, компилируемый js-подобный язык, здорово. Я прям заинтригован.
. Давайте с вами развивать эту тему? Поясните, как Вы это себе представляете.
Roumed1
17.10.2017 12:48Идею личной пробы одобряю, но как и многие до меня призову Вас задуматься, как сделать так, чтобы постфактум на этом проекте не появилась жирная надпись «ПОТРАЧЕНОе даром время».
sitev_ru Автор
17.10.2017 13:00-2Спасибо. Но смущает, что другому автору статьи вы написали коммент получше: «Вашей смелости и амбициозности остается только позавидовать.» ))
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 и т.д.).
В общем, я, также, как и многие здесь, предлагаю от этой затеи отказаться и лучше отлично разобраться в каком-то языке. Иначе это просто время, потраченное впустую.sitev_ru Автор
17.10.2017 15:23-1Судя по вашему подходу к разработке (тотальное нежелание разбираться в инструментах, которые призваны упрощать разработку новый языков
Зачем мне изучать чужое, если я написал своё и оно уже работает?
нежелание оформить proposal зачем это все вообще нужно и т.д
Я потратил несколько часов на ответы на комментарии, если это не прояснило ситуацию, ну извините…
lair
17.10.2017 15:27+1Зачем мне изучать чужое, если я написал своё и оно уже работает?
Разве работает? Последний раз когда смотрели, ничего толком не работало.
sitev_ru Автор
17.10.2017 18:13-1Пришлось снять разработку на Cj и выложить в интернет )))))))
youtu.be/zwUhDOVifdwlair
17.10.2017 18:28Вам рассказать, как такое сделать на
string.Replace
? Вот когда у вас будет хотя бы минимальный работающий код на выходе (т.е., тот, который можно запустить и увидеть результат), и хотя бы для двух языков — тогда и поговорим. Начните с банального вывода в консоль.sitev_ru Автор
17.10.2017 20:02Но если разобраться, то внутри явно не string.Replace, а работает лексер, парсер и генератор… ладно, проехали… сейчас план такой:
1. Добавлю операторы условия и цикла (а то уж совсем)
2. Добавлю возможность подключать внешние функции, типа вывод в консоль
3. Делаю и для js и для с++
Ну и тогда опять сюда, получать очередную порцию полезной критики))
lair
17.10.2017 20:46Беда в том, что вы быстро наткнетесь на то, что нынешнего парсера вам не хватает — языковые конструкции-то все усложняются.
sitev_ru Автор
17.10.2017 21:03Ну что там может не хватать? Это же не какая-то левая библиотека, это же не какой-то чёрный ящик, я сам писал, и я уверен в нём, если надо допишу, переделаю, всё норм
lair
17.10.2017 21:07Интерфейсы, вообще вся ООП-машинерия, лямбды, паттерн-матчинг, обработка ошибок...
(это вот если не задумываться)
oYASo
17.10.2017 19:14Зачем мне изучать чужое, если я написал своё и оно уже работает?
Без комментариев.
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 в студию.
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 году вроде можно обойтись без неё. Если нужно, будет обходной вариант. Язык же предполагается невероятно гибким! ))kahi4
18.10.2017 00:14int 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 Автор
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.kahi4
18.10.2017 09:12+1Спасибо за такую честь, но пожалуй не стоит объяснять криворукость парадоксами.
Math.floor не подойдет, потому что при отрицательных числах должен быть Math.ceil, ну и я молчу про то, что тогда может оказаться большой (и критичной, если идет речь про расчеты индекса в массиве) накапливающаяся ошибка в рассчетах, длинее чем 1 оператор. ( 6 / 4 ) * 200 например.
Про float — спасибо, в топку язык, код на котором ведет не консиснтентно. А так хорошо звучало, хотите язык для написания криптовалют, там неплохо было бы работать под видеокартой, GPGPU на языке, близком по стилю к js — здорово же, да еще с возможностью отладить это прямо в браузере.
Хотя, на такой случай, возможно, есть какие-то библиотеки на Javascript.
Ради простого умножения двух float друг на друга тянуть библиотеку на js?
В общем вам тут хотят помочь понять почему нужно делать так или иначе, а вы еще не придумав операций сравнения умудряетесь всунуть в язык костыли, причем не имея под этим никакой необъодимости а просто потому что.
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
А вот задор автора энтой поделки заставляет вспомнить про эффект Даннинга-Крюгера — вопиющая некомпетентность не позволяет ему осознать очевидные проблемы.
sitev_ru Автор
18.10.2017 21:23Да, спасибо, я в Javascript не силён, тем более его тонкости математики, знаю Javascript на уровне вызова из него JQuery )). Специализируюсь на другом. Я и в компиляторах не специализируюсь, но пишу: глаза бояться — руки делают, разберусь…
По-первому примеру думал так сделать: var z = x / y ^ 0;
За 2-ой пример, конечно, спасибо… Сильно!
На самом деле, эти тонкости на текущем этапе безразличны. Но на будущее, конечно, большое спасибо! Очень интересно!
вопиющая некомпетентность не позволяет ему осознать очевидные проблемы
Ещё раз повторюсь, что на javascript не специализируюсь. Эти очевидные проблемы на 1-ом этапе на мою задачу никак не повлияютlair
19.10.2017 01:05Да, спасибо, я в Javascript не силён, тем более его тонкости математики, знаю Javascript на уровне вызова из него JQuery )). Специализируюсь на другом.
А в чем вы сильны/специализируетесь?
mwizard
19.10.2017 07:52+2А я и не про JS. Ваша некомпетентность не ограничена такими скромными границами, она всеобъемлюща.
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];
kahi4
18.10.2017 23:21А вообще я уже вижу рантайм этого языка:
- при запуске выделяется UInt8Array размера под статические переменные, а каждая переменная транслируется в структуру:
{ name, type, pointer }
Маллок просто расширяет этот массив на заданное количество байт, а так же возвращает указатель. Мемфри — ну понятно, по аналогии. Можно даже реализовать unsafe code и дать прямой доступ к указателям! Код с прямым доступом к указателям, который компилируется в байткод под виртуалную машину на js! Не круто ли? Не этого ли мы хотели?
- при запуске выделяется UInt8Array размера под статические переменные, а каждая переменная транслируется в структуру:
kahi4
18.10.2017 00:25+1В 2017 году вроде можно обойтись без неё.
Хоть в 2050 году эта функция будет нужна. Хорошо, можно обойтись без нее, тогда приведите модель работы с памятью вашего языка. Например, где вообще создаются переменные? В куче? В стеке? Как получится? А динамически выделяемая память? Ах да, вы язык разрабатываете, вам не до таких мелочей, когда понадобится, тогда и подумаем. Хорошо самолеты делают не так, а то шасси бы разрабатывали когда самолет уже в воздухе и пора садиться.
Если вы не собираетесь использовать этот язык как системный, то никаких преимуществ перед js, Kotlin, Python, PHP, C#, Java, [любой другой язык прикладного уровня] вы не показали, а синтаксис пока что вы предлагаете несостоятельный. (А если собираетесь, то еще и перед Rust, D, да даже плюсы). В чем тогда идея?
sitev_ru Автор
18.10.2017 09:07-2Хоть в 2050 году эта функция будет нужна.
В Javascript не нужна, да и в С++ от неё отказались
Хорошо, можно обойтись без нее, тогда приведите модель работы с памятью вашего языка. Например, где вообще создаются переменные? В куче? В стеке? Как получится? А динамически выделяемая память?
Пока предполагаются только динамические массивы: sitev.ru/post/174
Ах да, вы язык разрабатываете, вам не до таких мелочей, когда понадобится, тогда и подумаем. Хорошо самолеты делают не так, а то шасси бы разрабатывали когда самолет уже в воздухе и пора садиться.
Совершенно верно, это не самолёт, это программа. В этой задаче я не работаю на дяденьку, а пишут в своё удовольствие. Если нет полного описания, значит я так решил или пока не продумал до мелочей как будет и это правильно!
Если вы не собираетесь использовать этот язык как системный
Конечно, собираюсь!
то никаких преимуществ перед js, Kotlin, Python, PHP, C#, Java, [любой другой язык прикладного уровня] вы не показали, а синтаксис пока что вы предлагаете несостоятельный. (А если собираетесь, то еще и перед Rust, D, да даже плюсы).
Синтаксис более минималистический, более чистый. Преимущества есть, но очевидны, если понять идею того, что я делаю.
В чем тогда идея?
Вроде распинался несколько часов, или уже даже дней, отвечал на комментарии, а вы всё не смогли понять идею. Странно. Идея такая: пишу на Cj и генерирую в Javascript или С++ или любой другой язык и поэтому я могу выполнить любую задачу заказчика на одном и том же языке программирования!
Теперь понятна идея? Разве это не круто? ))lair
18.10.2017 09:29+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]; //а теперь?
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]; //а теперь?lair
18.10.2017 11:37+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...
KvanTTT
17.10.2017 14:41+1Автор либо тролль, либо у него что-то не в порядке с головой, либо просто недалекий.
retran
18.10.2017 09:57+1У меня вот есть такое — github.com/retran/my-little-lispy-experimental
Там есть маленькая виртуальная машина, статические скоупы, динамическая строгая типизация, лямбды, замыкания, оптимизация хвостовой рекурсии, примитивный remote repl… И, да, там тоже свой лексер и парсер. И даже мотивация была — DSL-движок, для описания всяких игровых моделей.
Вот только я довольно хорошо осознаю «серьезность» проекта, не тащу его на хабр, и в пет-проджекте использую банальный Lua, а на работе — проприетарный скриптовый язык с 20-летней историей.
Зачем вы принесли вот это на хабр и что у вас на самом деле есть?sitev_ru Автор
18.10.2017 10:34-2Зачем вы принесли вот это на хабр
Как я понимаю, Хабр — это площадка для ИТ-специалистов, где человек выкладывает статью на какую-то интересующую тему его и сообщество обсуждает это.
Куча статей просто не о чём, хотя на такие же темы:
habrahabr.ru/post/236907
habrahabr.ru/post/274083
и т.д…
Моя статья даже поинтереснее будет, как мне казалось. Но видимо ошибался.
Человек разрабытывает транслятор/компилятор. Сложная тема, интересно услышать мнение специалистов. Я не специализируюсь на разработке компилятора, интересно услышать спецов, в принципе, и я услышал…
А это что за комменты?Автор либо тролль, либо у него что-то не в порядке с головой, либо просто недалекий.
такие оскорбления запрещены правилами Хабра. И где модератор? Нету )
Там есть маленькая виртуальная машина, статические скоупы, динамическая строгая типизация, лямбды, замыкания, оптимизация хвостовой рекурсии, примитивный remote repl… И, да, там тоже свой лексер и парсер. И даже мотивация была — DSL-движок, для описания всяких игровых моделей.
У вас всё сложно, поэтому и осознали сложность, а у меня всё намного проще и реально реализуемо, хотя есть и большие минусы, мне их указали комментаторы, но я о них даже не задумываюсь, потому что плюсов в моей идее намного больше!retran
18.10.2017 16:53+1То что я перечислил — реализовано и работает. Синтаксические макросы не упомянул, они тоже есть.
Вот только до реального применения все это еще пилить и пилить.
retran
18.10.2017 16:59+1К слову, «серьезность» я взял в кавычки не потому что там что-то сложное, а потому что я не считаю свой лисп какой-то серьезной работой, готовой для представления или какого-то реального использованя.
Zenitchik
18.10.2017 17:31+1А чем чёрт не шутит, я вот пишу язык с лисп-подобным синтаксисом (но совсем не лисп-подобной структурой данных) для применения в качестве кода, которым нестандартные данные могут быть представлены в JSON. Пожалуй, моя поделка заслуживает ещё меньшего внимания, чем Ваша, однако область применения есть (собственно, от неё и плясал).
sitev_ru Автор
18.10.2017 17:54-1Ну вот, постепенно объявляются люди, которые тоже ваяют свои языки, компиляторы и т.д… А можно посмотреть код Вашего языка? Он опенсоурсный?
vintage
18.10.2017 18:19Не хотите ли рассказать о своей идее по подробней?
Zenitchik
18.10.2017 18:23+1Пока не хочу. Слишком оно сырое.
rraderio
19.10.2017 11:31«The Lux Programming Language» by Eduardo Julian
www.youtube.com/watch?v=T-BZvBWiamU
sitev_ru Автор
Статья резко пошла в минус. Яж писал «вздох разочарования, 99% выкинули свои компьютеры в окно, ну а для тех кто остался, я продолжу». Это статья, кому интересно писать свои компиляторы))
Merlen_Gross
Тем, кому интересна эта тема, читают специализированную литературу и практикуются без попыток увеличения ЧСВ через написание статей, чья выжимка выглядит как "смотрите чё могу посоны".
sitev_ru Автор
Не соглашусь с Вами. Я пишу язык и хочу привлечь ещё людей. Вдруг найду единомышленников?
curunir
Хорошо, я понимаю, вы не хотели чтобы статью восприняли в негативном ключе, но даже если так — чем же вы думали привлечь единомышленников? За исключением
вы не описали вообще ничего в рамках статьи. Причём даже то что описано — показывает вас как профессионала с не самой лучше стороны.Возможно, вам стоило сначала как следует рассмотреть развивающиеся проекты подобного рода и получше разобраться в вопросе.
sitev_ru Автор
Например, какие проекты?
aamonster
Таких, чьё мнение стОит учитывать — не найдёте.
Мне нравится ваш энтузиазм, сам таким же был в 15, но вы не описали потенциальных преимуществ своего языка (мелкие изменения в синтаксисе — ерунда, к таким деталям привыкаешь за день), ни деталей его устройства (вы хотя бы понимаете принципиальную разницу между c++ и javascript? Ну, помимо того, что один компилируется, а другой, если не повезло, интерпретируется?)
И с ходу отбросили llvm и т.п. — похоронив надежду сделать хорошую оптимизацию в своём языке.
В общем, привлечь сможете только таких же юных энтузиастов, а нужен суровый наставник :-)
sitev_ru Автор
Я постарше… Возможно старше Вас )
aamonster
Тем лучше для вас — в 40 с гаком приятнее быть молодым энтузиастом, чем старым пессимистом :-).
Тем не менее, вам сейчас нужен именно пессимист, который будет задавать неприятные вопросы (вообще говоря, основные вопросы вроде "какова цель", "в чём преимущества" и "чем за них придётся платить" должны были задать вы сами и сами дать ответы на них в статье).
Кстати, тут уже всплыла следующая проблема — библиотеки. Язык, если вы не делаете качественную оптимизацию — ерунда, думаю, тут у многих в истории болезни как минимум написание интерпретаторов. Но вы же замахнулись на переносимость. Как вы себе представляете эффективную библиотеку, единую для C и JavaScript?
Собираетесь ли вы в своём языке предоставить GC? Дать доступ к raw pointers? Поддерживать замыкания? Это всё — ключевые вопросы, меняющие структуру языка куда сильнее, чем изменения в синтаксисе, которые вы описали в статье.
sitev_ru Автор
Понятно, что такие разработки удел компаний типа гугл, даже яндекс и майлру вроде не написали своего языка. Зачем мне задаваться такими сложными вопросами, если я до них без помощи таких монстров даже и не дойду.
Сейчас вырисовывается такой план:
1. Сделать трансляцию в Javascript
2. Сделать трансляцию в С++ и чтобы работало одинаково с Javascript
Далее я идут в яндекс/гугл/майру, беру у них несколько миллиончиков зелёненьких на разработку и дело в шляпе. Если не дадут бабки — будет просто язык, на котором буду писать только я сам, и возможно, несколько единомышленников…
aamonster
Не дадут, разумеется. И единомышленников, которые помогут — вряд ли найдёте.
Сделать нечто, транслирующееся и в js, и в c++ — несложно. Только возможности будут несопоставимы ни с тем, ни с другим — просто потому, что вы унаследуете ограничения обоих.
Я не зря спрашивал про gc/указатели/замыкания. Это ключевые моменты, влияющие на внутреннее устройство языка, а не синтаксический сахар, про который вы говорили в статье.
sitev_ru Автор
Кстати, дайте совет? Может Вы что-нибудь дельное предложите. Я просто пока не задумывался над этим вопросом. Вдруг мне подкинут пару миллинчикофф на разработку языка. Тогда Ваш труд не пропадёт даром, я с вами обязательно поделюсь!
Кстати, где карма? Где публикации?
sayber
У нас половина сообщества за 35-40 лет.
andreymal
А почему единомышленников должен заинтересовать ваш «язык», если любой мало-мальски вменяемый программист может написать то же самое или даже лучше за несколько дней? :)
sitev_ru Автор
Я уже что-то написал, теперь подключается другой программист и тратит несколько дней и дописывает имеющееся, а не пишет заново)) Вот моя цель этой статьи))
alisa_musik
А мне понравилось. Язык простенький, как раз для меня!
P.S. Гомерчик прикольный!
alisa_musik
Зачем минусуете?
EvilGenius18
Скорее для тех, кому нравится делать что-то абсолютно бесполезное.
Не надо учить людей изобретать свой велосипед для каждой задачи.
Открытые проекты для того и существуют, чтобы люди могли создавать что-то полезное, используя уже готовые и хорошо протестированные сотнями разработчиков, инструменты, чтобы никому не приходилось тратить 20 лет на создание своих инструментов с нуля для каждого проекта
sitev_ru Автор
Речь не идёт о 20-ти годах. Да, возможно, несколько месяцев.
EvilGenius18
А исправление багов и закрытие уязвимостей? Или и так сойдет?
Для чего нам будущее, в котором будут сотни проектов, наполненные багами и уязвимостями, написанные с нуля недо-разработчиками?
sitev_ru Автор
У меня нет финансирования, я пишу в свободное время. Дайте бабки, исправлю баги и уязвимости). Да и давайте закроем ГитХаб. Что-то они там пишут, слишком много говнокода!
EvilGenius18
Дело не в финансировании. Писать свои языки программирования это плохая идея, если он не предлагает чего-то совершенно революционного для большого количества разработчиков.
Кто захочет переписывать все библиотеки с Python для нового языка только потому, что он новый? Ни у кого на это нет времени
А гитхаб это прямой пример того, о чем я говорю:
— берем существующий проект / инструмент с исправленными багами и закрытыми уязвимостями, проект на который уже была потрачена тысяча часов работы.
— улучшаем этот инструмент, вместо того, чтобы писать свой с нуля
sitev_ru Автор
Не пойму, я хочу написать свой язык программирования. Какой проект я должен взять с ГитХаба?
EvilGenius18
Для этой цели никакой. Лично я думаю, свой язык программирования стоит писать только, если он способен изменить что-то в мире разработки кардинально. Иначе зачем он нужен?
Если вы уверен, что он таковым является, тогда стоит описать его преимущества и принцип работы в формате так называемой white paper, чтобы профессиональные разработчики заинтересовались и помогли написать.
Если же вы не уверены, что этот язык настолько хорош, что многие разработчики бросят свои Python, C, JS и перепишут все существующие фреймворки и библиотеки ради него, тогда, для кого он будет нужен?
sitev_ru Автор
Запросто! Итак, ко мне обращается заказчик и говорит. Хочу веб сайт. Я беру Cj лабаю на нём сайтик. На выходе html/js/css/php или nodejs. Сдал работу заказчику. Обращается второй заказчик и говорит мне — напиши мобайл для андроид и для айос. Я беру Cj и пишу один код. На выходе для андроида — java, для ios — ObjectC. Тут обращается следующий заказчик — ему я пишу серверное приложение, на выходе C++ или какой-нибудь Erlang. Хочу игру на Unity. Опять беру Cj — упс — игра га юнити) и т.д. и т.п...)
SerafimArts
Что-то мне это напоминает: haxe.org и не особо он взлетел, хотя сообщество огромное. Догадываетесь почему? =)
sitev_ru Автор
Меня устроит, если язык добавят в хотя бы в Википедию. ))
lair
То есть у вас в Cj еще и разметка будет?
sitev_ru Автор
Пока не знаю… Это как идея. И разметка и css на Cj! ))
lair
Вы пытаетесь сделать god language. Не взлетит.
sitev_ru Автор
Ближайшая цель — добавить в язык ещё несколько конструкций и генерить Javascript, свой Typescript. Что дальше — потом будет видно.
lair
Совершенно не понятно, зачем добавлять в свой язык конструкции, чтобы генерить из него JS/TS (или другой язык), если можно просто взять JS/TS, из которого генерить все остальное.
Какой профит от собственного языка?
sitev_ru Автор
Да, я понял Вашу мысль. Можно делать, как Вы предлагаете. У меня не возникло такой мысли. Видимо, хотелось сделать какой-то более чистый синтаксис. Ну пошёл по такому пути.
lair
Получилось?
sitev_ru Автор
Вроде бы, хотя не факт. Вы что предлагаете взять TypeScript и генерить из него под все платформы? Вы будете участвовать в написании такой штуки? (К сожалению, отвечаю редко, потому что хабр запрещает мне отправлять компилятор чаще, чем 1 раз в 5 минут)
lair
Я предлагаю взять какой-нибудь устоявшийся язык, с большим тулсетом, и генерить из него.
Нет, я считаю это гиблой идеей.
mayorovp
C# так уже умеет, только не для целых программ, а для выражений.
Я работал как минимум с двумя библиотеками которые, фактически, умеют превращать C# в SQL и с одной которая умеет превращать C# в Javascript (и я исправлял ошибки последней — так что можно сказать что участвовал в написании, правда это было в закрытом форке).
zagayevskiy
Ну, вы в курсе про Kotlin, да? Андроид и веб есть, натив, вроде тоже. Посоны 5 лет писали до версии 1.0.
sitev_ru Автор
А если хочу в айос?
staticlab
Kotlin Native компилируется в нативный байткод через LLVM.
Nagg
и что с ним на айосе можно делать?) Хеллоу ворлд написать?
staticlab
Точно не могу сказать, но, вероятно, библиотека классов позволит написать и что-то посложнее.
Во всяком случае, можно писать кроссплатформенные игры, например, на SDL или на движке с поддержкой SWF.
sitev_ru Автор
Выбираем движок Unity, Unreal и любой другой — тоже можно писать кроссплатформенные игры под все платформы.
staticlab
Тогда зачем нужен Cj, если есть Unity?
Nagg
Ок понял, значит не нужно. Когда будет полноценный UI фраемворк + интеропобилити с 3rd party тогда поговорим — а так это очередное "Смотрите, я скомпилировал свифт под андроидом!"
staticlab
Под полноценным "фраемворком" (откуда, кстати, пошла мода на такое коверканье?) имеете в виду кроссплатформенный фреймворк?
Nagg
Не обязательно — любой нормальный, позволяющий как минимум так же быстро создавать приложение по гайдлайнам ос как и нативные инструменты. Все поделка на коленках и игровые движки идут лесом.
sitev_ru Автор
Возможно, Хабр слишком серьёзный сайт. На каком сайте можно представить разработки начального уровня, где пока что толком ничего не работает, но чтобы услышать добрый совет или какую-либо помощь?
SerafimArts
На Тостере, подозреваю.
zagayevskiy
Это я к тому, что команда разработчиков, получающих по 200.000р в месяц, полировала язык 5 лет, и всё ещё не закончила. Тут вылезаете вы с вопросом "А если хочу в айос?", в то время как у вас не компилятор, а транспилятор, который умеет 0.01% псевдо-джаваскрипта переводить в джаваскрипт 1-в-1.
sitev_ru Автор
Отлично, возможно, мой язык — это Kotlin. Заинтересовался, придётся изучить этот язык)). Но и свою поделку уже врядли брошу. Буду развивать дальше)
zagayevskiy
До чего жырный тролль.