Comments 57
This tutorial assumes you know C++, ...
да и мне не нужен язык из темплейтов и пр.
Орфографические ошибки исправить бы. Задумка очень интересная. ЯП подразумевается удобный для автора или есть радикальное отличие от сиподобных?
во-первых, удобный для автора, во-вторых, да, отличия есть. Например, больше никаких указателей, ссылок и прочего! если же какой-то либе или хардваре нужен именно адрес, то его можно взять макросом-функцией OFFSET. Планируется ещё много деталей, но пока что это всё, что успел.
Вы бы рассказали что ваш язык умеет, какие языковые конструкции поддерживает. Например массивы, структуры, перечисления, функции и будут ли функции first-class объектами (т.е. лямбды, замыкания и прочее), кортежи (нетипизированные составные литералы), рефлексия, метапрограммирование и т.д. Какие будут операции? Из того что я понял только совсем стандартные, но если у вас низкоуровневый язык то может имеет смысл подумать о более специфических битовых операциях? Например в системе команд x86 есть битовое вращение, битовое сканирование, есть установка, сброс и получение бита по номеру, эти операции в Си не представлены.
Я расскажу в следующей части, сейчас пишу indev-версию. когда закончу 1.1, буду добавлять больше специфики и деталей. А так, спасибо за подробный разбор потенциальных возможностей!
@TalismanChet, чем UASM не угодил? Ассемблер настолько сильно упрощается и превращается в C/Pascal подобный язык, пишите себе макросами целые оптимизированные конструкции. Если хочется своей реализации, можете встроить свой участок кода. При этом трансляция переходит в нативный для архитектуры MASM код.
http://www.terraspace.co.uk/uasm.html
я не знал что оное существует
я жестко привязан к специфике препроцессора fasm, поэтому реализовать что-то на базе uasm не могу (хотя бы метаязык на макросах)
уже давно горю идеей создания своего языка
я не знал что оное существует
А знаете ли вы о сайте compiler.su?
Плох тот программист, который не хочет создать свой язык программирования.
Но иногда описание своей мечты выглядит как рассказывание бредового сна — для самого рассказчика сон был очень волнующим и важным, но окружающим неловко и непонятно зачем такое рассказывать.
Рекомендую в следующих статьях сразу же отмечать какую задачу/проблему призван решать ваш язык.
Эта статья — просто история о том, как я решил создать свой язык для низкоуровневых штучек, отличного от ассемблера и С.
Могу посоветовать вам изучить язык Forth и написать его компилятор/интерпретатор. Пишется элементарно, даже у меня это заняло две недели. Ну или retroforth посмотрите. Книжки — Лео Броуди "Способ мышления Форт" и "Начальный курс программирования на языке Форт".
Мой стандартный вопрос свой-языко-придумывателям: как обстоят дела с отладкой? Как программисты будут отлаживать свои программы на вашем языке? Вы что-то придумали на эту тему уже?
Отладка, всё таки, занимает большую часть времени и нервов в процессе программирования.
Хороший вопрос, саажу я вам. На этот счет у меня тоже есть идея, хоть она ещё не реализована. Я планирую создать ВМ для отладки приложений на моем языке. То есть, будет специальный бинарник (honey-dbg.*), который будет разворачивать собственную виртуальную среду выполнения программ (VPEE), которая будет абсолютно управляема (даже через гуй). Например, мы хотим отладить прогу для Windows 7. Тогда, мы пишем $ honey-dbg *.hny --gui --osname=nt osver=6.1
. В итоге, запустится программа с гуем, где можно будет пошагово (и не только) смотреть за поведением проги, делать подстановку путей файловой системы, подстановлять контент файлов, смотреть, какие возбуждаются исключения и тд и тп. Это не так сложно сделать в ВМ, чем в специальном отладчике через порты, ведь в таком слючае можно полностью контролировать как код, так и условия его выполнения.
Ну это достаточно серьёзная работа, скажу я вам из своего опыта. Я в littlelisp.js интерпретатор специально писал под возможность отлаживать. И создание GUI дебаггера у меня заняло не менее половины сил и времени от общей разработки.
Что же, глаза боятся, руки делают. Я работаю! :) (если хотите вступить в группу для разработки языка - добро пожаловать сюда: t.me)
А вы не хотите завести mastadon-аккаунт например на lor.sh? И делиться время от времени своими успехами более публично?
что такое лор.ш? Идея, модет, годная, так что рассмотрю этот вариант.
Отладка не нужна! =)
приходите в гости, похоже мы заняты одним и тем же :-)
кстати для арм ассемблера у меня уже есть редактор, и я думаю вы много там найдете полезного (коль пишите (писали) на асме - то знаете все грабли которые обычно в этом процессе поджидают)
поставил вам плюса, но они не помогут, здесь за асм хейтят (больше всего те кто в асме нифига не понимают :-) последний пример в конце комментариев к моей последней статье)
Уже состою в этой группе! Попал в нее из вашей статьи, очень интересный проект, был бы рад помочь, но компа (тем более с виндой) пока что нет, делаю всё с телефона. Честно, я бы сделал компилер в арм асм с синтаксисом intel x86, а потом уже можно в sublime поставить подсветку. Но не в коем случае не умаляю ценность вашего проекта! Как я понял, вы с WinAPI пишите, так что снимаю шляпу - это очень непросто. У меня тоже есть своя группа про создание этого языка, пока что не такая активная, но тем не менее: https://t.me/honey_devdot. Если интересно, можете принять участие в развитии проекта!
ну в сублиме только подсветка токенов есть... контекст не разбирается
но компа (тем более с виндой) пока что нет, делаю всё с телефона
ШТО
здесь за асм хейтят (больше всего те кто в асме нифига не понимают :-)
Ну например у https://habr.com/ru/post/540136/ (про FizzBuzz на SSE) рейтинг +369
А туториалы для 16-битного реального режима х86, устаревшего ещё до нашего рождения, -- действительно поднадоели.
Судя, например, по наличию точки с запятой и отсутствию механизма замыкающей запятой в грамматике, язык такой же кривой и неудобный, как и большинство остальных мейнстрим языков и особо от них не отличается в плане грамматики. Непонятно тогда, чем вам не угодил C++ (шире -- llvm), на нём можно полностью проэмулировать ваш фронтенд с помощью дефайнов (максимум простенький транслятор), вместе с кучей возможностей, библиотек и оптимизаций
ещё раз, почитайте комменты. Я хочу СВОЙ язык. И можете сказать, что такое замыкающая запятая?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas
По моему, с точки зрения грамматики, большинство токенов вообще лишние и не несут никакой дополнительной информации.
Вы же используете какие-то инструменты для написания фронтенда, почему бы не использовать уже существующую реализацию фронтенда, если уж он у вас не сильно отличается и сконцентрировать своё внимание на бекэнде. Либо наоборот, если хотите изучить процесс написания языка полностью, то почему пользуетесь инструментами, а не пишете, например, свой парсер. СВОЙ очень размытое понятие. Я бы использовал как стартовую точку какое-то отличие от языков, то есть начал бы с концепта. Например, новое соглашение о вызовах на вашем любимом ассемблере или максимально выразительная грамматика, революционный механизм обработки ошибок какой-нибудь. Соответственно тогда нет смысла лезть в области, не связанные непосредственно с задачей.
ещё раз, я ЦЕЛЕНАПРАВЛЕННО изобретаю колесо, надеясь, что оное может кому-то пригодиться. И в первую очередь, я делаю этот проект для себя, и ПРю его для поиска единомышленников, не хейтеров. Можно предлагать фичи, или что вырезать, но тогда желательно делать пулл реквест в репозиторий гитхаб или же прилагать код вместе с предложением в группе devdot. Спасибо за понимание!
Какими фичами ваше колесо уникально и может кого-то заинтересовать? Я как хейтер ваш самый большой единомышленник, потому что пытаюсь найти (вдохновить) изюминку, в процессе разработки которой можно изучить много языков и их принципов работы. Если запариться, то работа может потянуть, наверное, на диплом бакалавра. Как вы сами могли убедиться, сваять каркас по готовым инструментам довольно просто, дальше открывается дорога творчеству, а у вас, грубо говоря, весь манифест состоит из одной строки: "свой язык". Что если бы вы наткнулись на бэкенд либу с уже реализованным дебаггером? Вы бы тогда скорее всего не стали задумываться о его реализации. То же самое с грамматикой. Раз уж начинать свой язык, то зачем тащить в него всякие архаизмы типа точки с запятой? Или вы просто скопировали BNF откуда-то?
Извиняюсь за прямолинейную форму, удачи в ваших начинаниях!
Вот пример статьи, как надо описывать самодельный язык, чтобы привлечь единомышленников, а не хейтеров: https://habr.com/ru/company/ruvds/blog/535904/
Начать с того, зачем этот язык нужен и какие новые возможности даст; добавить несколько простых примеров кода на новом языке, которые на существующих языках писать неудобно; а портянки с формальными грамматиками оставить на гитхабе, и не тащить в статью вообще.
все, нашел что такое эта ваша запятая. Не думаю, что эта фича так полезна, но добавить её не сложно.
да уж.. жесть какая то.. кто то видать написал кривой лексер и потом вот придумал "гениальную запятую" :-) я бы еще понял если бы речь о точке шла....
в общем нуб я, и ничего в колбасных обрезках не понимаю :-(
Вообще, не вижу смысла в такой запятой, но просто, чтобы было, добавил её в синтаксис. Для этого я изменил 3 строчки кода! И зачем это нужно, если, по сути, никакой функции это не несет?
Дифф меньше, когда добавляешь новый элемент в список, не надо редактировать предыдущую строку, чтобы просто поставить запятую, если она там уже стоит. Для меня это такая мелочь, которая постоянно сидит в глазу
вот, кстати, ещё доказательство её бесполезности:
В JSON нельзя использовать замыкающие запятые. Попытаясь спарсить JSON с такой запятой, вы получите синтаксическую ошибку
Это доказательство бесполезности JSON, там вообще грамматика очень жёсткая и для описания данных изобилует излишествами. Лишние килобайты на передачу всех этих скобок и кавычек при общении на текстовом JSON. Иногда достаточно просто поменять местами операнды в правиле грамматики (заодно удаляются тривиальные правила), и пользователи языка смогут сделать глубокий вдох в полную грудь
как вариант решения данной проблемы можно использовать yaml. Например, передавать в json единственный элемент - массив из строк кода yaml. А со стороны клиента уже парсить. Но никто не станет этим заниматься
В yaml грамматика более гибкая, но тут возникает другая проблема: полноценная грамматика yaml очень сложная, рекурсивная и неоднозначная (до сих пор не реализована), вроде как сложнее даже чем и так перегруженная грамматика C++, если парсер JSON можно наваять на коленке, а готовые либы обычно не очень большие, то yaml я даже не возьмусь разбирать, разве что его какое-нибудь сильно упрощённое подмножество, поэтому никто и не станет этим заниматься
Я больше практик, но если уж разрабатывать компилятор, надо делать статический анализатор,который будет разбирать код на части и проверять синтаксис на прекомпиляции, и не просто регулярками а формируя стэк вызова тех или иных функций и смотреть их порядок вызовов, тоже касается конструкций ты, элсе и так далее, тоже касается типов. В любом случае всё это надо закладывать изначально ибо в будущем придёшь к Си подобному языку, ибо JS, TS то же синтаксически похож на си++
js, ts - интерпретируемые языки, а honey - компилируемый и условно интерпретируемый (для отладки). Механизмы совершенно разные, структуры разные, алгоритмы и принципы - тоже. Я ХОЧУ язык похожий на си, но не являющийся его разновидностью.
Свой язык, или как я устал от ассемблера и С