23 июн. 2009 г.

Прототип параллельного компилятора

А не задумывались ли вы, что узкое место при разработке чего-либо — это программист? Как бы вы быстро не печатали на клавиатуре, всё равно современные компиляторы компилируют намного быстрее. Мало кто знает, что оптимизация программ заключается не в том, чтобы программы быстро работали на процессоре, а в том, чтобы конечному пользователю было комфортно работать за компьютером. Предлагаю вам прототип параллельного компилятора, который компилирует исходный текст в тот самый момент, когда вы его пишите.

Изначально исходный файл пуст (см. рис. ниже), точно также объектная модель тоже пуста.

По мере того, как вы набираете текст программы, в параллельных потоках компилятор анализирует введенный текст, проверяет синтаксис, создает необходимые внутренние объекты (см. рис. ниже). Например, подключение заголовочных файлов — это вполне самостоятельный фрагмент программы, и компилятор сразу подключает необходимые пространства имен, идентификаторы и прочее. Это отражается в консоли сообщением «Библиотеки успешно включены», а соответствующие строки в редакторе имеют зелененький фон — «всё ок».

В процессе написания кода компилятор делает различные подсказки. В этом примере, в момент ввода последней строки компилятор встретил неизвестный идентификатор. Сразу же пишется сообщение в консоль с предложением задекларировать этот объект локально, глобально или как параметр. Также компилятор сообщает, что определение функции f1 ещё не завершено. Соответствующие строки кода подсвечиваются красненьким. На рисунке ниже показан результат автоматического определения объекта.

В момент написания последних строк программы (см. рис. ниже), компилятор определил, что текущий исходный файл не содержит ошибок и является завершенным. В консоли сообщается, что файл не содержит ошибок, а также информация о том, что функция f1 успешно определена.

Такой компилятор не нуждается в кнопке «Компилировать», потому что синтаксический анализ, построение внутренних объектов и генерация объектного кода происходит в фоновых параллельных потоках. Раз уж сейчас так популярны 2-, 4-ядерные процессоры, то почему бы не сделать такой подарок программистам.

Ответы на некоторые вопросы.

Вопрос: а не будет ли это тормозить, не будет ли трещать постоянно винчестер?
Ответ: если грамотно спроектировать и реализовать, то не будет. Речь идет не о полной перекомпиляции всего файла при вводе очередного символа, а об инкрементальной компиляции, когда перекомпилируется (или докомпилируется) блок, строчка или даже выражение исходного файла. Эти фрагменты достаточно малы, чтобы быть обработанными за считанные миллисекунды.

Вопрос: а как же быть, если мне попался уже готовый проект?
Ответ: при открытии проекта начать его компилировать в фоне, показывая прогресс в консоли.

Вопрос: где можно скачать такой компилятор или среду разработки?
Ответ: мне такие компиляторы не известны. Это только идея, как было бы удобно со стороны пользователя. Частично такая функциональность реализована в IntelliSence в Microsoft Visual Studio, когда на лету анализируются объекты, подчеркиваются неизвестные идентификаторы.

Вопрос: а если нет программы, то где ты делал скриншоты?
Ответ: скриншоты сделаны в Визио 2007.

Если ещё будут вопросы в комментариях, то обновлю пост и допишу ответы.

