2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 
Сообщение07.03.2009, 18:17 
Цитата:
Кроме того, использовались метрики качества записи кода, типа: среднее число операторов в строке; среднее число строк комментариев на оператор; и т.п. Выход за рекомендованные границы таких параметров снижал "стоимость строки".

ИМХО, попытка эмпирически оценить то, что в принципе малооценимо. Я понимаю, задача ведь составить план, а там хоть трава не расти :).

Об этом подробно и довольно интересно написано в книге Ф. Брукса "Мифический человеко-месяц или как создаются программные системы".

 
 
 
 
Сообщение07.03.2009, 18:47 
e2e4 писал(а):
Я понимаю, задача ведь составить план, а там хоть трава не расти :).
Совершенно верно.
Задача - составить план, выполнить его и получить такой код, чтобы сам автор был в состоянии разобраться в нем через полгода. А если еще и его коллега сможет разобраться, то это просто супер-код.
А там - хоть трава не расти. :)

 
 
 
 Re: удалить комментарии из файла
Сообщение13.08.2009, 06:30 
2e2e4
Цитата:
Любой СИ-код можно уместить на 1-й строке по стандарту языка.

Не совсем так. Есть препроцессор, одна директива на строку. Кроме того в конце файла должен лишний перевод строки быть (хотя и не обязательно).

 
 
 
 Re: удалить комментарии из файла
Сообщение13.08.2009, 09:43 
Препроцессорные директивы, ессесно, раскрыть и подставить в программу до того, как делать ее в одну строку. Про перевод строки я ничего в стандарте языка не слышал.

-- Чт авг 13, 2009 09:48:10 --

Вообще-то была у меня когда-то ситуация, когда сильно захотелось провести такую процедуру:
1. Убрать комментарии;
2. Раскрыть препроцессорные директивы
3. Переименовать все переменные в что-то типа hnbe4hfb9,cbq8dj,nuwir9 и т.п.
4. Запихнуть все в один файл в одну сроку.
5. Убрать все пробелы, насовать точек с запятой и запятых там, где только допустимо.

Результат:
заказчик получает компилируемый и работающий си-код, я получаю моральное удовлетворение от того, что он потратит дополнительные силы к его приведению в человеческий вид для внесения изменений, де-юре условия контракта соблюдены.

Да, зол я тогда был на заказчика :).

P.S. плюнул и договорился полюбовно тогда, чего всем советую :).

 
 
 
 Re: удалить комментарии из файла
Сообщение17.08.2009, 08:18 
Цитата:
Препроцессорные директивы, ессесно, раскрыть и подставить в программу до того, как делать ее в одну строку.

Увы, так получится только с макроопределениями (#define), но ведь есть ещё #include, #if, etc...

2e2e4
Цитата:
Вообще-то была у меня когда-то ситуация, когда сильно захотелось провести такую процедуру...


Это называется обфускацией кода. То, что вы делали -- это ещё детские шалости, я вот видел одного кодера, который меняя идентификаторы превращал код в ASCII-Art. Правда он тоже не слишком оригинальничал -- в мире Perl-программирования ещё и не такое бывало. Забавно...

 
 
 
 Re: удалить комментарии из файла
Сообщение17.08.2009, 08:38 
Цитата:
Увы, так получится только с макроопределениями (#define), но ведь есть ещё #include, #if, etc...

И их тоже раскрыть. Вообще, запустить препрцессор, и работать с его выходным кодом.

Цитата:
Это называется обфускацией кода.

Запомню это ругательное слово :)

Цитата:
То, что вы делали -- это ещё детские шалости

Я не делал, я только хотел сделать. Все обошлось :).

Цитата:
я вот видел одного кодера, который меняя идентификаторы превращал код в ASCII-Art.

Это не слишком сложно и легко алгоритмизируется ИМХО.

 
 
 
 Re: удалить комментарии из файла
Сообщение17.08.2009, 09:04 
Цитата:
И их тоже раскрыть. Вообще, запустить препрцессор, и работать с его выходным кодом.

Кажется с раскрытием #pragma все равно проблема остается...

Цитата:
Это не слишком сложно и легко алгоритмизируется ИМХО.

