Malbolge

Тема в разделе "Свободное общение", создана пользователем vital, 19 авг 2009.

  1. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    ООП, уровни асбтракции от аппаратуры.. Знаете. Это все фигня=). Я тут нашел один язык программмирования.. Сам автор пишет:
    Заинтересовались?

    Вобщем, на просторах инета нашел три версии хелловорлда
    Это википедия:
    Это гугл:
    Или так:
    По понятным причинам установить какой вариант правильный не представляется возможным.. Вобщем, а вам слабо?)
    ВОТ ЭТО БЛИН ТРУ ПРОГРАММИРОВАНИЕ=)
    Еще пример можно посмотреть Тут

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

    ПС. А исходник компилятора(Интерпретатора?) вот он..
    [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)
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Не, настоящее программирование здесь: http://ru.wikipedia.org/wiki/Brainfuck
     
  3. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Видел и его) Автор выложенной мной мути отчасти на нем(в чатсности на нем) основывался(ну это написано на офф.сайте), и пишет, что эта штука сложнее.
    Брэинфак тоже та еще муть.. Я пробовал читать по нему ман.. Вобщем не получилось=)
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    эх молодежь, настоящее программирование это когда на тублерах, да на джамперах =)
     
  5. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Ну.. Тумблеры и джамперы.. У меня вот сразу ассоциация: Оператор станка с ЧПУ(ну есть такая специальность.. там чувак типа сидит и кнопки нажимает, и станок делает детали сам. Ну как-то так)
    Ну и касаемо времен до н.э (давайте точкой ноль примем время выхода OS/2) вообще не представляю.. Как это программировать на перфокартах, операционные системы писать себе самостоятельно.. Жестокое было время.
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    У нас в универе был аппаратный эмулятор 8086, в который программа вводилась в машинном коде. Т.е. сначала на листике пишеш программу, потом для нее машинный код, потом на клавиатурке вводишь код в эмулятор. Потом программа выполняется. Если с первого раза получил правильный результат - можешь считать себя гуру. Если нет, то пара часов отладки на листике обеспечено
     
  7. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    мм.. т.е. Сначала пишешь на асме программу, потом по какой-нить табличке переводишь в машинный код? Хм..
    А вот это кошмар. Тьфу-тьфу-тьфу не дай бог)
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Да, именно так

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    у нас было прикольнее, не какой то там эмулатор, а реальная 4 битная железка, размером с шахматную доску. программировалась она посредством тумблеров. три группы тумблеров по четыре штуки - (команда и два опперанда), разрешение дисплея 1х12, т.е 12 светодиодов в ряд.
     
  10. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    о боже.. Камменный век...)
     
  11. kaagreen

    kaagreen Гость

    ...и когда-то этим активно пользовались :)
     
  12. astronom

    astronom Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Что за бред...
     
  14. astronom

    astronom Гость

    http://www.livejournal.ru/themes/id/17393
     
  15. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Более достоверные источники имеются?

    Не находите, что ...
    и
    ... несколько разные вещи

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

Поделиться этой страницей