Универсальный язык программирования

Тема в разделе "WASM.LANGS", создана пользователем Dmitriy1973, 9 окт 2026 в 13:02.

  1. Dmitriy1973

    Dmitriy1973 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2026
    Сообщения:
    5
    Привет, WASM.
    Работаю над средой разработки, где высокоуровневый код, ассемблер и машинный код — это три синхронизированные колонки (похоже на Hiew, но с двусторонним редактированием). Изменение в любой колонке автоматически пересчитывает остальные.
    Идея не в том, чтобы заменить существующие инструменты, а в том, чтобы дать единую поверхность для разных задач:
    • Для опытных разработчиков и при разборе чужого кода: можно выделить интересный низкоуровневый фрагмент в первых двух колонках и в редакторе третьего столбца оформить его как свою пользовательскую команду. Дальше она используется как обычная абстракция, но без потери прозрачности: всегда можно развернуть и посмотреть, что там внутри. Это способ фиксировать и переиспользовать низкоуровневые трюки.
    • Для проектирования железа и разговора с производителями: через редактор первой колонки можно проектировать собственную логику команд и формировать спецификацию: «хочу вот такие команды, вот сколько тактов они занимают, вот сколько логических элементов нужно». Четвёртая (сейчас скрытая) колонка даёт прогноз стоимости: такты, логические элементы, энергозатраты.
    • Для обучения и перехода от высокого уровня к железу: студент видит не абстрактную теорию, а прямой путь: высокоуровневая абстракция → ассемблер → машинный код → стоимость в тактах и элементах. Это помогает сформировать интуицию о цене каждой строчки кода.
    Хочу услышать мнение сообщества не про сам язык, а про такой подход к инструменту:
    1. Насколько востребована возможность создавать свои команды поверх существующего ISA именно в реальной разработке (не в экспериментах)? В каких задачах это реально экономит время?
    2. Есть ли подводные камни в самой идее двустороннего редактирования (изменение машинного кода → пересчет ассемблера и высокоуровневой абстракции)? Где такая модель ломается на практике?
    3. Насколько реалистично использовать такую среду как спецификацию для проектирования железа? Какие метрики и данные в ней были бы действительно полезны для разговора с производителем чипов?
    4. Как вы видите место такого инструмента в современном рабочем процессе? Это дополнение к существующим IDE/ассемблерным средам, или отдельная ниша?
    Не ищу похвалы. Мне нужны жёсткие контраргументы: где эта идея упирается в реальные ограничения компиляторов, ISA или производственных процессов.
    Спасибо за любые мысли.
     
  2. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
    Если я не ошибаюсь, компиляция - это процесс с потерями. Информация об именах переменных, типах данных, структурах управления (циклы, условия) безвозвратно теряется, если только компилятор специально не сохранил её в отладочных символах.
     
  3. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    127
    GUI
    Как человек, работающий с графикой, скажу: колонки - это не всегда удобно.
    Количество строк на ЯВУ всегда будет меньше количества инструкций, поэтому первая колонка будет полупустая.
    Как изменять размер окна/колонок? Тот же вопрос для случая, когда у пользователя два монитора.
    А если у кого-то один, но маленький (например, ноутбук у студента).

    Содержание
    1. ЯВУшники пишут код лесенкой по поводу и без повода, поэтому в первой колонке будет видно только начало строки,
    тогда строку придётся переносить, и их драгоценная лесенка потеряет смысл.
    2. Какой смысл в колонке машинного языка без состояния регистров и дампа памяти?

    Имхо
    По описанию Ваша концепция похожа на "визуальное программирование".
    Я уже живо представил себе Dynamo из Revit, Param-O из ArchiCAD или Grasshopper для Rhinoceros 3D.
    Ну или Scratch для студентов MIT.
    Имхо, такое представление было бы вполне современным: кликабельный нод с кодом ЯВУ, а по клику появляется тег с пояснением
     
  4. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
    Как человек иногда пишущий на dephi 7, скажу. Надо сделать в виде 3 отдельных вкладок.
    Все это можно добавить в последней вкладке. Они не обязательно должны быть одинаковыми по инструментарию.

    Имхо, добавить точки останова в эту вашу ide, тогда будет благодать.
     
  5. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    127
    Кстати, предлагаемый подход исключает оптимизацию
    --- Сообщение объединено, 9 окт 2026 в 16:20 ---
    Tabbed-interface. Тоже вариант. Но современные студенты - это уже даже не зумеры. Это альфы. Им надо красивые картиночки, они без картиночек не могут
     
  6. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
    creating-simple-tabbed-interface-with-pure-css.jpg
     
    Dmitriy1973 нравится это.
  7. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    127
    Вообще идея хорошая.
    Интерпретатор языка BASIC - это банальность. Интерпретатор Явы, Питона - тоже не удивишь.
    А вот интерпретатор C++26 - это что-то свежее. Стоит попробовать.
    Ещё между ЯВУ и ассемблером надо предусмотреть таб с байт-кодом. Ну, как бы. Для полноты
     
  8. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
    Всегда было интересно можно ли написать норм компиль C/C++ на питоне.
    Там есть хорошие средства парсинга. Без длинных портянок кода как в gcc.
     
  9. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    902
    ml64,

    Тот что был в спекки(zx) - гениальность.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.447
    Лучше средства для парсинга С/С++, чем libclang, ты не сделаешь. И в принципе мечтать об интерпретаторе С++26 - это утопия, хотя бы с точки зрения того, что придется в какую-то сторону завернуть все возможные undefined/unspecified behaviour, в какую-то сторону определить все зависимые от платформы вещи int/long/long int и многие еще непростые вещи.
     
  11. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
    Тогда для ассемблера (fasm/masm синтаксис). Имхо, там гораздо проще чем парсинг С/С++. Open Source компилятор в 1000-1500 строк. Python выигрывает не в скорости, а в том, что задача ложится на его сильные стороны.
     
  12. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    902
    Application,

    Ты хочешь не интерпретировать язык, а эмулировать компилятор. A=B, C=B, out=C. В двух случаях результат разный, до компиляции есть переменные и taint, после компиляции этих сущностей нет.
    Раньше нужно было понять язык, это недалеко от совершенства делают бям и могут символическое исполнение и восстановить логику. Теперь же нужно наоборот, какой то невнятный изврат с компиляцией, wtf?. Это какая то плохая школа.

     
    Последнее редактирование: 11 окт 2026 в 00:52
  13. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
  14. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    599
    Вот вы тут все что-то обсуждаете, а вы все поняли, что имел в виду топикстартер? Я вообще не понял, чего он хочет сделать и как вообще видит себе, как это будет работать и как и кем будет использоваться.
     
  15. Dmitriy1973

    Dmitriy1973 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2026
    Сообщения:
    5
    Привет уважаемое сообщество WASM.
    Спасибо за Ваши отзывы. Мне понравилась Ваша идея с внешнем видом языка. Это не главное в языке, в конце концов, можно сделать изменяемый вид (для эльфов), но вот только не пойму, почему Вы игнорируете название темы «универсальный язык программирования». Я считаю, что получиться действительно универсальный язык (который может всё). Я понимаю, что для Вас универсальный язык программирования, это как красная тряпка для быка, но я прошу отнестись к этой идеи без эмоций, а с холодным расчетом. Я уже писал – «Работаю над средой разработки», поэтому план реализации такого языка готов. Рассмотрим эту реализацию. Есть три столбца. Первый столбец это машинный код. Второй столбец это команды ассемблера (выглядит пока как программа hiew и та же взаимосвязь между столбцами). Третий столбец это ассоциации программиста. Есть еще и нулевой столбец (пока думаю сделать скрытым и показывать по желанию) который считает количество тактов, количество транзисторов, затраты энергии. У всех столбцов есть свой редактор (их тоже четыре). Рассмотрим работу третьего столбца с его редактором. Допустим, Вы описали (есть возможность загрузить готовые) логику работы первого и второго столбца для x86 процессора. Дальше вы пишите во втором столбце (на ассемблере) свои программы и Вы замечаете что часто используете один и тот же код. Например очистку экрана для реального режима текстовый режим экрана (это для примера, чтобы понять логику работы, поэтому не судите строго)
    PUSH BX
    PUSH CX
    PUSH DX
    PUSH BP
    MOV BP, SP ; для корректного доступа, если нужно
    MOV AH, 06h ; функция BIOS: прокрутка окна (очистка)
    XOR CX, CX ; (0,0) — левый верхний угол
    MOV DX, 184Fh ; (24,79) — правый нижний угол (80x25)
    INT 10h ; BIOS видео-сервис
    ; Возврат курсора в (0,0)
    MOV AH, 02h ; функция: установка курсора
    XOR BX, BX ; страница 0
    XOR DX, DX ; DH=строка, DL=столбец -> (0,0)
    INT 10h
    POP BP
    POP DX
    POP CX
    POP BX
    RET
    И получаете одну и туже последовательность цифр
    53 ; PUSH BX
    51 ; PUSH CX
    52 ; PUSH DX
    55 ; PUSH BP
    89 E5 ; MOV BP, SP
    B4 06 ; MOV AH, 06h
    29 C9 ; XOR CX, CX
    BA 4F 18 ; MOV DX, 184Fh
    CD 10 ; INT 10h
    B4 02 ; MOV AH, 02h
    33 DB ; XOR BX, BX
    33 D2 ; XOR DX, DX
    CD 10 ; INT 10h
    5D ; POP BP
    5A ; POP DX
    59 ; POP CX
    5B ; POP BX
    C3 ; RET
    В редакторе третьего столбца пишите название команды. Например «очистить экран». Дальше пишите такой код.
    ClearTextCode DB 53h, 51h, 52h, 55h, 89h, 0E5h ; PUSH BX, CX, DX, BP; MOV BP, SP
    DB 0B4h, 06h ; MOV AH, 06h
    DB 29h, 0C9h ; XOR CX, CX
    DB 0BAh, 4Fh, 18h ; MOV DX, 184Fh
    DB 0CDh, 10h ; INT 10h
    DB 0B4h, 02h ; MOV AH, 02h
    DB 33h, 0DBh ; XOR BX, BX
    DB 33h, 0D2h ; XOR DX, DX
    DB 0CDh, 10h ; INT 10h
    DB 5Dh, 5Ah, 59h, 5Bh, 0C3h ; POP BP, DX, CX, BX; RET
    CopyClearTextCode PROC
    PUSH AX
    PUSH CX
    PUSH SI
    PUSH DI ;
    Настраиваем SI на начало константы
    MOV AX, CS ; код и данные в одном сегменте (CS)
    MOV DS, AX ; используем DS для доступа к ClearTextCode
    LEA SI, ClearTextCode ; SI = смещение константы
    MOV CX, 23 ; длина копирования
    CLD ; направление вперёд
    REP MOVSB ; копируем CX байт: [DS:SI] -> [ES:SI]
    POP DI
    POP SI
    POP CX
    POP AX
    RET
    В будущем Вы пишите в третьем столбце очистить экран и после нажатия ENTER язык ищет в редакторе третьего столбца название очистить экран и делает прыжок, на Ваш код, записанный в редакторе (через CALL) и уже ваш код заполняет первый столбец. Ну а первый столбец делает всю оставшуюся работу.
     
  16. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    902
    Dmitriy1973,

    Вы самостоятельно, без знания прочих макросред" прог-я изобрели макрос, поздравляю :preved:
    Но он не дает универсальности и вообще что это ?
     
  17. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    127
    Универсальный язык программирования (далее - УЯП) - это концепция кроссплатформенного многозадачного языка.

    Классифицирующие признаки УЯП:
    1) По уровню абстракции
    Язык высокого уровня: Абстрагирован от аппаратного обеспечения, использует человекочитаемый синтаксис.
    2) По способу исполнения (трансляции)
    JIT-компиляция: Код сначала переводится в промежуточное представление (байт-код), а затем во время выполнения компилируется в машинный код «на лету».
    3) По парадигме программирования
    Декларативный: Программист описывает что нужно получить, а не как.
    4) По системе типов
    Динамическая типизация: Тип переменной определяется во время выполнения.
    5) По области применения
    Системное программирование, Игровая индустрия, Мобильная разработка, Научные вычисления и Data Science, Встраиваемые системы и IoT, Веб-разработка.
    6) По поколениям
    5-е поколение: Языки логического программирования.
     
    Последнее редактирование: 11 окт 2026 в 16:49
  18. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.060
    Может надо сузить фокус? Не «универсальный язык», а «визуальный макроассемблер для обучения», например.
     
  19. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    127
    Интерфейс:
    0) нулевой столбец, который считает количество тактов, количество транзисторов, затраты энергии
    0,5) столбец, который трассирует микрокод; <--- надо добавить, иначе не получится перехода от транзисторов к опкодам;
    0,75) столбец, который трассирует кэш в рантайме;
    1) машинный код;
    2) ассемблерный код;
    3) УЯП.
    4) Четвёртая (сейчас скрытая) колонка даёт прогноз стоимости
     
    Последнее редактирование: 11 окт 2026 в 17:02
  20. Dmitriy1973

    Dmitriy1973 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2026
    Сообщения:
    5
    Ahimov, Вы не прочитали, а только посмотрели код. Жаль. тогда вот Вам другой пример
    model small
    .stack 100h
    .data
    exeName db 'MYPROG.EXE', 0 ; имя создаваемого файла
    handle dw 0
    errMsg db 'Oshibka sozdaniya EXE!$'
    okMsg db 'EXE sozdan!$'
    ; --- Заголовок MZ (32 байта) + код создаваемой программы ---
    ; поля: подпись, байты последней страницы, страницы, релокации,
    ; размер заголовка, min/max память, SS, SP, CS, IP и т.д.
    exeImage db 4Dh,5Ah ; 'MZ'
    db 26h,00h ; байты последней страницы: 38 (32 заголовок + 6 код)
    db 01h,00h ; число страниц по 512: 1
    db 00h,00h ; число релокаций: 0
    db 02h,00h ; размер заголовка в параграфах: 2 (32 байта)
    db 00h,00h ; мин. доп. память
    db 0FFh,0FFh ; макс. доп. память
    db 00h,00h ; смещение SS
    db 00h,01h ; SP = 0100h
    db 00h,00h ; контрольная сумма (не проверяется)
    db 00h,00h ; IP = 0
    db 00h,00h ; смещение CS
    db 1Eh,00h ; смещение таблицы релокаций
    db 00h,00h ; номер оверлея
    db 00h,00h,00h,00h,00h,00h ; резерв

    exeLen equ $ - exeImage ; длина всего образа = 38 байт
    .code
    start:
    mov ax, @data
    mov ds, ax
    ; ---- 1. Создать файл MYPROG.EXE ----
    mov ah, 3Ch
    xor cx, cx
    lea dx, exeName
    int 21h
    jc error
    mov handle, ax
    ; ---- 2. Записать образ EXE (заголовок + код) ----
    mov ah, 40h
    mov bx, handle
    mov cx, exeLen ; сколько байтов писать
    lea dx, exeImage ; откуда писать
    int 21h
    jc error
    error:
    lea dx, errMsg
    mov ah, 09h
    int 21h
    ну еще надо перенести EXE заголовок в первый столбец. это не макрос, а часть компилятора. Вы в редакторе третьего столбца пишите не макрос, а часть компилятора будущего языка (если захотите), а можно брать из готовых языков конструкции и соединять несколько языков вместе и если надо то добавить свои конструкции или менять конструкции готовых языков.