Knowledge Team





CLOC – Gróf riadkov kódu

Pôvodne na adrese http://cloc.sourceforge.net/

CLOC

Prehľad

cloc broji prazne redove, redove sa komentarima i fizičke redove izvornog koda u mnogim programskim jezicima . S obzirom na dve verzije osnove koda, cloc može da izračuna razlike u praznim redovima, komentarima i izvornim redovima. Napisan je potpuno u Perl-u, bez povezanosti van standardne distribucije Perl v5.6 i više (kod iz nekih eksternih modula je ugrađen u cloc ) tako da je sasvim prenosiv. Poznato je da cloc funkcioniše na mnogim dodatnim programima (flavorima) Linuxa, Mac OS X, AIX, Solarisa, IRIX, z/OS-a, i Windowsa (da biste pokrenuli Perl izvornu verziju cloc-a na Windowsu potreban je ActiveState Perl 5.6.1 ili više, Cygwin ili MobaXTerm sa instaliranim Perl dodatnim modulom. Alternativno se može koristiti Windows binarni kod cloc-a generisan pomoću perl2exe za rad na Windows kompjuterima koji nemaju ni Perl ni Cygwin).

cloc sadrži kod SLOCCount Davida Wheelera, Perl module Regexp::Common Damiana Conwaya i Abigail, Perl module Win32::Autoglob Seana M. Burkea i Perl module Algorithm::Diff Tyea McQueena. Jezički faktori razmene dolaze sa web sajta kompanije Mayes Consulting, LLC – http://softwareestimator.com/IndustryData2.htm .

Licencie

cloc je licenciran pod GNU Opštom javnom licencom , v2, isključujući delove koji su kopirani iz drugih izvora. Kod kopiran iz Regexp::Common, Win32::Autoglob i Algorithm::Diff Perl modula podleže Artističkoj Licenci.

Rаzlozi za korišćenje cloc-a

cloc poseduje mnoge karakteristike koje olakšavaju njegovu upotrebu, temeljan je, proširiv i prenosiv:

  1. Postoji kao jedinstven, samosadržani fajl koji zahteva minimum napora za instaliranje — samo preuzmite fajl i pokrenite ga;
  2. Može čitati definicije o jezičkim komentarima i na taj način eventualno raditi sa kompjuterskim jezicima koji još ne postoje;
  3. Оmogućava da se rezultati iz višestrukog izvršavanja sumiraju u jeziku i u projektu;
  4. Može proizvoditi rezultate u različitim formatima: običan tekst, SQL, XML, YAML, vrednosti odvojene zarezom;
  5. Može čitati kod u okviru kompresovane arhive (tar format, zipovane fajlove, Java .ear fajlove);
  6. Ima brojne opcije za otkrivanje i rešavanje grešaka;
  7. Upravlja imenima fajlova i direktorijuma koji imaju razmak u sebi, i drugim neobičnim karakterima;
  8. Nema povezanosti van standardne distribucije Perl-a;
  9. Radi na Linuxu, FreeBSD-u, NetBSD-u, Mac OS X, AIX-u, HP-UX, Solarisu, IRIX-u i z/OS sistemima koji imaju Perl 5.6 ili više. Izvorna verzija radi u Windowsu ili sa ActiveState Perlom ili cygwin-om.

Ostali brojači

Ako cloc ne odgovara vašim potrebama, evo drugih besplatnih brojača koje možete razmotriti:

Оstale reference:

Regexp::Common, Digest::MD5, Win32::Autoglob, Algorithm::Diff

Iako cloc ne zahteva Perl module van onih koji se nalaze u standradnoj distribuciji, cloc se oslanja na nekoliko eksternih modula. Kod iz tri od tih eksternih modula –Regexp::Common, Win32::Autoglob i Algorithm::Diff – ugrađeni su u cloc. Četvrti modul, Digest::MD5, koristi se samo ako je dostupan. Ako cloc pronađe Regexp::Common ili Algorithm::Diff instalirane lokalno, koristiće te instalacije. Ako ne nađe, cloc će instalirati delove Regexp::Common i/ili Algorithm:Diff koji su mu potrebni u direktorijumima koji se kreiraju na početku pokretanja cloc-a, a koji se zatim uklone kada se pokretanje završi. Neophodan kod iz Regexp::Common v2.120 i Algorithm::Diff v1.1902 ugrađuje se u cloc izvorni kod (vidi potprograme Install_Regexp_Common() i Install_Algorithm_Diff() ). Samo su tri reda potrebna iz Win32::Autoglob, a oni se direktno uključuju u cloc.

Takođe, cloc će upotrebiti Digest::MD5 da potvrdi jedinstvenost među fajlovima inputa, ako je Digest::MD5 instaliran lokalno. Ako Digest::MD5 ne pronađe, provera jedinstvenosti se preskače.

Windows binarni kod je izgrađen na kompjuteru koji ima i Regexp::Common i Digest::MD5 instalirane lokalno.

Osnovna upotreba

cloc je program komandne linije koji uzima imena fajlova, direktorijuma i/ili arhiva kao inpute. Evo primera izvršavanja cloc-a uz Perl v5.10.0 distribuciju izvora:

prompt> cloc perl-5.10.0.tar.gz 4076 text files. 3883 unique files. 1521 files ignored. http://cloc.sourceforge.net v 1.50 T=12.0 s (209.2 files/s, 70472.1 lines/s) ——————————————————————————- Language files blank comment code ——————————————————————————- Perl 2052 110356 130018 292281 C 135 18718 22862 140483 C/C++ Header 147 7650 12093 44042 Bourne Shell 116 3402 5789 36882 Lisp 1 684 2242 7515 make 7 498 473 2044 C++ 10 312 277 2000 XML 26 231 0 1972 yacc 2 128 97 1549 YAML 2 2 0 489 DOS Batch 11 85 50 322 HTML 1 19 2 98 ——————————————————————————- SUM: 2510 142085 173903 529677 ——————————————————————————-

Dа biste pokrenuli cloc na Windows kompjuterima, morate prvo otvoriti komandni (tzv. DOS) prozor i pozvati cloc.exe iz komandne linije.

Оpcije

