Применение искинов - шоссе империализма (Стенгазета русификаторов ИТ)

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



статья "Симкод — современный язык ассемблера"

Сообщений 1 страница 21 из 21

1

https://habr.com/ru/articles/840070/

0

2

«Начну с определений»

А надо бы было с аннотации, практической значимости работы, целей и юзкейсов.

«с Си-подобным синтаксисом»

Не хотим знать Си, он вражеский.

«ассемблерной команде add rax, rbx»

Ой, всё. Марков, Андрей Андреевич не стеснялся математические множества русскими буквами называть.

«завершённого и проработанного проекта я не встречал»

И это не он (проработанный проект). Надо ведь будет всё что там на питоне переписать на ассемблере,
иначе не будет бутстрапа. И надо всё это разъяснить, потому что питон тоже не все знают. Разные цели.

«довольно много неактуальных и ненужных терминов и понятий (и, кстати, в IT-отрасли в целом, как я считаю)»

И прямо в статье вводятся новые понятия с новыми определениями. Прям первыми строками (`Симкод`, `Симкоманда`)

Ну допустим, что это такой макроассемблер. Как мне его интегрировать поверх своего, что для такой интеграции заготовлено?

Отредактировано Лис (2024-09-01 13:12:26)

0

3

Тоже полезно.
Практическая работа.

Отредактировано Ivan (2024-09-01 14:56:33)

0

4

Лис
Если вы это всерьёз, то грустно как-то получается, товарищи. (Когда не видят/не понимают достаточно очевидных вещей. Имея при этом имперские амбиции.)
Нет, я не обижаюсь. И разъяснения мне дать нетрудно. Вопрос только, будет ли в этом толк...

Лис написал(а):

«Начну с определений»

А надо бы было с аннотации, практической значимости работы, целей и юзкейсов.

Статья начинается с заголовка. Вы его точно читали? :)
Напомню: "Симкод — современный язык ассемблера".
И этим всё сказано. Тут вам и практическая значимость, и цели, и варианты/сценарии использования. Или вы не знаете, что такое «язык ассемблера» и для чего он нужен?

Язык ассемблера нужен для наглядного представления результатов компиляции языка программирования высокого уровня в машинный код, проще говоря: чтобы убедиться в том, что компилятор не выдал какую-то пургу. Анализировать современный машинный код x86-64 на порядок-два труднее, чем код на языке ассемблера.
(Также настоятельно рекомендую прочесть этот мой комментарий к статье и сравнение симкода с C--.)

Чем не устраивает/плох традиционный язык ассемблера для x86?
1. Раньше, когда различных инструкций в типичных программах использовалось мало, он был хорош, но сейчас всё изменилось. Современная система команд x86-64 с расширениями включает в себя свыше 1000 мнемоник и более 6000 различных инструкций (если считать по опкодам). Более того, если раньше отличия в мнемониках были хорошо заметны (например, ADD, SUB, CMP), то теперь многие мнемоники отличаются лишь в одной букве: VADDSD осуществляет скалярное сложение, а VADDPD — векторное; VCVTSI2SS воспринимает регистр-источник как целое число, а VCVTSD2SS — как вещественное двойной точности (обе эти инструкции преобразуют исходное значение в вещественное одинарной точности).
2. Слишком сильно привязан к английскому языку. Если избавиться от мнемоник, то перевести с английского достаточно только имена регистров.

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

«довольно много неактуальных и ненужных терминов и понятий (и, кстати, в IT-отрасли в целом, как я считаю)»

И прямо в статье вводятся новые понятия с новыми определениями. Прям первыми строками (`Симкод`, `Симкоманда`)

Симкод — это не термин/понятие, это название языка ассемблера. Также как C++ — это не термин, и Python — это не термин.
Если вас интересует более детальное [чем в данной статье] обоснование выбора такого названия, то симкод в чём-то созвучен понятию автокод и по задумке будет:

  • симкод — символьный машинный код (язык ассемблера, т.е. язык самого низкого уровня) и

  • сипкод — символьный промежуточный код (аналог языка LLVM IR, т.е. язык промежуточного представления, который, как можно догадаться, основан на символьной записи, в отличие от языка LLVM, который основан на мнемониках).

(И для обоих «си-кодов» планируется поддержка русского языка.)

«ассемблерной команде add rax, rbx»

Ой, всё. Марков, Андрей Андреевич не стеснялся математические множества русскими буквами называть.

