LINUX.ORG.RU

Я не знаю как писать на «C» ¯\_(ツ)_/¯.

 ,


2

7

Всем привет, ну начну с того что некоторое время назад решил писать своё поделие, ну вроде сервис в основе которого kore.io и в процессе появились потребности, система тестирования, HTML шаблонизатор, обработка utf-8 под мои потребности ну и то-ли NIH синдром то-ли спортивный интерес (не так важно) пишется всё самостоятельно (не без вашей помощи, за что спасибо), но в процессе так же задумался над переносимостью и... ребят я даже немного потерялся.

Порядок байт. Ну начнём с того что например для обработки utf-8 по всем фронтам побитовые сдвиги и чтение отдельных битов, ну вроде ладно чё, в чём проблема, а проблема например в том что порядок байт разный и что мне определять сначала что у меня sparc64 или i386 а потом уже с учётом этого читать байты с конца или с начала?

Атомарность. Ну хорошо 32bit умирает, но мне пофигу если я пишу библиотеку то я хочу что бы она работала везде, ладно у меня может не быть uint64_t и знание того что где то long 64bit, а где то 32bit и я могу смело (да?) писать unsigned long long и быть уверенным что в 64 битной системе это 64 а в 32 битной это тоже 64 но эмулируется через два 32битных инта и вот тут как бы уже нет гарантий что операции записи переменной или чтения отработают.

Вернусь к типам. Мне нравиться что у меня богатый выбор типов на все случаи жизни и конструкции для создания своих типов, а также смешанные типы (union). ладно я могу «впереди планеты всей» и иметь целевую платформу x86_64, а на остальных... ну ломается логика и х** с ними, но что будет когда придёт x86_128, не ржите я серьёзно если я использую (вынужден) в случае utf-8 использовать битовые операции каков вариант что снова придётся что-то менять. Ах да, касаемо тонны zise_t ptrdiff_t u/int8/16/32/64_t fast хераст и прочих что являются typedef от фундаментальных char/short/int/long/long long/ + signed/unsigned, я правильно понимаю что нет никакой разницы пишу ли я uint64_t или unsigned long long int ?

libc Эмм, с89/с99/с11 где то напрямую отказываются от поддержки стандарта msvc не хочет с99 реализовывать в полной мере, тоесть уже нет гарантий, ладно на дворе почти 2018 надо с11, но и тут glibc не имеет <threads.h> а musl имеет, как при этом всём гарантированно быть уверенным что у меня есть гарантия реализации стандарта. Как жить :D И да в случае если на какой либо системе нет <stdint.h> и я намеренно пишу unsigned long long int подразумевая (на данный момент) uint64_t это нормально?

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

Дайте советы если есть желание или почитать что что-бы просвятиться. У меня есть желание писать железный код, но чем больше я закапываюсь во всём этом тем меньше понимания как собственно его писать железно.

Выдыхаю ::) Ну и по традиции cast сишников i-rinat, beastie, ncrmnt, Iron_Bug, peregrine, xpahos, anonymous_incognito, ncrmnt, DELIRIUM.

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

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

Развёрнуто отвечать не стану, но есть что подчеркнуть для себя, спасибо.

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

вот хотелось бы о них банально знать.

Сейчас увидел, что в стандарте есть приложение J «Portability issues». Можно его почитать.

xaizek ★★★★★
()

да забей на этот мертвый язык

на нём только красноглазики пишут, причом самиже не могут прочитать то что напесали

anonymous
()

Эм, а че бы не собрать готовый вариант под 1 платформу, затем собрать под другую попутно ифдефить не совместимость выявленную тестамм, дописывая совместимый код?!

AntonyRF ★★★★
()
Ответ на: комментарий от deep-purple

Нет, намекаю пересесть на любой подходящий для веба язык. Я не поклонник js'а на сервере, да и вообще не люблю его, но для веба его использовать разумнее, чем C.

devalone ★★
()

я правильно понимаю что нет никакой разницы пишу ли я uint64_t или unsigned long long int ?

Неправильно. uint64_t это тип который имеет РОВНО 64 бита, а long long «как минимум» 64 бита. Да, на большинстве реализаций - это один тип, но стандарт не требует и не ставит между ними равенства.

Dudraug ★★★★★
()

проблема например в том что порядок байт разный и что мне определять сначала что у меня sparc64 или i386 а потом уже с учётом этого читать байты с конца или с начала?

Порядок следования байт обычно не должен тебя никак волновать если ты не работаешь с сетью.

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

это она . на английском несколько разных обложек прст.

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

Да. Ибо вместо линакса нужно пилить Redox OS

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

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

ffmpeg, gstreamer, видеоплееры и кодеки к ним тоже поехавшие пишут?

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

Ни один нормальный человек

ну если «нормальный человек» - это интеллектуальное большинство из 95%, то да, нормальный человек вообще софт не пишет

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

Не знаешь как — не пиши.

Сказала учительница младших классов Марь Иванна Вовочке. Так и остался Вовочка безграмотным. А Ирочка сказала маме что хочет другую учительницу, потому что Марь Иванна странная у неё пахнет одеколоном изо рта и они не учат буковки.

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

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

Deleted
()

Порядок байт. Ну начнём с того что например для обработки utf-8 по всем фронтам побитовые сдвиги и чтение отдельных битов, ну вроде ладно чё, в чём проблема, а проблема например в том что порядок байт разный и что мне определять сначала что у меня sparc64 или i386 а потом уже с учётом этого читать байты с конца или с начала?

Мне кажется, или utf8 - байт ориентрованнная фигня, соответственно при записи в файлы, передаче по сети, поядок следования байт не важен?

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

А веб это что-то особенное? Данные туда, данные сюда. GET/POST/websockets/куки/бд/сессии/html/ с чем на стороне сервера возникнут проблемы? ))

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

Мне кажется, или utf8 - байт ориентрованнная фигня

Да

соответственно при записи в файлы, передаче по сети, поядок следования байт не важен?

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

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

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

Павел Дуров, залогиньтесь под своим именем!

Нет.

Deleted
()

Есть freepascal, там все гораздо проще при том что по скорости и потреблению памяти не сильно отличается. Та же компиляция и прочее

Если нужна мощща и поменьше неморроя то вариант

ism ★★★
()
Последнее исправление: ism (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.