私は10年前からプロとしてPHPを使ってプログラミングをしています。コンピューターエンジニアリングの学位を取得した後、私が知っていたのは、Javaが私のケーキではなくなったことだけでした(個人および学術プロジェクトでJavaを6年以上使用した後)。多くより単純なスタックと私は、独立した開発者として自分自身を売り込むための迅速な方法が、上昇するPHPCMS市場に参入していることを理解しました。
何年にもわたってPHPは変化しましたたくさん多くの人がそれを打ち負かしたり批判したりするのが好きですが、多くの人は非常に古くてほとんど経験がないことに基づいてそれを行います。最新のPHPは、特にPHP 7タイプを使用し、PHP 5.xを残しておく余裕がある場合は、非常に使いやすく、もちろん、PHPには、何らかの理由で、ほぼデプロイできる言語であるという利点があります。多くのCMSがPHPで構築されている理由であり、それらが非常に成功している理由です。なぜならそれらはPHPベースです(Grav含まれています)。
もちろん、PHPは1つのツールにすぎません。最近、私は最初にGoの頭を掘り下げています。
PHPと比較すると、Goはまったく異なる言語と環境です。
これは、PHPから離れることを目的とした暴言や記事ではなく、PHP開発者である、Goが補完的なツールとして学ぶのに適した言語である理由を紹介するためのものです。
まず最初に:Goとは何ですか?
Goは、10年前にGoogleで設計された必須のオブジェクト指向プログラミング言語です。
創設メンバーの知識と、彼らが持っていたニーズに最適な言語を作成するという独自の哲学を組み合わせることで、Goが生まれました。
Goは、ガベージコレクションと並行プログラミング機能が組み込まれた、静的に型指定されたコンパイル言語です。
それは新しいことではありません
Goが革新を行う方法は非常に興味深いものです。現代語が持つべき新機能や他のプログラミング言語が提供するものについての誇大宣伝を完全に無視しますが、代わりに、戦闘でテストされた言語からコアコンセプトを選び、数十年のプログラミング経験を使用する美しいツールに集約します。
The task of the programming language designer is consolidation not innovation – Hoare, 1973
もちろん、Goには多くの独自の機能があり、単なるマッシュアップ言語ではありません。紹介されるgoroutines、並行性を処理するための素晴らしい方法です。紹介される延期、外部関数が戻ったときに何かを実行するための優れた方法(現在はSwiftにも追加されています)。
Goは、標準ツールにフォーマッターを導入した最初の言語でした。そして、摩擦なしに他のプラットフォーム用にコンパイルする機能に加えて、さらに多くの「新しい」もの。
囲碁には強いルーツがあります。 RobertGriesemerによるGopherCon2015での美しいプレゼンテーションは、それを示しています。Goは、両方の多くの原則を統合しています。Cそして、パスカル家から来た言語であるオベロン-2。これらの言語は両方とも、1960年に導入されたAlgol60に由来します。
だから次回Goが20年前の言語のように見える理由を誰かが尋ねる、あなたはそれが実際にそのベルトの下で60年以上の経験を持っていると同様に答えることができます。 Robert Griesemerがかつて言ったように、プログラミング言語が主流になるには10年かかります。
Goはまだ始まったばかりです。これは、Goの将来と、それを使って人々が何を構築できるかを考えると非常にエキサイティングです。
GoはPHPを補完します
PHPに加えてRubyまたはPythonを使用したことがある場合は、すべてが解釈され、緩く型付けされた言語であるため、方程式からファンボイズムと個人的な好みを削除すると、それらが多かれ少なかれ異なるバージョンのPHPに要約されることに気付いたかもしれません。
RubyからPHPとPythonに切り替えて、同じことを行うことができます。かなり大きく異なる唯一の「ウェブ言語」はJavaScript、これは非ブロッキングモデル(ただし、ライブラリを介してPHPも含む他の言語に移行されている)と、現在ブラウザでネイティブに実行されている唯一の言語であるため、非常に有利です。また、それは制御されていない実行環境のはるかにワイルドなエコシステムであり、すべてが微妙な方法で異なる可能性があります。
一方、行くは完全に異なる獣です。これはCのようなシステム言語です。動的言語とは異なり、Goは高速です。
PHPはCで構築されており、PHPを記述して実行できますC拡張機能なので、システム言語の概念はそれあなたにとってエイリアン。
GoはWebスタックを置き換えることができ、そのために利用できるWebフレームワークがあり、簡単にできますが、特にプロトタイピングの場合はPHPがその役割を果たし、コードのどの部分を大幅に最適化する必要があるかがわかりません。結局のところ、コードが実際に使用されるかどうか。
では、いつGoを使用する必要がありますか? PHPを使用しているが、PHPは実際にはその仕事に最適なツールではない場合。 PHPが特定の機能のために大量のメモリまたはリソースを消費している場合、高度に最適化されたGoプログラムのパフォーマンスが大幅に向上します。そのような単純な。 PHP 7は、PHPのパフォーマンスの向上に優れています。それは無料の贈り物でした。しかし、何百万ものデータベースエントリを処理する必要がある場合、または長時間実行されるプロセスでAPIからギガバイトのデータをフェッチする必要がある場合、PHPは適切なツールではない可能性があります。
私は頼りにしてきましたNode.jsこの問題を解決するためにかなりの数年間、しかし私がGoを知るようになったので、これまでのところ、私がGoを思いついたものは、はるかに単純でより良い解決策です。
もちろん、それだけではありません。 Goを使用すると、クロスプラットフォームの並行アプリケーションを簡単に構築できます。これはPHP Web開発とは大きく異なり、はるかに困難ですが、個人的に言えば、より興味深いものであり、多くのやりがいのある仕事を開くことができます。
したがって、PHP開発者として、要求の厳しいタスクをGoに引き渡すことができますが、それに熟練することで、キャリアの選択肢が確実に豊かになります。
C C ++やJavaではなくGoを使用する理由
どの言語にもその場所があります。確かに、GoはCおよびC ++のパフォーマンスに勝るものはありません。あなたが見つけることができる多くのベンチマークがあります。
Goは、これら2つの主流言語と歴史的言語、および動的言語の中間に位置します。インタプリタ言語から得られるパフォーマンスよりも高いパフォーマンスが必要ですが、CまたはC ++を使用する準備ができていないか、使用する意思がありません。レベルが低すぎるため、メモリを手動で管理する必要があり、開発に時間がかかります。行くはその場所に合います。
高度に最適化されたコードの場合— CまたはC ++に精通している場合は、CまたはC ++の方が優れたソリューションになる可能性があります。議会についても同じことが言えます。
Javaと比較すると、まったく異なる状況です。 Javaは環境の観点から多くのオーバーヘッドを必要としますが、Goプログラムは単一のファイルであり、軽量で、移植性があり、ネイティブです。
そして、おそらくリンゴとオレンジを比較しています。Javaを使用する場所でGoを使用することは決してなく、その逆も当てはまります。
Goは本質的にシンプルです
(覚えておいてください:シンプルは簡単という意味ではありません)フィーチャークリープを回避することは、明らかにGoの設計者の目標の1つでした。 Goの3人のオリジナルデザイナーの1人であり、UNIXとB言語(他の多くのものの中でも)の作成者でもある伝説のケントンプソンはかつて言った
私たち3人[トンプソン、ロブパイク、ロバートグリーズマー]が始めたとき、それは純粋な研究でした。私たち3人が集まって、C ++が嫌いだと判断しました。 [笑い]…[Goに戻る]私たちは、3人全員が言語のすべての機能について話し合う必要があるという考えから始めたので、何らかの理由で言語に余分なゴミが入ることはありませんでした。
これにより、あらゆる言語でコーディングしている経験豊富な開発者にとって、驚くほどシンプルな言語が実現しました。
Java、C ++、C、C#、Erlang、JavaScript、Swift、ほとんどすべての最新のプログラミング言語は、Goよりもはるかに複雑です。
そしてここで私は、プログラマーが使用するのが複雑で、読むのが複雑で、マスターになるのが複雑であることを意味します。内部では、Goはすべての複雑さを隠し、単純なAPIを公開します。 Goにはガベージコレクションがあるだけでなく、公開されているメモリ管理機能はまったくありません。
PHPには67個のキーワードがあり、Goには25個のキーワードがあると考えてください。
ここで重要なのは、プログラマーはGoogle社員であり、研究者ではないということです。彼らは通常、かなり若く、学校を卒業したばかりで、おそらくJavaを学び、おそらくCまたはC ++を学び、おそらくPythonを学びました。彼らは素晴らしい言語を理解することはできませんが、私たちはそれらを使って優れたソフトウェアを構築したいと考えています。ですから、私たちが彼らに与える言語は、彼らが理解しやすく、採用しやすいものでなければなりません。 —ロブ・パイク
これはGoの哲学の中核であり、Goが機能の実装を回避することを選択した理由(機能のクリープを回避)、および関数型プログラミングの多くの概念が議論を開くために複雑であるために省略されている理由を説明しています。純粋関数型プログラミングは、マシンの概念から離れすぎているため、本質的に命令型言語であるGoに関連することはできません。
とは言うものの、Goには、ファーストクラス関数(関数を変数に割り当てることができる)、クロージャ、再帰など、関数型プログラミングの多くの概念が実装されています。
ただし、PHPやJSと比較すると、map、reduce、filterなどの機能的な操作はなく、ループに依存する必要があります。どうして?これらの操作は非効率的であり、Goはバランスを見つける必要があるためです。
足りないものといえば、エラーを処理するための例外はありません。クラスはありません(オブジェクト指向であり、関連するメソッドを持つ構造体があり、強制されます)継承をめぐる構成— JavaScriptのプロトタイプオブジェクトの実装についての知識がある場合、これはよく知られていますが、非常に異なります)、ジェネリックはありません(ただし、PHPにもありません)。これが理由です。
少ないほうがいいですね、または(さらに良い!)少ないほど指数関数的に多い。
ループを作成する方法は1つだけです。for
。忘れるwhile
そしてdo — while
そしてforeach
(もっと何か?)。
関数から複数の値を返す機能は、多くのトリックを回避します(最も簡単な例は、2つの値を含む配列を返し、渡された正確な型を知らずにそれらを抽出する必要があることです)。
シンプルさはツールに継承されます。gofixは、新しいGoリリースでの壊れたAPIの変更を自動的に修正します。
また、Goは設計上シンプルであり、常にシンプルなままです。
ロブパイクが言うように、他の多くの言語は相互に機能をコピーしており、独自の側面を失っています(JavaScriptがクラス構文を導入してJavaおよびPHP開発者を喜ばせることを考えてください)。これらはすべて、概念的に独自の言語に理想的に収束しています。
Goは機能で競合しません。これは私に思い出させますこのGettingRealの記事。
注意:Goは二極化しています
Goにはたくさんのファンがいて、嫌いな人もたくさんいます。 PHP開発者として、あなたはこの種の炎上戦争で厚いスキンを開発したと確信しています。次のポイントにすぐに進むことができます。それは非常に人気があり、開発者は強い意見を持っています。
Goは問題を美しく解決します。そして、それを使い始めるのに天才である必要はありませんが、これはあなたの気持ちを傷つけるかもしれません。
Goは非常に意見があり、明確な慣習があります
Goについて最初に気付くのは、見つけることができるほとんどすべてのコードがほとんど同じに見えることです。
これは、Goには明確で強制的な規則があるためです。組み込みツールは、規則に関連する2つのコマンドを提供します(gofmtそしてゴリント、最初の自動フォーマットコード、2番目の自動フォーマットコード)を使用すると、コードが準拠しているかどうかを確認でき、Goガイドラインに合わせてスタイルを自動的に調整することもできます。
これはJSとは異なりますESLint/ JSHint、これらのツールはチーム全体のアプリケーションであるため。すべてのJSと同様に、設定で何でもカスタマイズできます。gofmt
は1つであり、構成はありません。これが、進むべき道のスタイルです。
これは、独自のコードに一貫性を持たせるのに最適です(5年前にPHPまたはJavaScriptで作成したコードは非常にあなたの現在の慣習や好みとは異なります)そして全員配布します。
最高のコードスタイリングに関する社内チームの議論がこれ以上ないことを想像してください。同じ方法でフォーマットされ、リントされたオープンソースプロジェクトのすべてのPRを想像してください。スペースvs0タブ、マインドサイクルを節約-それはタブです。同じ行または次の行に中括弧がありますか?常に同じ行を1つ(これには理由があり、セミコロンを省略できるようにするためです)。
変数またはインポートが使用されていない場合、Goはコンパイルエラーを発生させ、プログラムが時間の経過とともにガベージを蓄積するのを防ぎます。
命名規則は非常に重要であるため、アクセス修飾子は方程式から完全に削除されています。小文字の変数?民間。大文字の変数?公衆。そのように単純で、単純な規則により、無駄な画面スペースの使用量が大幅に削減され、さらにすぐに理解できます。
コメントは特別なニーズに対応し、特別な構文でコメントを記述して、パッケージを使用して検査できるようにします。go doc
そして、Googleで検索しなくても、必要なすべてのドキュメントを入手できます。
go get
ビルトイン(オープンソースと配布に最適)を自由に使用できます。 PHPlandは、依存関係の管理に関して私の意見でははるかに進んでいますが。
PHPUnit / Codeception?必要なし、go test
あなたのためにすでにそこにあります*_test.go
ファイル。
それはあなたをより良いプログラマーにします
PHPを使用している場合、Goを学ぶことで、別の新しい方法で考えることができます。それはあなたを他の言語を学ぶのと同じようにあなたをより良いプログラマーにするでしょう:それはあなたに新しい概念を紹介します。それが奇妙で異質であると感じた場合、それはあなたが開発者として学び成長している良い兆候です。
まず、Goはインタプリタではなくコンパイルされます。完全に異なるワークフローと展開。
強い型付けの経験がない場合、それはパラダイムの変化です。 PHP 7には入力チェックが付属しており、古いバージョンのPHPをサポートする必要がない場合に非常に役立ちます。 Goは強く型付けされています。すべてではないにしても多くのタイプの問題は、コンパイル時に解決されます。
Goは驚くほどシンプルで、シンプルになるように設計されています。Go開発者であるということは、このシンプルさを認識して活用することを意味し、JavaのようなGoを作成しようとせず、受け入れることを意味します。
簡単に言うと、Goがおもちゃの言語であるという意味ではありません。確かにそうではなく、誰かにコーディングを紹介する言語でもありません。
簡単に言うともっとミニマリズムそして毛羽立ちなし。
言語が同じことをするための多くの方法をあなたに提供するとき、あなたはあなたが解決しようとしている問題から気をそらして、どれが最良であるかを考えることを余儀なくされます。
PHPからGoコードを実行できます
したがって、私が最初に提案する1つの方法は、Goサービスとして大量のメモリを消費する重いルーチンまたは長時間実行されるコードをコーディングすることです。
そこです たくさんの 方法PHPからGoプログラムを直接呼び出すために、しかしあなたはまた実装することを選ぶかもしれませんZeroMQを介したサービスキュー、またはリバースプロキシを介してAPIエンドポイントを公開することで長寿命のgoプログラムにアクセスします。多くのオプションがあります。
Goの特別な武器:並行性
PHP-FPMは、同時リクエストを非常にうまく処理し、各ユーザーの実際のPHPコードを実行する新しいプロセスを生成することが知られています。そして通常、Webアプリケーションでは、データベースがボトルネックになります。しかし、長時間実行されるプロセス(PHPで実際に構築したくないもの)や、数万の並行プロセスを実行する必要があるPHPリクエスト内で重い計算ループを開始する必要がある場合はどうでしょうか。
PHPはスレッドをサポートしているため、並行処理を実行できますが、PHP(またはCなど)は言語外部のライブラリの助けを借りて並行処理を実行できますが、Goは設計組み込みの並行プログラミングを使用し、ゴルーチン間で通信するためのネイティブな方法を提供します。
スレッドは、に比べて重いですgoroutines。 JavaやErlangのように、ゴルーチンのメモリ消費の内部実装がはるかに軽いため、システムは10kスレッドをサポートでき、同じシステムは数百万のゴルーチンをサポートできます。
したがって、何百万もの同時リクエストが必要ない場合でも、パフォーマンスの向上は明らかです。
さらに、ゴルーチンを消化し、コードが何をするのかを簡単に理解するのは非常に簡単です。
クラスを拡張したり、常に利用できるとは限らない特別な拡張機能を含める必要はありません(これにより、自己インストールされた分散コードにPHPの同時実行性を使用できる範囲が事実上制限されます)
入力するだけですgo someFunction()
そして、その関数はゴルーチンで実行されます。
結論
Goを初めて使用するPHP開発者の方は、このツールに興味があり、どこで役立つか、またはそれが適切かどうかを考えていることを願っています。
あなたが複雑さよりも単純さを好み、抽象化よりも直接的で読みやすいコードを好むプログラマーなら、Goは本当に面白いと思うでしょう。
その他のチュートリアル:
- NGINXリバースプロキシを使用してGoサービスを提供する
- Goで構造体のコピーを作成する
- GoWebサーバーの基本
- Goでのマップタイプの並べ替え
- 一言で言えばポインタを移動します
- タグの説明に行く
- 日付と時刻のフォーマットに移動
- Goを使用したJSON処理
- 可変個引数関数に移動
- GoStringsチートシート
- GoEmptyインターフェイスの説明
- Go withVSCodeとDelveのデバッグ
- NamedGoはパラメータを返します
- Goで乱数と文字列を生成する
- Goプロジェクトのファイルシステム構造
- Goに実装された二分探索アルゴリズム
- Goでのコマンドラインフラグの使用
- GOPATHの説明
- Goでコマンドラインアプリを作成する:lolcat
- Goを使用したCLIコマンドの作成:cowsay
- Goでのシェルパイプの使用
- CLIチュートリアルに移動:フォーチュンクローン
- Goを使用してフォルダ内のファイルを一覧表示します
- Goを使用して、GitHubからリポジトリのリストを取得します
- 移動し、文字列のスライスをファイルに追加します
- 文字列をバイトスライスに変換します
- GoでローカルGitの貢献を視覚化する
- GoCPUとメモリプロファイリングの開始
- Goプログラムの「インデックス作成をサポートしていません」エラーを解決する
- Goプログラムでの実行時間の測定
- 重複するタイトルを検出するためにGoを使用してWebクローラーを構築する
- ベストプラクティスに進む:ポインターまたは値のレシーバー?
- ベストプラクティスに進む:メソッドまたは関数を使用する必要がありますか?
- データ構造の移動:設定
- マップのチートシートに移動
- Goでジェネリック型の実装を生成する
- Goデータ構造:辞書
- Goデータ構造:ハッシュテーブル
- Go throughChannelsにイベントリスナーを実装する
- Goデータ構造:スタック
- データ構造の移動:キュー
- Goデータ構造:二分探索木
- Goデータ構造:グラフ
- Goデータ構造:リンクリスト
- Goデータ構造の完全ガイド
- Go値の比較
- Goはオブジェクト指向ですか?
- GoでのSQLデータベースの操作
- Goでの環境変数の使用
- チュートリアルに進む:PostgreSQLに裏打ちされたREST API
- GoWebサーバーでのCORSの有効化
- DockerコンテナへのGoアプリケーションのデプロイ
- GoがPHP開発者として学ぶための強力な言語である理由
- 移動し、io.Reader.ReadString改行文字を削除します
- 移動、変更を監視してプログラムを再構築する方法
- 行って、日付からの月を数えます
- GoでHTTPPOSTパラメーターにアクセスする