LINUX.ORG.RU

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

 ,


0

6

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


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

Я понятия не имею о Go, но этот пример слишком короткий и примитивный, чтобы на его основе сделать адекватные выводы. И даже этот пример, скорее всего на Питоне можно сделать короче, без потери читаемости, что-то вроде 6-7 строк. А на шелле так вообще в 3.

На компиляцию, запуск и отработку на мобильном sandy bridge уходит около 300 мс.

Пример слишком маленький, чтобы судить о скорости, даже зная а приори, что у Go быстрый компилятор. Далее, для грамотного измерения как минимум нужно запускать несколько раз и указывать среднее и стандартное отклонение. Вот, у меня С'шный аналог первый раз компилируется и запускается ок. 200мс, а последующие компиляции и запуски уже в пределах 50мс. А Go на последующих запусках не опускается ниже 170мс. Означает ли это, что С в супарной производительности компиляция+выполнение в >3 раза быстрее Go. Нет, не означает (даже если это так) т.к. пример игрушечный.

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

Tiny C Compiler

#!/usr/bin/tcc -run

#define _GNU_SOURCE // get_current_dir_name

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
        printf("Hello world!\n");
        char *cur_dir_name = get_current_dir_name();
        printf("cwd: %s\n", cur_dir_name);
        printf("args:\n");
        for (int i = 1; i < argc; i++)
                printf("  %s\n", argv[i]);
        free(cur_dir_name);
        return 0;
}
Где-то 12 мс.

gcc на компиляцию тратит около 70 мс.

gag ★★★★★
()
Последнее исправление: gag (всего исправлений: 2)
Ответ на: комментарий от seiken

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

Я указал среднее время на глаз после нескольких проходов (за исключением первого). Это, конечно, на так точно, но для оценки вполне сойдёт.

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

Ну вот если бы ты не написал, что этот код делает, я бы не понял сходу. А в С все прозрачно и понятно.

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

А ничего, что символ - целое и неделимое число, там не должно быть флоатов.

Так ты в D разбираешься или от балды сейчас гонишь?

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

Если вам нужны только новые проекты (почему?), то могу привести в пример проект новее:

Встречайте, Our machinery, от создателей игрового движка Bitsquid, позже купленного Amazon.

Написан на C11, примеры из их блога (всем хипстерам и любителям проектов, начатых не раннее 2018+ выпить валерьянки перед прочтением):

Этих людей уж точно не обвинишь в их неуспешности, или в том, что они плохие программисты. Поэтому напрашивается вывод — пиши на языке, который тебе удобен и удовлетворяет всем требованиям (даже если это C).

goto-vlad
()
Ответ на: комментарий от Eddy_Em

Напиши тот же код на чистом D. поржем.

Эдди, вернись в наш мир! Это и был код на чистом D, чище не бывает. Только stdlib языка используется.

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

Потому что многие проблемы с си решаются снипплетами, макросами, заранее написаными либами наконец. Неужели ничего актуального нет?

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

Геймдев это вообще отдельная песня. Аллоцировали всё сразу и рады.

Про строки там вообще эпично. Типичное фанбойство.

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

Я? Давно определился.

Вы уж определитесь: либо они нужны и тогда их нужно писать самому (вы ведь это предлагали, не так ли?), либо не нужны (тогда к чему был ваш совет?).

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

Во-вторых. В качестве иллюстрации из пункта выше, могу предложить наличие ADT типа list в ядре или хэш-таблицы или двоичных деревьев в стандартной библиотеке libc. Если писать для ядра, то можно свою реализацию списков сделать, но остаётся открытым вопрос «зачем». Если писать задачу на С, то можно и хэш и бинарные деревья зафигачить свои. Но опять вопрос «зачем»?

Впрочем, ещё раз. Медленно и печально — С не исключает этой возможности. Если считаете нужным, напишите. Если реализация данного ADT в данном конкретном проекте Вам не нужна, не тратьте на неё ресурсы.

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

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

Т.е., так и запишем. Неизвестно нужен ли программисту какой-то вариант реализации стека в данном проекте или нет ему уже его выделили, в рантайме, его даже неспросив. Единственно верный, пусть будет доволен.

Но здесь в С есть интересный момент. Лично мне известны реализации ADT как в виде разделяемых библиотек (да тот же GLib), так и в виде макросов. И опять С не налагает на меня ограничений. Либо я увеличиваю число зависимостей в проекте за счёт библиотеки, либо я несколько увеличиваю код проекта за счёт развёртывания макросов в коде. Опять всё в моих руках.

