LINUX.ORG.RU

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

 ,


0

6

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


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

Был предложен метод, а не production решение ...
Можно не много метод и усовершенствовать, а можно и вообще не использовать.
В вашем конкретном случае можно поступить так:

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

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

Был предложен метод, а не production решение

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

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

Конечно использование notepad++ в целом не является решением, а вот разработка небольшой утилитки подсчитывающей количество «_FM_» и «_FM_ free(» в функциях вроде не должно быть сильно сложным.
Здесь профит в том, что не надо «лезть» в AST и дебри синтаксиса C/C++ /намек: перед началом функциий и окончанием может например использовать псевдо #define _FM_Fun_/.

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

«Серебряный язык программирования» еще ни кто не создал /и похоже не создаст/.

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

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

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

Ни кто не претендовал на «априори», но в этом форуме не принято думать, а норма - ПОВЫПЕДРИВАТЬСЯ.

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

в этом форуме не принято думать, а норма - ПОВЫПЕДРИВАТЬСЯ.

Ты в «этом форуме». Поэтому тебе «не принято думать, а норма - ПОВЫПЕДРИВАТЬСЯ». Как и мне, как и другим.
Или пора отказаться от очередного только что придуманного тобой «метода».

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

«Эх, жаль!» А он так старался, так старался!
С таким рвением выискивал баги в случайном Github-репозитории, ведь опять в интернете кто-то был неправ насчет C. /Вот незадача/.

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

Типичный пост Владимира, который перестал подписываться Владимиром.

Так на этом форуме «остроконечников» много, которым «все нипочем».

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

Я аж не выдержал...

Офигел, чесслово...

Подумайте зачем Microsoft так поступает ...

Это что, троллинг? Эти все _in, _out, это не более чем указатели направления — записывается или читается аргумент, тот же буфер.

В подробностях здесь — https://docs.microsoft.com/en-us/windows/win32/winprog/header-annotations

Я конечно понимаю что на офтопике извращенцы, но не до такой же степени-то!

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

А вот на этом пассаже у меня уже даже матерные буквы кончились. Представляю Вашему вниманию новую — «дабл ять»! Господа... нехорошие, вы как вообще при таких «подходах» умудряете пытаться писать на С? Ну откройте уж для себя https://splint.org/

Это ведь уже даже не смешно.

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

У меня там много мертвых вещей. Нет смысла лезть туда, где последний коммит сделан больше двух-трех лет назад. А то, что я писал 10 лет назад, и самому страшно смотреть! Комментарии на русском, дыры, тонны говнокода... Я даже под МК раньше писал неправильно: под те же STM32 сначала SPL использовал, затем opencm3 вместо того, чтобы не тратить время на дырявые жирные библиотеки, а писать правильно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous
#define _FM_(N)

char* ptrarr[N];
_FM(1)_ ptrarr[0]=malloc(M);
_FM(2)_ ptrarr[1]=malloc(M);
...
_FM(1)_ ptrarr[N-1]=malloc(M);
...
_FM(1)_ _FM(2)_ _FM(3)_ for(i=0; i < N; i++)
   free (ptrarr[i]);
Deleted
()
Ответ на: комментарий от anonymous

Т.е. все ваши суждения правильны?

Я не говорил такого. Я, как и ты, выпендриваюсь в импровизации.

Предложенное мной не является production.

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

anonymous
()
Ответ на: Я аж не выдержал... от Moisha_Liberman

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

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

Ведь сказано было - экспромтом.

Мне понравилось решение, шуточное и довольно остроумное, я даже улыбнулся.
Как аноним анониму, как Владимир Владимиру, ответственно заявляю — одобряю.

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

Да вообще то предложенный подход конечно может быть и ошибочен /запросто/.
Ведь сказано было - экспромтом.
Здесь изюминка в том - «Чем могут быть полезны псевдо #define?».
А они действительно могут помочь в решении некоторых вопросов.
Например использование их в качестве метаданных.
Не нужно зацикливаться только на преложенном их использовании.

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

Заслуживает премии «Костыль недели», как по мне.
Лайк, подписка, колокольчик.


Иннокентий

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

Например использование их в качестве метаданных.

Согласен, напоминает случаи, когда MSVC, и прочие «отстающие» компиляторы получают безобидный, но и абсолютно бесполезный дефайн:

#if !defined(__GNUC__)
#define nonnull
#else
#define nonnull __attribute__((__nonnull__))
#endif

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

Здесь изюминка в том - «Чем могут быть полезны псевдо #define?».
А они действительно могут помочь в решении некоторых вопросов.

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

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

Понимаете...

IRL я не только читаю, пишу или разговариваю на мате, я на нём даже думаю. Здесь я сдерживаюсь. И сильно. Дзен отращиваю и тренирую.

Ведь сказано было - экспромтом.

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

Правда, splint показывает не только несоответствие тех же malloc/free, но и ещё много чего. Умоляю Вас — не траттье время на всякую ху..., ерунду в виде «изобретения экспромтов», возьмите инструмент и научитесь с ним работать. Сэкономите время читателей Ваших «откровений».

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

Пользуюсь с конца 90-х/начала 2000х, брат жив.

Уже писал, но повторю — настроил себе в vim этот самый splint через syntastic. Т.е., в vim сохраняю файл, а эта хрень без компиляции сразу анализирует файл. И в доступной форме показывает мои косяки. Номер строки и резоны, которые splint мне сообщает, чего поправить.

Вот уже который год думаю — ну и как тут можно путаться? У компиля нет вопросов при сборке при -Werror -Wall, -D_FORTIFY_SOURCE=2 и т.д. и т.п. Если что, то автомобильная поговорка о том, что «хороший» стук всегда вылезет, абсолютна справедлива. «Стук» нужно сразу править.

Всё.

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

Не смотрел. Для препроцессора приходится хардкодить «глубину вычислений». Вполне возможно написать для заранее известных коротких тривиальных циклов/рекурсий, но это не тьюринг-полный язык.

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

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

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

#include <stdlib.h>

int ReadFile(void)
{
    return (0);
}

int WriteToRemoteHost(void)
{
    return (0);
}

int DoSomething(void)
{
  int *pointer;
  
  /* Занимаем память под целую переменную */
  if ((pointer = (int *)malloc(sizeof(int))) == NULL)
  {
    return (-1);
  }

  if (ReadFile() < 0)
  {
      /* Не смогли прочитать файл */
      free(pointer);
      return (-1);
  }

  if (WriteToRemoteHost() < 0)
  {
      /* Не смогли отправить данные по сети */
      free(pointer);
      return (-1);
  }

  /* Освобождаем память при успешной отработке */
  free(pointer);

  return (0);
}

Зачем вручную что-то там считать? Захваты и освобождения памяти хорошо проверяет «Валграйнд». В совокупности с ключами компилятора «gcc -pedantic -Wall» и анализатором исходного кода «Си-Пи-Пи-Чек» можно оценить работоспособность кода ещё до создания тестов.

Enthusiast ★★★
()
Ответ на: Понимаете... от Moisha_Liberman

Вы что нибудь знаете об моих разработках и то, что ныне разрабатывается?
Если вам так «теплее» считайте меня и других «неучами».
Больше с вами диалоги вести не буду.

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

Умоляю. Ненадо. А то я боюсь, я Вас всерьёз оскорблять начну.

Вы что нибудь знаете об моих разработках и то, что ныне разрабатывается?
Если вам так «теплее» считайте меня и других «неучами».

Я обращаю внимание на логику и выводы, демонстрируемые оппонентом. Когда метут выше показанную пургу, то это не то чтобы не продакшон, это просто звиздец какой-то... Не устаю, знаете ли, ху... фалломорфировать.

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

Да все правильно!
Слово не дают сказать.
Молчу, молчу, молчу.

Не пора ли открыть новый тред - «Не человеческая замена C для своих задач».

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

Вот не зря частенько предупреждаю - ШУТКА /а в этот раз оплошал/.
«Но все же она вертится!».

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

Подбираемся к любимому числу Metaprog - 1000, когда все
«недорегнутые» не смогут постить /это и обо мне/.

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

А многие ни одного языка программирования не знают - негодяи ... /шутка/.
А хуже всех те кто предал си и перешел на раст ... /здесь просто слов нет от негодования/.

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

И на могиле написал - «Эта собака любила RAII».

anonymous
()
Ответ на: Я аж не выдержал... от Moisha_Liberman

Причём это делает любой линтер, не обязательно secure. Тот же cppcheck.

Устал избивать себе лицо, пока читал тред.

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

Шутка.

Такой код могли создать только неучи.
И эти неучи создали Windows, Visual Studio и «впаривают», что они лучшие.
Мы эту «дрянь» /псевдо #define/ ни когда использовать не будем.
Почему?
Потому, что мы ЛОР-овцы и мы отвергаем всякие грязные трюки ненавистных проприетарщиков.

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

Да. Линтеров масса.

Именно по этой причине я тоже держу руки подале от лица... Сейчас вот утро, а бриться я очкую... =)))

