あなたのプログラミング言語はひどい

1 JavaScriptが悪い理由
•1.1貧弱なデザイン
•1.2タイプシステム
•1.3悪い機能
•1.4欠落している機能
•1.5 DOM
2 Luaが吸う理由
3 PHPが吸い込まれる理由
•3.1現在サポートされているバージョンで修正
4 Perl 5が吸い込まれる理由
5 Pythonが吸い込まれる理由
•Python 3で修正された5.1
6 Rubyが吸う理由
7 Flex / ActionScriptが吸い込まれる理由
8スクリプト言語が悪い理由
9 Cが吸う理由
10 C ++が吸う理由
11 .NETが吸い込む理由
12なぜC#が吸うのか
13 VB.NETが吸い込まれる理由
15 Objective-Cが吸う理由
16 Javaが吸い込まれる理由
•16.1構文
•16.2 Java 7(2011)で修正
•16.3モデル
•16.4ライブラリ
•16.5ディスカッション
17 Backbaseが吸う理由
18 XMLが吸い込まれる理由
19なぜXSLT / XPathが嫌いなのか
20 CSSが吸い込まれる理由
•CSS3で修正された20.1
21 Scalaが吸う理由
22なぜHaskellが吸うのか
23閉鎖が吸い込まれる理由
24なぜ吸うのか
•24.1基本プログラミングツール(基本言語)
•24.2相互運用性
•24.3標準ライブラリ
•24.4ツールキット
•24.5コミュニティ
25錆が吸う理由
•25.1セキュリティ
•25.2構文
•25.3 APIの設計と型システム
•25.4コミュニティ
•25.5ツールキット

JavaScriptが悪い理由


