fdpl_memo0008
の編集
https://k.osask.jp/klog/?fdpl_memo0008
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
2012_0001
2013_0001
2013_0002
2013_0003
2014_0001
2015_0001
2016_07
2016_08
2016_09
2016_10
2016_11
2017_01
2017_02
2017_03
2017_04
2017_05
2018_01
2019_01
BracketName
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KH_SARC_00
KH_dha8
MenuBar
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
VC_install
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
fdpl_memo0001
fdpl_memo0002
fdpl_memo0003
fdpl_memo0004
fdpl_memo0005
fdpl_memo0006
fdpl_memo0007
fdpl_memo0008
fdpl_memo0009
fdpl_memo0010
gg02_0004
gg02_0005
gg02_0006
gg02_0007
gg02_0008
gg02_0009
https
impressions
memo0001
memo0002
oisix01
osaskology
osaskology0
osecpu_0001
osecpu_0002
p20200229a
p20200303a
p20200310a
p20200321a
p20200401a
p20200730a
p20201230a
p20220628a
p20220701a
populars
prog_0001
prog_0002
prog_0003
prog_0004
prog_0005
* KH-FDPL に関するメモ-0008 -(by [[K]], 2015.02.17) ** KH-FDPLの特徴(4) - 自己拡張可能型の文法 -(4-1) たとえばC言語で、Pythonみたいにインデントでループ範囲を指定できたらいいのにと誰かが考えたとします。もしくは反対にPythonで、インデントによらず中カッコでループ範囲が指定できたらいいのにと思ったとしましょう。そんなときに、オリジナルの文法を考えて、そのオリジナルのソースからC言語のソースを生成するソースコンバータ(コンパイラ?)を作るという方法があります。要するにいきなりアセンブラや機械語を出力するのではなくて、新言語を既知の言語に変換するだけでいいのです。 --この方法は、オリジナルのプログラミング言語を一から作るよりもずっと易しいです。 --この方法をKH-FDPLでは全面的に支援することにしました。つまり文法をどんどん改良していけるし、既存文法との併用も可能にしています。いわば、KH-FDPLはスクリプト言語を大量生産できる基盤になることを目指していて、とりあえず提供される基本の言語仕様についてはかなり気が抜けた便利ではない内容になっています。使いやすくなくても、とにかく一通りの機能があればよい、という感じです。 --この方式だと、実行時エラーの扱いが少し難しくなります。コンパイル時エラーならいいのです、どこが原因かを簡単に示せるので。しかし実行時エラーになるとそれが元のソースのどこに対応しているのかが分かりにくくなるのが普通です。・・・KH-FDPLではこの問題を解決するために、支援する機能を持っています。 --プログラミング言語は、もっとたくさん生まれるべきですし、もっとたくさん滅びるべきです。競争や淘汰が行われないといいものは残らないと思います。そして本当に良い言語仕様が生き残ってきたら、そのときにはそれをネイティブに実行できる高速な言語処理系を作ればいいいでしょう。それより前にがんばってもきっと空回りです。 --KH-FDPLは高速ではありませんし、メモリ効率もよくはありません。しかし文法拡張が多層になっても、あまり遅くならない仕組みを持っています(後述)。つまりこれは中速な言語処理系なのです。 -(4-2) KH-FDPLはcompile命令を持ちます。これはいわゆるeval命令に似ていますが、違うのは最下層処理系のバイトコードまでは変換するけれど、実行まではやらない、というところです。それを実行するのはexecute命令です。 --新しい言語を追加するときは、新しいcompile関数を書きます。この関数をとりあえず、lang.A.compile()とでもしましょう。これは受け取ったソースコードを変換して、langBの構文で書き直します。そして最後にlang.B.compile()を実行して、その戻り値をlang.A.compile()の戻り値とします。 lang.A.compile = function { x = arg[0]; xを解釈してlangBに翻訳し、その結果をyに入れる。 return lang.B.compile(y); } --これだと、コンパイルがどんなに入れ子になっていても実行速度には影響しません。遅いのはcompile関数の実行速度だけです。 --当然のことながら、このcompile関数自身もKH-FDPL内の好きな言語で記述できます。・・・ということでKH-FDPLが最初に目指すのは、「プログラミング言語を作りやすいプログラミング言語」の開発、になりそうな気がしています。 --KH-FDPLの処理系では、与えられたソースをどのcompile関数に渡せばよいかを設定などから判断して、使い分けます。 -(4-3) 一つのソース内で言語を切り替えて使うことはできるでしょうか。それはもちろんできると思います。イメージとしてはC言語のインラインアセンブラみたいな感じです。 --仮にもしこの機能が使いにくければ、使いやすくなるようなプログラミング言語を作ってしまえば解決です。 --もちろんcompile関数を記述する際にも複数の言語を切り替えて使えます。 -(4-4) KH-FDPLはcompile命令やexecute命令を持つので、「プログラムがプログラムを作る」みたいなことが簡単にできます。 --実行中のプログラムが、自分を構成する関数を再定義してしまうことも可能です。つまり自己書き換えみたいなこともできるわけです。これは何の役にも立たないかもしれませんが、もしかしたら新しいプログラミングテクニックが生まれるかもしれません。 * こめんと欄 #comment
タイムスタンプを変更しない
* KH-FDPL に関するメモ-0008 -(by [[K]], 2015.02.17) ** KH-FDPLの特徴(4) - 自己拡張可能型の文法 -(4-1) たとえばC言語で、Pythonみたいにインデントでループ範囲を指定できたらいいのにと誰かが考えたとします。もしくは反対にPythonで、インデントによらず中カッコでループ範囲が指定できたらいいのにと思ったとしましょう。そんなときに、オリジナルの文法を考えて、そのオリジナルのソースからC言語のソースを生成するソースコンバータ(コンパイラ?)を作るという方法があります。要するにいきなりアセンブラや機械語を出力するのではなくて、新言語を既知の言語に変換するだけでいいのです。 --この方法は、オリジナルのプログラミング言語を一から作るよりもずっと易しいです。 --この方法をKH-FDPLでは全面的に支援することにしました。つまり文法をどんどん改良していけるし、既存文法との併用も可能にしています。いわば、KH-FDPLはスクリプト言語を大量生産できる基盤になることを目指していて、とりあえず提供される基本の言語仕様についてはかなり気が抜けた便利ではない内容になっています。使いやすくなくても、とにかく一通りの機能があればよい、という感じです。 --この方式だと、実行時エラーの扱いが少し難しくなります。コンパイル時エラーならいいのです、どこが原因かを簡単に示せるので。しかし実行時エラーになるとそれが元のソースのどこに対応しているのかが分かりにくくなるのが普通です。・・・KH-FDPLではこの問題を解決するために、支援する機能を持っています。 --プログラミング言語は、もっとたくさん生まれるべきですし、もっとたくさん滅びるべきです。競争や淘汰が行われないといいものは残らないと思います。そして本当に良い言語仕様が生き残ってきたら、そのときにはそれをネイティブに実行できる高速な言語処理系を作ればいいいでしょう。それより前にがんばってもきっと空回りです。 --KH-FDPLは高速ではありませんし、メモリ効率もよくはありません。しかし文法拡張が多層になっても、あまり遅くならない仕組みを持っています(後述)。つまりこれは中速な言語処理系なのです。 -(4-2) KH-FDPLはcompile命令を持ちます。これはいわゆるeval命令に似ていますが、違うのは最下層処理系のバイトコードまでは変換するけれど、実行まではやらない、というところです。それを実行するのはexecute命令です。 --新しい言語を追加するときは、新しいcompile関数を書きます。この関数をとりあえず、lang.A.compile()とでもしましょう。これは受け取ったソースコードを変換して、langBの構文で書き直します。そして最後にlang.B.compile()を実行して、その戻り値をlang.A.compile()の戻り値とします。 lang.A.compile = function { x = arg[0]; xを解釈してlangBに翻訳し、その結果をyに入れる。 return lang.B.compile(y); } --これだと、コンパイルがどんなに入れ子になっていても実行速度には影響しません。遅いのはcompile関数の実行速度だけです。 --当然のことながら、このcompile関数自身もKH-FDPL内の好きな言語で記述できます。・・・ということでKH-FDPLが最初に目指すのは、「プログラミング言語を作りやすいプログラミング言語」の開発、になりそうな気がしています。 --KH-FDPLの処理系では、与えられたソースをどのcompile関数に渡せばよいかを設定などから判断して、使い分けます。 -(4-3) 一つのソース内で言語を切り替えて使うことはできるでしょうか。それはもちろんできると思います。イメージとしてはC言語のインラインアセンブラみたいな感じです。 --仮にもしこの機能が使いにくければ、使いやすくなるようなプログラミング言語を作ってしまえば解決です。 --もちろんcompile関数を記述する際にも複数の言語を切り替えて使えます。 -(4-4) KH-FDPLはcompile命令やexecute命令を持つので、「プログラムがプログラムを作る」みたいなことが簡単にできます。 --実行中のプログラムが、自分を構成する関数を再定義してしまうことも可能です。つまり自己書き換えみたいなこともできるわけです。これは何の役にも立たないかもしれませんが、もしかしたら新しいプログラミングテクニックが生まれるかもしれません。 * こめんと欄 #comment
テキスト整形のルールを表示する