はじめに
みなさん、こんにちは! お元気でお過ごしでしょうか。
Exercismでは8月が大きな1か月となりました。PremiumとInsidersを統合し、自動フィードバックをエディターに直接追加し、トラックトロフィーを開始し、そのほかにもサイトにたくさんの小さな改善を加えました! まだトラックを確認してどんなトロフィーがもらえるか見ていない方は、ぜひチェックしてみてください。1つ以上のトロフィーを獲得した全員にメールをお送りしているので、そちらにも注目しておいてください。 8月は#12in23でも大いに楽しみました。普段アプリを作るために使われる言語を探求しました。
今月はスリムライン・セプテンバーです。非常に簡潔で短い構文を持つ言語を探求します。具体的には、8th(Forthの子孫)、AWK、Bash、jq、Perl、そしてRaku(以前はPerl 6として知られていました)を取り上げます。
バッジ
スリムライン・セプテンバーのバッジを獲得するには、9月中にこれらの言語のいずれかで5つの演習を完了する必要があります。
1年を通しての12in23バッジもあります。これを獲得するには、注目の演習のうち5つをその言語で解く必要があります。
- Gigasecond: 日付を扱う
- Atbash Cipher: 文字列を扱う
- Darts: 数値と条件分岐を扱う
- Luhn: 文字列、条件分岐、数値を扱う
- Series: 文字列とシーケンスを扱う
これらの演習と過去数か月の演習はすべて#12in23ページで見つかります。
概要
それぞれの概要を見ながら、じっくり探求していきましょう。
8th
- Ron Aaronによって開発されました。
- 名前は、主要な着想元であるForth言語をもじったものです。ただしForthとは多くの違いがあります:
- 強い型付け
- クロスプラットフォーム
- セキュリティの向上(メモリへの直接アクセスや組み込みアセンブラがない)
- 無料版と商用版の両方があり、後者はより多くの機能を提供します。
- クローズドソースですが、エンタープライズライセンスを購入すればソースコードを閲覧できます
AWK
- AWKは1970年代にベル研究所でAlfred Aho、Peter Weinberger、Brian Kernighanによって作られました。名前は作者たちの名字の頭字語です。
- テキスト処理を行うために設計されたドメイン固有言語ですが、ほかの目的にも使えます
- AWKはsedやgrepのようなUnixフィルターで、パイプラインの中で使うことを意図しています
- Single UNIX SpecificationとLinux Standard Base仕様はどちらも、あらゆる実装にAWKを含めることを要求しています。そのためほとんどの*nixマシンで利用できます
- AWK言語のさまざまな実装:
- awk(またはオリジナルのAWKを指すoawk):元の実装
- GNU AWK(gawk):1988年にリリースされ、言語を大幅に改訂・拡張しました
- BWK AWK(別名nawk):90年代後半にリリース
- mawk:高速なバイトコードインタプリター実装
- 多くの*nixシステムでは、
awkコマンドはgawkまたはnawkへのシンボリックリンクです
Bash
- BashはBrian Foxによって開発されたUnixシェルで、1989年にリリースされました。
- Bourneシェルの無料の代替として設計され、ほとんどのLinuxディストリビューションでデフォルトのログインシェルになっています。Bourneシェルのコマンド構文のスーパーセットなので、移行が容易です
- 波括弧展開、コマンドライン補完、シグナル処理など、さまざまな点でBourneシェルを拡張しています
jq
- Stephen Dolanによって開発され、2012年にリリースされました
- JSONドキュメントの簡単なクエリ、変換、操作を可能にするために設計されました(「JSONのためのsed」)
- 言語を実装する
jqツールは、もともとHaskellで実装されましたが、後にCに移植されました。GoやRustベースの移植版もあります
Perl
- Perlは1980年代後半にLarry Wallによって開発され、1987年に最初にリリースされました。
- レポート処理を容易にするための汎用スクリプト言語として設計されました
- 特に正規表現のサポートが非常に影響力があります(これについては後で詳しく見ていきます)
Raku
- Larry Wall(Perlの作者)によって設計され、2015年にリリースされました
- もともとはPerl 6として知られ、言語を整理し、あまり役に立たない、あるいは紛らわしいと見なされた機能をいくつか取り除くことを意図していました(面白い言葉:「Perl 6では、ユーザーを直すよりも言語を直す方がよいと判断しました」、Larry Wall)。Perl 6は結局Perl 5とソース互換にならなかったため、Rakuに改名されました
- 設計哲学の中心は、プログラミングを楽しく生産的にすることにあり、多様なプログラミング課題に取り組むための幅広いツールを提供します(汎用)
- Rakuは仕様なので、複数の実装が存在しえます(実際に存在します)。現在活発に開発されている唯一の実装はRakudoですが、Pugs(Haskellで書かれた)、v6-KindaPerl6、Niecza(CLRを対象)など古い実装もあります
これらの言語はどこで使われていますか?
8th
- 残念ながら、どこで使われているかは見つけられませんでした
AWK
- データの抽出とレポート、そして一般的なスクリプトに使われています
Bash
- 主にシステム管理に使われますが、CLIユーティリティやほかのツールのラッパーを提供するのにも使われます。私たちはExercismのリポジトリをまとめて作業するのに多用しました
jq
- JSONドキュメントのクエリ、変換、操作に使われ、多くの場合シェルスクリプトの形で利用されます。
Perl
- データ操作、ファイル解析、Webプログラミング、システム管理タスクに使われています。文字列操作の能力と豊富なモジュールエコシステムにより、Webの初期に人気を得ました。
Raku
- テキスト処理、システム管理などに使われています
プログラミングの観点から見て、これらの言語の面白さはどこにありますか?
ほとんどの言語は動的型付けでインタプリター型であり、そのスクリプトとしての性質によく合っています。とはいえ、いくつか例外もあり、特に対応するパラダイムに現れます。
8th
- 強い型付け
- マルチパラダイム:手続き型ですが、さらに興味深いのはスタックベース(スタックベースの実行モデル)、リフレクティブ(自身の構造と振る舞いを検査・変更する能力)、そして連接的(すべての式が関数で、関数を並置することが関数合成を意味します)です
- ネイティブコードにコンパイルされますが、REPLで解釈実行することもできます
AWK
- 動的型付けで、多くの場合インタプリター型です(使う実装によって異なります)
- 主なパラダイムはデータ駆動で、プログラムを、実行すべき手順を明示的に定義するのではなく、照合すべきデータと必要な処理を記述する文として書きます。AWKは手続き型プログラミングもサポートしています
Bash
- 動的でインタプリター型の言語です
- 命令型と手続き型のプログラミングをサポートします
jq
- 動的でインタプリター型の言語です
- 純粋関数型言語(すべての値がイミュータブル)で、「パイプライン」を重視しています。とてもUnixらしい感じがします
Perl
- 動的型付けでインタプリター型です
- マルチパラダイムで、関数型、オブジェクト指向、命令型のプログラミングをサポートします
Raku
- 動的型付けですが、段階的型付けをサポートし、必要な箇所に静的型付けを追加できます(Perlは動的です)
- マルチパラダイム言語:命令型、手続き型、オブジェクト指向、関数型
これらの言語の何が優れているのでしょうか?
8th
- 構文がごく少ないため、言語を学び理解しやすくなっています。データ(オブジェクトや配列など)を記述するのにJSONを使います。スタック、キュー、ヒープなどのほかのコンテナもサポートしています
- 予約キーワードがありません。サブルーチンは「ワード」と呼ばれ、新しいワードを簡単に定義できます。組み込みでもユーザー定義でも、すべてのワードは実行中に再定義できます
- クロスプラットフォームです。対応するあらゆるプラットフォーム向けの実行ファイルを簡単に生成できます
- 安全です。幅広いバグを防ぐ組み込みのセキュリティ機能があります(メモリへの直接アクセスがなく、ランタイムは動的ライブラリにリンクしません)
AWK
- 構文が単純で、AWKコードの構造が非常に一貫しているため、AWKコードを学び、読むのが簡単です。データ構造も単純で柔軟です
- 非常に表現力が高く、ごくわずかなコードで多くのことができます。ワンライナーに最適です
- ほとんどの*nixマシンにインストールされているため、AWKのスキルを多くの場所で活かせます(/bin/shとともに、標準Unixで唯一のスクリプト言語です)
- パイプラインやシェルスクリプトで非常によく機能し、AWKがほかのツールの出力を処理したり、その逆を行ったりします
Bash
- ほとんどのプラットフォームで使えます。macOSを含むほぼすべての*nixマシンにインストールされています。Windows Subsystem for Linux(WSL)により、Windowsシステムでもbashが使えるようになりました。
- 個々のコマンドを実行したり、ファイルからコードを読んで実行したり(シェルスクリプトと呼ばれます)するRE(P)Lとして使えます。Linuxのターミナルを使ったことがあるなら、ターミナルは通常bashのRE(P)Lなので、bashコードを書いたことがあるでしょう
- Bashとシェルスクリプトは、システム管理、devops、コンピューター管理に広く使われています。
- 非常に多用途で柔軟です
- 強力な文字列操作機能があり、非常にわかりやすい文字列補間も含みます
jq
- JSONを扱うための単純で短い構文があり、学びやすいです
- より複雑な操作のためにカスタム関数を定義できます。
- 末尾再帰最適化をサポートしており、データを再帰的に処理するのに最適です
- jqツールは単一のバイナリとして配布され、サイズはわずか30KB程度です
-
yqツールはjqをラップし、同じ構文でXML、TOML、YAMLファイルを操作できるようにします(内部的にこれらのデータ型をJSONに変換します) - CとGoの両方の実装が、ほかのアプリケーションへの埋め込みをサポートしています
Perl
- ほとんどのプラットフォームで動きます。クロスプラットフォームのスクリプトを書くのに最適です
- 柔軟性はPerlの設計哲学の要です。有名なモットーは「やり方は1つではない」(TMTOWTDI)です。目の前のタスクに応じて異なるアプローチが使えます
- 強いコミュニティと影響力のあるプロジェクトの遺産があります。多くのスクリプト、ツール、アプリケーションがPerlで開発されてきました。かつては「インターネットをまとめるガムテープ」と呼ばれました
- CPAN(Comprehensive Perl Archive Network)を通じて利用できる、豊富なモジュールとライブラリのエコシステムがあります
Raku
- 大きく、複雑で、強力ですが、一度にすべてを学ぶ必要のない言語としても設計されています。始めるのは簡単で、より強力な機能には後から触れられます
- 段階的型付けを含む、強力で拡張可能な型システムがあります。つまり、希望する型チェックのレベルを指定でき、動的型付けと静的型付けのバランスを取れます
- マルチディスパッチをサポートし、継承なしでポリモーフィズムを使えます
- RakuではUnicodeが一級市民です。異なる文字エンコーディングの処理をネイティブにサポートしています
- 高度な並行性と並列性の機能を提供します。非同期プログラミング、リアクティブプログラミング、並列実行のための組み込みサポートを含みます
際立った機能は何ですか?
8th
- 異なる考え方を要求します。その独特なパラダイムの組み合わせはほかの言語とは大きく異なり、物事への異なるアプローチを考えるよう促します
- スタックベースと逆ポーランド記法(RPN)の構文により、プログラム実行のイメージが非常に単純になります。値はスタックに積まれ、ほとんどのワードはスタックへの効果という観点で定義されます
AWK
- データ駆動パラダイムは非常に強力です。プログラムを条件とアクションのペアの集合として定義し、テキストをレコードに分割し(通常1行が1レコード)、各レコードをフィールドに分割する(たとえばCSVのフィールド、または1ワードが1フィールド)という、異なる考え方を要求します。これに慣れると、このアプローチのエレガントさと表現力を評価できるようになり、あちこちで使い道が見えてくるでしょう
- テキストの扱いに最適です。テキストの解析、変換、レポートのいずれであっても、AWKが対応します。システム上の各ユーザーのシェルを出力したり、CSVの列を合計したりといったタスクで、必要なコードの少なさに驚くでしょう
Bash
- 自動化に最適です。シェルスクリプトは繰り返し作業の自動化に優れています。
- Bashスクリプトはパイプラインを使い、ほかのプログラムを簡単につなぎ合わせられます。あるコマンドの出力を別のコマンドにパイプするスクリプトや、実行されたコマンドのいずれかが失敗したらスクリプトを失敗させるのは簡単です。
- 強力です。ほかのツールを簡単に使えることが、bashを信じられないほど強力なツールにしています
jq
- JSONデータ(今日では大量にあります)を簡単かつきれいに抽出・操作するのに最適です。JSONデータを変換するデファクトスタンダードのツールになりました。jqでJSONデータを作成することもできます
- ストリーミングデータをサポートし、「無限の」データをメモリの問題なく扱えます
- パイプラインの重視は、ストリーム(Unixツールなど)に馴染みのある人ならすぐに理解できるでしょう。また、jqコードはかなり推論しやすくなります
Perl
- 簡潔さと表現力で有名です。少しのコードで多くのことができます
- 特にテキストの扱いに適しており、その大きな理由は強力な正規表現サポートです。特にPerl 5は多くの新機能(後方参照、名前付きキャプチャグループ、最短一致量指定子など)を導入しました。Philip HazelはPerl 5互換の正規表現エンジンを実装したCライブラリであるPCRE(Perl Compatible Regular Expressions)を作りました。PCREを基盤としない言語でも、正規表現サポートをPCRE互換(つまりPerl 5の構文を使う)に設計することがよくあります
Raku
- 自動スレッディングジャンクションをサポートし、並列処理をはるかに扱いやすくします
- 遅延評価をサポートし、無限リストやシーケンスをメモリの問題なく扱えます。これは大規模なデータセットを扱うときや、無限のデータストリームを伴うアルゴリズムを扱うときに特に便利です
- テキスト処理に最適で、より単純で読みやすく、より強力な正規表現構文を提供します
- 文法を使って独自のドメイン固有言語(DSL)を定義するための組み込みサポートがあります。これにより、特定のデータ形式や言語のパーサーを作成でき、複雑なテキストデータを扱いやすくなります
どれを試すべき?
- 主にUnixシステムを使っている、またはdevopsを行っているなら、Bashは学ぶ価値の非常に高い言語です。AWK、Perl、Rakuを学ぶのも大いに役立ちます。最初の2つは多くのシステムに最初からインストールされています
- JSON(またはXML/YAML/TOML)を扱っているなら、jqは明らかな選択です
- テキストを処理したいなら、AWK、Perl、Rakuが明らかな選択です。
- 少し違うものを試したいなら、8thが優れた選択です
2023年09月01日(金)
·
役に立ちましたか?
公開元
Erik Schierboom