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


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

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

Оффлайн jo80

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

Оффлайн ALiEN175

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

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

ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн jo80

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

Оффлайн ALiEN175

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

ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн jo80

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

Оффлайн victor00000

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

Оффлайн Vitsliputsli

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

Оффлайн TeenSpirit

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

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 73
    • Просмотр профиля
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!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12025
  • Xubuntu 18.04 (64bit)
    • Просмотр профиля
Re: Идея компилятора для bash
« Ответ #9 : 29 Август 2018, 00:38:58 »
Как вы читаете и почему решили что чтение медленное?
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 73
    • Просмотр профиля
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

  • Забанен
  • Старожил
  • *
  • Сообщений: 15571
  • Глухонемой (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 /*
Нельзя друзья, дулу - AnrDaemon видите?
~.o

Оффлайн jo80

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

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


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

Оффлайн victor00000

  • Забанен
  • Старожил
  • *
  • Сообщений: 15571
  • Глухонемой (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 »
Нельзя друзья, дулу - AnrDaemon видите?
~.o

Оффлайн jo80

  • Автор темы
  • Любитель
  • *
  • Сообщений: 73
    • Просмотр профиля
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.107 секунд. Запросов: 25.