Это легаси.

Умоляю Вас не быть малолетним дол... ну, Вы поняли, да? И не говорить этого ни GTKшникам вообще, ни гномерам в частности.

По приведённому Вами коду. Предлагаю Вам для начала показать как Вы запустите этот код без инфраструктуры D? Ну, то есть, как гентарь я не делал (и не собираюсь) emerge dlang.

Потом можете сделать man strlen. И можете подумать где именно эта стандартная для POSIX функция расположена.

Думаю, ответ на поставленный Вами вопрос Вы и без меня найдёте успешно. Я в Вас верю. На самом деле, нет, но это мелочи. =)))

Moisha_Liberman ★★
()
Ответ на: комментарий от goto-vlad

Если вам нужны только новые проекты (почему?)

Потому, что если у вас 100500 работающих строк на чистом C, имеющим возвраст в 30 лет, то просто так взять и выбросить их не получится. Как и в одночастье переписать на чем-то еще. Ваш К.О.

Встречайте, Our machinery

И какую цель его разработчики преследуют?

всё как вы любите

Не угадали. Более того, ребята сами пишут:

However, we acknowledge that there are a few rare cases where the greater expressive power of C++ can simplify the code

Надо же, даже C11 настолько хорош, что C++ все-таки лучше. Посему:

Currently the code base constists of is 98.9 % C and 1.1 % C++.

Ну т.е. не шмогла.

Вы бы лучше в качестве примера Tarantool привели.

Поэтому напрашивается вывод — пиши на языке, который тебе удобен и удовлетворяет всем требованиям (даже если это C).

Ага, только в этом случае нельзя просто брать и советовать чистый C. Поскольку ситуаций, где он будет адекватным выбором, становится все меньше и меньше.

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon
Владимир: "Вот пример реализации из Месы."
eao197: "Это легаси, не считается."
Я: "Вот пример поновее."
RazrFalcon: "Это геймдев, не считается."

Владим..., ой, Владислав.

goto-vlad
()
Ответ на: комментарий от WDWTFWW

Отчасти да.

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

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

Некоторым я бы законодательно запретил программировать. Но кто бы тогда писал на пыхе и 1С?

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

Moisha_Liberman ★★
()
Ответ на: Я? Давно определился. от Moisha_Liberman

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

А когда вам стали задавать наводящие вопросы на тему «а нафига?», вы завели стандартную Ъ-шную пластинку «на C дураки не пишут, а те, кто пишут не дураки».

Показательный уровень экпертизы. Простой код на C написать не могут, а отмазки ищут в неспособности поставить D в своей Gente.

И не говорить этого ни GTKшникам вообще, ни гномерам в частности.

Не говорить, что GTK – это легаси? Хорошо, не скажу. От этого он легаси быть не перестанет. Как бы вы из себя великовозрастного деб не строили.

eao197 ★★★★★
()

А у нас все лето будут срачики на тему C? У нас универсальных новых языков не так много, чтобы не знать их все хотя бы чуть чуть, остальные прибиты гвоздями к фреймворкам, и тут уже больше какой фреймворк больше подходит под задачу, тот и язык нужно тянуть...

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

Qt — тоже легаси. И говно никчемное. Плохо, что до сих пор подавляющее большинство гуйни пишется на GTK или Qt. Просто ужасно!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от goto-vlad

Что вас удивляет? Каждая область применения имеет свои особенности. В геймдеве или embed, где у нас всё заранее зашито, можно о многих вещах не беспокоиться. А в прикладных прогах, где неизвестно что на вход поступит, нужно более удобные инструменты.

RazrFalcon ★★★★★
()
Ответ на: Отчасти да. от Moisha_Liberman

На самом деле лучше бы Rust внедряли в safety вместо чудовищной MISRA. Ну хватит делать девелоперские тулзы, хорошие только для менеджеров...

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

However, we acknowledge that there are a few rare cases where the greater expressive power of C++ can simplify the code

Надо же, даже C11 настолько хорош, что C++ все-таки лучше

Согласен, 99% C и 1% C++ означает, что C++, по их мнению, лучше.

goto-vlad
()
Ответ на: комментарий от Eddy_Em

glib совсем не самое страшное... Кто эмбедил под Qt тот знает как одна строчка кода увеличивает rootfs на 50MB и найти эту самую строчку и написать аналог, который так не делает это та еще эквилибристика, которая хомячкам, пишущим «под Qt» недоступна...

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

Я Вам на пальцах объяснил...

Что предметных областей может быть более чем одна. А язык как раз нет.