一部の規定はJavaScript自体には適用されず、Webアプリケーションプログラミングインターフェイス( https://developer.mozilla.org/en/docs/Web/API )に適用されることに注意してください。

貧弱なデザイン

• , .
• Camel- :

XMLHttpRequest
HTMLHRElement


• "+" . , :

var i = 1;
//   
i = i + ""; //  !
//   - 
i + 1;  //     "11"
i - 1;  //     0

• + , += 1 ++. :

var j = "1";
j++; // j   2

var k = "1";
k += 1; // k   "11"

[1,5,20,10].sort() // [1, 10, 20, 5]

• var , , . let.


• JavaScript . .

• - . . ( ES6).

• JavaScript: , , , , « » « ». - , . ( ES6 ).

• JavaScript . , __proto__, . ( Object.create(null) ES5 Map ES6).

• . , ( Array.from ES6):

var args = Array.prototype.slice.call(arguments);

( ).

• .

0.1 + 0.2 === 0.30000000000000004;

, , . . http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf.

• NaN , .
typeof NaN === "number"
//      , NaN    
NaN != NaN
NaN !== NaN

// ,   ""  "NaN".
x !== x
//  -   
isNaN(x)

, IEEE754. IEEE754 .

• (null) , typeof null === 'object'.


( , http://www.jslint.com/)

• JavaScript C, .. - ++ --. . « » .

• JavaScript Perl.

• «this» («») , :

// "This"        
object.property = function foo() {
   return this; // "This"  ,     ()
}

// "This"   
var functionVariable = function foo() {
   return this; // "This"  
}

// "This"   
function ExampleObject() {
  this.someNewProperty = bar; // "This"    
  this.confusing = true;
}

// "This"    

function doSomething(somethingHandler, args) {
   somethingHandler.apply(this, args); //  "this"  ,   "" 
   this.foo = bar; // "This"    ""
   var that = this;

   //    ,    "this"       
   someVar.onEvent = function () {
        that.confusing = true;
        //  "this"    someVar
   }
}



// "This"  
return
{
  a: 5
};

• , . , . .

// "This"  
return
{
  'a': 5
};

• :

function bar() {
  // -,      var,      
  foo = 5;
}

( «use strict» (« ») ES5.)

• == , , , . === , , .

0 == ""
0 == "0"
0 == " \t\r\n "
"0" == false
null == undefined

""    != "0"
false != "false"
false != undefined
false != null

• :

new Function("x", "y", "return x + y");
new Array(1, 2, 3, 4, 5);
new Object({"a": 5});
new Boolean(true);


• parseInt , , , 10:

parseInt("72", 10);

Number('72') .

• «with» ( ) , .

with (obj) {
  foo = 1;
  bar = 2;
}

• «for in» , , object.hasOwnProperty(name) Object.keys(...).forEach(...).

for (var name in object) {
  if (object.hasOwnProperty(name)) {
    /* ... */
  }
}
// 
Object.keys(object).forEach(function() { ... });

• , , ; «for in» , , ( , .. parseInt ).

var n = 0;
for (var i in [3, 'hello world', false, 1.5]) {
  i = parseInt(i); //       
  alert(i + n);
}
// 
[3, 'hello world', false, 1.5].map(Number).forEach(function() { alert(i + n) });

• () (. https://developer.mozilla.org/en/JavaScript/Reference/Deprecated_Features), getYear setYear Date.


• ES6, . JavaScript — , Object.freeze(...).

//       
const pi = 3.14159265358;
const msg = "Hello World";

//     
const bar = {"a": 5, "b": 6};
const foo = [1, 2, 3, 4, 5];

//       
const func = function() {
  const x = arguments[0], y = arguments[1];

  return x + y;
};

• , , , . (ES6 ).

ES6
x -> x * x

• , Math.pow , **, . ( ES6 **)

Math.pow(7, 2); // 49

• . , - , , .

DOM ( )

• Firefox, Internet Explorer, Opera, Google Chrome, Safari, Konqueror .. DOM .
• , alert(), , , .

//       
function doNothingWithEvent(event) {
   return true;
}

//     
function doNothingWithEvent(event) {
   alert('screwing everything up');
   return true;
}

Lua


• , .

do
  local realVar = "foo"
  real_var = "bar" -- Oops
end
print(realVar, real_var) -- nil, "bar"

• . Lua , , .

• vararg ( ) , .

local function fn() return "bar", "baz" end
print("foo", fn()) -- foo bar baz
print("foo", fn(), "qux") -- foo bar qux

• vararg ( ) ( ...).

• varargs ( ) .

• varargs ( ).

• varargs ( ) .

• varargs , , , varargs, , , , \0 C-.

• . , 0, .

break, do while (while (something) do, repeat something until something) goto , continue. .

• , :

>2+2
  stdin:1: unexpected symbol near '2'
>return 2+2
  4

• Lua , PCRE.

• . , , , __index-.

• . «» Lua .

• . , — , , . .

>("string"):upper()
  STRING ()
>({1,2,3}):concat()
  stdin:1: attempt to call method 'concat' (a nil value)
>(3.14):floor()
  stdin:1: attempt to index a number value

PHP


'0', 0 0.0 , '0.0' — .

.

• - , . , , : :
• doc- "<<<END" PHP < 5.3.

• . , php4.x, php5, php5.1…

• . ( ) , — (, , ):

$x = Array();
$y = array();
$x == $y; # is true
$x = 1;
$X = 1;
$x == $X; # is true

• , , «nonexistent_constant_name». .

• , , , ; .

• , (. func_get_args()).

• , ; , .

Array() - .

• «-» — . - — . :

$arr[2] = 2;
$arr[1] = 1;
$arr[0] = 0;
foreach ($arr as $elem) { echo "$elem "; } //  "2 1 0"!!

• .

"use strict".

• POSIX STRFTIME(3) .

• :

error_log("Frobulating $net->ipv4->ip");
Frobulating  Object id #5->ip

$foo = $net->ipv4;
error_log("Frobulating $foo->ip");
Frobulating 192.168.1.1

:

error_log("Frobulating {$net->ipv4->ip}");

• : // #.

<?php ?>, HTML , .

• : float double.

• , , , , , PHP 5.4 ( PHP 7).

(float).

• . , , .. , array_diff, array_reverse .. ; , + (- ). ? : $a.diff($b), $a.reverse() .

• PHP C Perl, , , -. , .

• : — array_reverse shuffle — .

• «needle, haystack», — «haystack, needle».

• , .

• : $$a[1] ${$a[1]} ${$a}[1], $a[1] $aa .

• , , . , , , .

• : () , , , ( PHP 7).

$, , — , — , .

! , =, — if (!$a = foo()) — «» !

• 32- 64- (<< >> <<= >>=) 32 .

• ( ) , .

• «».

and or , && ||, .

• , : endif;, endwhile;, endfor; endforeach .

(int) (integer), — (bool) (boolean), — (float), (double) (real).

• , .

• PHP5 — , , , ( ).

• , , , , .

• .

• - , , include FALSE .

• - , require().

• , , : .

• , , , :

function makeyogurt($type = "acidophilus", $flavour)
{
  return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry"); //  "   ".    .

• (PHP 4) ( $this) ( self).

• , , unserialize(), __PHP_Incomplete_Class, .

• foreach, , .

• , self:: __CLASS__, , ( PHP >= 5.3 static::):

class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    self::who();
  }
}
class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}
B::test(); //  A,  B!

• (, ) .

class a {
   function nextFoo() {
      class b {} //  
   }
}


• (, ) «»:

$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
  global $var1, $var2;
  if (!$use_globals) {
    $var2 =& $var1; //      
  } else {
    $GLOBALS["var2"] =& $var1; //      
  }
}
global_references(false);
echo "var2 is set to '$var2'\n"; // var2   ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2   '' "


