2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение23.06.2015, 07:18 


11/12/14
893
_Ivana в сообщении #1029781 писал(а):
Пребываю в заблуждении, что синтаксис и система типов вещи ортогональные.


Ну я имел ввиду правила вывода типа из выражения вида "тип". Собственно сабж.

arseniiv в сообщении #1029799 писал(а):
#itscomplicated:


Я бы сказал что это пример того, как начинаясь от простых и естественных вещей:
int a;
int a[10];
int a(int b);

Оно "вдруг" становится сложным если выписывать достаточно навороченную комбинацию.
Но я тут совершенно не вижу проблемы что создатели языка "плохо подумали". Потому что если бы "подумали хорошо", мы бы имели или перегруженность синтаксиса, как то вторая форма записи функций или непривычные записи массивов и функций. Имхо, они нормально думали и вполне понимали что имеют на руках и к чему стремятся.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение23.06.2015, 08:48 
Заслуженный участник


27/04/09
28128
aa_dav в сообщении #1029902 писал(а):
Имхо, они нормально думали и вполне понимали что имеют на руках и к чему стремятся.
Так с этим не спорю. Действительно, как уже и вы, и я (в той теме) упомянули, что дело ещё и во времени и прочем контексте создания. Но хочется же иногда немного больше предвидения amb у людей! :-)

aa_dav в сообщении #1029902 писал(а):
или непривычные записи массивов и функций
Вот с непривычностью записи типа массивов как T[] не соглашусь. Если с функцией ещё туда-сюда, у неё есть тело и типы аргументов есть куда «расформировать», то положение количества элементов и вообще нужда в его указании (ну да, статическая информация — плюс) не так очевидны. :wink:

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение23.06.2015, 10:45 
Заслуженный участник
Аватара пользователя


19/12/10
1546
arseniiv в сообщении #1029918 писал(а):
Вот с непривычностью записи типа массивов как T[] не соглашусь.

Интересно — откуда могла появиться привычка записывать тип массива подобным образом? Если изначально вообще не было привычки указывать типы, а когда такая необходимость была осознана, пришлось приспосабливаться к уже существующему синтаксису либо создавать новый язык.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение24.06.2015, 07:08 


11/12/14
893
whitefox в сообщении #1029940 писал(а):
Если изначально вообще не было привычки указывать типы


Сомневаюсь что было такое, что в С вообще не было типов. Насколько я помню один из его "духовных предков" имел по сути 3 типа - байт, слово и указатель. Несомненно Си начал с этого - примитивных типа было 2 по сути - char и int. Другое дело, что int просто можно было не указывать, он вменялся по умолчанию. Собственно это видно исходя из того что short/long/signed/unsigned - всё это есть модификаторы.
С массивами же интересно еще то, что синтаксис обращения к ячейке пришёл фактически из ассемблера.
До сих пор совершенно легально писать как arr[10] так и 10[arr]

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение24.06.2015, 16:31 
Заслуженный участник
Аватара пользователя


19/12/10
1546
aa_dav в сообщении #1030275 писал(а):
Насколько я помню один из его "духовных предков" имел по сути 3 типа - байт, слово и указатель.

Это Вы про "B"?
Посмотрите Users' Reference to B и A tutorial introduction to the language B
Что-то там не нашёл ни одного объявителя.
Вот ещё одна ссылка на дргой Users' Reference to B и цитата оттуда:
Цитата:
B differs from most languages in that it has no types: no type declarations are needed, and no type conversions are performed. A variable takes on a type (integer, function, vector, etc.) from its context in an expression or statement.
Откуда видно, что типы, конечно же, были, а привычки их объявлять — не было. :-)

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение24.06.2015, 19:32 


11/12/14
893
whitefox в сообщении #1030449 писал(а):
Это Вы про "B"?


Нет.
А собственно в B и кроется ответ. Я действительно не тот язык вспоминал.
В B был один единственный тип "слово". Даже массивы были не типом, а лишь способом разметки памяти.
Это "слово" воспринималось совершенно абстрактно как именно машинное слово и значение в ячейке памяти.
Число это или указатель вменялось не типом, а контекстом применения.
Например индексация массива A[B] просто брало слово из ячейки памяти A, прибавляло к нему слово из ячейки памяти B и полученный результат трактовался как адрес ячейки на которую это выражение ссылается. Очевидно, что от перемены мест "слагаемых" B[A] абсолютно ничего не менялось - более того компилятор и не знал является ли хоть один из операндов на самом деле массивом или нет, ибо всё это "слова" и не более того.
Так вот - это было очень естественно и логично для машины у которой в ячейке и хранится слово (т.е. разрядность слова равна разрядности ячейки памяти).
И одна из весомых причин почему Керниган и Ричи стали разрабатывать C было именно то, что перейдя на архитектуру PDP-11 они обнаружили что B не может в разницу между байтом и словом, типичной для этой (и современных) машин.
Т.е. тип char в С был изначально всё таки.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение24.06.2015, 21:38 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Именно это я и имел ввиду. Изначально у авторов C не было необходимости (а потому и привычки :-) ) объявлять типы. Вот как объявлялись массивы в B:
Код:
name [ constant ] ;
name [ constant ] ival , ival . . . ;

Но с переходом на PDP-11 была осознана необходимость типы, всё таки, объявлять. У них был выбор, либо создавать совершенно новый язык, либо внести необходимые изменения в уже существующий. Был выбран второй путь. И вот как стали объявляться массивы в C:
Код:
int iarray[10];
char carray[10];

Мне совершенно невероятным представляется, чтобы они от привычного в B array[10]; вдруг решили перейти к int[10] array;

Вот, кстати, история создания C от первого лица.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group