LINUX.ORG.RU

Ну ладно, можно смеяться и говорить «ненужно»

 ,


7

6

Ладно, скажу и вам: я начал-таки делать свой язык программирования, о котором я тут периодически писал, наверное, лет с пяток.

Он начался с того, что по работе понадобился транслятор с языка 1С и будет он примерно таким:

  • ключевые слова в кириллице, заточен на русскоязычных пользователей
  • работает через трансляцию в Cl
  • семантика от CL. Пока мало сделано, постепенно буду достраивать мосты до недостающих частей. Но некоторые вещи в семантике CL не годятся и будут заменены (модули, #., на другие пункты будем смотреть)
  • RAII - подобные конструкции
  • опциональная статическая типизация
  • элементы ФП: декларации для контроля мутабельности. Замыкания.
  • eval, REPL
  • опциональные типы примерно как в Rust
  • исключения и отладчик как в лиспе (вызов отладчика до раскрутки стека, во многих случаях возможность выкрутиться из ошибочной ситуации и продолжить выполнение)
  • треды
  • пошаговая отладка отдельных тредов, а также трассировка в лог или на экран
  • лицензия - пока не знаю. Скорее всего MIT, но нужно понять, как всё это соотносится с местным законодательством
  • файлы описания интерфейсов отделены от реализации этих интерфейсов, как в С (спасибо за участие в обсуждении)
  • горячая замена кода, естественно
  • сборка мусора
  • парсер линза, т.е. сразу создаётся фундамент под средства обработки исходников, как в CLang
  • совместное развитие среды, языка и инструментов - для этого я и запилил clcon
  • интерфейс к C (с ограничениями на применение сигналов и тредов в библиотеках)
  • встроенные sql запросы и вообще возможность встраивания других синтаксисов без специального закавычивания - с поддержкой со стороны среды
  • гуй на tcl/tk по технологии клиент-сервер. После версии 1.0 можно обсуждать Qt, но вряд ли будет слой переносимости между разными GUI. Возможно, будет генерация tcl/tk из крупных блоков по метаданным (это для бизнес-приложений скорее).
  • базовая реализация CL - SBCL (из-за лицензии).

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

// -*- package :S2TEST ; coding : utf-8 ; encoding : utf-8 ; -*-
/*
(in-package :s2test)
(named-readtables:in-readtable :buddens-readtable-a)

модуль Пример1;
*/

клсс к () ;
  а : строка = "базя" ;
  б ; 
кнцклсс

клсс к2 (к) ;
  в ; 
кнцклсс 

// здесь полные слова, потому что редкое слово
ГлобальнаяПеременная э;

фнкц МояСтраница() : строка ; 
 перем рез;
 ПостгресСОтдельнымПодключениемВДаннойНити();
 ПостгресПодключиться("db1","pguser","uio123","192.168.184.128");
 //ВОтладчик("ура!");
 рез = "<html><body>Поля глоб. перем. э k2</p>";
 рез = рез + ПоляИЗначенияЭкземпляра (э);
 рез = рез + "<p>" + строка(ПостгресЗапрос("select * from ошибка")) + "
 </p>";
 рез = рез + "<br><a href=""/"">Домой</a></body></html>";
 ПостгресОтключиться();
 Возврат рез;
кнцфнкц

ЗапуститьВебСервер(2425);
ВебСерверГлотатьОшибки(1);

СоздатьГенерируемуюВебСтраницу("/ura",смвл("S2TEST::МояСтраница"));

э = СоздатьОбъект(смвл("к2"));
э.б = 2; 
э.в = 3;

Если найду тех, кто будет пилить со мной или, ещё лучше, даст денег на разработку - открою исходники.

★★★★★

Последнее исправление: den73 (всего исправлений: 6)

Ответ на: комментарий от den73

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

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

Xintrea ★★★★★
()
Ответ на: комментарий от den73

Озвучь цену вопроса

Открытая лицензия.


https://bitbucket.org/budden/l2/src/default/doc/клчвые-слва.md?at=default&amp...

Это капец. Надеюсь, ты попишешь с пол-годика на 1С и поймешь, что ничего сокращать не нужно, и никаких хотровывернутых правил сокращения высасывать из пальца тоже не стоит. Займись языком.

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

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

цикл(от а=1 до 100): перебор натуральных чисел
  печать а

  ...
  ...
  ...

конец: перебор натуральных чисел

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Надеюсь, ты попишешь с пол-годика на 1С

На данный момент Бог избавил. Надеюсь, так будет и дальше.

Ты хочешь помочь компилятору, а надо помогать человеку.

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

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

Именованные циклы - идея неплохая и она даже реализована в некоторых местах лиспа (например, в iterate)

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

больше времени уходит на понимание контекста блока в момент написания

Это очень полезно - понимать, что ты пишешь. А не просто сорить закрывающими скобками без всякой мысли. Так появляется дополнительный шанс осознать ошибку.

den73 ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Тебе уже сказали что писать разные завершающие ключевики на разные типы блока

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

На данный момент Бог избавил. Надеюсь, так будет и дальше.

Но ты же собирался...

Неужели нашел работу лиспером в маленьком городке?

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

1С 8 достаточно сложен. Чтобы попасть на работу, желательно сдать экзамены и получить сертификаты. Во всяком случае, таковы требования в вакансиях. Я оценил время подготовки примерно в 3 месяца. После этого решил попробовать применить старые знания и старые связи, у меня это получилось.

Начал копать, что уже сделано на ниве русскоязычных языков. Интересный сайт - http://ruscomp.24bb.ru

И как обычно бывает, любое дело, если его делать добротно, требует больших усилий. Блин.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Взываю к monk. Какие русскоязычные ЯП обладают наиболее продуманными и широкими наборами сокращённых ключевых слов?

den73 ★★★★★
() автор топика
Ответ на: комментарий от tailgunner
do {тело} = alt-shift d o пробел shift-[ alt-shift т е л о alt-shift shift-] alt-shift

19 нажатий. Вычитая «тело», получаем 15.

дей тело кндей

14 нажатий. Вычитая «тело», получаем 10.

В худшем случае -

дей тело край_дей
18 нажатий. Вычитая «тело» - 14.

край - это гипероним слова «конец» (я не знаю, что такое гипероним; но во всяком случае, «край» может употребляться как «конец»). Мы здесь избавляемся от сокращения.

дей - слово «деять», т.е. «делать», в повелительном наклонении https://ru.wiktionary.org/wiki/деять

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Конечно, если учитывать компактность кода, то do {} выглядит наиболее лаконично. А лаконичность в моей системе ценностей стоит довольно дорого. Но не наиболее понятно без повтора наименования конструкции в закрытии.

Кстати, можно заставить редактор раскрашивать концы в тот же цвет и ставить дуги от начала к концу.

Может и не нужны закрывающие...

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Если есть {}, то do не нужен.

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

tailgunner ★★★★★
()

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

Suntechnic ★★★★★
()
Ответ на: комментарий от tailgunner

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

1. содержат только кириллицу.

2. не содержат заглавных букв.

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

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

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

Блин. Да возьми ты уже набор ключевых слов из какого-нибудь существующего языка. Эль-76, например - он по крайней мере на практике использовался.

шансы имеют только достаточно совершенные языки.

С таким вниманием к маловажным деталям ты рискуешь никогда не приступить к тому, что важно в языке.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Выработал процедуру, позволяющую быстро решить вопрос на первом этапе:

https://bitbucket.org/budden/l2/src/default/doc/ключевые-слова.md?fileviewer=...

С таким вниманием к маловажным деталям ты рискуешь никогда не приступить к тому, что важно в языке.

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

За ссылку на Эль-76 спасибо. На самом деле, полно языков с Русскими ключевыми словами,

http://traditio.wiki/Категория:Языки_программирования_с_русскими_ключевыми_сл...

Можно попробовать подобрать слова от одного из них, но:

- слов может не хватить, потому что у нас семантика от CL, а CL - язык довольно жирный;

- выбор слов может не соответствовать моим требованиям;

- перебрать все эти языки - это большой труд;

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

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

дей тело край_дей

Лучше традиционно «нач тело кон»

monk ★★★★★
()

транслятор с языка 1С

семантика от CL

То есть, на самом деле, не с «языка 1С», а с «русскоязычного Алгол-подобного синтаксиса»? То есть готовые программы на 1С этот транслятор переваривать не обязан.

Если да, посмотри на Honu. Там решается сходная задача (только без русскоязычности), может что почерпнёшь.

monk ★★★★★
()
Ответ на: комментарий от monk

Интересно...

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

А вот это - Кумир?

алг
нач
 цел N = 20 
 целтаб a[1:N] 
 цел i, j, k 
 нц для i от 1 до N 
   ввод a[i] 
 кц
кон

den73 ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

То есть, на самом деле, не с «языка 1С», а с «русскоязычного Алгол-подобного синтаксиса»? То есть готовые программы на 1С этот транслятор переваривать не обязан.

Нет, не обязан. Я об этом уже где-то писал. В 1С есть ошибки: конкатенация и сложение обозначаются одинаково (это ещё можно оспаривать), а параметры по умолчанию передаются по ссылке (это точно ошибка). Плюс своя особенная семантика чисел и управление памятью через RC. Если всё это взять с собой в светлое будущее, оно уже не будет светлым. Просто транслятор с 1С был отправной точкой разработки.

Динамическая типизация?

Вообще-то в анонсе написано «опциональная статическая типизация», что и есть семантика CL.

den73 ★★★★★
() автор топика
Ответ на: комментарий от monk

Это из ЕГЭ по информатике - там он называется «алгоритмический язык». Как бы узнать процент школьников, которых учат именно Кумиру?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

И я уже посмотрел, в нём очень мало ключевых слов. Вот они:

алг нач кон исп кон_исп дано надо арг рез аргрез знач цел вещ лог сим лит таб целтаб вещтаб логтаб симтаб литтаб и или не да нет утв выход ввод вывод нс если то иначе все выбор при нц кц кц_при раз пока для от до шаг

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

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 3)
Ответ на: комментарий от den73

