?

Log in

когда надоело подчеркивание (программистское) - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

когда надоело подчеркивание (программистское) [ноя. 4, 2011|02:54 am]
Anatoly Vorobey
(эта запись будет интересна лишь программистам, знающим C)

gaal обратил мое внимание на потрясающую особенность C-кода, на котором написаны части языка Go (например, рантайм-поддержка). Кто пишет Go, нужды объяснять нет, думаю.

Вот, например:
int32
runtime·funcline(Func *f, uintptr targetpc)
{

или:

        if(debug && !runtime·panicking)
                runtime·printf("funcline start pc=%p targetpc=%p line=%d tab=%p+%d\n",
                        pc, targetpc, line, p, (int32)f->pcln.len);
        for(;;) {

Вот что вот это такое, это "runtime·printf", например? Да-да, вы правильно углядели, в середине там не ASCII-символ. Это юникодный символ U+00B7 MIDDLE DOT, если что.

Это не какая-то специальная нестандартная директива или ключевое слово. Это просто часть идентификатора, который, оказывается, в наше время в C (в C, заметьте! Не в каком-нибудь там C++!) может быть юникодным. В стандарте C99 есть приложение D, которое описывает полный набор законных юникодных символов в идентификаторах. Этот набор включает в себя U+00B7 MIDDLE DOT, а также много других полезных символов и целых алфавитов; и русский алфавит, и ивритский, например, целиком туда уместились.

Вот живешь так, живешь, а тут оказывается официально можно русские имена переменным в C давать. Уже 10 лет причем. А я бы и не знал, если бы не авторы языка Go, которым, видимо, ну очень надоело нижнее подчеркивание.
СсылкаОтветить

Comments:
[User Picture]From: alta_voce
2011-11-04 01:02 am
Хмм, мне кажется, я это давно знала.
(Ответить) (Thread)
[User Picture]From: niobium0
2011-11-04 01:26 am

круто! :)

#define цел int
#define коль if
#define доколь while
#define уменябудетсвойсипласплассблекджекомишлюхами 1
(Ответить) (Thread)
[User Picture]From: meshko
2011-11-04 01:49 am

Re: круто! :)

Ну, был же Русский Алгоритмический Язык. Начать Созидание, Кончить Созидание.
(Ответить) (Parent) (Thread)
[User Picture]From: spamsink
2011-11-04 01:27 am
Осторожно, ящик Пандоры открывается...
(Ответить) (Thread)
[User Picture]From: meshko
2011-11-04 01:50 am

+1

Голосую за немедленное удаление поста.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: ygam
2011-11-04 02:28 am
В Джаве и Сишарпе это уже давно.
(Ответить) (Thread)
[User Picture]From: eldarm
2011-11-04 02:36 am
К сожалению, использование нестандартных символов - это такая задница... Надо сохрянать в UTF-8, и прочее. Поэтому, увы, пока все это всерьез не работает. Поскольку серьезный програмиист готов при необходимости ("фикс это дерьмо поскольку мы теряем пользвателей на миллион баксов в десять минут!!!") программу чем угодно править, хоть vim'ом, а что угодно unicode еще не поддерживает.
(Ответить) (Parent) (Thread) (Развернуть)
From: zhengxi
2011-11-04 02:52 am
Обратил внимание на юникодные символы, то даже не подумал, что это есть в стандарте.

Те C и ASM файлы в исходниках Go, где применяются идентификаторы с unicode, компиляются не gcc, а их собственным компилятором C (8c,6c,5c) и ассемблером, которые все из себя нестандартые.
(Ответить) (Thread)
[User Picture]From: msh
2011-11-04 03:42 am
А U+1F4A9 использовать можно? Мне бы пригодился.
(Ответить) (Thread)
[User Picture]From: mff
2011-11-04 07:33 am
LOL
(Ответить) (Parent) (Thread)
[User Picture]From: vitaly_il
2011-11-04 05:04 am
совсем уже хотел было прокомментировать "нету их и все разрешено", но потом прочитал след. абзац про то что этому стандарту уже 10 лет :-)
интересно, не знал.
(Ответить) (Thread)
[User Picture]From: toothedgoo
2011-11-04 06:13 am
Отвратительно же. Столь же отвратительно, как и 1 и l, отличающиеся одним пикселом.
(Ответить) (Thread)
[User Picture]From: eisenberg
2011-11-04 09:25 am
Как c и с, не отличающиеся вообще ни одним.
(Ответить) (Parent) (Thread)
[User Picture]From: greena
2011-11-04 07:01 am
Все, окончательно перевожу себя в разряд динозавров.
(Ответить) (Thread)
[User Picture]From: beldmit
2011-11-04 07:52 am
Куда катится этот мир.

Я до сих пор стараюсь файлы по-русски не называть, а тут ТАКОЕ!
(Ответить) (Thread)
[User Picture]From: bolk
2011-11-04 09:59 am
Почему нет?
(Ответить) (Parent) (Thread)
[User Picture]From: egorfine
2011-11-04 09:13 am
Ну и в самом деле - как такой код править vim'ом? Как прогонять через ctags? Оно может и поддерживается, но какой практический смысл?...
(Ответить) (Thread)
From: triampurum
2011-11-04 09:23 am
http://vimdoc.sourceforge.net/htmldoc/digraph.html
практический смысл: меньше места визуально на экране занимает, чем подчеркивание, выглядит чище.
(Ответить) (Parent) (Thread)
From: triampurum
2011-11-04 09:32 am
вообще, если вспомнить, что эти люди придумали юникод, их любовь к юникодным символам становится более понятной :)
(Ответить) (Thread)
[User Picture]From: bolk
2011-11-04 09:59 am
Почему «язык С»? С чем? «Си» же. И кроме нижнего подчёркивания какое ещё бывает? Среднее? Верхнее?
(Ответить) (Thread)
From: omened_drunkard
2011-11-04 08:30 pm
«Язык С», конечно, идиотизм :-)
Но вот знак называется нижним подчеркиванием, по-другому люди путают и переспрашивают. Почему он так называется, писал Лебедев, но это и не важно. Вам ведь не мешает отсутствие «Мертвого журнала» называть этот сайт «Живым журналом», например.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: auto194419
2011-11-04 11:01 am
не совсем в тему - а не в курсе случайно, когда эти неприятные люди сделают go app engine sdk for windows?! для питона он давно есть, а для go - сосаети, как говорил один мой знакомый.
(Ответить) (Thread)
From: master_frenzy
2011-11-04 05:04 pm
Не раньше чем появится Go версии 1.
(Ответить) (Parent) (Thread)
[User Picture]From: tat_ti
2011-11-04 04:57 pm
Угу, яблочко юникодное, с которого началось грехопадение.
Сначала _ на точку_которая_не_точка заменят, а в конце рыдаем над:
Сообщить("Здравствуй, Мир!");

Пример функции, возвращающей квадрат числа:

Функция КвадратЧисла(прЧисло)
Возврат прЧисло * прЧисло;
КонецФункции

Упаси господь от такого.
Мы уж лучше в интернациональных проектах по-старинке, на какбыанглийском.
(Ответить) (Thread)
[User Picture]From: softmaster
2011-11-04 07:38 pm
... дай людям язык, чтобы можно называть всё по-русски -- и они с удовольствием станут называть всё по-русски, например, типичными русскими словами обСпрВыгр и обСпрЗагр.
(Ответить) (Thread)
[User Picture]From: rezdm
2011-11-05 01:50 pm
Довелось в институте какие-то лабы писать на Смоллтолке на русском языке.
Объект, цикл, пока, до.

Вроде ещё в 1С встроенный язык по-рюсски программируется.

Адъ!
(Ответить) (Thread)
[User Picture]From: migmit
2011-11-05 02:58 pm
Может, не надо этого? Чем меньше в программе символов, отсутствующих на клавиатуре, тем лучше.
(Ответить) (Thread)
From: (Anonymous)
2011-11-06 05:18 am
Ни фига подобного, нельзя. Стандарт говорит:

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit

identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters

nondigit: one of
    _ a b c ... z A B C ... Z
digit: one of
    0 1 2 3 4 5 6 7 8 9

universal-character-name:
    \u hex-quad
    \U hex-quad hex-quad
hex-quad:
    hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit

Так что средние точки эти — other implementation-defined characters, а кто хочет переносимо, должен писать \u00B7. Что не способствует.
(Ответить) (Thread)
[User Picture]From: janatem
2011-11-08 12:06 pm
Кстати, да. Мне не удалось заставить gcc схавать юникодный идентификатор. То, что называется universal characters, засунуть в текст можно, но только в виде \u<номер>. И то, если включить -fextended-identifiers.

То есть можно написать
int runtime\u00b7f();

но что в этом полезного?
(Ответить) (Thread)
[User Picture]From: avva
2011-11-08 12:12 pm
Как же компилируется этот код, имплементирующий Go, не хотите проверить?
(Ответить) (Parent) (Thread) (Развернуть)