LINUX.ORG.RU

Реализация FastCGI на современном C++

 , ,


1

3

Доступна новая реализация протокола FastCGI, написанная на современном C++17. Библиотека примечательна простотой в использовании и высокой производительностью. Возможно подключение как в виде статически и динамически связанной библиотеки, так и через встраивание в приложение в форме заголовочного файла. Кроме Unix-подобных систем обеспечена поддержка использования в Windows. Код поставляется под свободной лицензией zlib.

>>> Источник

anonymous

Проверено: Shaman007 ()

Ответ на: комментарий от delightfish

Да и проверить ты это можешь очень просто - отлинкуй и собери.

чего именно и как именно `отлинкуй`? от отлинкуя слышу.

Что ты несёшь, поехавший.

что ты сам несёшь, поехавший?

First, the Rust compiler (just like clang, for example) does all the Rust specific stuff like type and borrow checking; in the end, it generates LLVM-IR

Нет. Никакой ir раст-говнокомпилятор не генерирует. Это всё, что нужно знать о тебе и подобных тебе балаболов в интернете.

rustc --help|grep -C 1 emit

       --emit [asm|llvm-bc|llvm-ir|obj|metadata|link|dep-info|mir]
                        Comma separated list of types of output for the
                        compiler to emit

то есть, с нужным ключом генерирует LLVM IR. с другим ключом сразу линкует object file.

С каких пор llvm стал бекендом?

да всегда был

Ты - жертва пропаганды.

нет, ты.

llvm является компилятором. Он, одновременно, является и бекендом и мидлендом и часть фронт

ну это очевидно. фронтенд чего? фронтенда там может и не быть. если ты например, посмотришь примеры самого llvm например про недоязычок kaleidoscope на ocaml/c++/whatever, (кстати, по синтаксису типа `обычное пистоноговно`, но по семантике нет — нет пистоно рантайма, поэтому это разные недоязычки).

то там в этом примере фронтенд написан на ocaml, например, где есть ADT и паттерн матчинг и поэтому писать его проще. а потом фронт генерирует LLVM IR, промежуточное представление. которое можно собирать и отдельными LLVM тулзами, не писать свой бекенд и часть мидлэнда — оптимизатор проходов компиляции, а использовать все 10500 проходов готовые. в чём, собственно и основной профит от LLVM в частности, и SSA представления, в общем — где относительно просто делать такие composable проходы.

часть компилятора недоязычка kaleidoscope, мидл енда, которая реализует семантику этого недоязычка (которой в учебном примере нету, лол) — все равно писать придётся. то есть,

llvm является компилятором. Он, одновременно, является и бекендом и мидлендом и часть фронт

эту часть мидлэнда не реализует. какую часть фронт енда реализует llvm, кстати? разверни тему. а то из того же примера про kaleidoscope, его, фронтенд весь пишут руками.

фронтенд — парсер и лексер, часть семантического анализа

мидл энд — часть семантического анализа, оптимизатор, проходы оптимизации

бек енд — кодогенератор, линкер и т.п.

anonymous ()
Ответ на: комментарий от delightfish

Твоё пхп является лишь огрызком фронтенда.

ну не знаю как пхп (кстати, при чем тут оно? в Zend там байткод, и поэтому тяжёлый, относительно, рантайм. в расте рантайм минималистичный, даже зависимость от GC не нужна)

а например, в kaleidoscope примере есть только фронтенд, и частично мидл (про семантический анализ, для поддержки рантайма).

среда выполнения любого языка состоит из среды времени выполнения и среды времени компиляции. в некоторых языках всё задано в рантайме (например, в питоне). но есть подмножество, которое можно компилировать (например, cPython). при этом это подмножество работает в компайл-тайм среде. выполняется другое надмножество в рантайм среде.

поэтому недоязычки kaleidoscope и пистон всё-таки разные — у них разные компайл-тайм и рантайм-среды, разная семантика, разная самодостаточность.

в некоторых языках нет особой разницы между рантайм и компайл тайм средой. то есть, например язык и компилятор реализован как библиотека. и его можно дёргать во время компиляции, из компайл тайм среды. например, лисп (скорее, схема), форт, D с CTFE, nim, частично тот же раст. ещё что-то было где компилятор как библиотека, явно.

