LINUX.ORG.RU

Баш, питон... А исполняемые C++ сорцы с шебангом видали? :)

 ,


2

8
$ cat ~/bin/hello.cpp 
#!/usr/local/bin/build-n-run
#include <stdio.h>
int main() {
    puts("Hello world!");
}

$ hello.cpp 
Recompiling...
Hello world!

$ hello.cpp 
Hello world!

Этот самый /usr/local/bin/build-n-run тоже написан на C++ с использованием std::experimental::filesystem, и он не сильно длиннее эквивалентного баш-скрипта. Собственно работа с путями даже короче. Кому сорц? :)

Отныне в гробу я видал этот ваш баш.

UPD: Сорцы: https://github.com/dimgel/cpp-linux-scripts

★★★★★

Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от linuhs_user

А в TempleOS юзается «священная сишка» для скриптов, написания приложений.

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

Ну тут не tiny, а полновесная зверюга с полным функционалом. На C скрипты не попишешь, а на современном C++ уже вполне: всё копируется-перемещается по значению, что строки, что пути. С памятью бодаться не надо. Практически скриптовый язык, только быстрый как понос. :)

И ещё я сомневаюсь, что в tcc реализованная мною фича с шебангом и рекомпиляцией по запросу есть из коробки.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Практически скриптовый язык, только быстрый как понос. :)

И статически-типизированный, last but not least.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

рекомпиляцией

TCC ядро линукса за пару секунд компилирует, лол.

На C скрипты не попишешь

А мне удобно, позволяет быстро накидать код. В некоторых ситуация, а так лучше Perl.

linuhs_user
()
Последнее исправление: linuhs_user (всего исправлений: 1)
Ответ на: комментарий от linuhs_user

TCC ядро линукса за пару секунд компилирует, лол.

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

он это прямо из загрузчика во время загрузки может делать.

Эм... Ну я уже понял, что залез со свиным рылом в калашный ряд, но по процитированному - НАФИГА?!

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

НАФИГА

Ну вот такое развлечение у автора.

А ещё он qemu основал, ffmpeg, jslinux. И доказал, что терабайтные диски — не только для порно. Интересные у него развлечения, в общем.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Можно только позавидовать.

dimgel ★★★★★
() автор топика

кидай на щитхаб, пили документацию для самых маленьких и не очень умных... тема скриптов на с/с++ периодически всплывает

и да, есть ли кэширование уже скомпилированного кода? если да - есть ли проверка на внесённые изменения и инвалидация кэша?

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

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

и да, есть ли кэширование уже скомпилированного кода? если да - есть ли проверка на внесённые изменения и инвалидация кэша?

Естессно! По mtime. Строчка «Recompiling...» в первом запуске и её отсутствие во втором как бы намекает.

кидай на щитхаб, пили документацию для самых маленьких

Хорошая идея. Ща. :)

dimgel ★★★★★
() автор топика

Отныне в гробу я видал этот ваш баш.

Т.е. ты не знал про linux_binfmt или ты научил C++ работать с пайпами popen без горождения бесчисленных проверок результатов?

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

25к строк компилирует у меня за мгновение (i5), пол года назад так было, на deb8.

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

Т.е. ты не знал про linux_binfmt

Не знал. Щас глянул по диагонали и не понял: зачем там какие-то пляски с /proc, когда шебангом всё решается без участия ядра?

или ты научил C++ работать с пайпами popen без горождения бесчисленных проверок результатов?

Не научил. Намёк понял. :) Да, где проще пайпами, их проще в однострочный баш-скрипт вогнать.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Не знал. Щас глянул по диагонали и не понял: зачем там какие-то пляски с /proc, когда шебангом всё решается без участия ядра?

linux_binfmt это та часть ядра, которая понимает по сигнатуре в начале бинарника, что нужно запустить интерпретатор указанный после #!, либо выполнять как elf бинарник. Так же можно указать, например, mz для запуска PE бинарников через wine.

Не научил. Намёк понял. :) Да, где проще пайпами, их проще в однострочный баш-скрипт вогнать.

Нет, не понял. То, что ты городишь противоречит KISS. Идея bash в том, что можно перенаправлять вывод между несколькими бинарниками, минуя написание одного огромного бинарника. Скорость исполнения самого скрипта в таких задачах пренибрежительно мала по сравнению с временем работы бинарников. Т.е. люди не писали условные init скрипты на C++ не потому, что были тупые, а потому что C++ сильно усложняет задачу и может привести к утечкам/уязвимостям на ровном месте.

