タグ付けされた質問 「programming-languages」

タスクを完了するために計算のステップを実行するようにコンピューターに指示するための人工言語。プログラマーがコンピューターと通信できるようにします。

4
なぜ最近のプログラミング言語で変数名の後に型が続くのですか?
ほぼすべての最新のプログラミング言語(Go、Rust、Kotlin、Swift、Scala、Nim、Pythonの最終バージョンでも)で、型が常に変数宣言の変数名の後に来るのはなぜですか? なぜx: int = 42ありませんかint x = 42? 後者は前者よりも読みにくいですか? それは単なるトレンドですか、このソリューションの背後には本当に意味のある理由がありますか?


14
プログラミング言語の後方互換性とその欠陥の修正を維持する
まず、いくつかのコンテキスト(ほとんどの人が知っているもの): すべての一般的なプログラミング言語には明確な進化があり、ほとんどの場合バージョンによってマークされます。Java5、6、7など、PHP 5.1、5.2、5.3などがあります。新しいバージョンをリリースすると、新しいAPIが利用可能になり、バグが修正され、追加されます新しい機能、新しいフレームワークなどです。全体として:それは良いことです。 しかし、言語(またはプラットフォーム)の問題はどうでしょうか?言語に何か問題がある場合、開発者はそれを回避するか(可能であれば)、それと共存することを学びます。 現在、これらの言語の開発者は、それらの言語を使用するプログラマーから多くのフィードバックを得ています。そのため、時間(およびバージョン番号)が経過するにつれて、これらの言語の問題はゆっくりと、しかし確実に消えていくことになります。まあ、そうでもない。どうして?下位互換性、それが理由です。しかし、これはなぜですか?より具体的な状況については、以下をお読みください。 私の質問を説明できる最善の方法は、PHPを例として使用することです。 PHPは何千人もの人々に愛され、嫌われています。すべての言語には欠陥がありますが、明らかにPHPは特別です。このブログ投稿をご覧ください。PHPのいわゆる欠陥の非常に長いリストがあります。今、私はPHP開発者ではありません(まだ)が、すべてを読み通しており、そのリストの大きな部分が実際の問題であると確信しています。(潜在的に主観的であるため、すべてではありません)。 さて、もし私がPHPを積極的に開発している人の1人であれば、これらの問題を1つずつ解決したいと思っています。ただし、それを行うと、言語の特定の動作に依存するコードが新しいバージョンで実行されると壊れます。2語で要約すると、後方互換性です。 私が理解していないのは、なぜPHPの下位互換性を保つ必要があるのか​​ということです。これらの問題をすべて修正したPHPバージョン8をリリースした場合、「このバージョンでは古いコードを実行しないでください!」という大きな警告を出すことはできませんか? 非推奨と呼ばれるものがあります。私たちは何年もそれを持っていて、それはうまくいきます。PHPのコンテキスト:最近の人々がどのようにmysql_*関数の使用を積極的に推奨していないか(そして代わりにmysqli_*PDO を推奨するか)を見てください。廃止は機能します。使用できます。それを使うべきです。関数で機能する場合、言語全体で機能しないのはなぜですか? 私(PHPの開発者)がこれを行うとしましょう: これらのすべての欠陥を修正した新しいバージョンのPHP(たとえば8)を起動します 新しいプロジェクトは、そのバージョンの使用を開始します。これは、はるかに優れた、より明確な、より安全なものだからです。 ただし、古いバージョンのPHPを放棄しないように、更新プログラムをリリースし続け、セキュリティの問題、バグなどを修正します。これは、ここにリストしていない理由から理にかなっています。これは一般的な習慣です。たとえば、バージョン5.5.xに主に焦点を合わせていたにもかかわらず、OracleがMySQLのバージョン5.1.xを更新し続けた方法を見てください。 約3〜4年後、古いバージョンのPHPの更新を停止し、それらを消滅させます。この3年か4年で、ほとんどのプロジェクトはとにかくPHP 8に切り替えられるので、これは問題ありません。 私の質問は次のとおりです。これらの手順はすべて理にかなっていますか?それはとても難しいでしょうか?それができれば、どうしてできないのですか? はい、欠点は後方互換性を破ることです。しかし、それは支払う価値がありませんか?良い点として、3、4年後には、その問題の90%が修正された言語になります。その名前はその人気を保証します。 編集:OK新しい計画。