поэтому эти языки мощнее: их можно расширять макросами времени компиляции. при этом они всё ещё самодостаточны, а если язык нормальный, то и содержат минималистичные зависимости и zero-cost abstractions. которые именно потому бесплатные в рантайме, что развёрнуты в типичное шаблонистое С++ говно, в компайл тайме.

при этом им всё ещё можно обкоцать рантайм зависимости из-за продуманной семантики языка и мощности самих абстракций (которые и должен поддерживать рантайм).

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

в расте тоже GC нет и не нужно. можно обойтись, если выводить что-то из лайфтаймов (например, выводить raii из лайфтаймов). или в языке с region-based memory allocation, тоже не современный GC без контроля над управлением памятью не нужен.

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

Как же с вами, жертвами пропаганды, сложно.

и я про то же. типичный с++ одепт — вступай и компелируй.

anonymous ()
Ответ на: комментарий от anonymous

то есть, с нужным ключом генерирует LLVM IR. с другим ключом сразу линкует object file.

Почему ты такой тупой? Что ты этим мне хочешь показать? Я тебе уже сказал, что llvm-ir генерирует llvm. Запомни это и не неси мне херни, клоун.

да всегда был

Полная чушь.

фронтенд — парсер и лексер, часть семантического анализа

Это делает недокомпилято раста. Для своего недоязычка.

мидл энд — часть семантического анализа, оптимизатор, проходы оптимизации

И тут тоже ты обосрался. Никакие оптимизации раст-говне не делает, никакого оптимизатора там нет. Он есть в llvm.

бек енд — кодогенератор, линкер и т.п.

Тут ты так же обосрался. в llvm нету кодогенератора и линкера. Он есть в экосистеме llvm. Но сам llvm ничего из этого не умеет.

Т.е. по твоей классифицкации llvm - является медлендом, чем он и является по определению авторов и является реально.

delightfish ()
Ответ на: комментарий от anonymous

Давая я тебе, клоуну, расскажу как это происходит в llvm.

llvm требует от своего фронта следующего. Разобрать недоязычок во что угодно. Далее, llvm даёт фронту либу с функциями вида «создать функцию.» «создать глобал», «создать структуру» и прочее. Точно так же «вызвать функцию», «создать переменную», «сложить переменные» и прочее.

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

Твоё emit вызывает логику llvm, которая дампит его же внутренние представление.

delightfish ()
Ответ на: комментарий от delightfish

Гц не может.

чего он не может?

Ненужны некоторые - нужны все.

какие все?

Ты отвечаешь на тезисы, которые написаны ГЦ раста. ГЦ в расте есть. Он там нужен.

нет, не нужен. достаточно умный компилятор мог бы вывести нечто с регионами или нечто вроде RAII из лайфтаймов раста.

другой вопрос, что похоже это ещё не — «вы находитесь здесь» где-то совсем рано до этого

например, те же зелёные нитки и корутины. были сделаны библиотекой. то есть, можно таки реализовать их в компайл тайме с бесплатными абстракциями, без лишних зависимостей в рантайме (согласно раст машине и описанию семантики рантайма, который этих зависимостей не требует. в отличие от того же Go в котором — явно требует).

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

то же самое с лайфтаймами. если что-то подумать насчёт вывода ручной/автоматизированной ручной аллокации типа того же RAII из лайфтаймов, делать их например макросами раста, плюс таки понять что уже может делать компилятор раста а чего он не может, и как его расширить в комайлтайме, чтобы таки смог — можно получить zero-cost abstractions без GC.

GC не нужен в расте.

другое дело, что в текущей реализации раста это может быть не совсем так, и что-то из семантики неявно тащит зависимостями какие-то рантайм зависимости в компайл-тайм, лишние.

Но по-сути это ГЦ со всеми проблемами присущими ГЦ.

там сейчас вообще нечто типа ARC в ObjC/Swift, ЕМНИП. вопрос в том, чем это могло бы быть. если таки осознать и допилить.

anonymous ()
Ответ на: комментарий от delightfish

Я тебе уже сказал, что llvm-ir генерирует llvm. Запомни это и не неси мне херни, клоун.

не неси мне эту херню, клоун.

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

затем в мидл энде LLVM — проходы оптимизации и окончательная оптимизация, в бекенде раста LLVM из этого IR кодогенерирует и далее линкует.