нужно иметь налицо все ключевые слова

Тогда какие ключевые слова тебе нужны? Все over 900 символов из пакета CL? Или какое-то подмножество?

monk ★★★★★
()
Ответ на: комментарий от monk

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от monk

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

Насчёт Кумира у меня возникла мысль сделать для начала свою реализацию Кумира (он на вид очень прост) с tk в качестве гуя и лиспом в качестве бекэнда. Сейчас у них Qt и LLVM.

Синтаксис Кумира мне не особо понравился, но пока эта мысль пусть поварится в голове. Может и другие участники форума что-нибудь напишут на эту тему.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Синтаксис Кумира мне не особо понравился, но пока эта мысль пусть поварится в голове.

Если за прототип брать синтаксис алгола/бейсика/паскаля, то по основным словам лучше сделать совпадение с Кумиром (всё-таки самый популярный русскоязычный язык кроме 1С). Синтаксис 1С, я так понимаю, тебе не понравился слишком длинными ключевыми словами (Попытка ... Исключение ... КонецПопытки, например).

Второй вариант: за основу синтаксиса брать C++/Java/Javascript. Тогда ключевых слов сильно меньше.

monk ★★★★★
()
Ответ на: комментарий от monk

За прототип уже взято то, что взято, тут проделана немалая работа, можно считать, что в своей основе синтаксис устоялся. С Кумиром этот синтаксис несовместим. Вот сокращения ключевых слов можно (будет потом) (попробовать) совместить.

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

