Рубрики

Программирование на естественном языке

Программируя много лет на многих языках, я часто нахожу себя в английском псевдокоде, а затем перевожу свои мысли в любой искусственный синтаксис, с которым я работаю в то время. И вот однажды я подумал: «Почему бы просто не написать код на уровне естественного языка и пропустить этап перевода?» Мой старший сын (тоже программист) и я обсудили это, и мы решили проверить теорию. В частности, мы хотели знать:

1. Легче ли программировать, когда вам не нужно переводить свои мысли на естественном языке в альтернативный синтаксис?

2. Могут ли естественные языки анализироваться относительно «неаккуратно» (как, по-видимому, их анализируют люди) и при этом обеспечивать достаточно стабильную среду для продуктивного программирования?

3. Могут ли программы низкого уровня (например, компиляторы) быть удобно и эффективно написаны на языках высокого уровня (например, английском)?

И поэтому мы приступили к разработке компилятора на простом английском языке (на простом английском), чтобы ответить на эти вопросы. И мы рады сообщить, что теперь мы можем ответить на каждый из этих трех вопросов, исходя из непосредственного опыта, с громким «Да!»

Теория

Наш парсер работает, как мы полагаем, чем-то вроде центров разбора в человеческом мозге. Возьмем, к примеру, отца, говорящего его маленькому сыну…

“Want to suck on this bottle, little guy?”

… и ребенок слышит …

“blah, blah, SUCK, blah, blah, BOTTLE, blah, blah.”

… Но он правильно отвечает, потому что у него есть «изображение» бутылки в правой части его головы, связанной со словом «бутылка» на левой стороне, и ранее существовавшее «умение» в задней части его шеи, связанное с термин «сосать». Другими словами, ребенок сопоставляет то, что он может, с изображениями (типами) и навыками (рутинами), которые он накопил, и просто игнорирует все остальное. Наш компилятор делает то же самое, с новыми изображениями (типами) и навыками (процедурами), определяемыми не нами, а программистом, когда он пишет новый код приложения.

Практика

Типичное определение типа выглядит так:

A polygon is a thing with some vertices.

Внутри имя «полигон» теперь связано с динамически размещаемой структурой, которая содержит двусвязный список вершин. «Вершина» определяется в другом месте (до или после этого определения) аналогичным образом; множественное число понимается автоматически.

Типичная рутина выглядит так:

To append an x coord and a y coord to a polygon:
Create a vertex given the x and the y.
Append the vertex to the polygon’s vertices.

Обратите внимание, что формальные имена (собственные имена) не требуются для параметров и переменных. Мы считаем, что это главное понимание. Реальный стул или стол никогда (в обычном разговоре) никогда не называют «c» или «myTable» — мы называем такие вещи просто «стул» или «стол». Аналогично здесь: «вершина» и «многоугольник» являются наиболее естественными именами для этих переменных.

Также обратите внимание, что пробелы допускаются в именах рутин и переменных (например, «xordin»). Удивительно, что все языки не поддерживают эту функцию; в конце концов, это 21 век. Также обратите внимание, что «псевдонимы» также разрешены (например, «x» для «xordin»). И эти притяжки («вершины многоугольника») используются очень естественным образом для ссылки на поля в записях.

Также обратите внимание, что слово «данный» могло быть «использующим» или «с» или любым другим эквивалентом, так как наш небрежный анализ фокусируется на изображениях (типах) и навыках (процедурах), необходимых для понимания, и игнорирует столько же по возможности, остальное.

Как математическая книга

На самом низком уровне все выглядит так:

To add a number to another number:
Intel $8B85080000008B008B9D0C0000000103.

Обратите внимание, что в этом случае у нас есть и самый высокий и самый низкий языки — английский и машинный код (в шестнадцатеричном формате) — в одной подпрограмме. Понимание здесь заключается в том, что программа должна быть написана в основном на естественном языке, с фрагментами кода в более подходящем синтаксисе, как (и только как), который требуется. Как типичная книга по математике: в основном естественный язык с перемежающимися фрагментами формулы.

Мы надеемся, что когда-нибудь технология будет расширена, на верхнем уровне, чтобы включить простой испанский, простой французский, простой немецкий и т. Д .; и в нижней части включить «анализаторы фрагментов» для наиболее полезных, специфичных для предметной области языков.

Возражение ответил

Возможно, вы думаете, что программирование на естественном языке — глупая идея. Но учли ли вы тот факт, что большая часть кода в большинстве программ выполняет такие простые вещи, как «переместить это туда» и «показать это на экране» — вещи, которые наиболее удобно и естественным образом выражаются на естественном языке? Давайте рассмотрим пример, который мы можем рассмотреть подробно:

Наш компилятор — сложный переводчик с простого английского на исполняемый-машинный код — содержит 3050 императивных предложений.

1306 из них (около 42%) являются условными утверждениями, и как минимум половина из них — тривиальные вещи, подобные этим:

If the item is not found, break.
If the compiler's abort flag is set, exit.

Остальная часть этих условных операторов немного сложнее, но все они помещаются в одну строку. Вот несколько более длинных:

If the length is 4, attach $FF32 to the fragment's code; exit.
If the rider's token is any numeric literal, compile the literal given the rider; exit.

Из оставшихся предложений:

272 (около 9%) — простые операторы присваивания:

Put the type name into the field's type name.

202 (около 7%) — это просто инфраструктура для различных циклов:

Loop.
Get a field from the type's fields.
[ other stuff here]
Repeat.

183 (6%) просто добавляют что-то в конец того или иного списка, например:

Add the field to the type's fields.

