Cocoa Languages

This site lists programming languages that can be used to develop apps for macOS and related platforms like iOS. While nearly all programming languages can be used on the Mac in principle, we only list languages that can be used to interface with Apple's native Frameworks like Cocoa and Cocoa Touch. In a nutshell, we list all languages that can be used to write truly native Mac or iOS apps.



Object Model Compatible Languages

All of Apple's high-level Frameworks are written in Objective-C. These can be natively used by any language that directly uses the Objective-C Object Model and Runtime.

Objective-C

Objective-C has been the native language to macOS and its predecessor NeXTSTEP for nearly 3 decades. All of Apple's high-level Frameworks are written in ObjC and only available to ObjC-compatible languages.

Swift

Swift is the new language from Apple and meant to replace Objective-C. Since it uses the ObjC Object Model, its compatible with all existing macOS frameworks and can be mixed and matched with ObjC. Swift is a more 'modern', 'safer' and certainly much faster language than ObjC. However, its also disproportionately more complex, has downsides interacting with C, C++ and ObjC code and is less productive for many cases.

RubyMotion

RubyMotion is an ahead-of-time compiled version of Ruby based on the ObjC Object Model and can used to create native apps on macOS and iOS. Combine the productivity of Apple's Framework with the productivity of a scripting language. RubyMotion is built upon a predecessor open-source project called MacRuby.

Objective-Smalltalk

"Objective-Smalltalk is Smalltalk with C extensions and the (Objective-)C runtime mode". A great idea.

Objective-Pascal

The 'Free Pascal' pascal compiler features a special dialect called 'Objective-Pascal' that provides native interoperability with Objective-C and assorted frameworks.

D

D is a systems programming language thats been trying to replace C/C++ since 2001 and it seems to contain native functionality to interface with Objective-C, although it is quite cumbersome .

Eero

Earo was a 'dialect of Objective-C designed to make developers more productive'. Eero was what Swift should have been - a sane successor to ObjC, fixing its flaws while retaining and building on its strengths. Sadly the project has disappeared.

Nu

Nu is an interpreted object-oriented language inspired by Ruby and List, and built upon the ObjC Object Model. Their last release has been in 2013.

Pragmatic Smalltalk

A version of Smalltalk with perfect ObjC interoperability through building on the ObjC Object Model. However, its integrated into the Étoilé operating system written in ObjC and seemingly not compatible with macOS. There is also another Étoilé language, also built upon their 'LanguageKit', named EScript, which is JavaScript compatible. In the greater universe of GNUStep

F-Script

F-Script was a scripting language for macOS based on Smalltalk and based upon the ObjC Object Model. This was nice to for live inspection of the Cocoa APIs, but the project is not compatible with newer system versions anymore.

Objective Modula-2

Objective Modula-2 was a language developed "as a hybrid between Smalltalk and Modula-2 following Objective-C as a blueprint" and with perfect ObjC interoperability.

ObjectiveCLIPS

ObjectiveCLIPS was a programming language basing NASA's CLIPS expert system shell on the ObjC Object Model.


Bridged Languages

