@PrayHero

Маркетинговые ходы вокруг языка Ассемблер?

Почему в книгах по высокоуровневым языкам ассемблер обвиняют в непортируемости? Ведь опытные программисты укладываются в набор команд 8086. Как и программы на Си, программы на Ассемблере нужно пересобирать под каждую следующую платформу. Разве нет? Почему тогда ассемблерные программы не портируемы? Объясните, пожалуйста, доходчиво.
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
@galaxy
Ведь опытные программисты укладываются в набор команд 8086
Нет. Лет 30 уже никто не пытается уложиться в 8086. Наоборот, если уж берутся писать на ассемблере, то часто с целью использования каких-то железо-зависимых вещей.

Как и программы на Си, программы на Ассемблере нужно пересобирать под каждую следующую платформу. Разве нет?
Что вы вкладываете в слова "новая платформа"?
Другая ОС? - да, надо пересобирать, и часто менять, ведь API разных ОС отличается. При этом C часто позволяет исходный код программы не трогать, т.к. функции стандартной библиотеки, POSIX API предоставляют платформонезависимый интерфейс. А вот в программе на asm соответствующий код придется переписать.

Новая версия ОС? - здесь есть свои нюансы, но собранная статически программа обычно прекрасно работает на протяжении многих поколений ОС (вы же не загружаете новую версию, допустим, игры под каждую версию Windows? Взять вон diablo 2 - как работала она под Win 98, так же отлично тот же бинарник заведется в Win 10).

Новый процессор? - эти вообще паталогически обратно совместимы. Код, написанный или скомпилированный чисто под 30-летний 386 будет работать на i9 (при условии совместимости по пунктам выше).

Возвращаясь к первоначальному вопросу: вы, видимо, не понимаете или не придаете значения тому, что существуют не только x86 процессоры. Изначально ЯП высокого уровня разрабатывались именно с целью абстагировать код программы от конкретного железа. В 60-80-е годы не было единой и даже какой-то одной распространенной железной платформы, что же прикажете, допустим, стандартные утилиты Unix переписывать каждый раз с начала и до конца на новом (подчеркну, НОВОМ, другом) ассемблере?
Даже сейчас, когда вроде бы кругом x86, есть Itanium (ну ок, был в недавнем прошлом), ARM (в виде нескольких версий архитектуры и огромном количестве железных воплощений), где-то теплятся SPARC и PowerISA. Наконец, микроконтроллеры (привет ардуинщикам).

Коротко: ЯП высокого уровня (не только C) позволяются абстагироваться (до определенных пределов) от железа и от ОС и не менять исходный код программ при переносе на другую платформу, ограничиваясь механической процедурой перекомпиляции.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Сразу видно человека, который ни Таненбаума не читал, ни даже Википедию не открыл. Ассемблер это не язык, это транслятор инструкций в машинный код. Ассемблеров ровно столько же столько аппаратных архитектур. Инструкций для одного процессора не будет в другом процессоре и они не взаимозаменяемые. Это самый низкий уровень где нет абстракций (немного утрирую, но по отношению к другим языкам это так)
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Потому что программу на Си можно просто пересобрать.

А программу на ассемблере переписать.
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Почему тогда ассемблерные программы не портируемы?

Потому что программа, написанная на Ассемблере для IBM/360 никогда не заработает на IBM PC :) несмотря на то, что изначально как бы делались одной конторой :)
В 1990 - 1995 годах я очень много программировал на IBM/360, на PL/1 и ассемблере (а там другого не было), гигантские программы писал, сотни макросов имел в запасе.
После того, как перешел на i8086 - большая часть этих знаний пошла в корзину, осталось только общее понимание того, как устроен процессор :)
Ассемблер - это самый нижний из доступных уровней разработки, на нем сейчас пишут только misson-critical секции, потому что это реально машинно-зависимо - на другом семействе процессоров даже той же самой архитектуры уже может не заработать, на другой архитектуре не заработает гарантированно.
Ответ написан
Комментировать
@VitalyChaikin
Если доходчиво, то в этом и отличие высокоуровневого языка от низкоуровневого;
Высокоуровневый -> Компилятор в низкоуровневый язык на заданной архитектуре -> исполняемый код
Низкоуровневый язык на заданной архитектуре -> исполняемый код
Легко заметить что Ассемблер (он же Низкоуровневый язык на заданной архитектуре) уже включает в себя заданную архитектуру, поэтому и не может портироваться на другую архитектуру;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы