|
(Не)доработки языков программирования, которые хотели ли бы вы |
|
|
|
Feb 22 2010, 12:13
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Почему не делают в ЯВУ возврат из функций несколько переменных? Вроде бы несложно было бы объявить функцию типо так: (int,int,char) funcname(char); а потом аналогично использовать при вызове: (a,b,c) = funcname('A'); причём даже в некоторых местах так: (,,e) = funcname('A'); таким образом не используя часть переменных/регистров То есть по сути ситуация аналогичная передаче параметров через регистры, когда (ну например в АРМ) первые 3 параметра передаются в регистрах. И возврат результата по логике строго аналогичен процессу передачи параметров, только не "в", а "из". Обычно возврат нескольких параметров делают через передачу ссылок, что в некоторой степени универсальнее, т.к. можно часть ссылок не использовать в зависимости от "нити" алгоритма. Однако, такой способ требует выделение места в стеке или в другой раме под ссылочные переменные. Что на современном уровне компиляторостроения не есть гуд. Хранение и передача (возврат) переменных в регистрах - предпочтительнее.
Сообщение отредактировал Omen_13 - Feb 22 2010, 14:14
Причина редактирования: Тема переименованна по просьбе автора
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
 |
Ответов
|
Jan 28 2012, 13:44
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(GetSmart @ Jan 28 2012, 09:29)  Ещё недоработку обнаружил. Volatile.
Этот квалификатор действует глобально на всю прогу и заставляет компилятор не оптимизировать переменную. Используется обычно тогда, когда в разных тредах, равно как и в программе+прерывании используется переменная. Но. Когда в программе юзается эта переменная, то она конечно может измениться и оптимизировать её не надо. Но когда в прерывании она юзается, то там было бы оптимальным снимать этот квалификатор. Но вроде бы это не предусмотрено. (?) А если обработчики прерываний вынести в отдельный файл, там объявить необходимую переменную int val, а в другие файлы добавить эту переменную как extern volatile int val? В результате обработчики прерываний будут работать с оптимизированной переменной, а вся остальная прога - с volatile.
|
|
|
|
|
Jan 28 2012, 14:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (sonycman @ Jan 28 2012, 15:44)  А если обработчики прерываний вынести в отдельный файл, Как-то слишком сложно. _Pasha правильно предложил - завести временную переменную (только не указатель, на Пашин пример будет справедливо ругаться, ибо указатель должен быть на volatile), когда надо считывать в эту переменную, проводить с ней вычисления и когда надо записывать обратно в volatile-переменную. Лишь только программист в состоянии определить, когда наступает этот момент " когда надо". Ни один компилятор угадать его не сможет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 29 2012, 02:42
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Jan 28 2012, 19:37)  Лишь только программист в состоянии определить, когда наступает этот момент "когда надо". Ни один компилятор угадать его не сможет. Это почему? Внутри прерывания переменную можно оптимизировать как угодно. Не важно, вложенное оно или нет и есть ли другие прерывания c таким же или меньшим приоритетом, юзающие эту переменную. В идеале лучше задавать (отменять volatile) каким-то квалификатором внутри какой-то зоны видимости, будь то обработчик или {}. Вручную копировать volatile в простую переменную, которую потом юзать не есть хорошо. Т.к. переменная volatile, то она сразу будет скопирована куда-то и отнимать место там (рег/рама). В конце обработчика та же беда. С указателем (вариант Паши) чем-то лучше, чем-то хуже. Как именно, зависит от компилятора по части разных методов оптимизации указателей и значений переменных. Указатель придётся грубо приводить к обычной переменной, но и фиг с ним. ================================= Ещё одну недоработку родил. Хотя, может есть вариант прямого обхода, а не через переменную. Когда в выражении юзаются две или более volatile, то компилер выдаёт варнинг, что "доступ к volatile не определён (не обозначен?) в выражении". Не очень понятно, как он расчитывает чтобы я его обозначил. Но можно было бы например задать скобками. Бувквально так ggg = abc + (volvar1) + volvar2; Тогда уровень вложенности скобок для volatile будет задавать приоритет доступа. Чем больше скобок, тем раньше доступ. При равном количестве - варнинг, означающий что реализация вычисления на откуп компилятора. У меня такая ситуация происходит при сравнении (вне прерывания) volatile переменной временнОй метки и значения таймера, когда прерывание может изменить значение этой временнОй метки. При этом обязательно временнУю метку нужно прочитать раньше значения таймера, если произойдёт наоборот, то временнАя метка может "обогнать" значение из таймера, что вери вери бэд. Щас сделано через врЕменную переменную. Но из-за этого компилятор её суёт в стек (ИАР MCS-51). Upd. Хотя вот тут щас уже не суёт, но это не принципиально.
Сообщение отредактировал GetSmart - Jan 29 2012, 08:37
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
GetSmart (Не)доработки языков программирования Feb 22 2010, 12:13 DpInRock Оккам не одобряет. Feb 22 2010, 12:25 Моисей Самуилович Цитата(DpInRock @ Feb 22 2010, 15:25) Окк... May 22 2018, 18:19 Leka Для софт-процессора с 1К "регистров" у м... Feb 22 2010, 12:56 CaPpuCcino ну, всё зависит от того, о каких ЯВУ вы говорите. ... Feb 22 2010, 13:25 GetSmart Да, я говорю о Си к примеру. Паскаль аналогично. Д... Feb 22 2010, 13:46 CaPpuCcino Цитата(GetSmart @ Feb 22 2010, 16:46) Ста... Feb 22 2010, 14:40 Dog Pawlowa Цитата(GetSmart @ Feb 22 2010, 16:13) Поч... Feb 22 2010, 14:45 zltigo Цитата(GetSmart @ Feb 22 2010, 15:13) Одн... Feb 22 2010, 14:45 GetSmart Цитата(zltigo @ Feb 22 2010, 19:45) .. то... Feb 22 2010, 15:02  CaPpuCcino Цитата(GetSmart @ Feb 22 2010, 18:02) Why... Feb 22 2010, 15:28  zltigo Цитата(GetSmart @ Feb 22 2010, 18:02) Это... Feb 22 2010, 16:48   GetSmart Цитата(zltigo @ Feb 22 2010, 21:48) 1. Ес... Feb 22 2010, 17:47    zltigo Цитата(GetSmart @ Feb 22 2010, 20:47) Ещё... Feb 22 2010, 18:46     ReAl Цитата(zltigo @ Feb 22 2010, 20:46) А уро... Feb 22 2010, 22:37 Leka "...доработки языков программирования, которы... Feb 22 2010, 15:37 SasaVitebsk Честно говоря, тоже не понимаю зачем это надо. Как... Feb 22 2010, 20:12 sasamy Цитата(SasaVitebsk @ Feb 23 2010, 00:12) ... Jan 28 2012, 21:27 iiv Цитата(SasaVitebsk @ Feb 23 2010, 01:12) ... Apr 29 2017, 15:19  Эдди Цитата(iiv @ Apr 29 2017, 18:19) в GNU-C ... May 4 2017, 05:20   ar__systems Цитата(Эдди @ May 4 2017, 00:20) В gcc5 э... May 4 2017, 11:40 Xenia Отчего бы не помечтать
Тогда я и свою мечто озвуч... Feb 22 2010, 21:02 vmp Цитата(GetSmart @ Feb 22 2010, 15:13) Поч... Feb 24 2010, 06:38 _Pasha Я бы хотел, чтоб в сях(да и паскале тоже) наконец-... Feb 24 2010, 07:22 sigmaN Сэр, по-моему у вас возникают дурные мысли по прич... Feb 24 2010, 07:32 _Pasha В принципе, было бы на 100% эффективным введение с... Feb 24 2010, 07:35 AlexandrY LUA может возвращать переменные пачками.
http://ww... Feb 24 2010, 08:25 GetSmart vmp, это то же самое как и передавать указатель на... Feb 24 2010, 09:20 dxp Цитата(GetSmart @ Feb 24 2010, 15:20) vmp... Feb 24 2010, 10:04 _Pasha Цитата(GetSmart @ Feb 24 2010, 12:20) Пер... Feb 24 2010, 13:06 GetSmart Структура - структурой. А я предлагаю "симмет... Feb 24 2010, 15:04 _Pasha Цитата(GetSmart @ Jan 28 2012, 08:29) Но ... Jan 28 2012, 09:00  GetSmart Цитата(_Pasha @ Jan 28 2012, 14:00) Кодvo... Mar 6 2012, 05:49 toweroff Цитата(GetSmart @ Jan 28 2012, 09:29) Ещё... Jan 28 2012, 13:36   ReAl Цитата(Сергей Борщ @ Jan 28 2012, 16:37) ... Mar 7 2012, 06:58    GetSmart Цитата(ReAl @ Mar 7 2012, 11:58) А вообще... Mar 7 2012, 07:17 vitan Цитата(GetSmart @ Feb 22 2010, 16:13) Поч... Jan 28 2012, 07:49 _Ivana А мне бы хотелось вот какую доработку - чтобы напи... Jan 29 2012, 10:03 _Pasha Цитата(GetSmart @ Jan 29 2012, 05:42) Чем... Jan 29 2012, 11:42 GetSmart Цитата(_Pasha @ Jan 29 2012, 16:42) Дык, ... Jan 29 2012, 12:10 sigmaN Я тут про прерывания подумал...
В стандарте языка ... Jan 30 2012, 01:34 Alex-sh Добрый вечер. Я знаю что мой вопрос несколько не в... Mar 6 2012, 19:16 ReAl Не понял вопрос.
Какая запись и где должна быть ну... Mar 7 2012, 17:22 _Pasha До кучи Mar 9 2012, 07:46 GetSmart Цитата(_Pasha @ Mar 9 2012, 12:46) До куч... Mar 9 2012, 11:23 GetSmart Хотел красиво оптимизировать Си-код, выполняющий о... Apr 13 2017, 16:08 ar__systems Цитата(GetSmart @ Apr 13 2017, 11:08) Хот... May 4 2017, 03:27 sigmaN Цитатачто де пиши на С++, но там аналогичный код с... Apr 30 2017, 08:29 Эдди Вообще-то, сокеты входят в stdlib — для работы с ... May 4 2017, 15:22 Grizzzly Цитата(Эдди @ May 4 2017, 18:22) Вообще-т... May 4 2017, 17:55 RabidRabbit Цитата(Эдди @ May 4 2017, 18:22) Скажем, ... May 7 2017, 11:00 Эдди Предлагаю не рассматривать всякие альтернативы. Об... May 4 2017, 18:01 Kane Цитата(Эдди @ May 4 2017, 21:01) Предлага... May 5 2017, 14:32  TSlicer Цитата(Kane @ May 5 2017, 15:32) Вы бы с ... May 5 2017, 17:17 GetSmart Продолжаем фантазировать.
Надо что-то вроде инкомп... May 21 2018, 17:32 jcxz 1. Было-бы лучше, если бы в си, при объявлении ини... May 22 2018, 03:16  haker_fox QUOTE (jcxz @ May 22 2018, 11:16) 1. Было... May 22 2018, 05:31  Forger Цитата(jcxz @ May 22 2018, 06:16) 1. Было... May 22 2018, 06:57   jcxz Цитата(Forger @ May 22 2018, 09:57) Дык, ... May 22 2018, 08:15    ViKo Цитата(jcxz @ May 22 2018, 11:15) И что? ... May 22 2018, 08:25     jcxz Цитата(ViKo @ May 22 2018, 11:25) Не согл... May 22 2018, 08:45      ViKo Цитата(jcxz @ May 22 2018, 11:45) Блин... May 22 2018, 09:03    Forger Цитата(jcxz @ May 22 2018, 11:15) Теперь ... May 22 2018, 08:49     Nixon Цитата(Forger @ May 22 2018, 11:49) Поэто... May 22 2018, 09:13      Forger Цитата(Nixon @ May 22 2018, 12:13) Кодcon... May 22 2018, 09:25     jcxz Цитата(Forger @ May 22 2018, 11:49) Это л... May 22 2018, 14:20      Forger Цитата(jcxz @ May 22 2018, 17:20) Всё что... May 22 2018, 14:41       jcxz Цитата(Forger @ May 22 2018, 17:41) Элеме... May 22 2018, 15:11        Forger Цитата(jcxz @ May 22 2018, 18:11) Как Вы ... May 22 2018, 16:00         jcxz Цитата(Forger @ May 22 2018, 19:00) Учест... May 22 2018, 16:35          Forger Цитата(jcxz @ May 22 2018, 19:35) А прогр... May 22 2018, 16:57          _pv Цитата(jcxz @ May 22 2018, 22:35) Но лучш... May 23 2018, 08:18        _pv Цитата(jcxz @ May 22 2018, 21:11) Эти сво... May 22 2018, 16:08        XVR Цитата(jcxz @ May 22 2018, 18:11) наприме... May 23 2018, 12:04         jcxz Цитата(XVR @ May 23 2018, 15:04) Это как ... May 23 2018, 18:49  ViKo Цитата(jcxz @ May 22 2018, 06:16) 5. Было... May 22 2018, 07:42  k155la3 Цитата(jcxz @ May 22 2018, 06:16) 1. Было... May 22 2018, 09:18 Nixon Кодtemplate < int...Params > struct AAA {
... May 22 2018, 10:07 Forger Цитата(Nixon @ May 22 2018, 13:07) добро ... May 22 2018, 10:33  haker_fox QUOTE (Forger @ May 22 2018, 18:33) В дан... May 22 2018, 13:00   Forger Цитата(haker_fox @ May 22 2018, 16:00) Мы... May 22 2018, 13:47    Nixon Цитата(Forger @ May 22 2018, 16:47) Имхо,... May 22 2018, 13:54     Forger Цитата(Nixon @ May 22 2018, 16:54) IAR AR... May 22 2018, 14:05 haker_fox QUOTE (Forger @ May 22 2018, 21:47) Анало... May 23 2018, 00:33 Forger Цитата(haker_fox @ May 23 2018, 03:33) Ед... May 23 2018, 06:36  haker_fox QUOTE (Forger @ May 23 2018, 14:36) Подав... May 23 2018, 07:00   Forger Цитата(haker_fox @ May 23 2018, 10:00) Я ... May 23 2018, 07:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|