29 комментариев:

  1. еще лучше чувствуешь себя с Re-Sharper'ом от JetBrains - он очень много полезных штук подсказывает и кучу кода сам генерит (в хорошем смысле этого слова), поэтому меньше отвлекаешься на написание и синтаксические ошибки и больше фокусируешься на смысловой нагрузке. А по поводу скорости набора, имхо, она не так критична - во-первых, все равно больше времени думаешь, чем пишешь, а во-вторых, скорость приходит с опытом :)

    ОтветитьУдалить
  2. Да, но когда у тебя цикл написание—компиляция—запуск—исправление—компиляция—запуск, то тут уже не очень уютно себя чувствуешь. :)

    ОтветитьУдалить
  3. Решарпер значительно расширяет возможности IntelliSence как раз в сторону основной идеи поста.

    ОтветитьУдалить
  4. Наверное, я плохо указал основную идею поста. Она заключается в инкрементальной компиляции на очень низком уровне (операторы, выражения) и полном отсутствии кнопки "Compile".

    Линтинг тоже важен, но это ни для кого уже не новость.

    ОтветитьУдалить
  5. Анонимный23.06.2009, 16:42

    Причем тут компиляция? Это обычная проверка синтаксиса, выполняющаяся постоянно. Давно уже есть такое. Например, в QDevelop.
    Изобретатель велосипедов, блин.
    А первый абзац вообще набор бреда. Причем тут клавиатура и компилятор? Оптимизация и работа за компьютером?

    ОтветитьУдалить
  6. Для тупого анона повторяю: компиляция проекта должна идти параллельно с набором исходного кода. Проверка синтаксиса здесь — это побочная фича. Ну что тебе ещё не понятно?

    ОтветитьУдалить
  7. Тупой анон23.06.2009, 19:59

    Ну-ну. Как понять "компиляцию на очень низком уровне"(операторы e.t.c.)? Разве современные компиляторы не компилируют на этом уровне? Или имеется ввиду - ввел оператор и сразу же скомпилировалось? Интересно. Интересно, как Вы собираетесь компилировать незаконченное выражение?

    ОтветитьУдалить
  8. Анониму, о вижу, начинаешь просвящаться. :) Сейчас проясню.

    Ты правильно пишешь, что компилятор переводит операторы С++ в язык ассемблера. Т. е. что-то вроде таблицы соответствия. Когда ты набрал несколько операторов, например:

    int main()
    {
    int a = 0, b = 0;
    cin >> a >> b;

    То компилятор уже может откомпилировать фрагмент программы, потому что эти строки самодостаточны. Ты продолжаешь:

    int c = a + b;
    cout << c;

    return 0;
    }

    Эти строки тоже сами по себе самодостаточны и могут быть по отдельности откомпилированы. А потом тебе захотело поменять cin на scanf. Ты полез, поменял ту строку. А этот умный компилятор не всё перекомпилировал, а нашел входждение старого оператора и заменил его на новый. Т. е. транслировал в ассемблер одну единственную строчку.

    Как-то так. Если всё равно мутно, то могу попробовать нарисовать диаграмки, прояснить, что имеется в виду выше.

    ОтветитьУдалить
  9. Анонимный23.06.2009, 23:01

    >> Ты правильно пишешь, что компилятор переводит операторы С++ в язык ассемблера.

    Я такого не писал. Вы наврали. Но хоть покраснели? Сознайтесь.
    ------
    Не переводит компилятор "по таблице" ничего! Почитайте книги по устройству компиляторов, изучите, например, как работает GCC. Сначала происходит синтаксический разбор кода. Без завершенности кода невозможно провести корректный разбор. Потом код разбирается на токены. Строится абстрактное дерево программы. Тут выполняются различные оптимизации - оптимизируются циклы(например, если можно, переносится условие завершения в конец), оптимизируется хвостовая рекурсия и т.д. А потом уже перевод в процессорно-независимый ассемблерно-подобный код, оптимизация его, и только после генерация асм-кода под конкрентую платформу. Все выше было в основном о GCC, но общие принципы у всех компиляторов.
    Кстати компилятору нужна инфа о всех переменных, используемых в программе. Строится граф зависимости этих переменных друг от друга. Это надо для оптимального распределения регистров под переменные. И тут не прокатит добавление одной переменной без перекомпиляции всего кода, связанного с этой переменной. Регистры будут уже распределены между имеющимися переменными. Как Вы изволите новую впихнуть? Компилируя только "одну самодостаточную строчку"? Без перекомпиляции и перераспределения регистров?

    >> Как-то так. Если всё равно мутно, то могу попробовать нарисовать диаграмки, прояснить, что имеется в виду выше.

    Судя по Вашему "как-то так" мутно у Вас в голове. Ненадо мне ничего рисовать и прояснять. Проясните себе. Учитесь, учитесь.

    ---
    Итак, у Вас 2 выхода: либо Вы читаете книги по устройству компиляторов, после чего приходите сюда и прилюдно каетесь в том, что писали бред. Либо, если не осилите их, Вы честно подаете заявление об увольнении из университета по профнепригодности и идете заниматься соответствующей Вашему интеллекту деятельности - рыть каналы например. Это будет поведением порядочного человека. И студентов не испортите, и обществу пользу принесете. Но я надеюсь, Вы-таки прочтете и поймете.

    Кстати, что за надпись "Современный компилятор" в заголовке окна? Вы отличаете редактор/IDE от компилятора?

    ОтветитьУдалить
  10. товарищ анонимный комментатор, а вам не кажется, что вы немного палочку то перегибаете? я раньше считал, что порядочные люди представляются, а не дули в карманах на парах крутят ;)Есть мнение - выскажи, аргументируй, но зачем на ровном месте оскорблять? блог - это как раз то место, где можно разные идеи обсудить - brain storming могучая штука. Вобщем, искренне желаю Вам, побыстрее повзрослеть, вывести прыщики с лица, избавиться от комплексов и выработать уважение к себе и коллегам.
    А по теме поста - я себе тоже слабо представляю как оно эффективно работать должно, ведь ты когда код пишешь далеко не всегда меняешь одну строчку или оператор. Очень часто используется рефакторинг а ля Rename, Extract Мethod и т.п. С другой стороны билд проекта далеко не всегда из IDE вызывается, а иметь 2 разных компилятора для разных сценариев немного абсурдно. Вобщем я пока остаюсь при своем мнении - могучая IDE отдельно, и быстрый компилятор тоже отдельно :)

    ОтветитьУдалить
  11. Тупому глупому анону: ты всё-таки туп и глуп. Ты пойми, что просто кинуть запрос в Гугл — это не достаточно, чтобы поддерживать здесь диалог.

    А теперь про устройство компиляторов. Во-первых, я очень близко знаком с устройством компилятора VHDL. А во-вторых, я лично написал парсер С++ (стандарт 2003 года) используя FLEX/BISON. А теперь подумай: нужно ли тебе мне объяснять, что происходит с исходником, и как он преобразовывается в токены, как работает BNF, как срабатывают правила в BNF? Специльно не пишу, что такое BNF, чтобы ты дал себе труд прочесть в Википедии. :)

    > Тут выполняются различные оптимизации

    Ты хоть знаешь, что это такое? А в Debug'е они тоже делаются? Если хочешь, я специально для интересующихся предметом написал методичку по оптимизации, можешь скачать и почитать. Ты можешь очень легко это проверить, если будешь писать программу и смотреть листинг ассемблера, как меняется код, когда ты меняешь что-либо внутри. Подчеркиваю, что код ассемблера в дебаге и в релизе будет разный. Компилятор есть? Возьми, попробуй.

    ОтветитьУдалить
  12. Виталя, as-you-type компиляция — это всего-лишь идея, как можно было бы эксплуатировать многоядерные процессоры. Поэтому, каждый отдельный вопрос, типа а "что если" нужно рассматривать, составлять из них требования к такому компилятору и понять, сможет ли он за комфортное для программиста время сделать эти преобразования.

    Вчера ещё придумали компромис: компилятор начинает работать не одновременно с набором текста, а через 2-3 секунды неактивности со стороны программиста. Как только программист вернулся к набору текста — отменять все задачи по компиляции.

    Всё становится сложнее в режиме релиз. Ведь там есть межпроцедурные оптимизации, поэтому изменение одного оператора может повлечь изменения в других функциях или даже файлах.

    ОтветитьУдалить
  13. ну может. Я так понимаю многое зависит от специфики разрабатываемого приложения. лично для меня пока такой компилятор неактуален, хотя, возможно, это дело привычки :) у меня при отладке больше времени занимает "запуск", но его иногда получается минимизировать за счет запуска конкретного юнит теста, а не всего приложения.

    ЗЫ: формочка для текста комментария - отстой :( в ней не работает ни буфер обмена, ни влево-вправо :(

    ОтветитьУдалить
  14. vitalya, оно не работает из-за того, что у тебя фаерфокс. У всех других оно работает. :) У Блоггера есть ряд недостатков, ты не видел, как я мучаюсь, когда постинги делаю. Ещё немного помучаюсь и перееду на Вордпресс на своем домене.

    А в той среде, где ты работаешь, нет edit and continue?

    ОтветитьУдалить
  15. vitalya комментирует...

    > ну может. Я так понимаю многое зависит от специфики разрабатываемого приложения

    Вообще изначально было так: ты пишешь на С++, а в соседнем окне оно тебе рисует результат RTL-синтеза. И ты можешь визуально контролировать, какая логика у тебя получается, что-то менять, что-то оптимизировать.

    ОтветитьУдалить
  16. Андрей24.06.2009, 11:23

    2vitalya: я помоему нигде не перегибал. Веду спор нормально, не цепляюсь к недосказанностям и не приписываю оппоненту своих слов, короче: демагогию не развожу. Так что все порядочно. И мнение я неплохо аргументировал. Скажите, что неясно.
    А насчет анонимности: ну нету у меня аккаунта в ЖЖ, а если я напишу имя, оно скажет не больше, чем "Анонимный". Ну таки ладно, если Вам так нужна личность, а не аргументы, с этого поста начинаю именоваться RL-именем. Да, прыщи мне абсолютно не мешают, их немного.
    2Volodymyr Obrizan: Вы ясновидец, наверное? Уже приписываете мне гугль. А про BNF, спасибо, знаком хорошо и без педевикий.
    И что такое оптимизации, знаю.
    Я перечислил основные оптимизации, используемые GCC на всех платформах. Ой-вей, не написал про перетасовку команд, так Вы сразу придрались. Демагог? Интересно, она где-нибудь нужна, кроме как на x86(-64)?
    И спасибо за отсылку к листингам - моим развлечением компиляция с разными ключами и просмотр листингов было года 2-3 назад.

    ОтветитьУдалить
  17. Андрей, если не ссышь быть ассоциирован с тем навозом, который ты уже написал, допиши ещё свою фамилию, город и номер школы. :)

    ОтветитьУдалить
  18. Андрей24.06.2009, 11:41

    У самоуверенного ламера закончились аргументы, а гугл новых не подкидывает?

    ОтветитьУдалить
  19. Андрей, вот смотри. У меня появилась идея, которая заключается в том, что не нужно ждать пока проект будет написан полностью, чтобы начать его компилировать. Это интересно не только для компиляции С++ в машинный код, но и для синтеза С++ в RTL (может ты ещё и знаешь, что такое "синтез" и RTL?). И вот я набравшись смелости, подписавшись реальным именем, указав где я работаю, выношу эту идею на суд своих друзей.

    Ты пришел ко мне на сайт, не разобрался в этой идее, назвал меня "изобретателем велосипедов", сказал, что я пишу "бред". Дальше, не зная меня лично, не побывав на моих лекциях по оптимизации и параллельному программированию, ты предлагаешь мне написать заявление на увольнение, и называешь "ламером".

    Вот как к тебе после этого относиться и как с тобой разговаривать?

    ОтветитьУдалить
  20. я в студии работаю, но Edit and Continue не использую

    ОтветитьУдалить
  21. Андрей, лично мне, ваше высказывание по поводу проф пригодности\непригодности автора поста показалось абсолютно неадекватным, о чем я, собственно, и написал.

    ОтветитьУдалить
  22. Андрей24.06.2009, 13:56

    >> У меня появилась идея, которая заключается в том, что не нужно ждать пока проект будет написан полностью, чтобы начать его компилировать.

    Т.е. до Вас никто не компилировал незавершенные проекты? Я, например, иногда отдельно взятые функции тестирую, без всякого намека на завершенность всего проекта, и ничего.

    >> назвал меня "изобретателем велосипедов"

    То, что изображено на скринах никак не относится к компиляции, а вполне сходит за проверку синтаксиса. Ну чуть более интеллектуальную, чем УЖЕ использующиеся. Потому и назвал.

    >> сказал, что я пишу "бред"

    Бред-таки пишете, особенно это "таблицы соответсвия операторов асм. кодам". Или Вы кагбэ изложили попроще, чтоб мне, на Ваш взгяляд, тупому, было понятно? Это кстати, и есть ламеризм: считать, что все вокруг тупые и изъяснятся с ними надо на пальцах, как с дикарями. Пишите нормально, не стесняйтесь.

    Таки да, теперь про идею. Сказать и описать суперидею, как все это будет фифигительно, это одно. Вы объясните теперь, как это будет реализованно. Например, у меня написана функция. И Ваш компилятор уже всю ее скомпилировал. Тут я добавляю объявление переменной, и где-то в середину действия с новой переменной и с уже там имевшимися. Как Ваш компилятор скомпилирует только добавленный фрагмент, разведет грамотно переменные по регистрам БЕЗ перекомпиляции как минимум всей функции? "БЕЗ перекомпиляции" -- это не мое условие, это Вы написали что один оператор вполне себе сферический в вакууме самодостаточный объект д;ля вашего "параллельного компилятора"(и вообще, параллельные есть, GCC давно умеет распараллеливаться на несколько потоков. Название забито другими).
    А если у меня инлайн-функция и я ее изменяю. Тут и компиляции на уровне одной этой функции не хватит. Что, Ваш компилятор будет бегать по всем объектным файлам, раздвигать код и впихивать новые команды туда, куда надо? А как же перетасовка команд при оптимизации? Не помешает?
    Таки заново перекомпилировать прощее. И оптимальнее выйдет. Если это вообще не единственный возможный вариант.

    ОтветитьУдалить
  23. > Вы объясните теперь, как это будет реализованно.

    Может мне тебе ещё саму реализацию с исходниками на почту скинуть?

    На все твои вопросы ответ один: этот компилятор должен делать всё точно так же, как и обычные компиляторы, только параллельно с набором текста.

    ОтветитьУдалить
  24. Нашел ссылку: один дядька описывает эту идею. Также есть обсуждение: http://cboard.cprogramming.com/general-discussions/85755-compile-you-type.html.

    ОтветитьУдалить
  25. Андрей25.06.2009, 0:21

    >> этот компилятор должен делать всё точно так же, как и обычные компиляторы, только параллельно с набором текста.

    Вот запустил я компиляцию, открыл Emacs и начал текст набирать. И обычный компилятор(GCC) компилирует параллельно с набором текста. Вот чудеса-то! Вот где Ваша идея-то реализована! Не Вы случайно автор GCC? Ато прям по вашей идее работает!

    >> Может мне тебе ещё саму реализацию с исходниками на почту скинуть?

    Спасибо, ненадо. Сырцы GCC я найду.

    Таки теперь серьезно. Я заметил, что наиболее адекватно ты реагируешь на грубое обращение. Вроде обзывания ламером(и не обхывание это, просто назвал все своим именем). И теперь я буду на "ты". Так лучше.
    Так вот, объясни, майкрософтский ламер, какое отношение имеет компилятор к набору текста? Если всю жизнь сидел в таком дерьме, как MSVS и не отличаешь компилятора от, так сказать, "IDE", не значит, что это одно и то же. Это ты в силу своей ограниченности не отличаешь, нормальные люди отличают. И то, что ты выдаешь за свою суперидею, реализуется, как два пальца об асфальт. Просто запускаем GCC на компиляцию изменившегося файла. Если компиляция прошла успешно - то все, файл скомпилен. Если есть ошибки - то показываем их. Навесить просто продвинутую обработку ошибок, и все.

    ОтветитьУдалить
  26. Касательно такой себе «реал-тайм компиляции»… Я себе с трудом представляю, как такую идею можно эффективно реализовать. С++ — это не BASIC и не Python, и компиляция проходит посложнее. IMHO есть много нюансов, когда такому компилятору придется проделывать не меньше работы, чем «обычному», а иногда и больше (нужно ведь выявить все зависимости от вновь добавленной/удаленной конструкции). А вообще, может я ошибаюсь, но Eclipse автоматически компилирует код, когда нажимаешь Save.

    Касательно оптимизаций в Debug-режиме: некоторые компиляторы делают-таки какие-никакие, но оптимизации. К примеру, тот же MSVC по умолчанию встраивает *не только* inline-функции (даже в дебаге), если посчитает нужным.

    По поводу фичи с автоматической проверкой синтаксиса: http://blogs.msdn.com/vcblog/archive/2009/06/01/c-gets-squiggles.aspx

    Касательно распараллеливания компиляции: и GCC, и MSVC умеют раскидывать таски на несколько ядер. А если нужно распределенно компилить на нескольких машинах, то есть IncrediBuild и distcc

    ОтветитьУдалить
  27. Андрей, у тебя дурное воспитание. Передай это своему папе, если, конечно, он у тебя есть. Разговаривать здесь с тобой больше никто не будет.

    ОтветитьУдалить
  28. GooRoo, понятно, что идея здесь лежит на поверхности и нет труда её понять. Главная задача здесь — эффективная реализация. Но сейчас уже никого не удивишь четырьмя ядрами и 8 мегабайтами кеш-памяти. Так пусть не простаивают, компилируют. :)

    ОтветитьУдалить
  29. Да, гипотетически эффективная реализация такого компилятора может и возможна… но я не вижу ни малейшего смысла. Существуют такие огромные проекты (в принципе, это даже не редкость), где настолько много зависимостей, что перекомпиляция после каждого изменения будет занимать слишком много времени.

    ОтветитьУдалить

