Всем привет! Есть у меня задумка - написать компилятор под Win32. С языком еще не определился. Возможно, будет мной же придуманный, смотрю в сторону компромисса между C++ и Python, но это сейчас пока еще неважно. Решил начать просто с записи шаблонной программки типа Хелло ворлд. Очень помог пример по этой ссылке: http://www.wasm.ru/article.php?article=win32appbyhand. Я сначала вбил его руками и убедился, что он работает, а потом повторил его программно, используя структуры для работы с PE-форматом из WinNt.h. В результате получил идентичный выходной файл. Одно но: на тот файл, что я вбил руками, заругался антивирус (!avast), предложив запустить в песочнице. Я настоял на запусе в обычном режиме и попросил это заполнить. В результате теперь этот файл запускается мгновенно (ну может, думает примерно 1 с при первом запуск после старта системы). Тот же, что я создал программно (такой же до байта, сравнивал в Total Commander) - думает 1 секунду всякий раз! Проверял, дело в антивирусе, если его отключить, задержек нет. Подозреваю, что это из-за того, что в PE-файле, который создается по этой статье, все намешано в единственной секции - и данные, и код, и таблица импорта, соответственно, права у нее и на чтение, и на запись, и на выполнение. Но могу быть неправ. Итак, у кого-нибудь есть опыт создания PE-файлов своими силами? Что нужно, чтобы было меньше подозрений со стороны антивируса, которые вызывают ощутимую задержку при запуске или вообще его диалог с пользователем по поводу благонадежности программы? Где-то мне попадалась ссылка, где похожий вопрос был затронут, но там обсуждались какие-то структуры, которые плохо или вообще не задокументированы, но которые все же пишутся обычными компиляторами, в результате чего антивирусы воспринимают выходной файл спокойно. Но вот не запомнил ее, а повторно не найти что-то.
Mikl___, что ты хотел этим сказать? На обоих программных примерах выскакивает ошибка запуска приложения 0xc0000018. К тому же, антивирус имеет к ним претензии, хоть и не говорит, что явных злых намерений нет.
Zemoh На вопрос "у кого-нибудь есть опыт создания PE-файлов своими силами?" я ответил, показал где и как, это и хотел сказать. На WinXP всё работает нормально, а ошибка 0xc0000018 наверное на семерке или Висте? Но о том, что это должна быть не Хр у тебя ни слова не сказано.
Не было сказано. У меня windows 7. Но написание компилятора разве не предполагает автоматом, что выходной код должен идти во всех версиях системы, начиная с Windows XP и выше, а возможно, еще и на Windows 2000? Да и написание какой-нибудь определенной специфичной программы, думаю, тоже не должно быть ограничено одним Windows XP. А свой вопрос "Итак, у кого-нибудь есть опыт создания PE-файлов своими силами?" я задавал не отдельно, а все-таки в связке с последующим вопросом, уже напрямую затрагивающим мою проблему. Гм, я сегодня обновил avast! Теперь он заругался и на программу из одного ExitProcess, собранную в MASM32, хотя написал, что прямых угроз безопасности и нет, но все же предлагал запускать ее в песочнице. А раньше эта тестовая программка выполнялась мгновенно и без вопросов. Похоже, задача написать exe, не вызывающий подозрений, не такая уж тривиальная...
Так, почитал ту забугорную статью про этот Rich Signature авторства Daniel Pistelli. Описывается, как она формируется, но автор кончает статью тем, что выкладывает скрипт, который ее удаляет из PE-файла! Может, она и не нужна, тем более, что пишут ее только микрософтовские компиляторы. Если бы писали и другие, она бы была официально задокументирована, я так думаю.
За саму идею мега респект, но осмелюсь заметить что языки не от балды придумываются, а десятилетиями вынашиваются, развиваются, должны вписываться в контекст спроса на технологии и иже с ним. Т.е. ваша идея отдает максимализмом и конечно мега полезна для ума, но с таким подходом продать это потом у вас не выйдет. Хотя может конечно вы уже оценили все ведущие штук ~50 языков которые используются сейчас в индустрии и знаете чего им нехватает. Тогда я всеми руками и ногами за вашу идею. Например насколько глубоко вы осведомлены в современных тенденциях языков программирования? Насколько глубоко знакомы с функциональным программированием? Кто будет вашим целевым потребителем? В какой сфере вы планируете облегчить работу разработчикам, так как никто от балды переходить на непонятно что пусть даже и классное не будет, когда есть такое же но уже знакомое, и.т.д, и.т.п.
artvy Ваши вопросы, конечно, хороши. Но я поставил себе такую задачу больше для пользы уму - мне тема написания компиляторов/трансляторов/интерпретаторов очень интересна. Уже накопился некоторый опыт. Для студентов (небесплатно делал две курсовых и одну дипломную работу, последняя была особенно сложной. Кое-что навалял и для себя. Просто вот задумал очередной шаг вперед, не хочется останавливаться на достигнутом. Собственно идеи продавать изначально и не было - я не исследовал рынок и его потребности - так/, только слегка в начале этого года прощупал почву на двух сайтах среди участников - что им было бы интересно, идея какого проекта может быть стоящей. Пожалуй, единственное позитивное, что я из этого получил - это идея написания внедряемой виртуальной машины, в основном, для контроллеров (гораздо более легковесной, насколько этого можно добиться, чем Java) и компилятора для нее, обе тулзы должны быть кроссплатформенными, насколько это возможно. Собственно, это мне и подкинул человек, который железом и занимается, как программист и разработчик. Но так как со мной это и рядом не стояло, я в этом направлении двигаться не начал - тут я уже не в состоянии ставить для себя цели, составлять ТЗ. Тут был бы уже определяющим заказ, но я, опять-таки, вряд ли и получил бы такой, так как, повторюсь, меня и рядом не стояло. Идея же написать свой компилятор - и заняться этим - пришла ко мне, после того, как я порешал задачки на Project Euler. Ну собственно, решаю их еще с декабря, но просто тут перерешал парочку ранее уже решенных задач средствами Oracle SQL и PL-SQL, в конце концов, PL-SQL удалось изолировать целиком в row-generating function, возвращающей таблицу чисел, решение уже выглядело практически как целиком состоящее из одного SQL-запроса. В С++ встроенными средствами языка нельзя написать предикаты, осуществляющие итерацию в рамках одиночной инструкции. Но зато можно в Python, как я выяснил, и я начал изучать этот язык. Вот почему я в теме и заикнулся о чем-то, напоминающем симбиоз C++ и Python: меня заинтересовало расширение C-подобного (до объектной ориентированности я в своих наработках еще не дошел) языка интересными инструментами a-la в Python. Так как развивать чисто C-подобный язык мне как-то уже и не очень интересно (свои разработки в этом стиле я не стал продолжать). С функциональным программированием я знаком немного. Знаю, что в Python оно немного поддерживается в Python. Также я немного познакомился с F#.
Да, я пишу не криптор. Но что, мне ради этого писать в саппорты самых крупных антивирусников, чтобы те понизили антивирусные барьеры, только ради того, чтобы несколько моих программок не висело 1-2 секунды, а выполнялось сразу? Как Вы себе это представляете. Ну хотя, может, есть некоторое зерно. Вот как-то бы узнать, каким критериям должны отвечать программа, чтобы она не тормозилась антивирусом? Боюсь, в техсаппортах антивирусов не отвечают на такие вопросы.
Может реально проще будет сделать транслятор в С/С++ который будет преобразовывать код. таким образом можно убить двух зайцев: и свой язык написать с покером и путанами и добиться хорошей оптимизации и кросплатформенности, а также высокой скорости работы.
Гм, пока у меня есть опыт трансляции только в подобие стековой машины, в том числе и ассемблерный код, работающий со стеком для вычисления выражений. Некоторые навыки примения оптимизации уже есть (в дипломной работе делал constant folding и constant propogation), могу их расширять дальше. Хотя, конечно, подобные языки имеются - которые компилируются не в код целевой машины, а в промежуточный код на каком-нибудь широко распространенном языке. Но меня как-то не тянет в эту сторону. По поводу же кроссплатформенности. Я тут говорил (или не говорил? об импорте функций Win32 API, мне он очень нравится, а о других платформах я как-то и не думал совсем. Не уверен, что мир от этого много потеряет Но вот если бы вдруг (вдруг) мне бы удалось создать продукт, пользующийся популярностью, об этом бы стоило подумать. Но и будет ли это? Мне же для себя всякие никсы, маки как-то без надобности...
Господа, дела стали гораздо лучше! Я отделил код от данных и импорта, поместив в отдельную секцию. Антивирус при первом запуске проги как обычно предложил тиснуть в песочницу, я попросил его запускать в штатном режиме. Прис следующих запусках проблем не было вообще! Есть, конечно, над чем поработать - так как в песочницу все равно намерен помещать, хотя потом и нет проблем. Кроме того, я не знаю, как дела обстоят с другими антивирусами - что будет на них. Но основной вопрос решен. P.S. Мое предположение относительно секций подтвердилось, но по-хорошему, и так бы разделять надо на три секции - код, данные, импорт
Ну тут как бы можно поспорить на эту тему. Но я далеко не сразу буду делать поддержку многомодульных программ с отдельной компиляцией модулей, так что компилятор будет сразу писать exe.