Cf. http://www.cpan.org/misc/japh, без конопли, кажется, не обошлось...

 
 
 
 Re: удалить комментарии из файла
Сообщение18.08.2009, 08:47 
Занятно, занятно.

 
 
 
 Re: удалить комментарии из файла
Сообщение21.08.2009, 12:54 
Аватара пользователя
Я бы сказал не "ругательное", а "обсценное"...
А число операторов можно считать по ;
Обычно в текстах комментариев их мало, да и в строчных константах...

 
 
 
 Re: удалить комментарии из файла
Сообщение14.04.2011, 06:32 
Прошу прощения за поднятие старой темы, но не мог пропустить такое...

Оказывается, тот perl-верблюд это ещё цветочки... Честно говоря, раньше не обращал внимания на такой вот замечательный старый конкурс обфускации C-кода: http://www.ioccc.org/.

Это нечто... Ну посудите сами, вот например такая программка на C там есть:

Код:
X=1024; Y=768; A=3;
J=0;K=-10;L=-7;M=1296;N=36;O=255;P=9;_=1<<15;E;S;C;D;F(b){E="1""111886:6:??AAF"
"FHHMMOO55557799@@>>>BBBGGIIKK"[b]-64;C="C@=::C@@==@=:C@=:C@=:C5""31/513/5131/"
"31/531/53"[b ]-64;S=b<22?9:0;D=2;}I(x,Y,X){Y?(X^=Y,X*X>x?(X^=Y):0,  I (x,Y/2,X
)):(E=X);      }H(x){I(x,    _,0);}p;q(        c,x,y,z,k,l,m,a,          b){F(c
);x-=E*M     ;y-=S*M           ;z-=C*M         ;b=x*       x/M+         y*y/M+z
*z/M-D*D    *M;a=-x              *k/M     -y*l/M-z        *m/M;    p=((b=a*a/M-
b)>=0?(I    (b*M,_      ,0),b    =E,      a+(a>b      ?-b:b)):     -1.0);}Z;W;o
(c,x,y,     z,k,l,    m,a){Z=!    c?      -1:Z;c     <44?(q(c,x         ,y,z,k,
l,m,0,0     ),(p>      0&&c!=     a&&        (p<W         ||Z<0)          )?(W=
p,Z=c):     0,o(c+         1,    x,y,z,        k,l,          m,a)):0     ;}Q;T;
U;u;v;w    ;n(e,f,g,            h,i,j,d,a,    b,V){o(0      ,e,f,g,h,i,j,a);d>0
&&Z>=0? (e+=h*W/M,f+=i*W/M,g+=j*W/M,F(Z),u=e-E*M,v=f-S*M,w=g-C*M,b=(-2*u-2*v+w)
/3,H(u*u+v*v+w*w),b/=D,b*=b,b*=200,b/=(M*M),V=Z,E!=0?(u=-u*M/E,v=-v*M/E,w=-w*M/
E):0,E=(h*u+i*v+j*w)/M,h-=u*E/(M/2),i-=v*E/(M/2),j-=w*E/(M/2),n(e,f,g,h,i,j,d-1
,Z,0,0),Q/=2,T/=2,       U/=2,V=V<22?7:  (V<30?1:(V<38?2:(V<44?4:(V==44?6:3))))
,Q+=V&1?b:0,T                +=V&2?b        :0,U+=V    &4?b:0)     :(d==P?(g+=2
,j=g>0?g/8:g/     20):0,j    >0?(U=     j    *j/M,Q      =255-    250*U/M,T=255
-150*U/M,U=255    -100    *U/M):(U    =j*j     /M,U<M           /5?(Q=255-210*U
/M,T=255-435*U           /M,U=255    -720*      U/M):(U       -=M/5,Q=213-110*U
/M,T=168-113*U    /       M,U=111               -85*U/M)      ),d!=P?(Q/=2,T/=2
,U/=2):0);Q=Q<    0?0:      Q>O?     O:          Q;T=T<0?    0:T>O?O:T;U=U<0?0:
U>O?O:U;}R;G;B    ;t(x,y     ,a,    b){n(M*J+M    *40*(A*x   +a)/X/A-M*20,M*K,M
*L-M*30*(A*y+b)/Y/A+M*15,0,M,0,P,  -1,0,0);R+=Q    ;G+=T;B   +=U;++a<A?t(x,y,a,
b):(++b<A?t(x,y,0,b):0);}r(x,y){R=G=B=0;t(x,y,0,0);x<X?(printf("%c%c%c",R/A/A,G
/A/A,B/A/A),r(x+1,y)):0;}s(y){r(0,--y?s(y),y:y);}main(){printf("P6\n%i %i\n255"
"\n",X,Y);s(Y);}


