Как стать автором
Обновить
47
0
Никита Абдуллин @ntkt

Пользователь

Отправить сообщение
Речь не о том.
The /LTCG option tells the linker to call the compiler and perform whole program optimization.

Все равно без компилятора линкер никакой оптимизации не сделает. Т.е. хоть по времени этап и называется «link-time», но за суть производимых оптимизаций — отвечает компилятор. Мы просто добавили еще одну итерацию.

LTO c WHOPR в GCC тем более — реализован как фронт-энд, работает с GIMPLE=промежуточный байт-код, а с линкером связывается как плагин
GCC solves this problem using linker plugins. A linker plugin is an interface to the linker that allows an external program to claim the ownership of a given object file. The linker then performs the linking procedure by querying the plugin about the symbol table of the claimed objects and once the linking decisions are complete, the plugin is allowed to provide the final object file before the actual linking is made.
В Вашем варианте линкер, получается, работает с внутренним представлением компилятора в некотором intermediate-формате и сам генерирует код? Это довольно странно, ему же скармливают объектные файлы известных всем форматов, где нет места промежуточным представлениям кода из кишок компилятора.
А в таком состоянии линкер не может заниматься никакой оптимизацией, даже тупо делать search & replace в машинном коде между несколькими объектными файлами. Ему в общем случае, потребуется дизассемблер, чтобы понять, а что, собственно, за код он правит. Наверное, заинлайнить что-нибудь он сможет, но вопрос, как.

Все-таки логичнее, когда машинный код генерируется до линкера, в GCC это точно так, front-end'ы генерируют промежуточное представление GIMPLE, над которым можно провести дополнительные оптимизации, и глобальные в том числе (даже между языками!), а потом уже генерируются объектные файлы и отдаются линкеру. Вот в этой статье gcc.gnu.org/projects/lto/whopr.pdf это совершенно четко видно, гугловцы предлагают врезаться в workflow компиляции GCC для более агрессивной оптимизации.
Да, что внутри *.TPU лежит я видел. Под байт-кодом я имел в виду итоговый машинный код, неважно, для целевой или для виртуальной машины, а не промежуточное представление компилятора.

Но GNU Pascal, например, выдает голые объектные файлы, совместимые с GCC + свои GPI-файлы c прекомпилированными интерфейсами.

Вот что интересно — можно ли достигнуть модульности малой кровью у произвольного компилируемого в машинный код языка, только добавив к объектному файлу с машинным кодом некоторое описание, а не глубокий срез состояния компилятора.
Здесь интересно скорее то, всегда ли в таких языках при сборке промежуточного формата уже сгенерирован байт-код, или это произойдет позднее.
Если я правильно понял, обсуждаются проблемы модульности в С++ вообще, а именно то, что С++ в общем случае, как минимум, не лучше С ( в котором модульность переложена на компоновщик), а иногда — и хуже, с чем, вероятно, можно и нужно бороться отдельно.

Я, возможно, заблуждаюсь, но если модуль — это тот код, который уже прошел компиляцию, то всегда (когда больше одного модуля) нужен компоновщик, который искренне пытается из объектных файлов собрать и увязать непротиворечивый бинарь? И почему-то компоновщик я вижу в составе ассемблеров (выделенный как отдельный исполняемый файл, или встроенный — все едино).

Конечно, никто не мешает переложить хотя бы часть этой работы на ОС, но речь не о том.
Полностью согласен с автором.

1. Грамматика
Вот-вот, именно поэтому студенты на упражнениях к курсам «теория компиляторов» и иже с ними очень удивляются (и я удивился), почему им сразу не дают написать LALR-грамматику для их любимого С++! Да потому, что даже «С с классами» на ней описывается с большим трудом и грязными хаками.

Для желающих пощупать руками — http://web.archive.org/web/20051229005445/http://www.empathy.com/pccts/roskind.zip — подробно документированная попытка исследователя составить LALR(1)-грамматику для раннего (1989 год) подмножества С++ (нет шаблонов, исключений, булевских типов… ).

In cases where the ambiguities are still exposed by
conflicts (as noted by YACC), to further defer resolution would be
detrimental to a user. I see no benefit in describing a computer
language that must support human writers, but cannot be understood by
humans.

Тут и добавить нечего.

А в существующих парсерах С++ нельзя даже отделить синтаксический, семантический и лексический анализаторы — они взаимоувязаны и переплетены (см. исходники gcc). В С и многих других языках такой проблемы нет — контекстно-свободная грамматика, выберите готовый парсер, получите AST, распишитесь.

