представление числа в языке программирования
Участников: 2
представление числа в языке программирования
Привет!
Я эту тему уже давно мусолю.
Всё не могу найти компромиса.
В каком формате представлять число в языке программирования?
В бэйсике следующий формат
123 целое число
0.123 число с плавающей точкой
0.123e12 число с основой 12
&b0101110 двоичное число
&o7501 восьмеричное число
&d195 десятичное число
&h1af0 шестнадцатиричное число
Но тут есть проблема. Вообще-то символ амперсанта "&" (and) обозначает логическое "и" или взятие адреса (в бэйсике заменённого символом "@").
Кстати, Electrik возмущался по поводу префиксного обозначения числа. Будь добр изложи свои возражения!
Ладно, посмотрим на другие языки. Возьмём C/C++
123 целое число
0.123 число с плавающей точкой
0.123e12 число с основой 12
07501 восьмеричное число
0x1af0 шестнадцатиричное число
Ха-эм... Скудно как-то! Для столь навороченного языка и... Или я не вкурил?
А ещё просто не удобно человеку.
Вот ассемблер.
123 целое число
0101110b двоичное число
7501o восьмеричное число
195d десятичное число
1af0h шестнадцатиричное число
Не знаю, в ассемблере ведь нельзя десятичное число указывать?
Всё нормально. Суфиксный вариант кажеться очень удобным... Пока я не сел писать лексический анализатор и на числах тормознул.
Если взять за основу формат бэйсика, или C/C++ то всё просто.
А вот с ассемблерным вариантом накладочки, мать их! (или отца...)
Допустим вот шестнадцатеричное число:
abc1h
А может быть это не число, а функция?
Короче подумав, я решил, что спецальный префикс для числа нужен.
Например символ "#"
123 целое число
0.123 число с плавающей точкой
0.123e12 число с основой 12
#b0101110 двоичное число
#o7501 восьмеричное число
#d195 десятичное число
#h1af0 шестнадцатиричное число
Есть ещё вариант, что символ "#" будет в начале числа, а суфикс "b", "d", "o" или "h" в конце.
Но вот спрашиваеться, разве вариант с обозначением в начале не удобнее?
Лексический анализатор будет сразу знать, какое число читает, а не гадать до последнего. Или вообще отдав это на милость синтаксическому анализатору.
Да и человеку наверное будет так удобнее.
Если ничего не измениться, остановлюсь на последнем варианте.
пожалуйста программеры выскажите свои мысли!
Я эту тему уже давно мусолю.
Всё не могу найти компромиса.
В каком формате представлять число в языке программирования?
В бэйсике следующий формат
123 целое число
0.123 число с плавающей точкой
0.123e12 число с основой 12
&b0101110 двоичное число
&o7501 восьмеричное число
&d195 десятичное число
&h1af0 шестнадцатиричное число
Но тут есть проблема. Вообще-то символ амперсанта "&" (and) обозначает логическое "и" или взятие адреса (в бэйсике заменённого символом "@").
Кстати, Electrik возмущался по поводу префиксного обозначения числа. Будь добр изложи свои возражения!
Ладно, посмотрим на другие языки. Возьмём C/C++
123 целое число
0.123 число с плавающей точкой
0.123e12 число с основой 12
07501 восьмеричное число
0x1af0 шестнадцатиричное число
Ха-эм... Скудно как-то! Для столь навороченного языка и... Или я не вкурил?
А ещё просто не удобно человеку.
Вот ассемблер.
123 целое число
0101110b двоичное число
7501o восьмеричное число
195d десятичное число
1af0h шестнадцатиричное число
Не знаю, в ассемблере ведь нельзя десятичное число указывать?
Всё нормально. Суфиксный вариант кажеться очень удобным... Пока я не сел писать лексический анализатор и на числах тормознул.
Если взять за основу формат бэйсика, или C/C++ то всё просто.
А вот с ассемблерным вариантом накладочки, мать их! (или отца...)
Допустим вот шестнадцатеричное число:
abc1h
А может быть это не число, а функция?
Короче подумав, я решил, что спецальный префикс для числа нужен.
Например символ "#"
123 целое число
0.123 число с плавающей точкой
0.123e12 число с основой 12
#b0101110 двоичное число
#o7501 восьмеричное число
#d195 десятичное число
#h1af0 шестнадцатиричное число
Есть ещё вариант, что символ "#" будет в начале числа, а суфикс "b", "d", "o" или "h" в конце.
Но вот спрашиваеться, разве вариант с обозначением в начале не удобнее?
Лексический анализатор будет сразу знать, какое число читает, а не гадать до последнего. Или вообще отдав это на милость синтаксическому анализатору.
Да и человеку наверное будет так удобнее.
Если ничего не измениться, остановлюсь на последнем варианте.
пожалуйста программеры выскажите свои мысли!
нужные типы и форматы
И ещё... Как по вашему, какие системы счисления и стандартные форматы нужны в языке?
null нулевое
bool булевое
fuzzy нечёткой логики
fload с плавающей точкой
integer целое с основанием 0, 8, 10 или 16
complex комплексное
day день недели с основанием 7
month день месяца с основанием 12
second секунда или минута, а так же милисекунда с основанием 60
(наверное лучше три разных типа?)
clock часы с основанием 24
(их кажеться правельнее как-то на h обозвать или сделать ещё отдельный тип?)
datetime это формат для unix timestamp
time время
date дата
(ха... А ещё бынадо дату вместе со временем udata.)
money денежная еденица с указанием целой, и двух дробных частей, а так же наименования валюты.
Я ничего не забыл?
И вообще, может стоит большую часть вынести в пользовательские типы?
null нулевое
bool булевое
fuzzy нечёткой логики
fload с плавающей точкой
integer целое с основанием 0, 8, 10 или 16
complex комплексное
day день недели с основанием 7
month день месяца с основанием 12
second секунда или минута, а так же милисекунда с основанием 60
(наверное лучше три разных типа?)
clock часы с основанием 24
(их кажеться правельнее как-то на h обозвать или сделать ещё отдельный тип?)
datetime это формат для unix timestamp
time время
date дата
(ха... А ещё бынадо дату вместе со временем udata.)
money денежная еденица с указанием целой, и двух дробных частей, а так же наименования валюты.
Я ничего не забыл?
И вообще, может стоит большую часть вынести в пользовательские типы?
Re: представление числа в языке программирования
Неужели все же взялся свой язык создавать? Блин... Короче, я вот тоже сейчас пишу компилер (project V-Lite) - исключительно в образовательных целях. Никаких сверхзадач (вроде новый супер-пупер-крутой-и-самый-навороченный-язык-которым-будет-пользоваться-каждый), просто небольшой простенький синтаксис, никаких объектов. Сплошной минимализм, короче. Уже есть лексический сканер, заканчиваю парсер и подумываю о генераторе кода Сделаю альфу - запощу на форуме.
Так вот, когда я только проектировал язык, проблема такая тоже вставала. Вот к какому решению я пришел - сразу оговорюсь, что это только лично мое мнение, вполне возможно, что ошибочное.
Форму записи чисел безжалостно содрал в Аде. Сначала идет основание системы счисления (допустимые значения от двух до шестнадцати, можно, конечно, больше, но зачем?), затем символ #, потом само число, в соответсвующей системе. Например:
10#84, 16#BADCODE, 2#01000010100
Допускается запись:
#2020 - основание 16
либо без явного указания системы:
84854 - десятичная система.
Думал еще сделать ## для двоичной, но передумал.
В пользу этого - большая свобода для программера, да и проще транслировать числа - легче ведь написать один транслятор с переменной системой, чем четыре отдельных - для шест. чисел, двоичных и т.д.? Потом - префиксная запись, имхо, гораздо удобнее - не нужно просматривать все число, чтоб узнать, как его понимать. Кроме того, у постфиксного варианта есть минус - ведь символы указания системы являются, кроме того, еще и разделителями - то есть сканер не моджет точно определить начало числа, и в шест. системе для асма приходится писать 0BADCODEH вместо логичного BADCODEH. Ну и потом - что нагляднее - BADCODEH или #BADCODE?
Не знаю, в ассемблере ведь нельзя десятичное число указывать?
Почему же, без явного указания суффикса - десятичное. Как и во всех нормальных языках.
А вот с типами ты явно перегнул. У моего V-Lite голова бы закружилась от пестроты. У него все предельно просто: есть только три встроенных типа: абстрактный VOID (отсутствие типа), почти не менее абстрактный BIT (поскольку практически всегда расширяется до байта) и единственный реальный в этом царстве призраков BYTE. Все остальное - bool (который и есть bit, но по сути byte) и даже float (являющийся в общем случае последовательностью бит с определенным значением в зависимости от положения), не говоря уже об экзотике вроде money (я о таком даже не думал...) может и должно конструироваться с помощью составных типов. Если уж будет такая в них нужда, лучше я перепишу заголовочный файл, чем буду перекомпилировать компилер. И причем каждый может сделать это.
Так вот, когда я только проектировал язык, проблема такая тоже вставала. Вот к какому решению я пришел - сразу оговорюсь, что это только лично мое мнение, вполне возможно, что ошибочное.
Форму записи чисел безжалостно содрал в Аде. Сначала идет основание системы счисления (допустимые значения от двух до шестнадцати, можно, конечно, больше, но зачем?), затем символ #, потом само число, в соответсвующей системе. Например:
10#84, 16#BADCODE, 2#01000010100
Допускается запись:
#2020 - основание 16
либо без явного указания системы:
84854 - десятичная система.
Думал еще сделать ## для двоичной, но передумал.
В пользу этого - большая свобода для программера, да и проще транслировать числа - легче ведь написать один транслятор с переменной системой, чем четыре отдельных - для шест. чисел, двоичных и т.д.? Потом - префиксная запись, имхо, гораздо удобнее - не нужно просматривать все число, чтоб узнать, как его понимать. Кроме того, у постфиксного варианта есть минус - ведь символы указания системы являются, кроме того, еще и разделителями - то есть сканер не моджет точно определить начало числа, и в шест. системе для асма приходится писать 0BADCODEH вместо логичного BADCODEH. Ну и потом - что нагляднее - BADCODEH или #BADCODE?
Не знаю, в ассемблере ведь нельзя десятичное число указывать?
Почему же, без явного указания суффикса - десятичное. Как и во всех нормальных языках.
А вот с типами ты явно перегнул. У моего V-Lite голова бы закружилась от пестроты. У него все предельно просто: есть только три встроенных типа: абстрактный VOID (отсутствие типа), почти не менее абстрактный BIT (поскольку практически всегда расширяется до байта) и единственный реальный в этом царстве призраков BYTE. Все остальное - bool (который и есть bit, но по сути byte) и даже float (являющийся в общем случае последовательностью бит с определенным значением в зависимости от положения), не говоря уже об экзотике вроде money (я о таком даже не думал...) может и должно конструироваться с помощью составных типов. Если уж будет такая в них нужда, лучше я перепишу заголовочный файл, чем буду перекомпилировать компилер. И причем каждый может сделать это.
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: представление числа в языке программирования
fuzzy logic... Боже... сколько вещей прошли мимо меня... (серьезно!) Я тут "открыл для себя" Haskell и вообще функциональное программирование... Может, мы все не там? И императивный кодинг - уже прошедший век?
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: представление числа в языке программирования
Ну пока я на что-то серьёзное не замахиваюсь. Хотя расчёт на будущее есть конечно же.
Просто присматриваюсь, что да как.
Язык... Ну дык если писать, так чтобы был уж цевильным. А то огрызки и не интересны.
С функциональным программированием я ковырялся. Есть там интересные моменты.
Но всё же ооп для моих мозгов более понятен, чем некая другая порадигма.
В прочем кто мешает реализовывать часть функционала?
Например в рефале очень простенький, но не менее эффективный механизм проверок.
С префиксами чисел я согласен. Так оно действительно проще для лексического анализатора.
А вот аду я не смотрел, но то что ты привёл, действительно прикольно. Сразу задавать систему счисления, хе-хе.
А какой там потолок? 16 или больше?
Теперь о моих типах.
Я привёл типы только для математики.
Возможно правда нужно избавляться от лишних сущностей.
Но тут есть одна заморочка. Посмотри, как было с C/C++. Они ведь реализовали только базовые типы отдав прочее на усмотрение программеров.
После чего, появились эти дибильные строки с терминальным нулём.
А если бы в языке изначально был бы хороший тип строк, то народ бы уже не лез в бутылку.
Тут я ориентируюсь на java.
Ну и с прочими типами похожая ситуация.
У меня для языка есть ещё несколько задумок. Не знаю, хватит ли сил, их все реализовать.
Я хочу сделать язык компилируемый и интерпретируемый.
Т.е. чтобы можно было выполнить код без компиляции. Или сделать компактный файлик, который можно будет запустить без интерпретатора.
Часть функций, в компилируемом файле, всё равно будет нескомпилирована и выполняться во время исполнения.
Чтобы программа могла порождать новые функции, в процессе выполнения.
Там с этим ещё несколько фичь.
Например при компиляции будет запускаться интерпретатор для вычисления некоторых функций. И если функция может быть вычислена, то она уже не будет компилироваться, а будет взят только её результат.
Или фича из той же оперы.
Выражения, например регулярные или запросы к базе, ведь интерпретируються уже во время выполнения, но до этого их нельзя проверить.
Так вот, думаю, чтобы они тоже компилировались.
Это вообще занятный механизм.
И компилятор не нужно будет перекомпилировать. Добавляя лишь статические библиотеки, в которых и будет реализован нужный функционал.
Короче мясо на мясе.
От многих вещей я хочу избавиться, например препроцессор.
Многое добавить. Оно конечно уже есть, просто хочу извратиться и слить вместе несколько разных вещей.
С классами и типами.
Классы будут динамические.
Т.е. можно будет на лету добавлять или удалять методы и свойства.
При этом типы будут статические.
В прочем их можно будет заюзать так же как классы.
Хотя только как статические.
Короче динамические классы, это между тем как в JavaScript и objective-C.
А типы, это как классы в C++.
Дальше, у переменных должен быть префикс "$".
Сколько я не ковырял, кажеться наиболее удачным решением.
Сразу видно, что переменная. А ещё можно разделить пространство имён переменных и функций.
Шаблоны. Точнее переменные у шаблонов будут с префиксом "%". Долго думал, не взять ли символ "@". Но "%" для шаблонов более привычен.
А тогда префикс "@" остаёться для сообщений, которые можно будет посылать объекту.
Тоже занятный момент.
Объекты хочу делать автономные. Оно так гибче получаеться.
Хотя для статических типов, всё же статические объекты, иначе смысла не будет. Да и код будет более оптимизирован.
Вот такая каша. Я надеюсь, что идея жизнеспособна.
У меня есть лексический и синтаксический анализаторы. Хотя их сейчас ещё доделываю и переделываю.
Не знаю, в машинный код как перегонять.
Можно транслировать в C или ассемблер.
Или прямо гнать в машинный код.
До этого ещё не добрался. Делал несколько заходов, но с обломами.
Ладно, всё ещё впереди.
Буду наверное крошить на фрагменты.
Просто присматриваюсь, что да как.
Язык... Ну дык если писать, так чтобы был уж цевильным. А то огрызки и не интересны.
С функциональным программированием я ковырялся. Есть там интересные моменты.
Но всё же ооп для моих мозгов более понятен, чем некая другая порадигма.
В прочем кто мешает реализовывать часть функционала?
Например в рефале очень простенький, но не менее эффективный механизм проверок.
С префиксами чисел я согласен. Так оно действительно проще для лексического анализатора.
А вот аду я не смотрел, но то что ты привёл, действительно прикольно. Сразу задавать систему счисления, хе-хе.
А какой там потолок? 16 или больше?
Теперь о моих типах.
Я привёл типы только для математики.
Возможно правда нужно избавляться от лишних сущностей.
Но тут есть одна заморочка. Посмотри, как было с C/C++. Они ведь реализовали только базовые типы отдав прочее на усмотрение программеров.
После чего, появились эти дибильные строки с терминальным нулём.
А если бы в языке изначально был бы хороший тип строк, то народ бы уже не лез в бутылку.
Тут я ориентируюсь на java.
Ну и с прочими типами похожая ситуация.
У меня для языка есть ещё несколько задумок. Не знаю, хватит ли сил, их все реализовать.
Я хочу сделать язык компилируемый и интерпретируемый.
Т.е. чтобы можно было выполнить код без компиляции. Или сделать компактный файлик, который можно будет запустить без интерпретатора.
Часть функций, в компилируемом файле, всё равно будет нескомпилирована и выполняться во время исполнения.
Чтобы программа могла порождать новые функции, в процессе выполнения.
Там с этим ещё несколько фичь.
Например при компиляции будет запускаться интерпретатор для вычисления некоторых функций. И если функция может быть вычислена, то она уже не будет компилироваться, а будет взят только её результат.
Или фича из той же оперы.
Выражения, например регулярные или запросы к базе, ведь интерпретируються уже во время выполнения, но до этого их нельзя проверить.
Так вот, думаю, чтобы они тоже компилировались.
Это вообще занятный механизм.
И компилятор не нужно будет перекомпилировать. Добавляя лишь статические библиотеки, в которых и будет реализован нужный функционал.
Короче мясо на мясе.
От многих вещей я хочу избавиться, например препроцессор.
Многое добавить. Оно конечно уже есть, просто хочу извратиться и слить вместе несколько разных вещей.
С классами и типами.
Классы будут динамические.
Т.е. можно будет на лету добавлять или удалять методы и свойства.
При этом типы будут статические.
В прочем их можно будет заюзать так же как классы.
Хотя только как статические.
Короче динамические классы, это между тем как в JavaScript и objective-C.
А типы, это как классы в C++.
Дальше, у переменных должен быть префикс "$".
Сколько я не ковырял, кажеться наиболее удачным решением.
Сразу видно, что переменная. А ещё можно разделить пространство имён переменных и функций.
Шаблоны. Точнее переменные у шаблонов будут с префиксом "%". Долго думал, не взять ли символ "@". Но "%" для шаблонов более привычен.
А тогда префикс "@" остаёться для сообщений, которые можно будет посылать объекту.
Тоже занятный момент.
Объекты хочу делать автономные. Оно так гибче получаеться.
Хотя для статических типов, всё же статические объекты, иначе смысла не будет. Да и код будет более оптимизирован.
Вот такая каша. Я надеюсь, что идея жизнеспособна.
У меня есть лексический и синтаксический анализаторы. Хотя их сейчас ещё доделываю и переделываю.
Не знаю, в машинный код как перегонять.
Можно транслировать в C или ассемблер.
Или прямо гнать в машинный код.
До этого ещё не добрался. Делал несколько заходов, но с обломами.
Ладно, всё ещё впереди.
Буду наверное крошить на фрагменты.
Re: представление числа в языке программирования
DiG. GeRR пишет:Не знаю, в ассемблере ведь нельзя десятичное число указывать?
Почему же, без явного указания суффикса - десятичное. Как и во всех нормальных языках.
Ндя-с. Я хотел спросить, на асме можно ли писать десятичные дроби или числа с основанием десятой степени?
А может он кушает натуральные дроби?
Вроде бы нет.
Обычные системы счисления, это да, я знаю - кушает.
И кстати debug.exe по умолчанию шестнадцатеричные цифорки кушает. А другие кажись вообще нет.
Re: представление числа в языке программирования
masm -
fl1 dq 10.0
fl2 dq 38.2e10
debug.exe = debug.com?
[qoute]Я надеюсь, что идея жизнеспособна.[/quote]
Еще и не такие монстры живут! Но боюсь, что одному человеку этого не потянуть. Нужна команда, по крайней мере человек пять, и даже тогда на это потребуется по меньшей мере полгода.
fl1 dq 10.0
fl2 dq 38.2e10
debug.exe = debug.com?
Теперь моя очередь - ндя-с...Часть функций, в компилируемом файле, всё равно будет нескомпилирована и выполняться во время исполнения.
тоже смешно. Препроцессор в том виде, в каком он существует в большинстве языков - действительно зло. (за исключением асма, но такого препроцессора больше нет!). Но полностью избавляться от него тоже нельзя - нужно его развивать.От многих вещей я хочу избавиться, например препроцессор.
[qoute]Я надеюсь, что идея жизнеспособна.[/quote]
Еще и не такие монстры живут! Но боюсь, что одному человеку этого не потянуть. Нужна команда, по крайней мере человек пять, и даже тогда на это потребуется по меньшей мере полгода.
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: представление числа в языке программирования
Угу может и debug.com
Я его уже не помню. Набираю просто debug.
А препроцессор это зло.
Я просто не представляю, что с ним нужно сделать, чтобы исправить все его недостатки.
И как его ещё развивать.
Имхо, штатными средствами языка можно добиться большего эффекта с меньшими опастными местами.
А компиляция с интерпретацией в одном флаконе это очень интересная фича. Кстати очень широко используеться в функциональных языках.
Но для этой фичи можно найти ещё множество областей применения. Хотя это значительно усложнит разработку компилера.
Я его уже не помню. Набираю просто debug.
А препроцессор это зло.
Я просто не представляю, что с ним нужно сделать, чтобы исправить все его недостатки.
И как его ещё развивать.
Имхо, штатными средствами языка можно добиться большего эффекта с меньшими опастными местами.
А компиляция с интерпретацией в одном флаконе это очень интересная фича. Кстати очень широко используеться в функциональных языках.
Но для этой фичи можно найти ещё множество областей применения. Хотя это значительно усложнит разработку компилера.
Re: представление числа в языке программирования
Я его уже не помню. Набираю просто debug.
А я думал, под виндой асм-код все уже давно отлаживают олькой... ну если только dos-mz или com...
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: представление числа в языке программирования
Да я особо с этим и не заморачиваюсь.
А дебаг есть, всегда под рукой.
Буду я ещё лишний совфт ставить?
Кстати им можно и win32 гgui кодить.
Его сила в простоте и прямолинейности.
А дебаг есть, всегда под рукой.
Буду я ещё лишний совфт ставить?
Кстати им можно и win32 гgui кодить.
Его сила в простоте и прямолинейности.
Re: представление числа в языке программирования
странное понятие о простоте и силе... Имхо олька намного удобнее, нагляднее и проще. А сайс (даже сисер) вообще космический корабль. Ну ладно, у каждого свои вкусы.
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: представление числа в языке программирования
Ну что поделать. Люди ведь разные.
А debug мне понятен. А значит и прост.
С ним можно многое сделать.
В прочем, я же ведь этим серьёзно не занимаюсь, так - поиграюсь и брошу.
И зачем мне ещё с чем-то другим разбираться? И так в голове целая куча инфы.
А debug мне понятен. А значит и прост.
С ним можно многое сделать.
В прочем, я же ведь этим серьёзно не занимаюсь, так - поиграюсь и брошу.
И зачем мне ещё с чем-то другим разбираться? И так в голове целая куча инфы.
Права доступа к этому форуму:
Вы не можете отвечать на сообщения