Malbolge

vital

Больной Компом Детектед
29.01.2006
2 432
34
#1
ООП, уровни асбтракции от аппаратуры.. Знаете. Это все фигня=). Я тут нашел один язык программмирования.. Сам автор пишет:
Malbolge was truly created with the idea that programming should be hard. It should be as close to the Infernal as a programming language possibly can be.
Заинтересовались?

Вобщем, на просторах инета нашел три версии хелловорлда
Это википедия:
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
Это гугл:
b'BA@?>=<;:987654321r`oo,llH('&%
ed"c~w|{z9'Z%utsrqponmlkjihgfedc
ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDC
BA@#>~~;|z8xwvuts10/.nm+*)i'&%fd
"ba`_^]yxwvXWsrqSonmPNjLKJIHGcba
`BA]\[=YXW:8T654321MLKJ,+GFE'CBA
$">~}|{zy7654ts10/o-,+lj(hgfedc!
~}|^]yxwYutsVTpRQPONMihgfHGcbaC_
^]@>Z<;:987SRQP21MLK-IHG*(D&%$#"
!=<;:zy765u321r/.-,+*)iX&%$dS!~}
|{zy\wvutsUDConmlkjihgfedcFa`B1@
/[ZYXWVUTSRQPONM0K-zHGFEDCBA@?>=
<;{j87x543sb0/.-,+*)('&%$#"!b`O{
zyxZIutsrqSBQ@lkjihgIIdcba`B1j
Или так:
b'BA@?>=<;:987654321r`oo,llH('&%
ed"c~w|{z9'Z%utsrqponmlkjihgfedc
ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDC
BA@#>~~;|z8xwvuts10/.nm+*)i'&%fd
"ba`_^]yxwvXWsrqSonmPNjLKJIHGcba
`BA]\[=YXW:8T654321MLKJ,+GFE'CBA
$">~}|{zy7654ts10/o-,+lj(hgfedc!
~}|^]yxwYutsVTpRQPONMihgfHGcbaC_
^]@>Z<;:987SRQP21MLK-IHG*(D&%$#"
!=<;:zy765u321r/.-,+*)iX&%$dS!~}
|{zy\wvutsUDConmlkjihgfedcFa`B1@
/[ZYXWVUTSRQPONM0K-zHGFEDCBA@?>=
<;{j87x543sb0/.-,+*)('&%$#"!b`O{
zyxZIutsrqSBQ@lkjihgIIdcba`B1j
По понятным причинам установить какой вариант правильный не представляется возможным.. Вобщем, а вам слабо?)
ВОТ ЭТО БЛИН ТРУ ПРОГРАММИРОВАНИЕ=)
Еще пример можно посмотреть Тут

Вобщем, какие это у вас вызывает мысли?)

ПС. А исходник компилятора(Интерпретатора?) вот он..
[codebox]
/* Interpreter for Dis--Malbolge variant. */
/* '98 Ben Olmstead. */
/* */
/* Malbolge is the name of Dante's inner circle of Hell; Dis is his */
/* name for Hell's capital city. This interpreter isn't even */
/* Copylefted; I hereby place it in the public domain. Have fun... */
/* */
/* Note: in keeping with the idea that programming in Malbolge or Dis */
/* is meant to be hell, there is no debugger. */
/* */
/* By the way, this code assumes that short is 16 bits. I haven't */
/* seen any case where it isn't, but it might happen. If short is */
/* longer than 16 bits, it will still work, though it will take up */
/* considerably more memory. */
/* */
/* If you are compiling with a 16-bit Intel compiler, you will need */
/* >64K data arrays; this means using the HUGE memory model on most */
/* compilers, but MS C, as of 8.00, possibly earlier as well, allows */
/* you to specify a custom memory-model; the best model to choose in */
/* this case is /Ashd (near code, huge data), I think. Also, you */
/* will need to use the appropriate HUGE version of malloc. */

#include <stdio.h>
#include <ctype.h>
#include <malloc.h>

void exec( unsigned short *mem );

int main( int argc, char **argv )
{
FILE *f;
unsigned short i = 0, j;
int x;
unsigned short *mem;
if ( argc != 2 )
{
fprintf( stderr, "invalid command line\n" );
return ( 1 );
}
if ( ( f = fopen( argv[1], "r" ) ) == NULL )
{
fprintf( stderr, "can't open file\n" );
return ( 1 );
}
#ifdef _MSC_VER
mem = (unsigned short *)_halloc( 59049, sizeof(unsigned short) );
#else
mem = (unsigned short *)malloc( sizeof(unsigned short) * 59049 );
#endif
if ( mem == NULL )
{
fclose( f );
fprintf( stderr, "can't allocate memory\n" );
return ( 1 );
}
while ( ( x = getc( f ) ) != EOF )
{
switch ( x )
{
case '*':
case '^':
case '>':
case '|':
case '{':
case '}':
case '_':
case '!':
if ( i == 59049 )
{
fprintf( stderr, "input file too long\n" );
free( mem );
fclose( f );
return ( 1 );
}
mem[i++] = x;
break;
case '(':
while ( x != ')' )
{
x = getc( f );
if ( x == EOF )
{
fprintf( stderr, "unmatched (\n" );
free( mem );
fclose( f );
return ( 1 );
}
}
break;
default:
if ( !isspace( x ) )
{
fprintf( stderr, "input file contains invalid characters\n" );
free( mem );
fclose( f );
return ( 1 );
}
}
}
fclose( f );
while ( i < 59049 ) mem[i++] = 0;
exec( mem );
free( mem );
return ( 0 );
}

void exec( unsigned short *mem )
{
unsigned short a = 0, c = 0, d = 0, i, j;
int x;
static const unsigned short p3[10] =
{ 1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683 };
for (;;)
{
switch ( mem[c] )
{
case '*': d = mem[d]; break;
case '^': c = mem[d]; break;
case '>': a = mem[d] = mem[d] / 3 + mem[d] % 3 * 19683; break;
case '|':
i = 0;
for ( j = 0; j < 10; j++ )
i += ( a / p3[j] % 3 - mem[d] / p3[j] % 3 + 3 ) % 3 * p3[j];
a = mem[d] = i;
break;
case '{':
if ( a == 59048 ) return;
#if '\n' != 10
if ( x == 10 ) putchar( '\n' ); else
#endif
putchar( a );
break;
case '}':
x = getchar();
#if '\n' != 10
if ( x == '\n' ) a = 10; else
#endif
if ( x == EOF ) a = 59048; else a = x;
break;
case '!': return;
}
if ( c == 59048 ) c = 0; else c++;
if ( d == 59048 ) d = 0; else d++;
}
}

[/codebox]
ППС. Если интересно, могу много разных интересных яп повыкладывать(ну т.е. тупо выложить мои любимые из http://99-bottles-of-beer.net)
 

vital

Больной Компом Детектед
29.01.2006
2 432
34
#3
Видел и его) Автор выложенной мной мути отчасти на нем(в чатсности на нем) основывался(ну это написано на офф.сайте), и пишет, что эта штука сложнее.
Брэинфак тоже та еще муть.. Я пробовал читать по нему ман.. Вобщем не получилось=)
 

Kmet

Java Team
25.05.2006
1 036
8
#4
эх молодежь, настоящее программирование это когда на тублерах, да на джамперах =)
 

vital

Больной Компом Детектед
29.01.2006
2 432
34
#5
Ну.. Тумблеры и джамперы.. У меня вот сразу ассоциация: Оператор станка с ЧПУ(ну есть такая специальность.. там чувак типа сидит и кнопки нажимает, и станок делает детали сам. Ну как-то так)
Ну и касаемо времен до н.э (давайте точкой ноль примем время выхода OS/2) вообще не представляю.. Как это программировать на перфокартах, операционные системы писать себе самостоятельно.. Жестокое было время.
 
04.09.2006
2 566
3
#6
У меня вот сразу ассоциация: Оператор станка с ЧПУ(ну есть такая специальность.. там чувак типа сидит и кнопки нажимает, и станок делает детали сам. Ну как-то так)
У нас в универе был аппаратный эмулятор 8086, в который программа вводилась в машинном коде. Т.е. сначала на листике пишеш программу, потом для нее машинный код, потом на клавиатурке вводишь код в эмулятор. Потом программа выполняется. Если с первого раза получил правильный результат - можешь считать себя гуру. Если нет, то пара часов отладки на листике обеспечено
 

vital

Больной Компом Детектед
29.01.2006
2 432
34
#7
мм.. т.е. Сначала пишешь на асме программу, потом по какой-нить табличке переводишь в машинный код? Хм..
пара часов отладки на листике
А вот это кошмар. Тьфу-тьфу-тьфу не дай бог)
 
04.09.2006
2 566
3
#8
Сначала пишешь на асме программу, потом по какой-нить табличке переводишь в машинный код?
Да, именно так

Тьфу-тьфу-тьфу не дай бог)
Рисуешь на листочке ячейки памяти, регистры, что куда переносится, где что изменяется. Если с ассемблером все ок, то начинашь проверять перевод в машинный код. Потом пыток раз набиваешь код на эмулятор, т.к. эта собака не выдавала даже подтверждения нажатия клавиши :)
 

Kmet

Java Team
25.05.2006
1 036
8
#9
У нас в универе был аппаратный эмулятор 8086, в который программа вводилась в машинном коде. Т.е. сначала на листике пишеш программу, потом для нее машинный код, потом на клавиатурке вводишь код в эмулятор. Потом программа выполняется. Если с первого раза получил правильный результат - можешь считать себя гуру. Если нет, то пара часов отладки на листике обеспечено
у нас было прикольнее, не какой то там эмулатор, а реальная 4 битная железка, размером с шахматную доску. программировалась она посредством тумблеров. три группы тумблеров по четыре штуки - (команда и два опперанда), разрешение дисплея 1х12, т.е 12 светодиодов в ряд.
 
A

astronom

#12
а тублерах, да на джамперах =)
еще и водородную бомбу на этом просчитали.
Даже страшно представить, что сделали бы, например, создатели Фортрана на современных машинах :rolleyes:
 
A

astronom

#14
3. ENIAC (1946)
Когда ENIAC продемонстрировали в 1946 году, американская пресса немедленно окрестила его "Гигантский мозг" ("Giant Brain"). Это был первый универсальный электронный цифровой компьютер и, возможно, один из самых известных. Масса системы составляла 27 тонн. Помимо прочего, ENIAC использовали для вычислений, связанных с созданием водородной бомбы. Программирование могло занимать недели и требовало выполнения множества манипуляций с аппаратной структурой вручную
http://www.livejournal.ru/themes/id/17393
 
04.09.2006
2 566
3
#15
Более достоверные источники имеются?

Не находите, что ...
водородную бомбу на этом просчитали.
и
ENIAC использовали для вычислений, связанных с созданием водородной бомбы
... несколько разные вещи

Да и при производительности в "300 операций умножения или 5000 операций сложения в секунду" годна разве что для вспомогательных вычислений