LINUX.ORG.RU

Человеческая замена C для своих задач

 ,


0

6

Хочется найти простой кроссплатформенный компилируемый язык для программирования всякой мелочи для себя. Отправной точкой можно назвать C, но хочется поменьше рутины, возможностей на ровном месте выстрелить в ногу и наличия удобных базовых структур, вроде строк, динамических массивов и прочих списков. В кандидатурах сейчас пока C++ (не хочется лезть в дебри именно плюсов, с другой стороны писать в духе C с классами кажется как-то не комильфо), Pascal (начинал с Delphi когда-то, но уже почти не помню), Vala (тыкал немного, напрягает, что надо тянуть Glib и с поддержкой + кроссплатформой не очень), Go, D (на первый взгляд тоже ситуация с поддержкой и библиотеками не радует), Rust (какой-то инопланетный, но идея с управлением памятью интересна).


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

А мог бы использовать православный Qt (код не запускал):

void fillFileList(const QString &fileName, Window *window)
{
    const auto dir = QFileInfo(fileName).absolutePath();
    qDebug() << "Open directory" << dir;
    for (const auto &fi : QDir(dir).entryInfoList()) {
        if (fi.isFile()) {
            window->appendFile(fi.absoluteFilePath());
        }
    }
}

Итого: 6 строк vs 20. Но проще заливать про читабельность сишки.

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

Вот пощупал бы и доложил ))

Я ленивый анонимус. Но когда-то и дойдут руки. А они может уже и 0,5 выкатят.

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

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

эталон самоописательного комментария

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

Возможно, в его понимании это нечитабельный говнокод.

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

Я не удивлен, что ты предпочел молоть языком на форуме

Зайти в нахер мне не упавший репозиторий на GitHub-е, обнаружить там явный баг, ткнуть автора в этот баг — это все теперь называется «молоть языком»?

Ай да Геннадий, ай да...

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

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

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

Иннокентий

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

Я в таком /примерно/ случае делал goto cleanup, который в самом-самом конце делал освобождение ресурсов и выход из функции. И это была вторая более-менее серьёзная программа на Си /ну не сишник я, чо уж там/.

Вообще, чтобы не городить огромный стреловидный код, где сверху стрелы захват ресурсов, а снизу их высвобождение /а в центре полезная работа/, захват-высвобождение стоит выносить в отдельную функцию. Либо обёртку делать, либо за раз хапать и освобождать всё, ну вы меня понимаете.

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

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

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

А всё почему? А всё потому, что плевали мы на защиту, обработку ошибок и всё остальное. Как учили, так и пишем. Не приучили.

Владимир

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

Либо обёртку делать, либо за раз хапать и освобождать всё, ну вы меня понимаете.

Нет. Не понимаю. Мне сложно понять, зачем делать все эти приседания, когда механизмов для упрощения жизни вокруг полным-полно. Достаточно просто по сторонам посмотреть.

А всё потому, что плевали мы на защиту, обработку ошибок и всё остальное. Как учили, так и пишем. Не приучили.

«Мы»? Я надеюсь, что речь идет про вас с кем-то, кого вы лично знаете. И их немного.

Не нужно обобщать. Вас так научили, вы так и пишете.

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

и возможна ситуация, что счётчик бы тут 0, но вот оно вот прямо сейчас понадобится и трогать не стоит

И каким образом оно тебе понадобится, если у тебя нет на это ссылок?

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

вообще забили на это

https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-try-m...

Attempts to allocate n_bytes , and returns NULL on failure. Contrast with g_malloc(), which aborts the program on failure.

Судя по тому, что гномисты должны использовать g_malloc с друзьями вместо обычного malloc, любой гномокод при NULL из malloc обязан выпадать в осадок сразу же, с выплёвыванием ошибки. Хорошо ли это? Не знаю.

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

И каким образом оно тебе понадобится, если у тебя нет на это ссылок?

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

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

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

Не надо. К вашим услугам: RAII в C++/D/Rust, with в python, using в C#, try with resources в Java, defer в Go. И т.д. и т.п.

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

Вы напрочь проигнорировали кусок текста про то, что и не на Си надо работать с ресурсами. Не делайте так, пожалуйста. Ресурсы — это не только приседания с malloc.

Мне сложно понять, зачем делать все эти приседания, когда механизмов для упрощения жизни вокруг полным-полно. Достаточно просто по сторонам посмотреть.

«Эти механизмы» работают не всегда и не везде используются. Разные механизмы не умеют договариваться друг с другом. Механизмы могут иметь свои нюансы и не до конца освобождать вас от ответственности. В общем, приседания вы будете делать и не с Си.

