Комментарии 32
Ничего себе размер статьи
Подумал, что здесь весь язык будет расписан с его синтаксисом
Подумал, что здесь весь язык будет расписан с его синтаксисом
Почти угадали
Так как это первый полны релиз, то размер статьи действительно получился ощутимый. Тут уж ничего не поделаешь. Но зато теперь можно будет маленькими частями подавать его особенности, а если кто захочет сразу полное описание, то можно давать ссылку сюда.
По-моему не хватает нескольких строк о том, какую проблему решает этот новый язык.
На текущем этапе - создать непротиворечивую грамматику языка программирования без использования ключевых слов, которая могла бы легко интегрироваться с основными языками программирования, например, как надстройка над уже существующим синтаксисом. Хотя это я уже писал в начале статьи.
А глобально какие цели?
Давайте не будем бежать далеко вперед и ограничимся хотя бы 3-5 годами.
За это время цель минимум - быть живым и рабочим языком с JIT компилятором и с не менее чем 100 активными пользователями. Максиму, попасть в TIOBE Index :-)
Это не очень хорошая цель. Зачем людям писать на языке, цель которого - быть живым языком?
Обычно язык появляется как решение каких то проблем, а не просто так
Сам по себе язык, это просто инструмент, который можно использовать для решения проблем пользователя, но сам он не имеет никакой цели. Я же писал про свою цель, как автор языка. И надеюсь, что NewLang станет удобным инструментом для решения проблем пользователей, у которых программирование не является основной профессией.
Сам по себе язык, это просто инструмент, который можно использовать для решения проблем пользователя, но сам он не имеет никакой цели
Как бы красиво это не звучало, в реальности мы видим ровно обратную картину, с тучей языков(казалось бы зачем, если все так просто). Проблемы и задачи которые решают эти языки, могли сформироваться с течением времени и/или изначально обозначены.
И надеюсь, что NewLang станет удобным инструментом для решения проблем пользователей, у которых программирование не является основной профессией
Эту проблему язык никак не решает, так как она в целом очень странная. Если вы целитесь в совсем не понимающих ничего в программировании людей, то хотелось бы посмотреть как они собрали бы..."Интерпретатор?"...даже по инструкции. Если в тех кто понимает хоть чтото(да даже если не понимает), то JS выглядит куда привлекательнее во всем
Есть цель, а есть проблема. Проблема - это то, что мешает (бизнесу).
Хотя это я уже писал в начале статьи.
То, что вы написали, является неплохой академической целью, но никак не мешает бизнесу. Если инструмент не решает никакую проблему - он бизнесу не нужен. Если решает проблему, для которой уже есть привычный инструмент - аналогично.
Используется сборщик мусора? Какая примерно производительность в сравнении с другими языками?
Сборщик мусора в явном виде не используется, т.к. все объекты, это std::shared_ptr из С++, а у них подсчет ссылок ведется автоматически.
Производительность специально не замерял, да она будет очень сильно зависеть от теста т.к. для работы с тензорами используется нативная библиотека libtorch. Парсер синтаксиса очень простой, а и вызовы ядра происходят напрямую без генерации промежуточного кода.
Ответа на вопрос «Зачем?» так и не увидел, но зато увидел «Зачем не надо»:
Синтаксис не прост и не логичен, наоборот, конструкции выглядят ужасно (при том что я знаком с питоном, си, js, ts, php и кучей шаблонизаторов, тут синтаксис хуже всего что я видел);
Нет сообщества;
Надо учить ещё один, достаточно «оригинальный» язык;
Отсутствие готовых решений, библиотек;
Отсутствие коммерческих задач;
Отсутствие понимания, какие прикладные задачи решает этот язык;
Новый язык должен решать задачи, которые старый решить не может, либо делать это эффективнее. Значительно, чтобы время на изучение и написание своих решений вместо готовых компенсировалось
Так в самом начале ссылка на мнение автора про зачем :-)
А по мне, например, если не пробовать создавать новое, то через ХХХ лет ничего нового и не появится
Спасибо за поддержку!
Действительно морально устаешь отвечать на вопросы, ответы на которые подробно расписаны в самой статье.
Вообще идея создать полноценный язык - предельно круто.
Тем не менее вопросов очень много ?♂️
Тут многие говорят про нишу и это действительно важно уже сейчас - если не будет задач, которые удобнее делать так, а не на одном из современных языков, то не образуется сообщество и язык умрет, маркетинг, формирование рынка, никто не отменял - это не придирка, а совет сообщества :-)
Сама по себе идея «синтаксис без ключевых слов» - тоже тот ещё вопрос. Кроме заявленного «усложнения» ключевые слова решают вполне конкретную проблему: облегчает анализ текста. Естественные языки легко читать, но сложно анализировать, чтобы найти нужное место в свободном тексте, нужно весь этот текст прочитать. Чтобы найти нужное в тексте на ЯП, можно пользоваться ключевыми словами, как якорями.
Короче вопросов много - будем следить за успехами. Спасибо, что не ленитесь писать
Спасибо за добрые пожелания!
В статье я писал, что в настоящий момент ориентируюсь на нишу задач тензорных вычислений и быстрого прототипирования. По сути, это ниша Python и других языков для обучения и научных исследований, но на кодовой базе C++.
Синтаксис без ключевых слов ставит главную цель, создать основу для реализации полноценных DSL диалектов. В следующей версии, про это я тоже писал в статье, будут добавлены макросы (префикс бэкслэш "\"), с помощью которых можно превратить универсальный синтаксис в более привычный текст, и вместо:
count:=5;
[count<10]-->>{{
[count>5]-->{
--100--;
};
count += 1;
}};
Можно будет писать вот так:
count:=5;
\while(count<10) {{
\if(count>5) {
\return(100);
};
count += 1;
}};
Так не увидел не только в этом мнении, но и между строк. Увидел только аргументы против.
Пробовать, определенно, стоит – и начинать стоит с целей и задач. Тогда и вероятность сделать что-то значимое возрастает экспоненциально.
Например, глядя на Golang и php – на конструкции языка и бенчмарки – я могу сказать, что звучит убедительно, или, по крайней мере, интересно.
Тут же я вижу массу потраченных усилий (безусловно, проделана колоссальная работа) – к сожалению, в результате выглядящих, как два шага назад, потому что, на мой взгляд:
Цель ради цели;
Сложная реализация, синтаксис ужасен, даже если допустить, что есть целый сегмент прикладных задач, которые можно решить только на этом языке, а это не так.
Интересно, но не понятно - зачем.
Не очень понятны плюсы этого языка над уже существующими вроде Python. Так как синтаксис для тех, кто не заканчивал CS и не работал с C/C++, выглядит очень перегруженным
Основные проблемы языка указали комментаторы выше. Попробую зайти с другой стороны:
Было бы отлично зафиксировать "язык реализации": т.е. используем только ???. Вот только, наверное, лучше НЕ использовать C/C++: у программистов этих языков есть свои библиотеки на те же тензоры и им сильно новое особо не нужно. Тем более не понятно, что с производительностью: сишники не любят лишние расходы "ни на что".
Ещё не раскрыт вопрос с "много-исходников". Периодически создаются языки, нацеленные на единый файл исходников. Но мало у кого (никого?) получалось остаться в этой логике. Поэтому: как писать в нескольких исходных файлах и это всё срастить? Срастить с использованием внешних исходников "языка реализации"?
В результате:
соглашусь с предыдущими комментаторами: НУЖНО определиться, какую проблему решает новый язык?
Пример-Аналогия: Эсперанто самый распространённый искуственный язык (по мнению википедии). Но изучают почему-то английский, китайский. Даже дотракийский (который вот нафиг не нужен). Эсперанто? Ну-у-у, а зачем?
Поэтому задел с языком "прикольный". Найдите нишу! Например, выгрузка математических тензорных "формул/монад/..." в вычислимое "нечто".
Было бы отлично зафиксировать "язык реализации": т.е. используем только ???.
Задам тот же вопрос, зачем?
Зачем фиксировать язык реализации, если одна из основных целей - создание универсальной грамматики не зависимой от языка реализации.
Из Вашей постановки об языке следует, что есть Основной синтаксис (универсальный), и Расширенный синтаксис.
Расширенный синтаксис позволяет сделать тот функционал, который не покрывается базовыми вещами.
Вообще очень много языков программирования (чуть менее, чем все?), которые позволяют делать "странные" вещи: начиная с вызов функций из внешних динамических библиотек, продолжая записью в аппаратные пины на материнской плате, пляски с GPU и многое, много другое. И да, рано или поздно почти всем требуется запрограммировать что-то "странненькое".
Однако, очень часто (всегда?) для программирования этих "странных" вещей не нужно учить новый язык. И работа с тем-же динамическими библиотеками может быть как простой из под чистого C или с рядом тонкостей из (например) Python. Но питониста не заставляют учить C.
К чему все эти измышления: Если нужно программировать "странные" вещи, то пусть это будет тот же язык, возможно с "прибабахами". Если ли же невозможно это сделать штатными вещами, то будет лучше, если человек будет знать, с чем придётся работать. Иначе может быть цирк: написал расширенный синтаксис на C, а потом вдруг всё переигралось на питон. Э-э-э, и что теперь: сишный код на питон переписывать?
Мне видится немного другой подход. Расширенный синтаксис нужен как временное исключение, если нельзя сделать по другому. Но если вы реализуете на нем большую часть логики, то зачем вам вообще выбирать этот язык? Ведь не только инструмент должен подходить для задачи, но и нужно уметь этим инструментом пользоваться. И если вы лучше всего знаете Питон, то и пишите сразу на нем.
А если вы пишите сразу на С/С++, то лучше сразу его и использовать. Тем более, и Python и NewLang поддерживают вызовы нативных сишных функций. В статье даже пример есть: printf := @import('printf(format:Format, ...):Int');
Зачем все усложнять, если одной командой можно импортировать сишную функцию и использовать её в дальнейшем как нативную без использования вставок на языке реализации?
Деревья выражений есть?
Уточните пожалуйста.
Интересует https://en.wikipedia.org/wiki/Binary_expression_tree (по сути, форма представления AST) или речь идет об аналоге LINQ из С# с вычислением в виде деревьев выражений?
Я подразумевал ближе к linq
Примерно так и думал, но сперва решил в этом убедится. Ответ и да и нет. Нет, в том смысле, что отсутствует сама возможность записи запросов.
И все же ответ скорее Да, так как выборки делать можно за зачет применения обычных и лямбда функции в качестве фильтров данных в итераторах, т.е. выборки делаются не за счет вычисления деревьев выражений, а с помощью вызовов функций.
И надеюсь, что NewLang станет удобным инструментом для решения проблем пользователей, у которых программирование не является основной профессией
Ну вот даже не знаю. Пример из статьи:
func_and(arg1, arg2) :&&= arg1==3, arg2 > 0; # Простая чистая функция Логическое И
Даже, как программист я не понимаю что тут написано и почему результат будет именно логическое И
Многие ругают Rust за много спецсимволов. Но тут, по-моему, перебор. Приходите к нам, у нас есть такие разные вещи, как "->", "-->", "-->>", "~>", "~~>". Визуально это различать крайне сложно.
"" ++ 123; # "123" - Строка широких символов
'' ++ 123; # '123' - Байтовая строка
То есть, такой штуки, как один Char нет варианта? Это всегда будет строка из одного символа? Я имею в виду: как объявить переменную, хранящую один юникодный Char?
Имена встроенных арифметических типов говорят сами за себя: Char, Short, Int, Long,
Нет, совсем не говорят. Помятуя С/С++, там short/int/long зависят от разрядности процессора. И допольнительно вопрос: а что с int128, который в Clang/GC уже поддерживается вроде как? Ему будет выделено новое какое-то слово? Назвав int16/int32/int64 сразу бы убили двух зайцев: и добавлять более длинные типы проще, и программист сразу видит что это без гадания "а зависит ли тут Int от разрядности процессора?"
$var = 0,5; # Ошибка!!! Short ← Float не совместимы
Запятая, как разделитель целой и дробной части? Или у вас зависит от локали? В обоих случаях, за пределами России (ну и где там ещё запятая) продвигать язык будет тяжко. А в последнем случае(при использовании локали) ещё и почти нереально: американский разработчик не сможет вот так взять и подключить модуль русского программиста.
Даже, как программист я не понимаю что тут написано и почему результат будет именно логическое И
Синтаксис простых функций заимствован из определения предикатов в Прологе, где утверждения просто перечисляются через запятую. Только он расширен за счет обычных логических операций.
Многие ругают Rust за много спецсимволов. Но тут, по-моему, перебор. Приходите к нам, у нас есть такие разные вещи, как "->", "-->", "-->>", "~>", "~~>". Визуально это различать крайне сложно.
Много спецсимволов, это действительно беда. Поэтому в следующей версии будут реализованы макросы, с помощью которых можно будет определить свой вариант DSL и использовать мнемонику в том числе и для замены операторов.
То есть, такой штуки, как один Char нет варианта? Это всегда будет строка из одного символа? Я имею в виду: как объявить переменную, хранящую один юникодный Char?
Один Char (как одиночный символ), это тензор, а не строка. А если нужна именно строка с одним символом, то строку нужно определять в кавычках.
Назвав int16/int32/int64 сразу бы убили двух зайцев
Эти определения заимствованы из реализации libtorch, определяются однозначно и не зависят от процессора. А вот переименовать с учетом разрядности, может быть в этом и имеется смысл. Хотя разрядность 128, 256, 512 и т.д. то заводить такие размерности нет даже в планах, т.к. планирую добавить Bigint без ограничений размерности для точных вычислений.
Помятуя С/С++, там short/int/long зависят от разрядности процессора. И
допольнительно вопрос: а что с int128, который в Clang/GC уже
поддерживается вроде как? Ему будет выделено новое какое-то слово?
Назвав int16/int32/int64 сразу бы убили двух зайцев: и добавлять более
длинные типы проще, и программист сразу видит что это без гадания "а
зависит ли тут Int от разрядности процессора?"
Подумав над предложением, я и в самом деле решил переименовать типы данных в новой версии языка в соответствии с разрядностью. Тем более, что в новой версии стандарта С++ тоже планируются вводить новые типы данных с указанием разрядности.
Релиз языка программрования NewLang