Как я уже писал в статье: «у меня уже есть достаточно хороший вариант перевода [всего симкода, в т.ч. всех регистров x86-64, разумеется]. Но пока что разглашать я его не буду.»
Не буду до тех пор, пока не выскажутся все заинтересованные в таком переводе.
Вас, кстати, я тоже приглашаю поучаствовать (в самом конце статьи есть ссылки на текстовый файл варианта перевода на 5-ти различных платформах). Но пока что, желающих поучаствовать, увы, не нашлось.

«с Си-подобным синтаксисом»

Не хотим знать Си, он вражеский.

Поддерживаю (про «вражескость» Си), но прямо написать об этом в статье на Хабре я не мог, вы же понимаете?
Заодно отвечу здесь на вопрос Юрия:

Первое возражение: ничего не имею против символа ^ в качестве xor. Ну так сложилось в Си. Ведь симкод — он же на основе Си?

Нет. Симкод не основан на Си. Он основан на 11l. Именно из него и был позаимствован оператор (+).
И если учить язык программирования с нуля (что 11l, что симкод, при этом совсем не зная до этого язык Си и другие Си-подобные языки), то очень сложно дать разумное обоснование выбора символа карет (^) для операции «исключающего ИЛИ». А обоснование выбора (+) достаточно логично, и оно приводится в статье про симкод и в документации к 11l.

«завершённого и проработанного проекта я не встречал»

И это не он (проработанный проект). Надо ведь будет всё что там на питоне переписать на ассемблере,
иначе не будет бутстрапа. И надо всё это разъяснить, потому что питон тоже не все знают.

Давайте всё же мухи отдельно, котлеты отдельно.

1. Если вы не согласны с тезисом про завершённость и проработанность, то покажите конкретный пример более завершённого и проработанного проекта символьного языка ассемблера x86. Я уже упоминал в статье terse и HLA, которые не поддерживают даже x86-64, не говоря про AVX.

2. Реализация симкода написана не на «питоне», а на «компилируемом Python» — подмножестве Python, которое компилируется в нативный код посредством транспайлера Python → 11l → C++. Писать реализацию симкода на самом симкоде (и не важно на английской его версии или на русской) — это глупость и безумие, т.к. симкод вообще не предназначен для написания на нём кода, это во-первых; во-вторых, трудоёмкость написания на любом языке ассемблера выше трудоёмкости писания на Python на один-два порядка, таким образом если текущая реализация (которая переводит только в одну сторону — в симкод) заняла у меня 3 месяца работы, на языке ассемблера это заняло бы минимум 30 месяцев работы (но как человек, который имеет практический опыт написания кода на языке ассемблера, я бы не взялся за такую работу даже за очень хорошие деньги); и в-третьих, использование «компилируемого Python» даёт две "уберфичи": 1) утилита доступна онлайн в браузере благодаря Brython вообще без какой-либо адаптации исходного кода и 2) исходный код утилиты русифицируется буквально на раз-два — сначала посредством транспайлера Python → 11l получается полностью человекочитаемый код на 11l (транспайлер специально разрабатывался так, чтобы сгенерированный им код был почти такой, как если бы он изначально писался не на Python, а на 11l; поэтому я хоть и выбираю для большинства своих проектов язык Python, фактически они получаются уже написанными на 11l; просто Python удобнее отлаживать и запускать, пока не готов полноценный компилятор 11lc). Это раз. И два — путём запуска простенького скрипта (наподобие этого) из английского кода 11l получится код на русском 11l.
А бутстрап тоже будет, но на уровне 11lc (который будет написан на 11l). Нет смысла бутстрапать симкод.

Разные цели.

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

0

5

alextretyak написал(а):

Современная система команд x86-64 с расширениями включает в себя свыше 1000 мнемоник

alextretyak написал(а):

Если избавиться от мнемоник,

А каким образом вы хотите от них избавится?

0

6

Ivan написал(а):

А каким образом вы хотите от них избавится?

Предложение «Если избавиться от мнемоник, то перевести с английского достаточно только имена регистров.» не нужно понимать буквально как стремление к полному отказу от мнемоник. Это я говорил образно, гиперболизированно.

Если же хотите увидеть, что конкретно я предлагаю, достаточно просто открыть веб-версию консольной утилиты symasm и вбить команды
VADDSD xmm0, xmm1, xmm2
VADDPD xmm0, xmm1, xmm2
VCVTSD2SS xmm0, xmm0, xmm1

0

7

Лис написал(а):

Не хотим знать Си, он вражеский

Смотрите шире: там математические знаки.
А Лисы "2+7" читают через "плюс" или "да"?