164 (около 5%) — тривиальные операторы, используемые для возврата логических результатов, запуска и остановки различных таймеров, отображения текущего состояния программы и записи интересных вещей в список вывода компилятора.

Say no.
Say yes.
Set the variable's compiled flag.
Start the compiler's timer.
Stop the compiler's timer.
Show status "Compiling...".
List the globals in the compiler's listing.

119 (около 4%) продвигают фокус в исходном коде, такие предложения как:

Bump the rider.
Move the rider (code rules).

92 (около 3%) используются для создания, уничтожения и поддержания внутренних индексов в актуальном состоянии, такие предложения как:

Create the type index using 7919 for the bucket count.
Index the type given the type's name.
Destroy the type index.

58 (около 2%) используются для поиска вещей в различных списках:

Find a variable given the name.

37 (около 1%) — это вызовы в различные процедуры преобразования:

Convert the rider's token to a ratio.

31 (около 1%) используются для генерации фактического машинного кода (плюс те, которые появляются в условных выражениях, как указано выше):

Attach $E8 and the address to the fragment.

И это составляет 80% кода в нашем компиляторе.

Только 57 из оставшихся предложений (менее 2% от общего числа) имеют математическую природу, строка здесь и там такая:

Add 4 to the routine's parameter size.
Subtract the length from the local's offset.
Multiply the type's scale by the base type's scale.
Calculate the length of the field's type.
Round the address up to the nearest multiple of 4096.

А остальные не являются формульными вообще. Вещи как:

Copy the field into another field.
Append the fragment to the current routine's fragments.
Abort with "I was hoping for a definition but all I found was '" then the token.
Initialize the compiler.
Remove any trailing backslashes from the path name.
Reduce the monikette's type to a type for utility use.
Eliminate duplicate nicknames from the type's fields.
Prepend "original " to the term's name.
Extend the name with the rider's token.
Unquote the other string.
Read the source file's path into the source file's buffer.
Generate the literal's name.
Extract a file name from the compiler's abort path.
Write the compiler's exe to the compiler's exe path.
Swap the monikettes with the other monikettes.
Skip any leading noise in the substring.
Scrub the utility index.
Fill the compiler's exe with the null byte given the compiler's exe size.
Position the rider's token on the rider's source.
Pluralize the type's plural name.
Link.
Finalize the compiler.
Check for invalid optional info on the type.

И именно поэтому мы говорим, что большинство того, что делает большинство программ, — это простые вещи, вещи, которые можно удобно выразить на естественном языке. И именно поэтому мы любим программирование на простом английском языке: мысли в наших головах набираются как «псевдокод» на простом английском, и, с некоторыми изменениями, этот псевдокод фактически компилируется и запускается. И самодокументируемый, чтобы загрузить.

Ответ на другое возражение

Вы можете думать, что естественный язык слишком многословен для программирования. Но так ли это плохо? Давайте рассмотрим пару примеров. В традиционном языке программирования мы могли бы нарисовать прямоугольник, используя следующее выражение:

substring.draw ( box, color, source.text.font, source.text.alignment ) ;

Это 10 слов и 11 знаков препинания: всего 21 элемент.

Простым английским эквивалентом будет:

Draw the substring in the box with the color and the source's text's font and alignment.

Что составляет 16 слов и 3 знака препинания: всего 19 элементов.

Следует признать, что версия на простом английском языке требует нескольких более простых для ввода букв алфавита (трудно точно сказать, сколько именно, поскольку традиционные кодировщики ставят пробелы в разных местах); но это небольшая цена за то, что не нужно изучать (или придумывать) искусственный синтаксис.

Вот еще один пример:

if ( ! source.colorized ( ) ) color = black ;

Что составляет 5 слов и 8 знаков препинания: всего 13 элементов.

По сравнению с простым английским:

If the source is not colorized, put black into the color.

Что составляет 11 слов и 2 знака препинания: всего 13 элементов.

Опять же, это в основном вопрос того, любите ли вы печатать слова или (специализированную) пунктуацию. И любите ли вы думать в двух разных синтаксических и грамматических формах одновременно. И хотите ли вы, чтобы ваш код самодокументировался. И хотите ли вы код, который дружелюбен для начинающих. И
хотите ли вы писать код на языке (например, английском), который будет использоваться 100 лет
отныне. Лично мы думаем, что вы, возможно, потеряли какую-то человеческую перспективу, если вы подумали, что «(! Source.colorized ())» — это хороший способ сказать что-нибудь!

Прототип

Если вы заинтересованы, вы можете скачать весь Shebang здесь:

www.osmosian.com/cal-4700.zip

Это небольшая программа для Windows, размером менее мегабайта. Но это полноценная среда разработки, включающая уникальный интерфейс, упрощенный файловый менеджер, элегантный текстовый редактор, удобный шестнадцатеричный дампер, компилятор / компоновщик, создающий собственный код, и даже средство компоновки страниц wysiwyg (которое мы использовали для создания документация). Он полностью написан на простом английском языке. Исходный код (около 25 000 предложений) включен в загрузку. Установка не требуется; просто распаковать Начните с «инструкции.pdf» в каталоге «документация», и прежде чем перейти на десять страниц, вы не просто напишите «Привет, мир!» На экране, вы будете перекомпилировать все это само по себе ( менее чем за три секунды на новейшей машине от Walmart).

Спасибо за ваше время и интерес.


Джерри Рзеппа
Великий негус осмосского ордена программистов на простом английском языке


Дэн Рзеппа
Главный Ассемблер Осмосского Ордена Программистов на Английском Простом

Рекомендуемые посты:

Программирование на естественном языке

0.00 (0%) 0 votes