Представлен первый экспериментальный выпуск проекта gonix (https://github.com/polegone/gonix), в рамках которого развивается реализация стандартных unix-утилит, созданная с использованием языка программирования Go. Код проекта распространяется под лицензией GPLv3. В настоящее время уже полностью готовы утилиты dirname, false, sleep, tee, true и yes, работоспособны с некоторыми ограничениями basename, cat, cp, echo, head, mkdir, mkdir, nl, pwd, seq, tail, touch и xxd. Предстоит реализовать bc, dc, ed, ls, more и rm.
Также можно отметить проект Godoc (http://blog.golang.org/examples), продвигающий идею использования примеров по использованию кода одновременно и в качестве тестов, для оценки корректности работы используемых в примерах функций.URL: https://github.com/polegone/gonix
Новость: http://www.opennet.me/opennews/art.shtml?num=42198
Объясните мне кто-нибудь из тех, кто пишет на С (мнение Go-недопрогаммистов неинтересно) нафига это нужно?
Объясните мне кто-нибудь из тех, кто говорит на русском (мнение англо-недочеловеков неинтересно) нафига это нужно?
Пофиксил, не благодари.
> Объясните мне кто-нибудь из тех, кто говорит на русском (мнение англо-недочеловеков неинтересно)
> нафига это нужно?
> Пофиксил, не благодари.Just for fun
фор фан делаются вещи для души, а это - как арматуру ноздрями гнуть, абсолютно бесполезно.
> фор фан делаются вещи для души, а это - как арматуру ноздрями гнуть, абсолютно бесполезно.Так себя обычно утешают люди с отсутствующим воображением и творческими способностями.
И сами себе пытаются доказывать крайнюю полезность собственного унылого цикла "дом-работа-магазин".То что вам на ум пришла исключительно аналогия ни с того и с сего про "ноздри" и "арматуру" - лишь подтверждает скудность вашего воображения.
Из таких вот казалось бы "абсолютно бесполезных" вещей большинство инноваций и рождались.
Когда в доисторическую эпоху энтузиасты первые колеса делали, они большинству соплеменников с дубинками тоже казались "абсолютно бесполезными" и "ноздрями". Потому что область применения находилась за пределами плоскости их мышления.П.С. Дабы предвосхитить холивар на тему "изобретения велосипедов" - сразу задумайтесь о разнице между такими понятиями как "изобретение" - и "реализация" ("изготовление").
А то ведь, действительно, колесо в каменном веке уже однажды изобрели, зачем его снова и снова какие-то чудаки переделывают по-разному. Наверное чтобы "ноздрями катать" и чисто "для души" - для остального наверное "абсолютно бесполезно". Только что вы знаете о душе? Вам душу понимать явно "ноздри" мешают.
> Так себя обычно утешают люди с отсутствующим воображением и творческими способностями.
> И сами себе пытаются доказывать крайнюю полезность собственного унылого цикла "дом-работа-магазин".Так себя обычно утешают наркоманы.
>> Так себя обычно утешают люди с отсутствующим воображением и творческими способностями.
>> И сами себе пытаются доказывать крайнюю полезность собственного унылого цикла "дом-работа-магазин".
> Так себя обычно утешают наркоманы.Все кто мыслят по-другому - наркоманы. Тоже вполне себе утешение.
да вы бред несете, какое воображение? какието хипстеры переписали стандартные утилиты на своем хипстерском недо языке, для чего? чтобы переписать на нем же ядро, чтобы оно работало в 1000 раз медленее, зато на кошерном. силенок не хватит, да и смысла ноль, зачем дублировать то, что уже есть, но в заведомо проигрышном варианте? те кто изобрели колесо весело катали на телегах туши, а подобные хипстеры на квадратных колесах мучались и надеялись, что из этих мучений выдет прок, это сизифов труд. колесо изобрели кстате глядя как весело катаются круглые камни, тут не надо быть гением это очевидно сейчас, было очевидно и тогда, и рычаг, и палки-ковырялки пришли к нам от обезьян еще, так что ваша аналогия с точностью до наобоорот, показывает у кого нет ни воображения, ни мозгов понять, что лучше колеса ничего не придумаешь хоть убейся.
> да вы бред несете, какое воображение? какието хипстеры переписали стандартные утилиты на своем хипстерском недо языке, для чего?У вас нет никаких фактов, что это "недоязык". А только лишь комплексы неполноценности из-за того, что вы с таким трудом изучали то что было раньше, а с появлением каких то новшеств, у вас вообще шансов нет что-то освоить. Вот и пытаетесь утешать себя навешиванием ярлыков и метафор без каких либо фактов.
"Хипстеры", "недоязык", "арматура ноздрями", "кошерный", "квадратные колеса" - типичный невежда, который за ничего не значащими эмоциональными репликами пытается скрыть свою некомпетентность, и ни о чем, кроме скорости работы, сказать в отношении софта не может, потому что у самого много ручных действий при попытке что-то с компом сделать, и ничего не смыслит в автоматизации.
> чтобы переписать на нем же ядро, чтобы оно работало в 1000 раз медленнее, зато на кошерном.
Во-во. Вот как раз, когда ядра и утилиты только "изобрели", они и работали в 1000 раз (а то и еще) медленнее на том древнем железе, чем то что сейчас работает на Го.
И когда не то что утилиты, а сами ядра ОСей только начали писать на С, а не на ассемблере, они тоже работали медленней - ну и что? Ничего вы не знаете.
"Преждевременная оптимизация - корень всех зол" (С)
Тогда как реальная автоматизация даже на самом тормозном оборудовании и софте - все равно будет быстрее, чем человек, в 1000 раз. А вот то, как вы свой якобы "навороченный" домашний комп используете, оно как раз и напоминает ваши "квадратные колеса" и "арматуру ноздрями".
Просто обычно невежды других свойств и качеств софта не знают, кроме скорости. Потому что работают на своих компах в-ручную, автоматизировать ничего не умеют, и им нужно, чтобы все как можно быстрее реагировало на их пальцы. А там где пальцы в принципе не используются, им кажется что видимо это делается "ноздрями" - нет, не "ноздрями", а всего лишь автоматически. И в итоге все равно быстрее чем вы пальцами, какие бы "быстрые" утилиты вы не взяли для своих ручных манипуляций.
Ключевой фактор - не скорость работы утилит по отдельности, а скорость работы всей системы после автоматизации. Удобство проведения самой автоматизации, и прочие факторы. Вам даже не судьба это оценить, с вашей ручной работой на компах, вы даже не знаете как комплексная автоматизация проводится. Потому в ручную и пытаетесь мерять скорость отдельных программ.
Вы сначала разберитесь в истинном назначении софта и прочих "колес", потом уже требуйте скорости. А вы так до сих даже не поняли разницы между изобретением и реализацией.
> силенок не хватит, да и смысла ноль, зачем дублировать то, что уже есть, но в заведомо проигрышном варианте?
Вы не доказали, что это "заведомо поигрышный вариант". А лишь тупо твердите об этом.
Зачем дублировать? А где вы здесь видите "дублирование"? Здесь дублирования не больше, чем дублирования круглой формы при другой реализации колеса для других условий и на других технологиях.Просто такие как вы с древних времен боялись, что, при новом витке промышленного развития, им новых технологий изготовления "колес" уже не освоить, вот в панике и кричали - "зачем дублировать! зачем дублировать! оно же такое же круглое!"
> те кто изобрели колесо весело катали на телегах туши, а подобные хипстеры на квадратных колесах мучались и надеялись, что из этих мучений выдет прок, это сизифов труд.
Где это вы видели, чтобы кто-то изобретал реально "квадратные колеса", или чтобы реально кто-то пытался "гнуть арматуру ноздрями". Вы просто с метафорами заигрались, потеряв при этом аналогии.
> колесо изобрели кстате глядя как весело катаются круглые камни, тут не надо быть гением это очевидно сейчас, было очевидно и тогда, и рычаг, и палки-ковырялки пришли к нам от обезьян еще, так
Если бы все слушали таких как вы - так бы и жили до сих пор с колесами из круглых камней на ремнях из шкур.
Ну так вам уже было сказано. Колеса и не изобретали, чего там изобретать то - круг. Колеса реализовывали. Просто вы разницу не видите. Разные колеса в зависимости от текущих условий, подручных материалов, и уровня развития промышленности.
> что ваша аналогия с точностью до наобоорот, показывает у кого нет ни воображения, ни мозгов понять,
За отсутствием воображения вы повторяете то, что было написано про вас. А вот вы в аналогию как раз очень хорошо вписываетесь - просто тупо сопротивляетесь любым новшествам, хотя даже не можете четко сформулировать претензии. Только одни эксцентричные метафоры. Типичный признак, когда гуманитарии пытаются оценивать технические новшества.
> что лучше колеса ничего не придумаешь хоть убейся.
А ничего лучшего и не придумывали, там колесо и тут колесо, там язык программирования и тут язык программирования, там утилиты и тут те же самые утилиты, но на другом языке.
Окружающая обстановка поменялась, качество "дорожного покрытия", сервисы по "замене колес", уже нет необходимости изготавливать "колеса" из "дерева". А так да, ничего лучшего - та же "круглая форма". Это только таким как вы "квадратные колеса" мерещатся в страхе перед любыми новшествами.
И ничего реального против нового языка вы сказать не можете.
Что и требовалось доказать, ваши "ноздри" и "арматура" мешают вам понимать разницу между изобретением и реализацией.
> Типичный признак, когда гуманитарииЭто просто бомба, отдуши поржал.
Но в целом плохо, ноздри-арматура, че ты к словам цепляешься, сказать больше нечего, так лучше промолчи, а то выдал свою детскую наивность с потрахами.
"недо" это антоним "пере", я за 15 лет в отрасли перещупал этих новых языков сколько тебе и не снилось, и ни один с си рядом не лежал, и восторженных криков наслушался и дифирамб с соплями и детской присыпкой тоже, ну и где, эти бинарно безопасные со скоростью близкой к нативной явы-питоны?HTML-ки генерировать, да конфики максимум возможностей ваших хипсторских, да и умишко слабоват, чтоб epoll осилить и межпроцессорные коммуникации разрулить без временных файликов и террабайтных кешей, нука поведай мне как ты обработаешь массив с числом элементов более чем байт в оперативе.
Через 20 лет допилят если не квантовую логику, то спинтронику, в унитаз сольешь свой го со своими скриптами, эксель изучай, пригодится когда отчетики делать будешь о том, сколько посуды в макдональдсе перемыл.
Ехала автоматизация через автоматизацию и автоматизацией погоняла.
это называется академический интерес.
"Делай это, даже если это нужно только тебе"
> это называется академический интерес.Неправильно вы это называете.
"Академический" интерес появляется, когда до бюрократов из "академий" начинает доходить что в новых идеях "что-то есть", но что именно, они никак понять не могут. И они начинают свой "академический интерес" раздувать, чтобы найти более сообразительных людей, которые помогли бы им разобраться и понять, что же на самом деле происходит.Если дальше "академического интереса" вы не видите, то большинство уже реализованных инноваций остались вообще за пределами вашего восприятия.
- Обучение программированию на go
- минимальное рабочее окружение со статической линковкой
> - Обучение программированию на go
> - минимальное рабочее окружение со статической линковкойкаждый бинарь, реализующий однострочник на баше, по 90 мегабайт
qqqqqqqqqq ~/gonix/gonix/build $ ll
total 1.3M
4.0K drwxr-xr-x 2 anonimous anonimous 4.0K May 9 21:36 ./
4.0K drwxr-xr-x 4 anonimous anonimous 4.0K May 9 19:02 ../
68K -rwxr-xr-x 1 anonimous anonimous 68K May 9 21:36 basename*
72K -rwxr-xr-x 1 anonimous anonimous 70K May 9 21:36 cat*
68K -rwxr-xr-x 1 anonimous anonimous 65K May 9 21:36 cp*
68K -rwxr-xr-x 1 anonimous anonimous 68K May 9 21:36 dirname*
72K -rwxr-xr-x 1 anonimous anonimous 69K May 9 21:36 echo*
64K -rwxr-xr-x 1 anonimous anonimous 62K May 9 21:36 false*
76K -rwxr-xr-x 1 anonimous anonimous 75K May 9 21:36 head*
64K -rwxr-xr-x 1 anonimous anonimous 62K May 9 21:36 mkdir*
76K -rwxr-xr-x 1 anonimous anonimous 75K May 9 21:36 nl*
72K -rwxr-xr-x 1 anonimous anonimous 69K May 9 21:36 pwd*
68K -rwxr-xr-x 1 anonimous anonimous 68K May 9 21:36 seq*
68K -rwxr-xr-x 1 anonimous anonimous 65K May 9 21:36 sleep*
76K -rwxr-xr-x 1 anonimous anonimous 74K May 9 21:36 tail*
72K -rwxr-xr-x 1 anonimous anonimous 70K May 9 21:36 tee*
64K -rwxr-xr-x 1 anonimous anonimous 64K May 9 21:36 touch*
64K -rwxr-xr-x 1 anonimous anonimous 62K May 9 21:36 true*
80K -rwxr-xr-x 1 anonimous anonimous 80K May 9 21:36 xxd*
68K -rwxr-xr-x 1 anonimous anonimous 68K May 9 21:36 yes*Я бы не говорил о мегабайтах
1.3 Мб на 18 жалких утилиточек, которые делают дело по предельному минимуму? Это фейл.
Не позорь имя анона школота безродная! Вот размеры бинарей на Ц из православной Джесси. Как видишь не велика разница.for i in basename cat cp dirname echo false head mkdir nl pwd seq sleep tail tee touch true xxd yes; do \
> ls -lh $(which $i); \
> done-rwxr-xr-x 1 root root 31K Mar 14 18:47 /usr/bin/basename
-rwxr-xr-x 1 root root 51K Mar 14 18:47 /bin/cat
-rwxr-xr-x 1 root root 148K Mar 14 18:47 /bin/cp
-rwxr-xr-x 1 root root 31K Mar 14 18:47 /usr/bin/dirname
-rwxr-xr-x 1 root root 31K Mar 14 18:47 /bin/echo
-rwxr-xr-x 1 root root 27K Mar 14 18:47 /bin/false
-rwxr-xr-x 1 root root 39K Mar 14 18:47 /usr/bin/head
-rwxr-xr-x 1 root root 79K Mar 14 18:47 /bin/mkdir
-rwxr-xr-x 1 root root 39K Mar 14 18:47 /usr/bin/nl
-rwxr-xr-x 1 root root 31K Mar 14 18:47 /bin/pwd
-rwxr-xr-x 1 root root 47K Mar 14 18:47 /usr/bin/seq
-rwxr-xr-x 1 root root 31K Mar 14 18:47 /bin/sleep
-rwxr-xr-x 1 root root 63K Mar 14 18:47 /usr/bin/tail
-rwxr-xr-x 1 root root 31K Mar 14 18:47 /usr/bin/tee
-rwxr-xr-x 1 root root 27K Mar 14 18:47 /bin/true
-rwxr-xr-x 1 root root 19K Apr 1 02:37 /usr/bin/xxd
-rwxr-xr-x 1 root root 27K Mar 14 18:47 /usr/bin/yes
лол невелика. минимум в 2-2.5 раза
> лол невелика. минимум в 2-2.5 разаТак для бешеной хипстоты в 3 раза - не крюк...
А для тех кого размер реально колыхал, есть такая штука как бизибокс. И по его меркам coreutils считаются неимоверным bloatware, если что...
Попробуй strip сделать для этих файлов
А что, на ld из GCC не умеет линковать статически? o_O o_O o_O o_O
Умеет, но восторженные пионэры об этом не знают.
В GCC нет ld.
> - минимальное рабочее окружение со статической линковкойИ тут сишники вас обставили, сделав бизибокс...
Восторг неофитов, скорее всего. Если к существующей реализации претензий особых нет, поблем с лицензией нет - что это может ещё быть?
А Вы наверное и не первый и не второй?
>мне кто-нибудь из тех, кто пишет на Стоесть вы на си не пишите. А на чем пишите?
>Go-недопрогаммистов неинтересноТоесть они хуже вас? Почему если вы не пишите на Си?
>нафига это нужно?Получить более стабильные утилиты засчет более современного языка, наверное.
C# с поддержкой своего core под линукс самый современный. Так пишите на нем, для апогея "стабильности", б.ять!
Откуда ты, такой буйный дауненок, взялся и что полезного ты сделал для сообщества?
Может для начала сам представишься?
Ты опять забыл принять таблетки.
>вы на си не пишитеЭй! Раскомандовался тут...
> Получить более стабильные утилиты засчет более современного языка, наверное.А что, у coreutils есть какие-то проблемы со стабильностью?
Вообще да. Например, гнутый cp при копировании 50 терабайт мелких файлов сжирает всю память и вешается.
> 50 терабайт мелких файловo_O
Опять же проблемы при удалении папок с большим количеством файлов... Иногда это просто невозможно сделать с помощью rm
Ну тут два варианта - утечка из-за ошибки в коде, либо разрастание кучи из-за дефекта в malloc/free, а может быть и сама ОС дурит, теряя по байтику при каждом open/close.
>Ну тут два варианта - утечка из-за ошибки в коде, либо разрастание кучи из-за дефекта в malloc/free, а может быть и сама ОС дурит, теряя по байтику при каждом open/close.Скорее, ошибка в ДНК разработчиков.
>Reading the source code revealed that cp keeps track of which files
have been copied in a hash table that now and then has to be resized to avoid
too many collisions. When the RAM has been used up, this becomes a slow
operation.https://lists.gnu.org/archive/html/coreutils/2014-08/msg0001...
> Вообще да. Например, гнутый cp при копировании 50 терабайт мелких файлов сжирает
> всю память и вешается.А эту буиту на го вы уже проверили на этих тесткейсах? :)
если написать еще раз на си, могут не поставить зачет за курсовую работу - скажут плагиат. А так вполне может быть и зачет.а почему на Go недопрограмисты нопонятно. это же не питон :)
А сам как думаешь?> В настоящее время уже полностью готовы утилиты dirname, false, sleep, tee, true и yes,
вот именно этот проект явно не нужен т.к. пишет его какая-то школота.
>>Объясните мне кто-нибудь из тех, кто пишет на СА что ты хочешь от нас услышать? ИМХО, Just for Fun. Или может язык решили изучить и вместо "Hello World!" решили переписать все Unix утилиты?
А нафига ты нужен?
Не нужно.
А тот мегакостыль когда 32х битные программы на go не всегда запускались уже починили?
Бгг. Это совсем какие-то школьники делают. dirname помечен как готовый, хотя не поддерживает нескольких аргументов и --zero.
Вот что-то подобное я вижу во всех этих свежеслепленных Go-проектах. Оно всё как-то работает, но "продуктом" эти софтины не назвать. Что закономерно, в общем-то, учитывая обычно желание показать, как "легко и просто" что-нибудь сделать на Go. Что ж, сюрприз - законченный продукт почти никогда не бывает легким и простым, и на само писание кода не так много усилий, как некоторым кажется.
> само писание кода не так много усилий, как некоторым кажетсяА вот это очень хорошие слова. Почему-то многие забывают, что процентов эдак 50% работы программиста -- это вдумчивое составление непротиворечивого дизайна. Реализация которого потом довольно быстро пишется на любом языке известном языке (ну, кроме фортрана).
Есть ещё составление документации - это тоже весьма скучно
> Вот что-то подобное я вижу во всех этих свежеслепленных Go-проектах. Оно всё как-то работает, но "продуктом" эти софтины не назвать.Ну не знаю. Вот aptly, кажется, хоть и написан на Go, является весьма неплохой штукой. По крайней мере до сих пор я ничего лучше не нашёл для оперирования репозиториями и создания зеркал. Хотя там есть свои недочёты, но вполне готовым продуктом этот проект назвать можно.
Правда, не очень я понимаю, как программисты на Go дебажат свои проекты. В gcc сообщения об ошибках были куда понятнее имхо.
Ещё Docker написан на Go. Тоже хороший проект.
Насколько я понимаю, он заявлен как готовый к продакшну при том, что дыр в нём находят полно - это из той же серии, чрезмерная самоуверенность и попытки выкатить сырое.
ты не путаешь полезный и хороший?
> Правда, не очень я понимаю, как программисты на Go дебажат свои проекты.Так же как и питонисты - никак. Вываливают что есть, а дальше твои проблемы.
Я в выборе софта консервативен и нового пробую мало - за ненадобностью. Поэтому сужу по тому, что проскакивает в новостях. Недавно вот умильный тред насчёт VPN был, к примеру - с теми же проблемами. Докер дырявый, опять же - а он вроде как флагман софта, писанного на Go.
> Я в выборе софта консервативен и нового пробую мало - за ненадобностью.Я бы надеялся, что нас таких большинство. Тот случай с aptly был единственным, потому как больше до этого я перепробовал много софта для зеркалирования, и ничего, удовлетворившего мои нужды полностью, я не нашёл.
> Что ж, сюрприз - законченный продукт почти никогда не
> бывает легким и простым, и на само писание кода не так
> много усилий, как некоторым кажется.Ну так сpaные рапидчики никак не могут понять что навозякать кнопки на форме и даже кой-как накидать какого-то кода - это еще не есть качественная и полезная программа. Это всего лишь их жалкие потуги. А что-то сверх того требует нефигово повъе, при том не только по части кодинга.
Они же клоны утилит UNIX пишут, а не утилит GNU. Стандарты POSIX не предусматривают нескольких путей и никаких опций: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/di...
> Стандарты POSIX не предусматривают нескольких путей и никаких опцийdirname был взят как первый попавшийся. Больше чем уверен, что с поддержкой посикса там так же ахово как и с GNU.
Кстати, вот примеры из стандарта, которые эта поделка не проходит:
.build/dirname //a//b// -> /
.build/dirname /a/b/ -> /Ад и израиль. Зато посмотрите как мало кода!
Если вспомнить про неприятие опций (в других утилитах) в виде -abc, а только -a -b -c, то о каком POSIX вообще идет речь? Автор сего поделия просто тупое школоло.
> Ад и израиль. Зато посмотрите как мало кода!А когда они допишут до состояния "не хуже coreutils" - они узнают почему там столько кода и почему это столько писали.
Не допишут, пионэры не могут в длительные разработки.
Кстати, "examples are tests" - уже года три как норма в D-сообществе.
С этих убогих вообще взять нечего.
"Эти" занимаются своими делами и не пытаются всё и вся переписать. И лично мне результат их работы нравится - по мощи язык покруче плюсов, а острых углов на порядок меньше. То, что за ними нет гугла или кого-то подобного - отдельный разговор.А вообще - я имел в виду, что "тесты = примеры" - отннудь не изобретение гошников.
А это нигде и не утверждалось.
А это вообще эпично:> I used "flag" to do the flag-parsing, it is a little strict (ie. no combining flags like -xyz instead of -x -y -z).
Совместимость? Не, не слышал.
Мда, поветрие как оно есть. Последний раз я такое видел, когда на Ruby всё писать пытались.
Just for fun, вот только история показывает что проблем от такого фана потом будут горы.
А программы на Го могут обращаться к общей библиотеке? Мне просто интересно, как они будут одинаковый функционал делать? А если в нем будут исправления, будут все утилиты перекомпилировать?
gccgo по умолчанию делает динамическую линковку, на сколько я знаю. А вообще да - пересобирать. Но это не долго.
dlopen() дергают.
>basename
>cat
>echo
>pwd
>tail
>работоспособны с некоторыми ограничениямиСпециально скачаю, чтобы посмотреть на pwd и echo с "некоторыми ограничениями".
>Предстоит реализовать bc, dc, ed, ls, more и rm.
Че-то ржу.
> Специально скачаю, чтобы посмотреть на pwd и echo с "некоторыми ограничениями".я и без скачиваний предполагаю что этот ихний echo небось не умеет печатать фразы начинающиеся на знак минус. (обычный echo умеет)
https://github.com/polegone/gonix/blob/master/echo.goДаже человеку незнакомому с Go видно, что никаких getopts (в Go похожая система flags) не используется и проверок на "invalid argument" нет.
> Специально скачаю, чтобы посмотреть на pwdЧтобы понять объем залета, надо вспомнить что в большинстве ФС в *никс файлы и диры могут содержать в названиях любые байты кроме 0x0 (конец строки в Си) и "/".
А теперь представь себе что ты хочешь распечатать на экран путь содержащий полный ассортимент байтов кроме этих двух. Желательно чтобы как минимум терминал потом не очень перекашивало :)))
хеллоуворд какой-то, если в исходники посмотреть. автор сам запостил новость на опеннет?
Да хватит сюда тащить проекты про которые даже автор пишет что это для обучения, фана и больше никуда не пойдет
ужас, зачем эти hello worldы, без обработки различных ситуаций, с минимальнейшим функционалом по сравнению с аналогами, сюда надо было тащить?
> Также можно отметить проект GodocА это тут причём вообще?
echo:
for i := 1; i < len(os.Args); i++ { fmt.Printf("%s ", os.Args[i]) }В конце лишний пробл добавится в итоге. Это нормально?
Вот еще фееричная вещь из реализации yes:
for i := 1; i < len(os.Args); i++
Дурачку невдомёк, что os.Args[0] это имя исполняемого файла? Тогда чего он лезет судить других людей?
Nope. Это умнику невдомек, что функция len будет вызываться при каждой итерации.
Пруф? Думаю, компилятор в состоянии это соптемизировать. К примеру gcc могет соптемизировать for(int i = a; a < b; ++i)
++N;
До N = b - a - 1. В контексте задачи нахождения количества чисел от а до b (видел где-то такое чудо решение на просторах интернетов).
дурацкий пример, ибо весьма простой, а вот как раз компилятор вряд ли станет оптимизировать вызовы функций (раньше по крайней мере на это не были способны), потому что функция само по себе по мимо возврата результат числа через стек может делать другую работу типа записи в файл и т.д. и т.п
Пруф чего? Если длина строки заранее неизвестна, то каким образом компилятор сможет оптимизировать вызов функции внутри оператора for? Вынести len за пределы цикла, изменяя тем самым семантику программы, что для любого уважающего себя компилятора моветон? А если длина строки изменится внутри цикла, что тогда?Вот простой пример того, что GCC с флагом -O3 бессилен в таких случаях. В ассемблерном листинге четко виден вызов strlen внутри цикла.
> А если длина строки изменится внутри цикла, что тогда?На самом деле код есть априори и из него понятно что строка константная, тоесть так можно сделать.
Но да, для компилятора - это слишком круто. А поколение, выбирающие пепСИ и го, без знания ассемблера и принципов компилятора, это не знает - есть такое.
Это потому что gcc не имеет права инлайнить strlen, а не имеет он его потому, что сишный рантайм общий на всю систему. А б-гомерзкий MSVC такой инлайн прекрасно делает и на -O0, а на -O3 вычисляет длину argv[i] один раз, а не каждый раз в цикле.
То есть, у тебя компилятор вычисляет длину передаваемого в рантайме аргумента еще до того, как он был передан?
Ты дурачок? Компилятор оптимизирует код так, чтобы в рантайме значение вычислялось всего один раз
Хотя, кажется я понял, что ты имеешь в виду.
Но все равно, при чем тут инлайн? Если мы вычисляем длину _константной_ строки, то любой вменяемый компилятор такой вызов оптимизирует и заменит вызов функции на ее значение. Но с длиной динамического массива такой фокус не пройдет. Теперь внимание, вопрос: как твой компилятор отличает argv от других массивов?
У него есть argc. %)А если серьезно, то и с длиной динамического массива такой фокус тоже, разумеется пройдет — если эту длину в теле цикла не менять, и других потоков выполнения не иметь (или иметь, но знать, что они тоже ее не меняют).
И вообще, os.Args — это не динамический массив. Он статический.
os.Args - слайс в терминологии Go, то есть вполне себе динамический массив
Нет, он []string. И слайсы не могут вырасти больше чем capacity, а capacity неизменна.Если вам нужно увеличить длину массива, все, что вы можете — это сделать append, но он возвращает новый массив, а старый остается без изменений.
А как еще могут работать динамические массивы?
> Это потому что gcc не имеет права инлайнить strlen-D__USE_STRING_INLINES, после чего включается машинерия в /usr/include/bits/string.h
Забыл пример.
http://pastebin.com/wZKuu00q
Оптимизоровать можно только детерминированные ф-ции, т.е. результат которых зависит ислючительно от аргументов. В Го есть механизм указания детерминированности?
> соптемизировать.Go'пники оказывается надеются что за них "оптемизирует" компилер. А то и вовсе "оптемезерует".
> К примеру gcc могет соптемизировать
> for(int i = a; a < b; ++i)И в каком месте тут был вызов функции? Тут все параметры фиксированные, заранее известные, можно каой-нибудь unroll цикла сделать (от чего в половине случаев на половине процессоров нынче станет хуже а не лучше), сэкономив на инструкциях jump в конце цикла (но раздув код, так что если не влезет в кэш, эффект от экономии jmp-ов может проcpaться).
> количества чисел от а до b (видел где-то такое чудо решение
> на просторах интернетов).Может ты еще и развороты циклов видел? В случае вызова функции проблема в том что оптимизатор должен быть чуть ли не AI чтобы понять что она всегда возвращает одно и то же.
>В случае вызова функции проблема в том что оптимизатор должен быть чуть ли не AI чтобы понять что она всегда возвращает одно и то же.AI не нужен. Можно определить детерменированную функцию как только такую, в которой для вычисления результата используются только детерменированные операции в своем теле (+ - * и т.п.) и вызовы других детерменированных функций и не имеет никаких других операций и вызовов.
Результат такой функции будет зависит исключительно от ее аргументов и не иметь побочных эффектов.Детерменированные функции компилятор может помечать в процессе их компиляции и если вызов такой детерменированной функции уже в другой еденице компиляции показался компилятору избыточным, то выкидывать его.
Я просто не знаю может ли так Го.
это вам невдомек, что иногда лучше жевать. В го функция len работает за константу.Эксперты opennet в очередной раз расписались в своей полной некомпетентности))
Да уж, тяжелая судьбинушка у этой функции. Ничего не скажешь.
А если ей передать в качестве аргумента динамический массив, то она тоже "за константу сработает"?
Представь себе.
Ясно.
А теперь, пожалуйста, компетентно поясните: какой смысл Вы вкладываете во фразу "работает за константу"?
Я не тот аноним, но факт в том, "динамические массивы" в Го содержат длину как переменную в структуре. Так что "работает за константу", видимо подразумевает, не зависит от количества элементов.
курите маны: http://blog.golang.org/go-slices-usage-and-internals
> Да уж, тяжелая судьбинушка у этой функции. Ничего не скажешь.
> А если ей передать в качестве аргумента динамический массив, то она тоже
> "за константу сработает"?В го массивы статические.
А где тогда динамические?
> А где тогда динамические?
>> курите маны: http://blog.golang.org/go-slices-usage-and-internals
> Nope. Это умнику невдомек, что функция len будет вызываться при каждой итерации.А вот макрос loop в Common Lisp такие ситуации умеет обрабатывать. И код становится очень даже приятно читаем. =)
Дежавю. На каком-то языке, по моде этак 5-летней давности, уже пытались эти утилиты переписывать. Ниасилили. Похоже, го тоже ничего не светит.
в конце концов есть же perl power tools
А это. Оно динамическую сборку делать научилось? Или там каждый ls весит 10 мегов?
для динамической линковки есть gccgo
Надеюсь, они использовали OO возможности языка, а иначе не имеет смысла.
Это в любом случае не имеет смысла.
Я бы ещё понял, если бы true и false написали на чистом ассемблере, хотя с нынешними оптимизациями для Си смысла нет. Ждём реализацию данных утилит на JavaScript собранных в один файл под NW.js
На x86 бинари для true и false можно впихнуть в 45 байт. Если писать на ассемблере. Подробности можно почитать, например, тут: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
Насчёт всего остального, типа cat -- не скажу, не интересовался. Полагаю результат будет резко хуже, особенно если разбирать аргументы командной строки, обрабатывать все разнообразные вероятные и невероятные ошибки сисколлов и проч. Но если говорить про true и false, то на асме можно выжать эффективность, которая переходит все рамки бессмысленности. Компиляторы так не умеют.
> Я бы ещё понял, если бы true и false написали на чистом ассемблереВот только если посмотреть на скольких архитектурах работает тот же линух - придется разучить довольно много довольно разноплановых ассемблеров.
>polegone 1 day ago
I'm just doing this for fun and to learn about Go and Unix at the same time.
I am a beginner, and a lot of my code is inefficient and/or incomplete, but by putting it on the Internet I can get criticism and find out where I went wrong.
For instance, some of you have told me that the way I've been reading files is very inefficient, so now I'll try and do it the correct way.<-- слова автора в оригинальном топике на HN: https://news.ycombinator.com/item?id=9514818. А заголовок как будто сами GNU решили все на Go переписать. Там в этом же топике еще куча таких проектов.
да вообще забавно наблюдать, как из-за этого наколенного проектика тут у многих начало бомбить :) Нинужно! Оно нисоответствует стандарту ПОСИКС!в который раз убеждаюсь, что о популярности чего-то (в данном случае - Go) лучше всего судить по числу хейтеров))
Претензии тут не к автору проекта. Да, код весьма плох - но, автор четко писал, что просто для обучения. Претензии к автору-дегенерату новости, что он откопал это и принес сюда.зы: это ничего, когда кто-то сделал кривой и косой шкаф, но когда он окажется на центральной площади, то это логично что все над ним смеятся будут.
проблема в том, что смеющиеся сами ни черта не понимают в теме. И выглядят убого тут в первую очередь они, а вовсе не авторы проекта и новости.
Для ознакомления с языком - самое то
> Для ознакомления с языком - самое тоА нам зачем об этом новости читать? Давай я накорябую сюда новость про то как я учился в турбо-пасквиле рисовать через egavga.bgi? :)
О! Братья-олдфаги подтянулись! :) Помню-помню, балет на костылях с насаженными роликами, 640x480, всё страшное, но работает как молния. BGI-шки были для разных режимов и их нужно было загружать.
А потом пришёл Си и всё опошлил!
>BGI-шки были для разныхрежимов и их нужно было загружать. А потом пришёл Си и всё опошлил!
Да ладно, в борланд ц++ для дос были те же бги.
Школозадое дубьё из Гугла, "отобранные лучшие из лучших", хорошо умеют решать задачи про люки, но вот в реальной жизни лажают как олимпиадники - нет ни профессионального чутья, ни опыта, ни глубоких _программерских_ знаний.По-моему, все эти затеи - жалкая попытка гугла быть "кем-то" помимо поисковика. Пока получается хреново - запилили язычок, достойный дипломника, а теперь, почти без вливаний, хотят чтобы все на него прыгнули только из-за лэйбла "googled in google" - ЩАЗ! :)
А по поводу полезности проекта, сразу "НЕ НУЖНО". Линуксы/БЗДи и так ПРЕКРАСНО поживают на уже написанных вещах, "тут саму консерваторию менять надо!" (ц)
Сипипи как язык - конечно левая "бомба", его менять нужно, но просто переписать ls на Go/D/Rust и т.п. - глупо, мир "текстовых потоков, входящих и выходящих из программ" умер с первым Жыпег-файлом, миру нужна принципиально новая концепция вместо заскорузлого POSIX.
POSIX, может, и заскорузлый, но нужно ли миру очередное "принципиально новое" без обратной совместимости - большой вопрос. На одной чаше весов - "принципиально новое", на другой - тонны рабочего и отлаженного софта, который вряд ли кто-то кинется переписывать.
>запилили язычок, достойный дипломникаскажете это в лицо Тейлору, Чейни, Пайку, Кернигану, и кто там еще из авторов?))
Их ржавые друзья опередили на целый год: http://www.opennet.me/opennews/art.shtml?num=39989