2. Модульность
Это беда всех языков, компилируемых в машинный код целевой платформы.
По-другому — никак, только пытаться добавить еще уровень абстракции — очередную виртуальную машину. Где есть промежуточный байт-код — там нет такой проблемы. Какой ценой — отдельный вопрос.
Возможно, LLVM и Clang действительно спасут «отца» и «деда» языковой демократии.

3. Шаблоны
Тот же подход — получается так, что везде в программировании, где вдруг вылезает «нечто», полное по Тьюрингу, нужна отдельная машина, которая это выполняет (и, соответственно, механизмы, чтобы дальше как-то использовать результаты). Иначе — себе дороже. Смотрим в будущее и записываемся в мэйнтейнеры запасаемся попкорном.

4. Сообщения об ошибках
Они настолько «хороши», что ненависть к ним сгорает и испаряется быстрее, чем ко всему остальному. А все потому, что сообщения об ошибках — самый сок со среза всех узлов и подсистем используемого тулчейна и среды разработки в целом. Станет чище язык и стройнее среда разработки — и на хитровывернутые ошибки жаловаться никто не будет!

Читабельный код С++, как ни странно, попадается либо в коммерческом open source (Qt), либо в академическом (да тот же LLVM). То что есть среди прочего — работает, но не читается. Видимо, независимые адепты С++ высших уровней, либо слишком востребованы, либо слишком малочисленны, либо вообще смотрят на open source как Свиборг на свысока.
Он, родимый.
У меня это был бытовой лингвистический шок, особенно от глагола «крыжить».
Боюсь, проблема в том, что термины из ИТ-среды в разговорном русском языке возникают и приживаются намного лучше, чем в официально-деловой его ипостаси (которая у нас, похоже, несколько «оторваннее» от действительности, чем в других культурах). Поэтому либо использовать монструозные конструкции (НЖМД, повязку на глаза и бубновый туз на спину оператору), либо диалектизмо-неформальщину.

Пример, на грани оффтопа, меня лично сильно удивило когда-то — давайте вспомним с ходу и без гуглаподсказок популярное название checkbox'а в народе, помимо «галочка» и «флажок», из шести букв, третья — 'Ы'?
Аллергическую реакцию получить, наверное, можно, раз токсическая доза — десятки миллиграмм на клиограмм тела. Видимо, резиновые перчатки и недоступные для детей/животных места помогут с гарантией.
Ну, цели у проекта такие, что не до GUI'ёв :)

Про покушать-то, да плохо модель стыкуется. Если, положим, даже четверть думает, остальные работают напильником, паяльником и утюгом, то рожают детей выращивают еду, готовят, стирают, убирают и охраняют коммуну созданные в первый день творения Боевые Человекоподобные Роботы??? Может, лет через NNN так и будет, и open source коммунизм наступит по всей Глобальной Деревне.
А чем Вас не устраивают чипы уровня 90х-годов, даже если речь идет о начале 90-х? Они до сих пор вполне применяются, а спутниковая связь и системы навигации — это тоже далеко на 90-е. Космическая электроника, насколько вообще можно понять из общедоступных источников, похоже, строится на проверенной, а не прорывной аппаратной базе (что-то проскакивало о 8086, что используются на шаттлах до сих пор, спустя почти 30 лет с начала программы).

А такие 200 человек (имеется в виду, вероятно, что из них чуть менее, чем половина — PhD c производственным опытом более 10 лет, а вторая половина — рабочие-мастера высших разрядов с золотыми руками) вполне обеспечат себе связь, а захотят — и стратосферный зонд запустят, а собравшись с тысячей таких же светлых умов — быть может, и ракету на низкую орбиту.
Да, проблем быть не должно.
Точно так же — если взять уровень ниже — никто не мешает шифровать весь диск или раздел целиком, а внутри LVM.
Интересный зверек.
В боевом положении снизу смотрится даже интереснее.

Спасибо Вам, испытал сладостное чувство ностальгии по своей исследовательскую работе в 10 классе.
Тогда я реализовывал и сравнивал различные алгоритмы поиска пути на графах, в итоге остановился на А* и подбирал для него хорошую эвристику на двумерной карте с движущимися препятствиями. К счастью, я потерял ее исходники в тот же год, и теперь я не умру от стыда, читая свой код.
Я, прочитав «Распечатайте лого», почему-то представил распечатку трека, который рисует исполнитель-черепашка в интерпретаторе Лого :) Сам, помню, на нем фракталы рисовал :)
12 ...
7

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность