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 ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.