asmlamo, продолжите свой вопрос "К языку с какой типизацией относится ASM ? ХХХ или YYY ?" чувствуете, что он вне этого измерения? Можно, конечно, al ah в rax и eax типами обозвать и притянуть к типизированным языкам, но зачем? Он вне этой картины. Это же опкоды под мнемониками, какую хотите, такую типизацию и сделаете.
Ассемблер это бестиповый язык (кстати не только Ассемблер бестиповый), по этому к нему не относятся понятия типизации, такие как статическая или динамическая, слабая или сильная и прочее.
тут всё зависит от того, что называть типизацией любой процессор имеет элементарные типы, коими оперирует == а-ля целые беззнаковые числа, целые знаковые, числа с плавающей запятой... в яп-ах из этих элементарных типов собирают более сложные типы а-ля строки, длинная арифметика итд-итп.
У ассемблер слабая типизация, у регистров по сути её нет(eax = dword), в ячеек памяти ещё есть, и это всё, не очень хорошо. Надо бы усилить типизацию ассемблера, чтобы меньше ошибок делать. Поддержка указателей, массивов и многое другое, но только без фанатизма. Решения могут быть разные, новый ассемблер с нуля, доработка UASM или FASM. Тут мелькал RASM со своими идеями, там можно любою или почти любую команду макросом переопределить. Например, как преодолеть невозможность нормального использования символов !<>() в UASM. Я придумал добавить оператор FORTOK, как и FOR разбирает строку, только не на символы, а на токены, т.е. номера символов и номера переменных, которые затем могут обработаны специальными операторами. В общем, ассемблер, это - ЯП с частичной и слабой поддержкой типизации.
А я поддержу Intro, но что ниже на строгость не претендует. Типы регистров: это примерно как типы ячеек кеша (динамические), чего заслал такой и тип, контроль когда в память регистр отсылаешь. И типизации операций возможны, но многое определяется железом. Пока микрокод подписывать вне разработчика не научатся.) Тогда пойдет речь о типизации микрокода.) Нужны динамические (хоть в каждом участке) условия проверок допустимости операций для различных типов переменных. От жесткости условий проверок будет зависеть как степень контроля за ошибками, так и сужение спектра приемов программ на ASM. Могут быть разные уровни сертификации кода - "что там можно, что нельзя".
О чем разговор, я не понимаю, ассемблер - это язык железа, если вы хотите типизацию, то делайте свое железо, которое умеет в типизацию. Если вы делаете типизацию текущему ассемблеру, вы по сути придумываете новый яп, который низкоуровневый, да, но уже более высокий уровень абстракции, чем ассемблер. Есть же навороченные макросы в FASM, я думаю, что хоть какой то тайпчек можно на них реализовать.
Согласен. Предлагаю еще добавить в ассемблер ООП (обязательно на уровне С++23), лямбды и корутины. Все это давно есть в нормальных языках, не понимаю, почему тут тянут. Типизацию наоборот сделать динамическую, как в петоне.
Надо, надо, это всё надо. Как раз нужен новый ЯП, занимающие промежуточное положение между С++ и ассемблером Code (ASM): ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Quick sort v1.01 ;; http://rosettacode.org/wiki/Sorting_algorithms/ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .386 .model flat, stdcall option casemap:none include msvcrt.inc include macros.asm .code align_proc quicksort proc uses esi edi ebx pBegin:ptr sdword, pEnd:ptr sdword ASSUME edi:ptr sdword, esi:ptr sdword mov edi, pBegin ;указатель на первый элемент массива mov esi, pEnd ;указатель на последний элемент массива .if (edi!=esi) ;pivot = pBegin[(pEnd - pBegin + 1)/2];//ecx lea edx, [esi+1*4] .for (edx-=edi, edx>>=3, ecx=[edi+edx*4]: : edi+=4, esi-=4) .for (: sdword ptr [edi] < ecx: edi+=4) .endfor .for (: sdword ptr [esi] > ecx: esi-=4) .endfor .break .if (edi >= esi) swap [edi], [esi] .endfor quicksort(pBegin, &[edi-1*4]) quicksort(edi, pEnd) .endif ASSUME edi:nothing, esi:nothing ret quicksort endp createSpisok(spisok, sdword, 4, 65, 2, -31, 0, 99, 2, 83, 782, 1) main proc C argc:sdword, argv:ptr ptr, envp:ptr printf("Quick sort.\n") .for (esi = spisok.pFirst: esi <= spisok.pLast: esi+=4) printf("%d ", dword ptr [esi]) .endfor printf("\n") quicksort(spisok.pFirst, spisok.pLast) .for (esi = spisok.pFirst: esi <= spisok.pLast: esi+=4) printf("%d ", dword ptr [esi]) .endfor printf("\n") xor eax, eax ret main endp main_startup3_END Прикольный же код. А если добавить контроль типов, т.е. ASSUME edi:ptr moy_class. TypePtr(edi) возвращает moy_class в виде строки. И тогда шаблоное программирования резко облегчается, ещё бы таблицы добавить как в Lua.
Я уже как то выкладывал сюда, но спецы тогда обмазали его гуаном: есть https://www.x-sharp.net/ - высокоуровневый ассемблер из проекта Cosmos (это типа бесполезная ось на C# написанная). Не знаю насчет статической типизации, но он явно выше уровнем обычного ассемблера.
Кстати, оператор = не годится для как оператор "присваивания" в МАСМ подобном синтаксисе, надо использовать := как в паскале. С-- приказалдолгожить т.к. Си хотел слишком похожим на ассемблер. А надо наоборот, чтобы ассемблер стал похожим на С и С++.
В общем асм разный бывает. Мой стиль к примеру это всегда указание сишных типов(eg Pstruct def ptr struct). Там от асма остаютcz в основном только регистры, а вот макросы я предпочитаю не использовать - делают сурец нечитабельным На чистом никаких типов нет, те которые есть они железячные.