Languages that are not directly based on the Objective-C Object Model and Runtime can still interface with Objective-C based code (like Apple's native Frameworks) if they have a 'Bridge'. The bridges convert between the different environments and have a definite performance and often also a productivity overhead.

Kotlin

Kotlin is a JVM-compatible language by the JetBrains IDE guys that aims to improve Java and Android development and currently has a lot of traction. The Kotlin/Native allows calling Objective-C or Swift from Kotlin as well as the other way around ('Reverse interop'), details can be found here. You can use Kotlin/Native from IntelliJ IDEA as well as from AppCode via their Kotlin/Native Plugin for AppCode. This seems like one of the more promising ways to share code for a iOS&Android mobile app project.

AppleScript

AppleScript is Apple's own scripting language and dates back to 1993. It can interfere with Objective-C through the 'Cocoa-AppleScript' bridge and you can even create AppleScript projects directly in Xcode.

Python

Python is one of the most important scripting languages and features PyObjC the only complete ObjC bridge that is directly shipped with macOS. Just 'import AppKit' and hack away. There is also the Rubicon-ObjC bridge.

C#

C# is Microsoft's high-level language. Since C# is widely used and there seems to be some desire to write cross-platform apps in C#, there are a number of C#<->ObjC bridges including Cocoa#/Xamarin Mac, Monobjc, NObjective and Mobjc. There is also RemObjects C# which is probably not a bridge but also allows C#<->Cocoa interoperability.

Lua

Lua is a scripting language often used in embedding scenarios, but also cool in its own. There is Wax, a bridge aimed at writing iPhone apps in Lua and LuaCocoa for writing Mac apps. LuaCocoa seems to supersede many other previous Lua bridges (LuaObjective-C, LuaBridge, LuaObjCBridge, TLC). There is also NSLua and EasyLua and even Adobe has a private Lua bridge inside Lightroom. The crown for the language with the most ObjC bridges easily goes to Lua.

Ruby

Ruby is one of the most important scripting languages and in addition to the commercial, native version RubyMotion (see above) there are also the RubyCocoa and RubyObjC bridges for the stock Ruby version.

JavaScript

The rise of the WWW in general and web-apps in particular also elevated JavaScript from the ugly duckling of languages to one of the most important languages out there. Apple's JavaScriptCore allows you to directly embed JS into native apps, but there are is also a stand-alone bridge named JSCocoaand dedicated bridges for environments like Node.js (NodObjC) and Mozilla (js-macosx.

Io

Io is a dynamic prototype-based programming language, inspired by Self, Smalltalk and LISP, and its cool. It has a bridge to Objective-C built in.

Rust

Rust is Mozilla's replacement language for C/C++ and there are Objective-C bindings named Cocoa-rs.

Perl

Perl is the weird-but-cool scripting language that just won't go away. With the CamelBones bridge its possible to bring Perl's unmatched obfuscation capabilities to Apple's native Cocoa frameworks. A more limited bridge named PerlObjCBridge is even included with macOS.

Java

Java supposedly is the single most popular language, but luckily only on the server. Back, when Java was still a semi-viable option for desktop development, Apple included a native bridge as part of macOS (https://web.archive.org/web/20071105214914/http://developer.apple.com/documentation/Cocoa/Conceptual/Legacy/JavaBridge/JavaBridge.1.html), this has been deprecated for years. If you still want to write native Mac apps in Java you could try the aptly named Java-Objective-C-Bridge or the ineffable JNAerator

Smalltalk

Smalltalk is the other parent language of Objective-C (besides C), so it should be dear to all Cocoa programmers. Ambrai Smalltalk had native Cocoa integration built-in, but it is not available anymore. If you are into the Squeak dialect/IDE you can use two bridges. Or use CocoaSqueak, which has a bridge built-in, but this is from 2002.

BASIC

BASIC was the default programming language on the Apple II, but the times have changed. Supposedly you can interface with Cocoa from Objective-Basic http://www.objective-basic.com CocoaBasic http://www.dsitri.de/download/CocoaBasicHelp/CocoaBasicHelp.html and maybe also with FutureBasic http://4toc.com/fb/index.htm. Good luck.

Caml

OCaml extends Caml with objective-oriented language constructs and is more popular than you'd think. You can give the objective-c-caml-bridge a try.

Lisp

Lisp is ancient - it dates from 1958 - but supposedly cool. The implementations Clozure CL and LispWorks seem to have bridges to call Cocoa frameworks and there is also the CL-OBJC bridge.

Haskell

Haskell is a purely functional programming language. Which makes it difficult to build any GUI, and even more so when there are six different unfinished bridging projects.

Scheme

Scheme is a dialect of Lisp and it has a bridge. For even more obscurity-points use the Scheme-variant called Gauche and its bridge

Factor

And now for something completely different...Factor belongs to the family of "concatenative languages". But is has Cocoa bindings built-in and seems to be pretty alive.

Dylan

Dylan is actually the few programming language created by Apple (besides AppleScript, HyperTalk, SK8Script and Swift). Both the Gwydion Dylan the Open Dylan implementations supposedly have Objective-C bridges.

Eiffel

Eiffel is another obscure language from another age. It can be used to create native Mac apps with its EiffelCocoa bridge.