| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Кроссплатформеность |
| Автор: Real 4.1.2008, 20:41 |
| Asm он кроссплатформеный или нет? |
| Автор: MAKCim 4.1.2008, 20:55 |
| нет |
| Автор: SABROG 9.1.2008, 21:07 |
| Если я задам вопрос: "C++ кроссплатформенный ?", что вы ответите ? Не язык определяет кроссплатформенность, а компилятор. fasm - кроссплатформенный. Другое дело, что для того чтобы создать кроссплатформенную программу придется писать свою реализацию кода под каждую платформу и с помощью условий делать автоматический или ручной выбор. В большинстве случаев то же самое делается и в C++, стандартные библиотеки C++ я не рассматриваю. |
| Автор: dumb 10.1.2008, 01:15 |
| для начала, стоило бы уточнить: что автор вопроса понимает под "кроссhttp://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B0енностью"? |
| Автор: rei3er 11.1.2008, 10:49 |
| SABROG, ЯВУ - это абстракции, которые преобразуются в код на ассемблере для данной архитектуры код на ассемблере - это просто мнемонические обозначения инструкций, а инструкции не переносимы мнемонику и инструкции нельзя поставить во взаимно-однозначное соответствие при переносе на другую платформу FASM тут вообще не в тему если компилятор есть под разные ОС, то это еще не говорит о том, что при переносе его, скажем, на PowerPC, все программы написанные для x86 скомпилируются в этом суть некроссплатформенности ассемблера |
| Автор: SABROG 11.1.2008, 12:36 |
| Но и не кроссплатформенным ты его не назовешь. Предположим есть старый компилятор C++, он ничего не знает о новых архитектурах, не знает как преобразовывать мнемонику, значит опять же не C++ не кроссплатформенный, а компилятор. Понятно, что это распространяется и на компилятора ассемблера. Если даже на новой платформе нет аналогу mov, xor, add, imul, то есть другие инструкции. И чтобы сделать программу на ассемблере кроссплатформенной, придется просто написать 2 разных кода. На C++ не нужно будет. А если даже нет компилятора под новую платформу, то можно тупо писать машинными кодами, если в этом спец, любой компилятор ассемблера это схавает. И можно ли называть язык кроссплатформенным, если он поддерживат всего два процессора ? Или две операционные системы ? Я думаю, что можно. |
| Автор: SABROG 11.1.2008, 14:22 |
| Если руководствоваться такой логикой, то Firefox не кроссплатформенный, т.к. имеет две версии исходников, одни для винды, другие для линукса. Php, Python, Perl тоже не кроссплатформенные тогда. У каждой ОС свой набор API функций, ни один кроссплатформенный компилятор не знает о них ничего. А что говорить о MSVC или Delphi, они настолько не кроссплатформенные, что в них нельзя создать приложения win16 (не забыли еще о таких ?) или под ДОС. |
| Автор: W4FhLF 11.1.2008, 15:03 | ||
Ты несёшь бред. C/C++ потому кроссплатформенный, что для исполнения программы под другой ОС нужна только перекомпиляция, если ты ограничиваешься только средствами самого языка. Это идеальный случай, в крайности впадать не надо, т.к. везде есть исключения. Скрипты тоже не нуждаются в переписывании, они исполняются на тех платформах, на которых есть интерпретатор. Сами же интерпретаторы не являются КК и их никто такими не считает. |
| Автор: SABROG 11.1.2008, 15:26 | ||||
А теперь подумай, если я ограничусь языком одного ассемблера и напишу программу, которая будет складывать 1+1. То чем она будет отличаться от C++ или Php, чем она не кроссплатформенна ? Кстати помимо fasm'a есть еще gas (GNU Assembler), который работает под *nix'aми и в составе mingw под виндой (as.exe). У него синтаксис AT&T. Поэтому я категорически не согласен с тем, что ассемблер не кроссплатформенный. |
| Автор: W4FhLF 11.1.2008, 15:40 |
Хорошо, а теперь представь, что твоя программа должна складывать введённыое пользователем a и 1, а после выводить результат. В чём может быть задача программы, которая ничего не получает и ничего не выдаёт? PS Напиши кроссплатформенный "Hello World" на асме. |
| Автор: SABROG 11.1.2008, 15:59 | ||
Я писать ничего не буду, но скажу, что в какой ОС не пиши в видеопамять результат один - загараются пикселы на экране. И протокол работы с устройствами через порты (на нулевом кольце) от ОС не меняется никак. Если с этим разобрались, теперь можно попытаться меня припереть к стенке переключением понятия "платформы", начав считать ею процессор, а не ОС. Но даже в этом случае доработав компилятор ассемблер снова становится кроссплатформенным. |
| Автор: W4FhLF 11.1.2008, 16:11 | ||||
Я тоже могу много чего сказать, но слова - это всего-лишь слова.
Есть понятие платформозависимых и платформонезависимых приложений. Если ты работаешь с видеопамятью и устройствами напрямую, т.е. не используешь никаких средств ОС, то это платформонезависимое(native) приложение и к нему термин КК вообще не применим. Так, что не мешай всё в кучу, а просто признай, что ошибся. В этом нет ничего смертельного.
Ога, а ещё мы процессор перепаяем, лишь ассемблер у нас кк стал |
| Автор: SABROG 11.1.2008, 16:34 | ||
| Возьми драйвер клавиатуры в линуксе (в свободном доступе лежит) и драйвер клавиатуры Windows (тоже в свободном доступе DDK) и сравни протокол взаимодействия с контроллером. И тогда мои слова сразу перестанут быть просто словами. Т.е. все-таки ты тянешь в сторону ОС, называя ее Платформой, а не архитектуру. Тогда еще раз спрошу, чем пример с "1+1" тебе не нравится ? Он переносим ? Переносим ! А значит кроссплатформенный. Насчет printf в С++. Ну не имеет компилятор ассемблера таких функций, он что не кроссплатформенным после этого становится ? А может программы которые он создает не должны ничего никому выводить на экран ? Это что обязательное условие кроссплатформенности, кто это утвердил ? Я тоже могу такое условие поставить. Например используя стандартные средства C++ напиши кроссплатформенную программу, которая будет иметь инструкцию вставки любого файла в секцию данных. На фасме
Не сможешь потому, что это особенность компилятора. Если по критерию типа printf ты решаешь кроссплатформенный язык программирования или нет, то в таком случае C++ не кроссплатформенный, т.к. не имеет команд, которые имеют fasm, gas, nasm... |
| Автор: W4FhLF 11.1.2008, 16:49 | ||||||
Ну ты танк
Так чё ж ты в дебри лезешь. Вся эта казуистика ни к чему, она бессмысленна. Я прошу самый простейший пример. Напиши исходник на ассемблере, который выводит в консоль строку "Hello World", чтобы я взял этот исходник, спокойно скомпилил его и там, и там, запустил и поверил. Не можешь написать? Почему? Мешают конструктивные особенности ОС? Вот и всё.
Ты не видишь разницы между компилятором и языком? Ассемблер - набор мнемоник, всё остальное - не ассемблер. Си описан официальным стандартом и printf является частью этого стандарта. Добавлено через 2 минуты и 33 секунды
ok, давай возьмём архитектуру. Напиши мне "Hello World" на ассемблере, а я проверю его на x86 и на Mac |
| Автор: rei3er 11.1.2008, 17:29 | ||||||
раз плюнуть открываем спецификацию на нужный формат исполняемых файлов дальше через fread/fwrite/fopen вставляем что надо куда надо с учетом формата
напиши и чтобы она потом работала на x86, x86-64, MIPS, PowerPC, ... перекомпилировать можно, переписывать нельзя компилятором можешь любым пользоваться на С так
абсолютная кроссплатформенность, пойдет на всех вышеназванных платформах приведешь пример на ассемблере, тогда и будет ассемблер кроссплатформенным |
| Автор: SABROG 11.1.2008, 17:35 | ||||||
| Не вижу никакой разницы между тем, чтобы реализовывать printf для известных платформ в одном исходники и выбирать нужную на этапе компиляции и между тем, чтобы компилятор сам подставлял нужную реализацию printf. Результат один - работающая программа. Ассемблерщик сам себе кроссплатформист, он может сам выбрать будет ли язык кроссплатформенным или не будет, это в его власти в отличае от программистов на ЯВУ.
Не правильно, ты не сможешь на этапе компиляции вставить любой набор байтов в середину программы или в секцию данных. Например:
Если смотреть в отладчике или дизассемблере то после джампа будут идти байты из файла musor.bin, но дебаггер или отладчик его попытаются преобразовать в код.
А и не надо переписывать, внутри одного .asm файла будут все возможные реализации одной инструкции для каждой платформы, а препроцессор сам будет выбирать нужную реализацию исходя из операционной системы на которой производится компиляция. Т.е. совершенно прозрачно для юзера. |
| Автор: W4FhLF 11.1.2008, 17:46 |
| SABROG, я тебя понимаю, но сейчас вопрос стоит не так: "А что было бы, если бы...", вопрос стоит: "Является ли?", т.е. на данный момент. Да и дело тут даже не в возможности, а просто в понимании того, что ассемблер, как набор мнемоник исполняемых отдельным процессором, нельзя назвать кроссплатформенным по определению, т.к. он не имеет никакой абстракции и не может её иметь. |
| Автор: rei3er 11.1.2008, 17:54 | ||
а если на некоторых платформах нет аналогов элементов других платформ? SGDT, LGDT, STR, LTR, INVLPG, WBINVD к примеру как будем ВОЗ реализовывать? |
| Автор: SABROG 11.1.2008, 17:54 | ||||||
| Вот два кода, один Hello, World для линукса, другой для DOS'a. Не вижу никаких препятствий объединить эти два разных кода в один, создать макрос и препроцессорными средствами выбирать один из них: //Linux
//DOS
А если на некоторых платформах нет математического сопроцессора ты как поступаешь ? А если на одном процессоре есть 3d Now!, а на другом нету как программы пишут ? |
| Автор: rei3er 11.1.2008, 17:57 |
под Linux не работает (MIPS) |
| Автор: SABROG 11.1.2008, 18:09 | ||
Не вопрос, вот спека http://dkrizanc.web.wesleyan.edu/courses/231/07/mips-spim.pdf Преобразовывай инструкции в машинный код и вставляй, любой компилятор схавает. Все в твоих руках. Тут попонятнее http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html О, коллекция Hello Worldов для разных архитектур http://www.roesler-ac.de/wolfram/hello.htm |
| Автор: rei3er 11.1.2008, 18:14 | ||
а где кроссплатформенность? |
| Автор: W4FhLF 11.1.2008, 18:18 |
на кончиках пальцев |
| Автор: rei3er 11.1.2008, 18:22 |
мы поэтому и не напишем ничего еще один показатель отсутствия кроссплатформенности вообщем спор бесполезен ps. признать свою неправоту не позорно |
| Автор: SABROG 11.1.2008, 18:26 | ||
Нет, пожалуйста, если есть компилятор, который MIPS'ы еще поддерживает то не вопрос. Я не думаю что все известные компиляторы C++ поддерживают MIPSы. Это что делает язык не кроссплатформенным ? Я вообще считаю достоточно 2 платформы, чтобы назвать язык кроссплатформенным.
Ну это ты не напишешь. А нормальные программисты всегда затыкали дырки эмуляторами или кодом, который делает тоже самое, пусть и медленно. Программа ведь не перестает работать с оптимизацией под SSE или без нее, потому что есть код, который заменяет эти возможности. |
| Автор: W4FhLF 11.1.2008, 18:33 |
Т.е.? Компилятору достаточно поддерживать одну платформу, ибо, если он написан в соответствии со стандартом, то ему плевать под какую платформу написан hello.cpp, он её транслирует в соответствующий набор команд. |
| Автор: SABROG 11.1.2008, 18:44 | ||
Ему не плевать под какую платформу компилить, если он не знает ничего о новом процессоре, то и программа не будет на нем работать. Т.е. пока сам разработчик не отредактирует компилятор включив в него возможность компилить программы для других платформ программы на них работать не будут. И что тогда получится, если я сейчас спаяю процессор на коленке, то смогу сказать, что язык C++ не кроссплатформенный, т.к. компилятор GCC или MSVC, или BC не знают ничего о моем процессоре. Вот вы такой логикой руководствуетесь. Fasm, nasm, gas уже знают больше 1 платформы, а значит кросплатформенные. Причем не только по коду, но и по архитектуре. |
| Автор: W4FhLF 11.1.2008, 18:50 | ||||
Как он может ничего не знать о процессоре под который писался?
Вдолби себе одно: "Язык != Компилятор" и всё станет ясно. А так, это бессмыслица уже даже не смешит. Пиши свои "1+1" и радуйся жизни, а я удаляюсь из этой бредовой дискуссии. |
| Автор: nerezus 11.1.2008, 18:51 | ||
|
| Автор: SABROG 11.1.2008, 18:59 | ||||||
Ок, fasm может работать и в Windows и в Linux. Две популярные ОС, по твоей логике получается, что ассемблер - кроссплатформенный. Кстати возможность asm вставок в код на C++ еще раз делает ассемблер кроссплатформенным, т.к. C++ тянет его за собой.
|
| Автор: AndNot 28.2.2008, 02:43 | ||||
Гы-гы. Позабавило
И это не прикол |
| Автор: MAKCim 28.2.2008, 09:28 |
ну давай перекомпилируй для PowerPC или для MIPS или для ARM |
| Автор: AndNot 28.2.2008, 12:45 | ||
| MAKCim, аппетит приходит во время еды? Сначала речь была о никсах и винде, что я и сделал ;) Но если уж говорить об аппаратной кроссплатформенности, то и здесь асм иногда рулил. Или ты никогда не слышал о препроцессорах? Я сталкивался только два раза. Первый раз, когда переводил код с Z80 на x86. Препроцессор справился на пять, оставалось только подправить работу с железом, впрочем и с сишными сорсами были те же самые траблы. Второй раз столкнулся, когда понадобилось научить тасм командам MMX и SSE, благо был уже готовый код из какой то книжки. Не сомневаюсь, что можно написать препроцессор для компиляции x86 под тот же PowerPC. Только зачем это надо? Аппаратные различия платформ настолько велики, что от кроссплатформенных приложений нет никакого толка, они обречены на отставание от специализированных. Пример? Недавно был холивар с плюсовиками. Пока они отставали, по скорости, совсем немного(порядка 10-30%, на задачках в сотню-другую тактов), то напирали на то, что мол это ерунда, зато кроссплатформенно. Предложил реальную задачу, где крайне важна скорость (простое альфа-наложение). Их отставание стало в несколько раз! После чего один профи(в самом лучшем понимании этого слова) выдал блестящий сишный код:
Так что не надо передергивать, полностью кроссплатформенных языков не может быть в принципе, у каждого свои ограничения. Впрочем можно назвать жабу, но это и не язык, а так, не пойми что (чисто имхо) |
| Автор: MAKCim 28.2.2008, 15:04 | ||
| AndNot, я не спорю, что и на ЯВУ можно писать программы, которые не будут кроссплатформенны однако только лишь по семантике, а не по исходному коду (к примеру, различия между big и little-endian в тех случаях, где это важно) здесь ЯВУ просто заменяет ассемблер и выступает в качестве инструмента, с помощью которого можно сделать те же вещи, только быстрее + его использование дает возможность избавится от большОго числа абсолютно не нужных зависимостей от архитектуры CPU и формата его инструкций в остальном код на ЯВУ переносим, лишь бы был компилятор на целевой платформе а вот насчет препроцессоров сильно сомневаюсь ЯВУ определяет общие операции, отображение которых в инструкции возможно для всех (или для большинства точно) архитектур ассемблер же расширяет круг используемых инструкций, некоторые из которых просто не могут быть преобразованы препроцессором в аналогичные инструкции другой архитектуры возьмем, к примеру, те же CLFLUSH, WBINVLD, MWAIT, PAUSE и пр. по поводу примера, может я туплю, но я не вижу в чем проблема поясни потенциальный затык может быть в месте сдвига на 8
еще раз говорю есть задачи, которые по своей природе не могут быть кроссплатформенными однако все ЯВУ кроссплатформенны |
| Автор: AndNot 28.2.2008, 17:15 | ||||
Правильно делаешь, иначе они бы давно стали пользоваться спросом
Или возьми те проблемы, что возникли у Сишников, при переносе своих программ под 64-х битную архитектуру. Проблемы то возникли на ровном месте - неверная типизация данных. И это показало все "кроссплатформенность" во всей ее красе В этом и есть ответ, почему HLA не пользуется популярностью - ассемблерщикам не нужна полная кроссплатформенность, у них другие задачи. Если кто-то нанял асмовщика, то понятно, что под определенную архитектуру. Ну может еще условие поставят - под никсы и винды, что вполне реально, тем более либ пруд пруди. Собственно я только и хотел упомянуть, что асм может быть отчасти кроссплатформенным, пускай и с ограничениями по аппаратной части, но в остальном вполне реально. Но кому это нужно? |
| Автор: MAKCim 28.2.2008, 18:09 | ||||||
из-за этого С не перестал быть кроссплатформенным
поэтому и надо использовать кроссплатформенные библиотеки, оптимизированные для каждой ОС
причем здесь кроссплатформенность? это руки при правильном подходе проблем с переходом от 32 к 64 нет пример - кроссплатформенная сишная часть кода ядра Linux работает без изменения кода на всех поддерживаемых архитектурах |
| Автор: AndNot 28.2.2008, 20:52 | ||||
|
| Автор: MAKCim 28.2.2008, 22:17 | ||||
а что за данные?
да запросто есть некоторый код на некотором ЯП код является кроссплатформенным, если он без изменения может быть скомпилирован (естественно, при наличии компилятора) и запущен на более чем одной платформе платформа представляет собой совокупность аппаратных (архитектура CPU) и програмных (ОС) компонентов например PowerPC + Linux, IA-64 + Linux, AMD64 + Windows и т. д |
| Автор: dumb 29.2.2008, 09:25 | ||
|
| Автор: AndNot 1.3.2008, 20:36 | ||||
Так в чем вопрос то? Я и не утверждал, что можно на всех, но под две-три вполне реально, было бы желание. Да ничего удивительного ;) Ведь это понятие довольно расплывчатое, каждый понимает его по своему. |
| Автор: overmet 27.10.2009, 10:48 |
Модератор: Сообщение скрыто. |