Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Идея компилятора для bash  (Прочитано 4381 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Идея компилятора для bash
« : 28 Августа 2018, 00:25:44 »
Я хотел обсудить одну идею которую врят ли сам смогу сделать, но тем не менее она очень интересна. Я хотел поговорить о компиляторе для bash. С одной стороны существует такая программа как shc, которая переводит bash скрипт в си подобный код (??) . Но с другой стороны shc не обеспечивает прирост производительности характерный для си. Вот, а я думаю что bash скрипты в большинстве случаев используют утилиты исходный код которых известен и почему бы не выбрать от туда куски этого открытого кода и не собрать в новую программу, при этом всё лишнее откинуть. Мне кажется если всё грамотно сделать то можно было бы получить производительность си. Как думаете? Не знаю может я рассуждаю как дилетант, откровенно говоря я вообще не программист, но мне кажется идея интересная. Что скажите?

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6691
  • 20% Cooler
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #1 : 28 Августа 2018, 00:47:35 »
bash/sh - это в первую очередь командный интерпретатор, а не язык программирования. Сравнивать bash и cи, мягко говоря, некорректно.

если у вас в bash-скрипте более 100 строчек кода, лучше задуматься о другом решении. На том же C будет в разы лучше.

🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #2 : 28 Августа 2018, 01:08:02 »
Ну, нет. Обычно ситуация другая. У меня несколько строк кода на bash , но мне нравиться что они медлено работают. А на си переписывать это в место этих трёх строк будут страницы кода.
« Последнее редактирование: 28 Августа 2018, 01:13:26 от jo80 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6691
  • 20% Cooler
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #3 : 28 Августа 2018, 01:17:36 »
У меня одна строчка кода на bash
которая в любом случае вызывает внешнюю программу.
даже '[' - не синтаксис bash, а именно отдельный исполняемый файл
$ which \[
/usr/bin/[

🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #4 : 28 Августа 2018, 01:23:48 »
Ну да. Правда часть команд является частью оболочки но в принципе это не суть важно, потом что для всех этих программ есть исходный код. Просто нужно сделать так чтобы они не вызывались как отдельные программы и откинуть всё лишнее. Как по моему дилетанскому мнению это должно решить проблему скорости. Я же правильно понимаю что в основном все программы под ubuntu написаны на си? Получается что для всех программ один язык программирования.
« Последнее редактирование: 28 Августа 2018, 01:26:42 от jo80 »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #5 : 28 Августа 2018, 03:00:14 »
Цитировать
Идея компилятора для bash
что ему не показывает текстовые команды?
Wars ~.o

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #6 : 28 Августа 2018, 17:40:06 »
Bash-скрипты не должны работать медленно, запустить одну прогу и ее вывод отправить на вход второй, даже если это переписать на си, выигрыша практически не будет, а сложности в сопровождении будут значительные.
Вы, либо что-то не корректно пишите в bash, либо используете его там, где правильнее использовать язык программирования, а не командную оболочку.
Выбирайте инструмент под задачу, если инструмент плохо справляется с задачей, возьмите другой инструмент.

Оффлайн TeenSpirit

  • Любитель
  • *
  • Сообщений: 72
  • Подпись под аватаром
    • Просмотр профиля
    • Speed24
Re: Идея компилятора для bash
« Ответ #7 : 28 Августа 2018, 20:35:13 »
Прежде чем бездумно оптимизировать все подряд, нужно призадуматься, а что, собственно тормозит? По закону Парето, 80% времени CPU тратит на 20% кода. Вот эти 20% и нужно ускорить. А чтобы найти, нужно профилировать. По профессии, я знаю как профилировать PHP и MySQL. Запрофилировать bash скрипт можно через
time ... ваша командаДругих способов я не знаю, может кто еще подскажет.
Временные расходы в bash идут на
- запуск внешних программ
- выполнение внешних программ
- ожидание ввода-вывода во внешних программах
- собственно, накладные расходы bash
Если вы хотите сократить накладные расходы в bash (чтение bash скрипта, его интерпретацию), уверен вы ничего не выиграете.
Посмотрите, что тормозит из внешних программ. Пожалуйста, покажите скрипт, чтобы было более предметное обсуждение.
А идея ваша мне нравится, но это фантастика

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #8 : 29 Августа 2018, 00:35:13 »
time ... ваша команда
Я знаю эту команду и я её постоянно использую.

По поводу того что тормозит, например построчное чтение файла в bash происходит очень медленно. Я думаю если бы код был откомпилируемым а не интерпретируемым. Это бы дело работало бы быстрее а то если например файл в 3 гига, и его построчно считать нужно так это всё...
« Последнее редактирование: 29 Августа 2018, 00:40:39 от jo80 »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Идея компилятора для bash
« Ответ #9 : 29 Августа 2018, 00:38:58 »
Как вы читаете и почему решили что чтение медленное?
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #10 : 29 Августа 2018, 00:46:08 »
я читаю так
  cat ./file.txt | while read line
  do

  done

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

Второй способ лучше

  while read line
  do

  done << ./file.txt

По моему есть ещё вариант считать файл построчно с помощью for, но вроде он по медленней будет чем while


Но если файл несколько гигов то всё, считай расчет на несколько дней.

Пользователь добавил сообщение 29 Августа 2018, 01:01:32:
И я говорю медлено по тому что тот же sed обрабатывает тот же файл за секунды. К сожалению он не может взять из строки значение и прибавить к нему другую цифру например. Воти получается контраст с одной стороны sed который обрабатывает за секунды а сдругой стороны bash который построчно читает этот же файл за несколько дней.
« Последнее редактирование: 29 Августа 2018, 01:01:32 от jo80 »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #11 : 29 Августа 2018, 01:02:14 »
sh - быстро.
bash - мкдленно.

если на C/C++ могу из ьash.
только нужно пример скрипт то пишу в C/C++.

bash
#!/bin/bash
for i in $@
do
echo $i
done

# chmod +x test.sh

C/C++
#include <stdio.h>

int main (int ia, char *ca[]){
int i;
for (i=0;i<ia;i++)
puts (ca[i]);
return 0;
}
// ~$ gcc test.c -o test.lnx

запустить.
bash
./test.sh /*

C/C++
./test.lnx /*
Wars ~.o

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #12 : 29 Августа 2018, 01:14:20 »
или допустим такая ситуация вызываем конвеер
sed | другая_утилита | sed

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


P.S. Ещё например существенным недостатком является то что в bash нельзя файл считать в память и с ним в памяти работать. Но этот момент наверно компилятор не решит, хотя вроде бы такая вещь должна быть не сложная, но почему то ни кто не говорит об этом. Все предпочитают на дик записывать.   
« Последнее редактирование: 29 Августа 2018, 01:38:28 от jo80 »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #13 : 29 Августа 2018, 01:34:02 »
Цитировать
  cat ./file.txt | while read line

C/C++
char *c = malloc (1024);
FILE *f = fopen ("/file.txt","r");
if (f == 0){
perror ("/file.txt");
return 1;
}
while (fgets (c,1024,f) != 0){
printf ("%s",c);
// ....
// ....
}
fclose (f);
free (c);


Пользователь добавил сообщение 29 Августа 2018, 01:39:11:
Цитировать
sed | другая_утилита | sed
не много, пример одну.
« Последнее редактирование: 29 Августа 2018, 01:39:11 от victor00000 »
Wars ~.o

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #14 : 29 Августа 2018, 01:39:59 »
sh - быстро.
bash - мкдленно.
Мне даже интересно стало, я завтра проверю, скажу насколько sh быстрее bash

Пользователь добавил сообщение 29 Августа 2018, 01:45:53:
ущественным недостатком является то что в bash нельзя файл считать в память и с ним в памяти работать.
А знаете что кстати говоря было бы круто, если бы файл можно было бы отправить не только в оперативную память, но и в память видеокарты. Вот это было бы круто!!!
« Последнее редактирование: 29 Августа 2018, 01:45:53 от jo80 »

 

Страница сгенерирована за 0.038 секунд. Запросов: 22.