{"action":"created","comment":{"url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/comments/154716037","pull_request_review_id":80920690,"id":154716037,"diff_hunk":"@@ -0,0 +1,88 @@\n+---\n+layout: post\n+title:  Programming Languages for Machine Learning\n+---\n+\n+> Any sufficiently complicated machine learning system contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of a programming language.\n+\n+As programming languages (PL) people, we have watched with great interest as machine learning (ML) has exploded – and with it, the complexity of ML models and the frameworks people are using to build them. It’s clear that models are increasingly *programs* with support for programming constructs like loops and recursion, and this brings out many interesting issues in the tools we use to create them – that is, programming languages.\n+\n+While machine learning does not yet have a dedicated language, several efforts are creating hidden new languages underneath a Python API (like TensorFlow) while others are reusing Python as a modelling language (like PyTorch). We’d like to ask – are new ML-tailored languages required, and if so, why? More importantly, what might the ideal ML language of the future look like?\n+\n+## Pig Latin, and Other Hidden Languages\n+\n+TensorFlow (TF) and its ilk[^tf] are [already programming languages](https://dl.acm.org/citation.cfm?doid=3088525.3088527), albeit limited ones. This may seem surprising given that one uses Python to program TF. However, consider that TF requires you to write Python code to [build an expression tree](https://www.tensorflow.org/programmers_guide/graphs) in its internal language, which it then evaluates.\n+\n+[^tf]: We use TensorFlow for example, but could substitute other \"define-before-run\" frameworks like CNTK or MXNet.\n+\n+In fact, you can program in \"lazy\" TensorFlow style in any language. Consider the following JavaScript code, which implements a trivial function (`add`) in this style:\n+\n+{% highlight julia %}\n+function add(a,b) {\n+  return `${a}+${b}`;\n+}\n+x = 1; y = 2\n+z = add(‘x’, ‘y’) // ‘x+y’\n+eval(z) // 3\n+\n+x = 4\n+eval(z) // 6\n+{% endhighlight %}\n+\n+Here we are *metaprogramming* – writing code that writes code. In this case both the meta-language and the target language are the same (JavaScript) but they could just as well be different languages (as in the C preprocessor for the C language), or we can use a data structure (an [AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree)) instead of a string – the principle is the same. In TensorFlow, Python serves as a meta-language for writing programs in TF’s graph-based language[^ast]. If you’re not convinced, consider that TensorFlow’s graph even supports constructs like [variable scoping](https://www.tensorflow.org/programmers_guide/variables) and [control flow](https://www.tensorflow.org/api_docs/python/tf/cond) – but rather than using Python syntax, you manipulate these constructs through an API.\n+\n+[^ast]: TensorFlow’s graph is effectively a dataflow-based AST (Abstract Syntax Tree).\n+\n+TensorFlow and similar tools present themselves as \"just libraries\", but they are extremely unusual ones. Most libraries provide a simple set of functions and data structures, not an entirely new programming system and runtime. Why is such a complex approach necessary?\n+\n+## Why create a new language?\n+\n+The core reason for building new languages is simple: ML research has extremely high computational demands, and simplifying the modelling language makes it easier to add domain-specific optimisations and features. Training models requires excellent hardware support, good numerics, low interpreter overhead and multiple kinds of parallelism, all of which general-purpose languages like Python struggle to provide.\n+\n+There’s a snag, though. This approach relies on simplifying assumptions (ML models won’t be recursive, or need custom gradients, right?), which make it easier to apply optimisations or deploy to small devices. Unfortunately for engineers, model complexity has increased and researchers thoroughly enjoy violating these assumptions. Models now demand conditional branching (ok, easy enough to hack in), loops for recurrence (less easy but possible), and even [recursion over trees](https://arxiv.org/pdf/1503.00075.pdf) (virtually impossible to deal with). In many areas of ML, including [neural networks](https://blog.keras.io/the-future-of-deep-learning.html) and [probabilistic programming](https://eng.uber.com/pyro/), models are becoming increasingly like programs, including ones that reason about *other* programs (e.g. [program generators](https://arxiv.org/pdf/1705.03633.pdf) and [interpreters](https://arxiv.org/abs/1605.06640)). They often include non-differentiable components like Monte Carlo Tree Search, making it ever more challenging to build runtimes that are general enough while achieving top performance.\n+\n+Another practical downside of this approach, at least in its current incarnations, is the need for meta-programming of the kind discussed above. Building and evaluating expression trees imposes significant additional burdens on both the programmer and the compiler. It becomes tricky to reason about because the code now has two execution times, each with different language semantics, and things like step-through debugging are much harder. This could be resolved by compiling a full, syntactic language for the new runtime, but this means no less than creating a full new programming language. Is this worthwhile when we have popular numerical languages already?\n+\n+## Can we just use Python?\n+\n+As ML models began to need the full power of a programming language, Chainer and others pioneered a [\"define-by-run\"](https://arxiv.org/pdf/1701.03980.pdf) approach wherein a Python program is itself the model, using runtime automatic differentiation (AD) for derivatives. This is fantastic from a usability standpoint: If you want a recursive model that operates over trees, simply write that down, and let the AD do its magic! The difference in feel is [hard to overstate](https://twitter.com/karpathy/status/868178954032513024?lang=en).\n+\n+However, getting Python to scale to ML's heavy computational demands is far harder than you might expect. A [huge amount of work](https://www.youtube.com/watch?v=DBVLcgq2Eg0) goes into replicating optimisations that fast languages get for free, and the PL boneyard is full of [high-profile](https://arstechnica.com/information-technology/2009/03/google-launches-project-to-boost-python-performance-by-5x/) yet [failed](https://blog.pyston.org/2017/01/31/pyston-0-6-1-released-and-future-plans/) efforts to make Python faster. [Python’s semantics](http://blog.kevmod.com/2017/02/personal-thoughts-about-pystons-outcome/) also make it fundamentally difficult to provide model-level parallelism or compile models for small devices.\n+\n+Efforts like [Gluon](https://mxnet.incubator.apache.org/api/python/gluon.html) for MXNet are finding ways to get the best of both, at least to some extent. The idea is to combine basic dynamic AD with code-tracing approaches that produce \"static sub-graphs\" that can be optimised. This is unfortunately something of a mashing together of disparate implementations and APIs. It’s also limited; MXNet uses its graph not just for kernel-level optimisations but also for high-level graph scheduling, such as [splitting a model across multiple GPUs](https://mxnet.incubator.apache.org/how_to/multi_devices.html). It’s unclear how these hybrids will handle this, other than by adding another new API for graph containers whose nodes can be dynamic computations.\n+\n+## What might a tailor-made ML language look like?\n+\n+There are few domains as demanding about language-level design issues as machine learning. But it’s not unprecedented, and in areas like [formal reasoning and verification](https://coq.inria.fr/) or [cluster computing](https://chapel-lang.org/), new, tailor-made languages have proved an effective solution. Similarly, we expect to see new or existing languages customised for the kind of numerical, differentiable, parallelisable and even probabilistic computations needed in ML.\n+\n+An obvious current challenge for ML languages is achieving generality alongside performance, and the early hybrid approaches will need much more development. We expect that future ML runtimes will need to support arbitrary mixing of approaches (computational graphs that are static within dynamic within static …) and will need to get better at compiling dynamic code for deployment. Ideally, there will only be single \"graph format\" (or AST), with flexible optimisation options. The AST should have a syntax and statically describe dynamic behaviour (e.g. with a written `for` loop) – in other words, it should look a lot more like a standard programming language.\n+\n+*Programmable semantics* would open up new levels of flexibility, and could be provided by a feature similar to macros. This would allow features like multi-GPU training to be built on top of the core system, by specifying where the code should have pure dataflow semantics (as opposed to imperative semantics, which are more flexible but may include side-effects that are unsafe to optimise). It could also allow the kinds of program manipulation needed by probabilistic programming languages, or the [vectorisation](https://www.cs.cmu.edu/~guyb/papers/Ble90.pdf) (batching) passes usually implemented by hand in NLP models.\n+\n+As well as the PL community, ML engineers should pay close attention to the traditional Automatic Differentiation (AD) community. ML languages can take inspiration from pioneering work on [languages designed for truly first-class derivative](https://arxiv.org/pdf/1611.03416.pdf) support. Such languages can easily mix symbolic with runtime techniques (helping with the tradeoffs mentioned above), mix forward and reverse mode AD (for improved performance and memory usage), and [differentiate GPU kernels](http://mikeinnes.github.io/2017/08/24/cudanative.html) – all with no loss in performance. Most importantly, the benefits of AD and hardware support should extend to user-written libraries (say, for statistical distributions) rather than [requiring rewrites](http://pytorch.org/docs/master/distributions.html) for compatibility with the framework.","path":"blog/_posts/2017-12-05-ml&pl.md","position":62,"original_position":62,"commit_id":"fc58555c56c690ed5b59d4563f4b202cb337891c","original_commit_id":"fc58555c56c690ed5b59d4563f4b202cb337891c","user":{"login":"ChrisRackauckas","id":1814174,"avatar_url":"https://avatars2.githubusercontent.com/u/1814174?v=4","gravatar_id":"","url":"https://api.github.com/users/ChrisRackauckas","html_url":"https://github.com/ChrisRackauckas","followers_url":"https://api.github.com/users/ChrisRackauckas/followers","following_url":"https://api.github.com/users/ChrisRackauckas/following{/other_user}","gists_url":"https://api.github.com/users/ChrisRackauckas/gists{/gist_id}","starred_url":"https://api.github.com/users/ChrisRackauckas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChrisRackauckas/subscriptions","organizations_url":"https://api.github.com/users/ChrisRackauckas/orgs","repos_url":"https://api.github.com/users/ChrisRackauckas/repos","events_url":"https://api.github.com/users/ChrisRackauckas/events{/privacy}","received_events_url":"https://api.github.com/users/ChrisRackauckas/received_events","type":"User","site_admin":false},"body":"The JuliaDiff tools deserve a mention here.","created_at":"2017-12-04T17:23:59Z","updated_at":"2017-12-04T17:23:59Z","html_url":"https://github.com/JuliaLang/julialang.github.com/pull/681#discussion_r154716037","pull_request_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/comments/154716037"},"html":{"href":"https://github.com/JuliaLang/julialang.github.com/pull/681#discussion_r154716037"},"pull_request":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681"}}},"pull_request":{"url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681","id":156253503,"html_url":"https://github.com/JuliaLang/julialang.github.com/pull/681","diff_url":"https://github.com/JuliaLang/julialang.github.com/pull/681.diff","patch_url":"https://github.com/JuliaLang/julialang.github.com/pull/681.patch","issue_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/681","number":681,"state":"open","locked":false,"title":"ML & PL post","user":{"login":"MikeInnes","id":2234614,"avatar_url":"https://avatars3.githubusercontent.com/u/2234614?v=4","gravatar_id":"","url":"https://api.github.com/users/MikeInnes","html_url":"https://github.com/MikeInnes","followers_url":"https://api.github.com/users/MikeInnes/followers","following_url":"https://api.github.com/users/MikeInnes/following{/other_user}","gists_url":"https://api.github.com/users/MikeInnes/gists{/gist_id}","starred_url":"https://api.github.com/users/MikeInnes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikeInnes/subscriptions","organizations_url":"https://api.github.com/users/MikeInnes/orgs","repos_url":"https://api.github.com/users/MikeInnes/repos","events_url":"https://api.github.com/users/MikeInnes/events{/privacy}","received_events_url":"https://api.github.com/users/MikeInnes/received_events","type":"User","site_admin":false},"body":"Our blog post on machine learning and programming.\r\n\r\nI've added some CSS tweaks, nothing drastic but mainly making the column a bit thinner (very wide walls of text are pretty hard to read).","created_at":"2017-12-04T17:07:22Z","updated_at":"2017-12-04T17:23:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"af290efefdcdb03abebef65ea32e0cb485490a05","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681/commits","review_comments_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681/comments","review_comment_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/comments{/number}","comments_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/681/comments","statuses_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/statuses/fc58555c56c690ed5b59d4563f4b202cb337891c","head":{"label":"JuliaLang:ml&pl","ref":"ml&pl","sha":"fc58555c56c690ed5b59d4563f4b202cb337891c","user":{"login":"JuliaLang","id":743164,"avatar_url":"https://avatars0.githubusercontent.com/u/743164?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaLang","html_url":"https://github.com/JuliaLang","followers_url":"https://api.github.com/users/JuliaLang/followers","following_url":"https://api.github.com/users/JuliaLang/following{/other_user}","gists_url":"https://api.github.com/users/JuliaLang/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaLang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaLang/subscriptions","organizations_url":"https://api.github.com/users/JuliaLang/orgs","repos_url":"https://api.github.com/users/JuliaLang/repos","events_url":"https://api.github.com/users/JuliaLang/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaLang/received_events","type":"Organization","site_admin":false},"repo":{"id":2885268,"name":"julialang.github.com","full_name":"JuliaLang/julialang.github.com","owner":{"login":"JuliaLang","id":743164,"avatar_url":"https://avatars0.githubusercontent.com/u/743164?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaLang","html_url":"https://github.com/JuliaLang","followers_url":"https://api.github.com/users/JuliaLang/followers","following_url":"https://api.github.com/users/JuliaLang/following{/other_user}","gists_url":"https://api.github.com/users/JuliaLang/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaLang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaLang/subscriptions","organizations_url":"https://api.github.com/users/JuliaLang/orgs","repos_url":"https://api.github.com/users/JuliaLang/repos","events_url":"https://api.github.com/users/JuliaLang/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaLang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JuliaLang/julialang.github.com","description":"Julia Project web site","fork":false,"url":"https://api.github.com/repos/JuliaLang/julialang.github.com","forks_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/forks","keys_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/teams","hooks_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/hooks","issue_events_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/events{/number}","events_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/events","assignees_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/assignees{/user}","branches_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/branches{/branch}","tags_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/tags","blobs_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/statuses/{sha}","languages_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/languages","stargazers_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/stargazers","contributors_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/contributors","subscribers_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/subscribers","subscription_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/subscription","commits_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/contents/{+path}","compare_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/merges","archive_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/downloads","issues_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues{/number}","pulls_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls{/number}","milestones_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/milestones{/number}","notifications_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/labels{/name}","releases_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/releases{/id}","deployments_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/deployments","created_at":"2011-11-30T18:22:15Z","updated_at":"2017-12-01T06:20:12Z","pushed_at":"2017-12-04T17:18:44Z","git_url":"git://github.com/JuliaLang/julialang.github.com.git","ssh_url":"git@github.com:JuliaLang/julialang.github.com.git","clone_url":"https://github.com/JuliaLang/julialang.github.com.git","svn_url":"https://github.com/JuliaLang/julialang.github.com","homepage":"http://julialang.org/","size":21971,"stargazers_count":121,"watchers_count":121,"language":"Jupyter Notebook","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":258,"mirror_url":null,"archived":false,"open_issues_count":20,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":258,"open_issues":20,"watchers":121,"default_branch":"master"}},"base":{"label":"JuliaLang:master","ref":"master","sha":"1f4df4176ee5e13fb111b92b082c3c3756b85e38","user":{"login":"JuliaLang","id":743164,"avatar_url":"https://avatars0.githubusercontent.com/u/743164?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaLang","html_url":"https://github.com/JuliaLang","followers_url":"https://api.github.com/users/JuliaLang/followers","following_url":"https://api.github.com/users/JuliaLang/following{/other_user}","gists_url":"https://api.github.com/users/JuliaLang/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaLang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaLang/subscriptions","organizations_url":"https://api.github.com/users/JuliaLang/orgs","repos_url":"https://api.github.com/users/JuliaLang/repos","events_url":"https://api.github.com/users/JuliaLang/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaLang/received_events","type":"Organization","site_admin":false},"repo":{"id":2885268,"name":"julialang.github.com","full_name":"JuliaLang/julialang.github.com","owner":{"login":"JuliaLang","id":743164,"avatar_url":"https://avatars0.githubusercontent.com/u/743164?v=4","gravatar_id":"","url":"https://api.github.com/users/JuliaLang","html_url":"https://github.com/JuliaLang","followers_url":"https://api.github.com/users/JuliaLang/followers","following_url":"https://api.github.com/users/JuliaLang/following{/other_user}","gists_url":"https://api.github.com/users/JuliaLang/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaLang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaLang/subscriptions","organizations_url":"https://api.github.com/users/JuliaLang/orgs","repos_url":"https://api.github.com/users/JuliaLang/repos","events_url":"https://api.github.com/users/JuliaLang/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaLang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JuliaLang/julialang.github.com","description":"Julia Project web site","fork":false,"url":"https://api.github.com/repos/JuliaLang/julialang.github.com","forks_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/forks","keys_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/teams","hooks_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/hooks","issue_events_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/events{/number}","events_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/events","assignees_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/assignees{/user}","branches_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/branches{/branch}","tags_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/tags","blobs_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/statuses/{sha}","languages_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/languages","stargazers_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/stargazers","contributors_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/contributors","subscribers_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/subscribers","subscription_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/subscription","commits_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/contents/{+path}","compare_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/merges","archive_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/downloads","issues_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues{/number}","pulls_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls{/number}","milestones_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/milestones{/number}","notifications_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/labels{/name}","releases_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/releases{/id}","deployments_url":"https://api.github.com/repos/JuliaLang/julialang.github.com/deployments","created_at":"2011-11-30T18:22:15Z","updated_at":"2017-12-01T06:20:12Z","pushed_at":"2017-12-04T17:18:44Z","git_url":"git://github.com/JuliaLang/julialang.github.com.git","ssh_url":"git@github.com:JuliaLang/julialang.github.com.git","clone_url":"https://github.com/JuliaLang/julialang.github.com.git","svn_url":"https://github.com/JuliaLang/julialang.github.com","homepage":"http://julialang.org/","size":21971,"stargazers_count":121,"watchers_count":121,"language":"Jupyter Notebook","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":258,"mirror_url":null,"archived":false,"open_issues_count":20,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":258,"open_issues":20,"watchers":121,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681"},"html":{"href":"https://github.com/JuliaLang/julialang.github.com/pull/681"},"issue":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/681"},"comments":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/issues/681/comments"},"review_comments":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681/comments"},"review_comment":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/pulls/681/commits"},"statuses":{"href":"https://api.github.com/repos/JuliaLang/julialang.github.com/statuses/fc58555c56c690ed5b59d4563f4b202cb337891c"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"ChrisRackauckas"}}