LINUX.ORG.RU

Что нужно добавить в C?

 


0

5

Расскажите, что бы вы хотели добавить в си? Только то, что реально можно добавить, не делая при этом новый язык. Просто фичи, которых не хватает.

Или покритикуйте мой список.

  • Константы. #define - препроцессор, const не работает полноценно в compile-time, enum только для целых и вообще для другого .
  • Лямбды (анонимные функции) - для удобства коллбеков. Можно без замыканий, т. к. они много скрывают.
  • Модули, если возможно. Для изоляции единиц трансляции.
  • Интроспекция (typeof, хотя бы) - для обобщенного программирования.
  • Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.
  • Пространства имен, чистые функции, switch по составным типам, case с диапазоном - для сокращения кода.
  • Аналоги volatile и restrict с более точным контролем - для микрооптимизации.
  • Доступ к стеку вызовов, goto между функциями - для трюков типа трамплинов.
  • В стандартной библиотеке - строки, контейнеры, foreach, большие числа. Возможно, сокеты.
★★★★
Ответ на: комментарий от anonymous

это gcc, он не поддерживает интересующие меня платформы

next_time ★★★★★
()

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

anonymoos ★★★★★
()

Константы
const не работает полноценно в compile-time

А Вы знаете, что Сишный static const - это полный эквивалент Плюсового const ?

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

В плюсах const-переменные явно разрешено использовать в константных выражениях, в си такого разрешения нет (хотя может быть в конкретной реализации). А полноценные константы - это скорее плюсовый constexpr.

unsigned ★★★★
() автор топика

Я принимал участие в одном проекте очень интересном проекте.

Существующие решение: на С++, STL, Boost, сервис ориентирования архитектура, cloud хранилище. Одна проблема система больше падает, чем работает. Каждую неделю проблемы, требующие вмешательства программистов, чтобы вернуть систему к жизни.

Архитектор принимает решение переписать проект на Си без сервисов, клаудов и вообще каких либо сторонних библиотек.

Результат: кодовая база уменьшилась в 50 раз, производительность возрасла 3000 раз.

Си для людей умеющий думать. Для тупиц которые читают Страуступа, Саттера и думають, что в их книгах правда написана как надо код писать не понять. Пошишите сначала код 5-7 лет, а потом вернитесь на Си и сравните результат.

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

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

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

А в чём профит языков со строками?

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

у Степанова ( тролля известное высказываение Дейкстры о вреде умения писать на фортранне)

в последних лекциях ( программисткие беседы)

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

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

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

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

С++, STL, Boost, сервис ориентирования архитектура, cloud хранилище. Одна проблема система больше падает, чем работает

Архитектор принимает решение переписать проект на Си без сервисов, клаудов и вообще каких либо сторонних библиотек.

кодовая база уменьшилась в 50 раз, производительность возрасла 3000 раз.

Кул стори, бро.

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

Я принимал участие в одном проекте очень интересном проекте.
без сервисов, клаудов и вообще каких либо сторонних библиотек.
Результат: кодовая база уменьшилась в 50 раз, производительность возрасла 3000 раз.

мы потом его после вас переписывали на ассемблере - бинарник стал меньше в 100 раз, при том не использовали никаких этих ваших жирных libc, производительность выросла в 100500 раз

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

мы потом его после вас переписывали на ассемблере - бинарник стал меньше в 100 раз, при том не использовали никаких этих ваших жирных libc, производительность выросла в 100500 раз

А, так это тот самый проект? Мы его переписали еще раз, всё на самомодифицирующемся машкоде. Он теперь выдает результаты еще до запуска и не занимает места в памяти.

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

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

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

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

Ты бредишь?

Как раз в системах с GC локальность намного лучше чем при ручной суходрочке памяти. Во первых, young generation обычно не более 64k, там все локально, во вторых, из young потом все переносится еще и с компактификацией, в третьих, бывает еще и третье поколение и компактификация второго поколения в рантайме.

А вот как ты прозрачно добьешься динамически поддерживаемой локальности в среде без GC?!?

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

сборка мусора это замечательный инструмент когда используется по необходимости ибо решаемая проблема иначе нерешаема (т.е решаема либо использованием штатного сборщика или реализацией своего «лиспа» подобно 10му правилу).

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

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

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

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

зависит от задачи.

однако когда мы напрямую молотим байты из линейного пространства памяти , то это уже дело MMU насколько это реально или это memory maped file

т.е достаточно понимать , что происходит.

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

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

Использовать старый и добрый, как ультранасилие, «data oriented programming», например?

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

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

И конечно же алгоритмы сборки мусора более интеллектуальны. Компиляторы вынуждены довольствоваться статической скудной информацией, а для GC и для JIT вся актуальная динамика доступна.

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

Поддерживаю -«плохо же». Ваши ошибки кодирования вылезут не во время компиляции, а в рантайме - вот что плохо.

void_ptr ★★★★
()