5
「文脈自由文法」という用語で「文脈自由」とはどういう意味ですか?
文脈自由文法(CFG)が何であるかを説明しようとする資料の量を考えると、そのような文法が「コンテキスト-自由"。そして、私の考えでは、誰もそうすることに成功していません。 私の質問は、なぜ文脈自由文法が文脈自由と呼ばれるのですか?「コンテキスト」とは何ですか?コンテキストは、現在分析されている構造を取り巻く他の言語構造である可能性があるという直感がありましたが、そうではないようです。誰でも正確な説明を提供できますか?

6
イベントループは、ポーリングが最適化されたfor / whileループですか?
イベントループとは何かを理解しようとしています。多くの場合、イベントループでは、イベントが発生したことが通知されるまで何かをするという説明があります。その後、イベントを処理し、以前の操作を続行します。 上記の定義を例にマッピングします。イベントループで「リッスン」するサーバーがあり、ソケット接続が検出されると、そこからのデータが読み取られて表示され、その後サーバーは以前と同じようにリッスンを再開/開始します。 ただし、このイベントが発生し、「そのような」通知を受け取ることは、私にとって非常に重要です。あなたは言うことができる:「それはあなたがイベントリスナーを登録しなければならない「ちょうどそのような」ではない」しかし、イベントリスナーとは何か、何らかの理由で返されない関数です。イベントが発生したときに通知されるのを待っている独自のループですか?イベントリスナーもイベントリスナーを登録する必要がありますか?どこで終わりますか? イベントは作業するのに最適な抽象概念ですが、単なる抽象概念です。結局、ポーリングは避けられないと思います。おそらく私たちはコードでそれをしていませんが、下位レベル(プログラミング言語の実装またはOS)が私たちのためにそれをしています。 基本的には、次の擬似コードになります。このコードは、十分に低い場所で実行されているため、ビジー待機を発生させません。 while(True): do stuff check if event has happened (poll) do other stuff これはアイデア全体に対する私の理解であり、これが正しいかどうか聞きたいと思います。私は全体の考えが根本的に間違っていることを受け入れることに心を開いています。その場合、正しい説明が欲しいです。


3
履歴書にプログラミング言語を入れますか?[閉まっている]
履歴書に載せる前に、その言語でどれくらいの経験が必要ですか?私は間違いなく履歴書を書きますが、Cでの大規模なプログラミングやC#を独学で学んだが、意味のあるプロジェクトを書いていない大学の数学期のコースを取ったと言います(Java)に堪能な言語が1つありますその中で、雇用主にそれを笑わせたり、インフレを再開させたりすることなく、これらの言語を履歴書に載せることはできますか?

12
どのプログラミング言語が最も見つけにくいバグを生成しますか?[閉まっている]
あなたの意見では、平均的なプログラマーが見つけにくいバグを最小限に抑えて機能を出力できる言語は何ですか?これはもちろん非常に広範な質問であり、私は非常に広く一般的な答えと知恵に興味があります。 個人的には、JavaおよびC#プログラムの奇妙なバグを探すのにほとんど時間を費やさず、C ++コードには明確な繰り返しバグのセットがあり、Python / similarにはコンパイラによって検出される一般的で愚かなバグのセットがあります他の言語で。 また、完全に機能的なコードで書かれた大きくて複雑なプログラムを見たことがないので、この点で関数型言語を検討するのは難しいと感じています。ご入力ください。 編集:見つけにくいバグを完全にarbitrary意的に明確化:再現するのに15分以上かかり、原因を見つけて修正するのに1時間以上かかります。 これが重複している場合はご容赦ください。ただし、この特定のトピックについては何も見つかりませんでした。

9
Javaに `void`メソッドがあるのはなぜですか?
Javaにvoidメソッドが必要なのはなぜですか?参照: voidと宣言されたメソッドは値を返しません。 私の考えている限り、のすべての使用はvoid、ステータスフラグ、呼び出されているオブジェクト、またはを返すことにより、より適切に機能しますnull。 これにより、すべての呼び出しが割り当て可能なステートメントになり、ビルダーパターンとメソッドチェーンが容易になります。通常、効果のためにのみ呼び出されるメソッドは、ブールSuccess型またはジェネリック型を返すか、失敗すると例外をスローします。


