nedoPC.org

Community for electronics hobbyists, established in 2002
Last visit was: 31 Aug 2024 17:15
It is currently 31 Aug 2024 17:15



 [ 19 posts ]  Go to page 1, 2  Next
Язык Си для троичного компьютера 
Author Message
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Чего-то не могу тут на форуме найти свои мысли на тему программирования на Си для троичного компьютера, которые я изложил в 2008 году - вобщем создаю новый топик
Короче что изменится для программиста при использовании языка Си для троичного компьютера?
Да собственно ничего не изменится - разве что INT_MIN и INT_MAX будут другими (обычные типы данных char, short, int, long, long long, а также float и double будут охватывать чуть более широкие диапазоны)
Трюки беззнаковой арифметики перестанут работать (и вообще любые трюки с переполнениями - но при желании их можно сымитировать программно) - скорее всего char и unsigned char будут представлять один и тот же 6-тритный тип данных, а int для начала может быть 12-тритным
Для троичных сдвигов можно завести новые операторы <<< и >>> которые будут реализованы аппаратно, в отличие от двоичных << и >> которые будут заменяться при компиляции на *2^n и /2^n соответственно
А если надо будет иметь потритные операции, то видимо надо создавать какие-то макросы

P.S. Вот нашёл где обсуждали по английски: http://www.nedopc.org/forum/viewtopic.php?f=62&t=97

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


29 May 2020 19:33 WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
char / unsigned char -> 6 тритов (трайт)
short / unsigned short -> 12 тритов (трорд)
int / unsigned int для начала может быть равен short, как в старых 16-битных компиляторах
для представления 32-битного целого достаточно было бы 21 трита, хоть это и не кругло
а 64-битное целое (long long) влезет в 41 трит, но видимо надо будет брать 24 трита и 48 тритов соответственно (для единообразия)

P.S. с другой стороны можно сразу сделать int 24-тритным, а long 48-тритным (равным long long как в современных 64-битных компиляторах)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


29 May 2020 19:37 WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Зачем это надо? А затем, чтобы можно было существующие программы компилировать под троичный процессор без существенной переделки (в идеале - вообще без переделки)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


30 May 2020 18:30 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
Зачем это надо? А затем, чтобы можно было существующие программы компилировать под троичный процессор без существенной переделки (в идеале - вообще без переделки)

Ну "вообще без переделки" однозначно не получится - тогда все прелести, привнесенные троичностью,
не имеют никакого эффекта. :osad:

_________________
iLavr


01 Jun 2020 14:59
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Ничто из стандарта не является невыполнимым на абстрактном троичном компе. Не забываем только нюансы типа того, что инт это минимум 16 бит, и при этом такого размера, манипуляции с которым являются самыми быстрыми на данной архитектуре :egeek:

Кстати, начиная с этого года стандарт-таки предписал дополнительный код для хранения знаковых целых (но оставил переполнение UB :question: ).


01 Jun 2020 15:13
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Lavr wrote:
Shaos wrote:
Зачем это надо? А затем, чтобы можно было существующие программы компилировать под троичный процессор без существенной переделки (в идеале - вообще без переделки)

Ну "вообще без переделки" однозначно не получится - тогда все прелести, привнесенные троичностью,
не имеют никакого эффекта. :osad:

Для "эффекта" надо писать троичные программы с нуля

Ну и потом арифметика ведь будет идти через троичное АЛУ - так что кое какие прелести таки будут "автоматически"

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


01 Jun 2020 18:02 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
Lavr wrote:
Shaos wrote:
Зачем это надо? А затем, чтобы можно было существующие программы компилировать под троичный процессор без существенной переделки (в идеале - вообще без переделки)

Ну "вообще без переделки" однозначно не получится - тогда все прелести, привнесенные троичностью,
не имеют никакого эффекта. :osad:

Для "эффекта" надо писать троичные программы с нуля

Совершенно не надо! Троичные "прелести" просто позволят сократить существующие программы.

Shaos wrote:
Ну и потом арифметика ведь будет идти через троичное АЛУ - так что кое какие прелести таки будут "автоматически"
Этого никто не заметит. Для рядового пользователя как складывались числа (или вычитались) - так оно и будет.
А дополнительные фишки троичности не будут доступны из существующих программ - их же там не было!

_________________
iLavr


01 Jun 2020 20:09
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Вот нашёл где обсуждали по английски: http://www.nedopc.org/forum/viewtopic.php?f=62&t=97

Также вставил линк в первый пост

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


05 Jul 2020 20:44 WWW
Junior
User avatar

Joined: 16 Nov 2020 10:04
Posts: 6
Остается вопрос с побитовыми операциями...

Это что же, на чистой магии интерпретации, какие-нибудь двоичные 32х разрядные инты ПОБИТОВО переводить в троичные лонги(чтоб разрядов хватило) имеющие в разряде только -1 и 1, и применять логические потритовые операции? Но тогда мы не сможем совершать побитовые операции над двоичными лонгами, так как не хватает троичного целочисленного типа с количеством разрядов покрывающим этот лонг.