rustc это compiler driver, вообще-то. обёртка над фронт, мидл и бекендом.

anonymous ()
Ответ на: комментарий от delightfish

И тут тоже ты обосрался. Никакие оптимизации раст-говне не делает, никакого оптимизатора там нет. Он есть в llvm.

И тут тоже ты обосрался.

а где учитывается семантика раста (те же лайфтаймы) и выводимые из этого возможности что-то соптимизировать? проходов LLVM над промежуточным представлением тут ещё нет — т.к. нет ещё окончательного промежуточного представления.

anonymous ()
Ответ на: комментарий от delightfish

в llvm нету кодогенератора и линкера. Он есть в экосистеме llvm. Но сам llvm ничего из этого не умеет.

взаимоисключающие параграфы. дислексия твоё хобби, не так ли?

anonymous ()
Ответ на: комментарий от delightfish

, чем он и является по определению авторов и является реально.

конечные форматы исполняемых бинарников, линковку кто делает? тоже llvm. где делает? в бекенде.

Т.е. по твоей классифицкации llvm - является медлендом

мидл (проходы оптимизатора SSA) и бекендом (кодогенерация и линковка)

anonymous ()
Ответ на: комментарий от anonymous

затем в мидл энде LLVM — проходы оптимизации и окончательная оптимизация, в бекенде раста LLVM из этого IR кодогенерирует и далее линкует.

Клоун, у тебя же раньше llvm был беком, а теперь уже мидлом? Опять методичка сломалась?

предварительные оптимизации

Никаких оптимизацией там нет. Побежал показывать.

и генерация IR. никакого LLVM

Ты совсем тупой. О боже.

https://github.com/rust-lang/rust/tree/master/src/librustc_codegen_llvm - просвещайся клоун. Как думаешь, почему это называется llvm? А не ir?

Как думаешь, клоун, откуда там каталожек llvm с биндингами к llvm? Клоун, я не слышу оправданий.

delightfish ()
Ответ на: комментарий от delightfish

llvm даёт фронту либу с функциями вида

типичное шаблонистое С++ говно. ненужно. даже С говно, раз из Ocaml дёргать можно.

Вот задача фронта преобразовать свой недоязычок в вывод этих

функций. Всё остальное сделает llvm.

или преобразовать сразу в текстовое либо бинарное представление SSA, LLVM ассемблера.

Всё остальное сделает llvm.

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

ещё раз, есть внутреннее представление компилятора , его IR (сразу после AST, с предварительными оптимизациями. man SSA представление + семантика). а есть LLVM представление, LLVM IR.

ничего не мешает этот IR компилятора делать совместимым с LLVM IR. да хоть текстовый формат биткода и SSA представление.

С++ для этого (и «преобразовать свой недоязычок в вывод этих функций» ) не нужен. нужно SSA представление.

например, компилятор QBE по ссылке выше. там SSA есть, а никакого С++ (и LLVM) нету. но задачи всё те же самые делаются, даже проще и понятнее.

anonymous ()
Ответ на: комментарий от anonymous

Ладно, ты меня одалел - ты слишком туопй. Тебе уже 10раз сообщили банальный факт. rustc - является огрызком фронта, который не занимается генерацией llvm-ir. Ты постоянно обсираешься, начинаешь повторять какие-то рандомные базворды. Обосрался с llvm-ir начал кукарекать про какой-то другой.

Сообщаю тебе новость, ещё одну. Раст как недоязычок сделано таким образом, что-бы очень просто ложиться на llvm. В контексте фронта rustc в десятки раз проще шланга, несмотря даже на то, что llvm-ir по-сути является си и затачивался в основном под кресты.

И в этом проблема. Что под нормальный язык затачивается ir, а говно затачивается под ir.

delightfish ()
Ответ на: комментарий от delightfish

rustc - является огрызком фронта,

man compiler driver

который не занимается генерацией llvm-ir.

c нужными ключами — занимается. и ты можешь его текстового глазами прочитать. и далее бекендом llvm собрать. или чем-то обработать, а затем бекендом собрать.

anonymous ()
Ответ на: комментарий от anonymous

просвещайся, клоун

И, что ты мне линканул убогий?

