LINUX.ORG.RU

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

 


0

5

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

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

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

не делая при этом новый язык

Кхм, а где проходит граница, когда можно сказать что это уже новый язык?

ozkriff ★
()

Лямбды да, неплохо бы, но, подозреваю, без возможности обобщенного программирования не очень полезны. Хорошо бы стандартизировать расширения GNU C - там есть и typeof, и блоки кода как выражения, и форма RAII.

Из того, чего в Си вообще нет, мне больше всего не хватает какой-нибудь формы дженериков. И еще хочу возврат нескольких значений из функции :)

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

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

У тебя получился сильно ограниченный и недоделанный хаскелль.

ovk48 ★★★
()

Конструкторы и деструкторы для структур.

crowbar ★
()

Ненужно.

Бери более подходящий язык для своих задач, а Си оставь для байто-дрочерства — он в этой нише очень хорош.

anonymous
()

constexpr и namespace

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

И еще хочу возврат нескольких значений из функции :)

для value-type, структуры - самое то

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

Не проще ли выкинуть си и юзать какой-нибудь go?

Если можно выкинуть си - надо без сомнений выкидывать ) Но не всегда же можно.

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

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

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

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

Из того, чего в Си вообще нет, мне больше всего не хватает какой-нибудь формы дженериков. И еще хочу возврат нескольких значений из функции :)

Это будет уже не Си, а какой-нибудь go.

cx ★★
()
  • Пространства имён
  • Синтаксический сахар примерно как в Lua для вызова методов структуры.
  • Батарейки в стандартной библиотеке
  • Строгая типизация
PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от ozkriff

Четко не скажешь, а так - язык существенно не усложняется, рантайм не утяжеляется. В случае си - сохраняется прозрачность и предсказуемость (где есть).

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

Из того, чего в Си вообще нет, мне больше всего не хватает какой-нибудь формы дженериков. И еще хочу возврат нескольких значений из функции :)

Это будет уже не Си, а какой-нибудь go.

Go точно не будет - в этом быдлоязычке нет дженериков.

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

А зачем?

Уговорить комитет^W^WПомечтать )

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

Всего лишь адекватен.

Альтернативы?

Отсутствие альтернатив не делает Си ни на йоту лучше.

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

мне больше всего не хватает какой-нибудь формы дженериков

#define acos(X) _Generic((X), \
    long double complex: cacosl, \
    double complex: cacos, \
    float complex: cacosf, \
    long double: acosl, \
    float: acosf, \
    default: acos \
    )(X)

В С11 есть, правда писать неудобно.

Хотя что-то вру, это скорее перегруженные функции, чем дженерики. Но называется generic, да.

возврат нескольких значений из функции

Можно возвращать структуру.

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

А зачем несколько значений из функции возвращать? Что бы ошибку вернуть?

В основном да, но еще и для того, чтобы не делать структуру с 2-3 полями просто для возврата результатов.

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

блоки кода как выражения

возврат нескольких значений из функции

Вот да, этого тоже не хватало, забыл.

форма RAII

А это не уверен что уместно - в си же не признают автоматику.

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

_Generic в C11 - и сам по себе говно, и не заменяет typeof. Возвращать структуру можно, но неудобно.

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

форма RAII

А это не уверен что уместно

Это уже сделано.

в си же не признают автоматику.

«Патамушта идиоты» (ц)

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

У тебя получился сильно ограниченный и недоделанный хаскелль.

Не вижу ничего общего.

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

Мне больше нравится подход ржавчины (ну и хаскеля и т.п.), когда результат оборачивается в Option или Result

http://static.rust-lang.org/doc/master/std/option/enum.Option.html http://static.rust-lang.org/doc/master/std/result/enum.Result.html

А «структура с 2-3 полями просто для возврата результатов» обычно плохой звоночек о том, что ты делаешь чего-то странное, как мне кажется.

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

Если тебе нужен PL/1, ты знаешь, где его взять©

«Люди, которые не знают PL/I и поминают не к месту, очень раздражают нас - тех, кто знает PL/I» почти (ц)

tailgunner ★★★★★
()

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

PolarFox ★★★★★
()

А не проще ли сразу взять плюсы и пользоваться большинством этих фич?...

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

Мне больше нравится подход ржавчины (ну и хаскеля и т.п.), когда результат оборачивается в Option или Result

А вот это будет и правда другой язык.

А «структура с 2-3 полями просто для возврата результатов» обычно плохой звоночек о том, что ты делаешь чего-то странное, как мне кажется.

ЕМНИП, в том Rust есть такое:

fn foo() -> (bar, bazz);

А еще Python, Go, и даже Си++ (tuple и tie). Так что... плохим или странным это кажется только тем, кто этим не пользовался. Тем, кто пользовался, плохим кажется наличие более 3-х полей в кортеже %)

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

Да не похоже, что их в ближайшие пару лет добавят как-то.

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

ozkriff ★
()

у тебя каша :(

вот тут http://doc.cat-v.org/bell_labs/new_c_compilers/ здравый тюнинг который частью вошёл в современный стандарты , однако в части выкидывание был отвергнут ибо «обратная совместимость» повеливает.

в С нужно добать :

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

анонимные функции литералы ( для того же qsort :) ) - кста это вроде же уже в пендюрили в с11-с14 али не?.

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

http://funcall.blogspot.ru/2011/02/no-stack-no-problem.html

кста туториал от (автора патента на стек и стековый парсинг составных выражений) Бауэр Ф.Л., Гооз Г. - Информатика. Вводный курс (в 2-х томах)

про goto промеж функций - у тебя уже есть (long|set)jump к стеку тоже можно культурно лазить через уже существующие «переносимые» наборы макросов.

чистые функции можеш прикруть пропатчив lintподобный анализатор.

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

А вот это будет и правда другой язык.

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

fn foo() -> (bar, bazz);

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

Функция, возвращающая 2 сущности, это по определению должно настораживать. Может я и не прав, можешь показать пример близкий к реальности?

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

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

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

Какой авторитетный аналитик.

Заявление вида «интерфейсы в Go - это такой вид дженериков» не заслуживают ответа уровнем выше, чем «бугага».

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

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

Что плохого или неуместного в быстрохаке?

можешь показать пример близкий к реальности?

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

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

Это к тому, что фичи несколько сомнительны

Сомнительны кому? Я действующий программист на Си и я хочу как минимум половину этих фич.

Трогать ради них устоявшийся язык немного неразумно.

Некоторые из этих фич уже есть в GNU C, другие не затрагивают язык (препроцессор), третьи уже реализованы в десятке языков.

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

Сомнительны кому? Я действующий программист на Си и я хочу как минимум половину этих фич.

Некоторые из фич уже есть в драфте нового стандарта C++. Если так надо, то почему не он?


Некоторые из этих фич уже есть в GNU C

Но в стандарте их нет. Не GNU C мир един.

третьи уже реализованы в десятке языков

Ну так не проще использовать их? Обратную совместимость ряд фич сломают, насколько я понял.

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

Мне тоже нравится rust и я на него надеюсь. Но там сильно другие подходы, и он сложнее. Так, я сходу не врубился в его управление памятью (а копаться времени не было).

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

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

Где это есть в адекватном виде кроме CL?

P.S. Структура с полями как возвращаемое значение - не то

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

Строгая типизация

Потребует переработки системы типов -> фактически, другой язык. Разве что _более_ строгая, но я предполагал сохранить совместимость.

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