Или городить какие нибудь сложные структуры данных с булевыми массивами и циклами... И это я уже в ООП укатился...


16 Nov 2020 10:22
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Ну двоичные сдвиги будут выполняться через умножение на 2 и деление на 2

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


18 Nov 2020 17:22 WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Shaos wrote:
Ну двоичные сдвиги будут выполняться через умножение на 2
Это лучше делать как сумму с самим числом.

Shaos wrote:
... и деление на 2
А вот тут так просто не получится... :-?

А зачем вобще нам ДВОИЧНЫЕ сдвиги? :roll:

_________________
iLavr


19 Nov 2020 04:44
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Lavr wrote:
А зачем вобще нам ДВОИЧНЫЕ сдвиги? :roll:

Многие программы их используют - если мы хотим полной переносимости, то надо поддержать

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Nov 2020 10:04 WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
dashedman wrote:
Остается вопрос с побитовыми операциями...

Это что же, на чистой магии интерпретации, какие-нибудь двоичные 32х разрядные инты ПОБИТОВО переводить в троичные лонги(чтоб разрядов хватило) имеющие в разряде только -1 и 1, и применять логические потритовые операции? Но тогда мы не сможем совершать побитовые операции над двоичными лонгами, так как не хватает троичного целочисленного типа с количеством разрядов покрывающим этот лонг.

Или городить какие нибудь сложные структуры данных с булевыми массивами и циклами... И это я уже в ООП укатился...
А вот кстати про маскирование битов и битовые поля я как-то не подумал :roll:

У нас ведь будут "тритовые" поля, которые будут маскироваться вовсе не побитовым AND (который в троичном мире есть MIN), а логическим троичным умножением MUL (см. подробнее тут). По-видимому надо иметь тип данных, который будет покрывать 32-позиционное битово-тритовое поле - по видимому это будет 48-тритовое слово - и все битовые константы из переносимой программы (если они там будут) надо "преобразовать" в троичный вид на уровне компиляции...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


29 Jun 2024 21:23 WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Автор Тунгуски сделал себе си-подобный компилятор 3CC, в котором он ушёл несколько в сторону:

Attachment:
Screenshot from 2024-06-30 00-14-09.png

Ну допустим с появлением оператора знака я согласен, но вот в остальном - например он убрал сдвиги вовсе, посчитав что теперь можно использовать умножение и деление на степень тройки, добавил универсальную операцию задаваемую 6 тритами (см. FFUUTT-code), а также изменил то, как работают сравнения. По мне так последние совсем-совсем не логично - сравнение должно сравнивать, выдавая ок или неок, т.е. никакого третьего в данном случае не дано!


You do not have the required permissions to view the files attached to this post.

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


30 Jun 2024 00:16 WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23200
Location: Silicon Valley
Shaos wrote:
сравнение должно сравнивать, выдавая ок или неок, т.е. никакого третьего в данном случае не дано!
Обычное условие if-else выполняет блок else, если выражение возвращает 0, и выполняет блок if, если выражение возвращает что-то другое - наверное так и надо оставить по умолчанию. Однако наверное можно добавить вариант "троичного" if-а, когда у нас не 2, а 3 блока:
Code:
if3(expression)
{
  // условие вернуло значение >0
}
else3o
{
  // условие вернуло 0
}
else3n
{
  // условие вернуло значение <0
}
На самом деле ровно того же самого можно достичь с помощью использования switch с оператором знака:
Code:
switch(~expression)
{
  case -1:
    ...
    break;

  case 0:
    ...
    break;

  case 1:
    ...
    break;
}
но оно выглядит немного тяжеловато...

Ну и наряду с тройственным оператором надо будет завести "четвёрственный" :lol:

expression???negative:neutral:positive

P.S. Ещё один возможный вариант 3-блочного if:
Code:
if(expression) positive {
  ...
} neutral {
  ...
} negative {
  ...
}
И наверное надо разрешить else, объединяющий 2 оставшихся условия:
Code:
if(expression) positive {
  ...
} else {
  // neutral or negative
}
Code:
if(expression) neutral {
  ...
} else {
  // positive or negative
}
Code:
if(expression) negative {
  ...
} else {
  // positive or neutral
}
При этом обычный сишный if-else наверное также будет допустим:
Code:
if(expression) {
  // positive or negative
} else {
  // neutral
}


P.P.S. Возможно вместо "четвёрственного" оператора надо прям этот новый if и использовать в выражениях (как например давно делается с if-then-else в некоторых функциональных языках):
Code:
int result = 13 + if(~a) pos { -13 } neu { 0 } neg { 13 };
(тут я подсократил positive/neutral/negative т.к. длинновато выглядит, если без сокращений писать)

P.P.P.S. А для троичных сравнений, которые возвращают больше-равно-меньше, можно просто использовать вычитание :lol:
Code:
if(a-b) pos {
  printf("a > b\n");
} neu {
  printf("a == b\n");
} neg {
  printf("a < b\n");
}

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


30 Jun 2024 00:39 WWW
 [ 19 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: Claude AI [Bot] and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.