• /: , « ».
• PHP , .

• 64- 32- , (intval('9999999999') 9999999999 64- , — 2147483647 32-).

• , , : SplFileObject.

SplFileObject SplFileInfo . ? !?

• PHP , , . , short_open_tags, , , , !

• :

in_array("foobar", array(0)) === true

• , «foobar» , 0. , in_array strict, , , === == , - .

php.ini , ( ). , .

null, "", 0 0.0 — .

• , 0, , 08, 09, 012345678 . , 8 9 : 08 == 0, 08 != 8, 0777 == 07778123456 ( PHP 7).

• , , ; , ( intdiv() PHP 7).


PHP 5.5 . ( 04/19/2016):

• ( PHP 5).

[] {} NULL ( PHP 5).

• , ( PHP 5).

• « », () ( PHP 5).

• ( PHP 5):

class Foo {
  function Foo($name) {
    //      $globalref
    global $globalref;
    $globalref[] = &$this;
    $this->setName($name);
  }
  function echoName() {
    echo "\n", $this->name;
  }
  function setName($name) {
    $this->name = $name;
  }
}
$bar1 = new Foo('set in constructor');
$bar1->setName('set from outside');
$bar1->echoName(); //  " "
$globalref[0]->echoName(); //  "  "

//      ,        :

$bar2 =& new Foo('set in constructor');
$bar2->setName('set from outside');
$bar2->echoName();         //  " "
$globalref[1]->echoName(); //  " "

• , , « » , ( PHP 5):

class A
{
  function A()
  {
    echo "Constructor of A\n";
  }
  function B()
  {
    echo "Regular function for class A, but constructor for B";
  }
}
class B extends A
{
}
$b = new B; //  B()  

• __autoload , ( PHP 5.3).

• ; create_function , , ( PHP 5.3).

• , ( PHP 5.4).

$first_element = function_returns_array()[0]; //  !!
$first_element = ( function_returns_array() )[0]; //   ,  !!
//   :
$a = function_returns_array();
$first_element = $a[0];

Perl 5


Perl , Python, , . , 14 . 1998.