«Мы»? Я надеюсь, что речь идет про вас с кем-то, кого вы лично знаете. И их немного.
Не нужно обобщать. Вас так научили, вы так и пишете.

Ну раз вас и много кого научили делать всё правильно и учитывать всё, что может произойти, тогда вам будет без труда писать на том же C/C++, ведь для вас разницы никакой =))). Какая разница, всего-то выделение памяти добавилось. Ах, да, механизмы. Берёте, значит, GC_malloc, прошиваете им свой код вдоль и поперёк и вперёд =))). Большей части уже нет.

Владимир

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

Ресурсы — это не только приседания с malloc.

Вы это хотите объяснить человеку, который пишет на C++ с 1992-го года?

«Эти механизмы» работают не всегда и не везде используются.

Ну расскажите о проблемах с RAII в C++/Rust. Или о scope(exit) из D. Или о defer из Go.

Ну раз вас и много кого научили делать всё правильно и учитывать всё, что может произойти, тогда вам будет без труда писать на том же C/C++, ведь для вас разницы никакой =)))

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

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

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

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

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

Что ж, продолжим «самоописательные комментарии»:

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

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

Я не удивлен, что ты предпочел молоть языком на форуме

Нет дошколенок. Тебя окунули в дерьмо. Теперь ты пытаешь плакать и оправдываться.

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

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

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

Ты никогда не узнаешь, где оно находится.

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

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

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

И каким образом оно тебе понадобится, если у тебя нет на это ссылок?

Если счётчик был бы 0, то у тебя нет на этот ресурс ссылок. Тебе не известен его адрес. Если у тебя есть ссылки на ресурс, то счётчик будет > 0.

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

человеку, который пишет на C++ с 1992-го года?

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

Ну расскажите о проблемах с RAII в C++/Rust. Или о scope(exit) из D. Или о defer из Go.

В C++ классический, заезженный пример — исключения в деструкторах, например. Что там у нас? Ах, да, плюсовый код. Весь код на плюсах, который вы видели с 1992-го года, является идиоматическим плюсовым кодом, линкуется с точно таким же кодом и обращается с ресурсами абсолютно одинаковым образом? Вы в футляре живёте?

Про Rust я вам ничего не скажу, про то, что увидел в D и Go скажу, что от того же танца с goto cleanup оно существенным образом не отличается. Не впечатлило. Я и в этом случае буду писать обёртки из-за опухания верха функции.

Владимир

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

В C++ классический, заезженный пример — исключения в деструкторах, например.

Забыл очистить память в Си - быдлокодер. Вызвал исключение в деструкторе - С++ плохой. Логика/0.

про то, что увидел в D и Go скажу, что от того же танца с goto cleanup оно существенным образом не отличается.

Вы куда-то не туда смотрели.

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

Если счётчик был бы 0,

Это означает, что вам этот ресурс перестал быть нужен.

то у тебя нет на этот ресурс ссылок.

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

vodz ★★★★★
()

Что за срач? Бери qbasic, на долго хватит.

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

Это означает, что вам этот ресурс перестал быть нужен.
Это означает, что у вас язык, непозволяющий иметь интересные копии на всякий случай

Это означает, что ты вообще не понимаешь, о чём говоришь.

Если тебе нужно иметь интересную копию, то ты сохраняешь на неё ссылку. И тогда, внезапно, счётчик > 0. Если ты удалил все ссылки, то ты так же поступил бы и в сишке. Соответственно потом не смог бы воспользоваться данным ресурсом. Что тут может быть не ясно?

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

Это означает, что ты вообще не понимаешь, о чём говоришь.

Увы, это относится к вам.

Если тебе нужно иметь интересную копию, то ты сохраняешь на неё ссылку.

Значит оно не удалится. А условие задачи такое: оно может удалиться, тогда если потребуется придётся аллокировать заново.

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

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

Вы, видимо, что-то свое прочитали. Я указывал Эдди на проблемы с освобождением памяти в его коде. И говорил, что в C в принципе нет инструментов, которые бы облегчили эту задачу. Собственно, в C нет никаких инструментов для упрощения облегчения работы с любыми ресурсами. Будь то память, объекты синхронизации, файлы или еще что-то.

А по ссылке в блоге были примеры не только с памятью, но и с мьютексами.

В C++ классический, заезженный пример — исключения в деструкторах, например.

Например, в C++ нельзя делить на ноль, разыменовывать нулевой указатель, повторно освобождать уже освобожденную память. Это все такие же ошибки, как и выброс исключения из деструктора.

Сказать то что хотели?

