2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 
Сообщение07.03.2009, 18:17 


21/03/06
1545
Москва
Цитата:
Кроме того, использовались метрики качества записи кода, типа: среднее число операторов в строке; среднее число строк комментариев на оператор; и т.п. Выход за рекомендованные границы таких параметров снижал "стоимость строки".

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

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

 Профиль  
                  
 
 
Сообщение07.03.2009, 18:47 
Заслуженный участник


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

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение13.08.2009, 06:30 
Заслуженный участник


26/07/09
1559
Алматы
2e2e4
Цитата:
Любой СИ-код можно уместить на 1-й строке по стандарту языка.

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

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение13.08.2009, 09:43 


21/03/06
1545
Москва
Препроцессорные директивы, ессесно, раскрыть и подставить в программу до того, как делать ее в одну строку. Про перевод строки я ничего в стандарте языка не слышал.

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

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

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

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

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

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение17.08.2009, 08:18 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
Препроцессорные директивы, ессесно, раскрыть и подставить в программу до того, как делать ее в одну строку.

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

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


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

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение17.08.2009, 08:38 


21/03/06
1545
Москва
Цитата:
Увы, так получится только с макроопределениями (#define), но ведь есть ещё #include, #if, etc...

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

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

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

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

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

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

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

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение17.08.2009, 09:04 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
И их тоже раскрыть. Вообще, запустить препрцессор, и работать с его выходным кодом.

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

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

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

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


21/03/06
1545
Москва
Занятно, занятно.

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение21.08.2009, 12:54 
Заслуженный участник
Аватара пользователя


11/03/08
9538
Москва
Я бы сказал не "ругательное", а "обсценное"...
А число операторов можно считать по ;
Обычно в текстах комментариев их мало, да и в строчных константах...

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение14.04.2011, 06:32 
Заслуженный участник


26/07/09
1559
Алматы
Прошу прощения за поднятие старой темы, но не мог пропустить такое...

Оказывается, тот 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 
Аватара пользователя


22/09/09

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

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

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

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

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

 Профиль  
                  
 
 Re: удалить комментарии из файла
Сообщение20.04.2011, 12:49 
Аватара пользователя


14/05/05
224
Баку
Регулярные выражения в руки и вперед! ;)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group