Refactoring of rustc_codegen_llvm
replace all the LLVM-specific types by generics inside function signatures and structure definitions;
encapsulate all functions calling the LLVM FFI inside a set of traits that will define the interface between backend-agnostic code and the backend.

While the LLVM-specific code will be left in rustc_codegen_llvm, all the new traits and backend-agnostic code will be moved in rustc_codegen_ssa (name suggestion by @eddyb).

На этом можно закончить.

delightfish ()
Ответ на: комментарий от delightfish

First, the Rust compiler (just like clang, for example) does all the Rust specific stuff like type and borrow checking; in the end, it generates LLVM-IR

царь>Нет. Никакой ir раст-говнокомпилятор не генерирует. Это всё, что нужно знать о тебе и подобных тебе балаболов в интернете.

царь> https://github.com/rust-lang/rust/tree/master/src/librustc_codegen_llvm

опять сам же себе противоречишь.

anonymous ()
Ответ на: комментарий от anonymous

First, the Rust compiler (just like clang, for example) does all the Rust specific stuff like type and borrow checking; in the end, it generates LLVM-IR

И? Это пропаганда, убогий. Там написано «Компилятор», в контексте пропаганды - это значит «llvm».

«Rust compiler» в данном контексте значит «компилятор llvm с огрызком фронта раста», но ничто иное. То, что ты, жертва пропаганды, неспособна это понять - это твоя проблема.

Ссылки на код тебе дали. генератор ir зависит от llvm. Ты обделался, я победитель, как всегда.

delightfish ()
Ответ на: комментарий от delightfish

ты совсем тупой? любой компилятор умеет сгенерировать один из IR и далее остановиться. даже тот же GCC.

тоже самое и rustc --emit в разных комбинациях.

anonymous ()
Ответ на: комментарий от anonymous

там этих IR несколько: HIR, MIR, и L, LLVM IR.

Ещё раз, под ir понимается только llvm-ir. Всё остальное говно никому не интересно - это примитивная херня плебейская. Клоун кукарекал про llvm-ir.

delightfish ()
Ответ на: комментарий от anonymous

ты совсем тупой? любой компилятор умеет сгенерировать один из IR и далее остановиться. даже тот же GCC.

Клоун, повторяю. Никакой llvm-ir НИЧЕГО, кроме llvm не генерирует. Запомни это. Про какие-то другие ir никто не говорил. Особенно про мусор раст-говна. Это вообще не ir, а убого говно для пропаганды.

delightfish ()
Ответ на: комментарий от delightfish

а по-моему, нет — под IR если неясно всегда подразумевается IR компилятора, а не одного из его ендов, low-level.

по-моему, кто-то ниасилил контекст. ну я по крайней мере, точно (вы там каждый о своём IR кукарекали)

anonymous ()
Ответ на: комментарий от anonymous

у нормальных людей это означает «compiler driver»

У сектантов? У нормальных людей огрызок фронта является огрызкам. Сектантам же нужен компилятор, которого у них нет, поэтому начинается враньё и подмена понятий. ЦА ведь всё равно не поймёт и будет думать, что это говно хоть что-то может, но нет - не может.

delightfish ()
Ответ на: комментарий от anonymous

а по-моему, нет — под IR если неясно всегда подразумевается IR компилятора, а не одного из его ендов, low-level.

Компилятор там называется llvm и его ir это llvm-ir. Ты можешь попытаться называть своё говно компилятором, которым он не является, но в любом случае это не сработает, даже если бы являлся. Т.к. когда сектанты говорят про ir они имеют ввиду llvm-ir, что декларировал ты(или кто там из вас) явно.

по-моему, кто-то ниасилил контекст. ну я по крайней мере, точно (вы там каждый о своём IR кукарекали)

Очевидно, что тот кто со мною спорил(значит это был не ты) кукарекал именно про llvm-ir. А знаешь почему? Потому что именно llvm-ir всем и интересен. А всё другое говно нет.

У сектантов есть два направления пропаганды. Первое -они кукарекают, что их говно генерирует нативный код. Но эта пропаганда не работает на тех, кто понимает чуть больше, чем ничего. Второе - это «раст-говнокомпилятор генерирует ir» и все в это верят, особенно в контексте того, что нормального описания того как работает llvm.

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

delightfish ()
Ответ на: комментарий от delightfish

Второе - это «раст-говнокомпилятор генерирует ir» и все в это верят