Не важно что именно — kernel module, приблуда с GTK, сетевой демон, интерфейс к СУБД (всё что придёт в голову) Вы пишете. Синтаксис одинаков, семантика более-менее тоже.

Даже не важно нужны ли Вам в данном конкретном проекте ADT. Вас ими ни кто по рукам-ногам не вяжет и не заставляет обмазываться.

У Вас есть простые типа данных. А уж абстрактные типы и методы по работе с ними, это по желанию или самочувствию.

С ариорно не сводится к сравнениям типа «реализация стека в языке Х лучше, а в языке Y реализация хешей лучше» (сознательно утрирую).

Поэтому С-программист нарабатывает опыт в различных предметных областях, а не-С-программист изучает разные фреймворки. В том, что С-программист при необходимости напишет сам. В том-то и прикол что мы создаём реализации, а вы... Да пофиг как-то.

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 1)
Ответ на: комментарий от goto-vlad

Так вы сможете рассказать о причинах, толкнувших их на использование чистого C11?

А то ведь у них просто могла быть цель писать именно на C.

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

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

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

Это, к сожалению, правда.

Можете мне показать хоть одну ОС, написанную в части ядра и основного обвеса на ... (здесь представьте любимый Вами язык).

Psyon и, далее, превращение её в Symbian, не предлагать. Оно было на С++ и, кстати, уже закопано.

Ну, смелее! Жду работоспособную, готовую к продакшона хоть сейчас ОС на любимом Вами языке. И, соответственно, компиль там под неё, утиль...

И да, я не Царь, но по временем его очень сильно понимаю. Сидеть и сказки рассказывать про то, как плох С в системе, которая на нём и написана, используя сервер http(-s), который на этом же С и написан... Мне одному кажется что здесь не в С дело, а в голове/руках?

Moisha_Liberman ★★
()
Ответ на: Я Вам на пальцах объяснил... от Moisha_Liberman

Что предметных областей может быть более чем одна. А язык как раз нет.

Как одно с другим соотносится?

Не важно что именно — kernel module, приблуда с GTK, сетевой демон, интерфейс к СУБД (всё что придёт в голову) Вы пишете.

С здесь уместен без оговорок разве что для kernel module в Linux (и *BSD) и для приблуды с GTK. Все остальное гораздо удобнее писать на более развитых и безопасных языках.

Вас ими ни кто по рукам-ногам не вяжет и не заставляет обмазываться.

Вы не поверите, но и в C++, и в D, и в Rust-е все тоже самое. Никто не заставляет использовать вас контейнеры из стандартной библиотеки. Вы можете использовать, можете не использовать.

У Вас есть простые типа данных.

И только.

А уж абстрактные типы и методы по работе с ними, это по желанию или самочувствию.

Мало того, что их нужно будет либо написать самому, либо где-то взять. Так еще и работа с ними будет черезжопной. Поскольку у вас нет ни GC, ни RAII.

А нет, особо одаренные для RAII расширения из GNU C смогут использовать. Если ограничить себя миром Linux-а, то даже прокатит.

В том-то и прикол что мы создаём реализации, а вы...

Корона не жмет?

eao197 ★★★★★
()
Ответ на: Это, к сожалению, правда. от Moisha_Liberman

Ну если задаться целью ОС можно хоть на javascript'е написать... Тут было бы желание... В эмбедку если глядеть, то там в основном C и C++ с оговорками. Некоторые вкорячивают микроинтерпретаторы типа подрезанных lua и python, но тут нужно достаточно много памяти, которую в embedded часто можно использовать для более полезных вещей, так как себестоимость устройства должна быть существенно ниже рыночной стоимости, чтобы не прогореть, так как RnD и разработка отъедают значительную часть прибыли.

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

Так вы сможете рассказать о причинах, толкнувших их на использование чистого C11?

По ссылкам выше они объясняют, что:

  • C имеет стабильный ABI
  • C легче использовать со скриптовыми языками
  • C более компактен
  • C прост для восприятия
  • C++ шаблоны засоряют заголовочные файлы деталями реализации, замедляют компиляцию, и, зачастую, сообщения об ошибках сложны для восприятия.
goto-vlad
()
Ответ на: комментарий от goto-vlad

Все вместе это и есть типичный список причин, который приводят, когда люди хотят использовать именно чистый C. Т.е. мы будем закатывать Солнце вручную посто потому, что по другому не умеем.

Ведь выставить из C++ного или Rust-тового кода чисто C-шный API — это сложно, тут думать нужно, разделять интерфейс и реализацию. Лучше все сразу на чистом C делать. Даже когда на C++ удобнее. Тоже самое можно и про Rust сказать.