xpahos ★★★★★
()
Ответ на: комментарий от i-rinat

И доказал, что терабайтные диски — не только для порно

А что у Беллара по терабайтным дискам было? Я пропустил.

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

Ничего не противоречит. На баше не только пайпы делают, но и довольно сложную логику безо всяких пайпов, и выглядит это как чистый ад. И тут дело уже не только и не столько в скорости; тут именно баш со своим зубодробительным синтаксисом «сильно усложняет задачу [...] на ровном месте». Даже тупо отрезать расширение у файла на плюсах гораздо проще.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от xpahos

или ты научил C++ работать с пайпами popen без горождения бесчисленных проверок результатов?

А вообще, любопытная задачка. По ощущениям, вполне возможно представить пайп в виде графа (аналогично AST), все ошибки бросать исключениями и ловить их внутри метода run() корневого узла. Никаких «бесчисленных проверок». И синтаксис вполне компактный можно сообразить. Если вдруг приспичит (потребуется скрипт и с кучей логики, и с пайпами), нарисую и выложу в ту же репу.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

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

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

зачем её компилить каждый раз при вызове?

Не каждый, а только при изменении сорцов. Автоматически.

непонятно, в чём «скриптовость» компиляции сишных сорцов

Скриптовость в том, что теперь компилировать вручную не надо, оно само. :) А «гораздо читабельнее» - уже огромный плюс. Не единственный: ещё гораздо быстрее и гораздо надёжнее.

но это не скриптовый язык

И хорошо. :) «Скриптовый язык» это синоним чего-то матерно-убогого. :)

dimgel ★★★★★
() автор топика
Ответ на: комментарий от xpahos

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

Ога, то-то всё тормозит так, что комплишн может повиснуть на пару секунд.

Т.е. люди не писали условные init скрипты на C++ не потому, что были тупые

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

а потому что C++ сильно усложняет задачу

В параллельной вселенной.

и может привести к утечкам/уязвимостям на ровном месте.

Мифология.

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

если ты хочешь «сложную логику», то можно написать утильку и скомпилить один раз. зачем её компилить каждый раз при вызове?

С этим есть какие-то проблемы? Нет.

какбэ в этом суть сишных программ. непонятно, в чём «скриптовость» компиляции сишных сорцов.

Такая же, какая и у баша. Не нужно собирать, что-то делать с бинарниками, пересобирать руками по 10раз при изменении.

anonymous
()

Согласен, bash - штука неудобная. Но иногда приходится его использовать к сожалению.

rumgot ★★★★★
()

Удачи тебе в ожидании окончания компиляции при использовании шаблонных библиотек, например, для поддержки regexp.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)

Отныне в гробу я видал этот ваш баш.

Любопытно бы взглянуть на твои Bash-скрипты. Подозреваю там адскую дичь.

anonymous
()

Отныне в гробу я видал этот ваш баш.

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

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

Даже тупо отрезать расширение у файла на плюсах гораздо проще

$ man bash
       ${parameter%word}
       ${parameter%%word}
              Remove matching suffix pattern.

Проще?

$ FN='example.txt'
$ echo ${FN%.txt}
example
$ echo ${FN%.*}
example
surefire ★★★
()
Последнее исправление: surefire (всего исправлений: 2)