• «use strict» (« ») — , «use unstrict» (« ») «use slop» (« ») ( /), . . . «» .

use strict;
use warnings;


• .

my @list = ("a", "b", "c");
print $list[0];

• ( Perl6::Subs).

sub foo {
  my ($a, $b) = @_;
}

• , .. , - , Perl , .

• . , , .. , , ..

• , , , .

• -. : «, !», — . . , . Perl- , , , ( , , , — : — «»).

• .

• , here-doc.

my $doc = <<"HERE";
  But why would you?
HERE
print $doc;

• , , , , . , , : « @{[sub{'like'}]}. ».

• , Ruby, «unless» (« »). «if not», , , :

1. if (! )
2. if ( )
3. unless ()

if($a==$b) $c=$d ;; :

1. $c=$d if($a==$b);
2. if($a==$b) { $c=$d; }

• $,@,%,& ? , … , , , . Perl , , , , @ $ .

• , 6 .

Python


• — « »: , / / .. . -C, , , -, , , .

if(something)
  if(something_else)
      do_this();
else
  do_that();

, «else», , if(), ; Python, , , .

• self , , .

• , a.b() «b» «a»; , , a.b() «a» «» ; :

class NoExplicit:
   def __init__(self):
      self.selfless = lambda: "nocomplain"

   def withself(): return "croak" #will throw if calld on an _instance_ of NoExplicit

a = NoExplicit ()

print(a.selfless()) #won't complain
print(a.withself()) #will croak

, a.b() , ; , « , », Python .

• , , , ; dicts JavaScript, .

• , , «». - . , :

foo = 1.0 + 2 # Foo is now 3.0
foo = 1,0 + 2 # Foo is now a tuple: (1,2)
foo = 3 # Foo is now 3
foo = 3, # Foo is now a tuple: (3,)

• , , . , , . , , , , . , : — !

(1) == 1                      # (1) is just 1
[1] != 1                      # [1] is a list
1, == (1,)                    # 1, is a tuple
(1) + (2) != (1,2)            # (1) + (2) is 1 + 2 = 3
[1] + [2] == [1,2]            # [1] + [2] is a two-element list
isinstance((), tuple) == True # () is the empty tuple

• , . : .

.

• - — ; , -, .

• — if/elif/elif ( ).

• "do ... until <condition>", "while not <condition>:"

• Python (x if cond else y) - : (cond? x: y).

• , .

• .

• , .

• , , 5 () [1].

• / — (, list.index()), — (, len(list)).

• , Python

