Форум программистов, компьютерный форум, киберфорум
CoderHuligan
Войти
Регистрация
Восстановить пароль
Рейтинг: 3.75. Голосов: 4.

"Обратный " форт или "неправильный" basic

Запись от CoderHuligan размещена 23.03.2020 в 14:48
Обновил(-а) CoderHuligan 29.03.2020 в 13:14

Начал экспериментировать с написанием компилятора для некоего языка программирования, который имеет некоторые особенности и пока существует только в моей голове.
Нынешние языки, на мой взгляд, не удовлетворяют по крайней мере двум принципам:
1) Простоте;
2) Скорости (в основном те, которые в байт-код шуруют).
Стековые языки медленны из-за того, что им приходится постоянно, по каждому чиху манипулировать со стеком. Стековая нотация, например как в форте приводит к трудно-читаемому коду.
Например сложение 4+5 в форте выглядит так:
4 5 +
То есть сначала кладем на стек число 4, потом сверху на него 5 и затем выполняем операцию сложения, которая снимает эти два числа и кладет обратно результат операции. Вроде все просто, но программист должен постоянно думать о стеке, т. е. о внутреннем представлении данных в машине.
В basic, fortran, C и др. выражение пишется в приближенной к математической нотации форме:
PureBasic
1
а = 4+5
Однако тут тоже используется стек, по крайней мере для парсинга выражений и если это интерпретатор, то опять скорость падает.
Стек неявен, он как сферический конь в вакууме. А для решения задачи все должно быть явным и желательно без умолчаний и старшинства операций.
Язык должен быть командным.
Все команды строятся по единому механизму. Его легко парсить.
Например команда сложения выглядит так:
PureBasic
1
+ a b c;
или с непосредственными аргументами:
PureBasic
1
+ 20 3 c;
Первое слово команды есть само имя команды, в данном случае "+". Затем идут аргументы команды. Команда "+" может принимать произвольное количество аргументов, последний из которых является переменной результата операции.
PureBasic
1
+ a b c d e g rez;
в данном случае переменная rez это результат команды, а переменные до нее есть аргументы для сложения коих может быть много. Это эквивалентно: rez=a + b + c + d + e + g;
Смысл в том, чтобы исключить вложение функций и подстановку результатов, которое приводит к неудобочитаемым программам. А здесь все переменные должны быть явно заданы, что позволяет даже автоматизировать получение правильной последовательности операций при работе например с таблицами решений. Мы не работаем со стеком и не экономим память на переменных.
Каждая команда "ждет" входные переменные и переменную результата, берет аргументы, выполняет операцию и кладет результат в предложенную ячейку.
Остальные команды строятся аналогично:
PureBasic
1
* a b rez;
и т.д.
Имена команд и аргументы разделяются только пробелами. Команды разделяются точкой с запятой ;.
PureBasic
1
/ a b rez; - d f r; % v n r;
Это позволяет форматировать сами команды в листинге.
Определение переменных:
PureBasic
1
defint a c v b; defdouble n m;
и т.д.
Присваивание значения переменной:
PureBasic
1
set a 34;
Сразу нескольким:
PureBasic
1
set a 34 b 677 c 0;
Такие программы легко отлаживать, так как все промежуточные результаты всегда явны и под рукой. Их легко контролировать.
Да, это нечто от фортрана и бейсика с фортом, но проще.
Будут номера строк-метки и переходы по goto.
Арифметический if из фортрана:
PureBasic
1
ifa a 20 50 60;
if - имя команды, а - переменная. Если переменная является отрицательной, то происходит переход на метку 20, если нулем, то на 50, а если положительная то на 60.
Обычный логический if:
PureBasic
1
if a 20 40;
если переменная а является нулем, то переход на 20, если не нуль, то на 40.
Полный формат команды:
1010: + a b r;
метка:, имя, аргументы
Похожий на фортрановский цикл do
PureBasic
1
do 10 1 10 2;
первый аргумент - до какой метки тело цикла, второй - от какого числа-индекса начало, третий до какого исполняем, четвертый - шаг исполнения.
Большинство команд имеют дело только с ячейками памяти. Они не знают, что такое стек. Также запрещена подстановка поэтому выражения отсутствуют как класс. Это упрощает понимание языка и исключает ошибки.
Язык встраиваемый, он также будет парсить в байт-код. Он специально заточен для встраивания в приложения. Язык "хакерский" - он не следует мэйнстим-яп, а идет в прямо противоположенном направлении - к полной свободе самовыражения.
По поводу определения новых команд и другие особенности позже.
Размещено в Без категории
Просмотров 1316 Комментарии 102
Всего комментариев 102
Комментарии
  1. Старый комментарий
    Аватар для liv
    Цитата:
    пока существует только в моей голове
    ИМХО, это не есть хорошо. Надо формализовать и написать, как оно будет выглядеть. И знать, к чему стремиться, что еще не сделано. Иначе, можно что-то упустить и заблудиться в трех соснах. Ибо написание компилятора - весьма нетривиальная задача.
    Запись от liv размещена 23.03.2020 в 15:30 liv вне форума
  2. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Надо формализовать и написать, как оно будет выглядеть.
    Нахожусь в процессе формализации, штудирую книги по компиляторам. Весьма интересно.
    Запись от CoderHuligan размещена 23.03.2020 в 16:02 CoderHuligan на форуме
  3. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Начал экспериментировать с написанием компилятора для некоего языка программирования
    А как же морской бой с блекджеком, караванами и другими плюшками?
    Запись от Croessmah размещена 23.03.2020 в 23:56 Croessmah на форуме
  4. Старый комментарий
    Аватар для Usaga
    Простоте и скорости удовлетворяют почти все языки. Только у плюсов с первым не очень хорошо. Но это цена выразительности и гибкости.

    Про "стековые языки" я не совсем понял. Что имеется в виду, раскройте своё понимание, иначе не совсем ясно.

    И хочу заметить, что написать компилятор сложнее, чем морской бой, который, как оказалось, для вас непосильная задача. Вы точно справитесь? Тут уже пытались DCAST'ы и ЯРы писать.
    Запись от Usaga размещена 24.03.2020 в 03:42 Usaga на форуме
  5. Старый комментарий
    Аватар для Kastaneda
    Ты действительно считаешь, что это / a b rez, - d f r, % v n r удобно читать?
    А это set a 34 b 677 c 0 читабельней, чем
    Код:
    a = 34
    b = 667
    c = 0
    ?

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

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

    Цитата:
    Все команды строятся по единому механизму. Его легко парсить.
    Арифметические выражения и без того легко парсить, покажи реальный пример из твоего языка, который упрощает парсинг.

    Цитата:
    которое приводит к неудобочитаемым программам.
    Плохой код пишет программист, а не язык.

    Цитата:
    Мы не работаем со стеком и не экономим память на переменных.
    Если не в стеке, то где ты будешь сохранять промежуточные результаты? В файл писать?

    Цитата:
    Это упрощает понимание языка
    Я пару раз перечитал твой текст, нифига не понял. Про goto только понятно, но при описании goto сложно написать чушь.

    Цитата:
    Язык "хакерский"
    Воу воу полехчи

    Цитата:
    он не следует мэйнстим-яп, а идет в прямо противоположенном направлении
    На дно?
    Запись от Kastaneda размещена 24.03.2020 в 06:53 Kastaneda вне форума
  6. Старый комментарий
    Аватар для Quiet Snow
    Цитата:
    Нынешние языки, на мой взгляд, не удовлетворяют по крайней мере двум принципам:
    1) Простоте;
    2) Скорости (в основном те, которые в байт-код шуруют).
    Расскажи где тебе не хватило скорости. Если тут:
    https://www.cyberforum.ru/blogs/622334/blog5859.html

    То вопросов больше нет.
    Запись от Quiet Snow размещена 24.03.2020 в 10:47 Quiet Snow вне форума
  7. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    А как же морской бой с блекджеком, караванами и другими плюшками?
    Если найду время, доделаю.
    Цитата:
    Про "стековые языки" я не совсем понял. Что имеется в виду, раскройте своё понимание, иначе не совсем ясно.
    Это форт системы, языки с виртуальной машиной под капотом. Например питон.

    Цитата:
    Ты действительно считаешь, что это / a b rez, - d f r, % v n r удобно читать?
    А это set a 34 b 677 c 0 читабельней, чем
    Все непривычное глазу воспринимается в штыки. Но это дело привычки. В TCL точно такая же конструкция: set a 45. Это не я придумал. Давно писалось о нелогичности конструкций типа: a = 34. Почему? Потому что сначала должно существовать значение, а только потом операция по его присваиванию. Такие языки - языки для домохозяек. Их в школе учили так писать "математически". Эти языки создавались математиками. По компьютерному должно сначала быть значение и только затем операция. Так в форте делают.
    Цитата:
    Не знаю стоит ли тебе рассказывать про обратную польскую запись
    Не стоит: я баловался языком Форт и знаю что это такое. Однако по нормальному сначала должны быть команды, а не операнды, как в форте, так как удобно делать переходы на команды. А если операнды будут впереди паровоза, то трудно использовать метки.
    Цитата:
    Можешь объяснить связь между первой частью предложения (до запятой) и второй?
    Во внутреннем представлении компилятора виртуальной машины все переменные обьявляются в блоке data, то есть в статической памяти, а не в куче. Поэтому если страница позволяет, они легко войдут в кеш. Если переменные выделять в динамической памяти, а также стеки, то программа будет тормозить на обращениях к памяти. Всё просто. У меня в компиляторе под каждый тип переменной заводится свой статический глобальный массив.
    Цитата:
    Арифметические выражения и без того легко парсить, покажи реальный пример из твоего языка, который упрощает парсинг.
    имелось в виду парсинг предложений самого листинга программы компилятором. Реальный пример несложен. В этом языке отсутствуют скобки как класс, соответственно отсутствуют вложенные скобки, функции, команды и пр. Вообще нет подстановок. За счет этого и упрощается парсинг, потому что не требуется использовать рекурсивный спуск, стеки и пр.

    Цитата:
    Плохой код пишет программист, а не язык.
    Это далеко не так. В современных языках много делается по умолчанию, неявно. Это все нужно знать, помнить, но иногда забывается.
    Цитата:
    На дно?
    Кому как. Язык, который я пишу, создается специально для встраиваемых систем, для того, чтобы можно было программировать программы самим пользователями этих программ, - улучшать их, удалять баги и пр. Короче говоря совершенствовать их, а не ждать пока программисты через 10 лет исправят единственный баг. Каждая программа должна иметь свой встроенный язык.
    Цитата:
    Если не в стеке, то где ты будешь сохранять промежуточные результаты? В файл писать?
    Каждая команда сохраняет результат в той ячейке, которая предложена ей вызывающим кодом (host-кодом)
    Запись от CoderHuligan размещена 24.03.2020 в 11:17 CoderHuligan на форуме
    Обновил(-а) CoderHuligan 24.03.2020 в 11:31
  8. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Если найду время, доделаю.
    продолжаете себя обманывать?
    вам сразу чуть ли ни все написали, что жаренькое начнётся в самом конце!
    Запись от XLAT размещена 24.03.2020 в 12:09 XLAT вне форума
    Обновил(-а) XLAT 24.03.2020 в 12:11
  9. Старый комментарий
    CoderHuligan,
    спасибо!
    1. будет ли ваш язык, назовём его условно от CoderHuligan (CH++), отслеживать деление на 0? Или вы поступите иначе? Например деление на 0 всегда будет равно нулю?
    2. Будет ли рекурсия (стек для рекурсии)?
    3. Как вы собираетесь определить массивы?
    Запись от wer1 размещена 24.03.2020 в 15:08 wer1 на форуме
  10. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от wer1 Просмотреть комментарий
    1. будет ли ваш язык, назовём его условно от CoderHuligan (CH++), отслеживать деление на 0? Или вы поступите иначе? Например деление на 0 всегда будет равно нулю?
    2. Будет ли рекурсия (стек для рекурсии)?
    3. Как вы собираетесь определить массивы?
    1. Будет на внутреннем уровне. Это обязательно.
    2. рекурсия возможно будет. Пока еще не знаю. Еще концепция прорабатывается.
    3. Массивы определяем так:
    PureBasic
    1
    
    defarr A 1 10 INT
    defarr - имя команды определения; А - имя массива; 1 - начальный индекс; 10 число элементов; INT - тип.
    Кстати, по такой же схеме можно определять и обычные переменные:
    PureBasic
    1
    
    defvar A INT
    вместо команд:
    PureBasic
    1
    
    defint, deffloat
    и т.д.
    Можно сразу же и присвоить значение:
    PureBasic
    1
    
    defvar A INT 10
    Запись от CoderHuligan размещена 24.03.2020 в 15:19 CoderHuligan на форуме
    Обновил(-а) CoderHuligan 24.03.2020 в 15:23
  11. Старый комментарий
    Аватар для Usaga
    Цитата:
    Если найду время, доделаю.
    На простое упражнение времени не нашлось, а на целый компилятор найдётся?

    Цитата:
    языки с виртуальной машиной под капотом
    Что у них там под капотом вас волновать не должно. "Стёковый код", в который компилируется программа на управляемом языке, нужен как промежуточный для дальнейшей трансляции в машинный с помощью JIT. Вот чтобы это было удобнее делать, промежуточное представление кода выбрали именно таким. Никак на коде программиста это не сказывается и знать это никак программиста не заставляет. Точно так же, как не заставляет знать это при использовании LLVM, при компиляции программы на С++, где точно так же, код с С++ компилируется в промежуточное представление а потом уже скармливается генератору машинного кода.

    Так что вы чушь сказали, сударь.

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

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

    Цитата:
    Это далеко не так. В современных языках много делается по умолчанию, неявно. Это все нужно знать, помнить, но иногда забывается.
    Именно что так, хрень пишет человек, а не язык. Если миллионам язык понятен и они на нём могут творить, а вы даже морской бой не смогли написать, то не надо язык сам обвинять. Проблема в вас.
    Запись от Usaga размещена 25.03.2020 в 08:31 Usaga на форуме
  12. Старый комментарий
    Аватар для Usaga
    Цитата:
    Кому как. Язык, который я пишу, создается специально для встраиваемых систем, для того, чтобы можно было программировать программы самим пользователями этих программ, - улучшать их, удалять баги и пр. Короче говоря совершенствовать их, а не ждать пока программисты через 10 лет исправят единственный баг. Каждая программа должна иметь свой встроенный язык.
    Какой-нибудь игрушечный язык в условные три оператора никогда не будет даже на одном поле стоять с нормальным промышленным языком для разработки встраиваемых систем. Это раз. Два: язык - только инструмент выражения мыслей программиста. Т.е. хорошо, если треть от того, что вообще нужно для разработки. Вы бы это знали, если бы были программистом хотя бы начального уровня. А всё остальное (алгоритмы, структуры данных, приёмы архитектурные, предметная область и само железо под которое пишем) "пользователям" знать не надо? Оно само всё будет писаться? Или у вас позиция "не знаю, не слышал, значит не существует"?
    Запись от Usaga размещена 25.03.2020 в 08:56 Usaga на форуме
  13. Старый комментарий
    Аватар для Usaga
    Цитата:
    3. Массивы определяем так:

    defarr A 1 10 INT

    defarr - имя команды определения; А - имя массива; 1 - начальный индекс; 10 число элементов; INT - тип.
    Кстати, по такой же схеме можно определять и обычные переменные:
    Круто, у вас у массивов можно будет задавать начальный индекс? Очень нужная фича. И радует наличие дополнительного мусора в объявлении переменной (defarr). Почему в Си (как и в других языках) обошлись без этого, а вы не можете? Это ваши собственные представления о том, как вы это будете парсить уже накладывают ограничения на синтаксис языка?

    Цитата:
    Можно сразу же и присвоить значение:

    defvar A INT 10
    Тоже самое: избыточные ключевые слова, без которых и так понятно, что тут объявляется.

    И чем все эти убогие нагромождения яснее и короче того, что есть в Си?
    Запись от Usaga размещена 25.03.2020 в 09:14 Usaga на форуме
  14. Старый комментарий
    Для полноты блогов на форуме, пожалуйста, пишите компилятор на ассемблере.
    Запись от IamLost размещена 25.03.2020 в 09:21 IamLost вне форума
  15. Старый комментарий
    Аватар для Usaga
    С использованием AVX?))
    Запись от Usaga размещена 25.03.2020 в 09:38 Usaga на форуме
  16. Старый комментарий
    Аватар для Quiet Snow
    Да канет в бездну тот скорбный день, когда для кода уровня морского боя, тетриса или упаси лосось,
    простой змейки, мне придётся как проклятый "в поте лица" писать техническую документацию на весь код.

    Цитата:
    Сообщение от IamLost Просмотреть комментарий
    Для полноты блогов на форуме, пожалуйста, пишите компилятор на ассемблере.
    Думаю тут мало кто, в принципе, это потянет. Написать на асме аналог, например, паскаля или бейсика.
    Чтобы он был не учебного, а проектного применения. Это титаническая работа даже на ВУ.
    Для полноты картины нужен ещё редактор и справка, ну чтобы этим вообще кто-то начал пользоваться
    хотя бы на ПК. Про embedded вообще молчу, там требования выше.

    Но парень, как видно сам толком не знает, чего хочет, то повальное GOTO сектантство, потом
    структурщина всё таки всплывает, заставляя поступиться собственными же принципами(а он
    поступился уже двумя, документацией и не соответствием своей "GOTO парадигме"). Вроде бы
    как писать ему на ассемблере с таким подходом, но он же его не знает, что видно по этим чужим
    домыслам "лохов по стеку" из литературы, которую писали прожженные дилетанты.
    Т.е. чувак прямым текстом нам говорит, "вы все ослы, будете гонять массивы через стек".
    Не, весёлый мужик, конечно. Думаю это стоит воспринимать как какое-то такое модное, "хайповое"
    явление, мол "всегда иду против системы", как лососи против течения плывут и медведи их жрут))).
    Запись от Quiet Snow размещена 25.03.2020 в 10:44 Quiet Snow вне форума
  17. Старый комментарий
    Аватар для Usaga
    Не смотря на то, что сказано очень хорошо, всё же, посмею упрекнуть. Мужик делает полезнейшее дело: спасает боинги от падений с кучей пассажиров на борту. А падают они потому, что существующие программисты не умеют программировать и которые работают с говёными языками. Это работа масонов.

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

    И тогда мы с вами будем кусать локти потому, что когда-то насмехались над великим. И будем спокойно летать в отпуска куда-нибудь в Грецию не боясь, что самолёт с нами упадёт. Костыли из GOTO и херня вида defarr A 1 10 INT уберегут покруче Христа.

    Запись от Usaga размещена 25.03.2020 в 11:24 Usaga на форуме
  18. Старый комментарий
    Аватар для Curry
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Язык, который я пишу, создается специально для встраиваемых систем
    Не уверен что вы понимаете термин.
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    для того, чтобы можно было программировать программы самим пользователями этих программ, - улучшать их, удалять баги и пр. Короче говоря совершенствовать их, а не ждать пока программисты через 10 лет исправят единственный баг. Каждая программа должна иметь свой встроенный язык.
    Встроенный язык не для этого. Для того что вы описываете нужно что бы программа была опенсорсной на любом языке.
    Кстати, а как в этом вопросе с вашим проектом? Будет открытый код на гитхабе? Под какой лицензией?
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Что у них там под капотом вас волновать не должно. "Стёковый код", в который компилируется программа на управляемом языке, нужен как промежуточный для дальнейшей трансляции в машинный с помощью JIT. Вот чтобы это было удобнее делать, промежуточное представление кода выбрали именно таким. Никак на коде программиста это не сказывается и знать это никак программиста не заставляет.
    А меня, таки, упрекали, в том что я недоволен зачем рекомендованная вами книжка по C# начинается с портянок на CIL. Осознали?
    Да, код на CIL нафик не нужно знать современному программисту, так же как и асм, если только он не кодогенераторы пишет или что то подобное, очень специфичное.
    Запись от Curry размещена 25.03.2020 в 11:25 Curry на форуме
  19. Старый комментарий
    Аватар для Usaga
    Цитата:
    А меня, таки, упрекали, в том что я недоволен зачем рекомендованная вами книжка по C# начинается с портянок на CIL. Осознали?
    Нет, не осознал. Так книга показывает, как оно есть. Чтобы вы были в курсе, что язык управляемый, а не "натуральный" и после компиляции в студии следует (не видный глазу) процесс трансляции во время исполнения. Это для общего понимания с чем вы работает.

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

    Поэтому вы зря сравниваете эти моменты с тем нашим обсуждением. Я настаивал на том, чтобы вы были в курсе, что это есть и на что похоже. Для общей эрудиции. А товарищ заявляет, что без этого вообще не можно ничего писать. По крайней мере я его слова так понял.
    Запись от Usaga размещена 25.03.2020 в 11:55 Usaga на форуме
  20. Старый комментарий
    Аватар для Curry
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Поэтому вы зря сравниваете эти моменты с тем нашим обсуждением.
    Тоже самое, если вы согласны с автором того учебника, что обучать новому ЯВУ, вдруг, надо с того, во что его компилятор транслирует. На деле только отвлекает от объяснения основ. Достаточно было написать что C# компилируется в промежуточный, а не машинный код. Да и это, по началу не обязательно.
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    PureBasic
    1
    
    defarr A 1 10 INT
    А вместо 1,10 можно будет переменные указать, или границы массива жёстко заданы? Динамическое выделение памяти будет? Сборщик мусора?
    Запись от Curry размещена 25.03.2020 в 12:11 Curry на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.