3
型システムとは何ですか?
バックグラウンド 私はサイドプロジェクトとして言語を設計しています。動作するアセンブラー、静的アナライザー、それに仮想マシンがあります。構築したインフラストラクチャを使用して、重要なプログラムを既にコンパイルおよび実行できるため、大学でプレゼンテーションを行うことを考えました。 私の話の中で、私はVMが型システムを提供することについて言及しました、「あなたの型システムは何のためにあるのですか?」答えた後、私は質問をする人に笑われました。 したがって、この質問をすることで評判を失うことはほぼ確実ですが、プログラマーに頼ります。 私の理解 私が理解しているように、型システムはプログラム内のエンティティに関する追加情報の層を提供するために使用されるため、ランタイム、コンパイラー、またはその他の機械は、操作対象のビット文字列をどう処理するかを認識します。また、コントラクトの維持にも役立ちます。コンパイラ(またはコードアナライザー、ランタイム、またはその他のプログラム)は、プログラマーが期待する値でプログラムが動作することをいつでも検証できます。 タイプは、それらの人間のプログラマーに情報を提供するためにも使用できます。たとえば、次の宣言を見つけます。 function sqrt(double n) -> double; これよりも便利 sqrt(n) 前者は多くの情報を提供します:sqrt識別子は関数であり、double入力として単一のものを取り、double出力として別のものを生成します。後者は、おそらく単一のパラメーターを取る関数であることを示しています。 私の答え それで、「あなたのタイプシステムは何のためですか?」私は次のように答えました: 型システムは動的です(型は値を保持する変数ではなく値に割り当てられます)が、意外な強制ルールがなければ強力です(互換性のない型を表すため、文字列を整数に追加できませんが、浮動小数点数に整数を追加できます) 。 タイプシステムは、命令のオペランドが有効であることを確認するためにVMによって使用されます。また、プログラマーは、関数に渡されたパラメーターが有効(つまり、正しい型)であることを確認するために使用できます。 型システムは、サブタイピングと多重継承をサポートしています(プログラマーは両方の機能を使用できます)。オブジェクトのメソッドの動的ディスパッチが使用される場合、型は考慮されます。 次の質問は、「タイプは値にどのように割り当てられますか?」でした。そこで、すべての値がボックス化され、タイプの名前、応答するメッセージ、および継承するタイプに関する情報を提供するタイプ定義構造を指すポインターがあることを説明しました。 その後、私は笑われ、「それは本当のタイプシステムではない」というコメントで私の答えは却下されました。 だから-私が説明したものが「実際のタイプシステム」として適格でない場合、どうなりますか?その人は、私が提供するものを型システムと見なすことができないということは正しいのですか?

9
なぜ==演算子文字列値の比較がJavaにならないのですか?
有能なすべてのJavaプログラマーは、==が参照の等価性をチェックするため、==ではなくString.equals()を使用してストリングを比較する必要があることを知っています。 文字列を扱うとき、ほとんどの場合、参照の等価性ではなく値の等価性をチェックしています。==を使用するだけで文字列値を比較できる言語であれば、より直感的になると思います。 比較として、C#の==演算子は文字列 sの値が等しいかどうかをチェックします。参照の等価性を本当に確認する必要がある場合は、String.ReferenceEqualsを使用できます。 もう1つの重要な点は、文字列は不変であるため、この機能を許可しても害はありません。 これがJavaで実装されない特別な理由はありますか?

11
なぜLispはもっと普及していないのですか?[閉まっている]
私はSICPビデオでSchemeを学び始めています。次にCommon Lispに移りたいと思います。 この言語は非常に興味深いようであり、ほとんどの人々はそれについて本を書いており、比類のない表現力を持っていると主張しています。CLにはまともな標準ライブラリがあるようです。 なぜLispはもっと普及していないのですか?それが本当にそんなに強力であるならば、人々はそれを全面的に使用するべきですが、代わりに、例えば、Lisp求人広告を見つけることはほとんど不可能です。 しばらくしてからは大きな問題ではないので、括弧だけではないことを願っています。

11
C ++には「未定義の動作」(UB)があり、C#やJavaなどの他の言語にはないのはなぜですか?
このStack Overflowの投稿には、C / C ++言語仕様が「未定義の動作」であると宣言している状況のかなり包括的なリストがリストされています。ただし、C#やJavaなどの他の現代言語に「未定義の動作」という概念がない理由を理解したいと思います。つまり、コンパイラの設計者は、考えられるすべてのシナリオ(C#およびJava)を制御できるかどうか(CおよびC ++)を制御できますか?

11
「推論するのは簡単」-それはどういう意味ですか?[閉まっている]
他の開発者がそのフレーズを使用して、いくつかのパターンを「宣伝」したり、ベストプラクティスを開発したりすることを何度も耳にしました。ほとんどの場合、このフレーズは、関数型プログラミングの利点について話しているときに使用されます。 「推論するのは簡単」というフレーズは、説明やコードサンプルなしでそのまま使用されています。だから私にとっては、次の「話題」の言葉のようになり、より「経験のある」開発者が講演で使用します。 質問:「推論するのは簡単ではない」例をいくつか挙げてください。「推論するのは簡単」の例と比較できますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.