Между прочим, это вполне работоспособный рейтрэйсер; медленный, но работает, с выдачей красивой картинки (после компиляции, выполните ./raytracer > image.ppm).

А вот это -- маленькая OCR-программа. Данные подаются на стандарный ввод в виде ascii-графики; правда, она умеет распознавать только числа от 8 до 11 (учитывается только топология, так что цифры можно рисовать повернутыми), но все-равно интересно, особенно с учетом размера её кода:

Код:
main(O){int I,Q,l=O;if(I=l*4){l=6;if(l>5)l+=Q-8?l-(Q=getchar()-2)%2:l;if(Q*=2)O+="has dirtiest IF"[(I/-Q&12)-l/Q%4];}printf("%d\n",8+O%4);}


К примеру, ей на вход можно подать что-нибудь такое:

Код:
#   #%#
$#  $   &
*  #    |
#  #   $
;#$  @##




И ещё много чего в том же духе есть; ну, скажем, тоже такой же маленький, но почти полноценный web-сервер с поддержкой cgi-скриптов (hibachi.c за 2004 г.) или 32-разрядная многозадачная ОС с графическим пользовательским интерфесом, файловой системой, поддержкой исполняемых программ и клавиатуры с мышкой (gavin.c за тот же год). Ага и всё это тоже вот так вот оформлено, абсолютно нечитабельно. :)

 
 
 
 Re: удалить комментарии из файла
Сообщение18.04.2011, 02:10 
Аватара пользователя
Это стандартная задача, которая решается во всех компиляторах. Считываем текст символ за символом:
1) если встречается начало комментария, то удалять, пока не конец комментария;
2) если встречается символ начала строковой константы (кавычка), то пропускать сохраняя, пока не встретится закрывающий символ (кавычка) - при этом две повторяющиеся друг за другом кавычки закрывающим символом не считаются.
Например, символом начала комментария м.б. скобка {, а конца - скобка }.
Смысл этого алгоритма в том, что как только пошел комментарий по условию (1), кавычки игнорируются, а как только пошла строка по условию (2), символы комментариев игнорируются. Небольшое усложнение в том, что комментарии могут быть обозначены двумя или более символами. Приведенный алгоритм стоит усложнить еще одним правилом: 3) символ(ы) конца комментария, если им предшествует кавычка, за таковые не считаются. Например, видел парсеры Паскаля, которые выдавали ошибку на такой комментарий:

{комментарий 'хи-хи}' и только тут его конец:}

Отметим, что внутри строковых констант комментарии недопустимы:

'это не {комментарий}{}, а строка}{, конец которой следует тут:'

В классических книгах (Н.Вирт, П.Грогоно и др.) есть примеры реализации в исх.коде (нпр., на Паскале). В сетке можно разыскать и скачать исходные коды простых компиляторов/интерпретаторов и посмотреть, как там это реализовано. Однако не все так просто, на практике часто бывает необходимо закомментировать фрагмент кода, уже имеющий комментарии, в результате получается конструкция:
{
код {комментарий}
код {комментарий}
}
Многие компиляторы на это обижаются. В Delphi, например, для таких целей используют:
(*
код {комментарий}
код {комментарий}
*)
Не исключаю, что большинство современных IDE можно запутать, но подсветка синтаксиса спасает от некорректного комментирования. Hope it helps! :-)

 
 
 
 Re: удалить комментарии из файла
Сообщение20.04.2011, 12:49 
Аватара пользователя
Регулярные выражения в руки и вперед! ;)

 
 
 [ Сообщений: 27 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group