prompt> cloc Usage: cloc [options] <file(s)/dir(s)> | <set 1> <set 2> | <report files> Count, or compute differences of, physical lines of source code in the given files (may be archives such as compressed tarballs or zip files) and/or recursively below the given directories. Input Options –extract-with=<cmd> This option is only needed if cloc is unable to figure out how to extract the contents of the input file(s) by itself. Use <cmd> to extract binary archive files (e.g.: .tar.gz, .zip, .Z). Use the literal ‘>FILE<‘ as a stand-in for the actual file(s) to be extracted. For example, to count lines of code in the input files gcc-4.2.tar.gz perl-5.8.8.tar.gz on Unix use –extract-with=’gzip -dc >FILE< | tar xf -‘ or, if you have GNU tar, –extract-with=’tar zxf >FILE<‘ and on Windows use: –extract-with=”\”c:\Program Files\WinZip\WinZip32.exe\” -e -o >FILE< .” (if WinZip is installed there). –list-file=<file> Take the list of file and/or directory names to process from <file> which has one file/directory name per line. See also –exclude-list-file. –unicode Check binary files to see if they contain Unicode expanded ASCII text. This causes performance to drop noticably. Processing Options –autoconf Count .in files (as processed by GNU autoconf) of recognized languages. –by-file Report results for every source file encountered. –by-file-by-lang Report results for every source file encountered in addition to reporting by language. –diff <set1> <set2> Compute differences in code and comments between source file(s) of <set1> and <set2>. The inputs may be pairs of files, directories, or archives. Use –diff-alignment to generate a list showing which file pairs where compared. See also –ignore-case, –ignore-whitespace. –follow-links [Unix only] Follow symbolic links to directories (sym links to files are always followed). –force-lang=<lang>[,<ext>] Process all files that have a <ext> extension with the counter for language <lang>. For example, to count all .f files with the Fortran 90 counter (which expects files to end with .f90) instead of the default Fortran 77 counter, use –force-lang=”Fortran 90″,f If <ext> is omitted, every file will be counted with the <lang> counter. This option can be specified multiple times (but that is only useful when <ext> is given each time). See also –script-lang, –lang-no-ext. –ignore-whitespace Ignore horizontal white space when comparing files with –diff. See also –ignore-case. –ignore-case Ignore changes in case; consider upper- and lower- case letters equivalent when comparing files with –diff. See also –ignore-whitespace. –lang-no-ext=<lang> Count files without extensions using the <lang> counter. This option overrides internal logic for files without extensions (where such files are checked against known scripting languages by examining the first line for #!). See also –force-lang, –script-lang. –read-binary-files Process binary files in addition to text files. This is usually a bad idea and should only be attempted with text files that have embedded binary data. –read-lang-def=<file> Load from <file> the language processing filters. (see also –write-lang-def) then use these filters instead of the built-in filters. –script-lang=<lang>,<s> Process all files that invoke <s> as a #! scripting language with the counter for language <lang>. For example, files that begin with #!/usr/local/bin/perl5.8.8 will be counted with the Perl counter by using –script-lang=Perl,perl5.8.8 The language name is case insensitive but the name of the script language executable, <s>, must have the right case. This option can be specified multiple times. See also –force-lang, –lang-no-ext. –sdir=<dir> Use <dir> as the scratch directory instead of letting File::Temp chose the location. Files written to this location are not removed at the end of the run (as they are with File::Temp). –skip-uniqueness Skip the file uniqueness check. This will give a performance boost at the expense of counting files with identical contents multiple times (if such duplicates exist). –stdin-name=<file> Give a file name to use to determine the language for standard input. –strip-comments=<ext> For each file processed, write to the current directory a version of the file which has blank lines and comments removed. The name of each stripped file is the original file name with .<ext> appended to it. It is written to the current directory unless –original-dir is on. –original-dir [Only effective in combination with –strip-comments] Write the stripped files to the same directory as the original files. –sum-reports Input arguments are report files previously created with the –report-file option. Makes a cumulative set of results containing the sum of data from the individual report files. –unix Override the operating system autodetection logic and run in UNIX mode. See also –windows, –show-os. –windows Override the operating system autodetection logic and run in Microsoft Windows mode. See also –unix, –show-os. Filter Options –exclude-dir=<D1>[,D2,] Exclude the given comma separated directories D1, D2, D3, et cetera, from being scanned. For example –exclude-dir=.cache,test will skip all files that have /.cache/ or /test/ as part of their path. Directories named .bzr, .cvs, .hg, .git, and .svn are always excluded. –exclude-ext=<ext1>[,<ext2>[…]] Do not count files having the given file name extensions. –exclude-lang=<L1>[,L2,] Exclude the given comma separated languages L1, L2, L3, et cetera, from being counted. –exclude-list-file=<file> Ignore files and/or directories whose names appear in <file>. <file> should have one entry per line. Relative path names will be resolved starting from the directory where cloc is invoked. See also –list-file. –match-f=<regex> Only count files whose basenames match the Perl regex. For example –match-f=^[Ww]idget only counts files that start with Widget or widget. –not-match-f=<regex> Count all files except those whose basenames match the Perl regex. –match-d=<regex> Only count files in directories matching the Perl regex. For example –match-d=/src/ only counts files in directories containing /src/ –not-match-d=<regex> Count all files except those in directories matching the Perl regex. –skip-win-hidden On Windows, ignore hidden files. Debug Options –categorized=<file> Save names of categorized files to <file>. –counted=<file> Save names of processed source files to <file>. –diff-alignment=<file> Write to <file> a list of files and file pairs showing which files were added, removed, and/or compared during a run with –diff. This switch forces the –diff mode on. –help Print this usage information and exit. –found=<file> Save names of every file found to <file>. –ignored=<file> Save names of ignored files and the reason they were ignored to <file>. –print-filter-stages Print to STDOUT processed source code before and after each filter is applied. –show-ext[=<ext>] Print information about all known (or just the given) file extensions and exit. –show-lang[=<lang>] Print information about all known (or just the given) languages and exit. –show-os Print the value of the operating system mode and exit. See also –unix, –windows. -v[=<n>] Verbose switch (optional numeric value). –version Print the version of this program and exit. –write-lang-def=<file> Writes to <file> the language processing filters then exits. Useful as a first step to creating custom language definitions (see –read-lang-def). Output Options –3 Print third-generation language output. (This option can cause report summation to fail if some reports were produced with this option while others were produced without it.) –progress-rate=<n> Show progress update after every <n> files are processed (default <n>=100). Set <n> to 0 to suppress progress output (useful when redirecting output to STDOUT). –quiet Suppress all information messages except for the final report. –report-file=<file> Write the results to <file> instead of STDOUT. –out=<file> Synonym for –report-file=<file>. –csv Write the results as comma separated values. –csv-delimiter=<C> Use the character <C> as the delimiter for comma separated files instead of ,. This switch forces –csv to be on. –sql=<file> Write results as SQL create and insert statements which can be read by a database program such as SQLite. If <file> is -, output is sent to STDOUT. –sql-project=<name> Use <name> as the project identifier for the current run. Only valid with the –sql option. –sql-append Append SQL insert statements to the file specified by –sql and do not generate table creation statements. Only valid with the –sql option. –sum-one For plain text reports, show the SUM: output line even if only one input file is processed. –xml Write the results in XML. –xsl=<file> Reference <file> as an XSL stylesheet within the XML output. If <file> is 1 (numeric one), writes a default stylesheet, cloc.xsl (or cloc-diff.xsl if –diff is also given). This switch forces –xml on. –yaml Write the results in YAML.

Prepoznati jezici

prompt> cloc –show-lang ABAP (abap) ActionScript (as) Ada (ada, adb, ads, pad) ADSO/IDSM (adso) AMPLE (ample, dofile, startup) ASP (asa, asp) ASP.Net (asax, ascx, asmx, aspx, config, master, sitemap, webinfo) Assembly (asm, S, s) AutoHotkey (ahk) awk (awk) Bourne Again Shell (bash) Bourne Shell (sh) C (c, ec, pgc) C Shell (csh, tcsh) C# (cs) C++ (C, cc, cpp, cxx, pcc) C/C++ Header (H, h, hh, hpp) CCS (ccs) Clojure (clj) ClojureScript (cljs) CMake (CMakeLists.txt) COBOL (cbl, CBL, cob, COB) CoffeeScript (coffee) ColdFusion (cfm) ColdFusion CFScript (cfc) CSS (css) Cython (pyx) D (d) DAL (da) Dart (dart) DOS Batch (bat, BAT) DTD (dtd) Erlang (erl, hrl) Expect (exp) Focus (focexec) Fortran 77 (F, f, f77, F77, pfo) Fortran 90 (F90, f90) Fortran 95 (F95, f95) Go (go) Groovy (groovy) Haskell (hs, lhs) HTML (htm, html) IDL (idl, pro) Java (java) Javascript (js) JCL (jcl) JSP (jsp) Kermit (ksc) Korn Shell (ksh) lex (l) Lisp (el, jl, lisp, lsp, sc, scm) Lisp/OpenCL (cl) LiveLink OScript (oscript) Lua (lua) m4 (ac, m4) make (am, gnumakefile, Gnumakefile, Makefile, makefile) MATLAB (m) Modula3 (i3, ig, m3, mg) MSBuild scripts (csproj, wdproj) MUMPS (mps, m) MXML (mxml) NAnt scripts (build) NASTRAN DMAP (dmap) Objective C (m) Objective C++ (mm) Ocaml (ml) Oracle Forms (fmt) Oracle Reports (rex) Pascal (dpr, p, pas, pp) Patran Command Language (pcl, ses) Perl (perl, PL, pl, plh, plx, pm) PHP (php, php3, php4, php5) PHP/Pascal (inc) Python (py) QML (qml) Rexx (rexx) Ruby (rb) Ruby HTML (rhtml) Scala (scala) sed (sed) SKILL (il) SKILL++ (ils) Smarty (smarty, tpl) Softbridge Basic (sbl, SBL) SQL (psql, SQL, sql) SQL Data (data.sql) SQL Stored Procedure (spc.sql, spoc.sql, sproc.sql, udf.sql) Tcl/Tk (itk, tcl, tk) Teamcenter def (def) Teamcenter met (met) Teamcenter mth (mth) VHDL (vhd, VHD, VHDL, vhdl) vim script (vim) Visual Basic (bas, cls, ctl, dsr, frm, vb, VB, vba, VBA, vbs, VBS) XAML (xaml) XML (XML, xml) XSD (xsd, XSD) XSLT (xsl, XSL, xslt, XSLT) yacc (y) YAML (yaml, yml)

Gornja lista se može prilagoditi čitanjem definicija jezika iz fajla sa opcijom “read-lang-def”.

Dve ekstenzije fajlova imaju višestruka jezička mapiranja:

  • .m fajlovi mogu biti MATLAB, MUMPS ili Objektni C
  • .inc fajlovi mogu biti PHP ili Pascal

cloc ima potprograme koji pokušavaju da odrede ispravan jezik za te specijalne slučajeve na osnovu sadržaja fajlova. Preciznost identifikacije jezika je funkcija koja govori koju količinu koda fajl sadrži; .m fajlovi sa samo jednim ili dva reda, na primer, retko imaju dovoljno informacija za pravilnu odluku između MATLAB, MUMPS ili Objektnog C.

Kako funkcionište

cloc metod rada podseća na SLOCCount: Prvo, kreirajte listu fajlova koje ćete razmotriti. Zatim pokušajte da odredite da li fajlovi sadrže izvorni kod prepoznatljivog kompjuterskog jezika. Na kraju, za fajlove koje ste identifikovali kao izvorne, pozovite jezički potprogram koji će izbrojati broj izvornih redova.

Detaljniji opis:

  1. Ako je ulazni fajl arhiva (npr. .tar.gz ili .zip fajl), kreirajte privremeni direktorijum i proširite tamo arhivu koristeći sistemski poziv ka odgovarajućem internom uslužnom programu (tar, bzip2,unzip itd.), a zatim dodajte taj privremeni direktorijum kao jedan od inputa (to pouzdanije radi na Unixu nego na Windosu);
  2. Upotrebite File::Find da rekurzivno spustite input direktorijume i napravite listu sa imenima fajlova kandidata;
  3. Uverite se da fajlovi u listi kandidata imaju jedinstveni sadržaj (prvo upoređujući veličine fajlova, a zatim, kod fajlova slične veličine, upoređujući MD5 heš funkcije sadržaja fajla sa Digest::MD5);
  4. Skenirajte listu fajlova kandidata za ekstenzije fajla koje cloc udružuje sa programskim jezicima (vidi show-lang i show-ext opcije). Fajlovi koji se podudaraju klasifikuju se kao oni koji sadrže izvorni kod za taj jezik. Svaki fajl bez ekstenzije je otvoren, a njegov prvi red se čita da bi se videlo da li je to Unix komandni skript (sve što počinje sa #!). Ako jeste komandni skript, fajl se klasifikuje prema tom jeziku za pisanje skriptova (ako je jezik prepoznatljiv). Ako fajl nema prepoznatljivu ekstenziju ili nije prepoznatljiv jezik za pisanje skriptova, on se ignoriše;
  5. Svi preostali fajlovi u listi kandidata trebalo bi sada da budu izvorni fajlovi za poznate programske jezike. Za svaki od tih fajlova:
      1. Učitajte ceo fajl u memoriju..
      2. Izbrojte koliko ima redova (= Loriginal)
      3. Uklonite prazne redove, a zatim ponovo izbrojte (= Lnon_blank);
      4. Ponovite preko comment filtera definisanih za taj jezik (na primer, C++ ima dva filtera: (1) ukloniti redove koji počinju opcionim praznim prostorom iza kojeg sledi // i (2) ukloniti tekst između /* i */). Primenite svaki filter na kod kako biste uklonili komentare. Prebrojte preostale redove (= Lcode);
      5. Sačuvajte prebrojano za taj jezik:prazni redovi = Loriginal – Lnon_blankredovi sa komentarima = Loriginal – Lnon_blank – Lcode

        redovi koda = Lcode

Оpcije blago modifikuju algoritam. Opcija read-lang-def, na primer, omogućava korisniku da pročita definicije filtera za komentare, poznate ekstenzije fajlova i poznate jezike za skriptovanje. Kod za ovu opciju obrađuje se između koraka 2 i 3.

Nаpredno korišćenje

Uklonite komentare iz izvornog koda

Kako možete znati da li cloc ispravno identifikuje komentare? Jedan od načina da se uverite da cloc radi pravu stvar jeste da koristite njegovu opciju “strip comments” (segmentiranje komentara) da biste uklonili komentare i prazne redove iz fajlova, a zatim uporedili segmentirane i originalne fajlove.

Probajmo ovo sa SQLite amalgamacijom , C fajl koji sadrži ceo potreban kod za izgradnju SQLite biblioteke zajedno sa fajlom zaglavlja:

prompt> tar zxf sqlite-amalgamation-3.5.6.tar.gz prompt> cd sqlite-3.5.6/ prompt> cloc –strip-comments=nc sqlite.c 1 text file. 1 unique file. Wrote sqlite3.c.nc 0 files ignored. http://cloc.sourceforge.net v 1.03 T=1.0 s (1.0 files/s, 82895.0 lines/s) ——————————————————————————- Language files blank comment code scale 3rd gen. equiv ——————————————————————————- C 1 5167 26827 50901 x 0.77 = 39193.77 ——————————————————————————-

Argument ekstenzije koji se daje opciji strip comments je proizvoljan; ovde je nc upotrebljeno kao skraćenica za “no comment” (bez komentara).

cloc je uklonio preko 31.000 redova iz fajla:

prompt> wc -l sqlite3.c sqlite3.c.nc 82895 sqlite3.c 50901 sqlite3.c.nc 133796 total prompt> echo “82895 – 50901″ | bc 31994

Sada možemo uporediti originalni fajl, sqlite3.c i jedan segment komentara, sqlite3.c.nc sa alatkama kao što su diff ili vimdiff i videti šta tačno cloc smatra komentarima i praznim redovima. Strog dokaz da segmentiran fajl sadrži isti C kod kao original dobija se kompilovanjem ovih fajlova i upoređivanjem kontrolnih zbirova dobijenih objektnih fajlova.

Prvo, originalni izvorni fajl:

prompt> gcc -c sqlite3.c prompt> md5sum sqlite3.o cce5f1a2ea27c7e44b2e1047e2588b49 sqlite3.o

Sledeće, verzija bez komentara:

prompt> mv sqlite3.c.nc sqlite3.c prompt> gcc -c sqlite3.c prompt> md5sum sqlite3.o cce5f1a2ea27c7e44b2e1047e2588b49 sqlite3.o

cloc je uklonio preko 31.000 redova komentara i praznina ali nije modifikovao izvorni kod ni na kakav značajan način, jer se dobijeni objektni fajl poklapao sa originalnim.

Rad sa kompresovanim arhivama

cloc verzije pre v1.07 zahtevale su opciju “extract-with=<cmd>” koja će reći cloc-u kako da proširi fajl arhive. Počev od v1.07 ovo ekstrahovanje pokušava da se radi automatski. Trenutno, metod automatskog ekstrahovanja radi zadovoljavajuće na Unix OS za sledeće vrste fajlova: .tar.gz, .tar.bz2, .tgz, .zip, .ear. Neke od ovih ekstenzija rade i na Windowsu ako postoji WinZip instaliran na podrazumevanoj lokaciji (C:\Program Files\WinZip\WinZip32.exe). Takođe, sa novijom verzijom WinZip-a, za pravilnu operaciju potreban je i dodatni modul komandne lnije ; u ovom slučaju cloc bi se pozvao sa nečim poput ovoga:
--extract-with="\"c:\Program Files\WinZip\wzunzip\" -e -o >FILE< .” (ref. forum post).

U slučajevima kada je automatsko ekstrahovanje neuspešno, može se pokušati sa “extract-with=<cmd>” opcijom kako bi se izbrojali redovi u okviru tar fajlova, Zip fajlova ili drugih kompresovanih arhiva za koje postoji alatka za ekstrahovanje. cloc uzima komandu za ekstrahovanje koju obezbeđuje korisnik i proširuje arhivu u privremeni direktorijum (kreiran pomoću File::Temp), broji redove koda u privremenom direktorijumu i zatim uklanja direktorijum. Iako nije od specijalne pomoći u radu sa pojedinačnom kompresovanom arhivom (napokon, ako ćete ionako da ukucate komandu za ekstrahovanje, zašto i arhivu ne biste proširili ručno?), ova opcija je zgodna za rad sa nekoliko arhiva istovremeno.

Na primer, recimo da imate sledeće izvore u tar formatu na Unix mašini

perl-5.8.5.tar.gz

Python-2.4.2.tar.gz

i da želite da prebrojite ceo kod u njima. Komanda bi bila

cloc –extract-with=’gzip -dc >FILE< | tar xf -‘ perl-5.8.5.tar.gz Python-2.4.2.tar.gz

Ako ta Unix mašina ima GNU tar (koji se može odkompresovati i ektrahovati u jednom koraku), komanda se može skratiti na

cloc –extract-with=’tar zxf >FILE<‘ perl-5.8.5.tar.gz Python-2.4.2.tar.gz

Na Windows kompjuterima sa WinZip-om instaliranim u c:\Program Files\WinZip, komanda bi izgledala ovako:

cloc.exe –extract-with=”\”c:\Program Files\WinZip\WinZip32.exe\” -e -o >FILE< .” perl-5.8.5.tar.gz Python-2.4.2.tar.gz

Java .ear fajlovi su Zip fajlovi koji sadrže dodatne Zip fajlove. cloc može upravljati ugneždenim kompresovanim arhivama bez teškoća, pod uslovom da su svi takvi fajlovi kompresovani i arhivirani na isti način. Primeri prebrojavanja Java .ear fajla u Unixu ili Windowsu:

Unix> cloc –extract-with=”unzip -d . >FILE< ” Project.ear DOS> cloc.exe –extract-with=”\”c:\Program Files\WinZip\WinZip32.exe\” -e -o >FILE< .” Project.ear

Rаzlike

Prekidač diff omogućava merenje relativne izmene u izvornom kodu i komentara između dve verzije fajla, direktorijuma ili arhive. Razlike otkrivaju mnogo više od apsolutnog broja koda dve verzije fajla. Na primer, recimo da izvorni fajl ima 100 redova i da njegov programer isporuči noviju verziju sa 102 reda. Da li je on dodao dva reda komentara ili obrisao sedamnaest izvornih redova i dodao četrnaest izvornih redova i pet redova sa komentarima ili je uradio kompletan prepis, odbacujući 100 originalnih redova i dodajući 102 reda celog novog izvora? Opcija diff govori koliko smo redova koda dodali, uklonili, modifikovali ili zadržali onakve kakvi jesu.

Kao dodatak parovima fajlova, cloc-u se mogu dati parovi direktorijuma ili parovi arhiva fajlova ili arhiva fajla i direktorijum. cloc će pokušati da izjednači parove fajlova u okviru direktorijuma ili arhiva i da uporedi diff-e za svaki par. Na primer, da bi se videlo šta se izmenilo između GCC 4.4.0 i 4.5.0, može se uraditi sledeće:

cloc –diff gcc-4.4.0.tar.bz2 gcc-4.5.0.tar.bz2

Budite spremni da malo sačekate na rezultate; opcija diff radi mnogo sporije od apsolutnog prebrojavanja koda.

Da biste videli na koji način cloc poravnava fajlove između dve arhive, upotrebite diff-alignment opciju

cloc –diff-aligment=align.txt gcc-4.4.0.tar.bz2 gcc-4.5.0.tar.bz2

da proizvedete align.txt fajl koji pokazuje parove fajlova kao i dodate i obrisane fajlove. Simboli == and != ispred svakog para fajlova pokazuju da li su fajlovi identični (==) ili imaju različit sadržaj (!=).

Evo primera izlaza koji pokazuje razliku između Python 2.6.6 i 2.7 izdanja:

prompt> cloc –diff Python-2.6.6.tar.bz2 Python-2.7.tar.bz2 3870 text files. 4130 text files.s 2177 files ignored. 2 errors: Diff error (quoted comments?): /tmp/4QAqkrHN7Z/Python-2.6.6/Mac/Modules/qd/qdsupport.py Diff error (quoted comments?): /tmp/LvStB1lQxd/Python-2.7/Mac/Modules/qd/qdsupport.py http://cloc.sourceforge.net v 1.52 T=422.0 s (0.0 files/s, 0.0 lines/s) ——————————————————————————- Language files blank comment code ——————————————————————————- vim script same 0 0 7 85 modified 1 0 0 20 added 0 0 0 1 removed 0 0 0 0 Expect same 1 0 0 60 modified 0 0 0 0 added 6 0 0 0 removed 0 0 0 0 CSS same 1 0 19 318 modified 0 0 0 0 added 0 0 0 0 removed 0 0 0 0 XML same 1 0 0 4 modified 0 0 0 0 added 3 0 0 0 removed 1 0 0 0 m4 same 1 0 19 1089 modified 2 0 0 130 added 5 6 5 150 removed 0 660 15 5905 Visual Basic same 2 0 1 12 modified 0 0 0 0 added 0 0 0 0 removed 0 0 0 0 Lisp same 1 0 503 2933 modified 0 0 0 0 added 0 0 0 0 removed 0 0 0 0 NAnt scripts same 2 0 0 30 modified 0 0 0 0 added 0 0 0 0 removed 0 0 0 0 HTML same 12 0 11 2329 modified 2 0 0 2 added 0 0 0 0 removed 9 0 0 0 make same 3 0 353 2888 modified 7 0 3 11 added 2 1 0 14 removed 0 2 0 8 Objective C same 6 0 70 633 modified 1 0 0 2 added 0 0 0 0 removed 0 0 0 0 Assembly same 22 0 1575 9156 modified 14 0 78 174 added 3 171 111 998 removed 2 1 0 189 Bourne Shell same 26 0 2828 20114 modified 7 0 255 2179 added 5 163 1103 4770 removed 0 550 2444 11660 (unknown) same 0 0 0 0 modified 0 0 0 0 added 32 0 0 0 removed 26 0 0 0 C++ same 0 0 0 0 modified 0 0 0 0 added 2 0 0 0 removed 0 0 0 0 Teamcenter def same 6 0 158 885 modified 2 0 0 0 added 1 2 4 17 removed 1 0 4 2 DOS Batch same 26 0 101 416 modified 5 0 1 8 added 1 0 0 0 removed 0 0 0 0 C/C++ Header same 143 0 9016 37452 modified 90 0 157 15564 added 12 181 341 10247 removed 1 101 129 5219 C same 222 0 28753 322642 modified 157 0 542 5023 added 141 1485 1730 12440 removed 4 223 619 4519 Python same 1211 0 92289 348923 modified 740 0 1238 11589 added 114 2845 4645 17251 removed 23 1409 2617 6385 ——————————————————————————- SUM: same 1686 0 135703 749969 modified 1028 0 2274 34702 added 327 4854 7939 45888 removed 67 2946 5828 33887 ——————————————————————————-

Obratite pažnju na dve greške za fajl Python-X/Mac/Modules/qd/qdsupport.py. Ovaj fajl ima Python doc nizove (tekst između trostrukih navodnika) koji sadrže C komentare. cloc tretira doc nizove kao komentare i upravlja njima tako što ih prvo konvertuje u C komentare, a zatim, koristeći C komentar, uklanja regularni izraz. Ugneždeni C komentari ipak donose netačne rezulate.

Takođe postoji i izlaz za jezik “(nepoznato)”. Fajlovi u ovoj kategoriji su ne-izvorni fajlovi i stoga se ne prebrojavaju; njihovo prisustvo se jedva primećuje kada se uklone, dodaju ili modifikuju.

Kreirajte prilagođene definicije jezika

cloc može da napiše svoje definicije komentara jezika u fajl ili može da pročita definicije komentara iz fajla, prelazeći preko ugrađenih definicija. To može biti od koristi kada želite da upotrebite cloc za prebrojavanje redova jezika koji još uvek nije uključen, da izmenite udruživanje ekstenzije fajla sa jezikom ili da modifikujete način brojanja postojećih jezika.

Najlakši način za kreiranje prilagođenih definicija jezika je da učinite da cloc napiše svoje definicije u fajl, a zatim da modifikujete taj fajl:

Unix> cloc –write-lang-def=my_definitions.txt

kreira fajl my_definitions.txt koji se može modifikovati, a zatim povratno pročitati sa

Unix> cloc –read-lang-def=my_definitions.txt file1 file2 dir1 …

Svaki jezički ulaz ima četiri dela:

  1. Ime jezika koje počinje u koloni 1;
  2. Jedan ili više filtera komentara koji počinju u koloni 5;
  3. Jednu ili više ekstenzija imena fajla koje počinju u koloni 5;
  4. Faktor razmere treće generacije koji počinje u koloni 5. Ovaj ulaz se mora obezbediti, ali njegova vrednost nije važna osim ako ne želite da uporedite svoj jezik sa hipotetičkim programskim jezikom treće generacije.

Filter definiše metod kojim se uklanja tekst komentara iz izvornog fajla. Na primer, ulaz za C++ izgleda ovako:

C++ filter remove_matches ^\s*// filter call_regexp_common C extension C extension cc extension cpp extension cxx extension pcc 3rd_gen_scale 1.51

C++ ima dva filtera: prvi uklanja redove koji počinju opcionim praznim prostorom i koje prati //. Sledeći uklanja sve C komentare. C komentari se teško izražavaju kao regularni izraz, tako da se poziva Regexp::Common da pronađe odgovarajući regularni izraz koji će se podudarati sa C komentarima koje se zatim uklanjaju.

Detaljnija diskusija o različitim opcijama filtera možda će se pojaviti u budućnosti. Proizvod cloc opcije “write-lan-def” treba da pruži dovoljno primera motivisanim pojedincima koji će modifikovati ili proširiti definicije jezika cloc-a.

Kоmbinovanje izveštaja

Ako upravljate višestrukim softverskim projektima, možda će vas interesovati da vidite prebrojavanje redova koje radi projekat, ne samo jezik. Recimo da upravljate trima softverskim projektima pod nazivom MySQL, PostgreSQL i SQLite. Timovi odgovorni za svaki od ovih projekata pokreću cloc na svom izvornom kodu i obezbeđuju vam izlaz. Na primer, MySQL tim radi

cloc –report-file=mysql-5.1.42.txt mysql-5.1.42.tar.gz

i daje vam fajlmysql-5.1.42.txt. Sadržaj tri fajla koje dobijete je:

Unix> cat mysql-5.1.42.txt http://cloc.sourceforge.net v 1.50 T=26.0 s (108.1 files/s, 65774.5 lines/s) ——————————————————————————– Language files blank comment code ——————————————————————————– C++ 615 93609 110909 521041 C 642 83179 82424 393602 C/C++ Header 1065 33980 77633 142779 Bourne Shell 178 14892 11437 74525 Perl 60 7634 4667 22703 m4 13 1220 394 10497 make 119 914 1855 4447 XML 27 564 23 4107 SQL 18 517 209 3433 Assembly 12 161 0 1304 yacc 2 167 40 1048 lex 2 332 113 879 Teamcenter def 43 85 219 701 Javascript 3 70 140 427 Pascal 2 0 436 377 HTML 1 7 0 250 Bourne Again Shell 1 6 1 48 DOS Batch 8 23 73 36 ——————————————————————————– SUM: 2811 237360 290573 1182204 ——————————————————————————– Unix> cat sqlite-3.6.22.txt http://cloc.sourceforge.net v 1.50 T=3.0 s (4.7 files/s, 53833.7 lines/s) ——————————————————————————- Language files blank comment code ——————————————————————————- C 2 7459 37993 68944 Bourne Shell 7 3344 4522 25849 m4 2 754 20 6557 C/C++ Header 2 155 4808 1077 make 1 6 0 13 ——————————————————————————- SUM: 14 11718 47343 102440 ——————————————————————————- Unix> cat postgresql-8.4.2.txt http://cloc.sourceforge.net v 1.50 T=16.0 s (129.1 files/s, 64474.9 lines/s) ——————————————————————————- Language files blank comment code ——————————————————————————- C 923 102324 167390 563865 C/C++ Header 556 9180 22723 40990 Bourne Shell 51 3692 3245 28486 SQL 260 8246 5645 25862 yacc 6 2667 2126 22825 Perl 36 782 696 4894 lex 8 708 1525 3638 make 180 1215 1385 3453 m4 12 199 25 1431 Teamcenter def 13 4 0 1104 HTML 2 94 1 410 DOS Batch 7 53 22 188 XSLT 5 41 30 111 Assembly 3 17 0 105 D 1 14 14 65 CSS 1 16 7 44 sed 1 1 7 15 Python 1 5 1 12 ——————————————————————————- SUM: 2066 129258 204842 697498 ——————————————————————————-

Iako su ova tri fajla interesantna, takođe želite da vidite kombinovano prebrojavanje iz svih projekata. To se može uraditi pomoću cloc opcije “sum_reports”:

Unix> cloc –sum-reports –report_file=databases mysql-5.1.42.txt postgresql-8.4.2.txt sqlite-3.6.22.txt Wrote databases.lang Wrote databases.file

Kombinovanje izveštaja proizvodi dva izlazna fajla, jedan za zbirove programskog jezika (database.lang) i drugi za zbirove projekta (database.file). Njihov sadržaj je:

Unix> cat databases.lang http://cloc.sourceforge.net v 1.50 ——————————————————————————– Language files blank comment code ——————————————————————————– C 1567 192962 287807 1026411 C++ 615 93609 110909 521041 C/C++ Header 1623 43315 105164 184846 Bourne Shell 236 21928 19204 128860 SQL 278 8763 5854 29295 Perl 96 8416 5363 27597 yacc 8 2834 2166 23873 m4 27 2173 439 18485 make 300 2135 3240 7913 lex 10 1040 1638 4517 XML 27 564 23 4107 Teamcenter def 56 89 219 1805 Assembly 15 178 0 1409 HTML 3 101 1 660 Javascript 3 70 140 427 Pascal 2 0 436 377 DOS Batch 15 76 95 224 XSLT 5 41 30 111 D 1 14 14 65 Bourne Again Shell 1 6 1 48 CSS 1 16 7 44 sed 1 1 7 15 Python 1 5 1 12 ——————————————————————————– SUM: 4891 378336 542758 1982142 ——————————————————————————– Unix> cat databases.file ———————————————————————————- Report File files blank comment code ———————————————————————————- mysql-5.1.42.txt 2811 237360 290573 1182204 postgresql-8.4.2.txt 2066 129258 204842 697498 sqlite-3.6.22.txt 14 11718 47343 102440 ———————————————————————————- SUM: 4891 378336 542758 1982142 ———————————————————————————-

I sami fajlovi izveštaja se mogu sumirati. Recimo da upravljate razvojem Perla i Pythona i da želite da pratite ta prebrojavanja redova odvojeno od projekata vaše baze podataka. Prvo kreirajte izveštaje za Perl i Python zasebno:

cloc –report-file=perl-5.10.0.txt perl-5.10.0.tar.gz cloc –report-file=python-2.6.4.txt Python-2.6.4.tar.bz2

onda ih sumirajte pomoću

Unix> cloc –sum-reports –report_file=script_lang perl-5.10.0.txt python-2.6.4.txt Wrote script_lang.lang Wrote script_lang.file Unix> cat script_lang.lang http://cloc.sourceforge.net v 1.50 ——————————————————————————- Language files blank comment code ——————————————————————————- C 518 61871 52705 473034 Python 1965 76022 95289 365716 Perl 2052 110356 130018 292281 C/C++ Header 381 13762 21402 102276 Bourne Shell 149 9376 11665 81508 Lisp 2 1154 2745 10448 Assembly 38 1616 1712 9755 m4 3 825 34 7124 make 16 954 804 4829 HTML 25 516 13 3010 Teamcenter def 9 170 162 2075 XML 28 288 0 2034 C++ 10 312 277 2000 yacc 2 128 97 1549 DOS Batch 42 175 152 746 Objective C 7 102 70 635 YAML 2 2 0 489 CSS 1 94 19 308 vim script 1 36 7 105 Expect 1 0 0 60 NAnt scripts 2 1 0 30 Visual Basic 2 1 1 12 ——————————————————————————- SUM: 5256 277761 317172 1360024 ——————————————————————————- Unix> cat script_lang.file ——————————————————————————- Report File files blank comment code ——————————————————————————- python-2.6.4.txt 2746 135676 143269 830347 perl-5.10.0.txt 2510 142085 173903 529677 ——————————————————————————- SUM: 5256 277761 317172 1360024 ——————————————————————————-

Na kraju, kombinujte kombinovane fajlove:

Unix> cloc –sum-reports –report_file=everything databases.lang script_lang.lang Wrote everything.lang Wrote everything.file Unix> cat everything.lang http://cloc.sourceforge.net v 1.50 ——————————————————————————– Language files blank comment code ——————————————————————————– C 2085 254833 340512 1499445 C++ 625 93921 111186 523041 Python 1966 76027 95290 365728 Perl 2148 118772 135381 319878 C/C++ Header 2004 57077 126566 287122 Bourne Shell 385 31304 30869 210368 SQL 278 8763 5854 29295 m4 30 2998 473 25609 yacc 10 2962 2263 25422 make 316 3089 4044 12742 Assembly 53 1794 1712 11164 Lisp 2 1154 2745 10448 XML 55 852 23 6141 lex 10 1040 1638 4517 Teamcenter def 65 259 381 3880 HTML 28 617 14 3670 DOS Batch 57 251 247 970 Objective C 7 102 70 635 YAML 2 2 0 489 Javascript 3 70 140 427 Pascal 2 0 436 377 CSS 2 110 26 352 XSLT 5 41 30 111 vim script 1 36 7 105 D 1 14 14 65 Expect 1 0 0 60 Bourne Again Shell 1 6 1 48 NAnt scripts 2 1 0 30 sed 1 1 7 15 Visual Basic 2 1 1 12 ——————————————————————————– SUM: 10147 656097 859930 3342166 ——————————————————————————– Unix> cat everything.file ——————————————————————————- Report File files blank comment code ——————————————————————————- databases.lang 4891 378336 542758 1982142 script_lang.lang 5256 277761 317172 1360024 ——————————————————————————- SUM: 10147 656097 859930 3342166 ——————————————————————————-

SQL

cloc može pisati rezultate u SQL tabelu i kreirati i ubaciti izjave za korišćenje sa odnosnim programima baze podataka kao što su SQLite, MySQL, PostgreSQL, Oracle ili Microsoft SQL.
Jednom kada se informacija o prebrojavanju koda nađe u bazi podataka, može se ispitivati i prikazivati na zanimljive načine.

Baza podataka kreirana iz cloc SQL izlaza ima dve tabele, meta podatke i t:

 

meta podaci

polje Vrsta
timestamp tekst
projekat tekst
elapsed_s real

t

polje Vrsta
projekat tekst
jezik tekst
fajl tekst
Praznina integer
Komentar integer
Kod integer
Razmera stvarna

 

Tabela sa meta podacima sadrži informacije o tome kada je cloc pokrenut. Prekidač sql-appned omogućava kombinovanje više izvršavanja u jednoj bazi podataka; svako pokretanje dodaje red u tabelu sa meta podacima. Informacije o prebrojavanju koda nalaze se u tabeli t.

Hajde da ponovimo primere za prebrojavanje koda za Perl, Python, SQLite, MySQL i PostgreSQL tar formate pokazane u navedenom primeru kоmbinovanja izveštaja , ovaj put koristeći SQL izlazne opcije i mehanizam SQLite baze podataka.

Prekidač sql govori cloc-u da generiše izlaz u obliku SQL tabele, da kreira i ubaci komande. Prekidač uzima argumente imena fajla da bi napisao te SQL izjave, ili, ako je argument 1 (numerička jedinica), stvara izlazni tok u STDOUT. S obzirom da SQLite program komandne linije, sqlite3, može da čita komande iz STDIN-a, možemo da izostavimo SQL izjave u fajlu i da upotrebimo sql 1 kako bismo usmerili podatke direktno u SQLite izvršni program:

cloc –sql 1 –sql-project mysql mysql-5.1.42.tar.gz | sqlite3 code.db

sql-project mysql deo je opcioni; nema potrebe za određivanjem imena projekta kada se radi samo sa jednom bazom koda. Ipak, s obzirom da ćemo dodavati prebrojavanje iz druga četiri tar formata, moći ćemo da identifikujemo podatke samo ulaznim izvorom ako omogućimo ime projekta za svako izvršenje.

Sada kada imamo bazu podataka, moraćemo da pređemo u sql-append prekidač i da naredimo cloc-u da nas ne obriše iz ove baze podataka, već da doda više podataka:

cloc –sql 1 –sql-project postgresql –sql-append postgresql-8.4.2.tar.bz2 | sqlite3 code.db cloc –sql 1 –sql-project sqlite –sql-append sqlite-amalgamation-3.6.22.tar.gz | sqlite3 code.db cloc –sql 1 –sql-project python –sql-append Python-2.6.4.tar.bz2 | sqlite3 code.db cloc –sql 1 –sql-project perl –sql-append perl-5.10.0.tar.gz | sqlite3 code.db

Sada počinje zabava — imamo bazu podataka i bazu koda sa puno informacija o pet projekata i možemo početi sa ispitivanjem svih interesantnih činjenica.

Koji je najduži fajl preko svih projekata?

> sqlite3 code.db ‘select project,file,nBlank+nComment+nCode as nL from t where nL = (select max(nBlank+nComment+nCode) from t)’ sqlite|sqlite-3.6.22/sqlite3.c|110860

sqlite3 podrazumevani format izlaza ostavlja malo toga za poželeti. Možemo dodati opciju programskom
rc file, ~/.sqliterc da pokažemo zaglavlja kolone:

.header on

Možda će neko biti u iskušenju da doda i

.mode column

u ~/.sqliterc ali to uzrokuje probleme kada izlaz ima više od jednog reda, jer širina ulaza u prvom redu upravlja maksimalnom širinom svih narednih redova. To često vodi ka okrnjenom izlazu, što nije baš poželjno. Jedna od opcija je da se napiše prilagođeni SQLite formater izlaza kao što je sqlite_formatter . Koristi se ovako:

>sqlite3 code.db ‘select project,file,nBlank+nComment+nCode as nL from t where nL =(select max(nBlank+nComment+nCode) from t)’|
sqlite_formatter Project File nL _______ _______________________ ______ sqlite sqlite-3.6.22/sqlite3.c 110860

Imajte na umu i da sqlite3 ima opciju HTML izlaza, html koji se takođe može pokazati korisnim.

Koji je najduži fajl u svakom projektu?

> sqlite3 code.db ‘select project,file,max(nBlank+nComment+nCode) as nL from t group by project order by nL;’ | sqlite_formatter Project File nL __________ _____________________________________________ ______ perl perl-5.10.0/t/op/mkdir.t 22658 python Python-2.6.4/Lib/email/quoprimime.py 28091 postgresql postgresql-8.4.2/contrib/pgcrypto/pgp-pgsql.c 40041 mysql mysql-5.1.42/netware/mysqldump.def 51841 sqlite sqlite-3.6.22/config.sub 110860

Koji projekti u svakom projektu imaju najviše redova koda?

> sqlite3 code.db ‘select project,file,max(nCode) as nL from t group by project order by nL desc;’ | sqlite_formatter Project File nL __________ _____________________________________________ _____ sqlite sqlite-3.6.22/config.sub 66142 mysql mysql-5.1.42/netware/mysqldump.def 38555 postgresql postgresql-8.4.2/contrib/pgcrypto/pgp-pgsql.c 36905 python Python-2.6.4/Lib/email/quoprimime.py 26705 perl perl-5.10.0/t/op/mkdir.t 20079

Koji C izvorni fajlovi sa više od 300 redova imaju odnos komentara ispod 1%?

> sqlite3 code.db ‘select project, language, file, nCode, nComment, (100.0*nComment)/(nComment+nCode) as comment_ratio from t where language=”C” and nCode > 300 and comment_ratio < 1 order by comment_ratio;’ | sqlite_formatter Project Language File nCode nComment comment_ratio __________ ________ _____________________________________________________________________________ _____ ________ __________________ mysql C mysql-5.1.42/scripts/mysql_fix_privilege_tables_sql.c 658 0 0.0 python C Python-2.6.4/Python/graminit.c 2143 1 0.0466417910447761 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_turkish.c 2095 1 0.0477099236641221 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_french.c 1211 1 0.0825082508250825 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_french.c 1201 1 0.0831946755407654 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_hungarian.c 1182 1 0.084530853761623 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_hungarian.c 1178 1 0.0848176420695505 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_english.c 1072 1 0.0931966449207828 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_english.c 1064 1 0.0938967136150235 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_spanish.c 1053 1 0.094876660341556 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_spanish.c 1049 1 0.0952380952380952 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_italian.c 1031 1 0.0968992248062016 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_italian.c 1023 1 0.09765625 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_portuguese.c 981 1 0.10183299389002 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_portuguese.c 975 1 0.102459016393443 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_romanian.c 967 1 0.103305785123967 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_2_romanian.c 961 1 0.103950103950104 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_finnish.c 720 1 0.13869625520111 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_porter.c 717 1 0.139275766016713 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_finnish.c 714 1 0.13986013986014 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_porter.c 711 1 0.140449438202247 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_KOI8_R_russian.c 660 1 0.151285930408472 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_russian.c 654 1 0.152671755725191 python C Python-2.6.4/Mac/Modules/qt/_Qtmodule.c 26705 42 0.157026956294164 python C Python-2.6.4/Mac/Modules/icn/_Icnmodule.c 1521 3 0.196850393700787 mysql C mysql-5.1.42/strings/ctype-extra.c 8348 17 0.203227734608488 python C Python-2.6.4/Python/Python-ast.c 5910 17 0.286823013328834 python C Python-2.6.4/Mac/Modules/menu/_Menumodule.c 3263 10 0.305530094714329 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_dutch.c 596 2 0.334448160535117 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_dutch.c 586 2 0.340136054421769 perl C perl-5.10.0/x2p/a2p.c 2916 10 0.341763499658236 python C Python-2.6.4/Mac/Modules/qd/_Qdmodule.c 6694 24 0.357249181303959 python C Python-2.6.4/Mac/Modules/win/_Winmodule.c 3056 11 0.358656667753505 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_german.c 476 2 0.418410041841004 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_german.c 470 2 0.423728813559322 perl C perl-5.10.0/x2p/walk.c 2024 10 0.491642084562439 python C Python-2.6.4/Mac/Modules/ctl/_Ctlmodule.c 5442 28 0.511882998171846 python C Python-2.6.4/Mac/Modules/ae/_AEmodule.c 1347 7 0.51698670605613 python C Python-2.6.4/Mac/Modules/app/_Appmodule.c 1712 9 0.52295177222545 mysql C mysql-5.1.42/strings/ctype-euc_kr.c 8691 49 0.560640732265446 mysql C mysql-5.1.42/storage/archive/archive_reader.c 348 2 0.571428571428571 python C Python-2.6.4/Mac/Modules/evt/_Evtmodule.c 504 3 0.591715976331361 python C Python-2.6.4/Modules/expat/xmlrole.c 1250 8 0.635930047694754 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_UTF_8_danish.c 312 2 0.636942675159236 mysql C mysql-5.1.42/strings/ctype-gbk.c 9946 64 0.639360639360639 postgresql C postgresql-8.4.2/src/backend/snowball/libstemmer/stem_ISO_8859_1_danish.c 310 2 0.641025641025641 mysql C mysql-5.1.42/strings/ctype-gb2312.c 5735 40 0.692640692640693 python C Python-2.6.4/Mac/Modules/res/_Resmodule.c 1621 12 0.734843845682792 python C Python-2.6.4/Mac/Modules/drag/_Dragmodule.c 1046 8 0.759013282732448 postgresql C postgresql-8.4.2/contrib/hstore/hstore_op.c 522 4 0.760456273764259 python C Python-2.6.4/Mac/Modules/list/_Listmodule.c 1022 8 0.776699029126214 python C Python-2.6.4/Mac/Modules/te/_TEmodule.c 1198 10 0.827814569536424 python C Python-2.6.4/Mac/Modules/cg/_CGmodule.c 1190 10 0.833333333333333 postgresql C postgresql-8.4.2/contrib/hstore/hstore_io.c 451 4 0.879120879120879 postgresql C postgresql-8.4.2/src/interfaces/ecpg/preproc/preproc.c 36905 330 0.886262924667651 python C Python-2.6.4/Modules/clmodule.c 2379 23 0.957535387177352 python C Python-2.6.4/Mac/Modules/folder/_Foldermodule.c 306 3 0.970873786407767

Kojih deset fajlova je najduže (na osnovu redova koda), a koji uopšte nemaju komentara? Isključujući zaglavlja i YAML fajlove.

> sqlite3 code.db ‘select project, file, nCode from t where nComment = 0 and language not in (“C/C++ Header”, “YAML”) order by nCode desc
limit 10;’ | sqlite_formatter Project File nCode _______ _____________________________________________________ _____ python Python-2.6.4/PC/os2emx/python26.def 1188 python Python-2.6.4/Lib/test/cjkencodings_test.py 1019 python Python-2.6.4/Tools/msi/schema.py 920 python Python-2.6.4/Lib/msilib/schema.py 920 perl perl-5.10.0/symbian/config.sh 810 perl perl-5.10.0/uconfig.sh 771 python Python-2.6.4/Tools/pybench/Lookups.py 700 mysql mysql-5.1.42/scripts/mysql_fix_privilege_tables_sql.c 658 python Python-2.6.4/Tools/pybench/Numbers.py 637 python Python-2.6.4/Tools/pybench/Arithmetic.py 596

Koji su najpopularniji jezici (u smislu redova koda) u svakom projektu?

> sqlite3 code.db ‘select project, language, sum(nCode) as SumCode from t group by project,language order by project,SumCode desc;’ |
sqlite_formatter Project Language SumCode __________ __________________ _______ mysql C++ 521041 mysql C 393602 mysql C/C++ Header 142779 mysql Bourne Shell 74525 mysql Perl 22703 mysql m4 10497 mysql make 4447 mysql XML 4107 mysql SQL 3433 mysql Assembly 1304 mysql yacc 1048 mysql lex 879 mysql Teamcenter def 701 mysql Javascript 427 mysql Pascal 377 mysql HTML 250 mysql Bourne Again Shell 48 mysql DOS Batch 36 perl Perl 292281 perl C 140483 perl C/C++ Header 44042 perl Bourne Shell 36882 perl Lisp 7515 perl make 2044 perl C++ 2000 perl XML 1972 perl yacc 1549 perl YAML 489 perl DOS Batch 322 perl HTML 98 postgresql C 563865 postgresql C/C++ Header 40990 postgresql Bourne Shell 28486 postgresql SQL 25862 postgresql yacc 22825 postgresql Perl 4894 postgresql lex 3638 postgresql make 3453 postgresql m4 1431 postgresql Teamcenter def 1104 postgresql HTML 410 postgresql DOS Batch 188 postgresql XSLT 111 postgresql Assembly 105 postgresql D 65 postgresql CSS 44 postgresql sed 15 postgresql Python 12 python Python 365716 python C 332551 python C/C++ Header 58234 python Bourne Shell 44626 python Assembly 9755 python m4 7124 python Lisp 2933 python HTML 2912 python make 2785 python Teamcenter def 2075 python Objective C 635 python DOS Batch 424 python CSS 308 python vim script 105 python XML 62 python Expect 60 python NAnt scripts 30 python Visual Basic 12 sqlite C 68944 sqlite Bourne Shell 25849 sqlite m4 6557 sqlite C/C++ Header 1077 sqlite make 13

Faktori razmere jezika treće generacije

cloc verzije pre 1.50 podrazumevano izračunate, za obezbeđene inpute, gruba procena o tome koliko će redova koda biti potrebno da se napiše isti kod u hipotetičkoj trećoj generaciji programskih jezika. Za proizvodnju takvog izlaza potrebno je sada koristiti prekidač 3.

Faktori razmere dolaze iz verzije 2006 prenosnog odnosa jezika, što je izlistano na web sajtu Mayes Consultinga http://softwareestimator.com/IndustryData2.htm , pomoću jednačine:

cloc faktor razmere za jezik X = podrazumevani prenosni odnos treće generacije / prenosni odnos jezika X

na primer,

cloc faktor razmere treće generacije za DOS Batch = 80 / 128 = 0.625

Najveća mana ovog pristupa je što se prenosni odnosi definišu za logičke redove izvornog koda, ne za fizičke redove (koje cloc prebrojava). Vrednosti u cloc kolonama “razmere” i “ekvivalenta treće generacije” treba uzeti sa velikom rezervom.

Оgraničenja

Identifikacija komentara u okviru izvornog koda je teža nego što bi se moglo očekivati. Mnogi jezici će morati da imaju kompletan analizator u cilju pravilnog prebrojavanja. cloc ne pokušava da analizira nijedan od jezika koje želi da prebroji i stoga je nesavršena alatka. Sledeći problemi su poznati:

  1. Redovi koji sadrže i izvorni kod i komentare prebrojavaju se kao redovi koda
  2. Markeri komentara u okviru nizova ili оvde-dokumenti tretiraju se kao stvarni markeri komentara, a ne nizovni literali. Na primer, sledeći redovi C koda
    printf(” /* “); for (i = 0; i < 100; i++) { a += i; } printf(” */ “);

    pokazuje se cloc-u kao dva reda C koda (redovi sa crnim tekstom) i tri reda komentara (redovi koji imaju samo crveni tekst, redovi koji imaju i crni i crveni tekst tretiraju se kao kod)

  3. Lua dugi komentari se ne prepoznaju.

Аutor

Аl Danial

Priznanja

Wolfram Rösler je dao većinu primera koda u testu. Ti primeri dolaze iz njegove kolekcije Hello World Collection.

Ismet Kursunoglu je pronašao greške sa MUMPS brojačem i obezbedio pristup kompjutera sa velikim telom MUMPS koda u test cloc.

Tod Huggins je pružio korisne sugestije za Visual Basic filtere.

Anton Demichev je pronašao grešku sa JSP brojačem u cloc v0.76 i napisao XML izlazni generator za xml opciju.

Reuben Thomas je ukazao da ISO C99 dozvoljava // kao marker komentara, obezbedio kod za no3 i stdin-name opcije, prebrojao m4 jezika i predložio nekoliko poboljšanja korisničkog interfejsa.

Michael Bello je obezbedio kod za opt-match-f, opt-not-match-f, opt-match-d i opt-not-match-d opcije.

Mahboob Hussain je inspirisao original -dir i skip-uniqueness opcije, pronašao grešku u duplikatu logičke detekcije fajla i unapredio JSP filter.

Randy Sharo je pronašao i popravio grešku u nepokrenutoj varijabli za komandne skripte sa samo jednim redom.

Steven Baker je pronašao i popravio problem sa YAML generatorom izlaza.

Greg Toth je obezbedio kod za unapređenje detekcije praznih redova u COBOL-u.

Joel Oliveira je obezbedio da kod proizvede XSLT fajl, cloc-diff.xsl, prilikom proizvodnje XML izlaza za diff opciju.

Denis Silakov je poboljšao kod koji generiše cloc.xsl kada se koriste by-file i by-file-by-lang opcije i obezbedio je XSL fajl koji radi sa diff izlazom.

Andy (awalshe@sf.net) je obezbedio kod koji će ispraviti nekoliko grešaka: ispravan proizvod prebrojavanja tako da se pokažu samo fajlovi koji se koriste u prebrojavanju koda i da rezultate pokaže jezik, a ne ime fajla; omogućio je da se diff rezultat iz višestrukih izvršavanja sumira zajedno sa izveštajima.

Jari Aalto je kreirao početnu verziju cloc.1.pod.

Mikkel Christiansen (mikkels@gmail.com) je obezbedio definicije prebrojavanja za Clojure i ClojureScript.

Razvoj cloc-a je delimično sponzorisala i Northrop Grumman korporacija.

Autorska prava

Copyright (c) 2006-2015,

Licenca

Ovaj program je besplatan softver; možete ga distribuirati i/ili modifikovati pod uslovima GNU Opšte javne licence , premaobjavi fondacija Free Software Foundation; bilo verzija 2 Licence ili (vaša opcija) bilo koja kasnija verzija.

 

Popular article:

  • Clipart Collection
  • SEO News
  • OVERLOOK HOTEL SHINING
  • INSIDE A HEALTHY THROAT
  • JACOB SARTORIUS
  • MINECON CAPE
  • ORIGAMI PIKACHU
  • HORSE DRAWING OUTLINE
  • HALIBEL