プログラミング言語のデザイン
問うべき疑問
本当に新しい言語が必要か
その言語はなにをするのか
想定されるユーザーは誰か
どんな機能を採用するか
言語名は大事
呼びやすくて印象的なもの
ググラビティがあるもの
言語の特徴を端的に表現できれば尚良し
Rubyの話
Perlを参考に宝石から付けようとした
長いものが多くて良いのが見つからなkッタ
Coral(サンゴ)とRubyが最終的にに残った
短くて美しいRubyにした
コツ
既存の言語の問題を調査する
独自性の追求は限定する
入門者のつまずきの原因になる
基本的に保守的に、だが、保守的すぎると技術的に面白くない
客観的な視点
多くの人の意見をまとめすぎると、尖った物がなくなってしまう
各々のデザイン
ブロック構造の表現方法
複文
if文
変数束縛構文
moduleシステム
Error Handling
関数定義
Pattern Matching
並列プログラミングのための機構
ドキュメント
式と文の区別の強さ
強い
Python
弱い
ない
Lisp
演算子
https://okuranagaimo.blogspot.com/2020/02/python-ideas.html
Voidを返す関数内でのreturnは気をつけた方がいい - Qiita
Swiftのreturnとセミコロンについて
以下のコードはreturn;となっていないので、bar()が返される
code:swift
func foo {
print(#function)
return
bar()
}
設計ポリシー
Ruby
簡易言語からの脱却
書きやすく、読みやすい
簡潔
今気づいたが、関数型言語(Haskell)って、「返り値は絶対に一つ」って制約があるのかmrsekut.icon
それのおかげでカリー化なり、関数合成などかうまくできている
いやまぁどの言語でもそうか
2値のものを「一つのタプル」と呼んだり「一つの配列」と呼べば返り値は一つか。
オブジェクト指向の継承をどうするか
単一継承
コードのコピペが増える
RubyではMixinを使うことで対策した
多重継承
気をつけないとクラスの継承関係が複雑になる
探索方法も様々
深さ優先探索
幅優先探索
C3
Python, CLOSなど
モジュール
Mix-inを強制する
2種類のクラスを用意する
1つは主たる継承をする通常のクラス
もう一つはMix-inとしてだけ使える特別なクラス
通常のようにインスタンスの作成不可
通常のクラスからの継承不可
多重継承の短所である複雑さを回避しつつ、Mixinの長所の恩恵を受けられる
似たような機能にSelf言語の、「mixin」、「trait」など
コレクション型
配列とリスト
https://qiita.com/ababup1192/items/29af9ee2f2dd779072b4
コレクション型を実装するパターンは大きく分けて2種類
ぜんぶに配列を使う
さまざまなコレクションを配列の形式で扱っちゃう
異なる概念だが、同じインターフェースで扱える
「Array」とか「Set」とか内部的には異なる概念だが、同じインターフェースで便利に扱えるようになっている
変わった文法を採用すると後々に響く
それが言語の目玉なら良いけど。
イテレータ
CLUを参考にした
C言語にはイテレータがないが、同じようなことをしようとすると
for文を使う
ループ変数や内部構造へのアクセスが隠蔽できない
関数ポインタを使う
隠蔽はできるが、変数などの受け渡しが面倒
Cにはクロージャがないので。
真偽値
C
0が偽、それ以外が真
Ruby
falseとnilが偽
それ以外(0を含む)は真
Java
0は数値型なのでboolとしては扱えない
コンパイルエラーになる
前置記法と中置記法と後置記法
前置記法を採用している言語
Lisp
後置記法を採用している言語
Forth
Goの言語のデザイン
参考
誰かの自作言語
https://gist.github.com/mizunashi-mana/4522da17c8ade08b3376b1596c06be72
ECMAのproposalとか読んでいきたい
参考になりそう
プログラミング言語比較: ProgrammingLang.com |
参考
『言語のしくみ』
『コーディングを支える技術』
https://www.amazon.com/Programming-Language-Design-Concepts-David/dp/0470853204
http://ducklang.org/designing-a-programming-language-i
http://beza1e1.tuxen.de/articles/proglang_mistakes.html
https://medium.com/coinmonks/the-organized-chaos-of-programming-language-design-1e0a95067afb
http://www.inquisition.ca/en/info/gepsypl/rules.htm
https://www.amazon.co.jp/Principles-Programming-Languages-Evaluation-Implementation/dp/0195113063
https://hackernoon.com/considerations-for-programming-language-design-a-rebuttal-5fb7ef2fd4ba
https://cs.lmu.edu/~ray/notes/languagedesignnotes/