А насколько транспортабелен будет многофункциональный скрипт на С с подвязкой кучи разных библиотек ??
параметры запуска того же dd не менялись последних лет 40.
А функции и хидеры потихоньку плывут за веяними авторов :(

pfg ★★★★★
()

Кстати, можешь тогда еще поиграться с LibClang: https://clang.llvm.org/docs/Tooling.html

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

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

А что у Беллара по терабайтным дискам было? Я пропустил.

Он в 2009 много цифр числа пи посчитал, вроде как рекорд того времени.

i-rinat ★★★★★
()
Ответ на: комментарий от dimgel

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

Я недавно наткнулся на проект PortWINE, так там установочный скрипт на полторы сотни Мб, мда.

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

так там установочный скрипт на полторы сотни Мб, мда.

Обычное дело для shell archives. Когда-то Java так распространялась.

tailgunner ★★★★★
()

в каменты созываются ужаленные С++ом в жёппу и умученные от С++а.

теперь это трэд анонимных жертв С++а. ждём историй из жизни, как С++ изнасиловал вас в детстве, заставлял писать говнокод и городить шаблоны в шесть этажей.

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Скрипты нужно на питоне писать.

Кому нужно - те пишут. На голом Питоне таки неудобно с пайпами. Да, есть работы на эту тему, но всё же, если в скрипт в основном представляет собой клей, то Питон вряд ли лучший выбор. xonsh вот интересен, но там не чистый питон опять таки.

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

непонятно, в чём «скриптовость» компиляции сишных сорцов.

Такая же, какая и у баша

ЛПП.

Не нужно собирать

Ой ли? Перечитайте ОП.

что-то делать с бинарниками

?

пересобирать руками по 10 раз при изменении

make? Не, не слышал.

Zmicier ★★★★★
()
Ответ на: комментарий от ckotinko

как будто динамическая типизация есть благо

Для некоторых типовых задач однозначно даёт профит. Не хочешь добавить её в «кисий» ЯП?

Virtuos86 ★★★★★
()
Ответ на: комментарий от ckotinko

как будто динамическая типизация есть благо

Это однозначное зло, на что я собственно вполне толсто и намекаю.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Практически скриптовый язык, только быстрый как понос. :)

И статически-типизированный, last but not least.

А чем это лучше окамля?

ugoday ★★★★★
()
Ответ на: комментарий от dimgel

А ещё вилки! Вилки - абсолютное зло. Пиво ими хлебать трудно, а глаз чесать вообще опасно!

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

Любопытно бы взглянуть на твои Bash-скрипты. Подозреваю там адскую дичь.

Мои собственные скрипты тривиальны, для сложных задач я чё посерьёзнее завожу. Потому что категорически влом продираться через идиотский синтаксис что условий, что циклов, что ${переменных$@#&^#$ с кучей заумных операций над ними}, что регулярок которые у здорового человека свои, у баша свои, у седа свои, у грепа... впрочем, у грепа есть опция -P.

За каждой, КАЖДОЙ @#^$Ь ерундой приходится в гугл лезть, потому что запомнить всю эту дичь невозможно. Если оно - только ради красивых пайпов...

Ну вот например, если настаиваете. Изобразил однажды прикола ради чтобы посмотреть на температуру проца под макс. нагрузкой. Полагаю, на std::thread было бы даже короче: как минимум потому что при завершении главного потока остальные сами бы сдохли.

$ cat ~/bin/load-all-CPUs.sh 
#!/bin/sh

CPUs_minus_1=$((`nproc` - 1))
#declare -A PIDs=()
PIDs=()

function clean_up {
        for i in `seq 0 $CPUs_minus_1`; do
                kill ${PIDs[$i]}
        done
        exit
}

for i in `seq 0 $CPUs_minus_1`; do
        nice bash -c 'while true; do :; done' &
#       PIDs[$i]=$!
        PIDs+=($!)
done

trap clean_up SIGHUP SIGINT SIGTERM

for i in `seq 0 $CPUs_minus_1`; do
        wait ${PIDs[$i]}
done

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

dimgel ★★★★★
() автор топика
Ответ на: комментарий от Virtuos86

Для некоторых типовых задач

вот именно.

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

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

а ведь шаблоны не для того даны людям, чтоб плодить на них всё подряд. идеология С++ такова, что он даёт свободу, но это же не повод использовать свободу для содомии.

Более того, в 99% случаев шаблоны используются только чтоб обойти статическую типизацию для случаев когда алгоритм общий и отличается только на константы. Пример: std::map. Вот реально там отличия одного мапа от другого - это размер одной ноды, смещение в ней key и value, и адрес функции сравнения ключей. в более общем случае, там надо еще держать 32 байта под std::function. но опять же, даже ассемблерный код 1-в-1 с разницей на константы.

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

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

dimgel ★★★★★
() автор топика
Ответ на: комментарий от Zmicier

ЛПП.

Показательно.

Ой ли? Перечитайте ОП.

О, пациенты врубают идиота - как это мило. Под сборкой понимается не компиляция сама по себе, а левый процесс перед запуском программы.

make?

Мусор убогий

Не, не слышал.

Я понимаю, что ты мне пастишь рандомные базворды, но всё же.

Во-первых, чем твоё убожество отличается от вызова компилятора? Ничем.

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

Третье. Колхоз-сборка - убожество в виде убожества. В нормальная виде никакая «сборка» не нужна.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.