Вот бы список ещё бы по категориям разбросать: синтаксичекий сахар (case 1..5); расширения языка; расширения стандартной библиотеки (goto между функциями - setcontext) и более спорные: доработки языка; «поломать язык».

gag ★★★★★
()

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

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

Только в манямирке борщехлеба

anonymous
()

1. Вложенные функции, как в Паскале. Хотя в GCC они уже есть, но в стандарт пока не входят.

2. Контейнеры в стандартную библиотеку, согласен. Хотя бы списки и словари.

3. Улучшить поддержку Unicode, чтобы явно можно было записывать текст на UTF-8, UTF-16 и UTF-32, а то с L - полное безобразие, размер может быть каким угодно. Нужно в дополнение к просто L добавить L32, L16 и L8.

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

Си идеален

Модулей не хватает, header-файлы - УГ. Макропроцессор можно было бы сделать получше, что-нибудь на основе Лиспа. Но сейчас уже поздно менять.

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

для этого есть C c шаблонами - берёш С++ и используеш как С и его шаблоны ( ну и пространства имён)

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

в С++ вроде есть «опции активирующиеся при завершении функции ака деструкторы автоматических обьектов» ....

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

Нужно в дополнение к просто L добавить L32, L16 и L8.

Поправка: L32BE, L32LE (ещё 2 не будем рассматривать), L16BE и L16LE. Только что ты этим решишь? И да, кодировок «UTF-16» и «UTF-32» не существует.

Это не отменяет ненужности wchar, но твой вариант — не решение.

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

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

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

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

ты смешиваеш наличие общепринятого формата линковки ставшего стандартом де факто и наличие самоописывающегося протокола (мечта Кея и прочих фонтастов) который путём короткого хэндшейка между комутантами и обмена ими друг другом карт-мира устанавливают протокол текущей сесии - а имеено это и есть динамическое связывание рельне , а не какое то следование отлитому в граните АПИ.

эээ... а поцчему энто ты считаешь «самоописывающися протокол мечтой Кея и прочих фонтастов» ?

вот ты лекцию его читал, «контуперная рейволюция исчо не и не начиналась как следует» (транскрипт) ?

там он приводит такой пример:

So here's a couple of knocks on the head I had over the years. I just want to tell them to you quickly. This one I think you'll find interesting because it is the earliest known form of what we call data abstraction. I was in the Air Force in 1961, and I saw it in 1961, and it probably goes back one year before. Back then, they really didn't have operating systems. Air training command had to send tapes of many kinds of records around from Air Force base to Air Force base. There was a question on how can you deal with all of these things that used to be card images, because tape had come in, [there] were starting to be more and more complicated formats, and somebody—almost certainly an enlisted man, because officers didn't program back then—came up with the following idea. This person said, on the third part of the record on this tape we'll put all of the records of this particular type. On the second part—the middle part—we'll put all of the procedures that know how to deal with the formats on this third part of the tape. In the first part we'll put pointers into the procedures, and in fact, let's make the first ten or so pointers standard, like reading and writing fields, and trying to print; let's have a standard vocabulary for the first ten of these, and then we can have idiosyncratic ones later on. All you had to do [to] read a tape back in 1961, was to read the front part of a record—one of these big records—into core storage, and start jumping indirect through the pointers, and the procedures were there.

I really would like you to contrast that with what you have to do with HTML on the Internet. Think about it. HTML on the Internet has gone back to the dark ages because it presupposes that there should be a browser that should understand its formats. This has to be one of the worst ideas since MS-DOS. [Laughter] This is really a shame. It's maybe what happens when physicists decide to play with computers, I'm not sure. [Laughter] In fact, we can see what's happend to the Internet now, is that it is gradually getting—There are two wars going on. There's a set of browser wars which are 100 percent irrelevant. They're basically an attempt, either at demonstrating a non-understanding of how to build complex systems, or an even cruder attempt simply to gather territory. I suspect Microsoft is in the latter camp here. You don't need a browser, if you followed what this Staff Sergeant in the Air Force knew how to do in 1961. You just read it in. It should travel with all the things that it needs, and you don't need anything more complex than something like X Windows. Hopefully better. But basically, you want to be able to distribute all of the knowledge of all the things that are there, and in fact, the Internet is starting to move in that direction as people discover ever more complex HTML formats, ever more intractable. This is one of these mistakes that has been recapitulated every generation. It's just simply not the way to do it.

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

опять же, есть такая тема, как программно-задаваемое радио (SDR)

опять же, есть такая тема, как ООСУБД, например GOODS на MOP на C++, через костыли макросами для рефлексии. можно только гадать, как эта штука упростилась бы, если бы взять язык, где рефлексия и интроспекция нативная, «из коробки» — или, например, объектная система COS, CLOS для C (с мультиметодами, метаклассами, комбинаторами методов, МОП).