Просто, у меня плюсов мало, поэтому использую типа «освящённый временем» splint, а так-то их море и проприетарных и нет.

Вот КАК?!? КАК они это умудряются не видеть, это тайна покрытая мраком...

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

Да, аттрибут cleanup.

Который не является стандартом С, т.к. это gcc extension. Тут можно долго и нудно... Но мне лень.

Отвечу лучше короткой историей. Начало тут — https://mort.coffee/home/obscure-c-features/

Цитата оттуда:

I once saw a demonstration of Golang's defer statement, and fell in love. It immediately struck me as a much better way to clean up than relying solely on the try/catch stuff we've been used to ever since 1985. Naturally, I wanted to use that for tearing down test cases in Snow, but there's not exactly any obvious way to implement it in C.

Знаете, как-то случайно я увидел ролик, где какой-то актёр (Панин что ли) снашает собаку. Но... нет. Я не снашаю собак. Извините. Для меня это неприемлемо.

К чему этот ответ? А к тому, что всякий сходит с ума по-своему. Ну не осиливает человек освободить ресурсы, так и хорошо — чтобы не свалиться в говно, пусть лучше костыль использует. Подпорку.

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

Шутка.

Модераторов прошу обратить внимание на приверженцев rust, go, ...
Какое право имеют эти «недоумки» с их «недоязыками» кого-то чету-то учить?