Темы

2012 (2) амазон (1) анпакинг (1) артемий лебедев (4) атн (1) аудио (1) аэропорт (1) безопасность (3) бизнес (1) билайн (1) блог (2) будущее (2) видео (11) википедия (5) вымысел (16) гагарин (1) герман (1) гитхаб (1) гугл (3) дед мороз (1) декабрь (1) демотиватор (2) дети (2) дизайн (13) диссертация (2) документация (1) друзья (5) евпатория (1) евро-2012 (1) жадность (1) заяц (1) идея (1) имейл (1) инстаграм (1) интервью (5) интересное (20) интерфейс (13) история (7) как_выжить (4) календарь (1) капитализм (1) картина (1) кмб (6) книга (6) коллекция (4) компилятор (2) конкурс (5) космос (1) лаборатория (1) либералы (1) лингво (1) лузер (6) макаренко (2) макдональдс (2) математика (1) медиапорт (1) ментор (1) металлика (1) металлист (2) метро (7) микрософт (6) миргород (1) москва (2) музыка (3) наркомания (1) новости (17) образование (3) оптимизация (5) основы (14) открытки (3) ошибка (11) памятник (1) патриотизм (3) плагиат (1) плата (1) погода (3) поиск (1) политика (2) полтава (2) праздник (1) программирование (15) прошлое (2) путешествия (8) рейтинг (1) рендер (1) рисунок (2) русские (1) русский язык (1) сайт (4) санкт-петербург (1) сапр (7) сеть (1) си++ (1) синтез (1) системси (1) скриншот (40) социализм (1) соцопрос (3) спектрум (2) спорт (2) срач (2) статистика (1) такси (1) тбб (3) твитер (9) тимошенко (1) украина (5) униан (1) фан (30) фокус (1) фото (39) фотошоп (1) фурсенко (1) футбол (2) хабр (1) харьков (21) хнурэ (19) хобби (4) цитата (2) чехия (1) школа (1) эпл (1) эхостар (1) юмор (1) яндекс (1) clang (2) doxygen (1) english (3) ios (1) llvm (1) msdn (1) outlook (1) PHP (1) stackoverflow (1)

Поиск

Читатели