Синтаксис ужасный: бесконечные begin-end, точки с запятыми просто везде, переменные нельзя посреди функции объявить, длинные ключевые слова и тд. Сами компиляторы FreePascal и Delphi в целом неплохо выглядят по функционалу, жалко, что эти комьюнити идут по пути улучшения тулинга и толком не улучшают язык.
Перфокарты это святое. Помню в детстве где они только не использовались, и коробочки из них делали, и закладки, и кулинарные рецепты на них писали, и в библиотечном каталоге они же были, и, как писал Крис Касперски: "Почему так легко представить хакера, поклоняющегося дырке в перфокарте, и так трудно, поклоняющегося Windows" (цитирую по памяти) --- Сообщение объединено, 9 июл 2022 --- TrashGen, ну это как "Чтобы купить что-то ненужное, нужно сначала продать что-то ненужное"
Дело вкуса, но он "ужасен" и у многих Алгол последовавших языков и нет нормальных вариантов, как в Форт, программировать без связи формальных и фактических параметров функций парадигмы конкатенативных языков https://concatenative.org
Вообще, идеальный язык это Lisp, так как он создан самим Господом Б-гом и вся Вселенная написана именно на нём. Утверждать, что какой-то язык лучше Лиспа есть сущее богохульство!
Да, но только скобок для его создания понадобилось очень много. На лурке в статье по Форт есть сравнение языков с точки зрения отношения к скобкам. P.S. Про покупку-продажу не наоборот в оригинале? т.к. следующая фраза @"А, у нас денег нет" от кота Матроскина.
нет, ну не обязательно же покупать лично покупателю. покупателем может выступать тот у кого есть шекель, допустим. покупатель может тупо в почтовый ящик нуждающемуся набросать шекелей. если бы у меня было миллион денег я бы сейчас весь его раздал по тысяче тысяче нуждающихся, если бы был уверен, что они именно нуждаются, а не пойдут и пробухают этот рубль)
Ну так то да, но смысл продать у них там именно в том, чтобы купить. Для создания скобок то и не понадобилось, изначально он был в машинных кодах написан. А вот потребовал да, много. Я думаю, в этом скрыта какая-то важная истина.
если кто то сомневаеццо в том, шо тращген и не думает шутить и жадничать, и для тех, кто просто забыл и\или не видел по болезни^^
Вот вот, о чём и речь, продавать может оказаться и не обязательно, если найдётся тот, кто шекелей в почтовый ящик набросает. Но вот что дальше тот рубль будет потрачен, этого никто не отменял. Хотя, конечно, в Торе и сказанно: "Треть зарой в землю, треть пусти в дело, на треть живи"
ну да. жить на минималках одним днем вот уже с месяц как моё кредо, бро) не жалуюсь. это стезя, которую я принимаю и хоярю по ней как птица с перебитыми крыльями и сломанными ногами. нисколько себя не жаль в этом, зачем я вообще нужен однавосьмимиллиардная пылинка, если буду жить для себя и лишь ради этого? --- Сообщение объединено, 9 июл 2022 --- не говорил, вродебы, хотел развестись и поменять дом на собаку, чтобы освободить целых 2 живых существа от клеток: себя и собаку) жона чото не согласилась и так и оставляет нас обоих в ненужном нам уже рабстве язык тут прикольный порекомендовали, только не знаю пока что с ним делать)
Ада, например, куда лучше, при этом она развивается, а не стагнирует, хоть и нужна очень малому количеству айти сфер. В каком-то смысле даже Ruby можно считать последователем Алгола через несколько других языков. Единственные более менее современные Форты - это 8th и Factor, да и то сейчас сложно представить человека, которых их выберет для какого-либо программного проекта, даже на эмбеддед системах уже давно всякие микропетоны и джаваскрипты работают. С этим сложно спорить, можно посмотреть хотя бы на Racket, который позволяет любой синтаксис наложить поверх sexpr.
8-th и Factor всё же не Форт в классике его понимания и построения. Есть, конечно, ещё какие то варианты, но без целевой программы их включения в программы изучения какой то тематики, продвижения в этом направлении, конечно же, не будет. Вот и для Вас слова Forth (Форт) всего лишь пустые звуки. --- Сообщение объединено, 9 июл 2022 --- A Racket-based Forth / Macro Assembler on steroids for PIC18F https://github.com/zwizwa/staapl
Дельфи лепит код из паттернов (как выяснилось гцц делает так же, но умеет при -O3 кое-как свернуть его до чего-то более-менее приличного), а дельфи оставляет за собой такое: Код (Text): .004B0F00 8A86 05050000 mov al,byte ptr ds:[esi+505] .004B0F06 34 01 xor al,1 .004B0F08 8886 05050000 mov byte ptr ds:[esi+505],al ;BYTE[esi+505]^=1, 14 байт, 'xor byte ptr ds:[esi+505],1'={80B6 05050000 01}, 7 байт .004B0F0E 33DB xor ebx,ebx .004B0F10 8D7D FE lea edi,dword ptr ss:[ebp-2] .004B0F13 8B86 EC010000 mov eax,dword ptr ds:[esi+1EC] ;значение eax хоронится, смысла значению оставаться в регистре не было, нет оправданий. Дурная примета, когда компилер можно узнать по почерку. Это навскидку, первое что попалось на глаза. Весь дельфяшный код изобилует перегруженностью и бредом. Вероятно это не главная причина почему исполняемые файлы весят адовы мегабайты, но одна из них.
f13nd, видишь, везде есть плюсы и минусы; стандартом в малвари (имею ввиду, настоящую, а не школостилеры) было всегда кодить на Асм/Си, это круто, но в итоге выходит идеальный чистый код - который легко открыть в Ида даже школьнику. А дельфи , да еще если добавить какой-то мусор, то уже сам по себе как обфускатор.
Так и с дельфи проблем нету, декомпилер школьника об него не сломается. Это старое доброе "купи себе кампуцер пошире, чтоб все влазило". С таким подходом вообще никакой разницы между компилерами нету, бери любой, не забудь пожать UPX'ом.
Интересно, а как в IDA будет представлен такой код минимального "Форт" на Си? и понимаем ли он при этом столкнувшемуся с ним? Спойлер // gcc forth.c -o forth #include <stdio.h> #include <string.h> // Main Memory char memory[100000]; char *mem = memory; // Dictionary entry type typedef struct { char name[100]; void* code; } dict_t; #define ALLOC(x) \ mem; \ memcpy(mem, (char*)&(x), sizeof(x)); \ mem += sizeof(x); \ #define DEFINE(x,y) \ (*dsp); \ strcpy((*dsp)->name, x); \ (*dsp)->code = y; \ (*dsp)++; \ #define NEXT \ (*ip)++; \ goto ***(ip); \ int main() { /* Pointers */ void **instruction_pointer; void ***ip = (void ***)ALLOC(instruction_pointer); long *stack_pointer; long **sp = (long **)ALLOC(stack_pointer); void **return_stack_pointer; void ***rsp = (void ***)ALLOC(return_stack_pointer); dict_t *dictionary_stack_pointer; dict_t **dsp = (dict_t **)ALLOC(dictionary_stack_pointer); /* Stacks */ long stack[10]; *sp = (long *)ALLOC(stack); void *return_stack[10]; *rsp = (void **)ALLOC(return_stack); dict_t dictionary_stack[10]; *dsp = (dict_t *)ALLOC(dictionary_stack); /* Memory */ char code[] = "ok>"; void *cp = code; dict_t *bye = (dict_t *)DEFINE("bye", &&bye); dict_t *lookup = (dict_t *)DEFINE("lookup", &&lookup); dict_t *ok = (dict_t *)DEFINE("ok", &&ok); void *word[] = { lookup->code, ok->code, bye->code }; *ip = (word)-1; NEXT; return 0; ok: puts(code); gets(code); puts(code); NEXT; bye: puts("bye"); return 0; lookup: puts("Run Code"); NEXT; } Или такой Не минималистический Форт с расширением объектами (C++) Или такой Небольшой проект "Си" то Forth сделанный с использованием парсера Bison ... Другие Форт реализации коих туева куча. Как такой проект Форта,, где основное тело системы загружается как оверлей ... BCForth в иллюстрации к материалу книги Introduction to Programming with C++ for Engineers
В сообщениях от Ethereal на киберфоруме есть в одном посте где он предлагает для усложнения реверса использовать шитый код (для приемлемомой скорости его выполнения) Форта - фактически прыжки на команды виртуальной машины и предполагает, что даже в размере файла 300Кб его реверс будет очень затратной задачей для понимания логики программы. Там же увидел его сообщение в одном треде как он "взломал" защиту Cerber под DOS. Интересно, что уже около года он не постил сообщений на этом форуме. P.S. А, не кажется ли модераторам форума, что текущее обсуждение немного отклонилось от темы топика?
Такие алгоритмы условно называются Control Flow Flattening, часто его делают через switch или через шитый код, если компилятор позволяет его собирать, или вставлять асм вставки.