Насколько адаптированы стандарты C и C ++ к гипотетической троичной аппаратной архитектуре? - PullRequest
0 голосов
/ 27 апреля 2019

Насколько легко вы могли бы программировать троичный компьютер на C или C ++?

Очевидно, что стандартные логические операторы (такие как &, | и ^) имеют смысл только при использовании двоичной логики.

Для целочисленных значений стандарт C относится к диапазонам значений, в то время как стандарт C ++ упоминает длину в битах (например, длина должна быть не менее 32 бит).Как это применимо к компьютеру, использующему триты (то есть троичные биты)?

Будет ли вообще целесообразно использовать слегка модифицированную версию C / C ++ для программирования на троичной архитектуре или вам следует разработатьновый язык программирования с нуля?

Важными моментами, которые следует учитывать, будет обратная совместимость (могут ли программы с двоичными допусками быть легко скомпилированы для троичной архитектуры, или потребуется эмуляция хранения двоичных данных?) и неявные предположения?в разработке стандартов C / C ++.

1 Ответ

0 голосов
/ 27 апреля 2019

Формулировка стандарта C ++ предполагает двоичную архитектуру:

[intro.memory] / 1:

Основная единица хранения в C ++Модель памяти - это байт.Байт, по крайней мере, достаточно большой, чтобы содержать любой элемент базового набора символов выполнения и восьмибитовых кодовых единиц формы кодирования Unicode UTF-8 и состоит из непрерывной последовательности битов , числаиз которых определяется реализацией.

[основной / фундаментальный] / 4:

Беззнаковые целые должны подчиняться законам арифметики по модулю 2 [возводятся в степень]n, где n - количество битов в представлении значения этого конкретного размера целого числа.

Кроме того, битовые поля и биты заполнения часто являютсяиспользуемые понятия.

Операторы, такие как сдвиг влево, сдвиг вправо, также относятся к битам, а битовые, битовые или битовые xor являются операциями по определению, которые работают на уровне битов, предполагая, что каждый бит является истинным илиложный.

Что, если стандарт будет адаптирован к троичной архитектуре?

Можно представить, что в стандарте можно использовать другой термин для обозначения наименьшего фрагмента информации в архитектуре, аналогично тому, как онбыло сделано для байта (байт, хотя чаще всего 8 битов не определены как таковые в стандарте, чтобы стандарт мог хорошо работать с машинами, имеющими 10-битные байты).

Тем не менее последствия будут ужасными:

  • Например, во многих алгоритмах левое смещение умножается на степень 2, и внезапно оно умножается настепень 3. То же самое для правого сдвига.Таким образом, большая часть существующего кода больше не будет работать.

  • битовые операции не определены для тритов: они определены только для двоичных битов.Таким образом, стандарт должен был бы переопределить их так или иначе (например, подражая исходному поведению с некоторой степенью силы 2 математики).Опять же, есть вероятность того, что некоторый существующий код будет сломан, особенно если он используется в сочетании со сдвигами.

Дополнительное замечание

Со времен провидческой книги Норберта Винера " Кибернетика ", опубликованной в 1948 году (!!!)больше нет сомнений в том, что альтернативы бинарным системам отсутствуют.В главе « Вычислительные машины и нервная система » он очень хорошо объяснил, почему числовые машины более точны и производительны, чем аналоговые, и что среди числовых машин двоичная арифметика превосходит другие, потому что она проще, быстрее и дополнительно проще и дешевле реализовать .В настоящее время никто не смог доказать обратное, поэтому в ближайшее время не будет видно никакой троичной компьютерной архитектуры.

Комментарии

В комментариях Питер указывает, что реализация просто должна предлагать заданное поведение абстрактной машины, определенное в стандарте C ++.Это верно в соответствии с [intro.abstract] / 5.Но я хочу сказать, что это только теоретическая истина с точки зрения троичных машин.

Бинарная модель является настолько сильным допущением во многих местах стандарта и переплетена с адресациейсхема, которую я буду притворяться, что невозможно эффективно и последовательно эмулировать на троичной машине.

Просто чтобы проиллюстрировать проблему с определением байтов: требуется 6 тритов для соответствия требованиям для байта. Однако 6 тритов соответствует 9,5 битам. Чтобы байт соответствовал последовательному числу битов, как того требует стандарт, вам нужно, чтобы он был равен s trits, чтобы pow (3, s) == pow (2, n). Это уравнение не имеет решений. В качестве альтернативы вы можете сказать, что байт хранится в 9 битах в 6 тритах, и что вы просто игнорируете некоторые троичные значения. Но поскольку байты используются для хранения указателей, вы также можете игнорировать некоторые диапазоны памяти. Поэтому вам понадобится функция отображения для преобразования значений, хранящихся в байтах, и адресов машин. Но что тогда с аппаратными ограничениями выравнивания? Они могут не соответствовать выравниваниям, которые могут быть выражены в соответствии с бинарной моделью и т. Д. В конце вам понадобится медленная виртуальная машина, которая полностью программно эмулирует бинарную архитектуру (безусловно, с тем же уровнем производительности, что и многие эмуляторы MIPS на архитектуре x86, так что хорошо для образовательных целей). Я думаю, что это могло бы тогда соответствовать стандарту, но больше не наши ожидания производительности.

...