Awesome! I'll read the paper too.
Thanks! On Monday, March 5, 2018 at 5:31:06 PM UTC-8, kortschak wrote: > > This was essentially my thinking in choosing Go to write my > bioinformatics library in - mainly because much of our code will be > written and maintained by students, but we want good performance as > well. > > Some of my thought about this are in this paper https://www.biorxiv.org > /content/early/2014/05/12/005033 > > Dan > > On Fri, 2018-03-02 at 12:07 -0800, dorival...@gmail.com <javascript:> > wrote: > > Hi, I could be wrong (please correct me ;-), but here you are what I > > think > > about Go: > > > > INTRODUCTION > > Computers and software were initially developed for scientific > > computing; > > e.g., ALGOL and FORTRAN from the 1950s! Therefore, several computer > > languages and libraries have been invented and are used in > > scientific > > computing to date. Nonetheless, when programming a new scientific > > simulation, the question about computational efficiency versus ease- > > of-use > > remains open. Here, we aim to shed light on a suitable answer to > > this > > question---TL;DR use Go and Gosl! > > > > One would say that scripting (interpreted) languages might provide > > the > > convenient platform for computations as long as care is taken to > > send > > intensive tasks to functions pre-compiled with high-performance > > languages. > > This strategy fails to create an easy-to-use environment because the > > programmer needs to think when and where those tasks should go. > > Considering > > that this kind of decision is essential for performance, we argue > > that > > scripting language is not the best solution. Furthermore, we argue > > that > > scripting is the worst tool for teaching new programmers in > > scientific > > computing. > > > > We argue that only experts should use scripting languages (scripts) > > for > > computer programming because beginners cannot understand how > > dangerous the > > flexibility of scripts can be. For example, the assignment of > > variables > > with the same name to different types is often a cause of > > misunderstandings > > and failures. To make this problem even worse, failures due to wrong > > types > > are not captured at runtime---certainly not at compilation time > > (there is > > no compilation time in scripts). In other words, the interpreter is > > too > > permissive. The scientist, if aware (rarely the case with students), > > will > > investigate the numerical output and, after much work, will find the > > source > > of the error. Therefore, this situation is not ideal. To exemplify, > > the > > following is allowed in Python (or Julia---similar syntax): > > > > ``` > > a = 1.0 > > a = "a" # OK in Python or Julia > > ``` > > > > In the following code, Go will detect the error with a message such > > as > > `./test.go:5: cannot use "a" (type string) as type float64 in > > assignment`: > > > > ``` > > package main > > func main() { > > a := 1.0 > > a = "a" // not accepted in Go > > } > > ``` > > > > The problem propagates in scripting languages when developing > > objected-oriented code. For example, a member data of a class can be > > entirely modified by `anyone`, `anywhere` in Python! This issue > > completely > > defeats the purpose of encapsulation in OOP. > > > > In summary, scripting (e.g., Python) and alike (e.g., Julia, Matlab) > > languages are excellent for the expert programmer only who can > > understand > > what is going on. However, they are very misleading to the beginner. > > In > > other words, the strictness of compiled languages DOES help to learn > > computer programming. Furthermore, the tools for working with > > compiled > > language often take advantage of well-defined types. The shift > > towards type > > declaration is so apparent that new languages and strategies are > > being > > invented to overcome these issues. For example, TypeScript and > > Javascript > > (ES6) combined with FlowType have been recently developed and have a > > fast > > adoption among web developers. It seems that no new large project > > will use > > non-typed Javascript code. > > > > GO LANGUAGE > > Go is a modern programming language created by Google engineers in > > 2007, > > including Robert Griesemer, Rob Pike, and Ken Thompson. The language > > was > > later made public as open source in 2009. Go has since grown > > exponentially > > attracting a large number of co-developers and users. The primary > > goal > > leading to the introduction of yet a new language was the combination > > of > > efficiency (like C/C++) with ease of development (like Python). There > > are > > other several innovations and advantages in Go when compared with > > mainstream languages such as C/C++/C#/Java/Python/Ruby/Lua. > > Also, Go automatically detects Fortran and C files which helps > > taking > > advantage of good existing code. > > > > The vocabulary in Go is quite small compared to other languages, > > making > > easy to have an overview of the syntax and available commands. Go > > avoids > > complexities such as generics (aka templates) usually available in > > other > > languages (e.g., C++). Go also tries to avoid unnecessary complexity > > by not > > taking `in the language` advanced OOP concepts such as polymorphism, > > multiple inheritances, and others. Moreover, Go is somewhat pragmatic > > in > > the sense that, if an operation can be made much more > > straightforward, > > although slightly orthogonal to the central paradigm, this operation > > will > > be carefully defined and adopted in the language specification. > > These > > features, thanks to the unquestionable expertise of the core > > developers, > > made Go an enjoyable language to work with. > > > > One limitation of some other languages is code organization and > > package > > development. For example, C/C++ require the use of `#ifndef`, > > `#define`, > > `#endif`, or `#pragma once` everywhere to prevent code being included > > more > > than once. In fact, it is frustrating at times to find how to deal > > with > > this situation in C/C++, noting that the developer has to worry about > > what > > code goes in the header (.h, .hpp) or in the (.c, .cpp) files. > > Moreover, > > the cyclic nature of `imports` using C/C++ can be a nightmare. > > > > In Python, the organization of packages sometimes lead to situations > > where > > the naming becomes very confusing. For example, we cite the case > > with > > matplotlib.pyplot or pylab or other packages called > > mypackage.mypackage > > that we find around. As another example, in Julia, module definition > > is > > messy, because the user (programmer) has to decide among the files to > > be > > included versus module definition. In summary, package definition is > > not > > simple in Python or Julia. > > > > On the other hand, Go was designed from the beginning to be multi- > > modular, > > prevent cyclic dependency, and made package definition simple. In Go, > > the > > solution is based on how the directories are organized. For example, > > each > > directory is a package, and all files in the same directory belong to > > that > > package. When importing code from other packages, the full path (like > > URL) > > of that package is used. There is no need for `header` files in Go! > > Moreover, the coding of one feature can span multiple files in the > > same > > directory. Go comes with a set of tools to build applications and > > even > > download third-party code. > > > > Go also has a strict convention for code formatting. In other words, > > there > > is only one way to format your code in Go---using braces starting at > > the > > end of the line with the `standard` indentation. In this way, a true > > `standard` exists for Go codes which makes sharing straightforward > > and > > quite pleasant; e.g., no one argues about the positioning of braces > > anymore! Moreover, the strict code convention and specification in > > Go > > largely facilitates the development of auxiliary programming tools > > to > > process code. For instance, the import field in source code can be > > automatized as is done with the excellent goimports tool. Many other > > tools > > (e.g., vet, lint) take advantage of Go conciseness. > > > > Because files and directories in Go follow a well-defined > > specification, it > > is very easy (and fast) to find definitions, code lines, files, and > > packages (libraries) in Go projects. The compiler in Go benefits from > > this > > organization and indeed helps with Go being very fast to compile > > code---you > > can run Go code as if it was a scripting language! Furthermore, the > > excellent specification and organization in Go helped with the > > creation of > > many other tools to assist in Go code development. For instance, we > > mention the `goimports` and `gorename` that automatically import all > > dependencies as you type and rename a variable in all code derived > > from a > > particular library. > > > > Furthermore, also thanks in part to how well the Go specification > > and > > conciseness were invented, there are several other useful and fast > > commands > > for handling Go code. For instance, we mention the commands `go run,` > > `go > > build`, `go install` and `go get` that perform the operations of > > running > > the code, building the code, installing the code and downloading > > (and > > compiling) external dependencies automatically. > > > > One particular innovation in Go is the concept of concurrency that > > can lead > > to easy-to-write parallel algorithms. Also, Go is a garbage- > > collected > > language that makes easier the code development with fewer worries > > about > > dangling pointers. Go is in part compiled in Go language and has a > > reasonably comprehensive standard library, including tools for > > sorting, > > templating, encodings, cryptography, compression algorithms, > > mathematical > > functions (e.g., for complex numbers), image tools, and even web > > servers. > > Furthermore, Go uses the concept of unit tests very well and even > > includes > > tools to assist in benchmarking. Also, Go comes with tools to > > prepare > > examples and to automate the documentation---there is no need for > > Doxygen! > > > > The Go language syntax resembles that of C/C++/Java (C-class) but > > has > > significant differences. One fundamental difference is the way > > variables > > are declared. The type definition comes after the variable name. > > This > > difference seems strange at first to C-class programmers, but it > > makes > > sense. In fact, it makes reading easy, where one would read `variable > > and > > anotherVariable` are `float64` in `variable, anotherVariable > > float64`---there is no need to type float64 twice (or ten times...). > > The > > syntax is particularly convenient when declaring multiple function > > arguments. > > > > Go uses curly braces to define scope but has a strict rule regarding > > where > > the braces can be put and how to deal with indentation. This approach > > makes > > the code consistent and easy for collaborations. Also, with the help > > of > > the tools called `goimports` and `gofmt`, the workflow is > > straightforward. > > Go allows some constructions similar to the `range` command in Python > > and > > does not require the use of parentheses in repetition commands as in > > C-class. > > > > There is only one repetition command in Go: the `for` keyword. > > Compared to > > C-class languages, the syntax of the `switch` command is simpler and > > more > > powerful. Because of that, the programmer is induced (positively) to > > use > > `switch` over `if` when there is more than one decision branch. > > > > Go code can be directly executed as in: `go run hello.go`. The code > > could > > be built first with `go build hello.go' and executed (Linux) with > > `./hello`. But this last approach is only necessary when deploying > > the > > final application. In fact, Go can be used as scripting (using `go > > run` > > like `python`). > > > > Variables are defined in two ways: the first one requires the command > > `var` > > and the second one uses the assignment operator `:=` which > > automatically > > understands the data type. Another great advantage of Go when > > compared to > > many other languages is the standardized auto-initialization of all > > variables to their `zero` default value. For instance, numeric > > variables > > declared with `var` are always zero and strings are always empty. > > This > > feature can be exploited with advantage by the programmer who may > > consider > > variable names such that everything starts zeroed already. For > > instance, > > instead of creating a `silent` variable that needs to be set to > > `true` all > > the time, it's more convenient to use a `verbose` variable that is > > always > > `false` already. > > > > One type that is extensively used in Go is the `slice` of integers or > > real > > numbers represented by float point numbers (64-bit version; aka > > `double` in > > C-class). Slices in Go are a view to an internal sequence of values; > > i.e., > > slices record the start and end positions in memory. Therefore, > > slices can > > be passed into functions with minimal overhead. There is hence no > > need for > > constantly worrying about `by reference` or `by value`. Pointers can > > also > > be used in Go. We use pointers whenever a user-defined structure is > > to be > > modified by the called function. In Go, the slice notation `S[s:E]` > > means a > > view to array `S` starting at `s` and ending at `E-1`, inclusive. > > > > In conclusion, code written in Go is beautiful, concise and with a > > very > > clear logic. > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.