mirror of
https://github.com/golang/go
synced 2024-11-19 10:24:43 -07:00
6ab8d24d72
R=r, rsc, gri CC=golang-dev, iant, ken2, lvd, nigeltao_golang, stephenm https://golang.org/cl/2182042
375 lines
15 KiB
HTML
375 lines
15 KiB
HTML
<!-- FAQ -->
|
|
|
|
<div class="detail">
|
|
<p>Is your question not answered here? Try the <a href="go_programming_faq.html">Programming FAQ</a> or the <a href="go_lang_faq.html">Language Design FAQ</a>.</p>
|
|
</div>
|
|
|
|
<h2 id="Origins">Origins</h2>
|
|
|
|
<h3 id="What_is_the_purpose_of_the_project">
|
|
What is the purpose of the project?</h3>
|
|
|
|
<p>
|
|
No major systems language has emerged in over a decade, but over that time
|
|
the computing landscape has changed tremendously. There are several trends:
|
|
|
|
<ul>
|
|
<li>
|
|
Computers are enormously quicker but software development is not faster.
|
|
<li>
|
|
Dependency management is a big part of software development today but the
|
|
“header files” of languages in the C tradition are antithetical to clean
|
|
dependency analysis—and fast compilation.
|
|
<li>
|
|
There is a growing rebellion against cumbersome type systems like those of
|
|
Java and C++, pushing people towards dynamically typed languages such as
|
|
Python and JavaScript.
|
|
<li>
|
|
Some fundamental concepts such as garbage collection and parallel computation
|
|
are not well supported by popular systems languages.
|
|
<li>
|
|
The emergence of multicore computers has generated worry and confusion.
|
|
</ul>
|
|
|
|
<p>
|
|
We believe it's worth trying again with a new language, a concurrent,
|
|
garbage-collected language with fast compilation. Regarding the points above:
|
|
|
|
<ul>
|
|
<li>
|
|
It is possible to compile a large Go program in a few seconds on a single computer.
|
|
<li>
|
|
Go provides a model for software construction that makes dependency
|
|
analysis easy and avoids much of the overhead of C-style include files and
|
|
libraries.
|
|
<li>
|
|
Go's type system has no hierarchy, so no time is spent defining the
|
|
relationships between types. Also, although Go has static types the language
|
|
attempts to make types feel lighter weight than in typical OO languages.
|
|
<li>
|
|
Go is fully garbage-collected and provides fundamental support for
|
|
concurrent execution and communication.
|
|
<li>
|
|
By its design, Go proposes an approach for the construction of system
|
|
software on multicore machines.
|
|
</ul>
|
|
|
|
<h3 id="What_is_the_origin_of_the_name">
|
|
What is the origin of the name?</h3>
|
|
|
|
<p>
|
|
“Ogle” would be a good name for a Go debugger.
|
|
|
|
<h3 id="What_kind_of_a_name_is_6g">
|
|
What kind of a name is 6g?</h3>
|
|
|
|
<p>
|
|
The <code>6g</code> (and <code>8g</code> and <code>5g</code>) compiler is named in the
|
|
tradition of the Plan 9 C compilers, described in
|
|
<a href="http://plan9.bell-labs.com/sys/doc/compiler.html">
|
|
http://plan9.bell-labs.com/sys/doc/compiler.html</a>
|
|
(see the table in section 2).
|
|
|
|
<code>6</code> is the architecture letter for amd64 (or x86-64, if you prefer), while
|
|
<code>g</code> stands for Go.
|
|
|
|
<h3 id="Why_not_just_write_some_libraries_for_Cpp_to_do_communication">
|
|
Why not just write some libraries for C++ to do communication?</h3>
|
|
|
|
<p>We considered doing that, but too many of the problems—lack of
|
|
garbage collection, long dependency chains, nested include files,
|
|
lack of concurrency awareness—are rooted in the design of
|
|
the C and C++ languages themselves.
|
|
We felt a viable solution required a more complete approach.
|
|
|
|
<h3 id="Why_doesnt_Go_run_on_Windows">
|
|
Why doesn't Go run on Windows yet?</h3>
|
|
|
|
<p>
|
|
We understand that a significant fraction of computers in the world
|
|
run Windows and it would be great if those computers could run Go
|
|
programs. A group of volunteers has made significant progress toward
|
|
porting Go to <a href="http://www.mingw.org/">MinGW</a>.
|
|
You can follow their progress at the Go Wiki's
|
|
<a href="http://code.google.com/p/go/wiki/WindowsPort">WindowsPort</a> page.
|
|
</p>
|
|
|
|
<h3 id="Whats_the_origin_of_the_mascot">
|
|
What's the origin of the mascot?</h3>
|
|
|
|
<p>
|
|
The mascot and logo were designed by
|
|
<a href="http://reneefrench.blogspot.com">Renée French</a>, who also designed
|
|
<a href="http://plan9.bell-labs.com/plan9/glenda.html">Glenda</a>,
|
|
the Plan 9 bunny.
|
|
The gopher is derived from one she used for an <a href="http://wfmu.org/">WFMU</a>
|
|
T-shirt design some years ago.
|
|
The logo and mascot are covered by the
|
|
<a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a>
|
|
license.
|
|
</p>
|
|
|
|
<h2 id="Usage">Usage</h2>
|
|
|
|
<h3 id="Who_should_use_the_language">
|
|
Who should use the language?</h3>
|
|
|
|
<p>
|
|
Go is an experiment. We hope adventurous users will give it a try and see
|
|
if they enjoy it. Not every programmer
|
|
will, but we hope enough will find satisfaction in the approach it
|
|
offers to justify further development.
|
|
|
|
<h3 id="Is_Google_using_go_internally"> Is Google using Go
|
|
internally?</h3>
|
|
|
|
<p> The Go project was conceived to make it easier to write the kind
|
|
of servers and other software Google uses internally, but the
|
|
implementation isn't quite mature enough yet for large-scale
|
|
production use. While we continue development we are also doing
|
|
experiments with the language as a candidate server environment. It's
|
|
getting there. For instance, the server behind <a
|
|
href="http://golang.org">http://golang.org</a> is a Go program; in
|
|
fact it's just the <a href="/cmd/godoc"><code>godoc</code></a> document server running in a
|
|
production configuration.
|
|
|
|
|
|
<h3 id="Do_Go_programs_link_with_Cpp_programs">
|
|
Do Go programs link with C/C++ programs?</h3>
|
|
|
|
<p>
|
|
There are two Go compiler implementations, <code>6g</code> and friends, generically called
|
|
<code>gc</code>, and <code>gccgo</code>.
|
|
<code>Gc</code> uses a different calling convention and linker and can
|
|
therefore only be linked with C programs using the same convention.
|
|
There is such a C compiler but no C++ compiler. <code>Gccgo</code> is a
|
|
GCC front-end that can, with care, be linked with GCC-compiled
|
|
C or C++ programs. However, because Go is garbage-collected it will be
|
|
unwise to do so, at least naively.
|
|
|
|
<p>
|
|
There is a “foreign function interface” to allow safe calling of C-written
|
|
libraries from Go code. We expect to use SWIG to extend this capability
|
|
to C++ libraries. There is no safe way to call Go code from C or C++ yet.
|
|
|
|
<h3 id="Does_Go_support_Google_protocol_buffers">
|
|
Does Go support Google's protocol buffers?</h3>
|
|
|
|
<p>
|
|
A separate open source project provides the necessary compiler plugin and library.
|
|
It is available at
|
|
<a href="http://code.google.com/p/goprotobuf/">http://code.google.com/p/goprotobuf/</a>
|
|
</p>
|
|
|
|
<h3 id="Can_I_translate_the_Go_home_page">
|
|
Can I translate the Go home page into another language?</h3>
|
|
|
|
<p>
|
|
Absolutely. We encourage developers to make Go Language sites in their own languages.
|
|
However, if you choose to add the Google logo or branding to your site
|
|
(it does not appear on <a href="http://golang.org/">golang.org</a>),
|
|
you will need to abide by the guidelines at
|
|
<a href="http://www.google.com/permissions/guidelines.html">http://www.google.com/permissions/guidelines.html</a>
|
|
</p>
|
|
|
|
<h2 id="Design">Design</h2>
|
|
|
|
<h3 id="Why_doesnt_Go_have_feature_X">Why doesn't Go have feature X?</h3>
|
|
|
|
<p>
|
|
Every language contains novel features and omits someone's favorite
|
|
feature. Go was designed with an eye on felicity of programming, speed of
|
|
compilation, orthogonality of concepts, and the need to support features
|
|
such as concurrency and garbage collection. Your favorite feature may be
|
|
missing because it doesn't fit, because it affects compilation speed or
|
|
clarity of design, or because it would make the fundamental system model
|
|
too difficult.
|
|
|
|
<p>
|
|
If it bothers you that Go is missing feature <var>X</var>,
|
|
please forgive us and investigate the features that Go does have. You might find that
|
|
they compensate in interesting ways for the lack of <var>X</var>.
|
|
|
|
<h3 id="Why_is_the_syntax_so_different_from_Cpp">
|
|
Why is the syntax so different from C++?</h3>
|
|
|
|
<p>
|
|
This and other language design questions are answered in
|
|
the separate <a href="go_lang_faq.html">language design FAQ</a>.
|
|
|
|
<h2 id="Object_Oriented_Programming">
|
|
Object-Oriented Programming</h2>
|
|
|
|
<h3 id="Is_Go_an_object-oriented_language">
|
|
Is Go an object-oriented language?</h3>
|
|
|
|
<p>
|
|
Yes and no. Although Go has types and methods and allows an
|
|
object-oriented style of programming, there is no type hierarchy.
|
|
The concept of “interface” in Go provides a different approach that
|
|
we believe is easy to use and in some ways more general. There are
|
|
also ways to embed types in other types to provide something
|
|
analogous—but not identical—to subclassing.
|
|
Moreover, methods in Go are more general than in C++ or Java:
|
|
they can be defined for any sort of data, not just structs.
|
|
|
|
<p>
|
|
Also, the lack of type hierarchy makes “objects” in Go feel much more
|
|
lightweight than in languages such as C++ or Java.
|
|
|
|
<h3 id="How_do_I_get_dynamic_dispatch_of_methods">
|
|
How do I get dynamic dispatch of methods?</h3>
|
|
|
|
<p>
|
|
The only way to have dynamically dispatched methods is through an
|
|
interface. Methods on structs or other types are always resolved statically.
|
|
|
|
|
|
<h2 id="Writing_Code">Writing Code</h2>
|
|
|
|
<h3 id="How_are_libraries_documented">
|
|
How are libraries documented?</h3>
|
|
|
|
<p>
|
|
There is a program, <code>godoc</code>, written in Go, that extracts
|
|
package documentation from the source code. It can be used on the
|
|
command line or on the web. An instance is running at
|
|
<a href="http://golang.org/pkg/">http://golang.org/pkg/</a>.
|
|
In fact, <code>godoc</code> implements the full site at
|
|
<a href="http://golang.org/">http://golang.org/</a>.
|
|
|
|
<h3 id="Is_there_a_Go_programming_style_guide">
|
|
Is there a Go programming style guide?</h3>
|
|
|
|
<p>
|
|
Eventually, there may be a small number of rules to guide things
|
|
like naming, layout, and file organization.
|
|
The document <a href="effective_go.html">Effective Go</a>
|
|
contains some style advice.
|
|
More directly, the program <code>gofmt</code> is a pretty-printer
|
|
whose purpose is to enforce layout rules; it replaces the usual
|
|
compendium of do's and don'ts that allows interpretation.
|
|
All the Go code in the repository has been run through <code>gofmt</code>.
|
|
|
|
<h3 id="How_do_I_submit_patches_to_the_Go_libraries">
|
|
How do I submit patches to the Go libraries?</h3>
|
|
|
|
<p>
|
|
The library sources are in <code>go/src/pkg</code>.
|
|
If you want to make a significant change, please discuss on the mailing list before embarking.
|
|
|
|
<p>
|
|
See the document
|
|
<a href="contribute.html">Contributing to the Go project</a>
|
|
for more information about how to proceed.
|
|
|
|
<h3 id="Where_is_assert">
|
|
Where is assert?</h3>
|
|
|
|
<p>
|
|
Go doesn't provide assertions. They are undeniably convenient, but our
|
|
experience has been that programmers use them as a crutch to avoid thinking
|
|
about proper error handling and reporting. Proper error handling means that
|
|
servers continue operation after non-fatal errors instead of crashing.
|
|
Proper error reporting means that errors are direct and to the point,
|
|
saving the programmer from interpreting a large crash trace. Precise
|
|
errors are particularly important when the programmer seeing the errors is
|
|
not familiar with the code.
|
|
|
|
<p>
|
|
The same arguments apply to the use of <code>assert()</code> in test programs. Proper
|
|
error handling means letting other tests run after one has failed, so
|
|
that the person debugging the failure gets a complete picture of what is
|
|
wrong. It is more useful for a test to report that
|
|
<code>isPrime</code> gives the wrong answer for 2, 3, 5, and 7 (or for
|
|
2, 4, 8, and 16) than to report that <code>isPrime</code> gives the wrong
|
|
answer for 2 and therefore no more tests were run. The programmer who
|
|
triggers the test failure may not be familiar with the code that fails.
|
|
Time invested writing a good error message now pays off later when the
|
|
test breaks.
|
|
|
|
<p>
|
|
In testing, if the amount of extra code required to write
|
|
good errors seems repetitive and overwhelming, it might work better as a
|
|
table-driven test instead.
|
|
Go has excellent support for data structure literals.
|
|
|
|
<p>
|
|
We understand that this is a point of contention. There are many things in
|
|
the Go language and libraries that differ from modern practices, simply
|
|
because we feel it's sometimes worth trying a different approach.
|
|
|
|
<h2 id="Implementation">Implementation</h2>
|
|
|
|
<h3 id="What_compiler_technology_is_used_to_build_the_compilers">
|
|
What compiler technology is used to build the compilers?</h3>
|
|
|
|
<p>
|
|
<code>Gccgo</code> has a C++ front-end with a recursive descent parser coupled to the
|
|
standard GCC back end. <code>Gc</code> is written in C using
|
|
<code>yacc</code>/<code>bison</code> for the parser.
|
|
Although it's a new program, it fits in the Plan 9 C compiler suite
|
|
(<a href="http://plan9.bell-labs.com/sys/doc/compiler.html">http://plan9.bell-labs.com/sys/doc/compiler.html</a>)
|
|
and uses a variant of the Plan 9 loader to generate ELF binaries.
|
|
|
|
<p>
|
|
We considered writing <code>6g</code>, the original Go compiler, in Go itself but
|
|
elected not to do so because of the difficulties of bootstrapping and
|
|
especially of open source distribution—you'd need a Go compiler to
|
|
set up a Go environment. <code>Gccgo</code>, which came later, makes it possible to
|
|
consider writing a compiler in Go, which might well happen. (Go would be a
|
|
fine language in which to implement a compiler; a native lexer and
|
|
parser are already available in <a href="/pkg/go/"><code>/pkg/go</code></a>.)
|
|
|
|
<p>
|
|
We also considered using LLVM for <code>6g</code> but we felt it was too large and
|
|
slow to meet our performance goals.
|
|
|
|
<h3 id="How_is_the_runtime_implemented">
|
|
How is the runtime implemented?</h3>
|
|
|
|
<p>
|
|
Again due to bootstrapping issues, the runtime is mostly in C (with a
|
|
tiny bit of assembler) although Go is capable of implementing most of
|
|
it now. <code>Gccgo</code>'s runtime uses <code>glibc</code>.
|
|
<code>Gc</code> uses a custom library, to keep the footprint under
|
|
control; it is
|
|
compiled with a version of the Plan 9 C compiler that supports
|
|
segmented stacks for goroutines.
|
|
Work is underway to provide the same stack management in
|
|
<code>gccgo</code>.
|
|
|
|
<h2 id="Performance">Performance</h2>
|
|
|
|
<h3 id="Why_does_Go_perform_badly_on_benchmark_x">
|
|
Why does Go perform badly on benchmark X?</h3>
|
|
|
|
<p>
|
|
One of Go's design goals is to approach the performance of C for comparable
|
|
programs, yet on some benchmarks it does quite poorly, including several
|
|
in <a href="/test/bench/">test/bench</a>. The slowest depend on libraries
|
|
for which versions of comparable performance are not available in Go.
|
|
For instance, pidigits depends on a multi-precision math package, and the C
|
|
versions, unlike Go's, use <a href="http://gmplib.org/">GMP</a> (which is
|
|
written in optimized assembler).
|
|
Benchmarks that depend on regular expressions (regex-dna, for instance) are
|
|
essentially comparing Go's stopgap <a href="/pkg/regexp">regexp package</a> to
|
|
mature, highly optimized regular expression libraries like PCRE.
|
|
</p>
|
|
|
|
<p>
|
|
Benchmark games are won by extensive tuning and the Go versions of most
|
|
of the benchmarks need attention. If you measure comparable C
|
|
and Go programs (reverse-complement is one example), you'll see the two
|
|
languages are much closer in raw performance than this suite would
|
|
indicate.
|
|
</p>
|
|
|
|
<p>
|
|
Still, there is room for improvement. The compilers are good but could be
|
|
better, many libraries need major performance work, and the garbage collector
|
|
isn't fast enough yet (even if it were, taking care not to generate unnecessary
|
|
garbage can have a huge effect).
|
|
</p>
|
|
|