Не пора ли их всех забанить?

PS: «Кипит наш разум возмущенный».

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

Угу...

И на его могиле повелел написать goto cleanup_N;

В, дайте угадаю, D этого позорного «goto» нет? =)))

На самом деле, это просто очередной миф, тянущийся года с 1968-го, когда «велийкий Дийкстра» сказал что goto «позорен». На самом деле, это просто вполне простая конструкция, хорошо поддерживаемая процессорами, т.к. там инструкция безусловного перехода есть, без неё сложно слишком. Это тогда не процессор получится, а какой-то питон или раст. =)))

Или теперь всё таки выкинем jmp? Кто сказал? Да Дийкстра же! =)))

Moisha_Liberman ★★
()
Ответ на: Угу... от Moisha_Liberman

Не, потомки всё-равно не будут с восхищением смотреть на 1000 goto cleanup, которые не текут, а вот на один, который течёт, будут смотреть не с восхищением. Впрочем, из Джона Генри сделали героя, так что всякое может быть. Но финалайзеры когда-нибудь стандартизируют.

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

Есть подозрение, что Moisha_Liberman работает с программками объемом в несколько KLOC без внешних зависимостей. Поэтому прогона линтера на всего одном translation unit ему вполне достаточно. При этом он работает над кодом либо в одиночку, либо в совсем небольшом коллективе. Отсюда и возможность держать кучу деталей в одной голове.

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