"""

• Python2.x Python3.x Linux .

• :

__main__

• , -, , - :

if __name__ == "__main__":

• — :

f.write(u'blah blah blah\n')

• Python 3 , . , , . Python 3.5 , , , Python , , , .

• «yield» . Python «yield» , , , -, .

• Python 3.5 «async» «await» . Python , «yield» «yield from», . , , , , , [2]. , , «yield», , , , «async», .. «def», «with» «for».

• super() , -, [3].

• , : os.path.expanduser os.path.supports_unicode_filenames ( , ).

Python 3

!= <> (. php).

• : (-1)**(0.5), pow(-1, 0.5) 0+1j.

• , .

Ruby


String#downcase? «downcase»? — «lower case,» «lowercase» «lower». String#upcase «uppercase» «upper». , , Ruby — . , tw… PHP.

• Unicode , 1.0, 1.9/2.0 2007 .

• / 1.8.

• .

• ( Ruby 2.0, !) ( = ).

@ @@ .

• , , ; : . « » « ». : 1.8.7, 1.9.1 Windows. ?

• ( ) «» : . « Proc».

• : , , , « ».

• «». nil.to_i «nil» 0, 0 «nil». nil.to_i.nil? #=> false.

String#to_i , : "x".to_i == 0.

• Ruby , , , . , , , . Ruby 2.0.

• , , , . , Array#size/Array#length, Array#[]/Array#slice.

• , , . , (?) .

• / , .

• ( ) .

• , , begin ... rescue ... end if expr. if expr, .

unless ( if not) , , .

• . , , .

• « » . - , , . nil, «void» («») (). , , , .

• pre-1.9: stdout, stderr ( ) - .

`` . .

• : $1, $2,…

• (Array, Hash) , . — . class ThingLikeArray < Array; end.

• , , , "foo" != :foo, , , , HashWithIndifferentAccess.

• . « , kEND, $end» « , '' , ».

• , , .

Flex/ActionScript


• String , , - String, , , startsWith hashCode, pass thrus String.

• , . ( , JavaScript).

• , .

• , .


• , , , - , - , . .


• .

• . . .

• .

• : isalnum, fprintf, fscanf ..

• .

• ? .

• … «» GNU .

• , .

• , - , . qsort() - . , - .

• (, , ) , ; , (nspr, apr, glib...).

• . (API) Berkeley, . , API Microsoft . O (1) API ; (select() poll() O(n)).

• , , « ».

• 99 ? ; MSVC, 2015 ( ), .

• 11 ? , , GCC , . , MSVC.

• , , , , : , . , , .

• malloc() ( ), calloc() — ( ).

• «Undefined behaviour» (« ») — . «» « , , , ». , « » - .

int a = 0; f(a, ++a, ++a); , f(0, 1, 2). .

• , «»: i[++a] = j[a];, , .

• . .

• N intN_t .

int * float * . memcpy().

• NULL . — !

• ; ( C, ).

void (*)() int (*)(int, const char *), , ? ! . , , ( ).

• - , , FILE * double * , . .

• - .

• , , ; , , , , (C11, . ) . , , .

• , , ; , - , . , , — « ».

• , () .

++


.

• .

• , - C- C++.

• .

• C++ . , - , . [ .]

• : 1 000 .

.

• . - .

• C++ ABI .

• 's' — ?

std::string s();

• : ; , ; , .

• 's' :

std::string s = s(); /* or */ std::string s{};

try, finally.

• «», RAII, , C++. , RAII.

• Unicode.

• , , , .

• , C, strcat.


catch (...) .

throw .

• : NULL C++. [ .]

mutable , , const , , , .

• - ( - ).

[=] , .

• C++ , , .

std::string::c_str() std::string char*. operator const char* () const.

• , , , , , inline () ; : , , . ? ?

• , __forceinline .

• , (), , , , .

• - ; , .

• , , , . , , — , - .

• , expor , , . C ( C++) .

.NET


• SortedList « — ». .NET- , .

• - () , . , «foreach» , . , , , , , . () «for» «foreach».

• MSDN- () GetFrobnicationInterval , , (, ). , InvalidOperationException, . « », , , .

#


• ECMA ISO C# , C# 2.0; Microsoft.

• i++.ToString , ++i.ToString — . ( .)

• , , Visual Basic .NET.

• ( ).

• Pascal (SomeClass, SomeConstantVariable, SomeProperty).

• «extends» «implements» (IInterface).

• ( LINQ, ).

•«out»- ( ).

• , , , , . ( , . http://stackoverflow.com/questions/82437/why-is-it-impossible-to-override-a-getter-only-property-and-add-a-setter.)

• - ( ) (, T plus<T>(T t1, T t2) { return t1+t2; }.

• «foreach» (, foreach(int i in vec) { i = i+1; }.

IDisposable . ( , , .)

VB.NET


• Strict Off: , , , , lang="text">Dim a As Integer = TextBox1.Text ' ( Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger).

• Explicit Off: Object , . Strict Off.

On Error Goto On Error Resume Next: — . , Try-Catch-Block ( -).

• , UBound(), MkDir(), Mid(),… Microsoft.VisualBasic .

• My-Namespace ( ) ( My.Resources My.Settings, ). , , My.Computer.FileSystem.WriteAllText vs System.IO.File.WriteAllText.

• , , .. , .

• .

• , ( Strict Off) . . StackOverflow.

• The Microsoft.VisualBasic.HideModuleNameAttribute. - .

• .

Form2.InstanceMethod()


Dim Form2Instance As New Form2
Form2Instance.InstanceMethod()

:
MyProject.Forms.Form2.InstanceMethod()

• + & &. + , Strict Off.

VBA


• , — .

• , .

• .

• .

• GoTo.

• `OnError Resume Next` — Yeah… , . ? ! .

• .

.
Dim myRange As Variant
myRange = Range("A1")
Set myRange = Range("A1")

`myRange` «A1», Range.

Objective-C


• - OS X iOS, C; , .

• Objective-C — ; GNUStep Fringe Linux, Windows, … , , .

• .

• « ».

• Smalltalk C .

• .

• ( @ , ?! , ?!? [methodName args];)

http://fuckingblocksyntax.com

• , , . ( , , LLVM Apple), , , « ».

• SEL [4].

• . , , , .

• Objective-C++ , .

• Objective-C C++ .

• C++ , , Objective-C.

• C++ Objective-C C++; .

• C++ Objective-C .

• Objective-C , C++, … new.

• ( , ) , .

• Objective-C . Apple NS*.

• Apple Swift ( ) , Objective-C .

Java



• .

• Java , goto const.

• … . , BigInteger, a.add(b.multiply(c)), .

• ; , , .

• : new T[42], , :

class GenSet<E> { Object[] a; E get(int i){return a[i];}}

• . 7-10 , .

• . .

• var ( C#). , . :

//  Java
ClassWithReallyLongNameAndTypeParameter<NamingContextExtPackage> foo = new ClassWithReallyLongNameAndTypeParameter<>();
//  C# |     :
var foo = new ClassWithReallyLongNameAndTypeParameter<NamingContextExtPackage>();
//  Java |       :
SomeTypeIHaveToLookUpFirstButIActuallyDontReallyCareAboutIt result = getTransactionResult();

• , Java IDE , , .

• . . Pair «» .

Java 7 (2011)

() , N , N .

; «allocate; try {...} finally { cleanup; }».


• .

• , .

int Integer, float Float. - .

• , Number.

• Java 8 .


• , , :

java.net URLConnection HttpURLConnection: UrlConnection HTTPURLConnection HttpUrlConnection?

java.util ZipOutputBuffer GZIPOutputBuffer: ZIPOutputBuffer GnuZipOutputBuffer GzipOutputBuffer GZipOutputBuffer?

• , , ; , 3 , , , .. RPGGame, RpgGame, TLSConnection, Starttls.

Cloneable clone .

• , .toString() ( , -) .equals() ( , ).

• Java 8 , , , , .., Collection (), « », Collections () Arrays ().

Stack — , Queue — ?

Stack API, . Deque () ArrayDeque ().

• . , , java.util.Date java.sql.Date ..

• (Date API) , . .

• Java 8 .

• Reflection API .

(a|[^d]) StackOverflowException .

• .


.

• , , , , , (?).

• , Serializable RandomAccess, : , , - .

• ( , ) .

• : Object[] foo = new String[1]; foo[0] = new Integer(42); , .

• Unicode , , , , : (1) \u000A ( ), ; (2) \u0022 ( ), , ; (3) - \u (, , «c:\unix\home»), , .

• (, max(float,float), max(double,double), max(long,long)).

Backbase


• , .

XML


• , , .

• , .

• , Git. , . ( , ), , , .

• .

• , , , .

• .

XSLT/XPath


• 1. * * , . XML DOM.

• XPath , , , , , -. , .

• - XPath, .

test="" <xsl:if> <xsl:when>.

<xsl:sort>.

• - , key(), XML, . — ! select="key(...)" . , , «key() » , , « ».

select="", value="" match="" , , . ; , - , - . .

• - (, str:replace ()), (, ), , - . . - ? - , - , , , .

• , , . , list/array/tuple/dict/hash/set/iterable/collection.

• '-' , , 'minus' — . '-' , , , , '-' , [a-zA-Z_][a-zA-Z0-9_]*. , , , . $foo-100, $foo — 100.

$foo-bar .

$foo - 100 .

$foo+100 $foo + 100 .

$foo-100 .

• , , . . , , , . , , , , .

<xsl:sort select="count(*)"/>
<!-- sorts like this: 10, 11, 1, 23, 20, 2, 37, 33, 31, 3, 4, 5, 6, 78, 7, 9 -->

• :

1. XML (, ..).
2. XSL (, , / , , , xsl:foo ..).
3. XSL ( ..).
4. XPath ( , ).
5. XPath.

CSS


• hsla(), hsva()?

• text-align:justify;, , « ». .

• vertical-align:middle; , . , display:table; display:table-cell;, , . !

• , , (margin: 0 auto;).

• . .

• float: ; . (, , , , .)

• clear:.

• . , , .

• . CSS3 calc CSS (CSS Values) (Units Module), - { width:50% — 2px; }.

• CSS :

• , , :


• ident {nmstart}{nmchar}*
• nmstart [a-zA-Z]|{nonascii}|{escape}
• nmchar [a-z0-9-]|{nonascii}|{escape}

• «4.1.3. » :

« CSS2 ( , ) [A-Za-z0-9] ISO 10646 161 , (-); .»

, [a-zA-Z_][a-zA-Z0-9_]*, 1970- ?

• - -? Webkit , …

• . — Webkit — , .

• SASS, LESS Stylus. . CSS wtf ( , , ).

• , CSS3. , , , CSS4.

. «CSS » « , CSS».

CSS3

• ? ? Mac OS 1984. (CSS3 border-radius:)

• . (CSS3 )

• . (CSS3 background-size: background-clip:)

• . (CSS3 rotate)

Scala


scala.collection .

• Monad Functor. Scalaz .

• , , .

• .

• .

Haskell


• ( ) . Haskell - , . , , - .

• .

• .

Haskell, - Haskell, - Google.

• Haskell , , . .

Clojure


• Lisp , .. — .

• .

• Conj ( ).

Go


( )

• Go («nil») . void * — . «nil» («») , .

func randomNumber() *int {
  return nil
}

func main() {
  a := 1
  b := randomNumber()
  fmt.Printf("%d\n", a+*b) //    -  () 
}

• , , -ASCII . «» ( ?) .

• , Go — string []byte. string []byte, Unicode , == > <, + . , , , io.Writer, []byte.

• len , . , , utf8.RuneCountInString().

• Go break case, break switch. , , switch.

• «n» : slice = append(slice[:n], slice[n+1:]...)

• , , , .

• , , .

• Go , .

• Go .

• Go .

• Go .

• Go , , :

if v, err := otherFunc(); err != nil {
  return nil, err
} else {
  return doSomethingWith(v), nil
}

• , Go , . , Go . , « », , , , Go , , , .

• Go- range , / , , :

d := loadData()

for i := range d {
  //  "d"  ,  "i"  ,   
  //  "d"  ,  "i"   
  //  "i"   //
}

for i, j := range d {
  //  "d"  ,   !
  //   ,      ,     ,
  // ,   )
  //  "d"  , "i" - ,  "j" -  ( d[i])
  //  "i"   /   ,  "j"  d[i]
}

• Go , . , . , :

func foo1(i int) (r int) {
  if i != 0 {
    r := 12
    fmt.Println(r)
  }
  return  //  0
}

func foo2(i int) (r int) {
  if i != 0 {
    r = 12
    fmt.Println(r)
    return  //  12
  }
  return  //  0
}

func foo3(i int) (r int) {
  if i != 0 {
    r := 12
    fmt.Println(r)
    return  // : "r"   
  }
  return
}

• , , :

func dogma() (i int) {
  defer func() {
    i++
  }()
  return 2 + 2
}

func main() {
  fmt.Println(dogma) //  5
}

• , ** , . , Go-:

func returnsError() error {
  var p *MyError = nil
  if bad() {
    p = ErrBad
  }
  return p //     " ".
}


• , select case , , :

select {
case <-chan1:
  doSomething()
default:
  select {
  case <-chan1:
    doSomething()
  case <-chan2:
    doSomethingElse()
  }
}

select 700 . .

• Go-, Go- , «» , .


• / , , «ddd» "%H" . Go , «1» , «5» — , «15» — , «6» — .. ( 2 2006 15:04:05 MST) : « , , , ». , , ; , .

• — math/rand crypto/rand.

flag, , POSIX- .

errors , .. Go , .


• Go . Go- repository; github.com/user/package/package-{v1,v2,v3}.

• Go , .

• 1.5 C Go. , , .

• "-u", « ». , , unsafe , , ; , , .

• , ** , Go unsafe.


• , , « ».

• , «WONTFIX» (« , »), , .

, , . , , , , , .

• - Go 1. , Go 2.0, .

• 1.4, .

Rust



• borrowck .

• « » . , «» , ; , .

• borrowck, , , unsafe {} ; , , , , sliceable.unsafe_get(index). , , , , .

• , .

• , , , , [, ]?

• , , , , . — , - , - !

• Rust . , , . , , C++ ( C++, , , , Google).

• LLVM . , , , , « , ,» . , , .

, - , , , . , , . SEGV , CRIME, Rust . . , .

, «» Rust , - .


:: ++. / .

• , .

  #[allow(unrooted_must_root)]
  pub fn new(localName: Atom,
             prefix: Option<DOMString>,
             document: &Document) -> Root<HTMLIFrameElement> {
      let element = HTMLIFrameElement::new_inherited(localName, prefix, document);
      Node::reflect_node(Box::new(element), document, HTMLIFrameElementBinding::Wrap)
  }

  #[allow(unrooted_must_root)]
  pub fn new(localName: Atom,
             prefix: Option<DOMString>,
             document: &Document) {
      let element = HTMLIFrameElement::new_inherited(localName, prefix, document);
      Node::reflect_node(Box::new(element), document, HTMLIFrameElementBinding::Wrap);
  }

• , , , , impl ().

mut , (mutable). &Mutex (mutable), &mut str — (immutable).

API

• , , , , Vec Cell.

• , Rust ( ++, , ; — str, String). : str, String, CStr, CString, OsStr OsString. OsStr, OsString, CStr, CString (- Windows), CStr, CString, OsStr, OsString String str, .

• () , . Vec<T>, &[T], , Vec<T> &[T], , .

• () , &*some_var ( ) &some_var[..] ( — , Vec<T> &[T] String &str).

• , , , (, , () , , ).

• -Sized . — str [T]. , Sized, , ?Sized. , Reddit, , str . Box<str>. Reddit; Reddit, , , -Sized .

• — enum. .


, , . ( ) , .

• «». Rust (, , «, , , » ), . , , , Rust - Java!


• rustc .

rustc. PIC. AVR. m68k. ARM, x86, MIPS, PowerPC NaCl. , .

• ? . — rustc .

• (, Go, ), , , .

• , . , , , .

• - , . , rustc .

• . «» , , , «ring» ( ) «serde» («serialization and deserialization» (« »), ?).

• jemalloc, «hello world» [ ].

• , , . , rustc ?

• , , ( , ++, ). , ?

• IDE. - C# VS Java Eclipse, 90-.

• IDE, , Eclipse? .

• ? , , , , « ». , , Racer, .

• ? , .


Source: https://habr.com/ru/post/J315152/


All Articles