eXeL@B —› Софт, инструменты —› Полноценный C/C++ компилятор |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 14 июня 2016 07:26 · Личное сообщение · #1 Недавно продолжительное время возился с чужим проектом, написанном на сях, и неожиданно для себя увлёкся (сам закоренелый паскальщик). Решил более близко познакомиться с этим языком, но в процессе столкнулся с очень большой проблемой – отсутствием полноценного компилятора. Под полноценностью подразумевается наличие неурезанного встроенного ассемблера. Щупанью подверглись 3 продукта: мелкомягкий, интеловский и поделие от Digital Mars. Первые джва не знают о директиве DB/DW/DD (зато детище MS занимается самодеятельностью в асм-блоке), как следствие не дают возможности создать jump-table (самое смешное, что хаемый всеми багландский компилер не имеет таких ограничений). У последнего нет этого фатального недостатка, но к большому огорчению есть другой – деоптимизация кода левыми инструкциями (не для выравнивания). В общем вопрос такой: существует ли на свете C/C++ компилятор (или может какая-то из версий упомянутых), способный генерить качественный код и обладающий полнофункциональным inline-ассемблером? Я что-то не нашёл. |
|
Создано: 14 июня 2016 08:19 · Поправил: deniskore · Личное сообщение · #2 Используйте Для того чтобы использовать Intel синтаксис используйте параметр -masm=intel, пример: g++ -masm=intel -c source.cpp Code:
Кстати вы можете создать отдельные asm файлы в Visual Studio с нужным вам кодом и вызывать их из С кода как это показано | Сообщение посчитали полезным: Tony_Stark |
|
Создано: 14 июня 2016 09:55 · Личное сообщение · #3 FalseMaster пишет: В общем вопрос такой: существует ли на свете C/C++ компилятор (или может какая-то из версий упомянутых), способный генерить качественный код и обладающий полнофункциональным inline-ассемблером? gcc самый полноценный компилятор из тех что я знаю. ----- PGP key | Сообщение посчитали полезным: plutos |
|
Создано: 14 июня 2016 15:40 · Поправил: reversecode · Личное сообщение · #4 |
|
Создано: 14 июня 2016 17:34 · Поправил: dosprog · Личное сообщение · #5 FalseMaster пишет: как следствие не дают возможности создать jump-table Делается на Си, зачем там тот асм? --Добавлено-- Кстати, это блеф. Нормально на том же MSVC создаётся табличка прыжков. Как массив обычных DWORDs. Другое дело, что потом с ним делать. Сравнительно безболезненно можно использовать эту табличку только в той же функции, где эти метки (адресами которых заполнена таблица прыжков), и заполнять эту табличку, и прыгать по этим адресам можно с использованием директивы __asm{}. Это работает. --Конец добавленного-- Си называют ещё "макроассемблером высокого уровня". Асм нужен при критичных битоверчениях и при использовании специфичных машинных кодов, в остальных случаях это излишние телодвижения. В конце концов, раздельное компилирование никто не отменял - транслировать асм-текст можно отдельно. Добавлено спустя 1 час 43 минуты ntldr пишет: gcc самый полноценный компилятор из тех что я знаю. Да, хвалят его. Вон искомый пример с массивом меток : (Стандартно в Си такого делать нельзя. Метки не могут иметь адресов (типа того). Адреса только у функций. Таблица прыжков в виде массива адресов функций - сколько угодно. Никто не запрещает. Это к вопросу о "полноценности" компилятора) |
|
Создано: 14 июня 2016 21:17 · Личное сообщение · #6 |
|
Создано: 15 июня 2016 02:22 · Поправил: FalseMaster · Личное сообщение · #7 deniskore >> Используйте --> MinGW<--… Про Гнусь в курсе но не рассматриваю этот вариант, потому как он, скажем так (чтобы никого не обидеть), на любителя, коим я не являюсь. Мало того, что задолбаешься набивать кучу (более 50%) лишнего текста, так оно ещё и совершенно непереносимо в отличие от того же MSVC, формат asm-синтаксиса которого сходен с паскальным и фасмовым/насмовым. >> Кстати вы можете создать отдельные asm файлы в Visual Studio… Так и делал (только компилял из батника, ибо самая удобная IDE на мой взгляд – хороший текстовый редактор), но данный подход имеет очень большие неудобства: 1) Несовместимость форматов объявления структур, из-за чего придётся оформлять два хидера (один для Си, другой для внешнего asm-транслятора) и синхронно производить изменения, что рано или поздно приведёт к труднообнаружимой ошибке. 2) Насколько мне известно, на данный момент ни один ассемблер не умеет расфасовывать код/данные по COMDAT'ам, и есть большие сомнения, что в ближайшем будущем ситуация изменится, т.к. на одном буржуйском форуме автор FAsm'а в ответ на соответствующий запрос фактически признался в собственном бессилии, а ведь этот чел – классный программер. Поэтому единственный вариант – это наличие именно встроенного ассемблера, что избавляет от вышеописанных геморов. reversecode >> у каждого свой асм синстаксис, не надо гнать Гнать действительно не надо. Свой только у GCC. У C, Delphi, FAsm и NAsm синтаксис почти идентичен: в NAsm изжопное обращение к полям структур, Delphi не поддерживает директиву "ALIGN", C не поддерживает директивы данных. В остальном синтаксис один в один (кроме спецсимволов в именах меток и автогенерации пролога/эпилога). dosprog >> Делается на Си, зачем там тот асм? Для компактности и удобочитаемости, когда кол-во маленьких подпрограмм измеряется сотнями (например при написании эмуля проца). >> Нормально на том же MSVC создаётся табличка прыжков. Как массив обычных DWORDs. Если ты имеешь в виду нечто подобное: Code:
>> Си называют ещё "макроассемблером высокого уровня". Незаслуженно, по крайней мере в известных мне реализациях. DMC я, кстати, зря похвалил – не принимает он имена в качестве аргументов для директив данных, только непосредственные значения. >> Асм нужен при критичных битоверчениях и при использовании специфичных машинных кодов Не соглашусь. Оптимизатор конечно раскидает по регистрам часто используемые данные, но эвристически заменить весь алгоритм на более оптимальный он сможет лишь обладая человечьим интеллектом, а это означает, что любая циклически вызываемая подпрограмма должна писаться только и только на асме. >> Вон искомый пример с массивом меток… В моём понимании массив меток это: Code:
>> Стандартно в Си такого делать нельзя. Метки не могут иметь адресов (типа того). Вот с этого и надо было начинать и этим же можно закончить. |
|
Создано: 15 июня 2016 02:31 · Поправил: dosprog · Личное сообщение · #8 DenCoder пишет: Нормально на асм в си-проектах можно писать в asm-файлах! Это раздельная компиляция.. FalseMaster пишет: во-1-ых, компилятор этим давится, во-2-ых, куча лишней писанины/закорючек. Чо там он давится.. Нормально всё. MSVC: Code:
Code:
Вон, откомпилированный пример, тот, что выше: e29f_15.06.2016_EXELAB.rU.tgz - JMP_TABL.EXE FalseMaster пишет: >> В моём понимании массив меток это: [...] Ну, инициализацию придётся выполнить динамически. Тут ничего не поделаешь - правила. А так всё будет работать вполне шустро, не хуже, чем на чистом асм'е (если и хуже, то некритично). Можно распотрошить бинарник из аттача, и глянуть - там видно, что да как. FalseMaster пишет: Для компактности и удобочитаемости, когда кол-во маленьких подпрограмм измеряется сотнями (например при написании эмуля проца). Вот для этого Си и предназначен, да. FalseMaster пишет: >> Си называют ещё "макроассемблером высокого уровня". Незаслуженно, по крайней мере в известных мне реализациях. )) Вполне, вполне заслуженно. Когда приходится возиться с Си, мозги работают "по-ассемблерному". В других случаях это не так. Замечено не мною и не вчера - я просто отметил, что формулировка очень удачная. Ну, в общем, эти холивары бессмысленны. Кто как хочет, тот так и делает, в общем. | Сообщение посчитали полезным: plutos |
|
Создано: 15 июня 2016 08:13 · Поправил: FalseMaster · Личное сообщение · #9 dosprog >> Чо там он давится.. Нормально всё. MSVC: >> - что и требовалось. Твой пример ваще не в тему. Требовалось загнать в массив адреса локальных меток на этапе компиляции. >> Когда приходится возиться с Си, мозги работают "по-ассемблерному". В других случаях это не так. "По-ассемблерному" мозги работают, когда пишешь на паскале. Вот кусочек из моего незаконченного проекта на делфях: Code:
Реализовать такое на Си, выдаваемом за высокоуровневый ассемблер, принципиально невозможно, потому как по своей парадигме он, как оказалось, недалеко ушёл от VB. А жаль, не будь всяких идиотских ограничений, можно было бы и поюзать. Я тут нашёл ещё одну разработку под названием "Pelles C". В ней дело обстоит чуть получше. Директивы данных принимают в кач-ве параметра имена меток, правда с какого-то хера только по одной, при том что непосредственные значения можно писать через запятую. Да вот беда, он не могёт в function level linking, ибо автор ниасилил COFF, и потому просто бесполезная игрушка. |
|
Создано: 15 июня 2016 09:56 · Личное сообщение · #10 Спор в общем ни о чем, инструментов и реализаций навалом - чем хотите, тем и пользуйтесь. Всегда можно найти что-то удобоваримое для себя. Насчет встроенного асма в VS, дело тут только в их политике защищенности, сегменты данных и кода должны быть разными и иметь свои параметры доступа, кому это не нравится - используйте VS только как редактор. ----- Everything is relative... |
|
Создано: 15 июня 2016 16:11 · Личное сообщение · #11 Vamit пишет: Спор в общем ни о чем, инструментов и реализаций навалом - чем хотите, тем и пользуйтесь. Всегда можно найти что-то удобоваримое для себя. Согласен. ТС ничем недоволен, видимо, хочет свой компилятор реализовать ) FalseMaster пишет: А жаль, не будь всяких идиотских ограничений, можно было бы и поюзать. Если MSVC/MSVS - пишите в асм-модулях. Кроме того, нет ограничений в свойствах проекта по указанию своего компилятора! Вы просто пользоваться не научились... ----- IZ.RU |
|
Создано: 15 июня 2016 18:02 · Поправил: dosprog · Личное сообщение · #12 Ну, раз так, тогда только Паскаль. Только он. FalseMaster пишет: "По-ассемблерному" мозги работают, когда пишешь на паскале. Вот кусочек из моего незаконченного проекта на делфях [ ASM]...[/ ASM] )) Вот те раз. А где ж там Паскаль? И вопрос - вот этот RET, он возврат куда? И откуда? Code:
"Мозги работают по-ассемблерному" это не значит категориями "DD/DB/DQ", имхо. Впрочем, неважно Vamit пишет: сегменты данных и кода должны быть разными и иметь свои параметры доступа, кому это не нравится - используйте VS только как редактор. Кстати, это выглядело отталкивающе ещё в Turbo-Pascal'е - код вперемежку с данными. Даже чисто абстрактно - такая каша не внушает доверия. И безразлично, что то типа константы, а не переменные |
|
Создано: 16 июня 2016 03:10 · Личное сообщение · #13 и все это только для: FalseMaster пишет: любая циклически вызываемая подпрограмма должна писаться только и только на асме ? | Сообщение посчитали полезным: plutos |
|
Создано: 16 июня 2016 04:44 · Поправил: dosprog · Личное сообщение · #14 Gideon Vi пишет: ? Да всё понятно. Резюмируя - если есть желание не выходить за рамки Си, тогда массив адресов процедур. Это имеет цену, но сулит определённые удобства и будет работать вполне надёжно. Иначе чистый ассемблерный код, линкуемый со всем остальным. Не грешно также и просто на ассемблере программку составить, - зачем там тот Паскаль вообще нужен.. |
|
Создано: 16 июня 2016 06:24 · Личное сообщение · #15 |
|
Создано: 16 июня 2016 07:48 · Личное сообщение · #16 |
|
Создано: 16 июня 2016 09:19 · Личное сообщение · #17 FalseMaster пишет: не дают возможности создать jump-table gcc и clang позволяют создать jumb-table: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html как это реализовано на практике для эмуляции ARM, можно посмотреть, например, https://github.com/citra-emu/citra/blob/master/src/core/arm/dyncom/arm_dyncom_interpreter.cpp |
|
Создано: 16 июня 2016 16:20 · Личное сообщение · #18 DenCoder пишет: Кроме того, нет ограничений в свойствах проекта по указанию своего компилятора! Вы просто пользоваться не научились... а пример можно? А то все на qtcreator да на qtcreator... Вот в студию начал переползать, только привыкать начал... dosprog пишет: тогда массив адресов процедур. не вижу в этом проблемы. И какие расходы? 2-3 команды процессору? |
|
Создано: 16 июня 2016 17:58 · Поправил: dosprog · Личное сообщение · #19 Dart Sergius пишет: не вижу в этом проблемы. И какие расходы? 2-3 команды процессору? Аналогично. Но народ вот нервничает Gideon Vi пишет: Может тогда ты, пока ТС нет, мне объяснишь Попытаюсь. ТС возмущён отсутствием в стандартном Си возможностей по организации массива адресов меток (они в Си локальны), при этом сразу приводит в качестве примера код, который как раз и иллюстрирует, для чего в Си такой возможности нет. Также понятно, что будь в Си такая возможность, кому-то бы понадобился уже массив глобальных меток, а иначе типа Си отстой. В общем, нормально можно с процедурами работать, никаких проблем. VodoleY пишет: а на голом асме всетаки работы больше Это да.. | Сообщение посчитали полезным: Gideon Vi |
|
Создано: 17 июня 2016 20:33 · Личное сообщение · #20 Dart Sergius пишет: а пример можно? Сам пока не пользовался этим, не вижу пока выгоды в смене компилятора. Но в каком-то проекте видел, как это делается и как-то так: В Solution Explorer ПКМ на проекте -> Properties -> Build Events -> Pre-Build Event -> Command Line -> Pre-Link Event -> Command Line -> Post-Build Event -> Command Line -> Custom Build Step -> Command Line Добавлено спустя 0 минут Это для VS2008 ----- IZ.RU |
|
Создано: 19 июня 2016 10:51 · Личное сообщение · #21 Кстати, в студии теоретически можно и на паскале писать, и компилировать, указывая способом выше компилятор. На каждый модуль можно свой компилятор вешать. Только чтобы работал IntelliSense для .pas, как-то поколдовать надо... Кроме того, редактор MSVS обладает кучей полезных опций - кроме IntelliSense, есть поиск парной скобки/кавычки, букмарки, один модуль можно открыть в нескольких вкладках, что может избавить от необходимости разделять большой код на несколько файлов. Нужно быстро сравнить 2 части кода на глаз? - Нет проблем, можно 2 файла или 2 части одного файла просматривать в разных окнах. Второй такой редактор - если только эклипс, но по опыту работы с ним - ИМХО, он заметно уступает. Преимущества работы в IDE MSVS перед Delphi в плане дебага - дизассемблер и отладчик. Не то, что в OllyDbg, конечно, но и не показывает такой бред, как jnz +0x124 ----- IZ.RU |
|
Создано: 25 июня 2016 20:46 · Поправил: ullf · Личное сообщение · #22 |
|
Создано: 26 июня 2016 03:19 · Поправил: dosprog · Личное сообщение · #23 DenCoder пишет: Второй такой редактор - если только эклипс, но по опыту работы с ним - ИМХО, он заметно уступает. Ну Multi-Edit жэ Добавлено спустя 4 часа 7 минут ullf пишет: Самый лучший компилятор тот,который сам собрал из исходников:https://github.com/gcc-mirror/gcc На каком-то этапе перестал интересоваться такими решениями, поскольку код получается непереносимым - не будешь же всюду с собой таскать и настраивать все поковырянные компиляторы и трансляторы. Одни из главных качеств компилятора - это его стандартность и общедоступность. Тут эксклюзивные решения не годятся. |
|
Создано: 26 июня 2016 11:07 · Личное сообщение · #24 |
|
Создано: 26 июня 2016 11:26 · Личное сообщение · #25 си переносимый)) результат компиляции непереносимый | Сообщение посчитали полезным: Vamit, v00doo, ullf, Dart Sergius, FalseMaster |
|
Создано: 04 июля 2016 09:54 · Личное сообщение · #26 |
|
Создано: 04 июля 2016 10:26 · Личное сообщение · #27 ullf пишет: Скомпилированная программа в том же microsoft studio ullf пишет: Если в linux использовать winApi компиляция в VS не подразумевает обязательного использования winapi. использование си не подразумевает обязательного использования winapi. о чем пытаетесь сказать? | Сообщение посчитали полезным: Quadcon |
|
Создано: 04 июля 2016 10:27 · Личное сообщение · #28 |
|
Создано: 04 июля 2016 12:09 · Личное сообщение · #29 Quadcon пишет: Си ничего не знает ни про какие winapi, а вы зациклились на поделке била и дальше ничего и не видите. Открою тебе большую тайну: компилятор с++ от мелкомягких тоже ничего не знает о winapi. Знают о winapi библиотеки и заголовки, которые обычно поставляются вместе с ним. ullf пишет: Си это не переносимый язык. Этому человеку больше не наливать. Не умеете писать на С без winapi или других низкоуровневых функций ( не берем специфический функционал ) - это ваша проблема. |
|
Создано: 04 июля 2016 12:40 · Личное сообщение · #30 Dart Sergius пишет: Открою тебе большую тайну: компилятор с++ от мелкомягких тоже ничего не знает о winapi. Знают о winapi библиотеки и заголовки, которые обычно поставляются вместе с ним. Спасибо, а то я не знал. | Сообщение посчитали полезным: Dart Sergius |
. 1 . 2 . >> |
eXeL@B —› Софт, инструменты —› Полноценный C/C++ компилятор |