eao197 ★★★★★
()
Ответ на: Это, к сожалению, правда. от Moisha_Liberman

Сидеть и сказки рассказывать про то, как плох С в системе, которая на нём и написана, используя сервер http(-s), который на этом же С и написан... Мне одному кажется что здесь не в С дело, а в голове/руках?

А если речь идет о том, чтобы писать более-менее прикладной софт, а не системный? Ну вот те же файлы с данными из одного формата в другой преобразовывать.

Проблема все так же в головах и язык C по умолчанию все так же лучший выбор?

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

Те же C++ и Rust могут использоваться для этих же целей практически так же успешно.

Согласен. В конечном итоге цель — качественное и быстрое программное обеспечение. Если отдельно взятая команда разработчиков может выдавать результат на своем любимом языке X, то кто мы такие, чтобы судить их за это.

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

Вы это не серьёзно же? =)))

Как одно с другим соотносится?

Есть такое слово как «абстракция». Слышали? И для различных предметных областей эти самые абстракции и выражение их в коде различны.

Все остальное гораздо удобнее писать на более развитых и безопасных языках.

Ндэ? Ваше утверждение напоминает мне ответ, который я даю когда мне говорят «а можно не курить»? Я отвечаю — «можно, не курите». Но я-то тролль со стажем, а Вы на эту дорожку зря вступили. =)))

Вы можете использовать, можете не использовать.

Ну и, как я понимаю, из экосистемы указанного языка их отковырять, если мне они не нужны в принципе, да? А то в С их нет, как правило. Для контроллеров бывает полезно иметь сухой и не жирный рантайм.

Мало того, что их нужно будет либо написать самому, либо где-то взять. Так еще и работа с ними будет черезжопной. Поскольку у вас нет ни GC, ни RAII.

Я понял! Это Вы так троллить изволите! =))) Есть вещи, которые в приличных местах лучше не упоминать. GC из их числа. Просто потому, что по мнению GC по временам программист является идиотом (в смысле мед. диагноза). И да, а что, RAII это такая религиозная догма, да? Т.е., нет RAII, это грех, харам, куфр и даже нарушение кашрута?

Впрочем, вижу что у Вас в голове даже мысль затеплилась насчёт мира Linux.

Если ограничить себя миром Linux-а, то даже прокатит.

И много кода на D под Windows мне было бы интересно на linux.org.ru пообсуждать?

Корона не жмет?

Ожидаю от Вас отказа от Linux, данного web-сервера (что поделать, они на С) и показа миру и мне своей ОС, веб-сервера на D.

Пока этого нет корона мне впору. Пойдёт, даже к лицу. =)))

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

Для тебя нет, для меня да. С Си можно программировать от и до, не волнуясь насчёт либ и врапперов. И с другими языками сочетается. А питон - на вкус и цвет. По мне, скриптовый язык должен позволять писать и однострочники, и большие программы. Не замусоривать голову и код приведениями типов, и при этом иметь отличный профайлер и инфраструктуру с вылизанным кодом. Перл с этим справляется. Питон - еле-еле. Ну, если кому-то его достаточно - пожалуйста. Мне нужен скриптовый язык с большими возможностями, а не бейсик.

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

По сути...

Если по сути (только не говорите этого ни кому), оно совершенно похрен эмбеддинг это или нет. По своей сути.

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

Moisha_Liberman ★★
()
Ответ на: С + Perl от Deleted

Убойное сочетание.

Согласен. Для получения простреленной ноги Шредингера.

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

Если отдельно взятая команда разработчиков может выдавать результат на своем любимом языке X, то кто мы такие, чтобы судить их за это.

Речь не о том, чтобы судить. А о том, чтобы оценить почему так и во что это обойдется.

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

Возвращаясь к вопросу ТС: лично я у него причин к использованию именно чистого C не увидел.

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

О! Да! Точно!

Один! Ну да... Круто, чё... По сравнению с апачем, лайти, чероки, нджинкс, boa, thttpd. Т.е., под любые задачи и цели. Начиная прямо с уровня кофеварок и выше.

Caddy же, да...

UPD. Маргинальщина же.

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

Да я как бы не против, отличное сочетание. Я использую C с разными скриптовыми языками вполне успешно. И это в общем не редкость.

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

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

Что примечательно, хорошие программисты на плохих языках дали миру отличные библиотеки и средства для решения задач/проблем. А от фанов на форуме одни хелловорды и туча срачей)

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