таки это неспроста:

cat > hell_worth.rs <<EOF
fn main() {
    println!("Hello, world!");
}
EOF

$  rustc --emit llvm-ir hell_worth.rs
$ echo "Hell word is here: $(wc -c hell_worth.ll) bytes, $(wc -l hell_worth.ll) lines long"
Hell word is here: 10836 hell_worth.ll bytes, 215 hell_worth.ll lines long

$ cat hell_worth.ll
#... типичный llvm биткод в текстовом представлении

$ file hell_worth.ll
hell_worth.ll: ASCII text, with very long lines

$ llvm-link -v hell_worth.ll -o hell_worth.bc
Loading 'hell_worth.ll'
Linking in 'hell_worth.ll'
Writing bitcode...
$ file hell_worth.bc
hell_worth.bc: LLVM IR bitcode
$  llvm-as  hell_worth.ll -o hell_worth1.bc
$ file hell_worth1.bc
hell_worth1.bc: LLVM IR bitcode

и далее с нужными либами слинковать в бинарник.

anonymous ()
Ответ на: комментарий от anonymous

О боже, почему вы такие тупые. Как вы меня, клоуны, одалели.

rustc

Это говно не является «rust». Оно является обёрткой над llvm, как твой llvm-as и прочие. Оно зависит от llvm и использует llvm внутри себя.

Ладно, если ты такой тупой. Просто запусти perf record и после perf report --sort=dso:

    38.46%  [unknown]                                   
    19.99%  ld-2.29.so                                  
    12.91%  librustc_metadata-3ab11878698bb19f.so       
     8.16%  libsyntax_pos-a4086d0543725390.so           
     5.85%  librustc-a381bb87e2aee1a2.so                
     3.54%  libstd-e0b6e478e9762da9.so                  
     3.34%  rustc-bin-1.35.0                            
     2.79%  libLLVM-8-rust-1.35.0-stable.so             
     1.70%  libc-2.29.so                                
     1.16%  librustc_mir-e164045a7c9341b1.so            
     0.87%  librustc_codegen_llvm-llvm.so               
     0.42%  librustc_codegen_ssa-6808a2b767e99ea5.so    
     0.37%  librustc_interface-044f4c4a8b725550.so      
     0.26%  librustc_errors-0c373f999a09d7dc.so         
     0.18%  librustc_data_structures-ad3ea88bb9794981.so

И посмотри на то, что юзает это говно, если неспособен почитать код на гитхабе/изучит как работает llvm.

delightfish ()
Ответ на: комментарий от anonymous

http://llvm.org/docs/tutorial/OCamlLangImpl3.html и далее — Ocaml, биндинги к llvm, пример kaleidoscope. транслируют в текстовый llvm биткод, и далее допиливают интерпретатор и всё остальное. это остальное можно было бы и отдельным шеллскриптом наколбасить, а не биндингами и compiler driver «всё в одном».

anonymous ()
Ответ на: комментарий от anonymous

я же и говорю, что rustc это compiler driver.

Ты опять обосрался и несёшь херню? Либо кто там из вас обосрался. rustc - это огрызок llvm-фронта. Повторю тебе ещё раз, а не та херня, что ты себе придумал.

compiler driver

Зачем ты повторяешь эту херню? Этой хернёй является llvm, а не твоё раст-говно. раст говно является тем, чем определил его я. А я определил его тем, чем он на самом деле является.

delightfish ()
Ответ на: комментарий от anonymous

obvious fix

Меня очень волнует мнение какого-то обгадившего клоуна. Запомни, клоун, компилятор называется по базе. compiler driver называется по базе, базой является мидл. Именно llvm всё определяет.

Именно поэтому, клоун, у тебя в ir написано «target triple = „x86_64-unknown-linux-gnu“». И прочая конфигурация, её создаёт llvm. Далее llvm вызывает то, что нужно. Сам.

К тому же, твоё говно даже не является интерфейсом к llvm, в отличит от clang. clang умеет собирать и ir и всю фигню. Но даже шланг не является драйвером, хотя хоть как-то его можно назвать. Потому что официально он им, в какой-то мере, является.

Твоё же говно не является ничем. Просто ничем. Именно llvm знает о твоём недозяычке. Как и о всём остальном. Иди, клоун, читай доки.

delightfish ()