|
Additional Information For Scripting PaperThis page contains additional data related to the paper "Scripting: Higher Level Programming for the 21st Century". It includes the following information:
Java code for the button exampleThe button example can't be implemented in Java without providing additional boilerplate code required for the basic applet. To level the playing field relative to Tcl, a simple applet containing a single button was written, then the code was modified to add a second button. Only the 7 additional lines required for the second button were counted in the comparison against Tcl. These 7 lines are marked with +s. This code was contributed by Stephen Uhler. // Hello button using awt (jdk 1.0 compatible) import java.awt.*; public class hello extends java.applet.Applet { + public Button hello; public Button bye; public void init() { + hello = new Button(); + hello.setFont(new Font("Times", Font.PLAIN, 16)); + hello.setLabel("hello"); + this.add(hello); bye = new Button(); bye.setFont(new Font("Times", Font.PLAIN, 16)); bye.setLabel("bye"); this.add(bye); } public boolean handleEvent(Event event) { if (event.target == bye && event.id == event.ACTION_EVENT) { System.exit(1); + else if (event.target == hello && event.id == event.ACTION_EVENT) { + System.out.println("hello"); } else { return super.handleEvent(event); } return true; } public static void main(String[] args) { Frame f = new Frame("hello Test"); hello win = new hello(); win.init(); f.add("Center", win); f.pack(); f.show(); } } C++/MFC code for the button exampleThe implementation of the button example in C++ with Microsoft Foundation Classes also requires quite a bit of boilerplate code that isn't attributable to any particular widget. In this code, contributed by Colin Stevens, only the lines that are actually required for the particular button widget are counted. These are marked with +s. The code to position the button window in its parent is not counted, since the corresponding code (1 additional line) was not included in the Tcl example. // buttonDlg.cpp : implementation file // #include "stdafx.h" #include "button3.h" #include "buttonDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif + #define IDC_INIGO 100 ///////////////////////////////////////////////////////////////////////////// // CButtonDlg dialog CButtonDlg::CButtonDlg(CWnd* pParent /*=NULL*/) : CDialog(CButtonDlg::IDD, pParent) { + m_pFont = NULL; + m_pButton = NULL; //{{AFX_DATA_INIT(CButtonDlg) //}}AFX_DATA_INIT } BEGIN_MESSAGE_MAP(CButtonDlg, CDialog) //{{AFX_MSG_MAP(CButtonDlg) + ON_BN_CLICKED(IDC_INIGO, OnInigo) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CButtonDlg message handlers /* * button .b -text "My name is Inigo Montoya" -font "times 12" \ * -command {tk_messageBox -message "hello"} */ BOOL CButtonDlg::OnInitDialog() { /* * Create button widget. */ + CButton *buttonPtr = new CButton(); + char *text = "My name is Inigo Montoya"; /* * Create "times 12" font. */ + CFont *fontPtr = new CFont; + fontPtr->CreateFont(16, 0, 0, 0, 700, 0, 0, 0, ANSI_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH|FF_DONTCARE, "Times New Roman"); /* * Measure the text to be displayed so we can request the * appropriate sized button. The padding used below are * the same ones as the defaults for buttons under Tk. */ + CDC *dcPtr = GetDC(); + fontPtr = dcPtr->SelectObject(fontPtr); + CSize size = dcPtr->GetTextExtent(text, strlen(text)); + fontPtr = dcPtr->SelectObject(fontPtr); + ReleaseDC(dcPtr); + size.cx += 9; + size.cy += 9; /* * Create button window with specified text and size. * Set the font before displaying the window. */ + buttonPtr->Create(text, WS_CHILD | WS_TABSTOP, + CRect(0, 0, size.cx, size.cy), this, IDC_INIGO); + buttonPtr->SetFont(fontPtr); /* * To place button at a specified position without changing * its requexted size, do the following: */ buttonPtr->SetWindowPos(NULL, 20, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); /* * Remember the CButton and HFONT we created so that when the * main window is destroyed, we can release the resources and * free the memory we allocated (when the button HWND is destroyed, * MFC will NOT automatically delete the wrapping CButton widget or * free the HFONT it's using). */ + m_pButton = buttonPtr; + m_pFont = fontPtr; return TRUE; } void CButtonDlg::PostNcDestroy() { + delete m_pFont; + delete m_pButton; CDialog::PostNcDestroy(); } + void CButtonDlg::OnInigo() + { + MessageBox("hello", "", MB_OK | MB_ICONINFORMATION); + } Raw data for Table 1Table 1 of the paper summarizes several applications that were implemented twice, once in a system programming language and once in a scripting language. I gathered the data for this table by posting an article on the comp.lang.tcl newsgroup asking for people who had implemented applications twice to share their experiences. Several people responded, and the email they sent me provided the raw data for the table. I used all of the responses that were complete enough to provide a quantitative comparison of either development time or lines of code. The raw email messages are reproduced below (I have removed identifying information for the sender in one case where the sender asked to remain anonymous). Database library and application (Ken Corey)Date: Mon, 17 Feb 1997 12:22:03 -0800 From: Ken Corey Computer system test and installation (Andy Belsey)Date: Thu, 20 Feb 97 09:11:55 MET From: "Andy Belsey, Engineering Services, Ayr 20-Feb-1997 0814 +0000" To: ouster@tcl.eng.sun.com Subject: Scripting vs. C/C++ Hi John, I saw your post about comparisons of scripting languages vs. C/C++. I'm a software engineer working in the European Manufacturing plant of Digital and have just put a system test and FIS (Factory Installed Software) application into production that replaced two applications written in C. I started this from scratch last June and the first Production systems were shipped yesterday using the new software (although we are still in pilot version mode). Maybe the comparison will not be what you're after here as the C apps were developed over a number of years by different teams and I was the only one working on the scripted version. However, a few statistics for you: There were two C apps: one for test delivery and one for FIS delivery. The latter was developed because of the shortcomings of the former. The test one had about 10 man years of effort in it (it had its own language, compiler and virtual processor). The FIS one had about 5 man years in it. The replacement that I came up with uses Expect, tcl, tk & Perl and took me about 8 months to bring to a Production-usable state from scratch. I have become a huge fan of scripting languages - Expect was ideal for our problem space (interacting with remote ASCII consoles of the target systems). The fact that Expect was layered on an extremely useful langauge (tcl) was also very significant in developing the new app so quickly and with so little resource. You are welcome to more details if you want. Thank you for tcl (and Don Libes for Expect). You have saved us a huge amount of time and effort. /andy -------------------------------------- Andy Belsey, System & Network Manager, Digital Equipment, Scotland. Date: Tue, 11 Mar 97 08:25:54 MET From: "Andy Belsey, Engineering Services, Ayr" To: ouster@tcl.eng.sun.com Subject: Re: Scripting vs. C/C++ >I have a followup question on an email message you sent to me a >few weeks ago, comparing development times in C vs. Tcl: >Did the replacement that you built replace both of the applications or >just one? If just one, which one? By any chance do you know how many >lines of source code there were in the C and Tcl applications? >Thanks for the additional information. Yes, the Tcl/Expect code combines (and replaces) both the C applications. The FIS application was written because of severe limitations in the Test app but a lot of the functionality of both apps is the same (but coded differently :-)). I worked on both C coding teams (at different times), so I still have access to the source code. Running all the source files through a wc -l produces: Test C application: 272,310 lines of code FIS C application: 89,567 lines of code Both the above figures include all the C and include files with comments. The Tcl/Expect version has (including comments): Tcl/Expect code: 5,693 lines Perl code: 2,008 lines Hard to believe when I see these figures but wc -l doesn't lie. The test app is so bloated because it has its own language compiler and virtual processor whereas the FIS app just uses hard-coded logic. You must get tired of people telling you how great tcl is but my experience with both tcl and perl has been nothing short of hugely successful (both for me as a programmer and my engineering group as a business within Digital). There is no way that I could have designed, engineered and put into Production a joint app as quickly by using any other language (this from a die-hard C/C++ programmer). Hope that helps - feel free to ask anything else you may need. I'd be interested in seeing a copy of your paper when you're finished (assuming you will publish it for general viewing). /andy -------------------------------------- Andy Belsey, System & Network Manager, Digital Equipment, Scotland. Security scanner (Jim Graham)From: Jim Graham Display oil well production curves (Dan Schenck)Date: Tue, 18 Feb 1997 20:57:47 -0600 From: Dan Schenck To: ouster@tcl.Eng.Sun.COM Subject: re: Tcl vs. C/C++/Java: quantitative data? John, A little over 3 years ago I wrote an application in Tcl/Tk that interfaced, through X Events message passing, to a large C/X-Windows-based system that we maintained. The Tcl application was written as a proof of concept, and was designed to display the production decline curves for a producing oil or gas well. It took me approximately 2 weeks effort to complete the program. To build the required graphs, I used the BLT extension. I also wrote an extension to Tcl to capture the X Events produced by the primary system and a command to compute the forecast decline curves. The X Events were used to drive my application. In addition, the application extracted data from a Sybase database using the sybtcl extension. After seeing the Tcl application, our clients decided we should proceed with a C implementation of the project. Using an X-Windows GUI builder tool and C, another developer rewrote my application for integration into the main system. It took him 3 months work to duplicate the work I had done in Tcl/Tk. That is a 6:1 difference. The C application had no essential difference in functioality (it ran slightly faster), so I believe that this is a fair comparison of head-to-head development time. I believe that I could do the work today much quicker, since my original work involved learning Tcl/Tk, learning how to use some sophisticated Tcl extensions and discovering how to build Tcl extensions. This is the only situation that I have a direct comparison for of independent development of the same application in both Tcl and C. However, it is my gut feel that a 10:1 performance improvement over C programming isn't far off base for an experienced Tcl/Tk developer. I'm anxious to see a summary of the responses you get to this question. Dan Schenck POSC Houston, TX Query dispatcher ( Paul Healy)To: ouster@tcl.Eng.Sun.COM Subject: Re: Tcl vs. C/C++/Java: quantitative data? Date: Tue, 25 Feb 1997 23:08:33 +0000 From: Paul Healy EI9GL Spreadsheet toolDate: Sat, 22 Feb 1997 20:08:40 CST To: ouster@tcl.Eng.Sun.COM Subject: Tcl vs. C John, I couldn't resist replying to your query on the efficiency of TCL vs. C coding since I just finished an exercise of just that sort. I have been working on a spreadsheet program (don't ask why) that have the basic features of typical GUI programs, and have a file that stores and manipulates the the properties of a cell. The TCL version is 379 lines; the C version (written to get better speed) is 1460 lines. So that is close to a factor 4. There is nothing particularly extraordinary about what the code does so this result may scale well to other situations. As for speed of coding time, I think you would need to conduct controlled experiments to get a quantitative number. However, the adage that it takes the same length of time to code a line regarless of language is probably not true for TCL vs C: I am sure that TCL is faster to code (per line) because of the ability to bypass the compile/link step, and also because if one is testing code that requires some initialization steps to set up a particular state, much of that state can be maintained while iteratively debugging TCL (run-time sourcing of code), while C coding requires that you reinitialize the state for each cycle of recompilation. Overall, I think the factor 10 is not unreasonable. Simulator and GUI (Randy Wang)Date: Fri, 24 Jan 1997 19:56:06 -0800 (PST) From: Randolph Wang To: ouster@tcl.Eng.Sun.COM Subject: Re: Tcl/Java code sizes tcl version: 1600 lines java version: 3400 lines 1) functionalities: a) the tcl version does a little more. very hard to put a number on it, but if you make me, i'd say somewhere between 10-20%. b) there was a conscious effort to make the java code reusable, so 1200 lines of the java code made into my personal library and were more generic and bigger than they need be otherwise. c) if the code size difference surprised you, it might help if i told you the codes were not completely GUI -- there were substantial chunks devoted to, for example, xFS coherence algorithms. if you write a loop to cycle through all the machines in a hash table, for example, you can imagine the loop bodies would look very similar. 2) times: a more useful metric for programming ease than code size is the amount of time it took to write the programs. a) the first 900 lines of the tcl version were written in a single night (to meet a demo rehearsal deadline). the whole thing was complete in less than a week. b) the java version took a month. a drastic interface change from the alpha version to JDK beta and bugs in AWT probably should be blamed for at least a week of wasted time. Randy |