опять же, Алан Кей по натуре биоинформатик — он взял просто идею биологической клетки, которая масштабируется черезвычайно хорошо, и переложил её на компьютёры, получились объекты (подробнее об этом в лекции)

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

я к тому, что эти «фантазии» в природе-то вполне себе работают (гено информация и иммунитет, митохондриальное что-то там, и т.п.)

почему бы этим фантазиям (или, видЕнию) — не работать в искусственной системе, вместо того чтобы лепить костыль на костыль чудеса enterprisely?

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

Самый лучший вариант рефлексии был в Delphi - там была секция published у классов. Если надо динамическое изменение как в Smalltalk/Objective-C - делаем рефлексию, если не надо - не делаем и не расходуем зря память.

Den_Zurin
()
Ответ на: комментарий от no-such-file

Вообще моя претензия к модулям как в паскале или яве в том, что они не переносимы в том смысле, что формируют вместе с языком некоторую закрытую платформу, язык+модули.

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

вообще Н. Вирт в «так получилось» пишет, что идея про модули была стянута ещё с Алгола (то есть, одна и та же идея АДТ, типа данных, модуля и класса обыгрывалась три раза как три различных реализации).

Gillad Bracha в newspeak пилит свой тёплый ламповый смоллток, в котором модуль — это объект, и объекты разных «систем» живут в разных мирах. а объекты умеют в рефлексию и интроспекцию и метаклассы.

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

с одной стороны, в этой унифицированности есть смысл: в линкере же есть linker scripts, который говорит тебе, как собирать конкретные секции в бинарник исполняемый. то есть, что-то подобное нужно и для систем: описать, как собирать модули в бинарник.

разделение ролей: есть модули и есть «физические пакеты», как в UML диаграмме развёртывания. и одно отображается на другое, но не совсем 1:1

вообще, модули не обязаны организовывать «закрытую систему» (и свой велосипедистый линкер «внутри системы», как в том же BBCP). например, в kencc библиотеки были через #pragma lib «modulename», и в .o появлялась секция про модули, которую «умный линкер» мог понимать и использовать (ЕМПИП, в go сейчас что-то похожее с дополнительной секцией в ELF).

другое дело, что нужен «умный линкер», работающий не только с секциями и скриптами, а и с модулями и зависимостями модулей, и с fingerprints/контрольными суммами модулей (например, как в обероне — для корректных версий модулей).

то есть, тезис в том, что «статический линкер» ld и динамический ld.so довольно тупые, но для Си это нормально, и эта тупизна не существенна.

для таких вещей как в обероне (выгрузить,загрузить, перегрузить новый, обойти по рефлексии метаданные модуля, типы, сгенерировать новый образ системы) — существенно, и поэтому велосипедят свой линкер.

хотя лучше бы вместо «линкера модулем внутри системы» сделали нормальную реализацию на базе того же LLVM, добавили в llvm линкер поддержку своих фич, например.

то есть, вместо того чтобы велосипедить «генератор образа системы» в BBCP, например, лучше бы выставили наружу API и дёргали тот же ненаписанный ещё «умный линкер» LLVM (а система на каком-нибудь D тожё дёргала бы это API линкера, и получилась бы системка, у которой два рантайма (оберон и Ди), но модули в унифицированном виде : нейтральном от рантайма, в API общего модульного линкера, где часть модулей на Ди, часть на обероне, например).

то есть, этот «модульный линкер» интересен в основном только метаданными, интерфейсами, стандартизацией формата модулей под ООП/компонетное ООП модулей особенности. а не тем, «внутри системы» он реализован или снаружи.

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

то есть, тезис в том, что «статический линкер» ld и динамический ld.so довольно тупые, но для Си это нормально, и эта тупизна не существенна.

Их тупизна нормальна не для Си, а вообще, т.к. они работают не для Си, а вообще. Без привязки к какому либо языку.

для таких вещей как в обероне

Получится система закрытая на Оберон. Т.е. если ОС в целом писать на Обероне и этим ограничиться, то всё ОК. Но если вы захотите прикрутить к этой системе Яву, или там, Хаскель, то модульный линкер Оберона вам ничем не поможет, т.к. там модули совсем другие и все они друг с другом никак не совметимы. В итоге те же яйца - вид сбоку.

лучше бы выставили наружу API и дёргали тот же ненаписанный ещё «умный линкер» LLVM (а система на каком-нибудь D тожё дёргала бы это API линкера, и получилась бы системка, у которой два рантайма (оберон и Ди), но модули в унифицированном виде

Если бы, да кабы... Но и при этом остается проблема переносимости на другие системы, где такого умного линкера нет - мой аргумент о неприменимости идеи модулей для Си, как кроссплатформенного метаассемблера, это никак не отменяет.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от SDSWanderer

нафига ошибку возвращать?

Предложи другое решение для языка, в котором нет исключений.

tailgunner ★★★★★
()

Что нужно добавить в C?

добавить нужно ++, и этого хватит

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