Другое дело, можно просто поставить в качестве отдельной задачи сделать, скажем, клон Кумира с 3D графикой - ведь одним из его недостатков кумира как раз называют отсутствие нормальной графики. Эта задача попутна развитию IDE, рантайм-среды. Например, я не вижу в Кумире модулей. А мне всё равно нужно разработать систему модулей, вот можно на Кумире потренироваться.

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от monk

Надеюсь, мне простится кросспостинг:

https://bitbucket.org/budden/l2/src/default/doc/описание-языка/пространства-и...

Комментарии на тему «чего не хватает» приветствуются. В целом же эта часть для версии 1.0 завершена (вместе с кодом, который это делает).

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от Suntechnic

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

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

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от den73

Комментарии на тему «чего не хватает» приветствуются.

Какой синтаксис идентификатора? В смысле, алфавит. Допустимы ли имена: ***, ..., ., *foo*, a*, a-b, 1ul?

monk ★★★★★
()
Ответ на: комментарий от monk

Это не относится к пространствам имён. Имена как в обычных языках. Если нужно иное, то будет какой-то спец.синтаксис, как в SQL. Скорее всего, для начала будет как-то так: смвл(«а-б»). Касабельно тире я долго думал и мучался, но не получилось включить его в идентификаторы. Тире - это во-первых, операция вычитания. А во-вторых, оно у меня задействовано для отделения типа от переменной, см. пример на заглавной странице. Могут возникнуть конфликты. Жаль, с тире очень удобно печатать, не нажимая shift. С другой стороны, ВотТак слова получаются короче.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Имена как в обычных языках. Если нужно иное, то будет какой-то спец.синтаксис, как в SQL. Скорее всего, для начала будет как-то так: смвл(«а-б»).

Каждый пакет Л2 является пакетом лиспа и может использовать пакеты лиспа

То есть будет как-то так:

смвл("list-length")(смвл("make-list")(10, смвл(":initial-element"), 0))
?

monk ★★★★★
()
Ответ на: комментарий от monk

Ага, но с keyword-ом будет как-то иначе. Может быть символ_из_пакета(«keyword»,«initial-element»)

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.