Changeset 753f13c9
- Timestamp:
- Mar 14, 2018, 2:06:38 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- ed3ff0a2
- Parents:
- 720a007 (diff), 3fd3bda (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- doc
- Files:
-
- 117 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/bibliography/pl.bib
r720a007 r753f13c9 780 780 title = {Boost Coroutine Library}, 781 781 year = 2015, 782 note = {\href{http://www.boost.org/doc/libs/1_61_0/libs/coroutine/doc/html/index.html} 783 {{http://www.boost.org/\-doc/\-libs/1\_61\_0/\-libs/\-coroutine/\-doc/\-html/\-index.html}} [Accessed September 2016]}, 782 howpublished= {\href{http://www.boost.org/doc/libs/1_61_0/libs/coroutine/doc/html/index.html} 783 {{http://www.boost.org/\-doc/\-libs/1\_61\_0/\-libs/\-coroutine/\-doc/\-html/\-index.html}}}, 784 note = {Accessed: 2016-09}, 784 785 } 785 786 … … 865 866 keywords = {ISO/IEC C 11}, 866 867 contributer = {pabuhr@plg}, 867 author= {C11},868 title = { Programming Languages -- {C}{ISO/IEC} 9889:2011-12},868 key = {C11}, 869 title = {C Programming Language {ISO/IEC} 9889:2011-12}, 869 870 edition = {3rd}, 870 871 publisher = {International Standard Organization}, … … 873 874 } 874 875 875 @techreport{C++Concepts, 876 type = {International Standard}, 876 @manual{C++Concepts, 877 877 keywords = {ISO/IEC TS 19217:2015}, 878 878 contributer = {a3moss@uwaterloo.ca}, 879 879 key = {Concepts}, 880 title = { Information technology -- Programming languages -- {C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}}Extensions for concepts {ISO/IEC} {TS} 19217:2015},880 title = {{C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Programming language -- Extensions for concepts {ISO/IEC} {TS} 19217:2015}, 881 881 publisher = {International Standard Organization}, 882 882 address = {\href{https://www.iso.org/standard/64031.html}{https://\-www.iso.org/\-standard/\-64031.html}}, 883 year = 2015 883 year = 2015, 884 884 } 885 885 … … 1020 1020 year = 1985, 1021 1021 pages = {14-22} 1022 } 1023 1024 @inproceedings{Necula02, 1025 author = {Necula, George C. and McPeak, Scott and Weimer, Westley}, 1026 title = {{CCured}: Type-safe Retrofitting of Legacy Code}, 1027 booktitle = {Proceedings of the 29th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages}, 1028 series = {POPL '02}, 1029 year = {2002}, 1030 location = {Portland, Oregon}, 1031 pages = {128-139}, 1032 publisher = {ACM}, 1033 address = {New York, NY, USA}, 1022 1034 } 1023 1035 … … 1105 1117 title = {Programming Languages -- {Cobol} ISO/IEC 1989:2014}, 1106 1118 edition = {2nd}, 1107 institution 1119 institution = {International Standard Organization}, 1108 1120 address = {\href{https://www.iso.org/standard/51416.html}{https://\-www.iso.org/\-standard/\-51416.html}}, 1109 1121 year = 2014, … … 1117 1129 journal = sigplan, 1118 1130 year = 1984, 1119 month = jun, volume = 19, number = 6, pages = {1-12}, 1131 month = jun, 1132 volume = 19, 1133 number = 6, 1134 pages = {1-12}, 1120 1135 note = {Proceedings of the ACM SIGPLAN '84 Symposium on Compiler Construction}, 1121 1136 abstract = { … … 1989 2004 1990 2005 @book{Stroustrup94, 1991 keywords 1992 contributor 1993 author 1994 title 1995 publisher 2006 keywords = {C++}, 2007 contributor = {wyrmok@plg}, 2008 author = {Bjarne Stroustrup}, 2009 title = {The Design and Evolution of {C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}}}, 2010 publisher = {Addison-Wesley}, 1996 2011 address = {Boston}, 1997 year 2012 year = 1994 1998 2013 } 1999 2014 … … 2738 2753 } 2739 2754 2740 @ online{GCCExtensions,2755 @misc{GCCExtensions, 2741 2756 contributer = {a3moss@uwaterloo.ca}, 2742 2757 key = {{GNU}}, … … 2744 2759 title = {Extensions to the {C} Language Family}, 2745 2760 year = 2014, 2746 note= {\href{https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html}{https://\-gcc.gnu.org/\-onlinedocs/\-gcc-4.7.2/\-gcc/\-C\-Extensions.html}},2747 urldate = {2017-04-02}2761 howpublished= {\href{https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html}{https://\-gcc.gnu.org/\-onlinedocs/\-gcc-4.7.2/\-gcc/\-C\-Extensions.html}}, 2762 note = {Accessed: 2017-04-02}, 2748 2763 } 2749 2764 … … 3083 3098 keywords = {GMP arbitrary-precision library}, 3084 3099 contributer = {pabuhr@plg}, 3100 key = {GMP}, 3085 3101 title = {{GNU} Multiple Precision Arithmetic Library}, 3086 author = {GMP}, 3087 organization= {GNU}, 3102 address = {GNU}, 3088 3103 year = 2016, 3089 3104 note = {\href{https://gmplib.org}{https://\-gmplib.org}}, … … 3114 3129 } 3115 3130 3116 @ online{GObject,3131 @misc{GObject, 3117 3132 keywords = {GObject}, 3118 3133 contributor = {a3moss@uwaterloo.ca}, 3119 author = {{GObject}},3120 organization= {The GNOMEProject},3121 title = {{GO bject}Reference Manual},3134 key = {GObject}, 3135 organization= {The {GNOME} Project}, 3136 title = {{GO}bject Reference Manual}, 3122 3137 year = 2014, 3123 url= {https://developer.gnome.org/gobject/stable/},3124 urldate = {2017-04-04}3138 howpublished= {https://developer.gnome.org/gobject/stable/}, 3139 note = {Accessed: 2017-04}, 3125 3140 } 3126 3141 … … 3647 3662 3648 3663 @inproceedings{Pharr12, 3649 title={ispc: A SPMD compiler for high-performance CPU programming}, 3650 author={Pharr, Matt and Mark, William R}, 3651 booktitle={Innovative Parallel Computing (InPar), 2012}, 3652 pages={1--13}, 3653 year={2012}, 3654 organization={IEEE} 3664 title = {ispc: A {SPMD} compiler for high-performance CPU programming}, 3665 author = {Pharr, Matt and Mark, William R}, 3666 booktitle = {Innovative Parallel Computing (InPar), 2012}, 3667 pages = {1--13}, 3668 year = {2012}, 3669 month = may, 3670 address = {San Jose, CA, USA}, 3671 publisher = {IEEE}, 3672 } 3673 3674 @inproceedings{DeLozier13, 3675 keywords = {C++, local pointers, memory safety, type-safety}, 3676 author = {DeLozier, Christian and Eisenberg, Richard and Nagarakatte, Santosh and Osera, Peter-Michael and Martin, Milo M.K. and Zdancewic, Steve}, 3677 title = {{I}ronclad {C++}: A Library-augmented Type-safe Subset of {C++}}, 3678 booktitle = {Proceedings of the 2013 ACM SIGPLAN International Conference on Object Oriented Programming Systems Languages \& Applications}, 3679 series = {OOPSLA'13}, 3680 year = {2013}, 3681 address = {Indianapolis, Indiana, USA}, 3682 pages = {287-304}, 3683 publisher = {ACM}, 3655 3684 } 3656 3685 … … 3696 3725 3697 3726 @book{Java, 3698 keywords 3699 contributer = {pabuhr@plg}, 3700 author 3701 title 3727 keywords = {Java}, 3728 contributer = {pabuhr@plg}, 3729 author = {James Gosling and Bill Joy and Guy Steele and Gilad Bracha}, 3730 title = {The {Java} Language Specification}, 3702 3731 publisher = {Addison-Wesley}, 3703 3732 address = {Reading}, 3704 year 3733 year = 2000, 3705 3734 edition = {2nd}, 3706 3735 } 3707 3736 3708 3737 @manual{Java8, 3709 keywords 3710 contributer = {pabuhr@plg}, 3711 author 3712 title 3738 keywords = {Java SE 8}, 3739 contributer = {pabuhr@plg}, 3740 author = {James Gosling and Bill Joy and Guy Steele and Gilad Bracha and Alex Buckley}, 3741 title = {{Java} Language Specification}, 3713 3742 publisher = {Oracle}, 3714 year 3715 edition = { Java SE8},3743 year = 2015, 3744 edition = {{J}ava {SE} 8}, 3716 3745 } 3717 3746 … … 4648 4677 } 4649 4678 4650 @m anual{obj-c-book,4679 @misc{obj-c-book, 4651 4680 keywords = {objective-c}, 4652 4681 contributor = {a3moss@uwaterloo.ca}, 4653 author = {{Objective-C}}, 4654 title = {The {Objective-C} Programming Language}, 4655 organization= {Apple Computer Inc.}, 4656 address = {Cupertino, CA}, 4657 year = 2003 4658 } 4659 4660 @online{xcode7, 4682 key = {Objective-C}, 4683 title = {Objective-C}, 4684 publisher = {Apple Inc.}, 4685 year = 2015, 4686 howpublished= {\href{https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/ObjectiveC.html}{https://developer.apple.com/\-library/\-content/\-documentation/\-General/\-Conceptual/\-DevPedia-\-CocoaCore/\-ObjectiveC.html}}, 4687 note = {Accessed: 2018-03} 4688 } 4689 4690 @misc{xcode7, 4661 4691 keywords = {objective-c}, 4662 4692 contributor = {a3moss@uwaterloo.ca}, 4663 author = {{Xcode}},4664 title = {{X code}7 Release Notes},4693 key = {Xcode}, 4694 title = {{X}code 7 Release Notes}, 4665 4695 year = 2015, 4666 note= {\href{https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc7_release_notes.html}{https://developer.apple.com/\-library/\-content/\-documentation/\-Xcode/\-Conceptual/\-RN-Xcode-Archive/\-Chapters/\-xc7\_release\_notes.html}},4667 urldate = {2017-04-04}4696 howpublished= {\href{https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc7_release_notes.html}{https://developer.apple.com/\-library/\-content/\-documentation/\-Xcode/\-Conceptual/\-RN-Xcode-Archive/\-Chapters/\-xc7\_release\_notes.html}}, 4697 note = {Accessed: 2017-04} 4668 4698 } 4669 4699 … … 5442 5472 contributer = {pabuhr@plg}, 5443 5473 key = {C++98}, 5444 title = { Programming Languages -- {C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}}},5445 organization= {International Standard ISO/IEC 14882:1998 (E)},5446 publisher = { American National Standards Institute},5447 address = { www.ansi.org},5474 title = {{C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Programming Language ISO/IEC 14882:1998}, 5475 edition = {1st}, 5476 publisher = {International Standard Organization}, 5477 address = {\href{https://www.iso.org/standard/25845.html}{https://\-www.iso.org/\-standard/\-25845.html}}, 5448 5478 year = 1998, 5449 5479 } … … 5452 5482 keywords = {ISO/IEC C++ 14}, 5453 5483 contributer = {pabuhr@plg}, 5454 author= {C++14},5455 title = { Programming Languages -- {C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}}ISO/IEC 14882:2014},5484 key = {C++14}, 5485 title = {{C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Programming Language ISO/IEC 14882:2014}, 5456 5486 edition = {4th}, 5457 5487 publisher = {International Standard Organization}, … … 5976 6006 keywords = {Rust programming language}, 5977 6007 contributer = {pabuhr@plg}, 5978 author = {{Rust}},5979 title = {The {R ust}Programming Language},5980 organization= {The Rust Project Developers},6008 key = {Rust}, 6009 title = {The {R}ust Programming Language}, 6010 address = {The Rust Project Developers}, 5981 6011 year = 2015, 5982 6012 note = {\href{https://doc.rust-lang.org/reference.html}{https://\-doc.rust-lang\-.org/\-reference.html}}, … … 5988 6018 keywords = {Scala programming language}, 5989 6019 contributer = {pabuhr@plg}, 5990 author = {{Scala}},5991 title = {{S cala}Language Specification, Version 2.11},5992 organization= {\'{E}cole Polytechnique F\'{e}d\'{e}rale de Lausanne},6020 key = {Scala}, 6021 title = {{S}cala Language Specification, Version 2.11}, 6022 address = {\'{E}cole Polytechnique F\'{e}d\'{e}rale de Lausanne}, 5993 6023 year = 2016, 5994 6024 note = {\href{http://www.scala-lang.org/files/archive/spec/2.11}{http://\-www.scala-lang.org/\-files/\-archive/\-spec/\-2.11}}, … … 6089 6119 author = {Lei{\ss}a, Roland and Haffner, Immanuel and Hack, Sebastian}, 6090 6120 booktitle = {Proceedings of the 2014 Workshop on Workshop on programming models for SIMD/Vector processing}, 6091 pages = {17- -24},6121 pages = {17-24}, 6092 6122 year = {2014}, 6093 6123 organization= {ACM} … … 6335 6365 keywords = {Polymorphic C}, 6336 6366 contributor = {a3moss@uwaterloo.ca}, 6337 title = {A sound polymorphic type system for a dialect of C},6367 title = {A sound polymorphic type system for a dialect of {C}}, 6338 6368 author = {Smith, Geoffrey and Volpano, Dennis}, 6339 6369 journal = {Science of computer programming}, … … 6443 6473 } 6444 6474 6445 @ online{Sutter15,6475 @misc{Sutter15, 6446 6476 contributer = {pabuhr@plg}, 6447 6477 author = {Herb Sutter and Bjarne Stroustrup and Gabriel Dos Reis}, … … 6450 6480 month = oct, 6451 6481 year = 2015, 6452 pages = {1- -6},6482 pages = {1-6}, 6453 6483 numpages = {6}, 6454 note= {\href{http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0144r0.pdf}{http://\-www.open-std.org/\-jtc1/\-sc22/\-wg21/\-docs/\-papers/\-2015/\-p0144r0.pdf}},6484 howpublished= {\href{http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0144r0.pdf}{http://\-www.open-std.org/\-jtc1/\-sc22/\-wg21/\-docs/\-papers/\-2015/\-p0144r0.pdf}}, 6455 6485 } 6456 6486 … … 6726 6756 } 6727 6757 6728 @online{TIOBE, 6729 contributer = {pabuhr@plg}, 6730 author = {{TIOBE Index}}, 6731 year = {February 2018}, 6732 url = {http://www.tiobe.com/tiobe_index}, 6758 @misc{TIOBE, 6759 contributer = {pabuhr@plg}, 6760 key = {TIOBE Index}, 6761 title = {{TIOBE} Index}, 6762 howpublished= {\href{http://www.tiobe.com/tiobe_index}{http://\-www.tiobe.com/\-tiobe\_index}}, 6763 note = {Accessed: 2018-09}, 6733 6764 } 6734 6765 … … 6741 6772 month = sep, 6742 6773 year = 1990, 6743 note = {}6744 6774 } 6745 6775 … … 7048 7078 } 7049 7079 7050 @ online{Vala,7080 @misc{Vala, 7051 7081 keywords = {GObject, Vala}, 7052 7082 contributor = {a3moss@uwaterloo.ca}, 7053 author = {{Vala}},7054 organization= {The GNOMEProject},7055 title = { Vala Reference Manual},7083 key = {Vala}, 7084 organization= {The {GNOME} Project}, 7085 title = {{V}ala Reference Manual}, 7056 7086 year = 2017, 7057 url = {https://wiki.gnome.org/Projects/Vala/Manual},7058 urldate = {2017-04-04}7087 howpublished= {\url{https://wiki.gnome.org/Projects/Vala/Manual}}, 7088 note = {Accessed: 2017-04} 7059 7089 } 7060 7090 -
doc/papers/general/.gitignore
r720a007 r753f13c9 3 3 *.pdf 4 4 *.ps 5 6 Paper.tex.plain 7 mail 8 Paper.out.ps 9 WileyNJD-AMA.bst -
doc/papers/general/Makefile
r720a007 r753f13c9 3 3 Build = build 4 4 Figures = figures 5 Macros = ../../LaTeXmacros5 Macros = AMA/AMA-stix/ama 6 6 TeXLIB = .:${Macros}:${Build}:../../bibliography: 7 7 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=${Build} 8 8 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex 9 9 10 MAKEFLAGS = --no-print-directory --silent #10 MAKEFLAGS = --no-print-directory # --silent 11 11 VPATH = ${Build} ${Figures} evaluation 12 12 … … 34 34 35 35 DOCUMENT = Paper.pdf 36 BASE = ${basename ${DOCUMENT}} 36 37 37 38 # Directives # … … 42 43 43 44 clean : 44 @rm -frv ${DOCUMENT} ${ basename ${DOCUMENT}}.ps ${Build}45 @rm -frv ${DOCUMENT} ${BASE}.ps WileyNJD-AMA.bst ${BASE}.out.ps ${Build} 45 46 46 47 # File Dependencies # 47 48 48 ${DOCUMENT} : ${ basename ${DOCUMENT}}.ps49 ${DOCUMENT} : ${BASE}.ps 49 50 ps2pdf $< 50 51 51 ${ basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi52 ${BASE}.ps : ${BASE}.dvi 52 53 dvips ${Build}/$< -o $@ 53 54 54 ${ basename ${DOCUMENT}}.dvi : Makefile ${Build}${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \55 ${Macros}/common.tex ${Macros}/indexstyle../../bibliography/pl.bib55 ${BASE}.dvi : Makefile ${Build} ${BASE}.out.ps WileyNJD-AMA.bst ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 56 ../../bibliography/pl.bib 56 57 # Must have *.aux file containing citations for bibtex 57 58 if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi 58 -${BibTeX} ${Build}/${basename $@}59 ${BibTeX} ${Build}/${basename $@} 59 60 # Some citations reference others so run again to resolve these citations 60 61 ${LaTeX} ${basename $@}.tex 61 -${BibTeX} ${Build}/${basename $@}62 ${BibTeX} ${Build}/${basename $@} 62 63 # Run again to finish citations 63 64 ${LaTeX} ${basename $@}.tex … … 67 68 ${Build}: 68 69 mkdir -p ${Build} 70 71 ${BASE}.out.ps: 72 ln -fs build/Paper.out.ps . 73 74 WileyNJD-AMA.bst: 75 ln -fs AMA/AMA-stix/ama/WileyNJD-AMA.bst . 69 76 70 77 ${GRAPHS} : timing.gp timing.dat -
doc/papers/general/Paper.tex
r720a007 r753f13c9 1 \documentclass{article} 2 3 \usepackage{fullpage} 1 \documentclass[AMA,STIX1COL]{WileyNJD-v2} 2 3 \articletype{RESEARCH ARTICLE}% 4 5 \received{26 April 2016} 6 \revised{6 June 2016} 7 \accepted{6 June 2016} 8 9 \raggedbottom 10 11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12 13 % Latex packages used in the document. 14 4 15 \usepackage{epic,eepic} 5 \usepackage{xspace,calc,comment} 16 \usepackage{xspace} 17 \usepackage{comment} 6 18 \usepackage{upquote} % switch curled `'" to straight 7 19 \usepackage{listings} % format program code 8 \usepackage{enumitem} 9 \setlist[itemize]{topsep=3pt,itemsep=2pt,parsep=0pt}% global 10 \usepackage[flushmargin]{footmisc} % support label/reference in footnote 11 \usepackage{rotating} 12 \usepackage[usenames]{color} 13 \usepackage{pslatex} % reduce size of san serif font 14 \usepackage[plainpages=false,pdfpagelabels,pdfpagemode=UseNone,pagebackref=true,breaklinks=true,colorlinks=true,linkcolor=blue,citecolor=blue,urlcolor=blue]{hyperref} 15 \urlstyle{sf} 16 \usepackage{breakurl} 17 18 \setlength{\textheight}{9in} 19 %\oddsidemargin 0.0in 20 \renewcommand{\topfraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 21 \renewcommand{\bottomfraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 22 \renewcommand{\floatpagefraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 23 \renewcommand{\textfraction}{0.0} % the entire page maybe devoted to floats with no text on the page at all 20 %\usepackage{enumitem} 21 %\setlist[itemize]{topsep=3pt,itemsep=2pt,parsep=0pt}% global 22 %\usepackage{rotating} 23 24 \hypersetup{breaklinks=true} 25 \definecolor{ForestGreen}{cmyk}{1, 0, 0.99995, 0} 26 27 \usepackage[pagewise]{lineno} 28 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 24 29 25 30 \lefthyphenmin=4 % hyphen only after 4 characters 26 31 \righthyphenmin=4 32 33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 34 28 35 % Names used in the document. … … 64 71 \newlength{\gcolumnposn} % temporary hack because lstlisting does not handle tabs correctly 65 72 \newlength{\columnposn} 66 \setlength{\gcolumnposn}{ 2.75in}73 \setlength{\gcolumnposn}{3.5in} 67 74 \setlength{\columnposn}{\gcolumnposn} 68 75 \newcommand{\C}[2][\@empty]{\ifx#1\@empty\else\global\setlength{\columnposn}{#1}\global\columnposn=\columnposn\fi\hfill\makebox[\textwidth-\columnposn][l]{\lst@basicstyle{\LstCommentStyle{#2}}}} … … 97 104 }% 98 105 \newcommand{\ETAL}{\abbrevFont{et}~\abbrevFont{al}} 99 \ newcommand*{\etal}{%106 \renewcommand*{\etal}{% 100 107 \@ifnextchar{.}{\protect\ETAL}% 101 108 {\protect\ETAL.\xspace}% … … 145 152 belowskip=3pt, 146 153 % replace/adjust listing characters that look bad in sanserif 147 literate={-}{\makebox[1ex][c]{\raisebox{0.4ex}{\rule{0.8ex}{0.1ex}}}}1 {^}{\raisebox{0.6ex}{$\scripts criptstyle\land\,$}}1148 {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 {@}{\small{@}}1 {<}{\small{\textless}}1 {>}{\small{\textgreater}}1% {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1149 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0. 4ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\small\textgreater}}2,154 literate={-}{\makebox[1ex][c]{\raisebox{0.4ex}{\rule{0.8ex}{0.1ex}}}}1 {^}{\raisebox{0.6ex}{$\scriptstyle\land\,$}}1 155 {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 % {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1 156 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\textgreater}}2, 150 157 moredelim=**[is][\color{red}]{`}{`}, 151 158 }% lstset 152 153 % inline code @...@154 \lstMakeShortInline@%155 159 156 160 \lstnewenvironment{cfa}[1][] … … 161 165 {} 162 166 163 164 \title{\protect\CFA : Adding Modern Programming Language Features to C} 165 166 \author{Aaron Moss, Robert Schluntz, Peter Buhr} 167 % \email{a3moss@uwaterloo.ca} 168 % \email{rschlunt@uwaterloo.ca} 169 % \email{pabuhr@uwaterloo.ca} 170 % \affiliation{% 171 % \institution{University of Waterloo} 172 % \department{David R. Cheriton School of Computer Science} 173 % \streetaddress{Davis Centre, University of Waterloo} 174 % \city{Waterloo} 175 % \state{ON} 176 % \postcode{N2L 3G1} 177 % \country{Canada} 178 % } 179 180 %\terms{generic, tuple, variadic, types} 181 %\keywords{generic types, tuple types, variadic types, polymorphic functions, C, Cforall} 182 183 \begin{document} 184 \maketitle 185 186 187 \begin{abstract} 167 % inline code @...@ 168 \lstMakeShortInline@% 169 170 171 \title{\texorpdfstring{\protect\CFA : Adding Modern Programming Language Features to C}{Cforall : Adding Modern Programming Language Features to C}} 172 173 \author[1]{Aaron Moss} 174 \author[1]{Robert Schluntz} 175 \author[1]{Peter A. Buhr*} 176 177 \address[1]{\orgdiv{David R. Cheriton School of Computer Science}, \orgname{University of Waterloo}, \orgaddress{\state{Ontario}, \country{Canada}}} 178 179 \corres{*Peter A. Buhr, \email{pabuhr{\char`\@}uwaterloo.ca}} 180 \presentaddress{David R. Cheriton School of Computer Science, University of Waterloo, Waterloo, ON, N2L 3G1, Canada} 181 182 183 \abstract[Summary]{ 188 184 The C programming language is a foundational technology for modern computing with millions of lines of code implementing everything from commercial operating-systems to hobby projects. 189 185 This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more. … … 195 191 This paper presents a quick tour of \CFA features showing how their design avoids shortcomings of similar features in C and other C-like languages. 196 192 Finally, experimental results are presented to validate several of the new features. 197 \end{abstract} 193 }% 194 195 \keywords{generic types, tuple types, variadic types, polymorphic functions, C, Cforall} 196 197 198 \begin{document} 199 \linenumbers % comment out to turn off line numbering 200 201 \maketitle 198 202 199 203 … … 230 234 \CFA is currently implemented as a source-to-source translator from \CFA to the gcc-dialect of C~\cite{GCCExtensions}, allowing it to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3). 231 235 Ultimately, a compiler is necessary for advanced features and optimal performance. 232 All of the features discussed in this paper are working, unless a feature states it is a future feature for completion.236 All features discussed in this paper are working, unless otherwise stated as under construction. 233 237 234 238 Finally, it is impossible to describe a programming language without usages before definitions. … … 258 262 259 263 \begin{cfa} 260 int max = 2147483647; $\C[3.75in]{// (1)}$264 int max = 2147483647; $\C[4in]{// (1)}$ 261 265 double max = 1.7976931348623157E+308; $\C{// (2)}$ 262 266 int max( int a, int b ) { return a < b ? b : a; } $\C{// (3)}$ 263 267 double max( double a, double b ) { return a < b ? b : a; } $\C{// (4)}\CRT$ 264 max( 7, -max ); $\C{// uses (3) and (1), by matching int from constant 7}$265 max( max, 3.14 ); 266 max( max, -max ); 267 int m = max( max, -max ); $\C{// uses (3) and (1) twice, by matching return type}$268 max( 7, -max ); $\C[2.75in]{// uses (3) and (1), by matching int from constant 7}$ 269 max( max, 3.14 ); $\C{// uses (4) and (2), by matching double from constant 3.14}$ 270 max( max, -max ); $\C{// ERROR: ambiguous}$ 271 int m = max( max, -max ); $\C{// uses (3) and (1) twice, by matching return type}\CRT$ 268 272 \end{cfa} 269 273 … … 292 296 \begin{cfa} 293 297 `forall( otype T )` T identity( T val ) { return val; } 294 int forty_two = identity( 42 ); 298 int forty_two = identity( 42 ); $\C{// T is bound to int, forty\_two == 42}$ 295 299 \end{cfa} 296 300 This @identity@ function can be applied to any complete \newterm{object type} (or @otype@). … … 306 310 For example, the function @twice@ can be defined using the \CFA syntax for operator overloading: 307 311 \begin{cfa} 308 forall( otype T `| { T ?+?(T, T); }` ) T twice( T x ) { return x `+` x; } 312 forall( otype T `| { T ?+?(T, T); }` ) T twice( T x ) { return x `+` x; } $\C{// ? denotes operands}$ 309 313 int val = twice( twice( 3.7 ) ); 310 314 \end{cfa} … … 325 329 } 326 330 double key = 5.0, vals[10] = { /* 10 sorted float values */ }; 327 double * val = (double *)bsearch( &key, vals, 10, sizeof(vals[0]), comp ); 331 double * val = (double *)bsearch( &key, vals, 10, sizeof(vals[0]), comp ); $\C{// search sorted array}$ 328 332 \end{cfa} 329 333 which can be augmented simply with a generalized, type-safe, \CFA-overloaded wrappers: … … 335 339 forall( otype T | { int ?<?( T, T ); } ) unsigned int bsearch( T key, const T * arr, size_t size ) { 336 340 T * result = bsearch( key, arr, size ); $\C{// call first version}$ 337 return result ? result - arr : size; 338 } 339 double * val = bsearch( 5.0, vals, 10 ); 341 return result ? result - arr : size; $\C{// pointer subtraction includes sizeof(T)}$ 342 } 343 double * val = bsearch( 5.0, vals, 10 ); $\C{// selection based on return type}$ 340 344 int posn = bsearch( 5.0, vals, 10 ); 341 345 \end{cfa} … … 361 365 forall( otype T | { int ?<?( T, T ); } ) void qsort( const T * arr, size_t size ) { /* use C qsort */ } 362 366 { 363 int ?<?( double x, double y ) { return x `>` y; } 367 int ?<?( double x, double y ) { return x `>` y; } $\C{// locally override behaviour}$ 364 368 qsort( vals, size ); $\C{// descending sort}$ 365 369 } … … 368 372 Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types. 369 373 370 Unconstruction is a mechanism to distribute @forall@ over related routines/types (see @stack@ examples in Section~\ref{sec:eval}): 371 \begin{cfa} 372 forall( otype T ) { $\C{// forall block}$ 373 struct stack { stack_node(T) * head; }; $\C{// generic type}$ 374 void push( stack(T) & s, T value ) ... $\C{// generic operations}$ 375 T pop( stack(T) & s ) ... 376 } 377 \end{cfa} 378 Each block declaration is prefixed with the initial @forall@ clause significantly reducing duplication. 374 Under construction is a mechanism to distribute @forall@ over routines/types, where each block declaration is prefixed with the initial @forall@ clause significantly reducing duplication (see @stack@ examples in Section~\ref{sec:eval}): 375 \begin{cfa} 376 forall( otype `T` ) { $\C{// forall block}$ 377 struct stack { stack_node(`T`) * head; }; $\C{// generic type}$ 378 void push( stack(`T`) & s, `T` value ) ... $\C{// generic operations}$ 379 T pop( stack(`T`) & s ) ... 380 } 381 \end{cfa} 379 382 380 383 … … 388 391 T ?+=?( T *, T ); 389 392 T ++?( T * ); 390 T ?++( T * ); };391 393 T ?++( T * ); 394 }; 392 395 forall( otype T `| summable( T )` ) T sum( T a[$\,$], size_t size ) { // use trait 393 396 `T` total = { `0` }; $\C{// instantiate T from 0 by calling its constructor}$ 394 397 for ( unsigned int i = 0; i < size; i += 1 ) total `+=` a[i]; $\C{// select appropriate +}$ 395 return total; } 398 return total; 399 } 396 400 \end{cfa} 397 401 … … 402 406 void ?{}( T &, T ); $\C{// copy constructor}$ 403 407 void ?=?( T &, T ); $\C{// assignment operator}$ 404 void ^?{}( T & ); }; $\C{// destructor}$ 408 void ^?{}( T & ); $\C{// destructor}$ 409 }; 405 410 \end{cfa} 406 411 Given the information provided for an @otype@, variables of polymorphic type can be treated as if they were a complete type: stack-allocatable, default or copy-initialized, assigned, and deleted. … … 654 659 p`->0` = 5; $\C{// change quotient}$ 655 660 bar( qr`.1`, qr ); $\C{// pass remainder and quotient/remainder}$ 656 rem = [div( 13, 5 ), 42]`.0.1`; $\C{// access 2nd component of 1st component of tuple expression}$661 rem = [div( 13, 5 ), 42]`.0.1`; $\C{// access 2nd component of 1st component}$ 657 662 \end{cfa} 658 663 … … 663 668 Tuple flattening recursively expands a tuple into the list of its basic components. 664 669 Tuple structuring packages a list of expressions into a value of tuple type, \eg: 665 %\lstDeleteShortInline@%666 %\par\smallskip667 %\begin{tabular}{@{}l@{\hspace{1.5\parindent}}||@{\hspace{1.5\parindent}}l@{}}668 670 \begin{cfa} 669 671 int f( int, int ); … … 672 674 [int, int] x; 673 675 int y; 674 f( x ); $\C{// flatten}$ 675 g( y, 10 ); $\C{// structure}$ 676 h( x, y ); $\C{// flatten and structure}$ 677 \end{cfa} 678 %\end{cfa} 679 %& 680 %\begin{cfa} 681 %\end{tabular} 682 %\smallskip\par\noindent 683 %\lstMakeShortInline@% 676 f( x ); $\C{// flatten}$ 677 g( y, 10 ); $\C{// structure}$ 678 h( x, y ); $\C{// flatten and structure}$ 679 \end{cfa} 684 680 In the call to @f@, @x@ is implicitly flattened so the components of @x@ are passed as the two arguments. 685 681 In the call to @g@, the values @y@ and @10@ are structured into a single argument of type @[int, int]@ to match the parameter type of @g@. … … 692 688 An assignment where the left side is a tuple type is called \newterm{tuple assignment}. 693 689 There are two kinds of tuple assignment depending on whether the right side of the assignment operator has a tuple type or a non-tuple type, called \newterm{multiple} and \newterm{mass assignment}, respectively. 694 %\lstDeleteShortInline@%695 %\par\smallskip696 %\begin{tabular}{@{}l@{\hspace{1.5\parindent}}||@{\hspace{1.5\parindent}}l@{}}697 690 \begin{cfa} 698 691 int x = 10; … … 704 697 [y, x] = 3.14; $\C{// mass assignment}$ 705 698 \end{cfa} 706 %\end{cfa}707 %&708 %\begin{cfa}709 %\end{tabular}710 %\smallskip\par\noindent711 %\lstMakeShortInline@%712 699 Both kinds of tuple assignment have parallel semantics, so that each value on the left and right side is evaluated before any assignments occur. 713 700 As a result, it is possible to swap the values in two variables without explicitly creating any temporary variables or calling a function, \eg, @[x, y] = [y, x]@. … … 733 720 Here, the mass assignment sets all members of @s@ to zero. 734 721 Since tuple-index expressions are a form of member-access expression, it is possible to use tuple-index expressions in conjunction with member tuple expressions to manually restructure a tuple (\eg rearrange, drop, and duplicate components). 735 %\lstDeleteShortInline@%736 %\par\smallskip737 %\begin{tabular}{@{}l@{\hspace{1.5\parindent}}||@{\hspace{1.5\parindent}}l@{}}738 722 \begin{cfa} 739 723 [int, int, long, double] x; … … 743 727 [int, int, int] y = x.[2, 0, 2]; $\C{// duplicate: [y.0, y.1, y.2] = [x.2, x.0.x.2]}$ 744 728 \end{cfa} 745 %\end{cfa}746 %&747 %\begin{cfa}748 %\end{tabular}749 %\smallskip\par\noindent750 %\lstMakeShortInline@%751 729 It is also possible for a member access to contain other member accesses, \eg: 752 730 \begin{cfa} … … 1038 1016 \begin{cquote} 1039 1017 \lstDeleteShortInline@% 1040 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}1041 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1018 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1019 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1042 1020 \begin{cfa} 1043 1021 case 2, 10, 34, 42: … … 1053 1031 \begin{cquote} 1054 1032 \lstDeleteShortInline@% 1055 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}1056 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1033 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1034 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1057 1035 \begin{cfa} 1058 1036 case 2~42: … … 1070 1048 \end{cfa} 1071 1049 1072 C allows placement of @case@ clauses \emph{within} statements nested in the @switch@ body ( seeDuff's device~\cite{Duff83});1050 C allows placement of @case@ clauses \emph{within} statements nested in the @switch@ body (called Duff's device~\cite{Duff83}); 1073 1051 \begin{cfa} 1074 1052 switch ( i ) { … … 1081 1059 } 1082 1060 \end{cfa} 1083 \CFA precludes this form of transfer intoa control structure because it causes undefined behaviour, especially with respect to missed initialization, and provides very limited functionality.1061 \CFA precludes this form of transfer \emph{into} a control structure because it causes undefined behaviour, especially with respect to missed initialization, and provides very limited functionality. 1084 1062 1085 1063 C allows placement of declaration within the @switch@ body and unreachable code at the start, resulting in undefined behaviour: … … 1146 1124 \end{figure} 1147 1125 1148 Finally, @fallthrough@ may appear in contexts other than terminating a @case@ clause, and have an explicit transfer label allowing separate cases but common final-code for a set of cases: 1149 \begin{cquote} 1126 Finally, Figure~\ref{f:FallthroughStatement} shows @fallthrough@ may appear in contexts other than terminating a @case@ clause, and have an explicit transfer label allowing separate cases but common final-code for a set of cases. 1127 The target label must be below the @fallthrough@, \ie @fallthrough@ cannot form a loop, and the label may not be nested in a control structure, \ie it must be at the same level as the @case@ clauses; 1128 the target label may be case @default@. 1129 1130 \begin{figure} 1131 \centering 1150 1132 \lstDeleteShortInline@% 1151 1133 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} … … 1169 1151 case 4: 1170 1152 ... `fallthrough common;` 1171 common: // below fallthrough a nd at same level as case clauses1153 common: // below fallthrough at same level as case clauses 1172 1154 ... // common code for cases 3 and 4 1173 1155 // implicit break … … 1176 1158 \end{tabular} 1177 1159 \lstMakeShortInline@% 1178 \ end{cquote}1179 The target label must be below the @fallthrough@, \ie @fallthrough@ cannot form a loop, and the label may not be nested in a control structure, \ie it must be at the same level as the @case@ clauses; 1180 the target label may be case @default@. 1160 \caption{\lstinline|fallthrough| Statement} 1161 \label{f:FallthroughStatement} 1162 \end{figure} 1181 1163 1182 1164 Collectively, these control-structure enhancements reduce programmer burden and increase readability and safety. … … 1310 1292 R r; 1311 1293 ... `resume( r );` ... 1312 ... r.fix // control does returnhere after handler1294 ... r.fix // control returns here after handler 1313 1295 } 1314 1296 `try` { … … 1423 1405 1424 1406 1425 \subsection{\texorpdfstring{\protect\lstinline{with} Clause / Statement}{with Clause /Statement}}1426 \label{s:With ClauseStatement}1407 \subsection{\texorpdfstring{\protect\lstinline{with} Statement}{with Statement}} 1408 \label{s:WithStatement} 1427 1409 1428 1410 Grouping heterogeneous data into \newterm{aggregate}s (structure/union) is a common programming practice, and an aggregate can be further organized into more complex structures, such as arrays and containers: … … 1444 1426 A similar situation occurs in object-oriented programming, \eg \CC: 1445 1427 \begin{C++} 1446 class C{1428 struct S { 1447 1429 char c; $\C{// fields}$ 1448 1430 int i; 1449 1431 double d; 1450 intf() { $\C{// implicit ``this'' aggregate}$1432 void f() { $\C{// implicit ``this'' aggregate}$ 1451 1433 `this->`c; `this->`i; `this->`d; $\C{// access containing fields}$ 1452 1434 } 1453 1435 } 1454 1436 \end{C++} 1455 Object-oriented nesting of member functions in a \lstinline[language=C++]@class @ allows eliding \lstinline[language=C++]@this->@ because of lexical scoping.1437 Object-oriented nesting of member functions in a \lstinline[language=C++]@class/struct@ allows eliding \lstinline[language=C++]@this->@ because of lexical scoping. 1456 1438 However, for other aggregate parameters, qualification is necessary: 1457 1439 \begin{cfa} 1458 1440 struct T { double m, n; }; 1459 int C::f( T & t ) { $\C{// multiple aggregate parameters}$1460 c; i; d; $\C{\color{red}// this--{\ small\textgreater}.c, this--{\small\textgreater}.i, this--{\small\textgreater}.d}$1441 int S::f( T & t ) { $\C{// multiple aggregate parameters}$ 1442 c; i; d; $\C{\color{red}// this--{\textgreater}.c, this--{\textgreater}.i, this--{\textgreater}.d}$ 1461 1443 `t.`m; `t.`n; $\C{// must qualify}$ 1462 1444 } … … 1472 1454 with the generality of opening multiple aggregate-parameters: 1473 1455 \begin{cfa} 1474 intf( S & s, T & t ) `with ( s, t )` { $\C{// multiple aggregate parameters}$1456 void f( S & s, T & t ) `with ( s, t )` { $\C{// multiple aggregate parameters}$ 1475 1457 c; i; d; $\C{\color{red}// s.c, s.i, s.d}$ 1476 1458 m; n; $\C{\color{red}// t.m, t.n}$ … … 1538 1520 \begin{cfa} 1539 1521 struct S { int i, j; } sv; 1540 with ( sv ) { $\C{ implicit reference}$1522 with ( sv ) { $\C{// implicit reference}$ 1541 1523 S & sr = sv; 1542 with ( sr ) { $\C{ explicit reference}$1524 with ( sr ) { $\C{// explicit reference}$ 1543 1525 S * sp = &sv; 1544 with ( *sp ) { $\C{ computed reference}$1545 i = 3; j = 4; $\C{\color{red}// sp--{\ small\textgreater}i, sp--{\small\textgreater}j}$1526 with ( *sp ) { $\C{// computed reference}$ 1527 i = 3; j = 4; $\C{\color{red}// sp--{\textgreater}i, sp--{\textgreater}j}$ 1546 1528 } 1547 1529 i = 2; j = 3; $\C{\color{red}// sr.i, sr.j}$ … … 1593 1575 \begin{cquote} 1594 1576 \lstDeleteShortInline@% 1595 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{\hspace{\parindentlnth}}l@{}}1596 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1577 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 1578 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1597 1579 \begin{cfa} 1598 1580 `[5] *` int x1; … … 1609 1591 \begin{cfa} 1610 1592 // array of 5 pointers to int 1611 // pointer to a n array of 5 int1612 // function returning pointer to a n array of 5 int and taking anint1593 // pointer to array of 5 int 1594 // function returning pointer to array of 5 int and taking int 1613 1595 \end{cfa} 1614 1596 \end{tabular} … … 1621 1603 \begin{cquote} 1622 1604 \lstDeleteShortInline@% 1623 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}1624 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1605 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1606 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1625 1607 \begin{cfa} 1626 1608 `*` int x, y; … … 1641 1623 \begin{cquote} 1642 1624 \lstDeleteShortInline@% 1643 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{\hspace{\parindentlnth}}l@{}}1644 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{\parindentlnth}}}{\textbf{C}} \\1625 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 1626 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}} \\ 1645 1627 \begin{cfa} 1646 1628 [ 5 ] int z; … … 1683 1665 \begin{cquote} 1684 1666 \lstDeleteShortInline@% 1685 \begin{tabular}{@{}l@{\hspace{ 1em}}l@{\hspace{1em}}l@{}}1686 \multicolumn{1}{c@{\hspace{ 1em}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{1em}}}{\textbf{C}} \\1667 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 1668 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}} \\ 1687 1669 \begin{cfa} 1688 1670 extern const * const int x; 1689 static const * [ 5] const int y;1671 static const * [5] const int y; 1690 1672 \end{cfa} 1691 1673 & 1692 1674 \begin{cfa} 1693 1675 int extern const * const x; 1694 static const int (* const y)[ 5]1676 static const int (* const y)[5] 1695 1677 \end{cfa} 1696 1678 & … … 1708 1690 \begin{cquote} 1709 1691 \lstDeleteShortInline@% 1710 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}1711 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1692 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1693 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1712 1694 \begin{cfa} 1713 1695 y = (* int)x; … … 1726 1708 as well, parameter names are optional, \eg: 1727 1709 \begin{cfa} 1728 [ int x ] f ( /* void */ ); $\C{// returning int with no parameters}$1729 [ int x ] f (...); 1730 [ * int ] g ( int y ); 1731 [ void ] h ( int, char ); 1732 [ * int, int ] j ( int ); $\C{// returning pointer to int and int,with int parameter}$1710 [ int x ] f ( /* void */ ); $\C[2.5in]{// returning int with no parameters}$ 1711 [ int x ] f (...); $\C{// returning int with unknown parameters}$ 1712 [ * int ] g ( int y ); $\C{// returning pointer to int with int parameter}$ 1713 [ void ] h ( int, char ); $\C{// returning no result with int and char parameters}$ 1714 [ * int, int ] j ( int ); $\C{// returning pointer to int and int with int parameter}$ 1733 1715 \end{cfa} 1734 1716 This syntax allows a prototype declaration to be created by cutting and pasting source text from the function-definition header (or vice versa). … … 1736 1718 \begin{cquote} 1737 1719 \lstDeleteShortInline@% 1738 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}1739 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1720 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1721 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1740 1722 \begin{cfa} 1741 1723 [double] foo(), foo( int ), foo( double ) {...} … … 1752 1734 The syntax for pointers to \CFA functions specifies the pointer name on the right, \eg: 1753 1735 \begin{cfa} 1754 * [ int x ] () fp; 1755 * [ * int ] ( int y ) gp; 1756 * [ ] ( int, char ) hp; 1757 * [ * int, int ] ( int ) jp; $\C{// pointer to function returning pointer to int and int,with int parameter}$1736 * [ int x ] () fp; $\C{// pointer to function returning int with no parameters}$ 1737 * [ * int ] ( int y ) gp; $\C{// pointer to function returning pointer to int with int parameter}$ 1738 * [ ] ( int, char ) hp; $\C{// pointer to function returning no result with int and char parameters}$ 1739 * [ * int, int ] ( int ) jp; $\C{// pointer to function returning pointer to int and int with int parameter}$ 1758 1740 \end{cfa} 1759 1741 Note, a function name cannot be specified: 1760 1742 \begin{cfa} 1761 * [ int x ] f () fp; $\C{// function name "f" is disallowed}$1743 * [ int x ] f () fp; $\C{// function name "f" is disallowed}\CRT$ 1762 1744 \end{cfa} 1763 1745 … … 2063 2045 \begin{cquote} 2064 2046 \lstDeleteShortInline@% 2065 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{\hspace{\parindentlnth}}l@{}}2047 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 2066 2048 \begin{cfa} 2067 2049 20_`hh` // signed char … … 2147 2129 return (W){ l.stones + r.stones }; 2148 2130 } 2149 W |?`st|( double w) { return (W){ w }; }2150 W |?`lb|( double w ) { return (W){ w /14.0 }; }2151 W |?`kg|( double w ) { return (W) { w *0.16 }; }2131 W |?`st|(double w) { return (W){ w }; } 2132 W |?`lb|(double w) { return (W){ w/14.0 }; } 2133 W |?`kg|(double w) { return (W){ w*0.16 }; } 2152 2134 2153 2135 … … 2172 2154 return W( l.stones + r.stones ); 2173 2155 } 2174 W |operator"" _st|( unsigned long long int w ) { return W( w); }2175 W |operator"" _lb|( unsigned long long int w ) { return W( w / 14.0); }2176 W |operator"" _kg|( unsigned long long int w ) { return W( w * 0.16); }2177 W |operator"" _st|(long double w ) { return W( w ); }2178 W |operator"" _lb|(long double w ) { return W( w / 14.0 ); }2179 W |operator"" _kg|(long double w ) { return W( w * 0.16 ); }2156 W |operator""_st|(unsigned long long int w) {return W(w); } 2157 W |operator""_lb|(unsigned long long int w) {return W(w/14.0); } 2158 W |operator""_kg|(unsigned long long int w) {return W(w*0.16); } 2159 W |operator""_st|(long double w ) { return W( w ); } 2160 W |operator""_lb|(long double w ) { return W( w / 14.0 ); } 2161 W |operator""_kg|(long double w ) { return W( w * 0.16 ); } 2180 2162 int main() { 2181 2163 W w, heavy = { 20 }; … … 2210 2192 \begin{cquote} 2211 2193 \lstDeleteShortInline@% 2212 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2213 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\2194 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2195 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\ 2214 2196 \begin{cfa} 2215 2197 const short int `MIN` = -32768; … … 2229 2211 \begin{cquote} 2230 2212 \lstDeleteShortInline@% 2231 \lstset{basicstyle=\linespread{0.9}\sf\small} 2232 \begin{tabular}{@{}l@{\hspace{0.5\parindentlnth}}l@{}} 2233 \multicolumn{1}{c@{\hspace{0.5\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 2213 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2214 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 2234 2215 \begin{cfa} 2235 2216 MIN 2217 2236 2218 MAX 2219 2237 2220 PI 2238 2221 E … … 2240 2223 & 2241 2224 \begin{cfa} 2242 SCHAR_MIN, CHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN, FLT_MIN, DBL_MIN, LDBL_MIN 2243 SCHAR_MAX, UCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX, FLT_MAX, DBL_MAX, LDBL_MAX 2225 SCHAR_MIN, CHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN, 2226 FLT_MIN, DBL_MIN, LDBL_MIN 2227 SCHAR_MAX, UCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX, 2228 FLT_MAX, DBL_MAX, LDBL_MAX 2244 2229 M_PI, M_PIl 2245 2230 M_E, M_El … … 2256 2241 \begin{cquote} 2257 2242 \lstDeleteShortInline@% 2258 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2259 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\2243 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2244 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\ 2260 2245 \begin{cfa} 2261 2246 float `log`( float x ); … … 2275 2260 \begin{cquote} 2276 2261 \lstDeleteShortInline@% 2277 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2278 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2262 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2263 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 2279 2264 \begin{cfa} 2280 2265 log … … 2303 2288 \begin{cquote} 2304 2289 \lstDeleteShortInline@% 2305 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2306 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\2290 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2291 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\ 2307 2292 \begin{cfa} 2308 2293 unsigned int `abs`( int ); … … 2322 2307 \begin{cquote} 2323 2308 \lstDeleteShortInline@% 2324 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2325 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2309 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2310 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 2326 2311 \begin{cfa} 2327 2312 abs … … 2342 2327 The following shows one example where \CFA \emph{extends} an existing standard C interface to reduce complexity and provide safety. 2343 2328 C/\Celeven provide a number of complex and overlapping storage-management operation to support the following capabilities: 2344 \begin{description} [topsep=3pt,itemsep=2pt,parsep=0pt]2329 \begin{description}%[topsep=3pt,itemsep=2pt,parsep=0pt] 2345 2330 \item[fill] 2346 2331 an allocation with a specified character. … … 2392 2377 \end{cfa} 2393 2378 \lstDeleteShortInline@% 2394 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2395 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2379 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2380 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 2396 2381 \begin{cfa} 2397 2382 ip = alloc(); … … 2414 2399 ip = (int *)malloc( sizeof( int ) ); memset( ip, fill, dim * sizeof( int ) ); 2415 2400 ip = (int *)realloc( ip, 2 * dim * sizeof( int ) ); 2416 ip = (int *)realloc( ip, 4 * dim * sizeof( int ) ); memset( ip, fill, 4 * dim * sizeof( int ) );2417 2401 ip = (int *)realloc( ip, 4 * dim * sizeof( int ) ); 2402 memset( ip, fill, 4 * dim * sizeof( int ) ); 2418 2403 ip = memalign( 16, sizeof( int ) ); 2419 2404 ip = memalign( 16, sizeof( int ) ); memset( ip, fill, sizeof( int ) ); … … 2452 2437 \begin{cquote} 2453 2438 \lstDeleteShortInline@% 2454 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2455 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\2439 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2440 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\ 2456 2441 \begin{cfa} 2457 2442 int x = 1, y = 2, z = 3; … … 2541 2526 \centering 2542 2527 \lstDeleteShortInline@% 2543 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}@{\hspace{\parindentlnth}}l@{}}2544 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}} \\2528 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}@{\hspace{2\parindentlnth}}l@{}} 2529 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{2\parindentlnth}}c}{\textbf{C}} \\ 2545 2530 \begin{cfa} 2546 2531 #include <gmp> … … 2737 2722 Objective-C and Cyclone are two other extensions to C with different design goals than \CFA, as discussed above. 2738 2723 Other languages extend C with more focused features. 2739 CUDA~\cite{Nickolls08}, ispc~\cite{Pharr12}, and Sierra~\cite{Leissa14} add data-parallel primitives to C or \CC; 2740 such features have not yet been added to \CFA, but are easily incorporated within its design. 2741 Finally, some C extensions (or suggested extensions) attempt to provide a more memory-safe C~\cite{Boehm88,Rafkind09}; 2742 type-checked polymorphism in \CFA covers several of C's memory-safety issues, but more aggressive approaches such as annotating all pointer types with their nullability are contradictory to \CFA's backwards compatibility goals. 2724 $\mu$\CC~\cite{uC++book}, CUDA~\cite{Nickolls08}, ispc~\cite{Pharr12}, and Sierra~\cite{Leissa14} add concurrent or data-parallel primitives to C or \CC; 2725 data-parallel features have not yet been added to \CFA, but are easily incorporated within its design, while concurrency primitives similar to those in $\mu$\CC have already been added~\cite{Delisle18}. 2726 Finally, CCured~\cite{Necula02} and Ironclad \CC~\cite{DeLozier13} attempt to provide a more memory-safe C by annotating pointer types with garbage collection information; type-checked polymorphism in \CFA covers several of C's memory-safety issues, but more aggressive approaches such as annotating all pointer types with their nullability or requiring runtime garbage collection are contradictory to \CFA's backwards compatibility goals. 2743 2727 2744 2728 … … 2789 2773 \section{Acknowledgments} 2790 2774 2791 The authors would like to recognize the design assistance of Glen Ditchfield, Richard Bilson, Thierry Delisle, and Andrew Beach on the features described in this paper, and thank Magnus Madsen for feedback in the writing. 2792 This work is supported through a corporate partnership with Huawei Ltd.\ (\url{http://www.huawei.com}), and Aaron Moss and Peter Buhr are partially funded by the Natural Sciences and Engineering Research Council of Canada. 2793 2794 % the first author's \grantsponsor{NSERC-PGS}{NSERC PGS D}{http://www.nserc-crsng.gc.ca/Students-Etudiants/PG-CS/BellandPostgrad-BelletSuperieures_eng.asp} scholarship. 2795 2796 2797 \bibliographystyle{plain} 2775 The authors would like to recognize the design assistance of Glen Ditchfield, Richard Bilson, Thierry Delisle, Andrew Beach and Brice Dobry on the features described in this paper, and thank Magnus Madsen for feedback on the writing. 2776 This work is supported by a corporate partnership with Huawei Ltd.\ (\url{http://www.huawei.com}), and Aaron Moss and Peter Buhr are partially funded by the Natural Sciences and Engineering Research Council of Canada. 2777 2778 2798 2779 \bibliography{pl} 2799 2780 … … 2803 2784 \section{Benchmark Stack Implementation} 2804 2785 \label{sec:BenchmarkStackImplementation} 2805 2806 \lstset{basicstyle=\linespread{0.9}\sf\small}2807 2786 2808 2787 Throughout, @/***/@ designates a counted redundant type annotation; code reformatted for brevity.
Note: See TracChangeset
for help on using the changeset viewer.