-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharticle.tex
280 lines (188 loc) · 23.8 KB
/
article.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
\documentclass[anonymous,sigplan,review,11pt,nonacm,natbib=false]{acmart}
\settopmatter{printfolios=false,printccs=false,printacmref=false}
\usepackage[maxnames=1,minnames=1,maxbibnames=100,natbib=true,citestyle=authoryear,bibstyle=authoryear,doi=false,url=false,isbn=false,isbn=false]{biblatex}
\usepackage{amssymb}
\usepackage{rotating}
\usepackage{debate}
\usepackage{tabularx}
\usepackage{ffcode}
\usepackage{mathtools}
\usepackage{amsmath}
\usepackage{MnSymbol}
\usepackage[capitalize]{cleveref}
\usepackage{paralist}
\usepackage{cancel}
\usepackage{to-be-determined}
\usepackage{tikz}
\acmBooktitle{untitled}
\title{Strings functions analysis}
\author{Yegor Bugayenko}
\email{[email protected]}
\affiliation{Huawei\city{Moscow}\country{Russia}}
\ccsdesc[100]{Object-Oriented Programming}
\keywords{Object-Oriented Programming}
\begin{document}
\raggedbottom
\begin{abstract}
\end{abstract}
\maketitle
\section{Introduction}\label{sec:intro}
A string is an ordered set of characters. The standard library of string functions varies from language to language. When creating a new language, one needs to build their own library based on some criteria. However, the number of different functionality functions for strings that can be invented is at least countable (to put it simply - infinite). Then what to base on to identify the necessary set of functions for an object-oriented language? \hl{<- RQ}
Most programming languages add functions to their string libraries without any limit on the number, for this reason there is no such research on this topic at the moment.
This article aims to make a multivariate analysis of different parameters of string functions.
\section{Related work}
Among the other publications on this topic that exist at the time of this writing, all are of an applied nature. For this reason, they are not discussed in this article. In our article, we provide data that can be used in a free form, including for creating our own string libraries.
\section{Metrics}
\subsection{Popularity of functions}
\subsubsection{Definition}
Since popularity is a measurable parameter, we calculated the number of uses of each string function (see below). Then we denote popularity as a percentage of the number of uses of a certain string function relative to the total number of uses of all string functions. This approach makes it possible to estimate the frequency of string functions usage exactly in the context of correlation with other string functions.
\subsubsection{Search algorithm}
The GitHub and Sourcegraph platforms we choose to calculate the number of uses of the functions. This platform provides the ability to search for any words or phrases in all GitHub projects, as well as if necessary to specify other parameters. However, we should keep in mind that asking for the number of repetitions of a certain word in the code will in some cases not give the right result, for a number of reasons. \hl{maybe move platforms names to Method Section}
\subsubsection{The word is a comment}
For some words, it is more common for them to appear in files as names/comments/inside strings rather than as called functions. Since the article deals with the use of string functions for object-oriented languages, and they use dot notation, it will be more efficient to make queries like \textit{.function}, instead of \textit{function}. \hl{to discussion}
\subsubsection{It's a another class function}
In this kind of analysis, for some functions there is a problem that it is not clear which class of objects has which function. For example, the \textit{contains} function is present in string as well as in most collections.
Of course, it makes sense to examine the context in which the functions were used. However, this task is difficult because of the large amount of data to be analyzed.
It is worth noting that functions which have had this problem are popular, this we have obtained by making queries about the number of times they occur for code bases. For this reason, this data will not be counted in this article. \hl{to discussion}
\subsection{Mutual usages}
For any function we can consider such a parameter as its use by other functions. It is important because it is impossible to exclude a function from the library in case many other functions of the library use it.
This parameter will be an integer numeric value that will be equal to the number of functions that can use it in their implementation (that is, it should not just be present in the implementation, but be necessary there) without affecting the asymptotics.
\subsection{Asymptotics}
\subsubsection{Mutable}
In order to define the asymptotics of the different string functions, we need to define what a string is. Since we are considering mutable strings, we consider a string to be an array of characters with which we can use write and read operations. This way we can avoid copying for every mutable operation.
\subsubsection{Immutable}
Immutable strings impose a number of constraints on the operation. We define immutable strings as an array of characters where we are allowed to read characters in a constant time, and each mutable operation creates a new copy. We are also allowed to store a constant number of other variables, such as various flags.
\subsection{The minimum set}
\subsubsection{Necessity}
Even if there are various criteria for functions, it is still necessary to determine how to get a library based on them. Therefore, we propose an algorithm that can be used for various (including not yet existing) object-oriented programming languages.
\subsubsection{Criterion setting}
\label{criterion}
It is necessary to set a criterion on the basis of which a decision will be made whether to add a function to the current set of functions.
\subsubsection{Algorithm}
Now specifically about the algorithm on the basis of which the final set of functions will be obtained.
\begin{enumerate}
\item Set is initially empty.
\item Functions are considered in priority order, by default the most popular functions come first. If the function meets criterion \ref{criterion}, it is added to the set.
\item The second step is repeated until there are no unselected functions left.
\item In reverse order of priority the functions in the set are considered and those that don't meet criterion \ref{criterion} are removed.
\end{enumerate}
\hl{maybe move algorithm to Section method}
\section{Method}
In order to investigate functions, we will make a list of functions to be investigated. We will choose N languages. They were chosen based on parameters such as the number of questions on StackOverflow, the number of repositories on GitHub with 100+ stars, and the TIOBE Index; and they implement different paradigms (e.g. strict and non-strict typing).
We should keep in mind that the number of string functions in different programming languages is very large, and this number can grow, as we said before, without limitations. For this reason, this article does not consider all existing functions, but only those that meet some criteria.
A table with the list of different functions from standard string libraries for these languages has been compiled. For the analysis will be selected functions, which are presented at least in 30 percent of programming languages (out of N presented). Since for the functions presented less than 30 percent language, we can conclude that they are used in too special or rare cases.
\section{Results}
Below are the 10 programming languages we have chosen and their criteria.
\hl{Java, Python, C++, Ruby, JavaScript, Go, C\#, Swift, PHP, Rust were chosen.}
\begin{table}[h]
\begin{tabular}{llll}
\hline
& Questions
& Repositories 100+ stars
& TIOBE
\\ \hline
Python & 1911498 & 39308 & 1 \\
Java & 1833680 & 20216 & 3 \\
C++ & 758054 & 13609 & 4 \\ \hline
\end{tabular}
\caption{Part of the language criteria table}
\end{table}
Below in section \ref{tab:my_label} is a table with the results - metrics. It is important to note that these results take into account the functions of languages from their standard libraries.
Based on these data, we have compiled our optimal library for string functions; the included functions are listed below.
\hl{todo add link to parsing repo}
\section{Discussion and analysis}
\subsection{Mutual usages presenting}
When we counted the Mutual usages parameter we used a numerical value. However, it is worth considering that a representation in the form of an oriented dependency graph would give more applied information. Because based on this graph, it would be less biased to construct a minimal set of string functions.
However, it is not possible to represent the graph in this paper because the number of its edges would be too large (of the order of the square of the number of functions). And such representation would lose any comprehensible visualization.
\subsection{Problems with function intersection}
Earlier we mentioned the problem with popularity calculation for functions that have the same name, but are called on objects of different classes.
To solve this problem we can apply the extrapolation function here.
Note that this function does not show absolute accuracy; however, if the files to be analyzed are selected at random, the error decreases very much.
In order to estimate the error it is necessary to take several similar samples and compare how different the results are.
\subsection{Unexpected advantage of immutability}
An interesting fact was that, judging by the popularity of the use, the immutable functions are superior to the mutable ones.
\section{Conclusion}\label{sec:conclusion}
\hl{todo}
\section{Acknowledgements}
The research was funded by Huawei Technologies Co. Ltd.
\section{References}
https://yegor256.github.io/plum
https://github.com/search
https://sourcegraph.com/search
\section{Appendices}
\hl{todo String function metrics table}
Below we have a list of all string functions from the standard libraries of the specified languages.
\textbf{Java (39)}: charAt, codePointAt, codePointBefore, codePointCount, compareTo, compareToIgnoreCase, concat, contains, contentEquals, copyValueOf, endsWith, equals, equalsIgnoreCase, format, getBytes, getChars, hashCode, indexOf, intern, isEmpty, length, lastIndexOf, length, matches, offsetByCodePoints, regionMatches, replace, replaceAll, replaceFirst, split, startsWith, subSequence, substring, toCharArray, toLowerCase, toString, toUpperCase, trim, valueOf.
\textbf{Ruby (132)}: new, try\_convert, \%, *, +, +@, -@, <<, <=>, ==, ===, =\~, [], []=, ascii\_only?, b, bytes, bytesize, byteslice, capitalize, capitalize!, casecmp, casecmp?, center, chars, chomp, chomp!, chop, chop!, chr, clear, codepoints, concat, count, crypt, delete, delete!, delete\_prefix, delete\_prefix!, delete\_suffix, delete\_suffix!, downcase, downcase!, dump, each\_byte, each\_char, each\_codepoint, \\ each\_grapheme\_cluster, each\_line, empty?, encode, encode!, encoding, end\_with?, eql?, force\_encoding, freeze, getbyte, grapheme\_clusters, gsub, gsub!, hash, hex, include?, index, initialize\_copy, insert, inspect, intern, length, lines, ljust, lstrip, lstrip!, match, match?, next, next!, oct, ord, partition, prepend, replace, reverse, reverse!, rindex, rjust, rpartition, rstrip, rstrip!, scan, scrub, scrub!, setbyte, size, slice, slice!, split, squeeze, squeeze!, start\_with?, strip, strip!, sub, sub!, succ, succ!, sum, swapcase, swapcase!, to\_c, to\_f, to\_i, to\_r, to\_s, to\_str, to\_sym, tr, tr!, tr\_s, tr\_s!, undump, unicode\_normalize, unicode\_normalize!, unicode\_normalized?, unpack, unpack1, upcase, upcase!, upto, valid\_encoding?.
\textbf{Python (45)}: capitalize, casefold, center, count, encode, endswith, expandtabs, find, format, format\_map, index, isalnum, isalpha, isascii, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, join, ljust, lower, lstrip, maketrans, partition, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill.
\textbf{C++ (43)}: append, assign, at, back, begin, c\_str, capacity, cbegin, cend, clear, compare, copy, crbegin, crend, data, empty, end, erase, find, find\_first\_not\_of, find\_first\_of, find\_last\_not\_of, find\_last\_of, front, get\_allocator, insert, length, max\_size, operator[], operator+=, operator=, pop\_back, push\_back, rbegin, rend, replace, reserve, resize, rfind, shrink\_to\_fit, size, substr, swap.
\textbf{JavaScript (29)}: charAt, charCodeAt, codePointAt, concat, constructor, endsWith, fromCharCode, includes, indexOf, lastIndexOf, length, localeCompare, match, prototype, repeat, replace, search, slice, split, startsWith, substr, substring, toLocaleLowerCase, toLocaleUpperCase, toLowerCase, toString, toUpperCase, trim, valueOf.
\textbf{Go (54)}: Clone, Compare, Contains, ContainsAny, ContainsRune, Count, Cut, EqualFold, Fields, FieldsFunc, func, HasPrefix, HasSuffix, Index, IndexAny, IndexByte, IndexFunc, func, IndexRune, Join, LastIndex, LastIndexAny, LastIndexByte, LastIndexFunc, func, Map, func, Repeat, Replace, ReplaceAll, Split, SplitAfter, SplitAfterN, SplitN, Title, ToLower, ToLowerSpecial, ToTitle, ToTitleSpecial, ToUpper, ToUpperSpecial, ToValidUTF8, Trim, TrimFunc, func, TrimLeft, TrimLeftFunc, func, TrimPrefix, TrimRight, TrimRightFunc, func, TrimSpace, TrimSuffix.
\textbf{C\# (21)}: Clone, CompareTo, Contains, EndsWith, Equals, GetHashCode, GetType, GetTypeCode, IndexOf, ToLower, ToUpper, Insert, IsNormalized, LastIndexOf, Remove, Replace, Split, StartsWith, Substring, ToCharArray, Trim.
\textbf{Swift (48)}: init, isZero, isFinite, isInfinite, isEmpty, count, write, append, reserveCapacity, +, +=, insert, replaceSubrange, remove, removeAll, removeFirst, removeLast, significandWidth, removeLast, exponentBitPattern, removeSubrange, significandBitCoun, removeSubrange, exponentBitCount, removeSubrange, filter, drop, dropFirst, dropLast, popLast, lowercased, uppercased, ==, !=, <, <=, >, >=, elementsEqual, starts, lexicographicallyPrecedes, applying, difference, hasPrefix, hasSuffix, contains, allSatisfy, contains.
\textbf{PHP (98)}: addcslashes, addslashes, bin2hex, chop, chr, chunk\_split, convert\_cyr\_string, convert\_uudecode, convert\_uuencode, count\_chars, crc32, crypt, echo, explode, fprint, get\_html\_translation\_table, hebrev, hebrevc, hex2bin, html\_entity\_decode, htmlentities, htmlspecialchars\_decode, htmlspecialchars, implode, join, lcfirst, levenshtein, localeconv, ltrim, md5, md5\_file, metaphone, money\_format, nl\_langinfo, nl2br, number\_format, ord, parse\_str, print, printf, quoted\_printable\_decode, quoted\_printable\_encode, quotemeta, rtrim, setlocale, sha1, sha1\_file, similar\_text, soundex, sprintf, sscanf, str\_getcsv, str\_ireplace, str\_pad, str\_repeat, str\_replace, str\_rot13, str\_shuffle, str\_split, str\_word\_count, strcasecmp, strchr, strcmp, strcoll, strcspn, strip\_tags, stripcslashes, stripslashes, stripos, stristr, strlen, strnatcasecmp, strnatcmp, strncasecmp, strncmp, strpbrk, strpos, strrchr, strrev, strripos, strrpos, strspn, strstr, strtok, strtolower, strtoupper, strtr, substr, substr\_compare, substr\_count, substr\_replace, trim, ucfirst, ucwords, vfprintf, vprintf, vsprintf, wordwrap.
\textbf{Rust (105)}: new, with\_capacity, from\_utf8, from\_utf8\_lossy, from\_utf16, from\_utf16\_lossy, from\_raw\_parts, from\_utf8\_unchecked, into\_bytes, as\_str, as\_mut\_str, push\_str, capacity, reserve, reserve\_exact, try\_reserve, try\_reserve\_exact, shrink\_to\_fit, shrink\_to, push, as\_bytes, truncate, pop, remove, retain, insert, insert\_str, as\_mut\_vec, len, is\_empty, split\_off, clear, drain, splice, into\_boxed\_str, as\_bytes, as\_bytes\_mut, as\_mut\_ptr, as\_ptr, bytes, ceil\_char\_boundary, char\_indices, chars, contains, encode\_utf16, ends\_with, eq\_ignore\_ascii\_case, escape\_debug, escape\_default, escape\_unicode, find, floor\_char\_boundary, get, get\_mut, get\_unchecked, get\_unchecked\_mut, is\_ascii, is\_char\_boundary, is\_empty, len, lines, lines\_any, make\_ascii\_lowercase, make\_ascii\_uppercase, match\_indices, matches, parse, repeat, replace, replacen, rfind, rmatch\_indices, rmatches, rsplit, rsplit\_once, rsplit\_terminator, rsplitn, slice\_mut\_unchecked, slice\_unchecked, split, split\_ascii\_whitespace, split\_at, split\_at\_mut, split\_inclusive, split\_once, split\_terminator, split\_whitespace, splitn, starts\_with, strip\_prefix, strip\_suffix, to\_ascii\_lowercase, to\_ascii\_uppercase, to\_lowercase, to\_uppercase, trim, trim\_end, trim\_end\_matches, trim\_left, trim\_left\_matches, trim\_matches, trim\_right, trim\_right\_matches, trim\_start, trim\_start\_matches.
\begin{table*}
\begin{tabular}{lllllllllll}
\hline
& \begin{sideways}Java\end{sideways}
& \begin{sideways}Ruby\end{sideways}
& \begin{sideways}Python\end{sideways}
& \begin{sideways}C++\end{sideways}
& \begin{sideways}JavaScript\end{sideways}
& \begin{sideways}Go\end{sideways}
& \begin{sideways}C\#\end{sideways}
& \begin{sideways}Swift\end{sideways}
& \begin{sideways}PHP\end{sideways}
& \begin{sideways}Rust\end{sideways}
\\ \hline
String \textbf{capitalize} & & $\checkmark$ & & $\checkmark$ & & $\checkmark$ & & $\checkmark$ & $\checkmark$ & \\
Get \textbf{char-at} a given position & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & & $\checkmark$ & & $\checkmark$ \\
Strings \textbf{compare} & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & \\
Strings \textbf{compare-ignore-case} & $\checkmark$ & & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & $\checkmark$ & \\
Strings \textbf{concatenate} & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
Check if \textbf{contains} substring & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
\textbf{count} of substring in string & & $\checkmark$ & & $\checkmark$ & & $\checkmark$ & & & $\checkmark$ & \\
Check if \textbf{ends-with} a substring & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
Check if \textbf{equals} & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
\textbf{find-first} substring in string & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
\textbf{find-last} substring in string & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
\textbf{format} string by regexp & $\checkmark$ & $\checkmark$ & & $\checkmark$ & & & $\checkmark$ & $\checkmark$ & & \\
Get string \textbf{hash} & $\checkmark$ & $\checkmark$ & & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & & $\checkmark$ \\
\textbf{insert} in string by index & $\checkmark$ & & $\checkmark$ & $\checkmark$ & & & $\checkmark$ & $\checkmark$ & & $\checkmark$ \\
Check if \textbf{is-alphabetic} & $\checkmark$ & $\checkmark$ & $\checkmark$ & & & & & & & \\
Check if \textbf{is-empty} & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & & $\checkmark$ \\
Check if \textbf{is-whitespace} & & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & & & \\
\textbf{join} list of strings & & $\checkmark$ & & & & $\checkmark$ & $\checkmark$ & & $\checkmark$ & \\
Get string \textbf{length} & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
Check if string \textbf{matches-regexp} & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & & & & & \\
Get string \textbf{partition} & & $\checkmark$ & & $\checkmark$ & & $\checkmark$ & & & & \\
\textbf{repeat} string number of times & & & & & $\checkmark$ & $\checkmark$ & & & $\checkmark$ & $\checkmark$ \\
\textbf{replace-all} substrings by other & $\checkmark$ & $\checkmark$ & & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
\textbf{replace-first} substrings by other & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & & & & $\checkmark$ \\
String \textbf{split} & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
Check if \textbf{starts-with} a substring & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
String \textbf{strip} & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
Get \textbf{substring} by positions & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
String \textbf{to-float} & & & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & & \\
String \textbf{to-int} & & & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & & \\
String \textbf{to-lowercase} & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
String \textbf{to-uppercase} & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ \\
String \textbf{trim-left} & & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ \\
String \textbf{trim-right} & & $\checkmark$ & & $\checkmark$ & $\checkmark$ & $\checkmark$ & $\checkmark$ & & $\checkmark$ & $\checkmark$ \\
\textbf{remove} substring by positions & & & $\checkmark$ & $\checkmark$ & & & $\checkmark$ & $\checkmark$ & & $\checkmark$ \\
Get string \textbf{as-bytes} & & $\checkmark$ & & $\checkmark$ & & & & & & $\checkmark$ \\
String \textbf{pop-back} & & & $\checkmark$ & $\checkmark$ & & & & $\checkmark$ & & $\checkmark$ \\
Get string \textbf{as-chars} & $\checkmark$ & & & $\checkmark$ & & & $\checkmark$ & & & $\checkmark$ \\
Get string \textbf{as-canonical} & $\checkmark$ & & $\checkmark$ & $\checkmark$ & & & $\checkmark$ & & & \\
Check if \textbf{is-ascii} & & $\checkmark$ & & $\checkmark$ & & & & & & $\checkmark$ \\
String \textbf{copy} & $\checkmark$ & & $\checkmark$ & & & $\checkmark$ & $\checkmark$ & & & \\
String \textbf{reserve-capacity} & & & $\checkmark$ & & & & & $\checkmark$ & & $\checkmark$ \\
String \textbf{reverse} & & $\checkmark$ & & $\checkmark$ & $\checkmark$ & & & $\checkmark$ & $\checkmark$ & \\
\\ \hline
\end{tabular}
\caption{String functions existing in languages}
\label{tab:my_label}
\end{table*}
\printbibliography
\end{document}