Весь код на плюсах, который вы видели с 1992-го года, является идиоматическим плюсовым кодом, линкуется с точно таким же кодом и обращается с ресурсами абсолютно одинаковым образом? Вы в футляре живёте?

А теперь все тоже самое, но так, чтобы эта сентенция была понятна не только вам.

то, что увидел в D и Go скажу, что от того же танца с goto cleanup оно существенным образом не отличается.

Ахринеть, дайте два! Офигительных историй становится все больше.

Я и в этом случае буду писать обёртки из-за опухания верха функции.

Каждый может говнокодить как он может.

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

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

Не совсем так. В общем случае, выбор не сильно важен (если мы не уходим в крайности). Т.е. команда сишников вполне может сделать что-то довольно быстро и качественно на своем любимом Си, не смотря на то, что Си хуже D или крестов в техническом плане. И нет никакого смысла их перетаскивать на что-то другое.

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

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

Сразу видно, что это писал поклонник GC

Нет, просто речь о недостатках по сравнению с GC. Это вроде очевидно из контекста.

и возможна ситуация, что счётчик бы тут 0, но вот оно вот прямо сейчас понадобится и трогать не стоит

Нет, не возможна.

Отсюда получается простой вывод - правильный код с автоматической чисткой всегда медленнее.

Нет, не всегда. Просто иногда она вообще не нужна и достаточно уникального владения и его(владения) передачи. Условно, крестовый unique_ptr. Через это можно выразить все, что выражают ручным управлением. И производительность не пострадает.

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

А всё потому, что плевали мы на защиту, обработку ошибок и всё остальное. Как учили, так и пишем. Не приучили.

Говорите за себя.

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

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

А вы проигнорировали, что для этого так же есть механизмы, аналогичные RAII.

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

Т.е. команда сишников вполне может сделать что-то довольно быстро и качественно на своем любимом Си

Да понимает он всё, просто прикинулся шлангом, как он любит делать. Ранее в треде ему приводили пример, когда команда разработчиков написав движок на C++, продалась Amazon'у и после закрытия своего детища начала делать новый движок и редактор к нему уже на C. Просто дядя Женя завел свою любимую шарманку «Не пишите на C, просто потому, что я так сказал». Типичный фанбой C++, увы и ах.

Георгий

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

В C++ классический, заезженный пример — исключения в деструкторах, например

А зачем вы кидаете исключение в деструкторе?

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

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

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

Михаил

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

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

anonymous
()

От бывшего Владимира /hobbit это от Владимир/.

«Кто пытается понять почему профессионалы поступают так - поступают верно.
От одного хорошее „взял“
От „другого“, ...
И будет код хороший - наверно.
» Экспромтом /это идея, а не production/.

Вот выше в топиках была критика кода в котором не освобождалась память.
Как же в си уследить за этим? Ну например так.
Перед указателями, которые будут динамически «получать память» помещаем «пустой» define.
Типа такого:
#define _FM_ // Free memomy
...
...
char _FM_ *Buffer = malloc( 10 );
... ... _FM_ free( Buffer );

Как же теперь проверить были ли утечки?
В notepad++ поиском подсчитываем общее количество подстрок «_FM_» и _FM_ free.
Вычисляем разницу количеств и «посыпаем пеплом голову».

PS: Как говорил один персонаж «Ну вы же понимаете как в таких условиях легко работать ...»

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

Вычисляем разницу количеств и «посыпаем пеплом голову».

Оно должно совпадать только для локальных выделенных или освобожденных ресурсов внутри функций.

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

От бывшего Владимир.

Такую технику программирования использует частенько Microsoft.
Если внимательно посмотреть объявление аргументов функций, то увидим использование множества псевдо #define: _in, _in_out, ... /их сотни. Если не тысячи/.
Подумайте зачем Microsoft так поступает ...
Для компилятора они не нужны и как-бы ни на что не влияют/.

PS: «Кто ни чего не понял - я не виноват».
М-да /для некоторых это шутка - let it be/.

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

В notepad++ поиском подсчитываем общее количество подстрок «_FM_» и _FM_ free.

Псевдокод

char* ptrarr[N];
_FM_ ptrarr[0]=malloc(M);
_FM_ ptrarr[1]=malloc(M);
...
_FM_ ptrarr[N-1]=malloc(M);
...
for(i=0; i < N; i++)
  _FM_ free (ptrarr[i]);

Вычисляем разницу количеств и «посыпаем пеплом голову».

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

Эшо /об постах/.

Ребята, ну правда впечатление от постов - спор «остроконечников» с «тупоконечниками».

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