alextretyak написал(а):

Если вы это всерьёз, то грустно как-то получается, товарищи.

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

alextretyak написал(а):

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

Цель определена верно, работа проделана большая и в духе наших традиций (восходящих к Utkin'у и Юрию) - язык для чтения, словарик, математические знаки.

alextretyak написал(а):

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

И это тоже требует немало усилий и времени.

0

8

Решил выложить сюда подробное, по пунктам, моё разъяснение того, почему нет смысла делать реализацию сим-ассемблера (ассемблера симкода) на самом симкоде:
1. Невероятно высокая сложность программирования/реализации на языке ассемблера крупных проектов (а ассемблер для любой современной архитектуры неизбежно будет являться крупным проектом банально по причине большого количества существующих инструкций в современных процессорах).
2. Традиционные языки ассемблера существенно проще парсить, чем симкод. Таким образом, реализовать сим-ассемблер ещё сложнее [чем традиционный ассемблер].
3. Разобраться в написанном ассемблерном коде может только тот, кто его написал. Если посмотреть на страницы проектов fasm, fasm2 и fasmg, то видно, что Томаш Грыштар является единственным контрибьютором у этих проектов. И это при том, что fasm является всемирно известным проектом и существует много-много лет. После ухода из жизни Томаша, очевидно, никто не возьмётся поддерживать разработку fasm (т.к. существует много других ассемблеров, написанных на Си и более высокоуровневых языках). Томаш совершил подвиг. Но повторять этот подвиг уже нет никакого смысла.
4. Для того, чтобы иметь хоть какую-то возможность использовать язык ассемблера для разработки крупного проекта, приходится использовать макросы. Тот же fasm имеет очень мощный макропроцессор. Я же не вижу смысла делать такую штуку для симкода вообще — макросы используются для написания кода (а симкод нужен для чтения) и это ещё один "недоязык", плодить которые я не хочу.
5. Код, написанный на языке ассемблера, жёстко привязан к одной архитектуре процессора. Даже если x86 останется с нами навсегда, тот факт, что fasm работает только на одной архитектуре x86 уже сейчас неудобен — на ARM или RISC-V процессоре напрямую запустить fasm не получится. (Да, fasmg может производить машинный код для различных процессорных архитектур, но сам то он работает только на x86.)

В принципе, если поставить задачу реализации только минимального набора ассемблерных инструкций, необходимых для раскрутки ассемблера, то эта задача существенно проще реализации полноценного ассемблера типа fasm, поддерживающего все инструкции архитектуры x86. Вот только какое практическое применение у такого "урезанного" ассемблера? Ведь кроме компиляции самого себя он ни на что не пригоден. Чтобы его можно было практически использовать, необходимо добавить поддержку большого количества инструкций, используемых компиляторами языков высокого уровня. А для реализации такого проекта использовать язык ассемблера абсолютно нецелесообразно (по причинами, которые я только что перечислил [кроме разве что 2-й, которая специфична для сим-ассемблера]). Значит, для реализации полноценного ассемблера придётся использовать какой-то более высокоуровневый язык программирования, и необходимо будет переписать реализацию ассемблера уже на этом языке. Но тогда возникает вопрос, а что делать с исходным кодом уже написанного "урезанного" ассемблера? Выкинуть? Ведь ничего другого по сути и не остаётся. Тогда зачем его вообще реализовывать [этот "урезанный" ассемблер]?

0

9

alextretyak
5 пунктов - 5 ошибок.

0

10

alextretyak написал(а):

нет смысла делать реализацию сим-ассемблера (ассемблера симкода) на самом симкоде:

Почему? Mожно перейти на сим-ассемблер в дальнейшем, после реализации простого синтаксиса.

alextretyak написал(а):

1. Невероятно высокая сложность программирования/реализации на языке ассемблера крупных проектов (а ассемблер для любой современной архитектуры неизбежно будет являться крупным проектом банально по причине большого количества существующих инструкций в современных процессорах).

Эту сложность можно преодолеть. Классифицируйте команды.

alextretyak написал(а):

2. Традиционные языки ассемблера существенно проще парсить, чем симкод. Таким образом, реализовать сим-ассемблер ещё сложнее [чем традиционный ассемблер].

Возможно, попробуйте упростить его сначала. Задача найти множество L0 для раскрутки.

alextretyak написал(а):

3. Разобраться в написанном ассемблерном коде может только тот, кто его написал. Если посмотреть на страницы проектов fasm, fasm2 и fasmg, то видно, что Томаш Грыштар является единственным контрибьютором у этих проектов.

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

alextretyak написал(а):

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

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

alextretyak написал(а):

5. Код, написанный на языке ассемблера, жёстко привязан к одной архитектуре процессора.

Это верно в части регистров, организации памяти.

alextretyak написал(а):

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

fasm наверное тоже не сразу оброс функционалом.

alextretyak написал(а):

Но тогда возникает вопрос, а что делать с исходным кодом уже написанного "урезанного" ассемблера? Выкинуть?

Да, урезанный ассемблер при раскрутке написанный на другом языке не понадобится.

alextretyak написал(а):

Тогда зачем его вообще реализовывать [этот "урезанный" ассемблер]?

Для раскрутки. Он должен быть максимально простым.

Отредактировано ИванАс (2024-10-01 15:45:08)

0

11

5 исправлений - 5 новых ошибок.

0

12

gudleifr написал(а):

5 исправлений - 5 новых ошибок.

слишком кратко, распишите.

0

13

ИванАс написал(а):

распишите.

Например, п.1. Посыл: "Слишком сложно". Поправка: "Классифицируйте". Правильный ответ:
Зачем нужен язык ассемблера? Правильно для реализации в программе структур, которые невозможно реализовать на языках высокого уровня. Существует ли структура, которая способна ассемблировать наиболее простым и очевидным способом? Конечно, раз есть много способов, значит и существует "самый" в любом смысле. Реализуем эту структуру на языке асеемблера, способном реализовать любую структуру по определению. Очевидно мы получим программу не сложнее средней. Ч.Т.Д.

Почему здесь бесполезно давать такие ответы? Потому, что и Вас и alextretyak учили программировать совсем не так. Вы не умеете в математику. Не умеете видеть за заученными операторами конечные автоматы.

0

14

gudleifr написал(а):

Очевидно мы получим программу не сложнее средней. Ч.Т.Д.

Можете показать программу? Теорию я знаю в рамках нужного и матанализ изучал.
Чтд в виде программы интересует, а не ввиде размышлений.

0

15

ИванАс написал(а):

Чтд в виде программы интересует, а не ввиде размышлений.

Именно это я и говорю. Вы не видите "программу", потому что не понимаете, что она должна делать.

P.S. Код я приводил и объяснял. Да, что я? Классиков дофига.

Отредактировано gudleifr (2024-10-01 17:23:30)

0

16

gudleifr написал(а):

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

Язык С\С++ относится к языкам высокого уровня по вашему мнению?

gudleifr написал(а):

Реализуем эту структуру на языке асеемблера,

все на уровне общих слов. Какая структура?

Отредактировано ИванАс (2024-10-01 17:28:18)

0

17

ИванАс написал(а):

Язык С\С++

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

0

18

gudleifr написал(а):

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

gudleifr написал(а):

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

Плохо приспособлен, не значит что не невозможно. Вы выдаете не правильные ответы. ЧТД.

0

19

ИванАс написал(а):

Плохо приспособлен, не значит что не невозможно.

Вас обманули.

0

20

alextretyak написал(а):

Если посмотреть на страницы проектов fasm, fasm2 и fasmg, то видно, что Томаш Грыштар является единственным контрибьютором у этих проектов.

Зато сами эти проекты не являются единственными в своём роде. Я был удивлён, когда узнал, что в этой цепочке раскрутки fasm не используется.

0

21

alextretyak написал(а):

тот факт, что fasm работает только на одной архитектуре x86 уже сейчас неудобен — на ARM или RISC-V процессоре напрямую запустить fasm не получится.

Вот тут самое время приглядеться к языку программирования Си (который ещё называют "переносимым ассемблером").
Т.е. ассемблер реализовывается в машинных кодах, артефакты - распечатка дампа (минимального размера) + утилита загрузки дампа.
А на ассемблере должен быть написан компилятор Си, артефакты - ассемблерный код компилятора + бинарник ассемблера под архитектуру.

Понятно, что всё хочется минимизировать, назвать Си ассемблером (как это делает ИванАс), и запихнуть всё в одно.
Но мне кажется, что так не сработает в принципе,
и точно не взлетит проект ИванАс, потому что его цель неправильная. Он "упражняется в раскрутке", и возможно получит результат,
но стране-то нужно не это (не такой результат).

Понятно, что это по моему мнению. Вот и увидим, кто ошибается, я или он.

Отредактировано Лис (2024-10-02 05:07:09)

0